import { z } from "zod"; import { UpworkClient } from "../../services/upwork-client.js"; // Validation schema for the tool parameters const RefreshTokenSchema = z.object({ accountType: z.enum(['freelancer', 'agency']).optional().default('freelancer').describe("Account type to refresh tokens for") }); // Main tool handler export const refreshTokenTool = { definition: { name: "upwork_refresh_token", description: "Force refresh Upwork access token from AWS Secrets Manager when authentication fails. Use this tool when you get 401/authentication errors.", inputSchema: { type: "object", properties: { accountType: { type: "string", enum: ["freelancer", "agency"], description: "Account type to refresh tokens for (default: freelancer)", default: "freelancer" } } } }, handler: async (params: any, upworkClient: UpworkClient) => { try { // Validate input parameters const validatedParams = RefreshTokenSchema.parse(params); console.log(`🔄 Refreshing ${validatedParams.accountType} tokens from AWS Secrets Manager...`); // Force refresh tokens from AWS (bypass cache) const success = await upworkClient.forceRefreshTokens(validatedParams.accountType); if (success) { // Get token age to show when it was refreshed const age = await upworkClient.getTokenAge(validatedParams.accountType); const ageText = age !== null ? `${Math.floor(age / 60)} minutes ago` : 'just now'; return { content: [{ type: "text", text: `✅ **Token Refresh Successful**\n\n` + `🔑 **Account**: ${validatedParams.accountType}\n` + `⏰ **Refreshed**: ${ageText}\n` + `💾 **Cached**: Stored in local keychain/file\n\n` + `🚀 You can now retry your original request!` }] }; } else { return { content: [{ type: "text", text: `❌ **Token Refresh Failed**\n\n` + `🔑 **Account**: ${validatedParams.accountType}\n` + `⚠️ **Issue**: Could not retrieve fresh tokens from AWS Secrets Manager\n\n` + `🔍 **Check**:\n` + `- AWS credentials are configured\n` + `- Secret 'upwork-oauth-tokens${validatedParams.accountType === 'agency' ? '-agency' : ''}' exists\n` + `- Lambda token refresh is working` }], isError: true }; } } catch (error) { return { content: [{ type: "text", text: `❌ Error refreshing tokens: ${error instanceof Error ? error.message : String(error)}` }], isError: true }; } } };