claude-flow 2.7.35 → 2.7.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/bin/claude-flow +1 -1
  3. package/dist/src/__tests__/benchmarks/performance.bench.js +0 -19
  4. package/dist/src/__tests__/benchmarks/performance.bench.js.map +1 -1
  5. package/dist/src/__tests__/hook-matchers.test.js.map +1 -1
  6. package/dist/src/agents/agent-registry.js.map +1 -1
  7. package/dist/src/api/auth-service.js.map +1 -1
  8. package/dist/src/api/claude-client-enhanced.js +4 -2
  9. package/dist/src/api/claude-client-enhanced.js.map +1 -1
  10. package/dist/src/api/claude-client.js +4 -2
  11. package/dist/src/api/claude-client.js.map +1 -1
  12. package/dist/src/api/database-service.js.map +1 -1
  13. package/dist/src/api/swarm-api.js +1 -1
  14. package/dist/src/api/swarm-api.js.map +1 -1
  15. package/dist/src/cli/commands/hive-mind/wizard.js +1 -1
  16. package/dist/src/cli/commands/hive-mind/wizard.js.map +1 -1
  17. package/dist/src/cli/simple-cli.js +172 -182
  18. package/dist/src/cli/simple-cli.js.map +1 -1
  19. package/dist/src/cli/simple-commands/init/skills-copier.js +1 -1
  20. package/dist/src/cli/simple-commands/init/skills-copier.js.map +1 -1
  21. package/dist/src/cli/simple-orchestrator.js +1 -1
  22. package/dist/src/cli/simple-orchestrator.js.map +1 -1
  23. package/dist/src/coordination/conflict-resolution.js +1 -1
  24. package/dist/src/coordination/conflict-resolution.js.map +1 -1
  25. package/dist/src/coordination/load-balancer.js +1 -1
  26. package/dist/src/coordination/load-balancer.js.map +1 -1
  27. package/dist/src/core/config.js +1 -1
  28. package/dist/src/core/config.js.map +1 -1
  29. package/dist/src/core/version.js +1 -1
  30. package/dist/src/enterprise/audit-manager.js +1 -1
  31. package/dist/src/enterprise/audit-manager.js.map +1 -1
  32. package/dist/src/providers/openai-provider.js +2 -2
  33. package/dist/src/providers/openai-provider.js.map +1 -1
  34. package/dist/src/sdk/checkpoint-manager.js +1 -1
  35. package/dist/src/sdk/checkpoint-manager.js.map +1 -1
  36. package/dist/src/services/agentic-flow-hooks/workflow-hooks.js +1 -1
  37. package/dist/src/services/agentic-flow-hooks/workflow-hooks.js.map +1 -1
  38. package/dist/src/swarm/coordinator.js +1 -1
  39. package/dist/src/swarm/coordinator.js.map +1 -1
  40. package/dist/src/utils/key-redactor.js.map +1 -1
  41. package/dist/src/utils/metrics-reader.js.map +1 -1
  42. package/dist/src/verification/rollback.js +2 -2
  43. package/dist/src/verification/rollback.js.map +1 -1
  44. package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js +4 -2
  45. package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js.map +1 -1
  46. package/docs/.claude-flow/metrics/performance.json +3 -3
  47. package/docs/.claude-flow/metrics/task-metrics.json +3 -3
  48. package/docs/architecture/README.md +555 -0
  49. package/docs/architecture/github-workflows-optimization-strategy.md +1079 -0
  50. package/docs/architecture/workflow-architecture-diagram.md +615 -0
  51. package/docs/architecture/workflow-optimization-implementation-guide.md +593 -0
  52. package/docs/fixes/WORKFLOW_FIXES.md +292 -0
  53. package/docs/fixes/WORKFLOW_FIXES_FINAL_STATUS.md +291 -0
  54. package/docs/fixes/github-workflow-fixes-pr888.md +279 -0
  55. package/docs/fixes/workflow-fixes-action-plan.md +388 -0
  56. package/docs/github-workflow-fixes.md +219 -0
  57. package/docs/reviews/github-workflows-analysis-report.md +820 -0
  58. package/docs/reviews/pr-888-review-report.md +560 -0
  59. package/docs/validation/workflow-fix-verification.md +206 -0
  60. package/package.json +7 -7
  61. package/src/__tests__/benchmarks/performance.bench.ts +2 -25
  62. package/src/__tests__/hook-matchers.test.ts +2 -0
  63. package/src/agents/agent-registry.ts +1 -1
  64. package/src/api/auth-service.ts +1 -1
  65. package/src/api/claude-client-enhanced.ts +2 -1
  66. package/src/api/claude-client.ts +2 -2
  67. package/src/api/database-service.ts +1 -2
  68. package/src/api/swarm-api.ts +2 -2
  69. package/src/cli/commands/hive-mind/wizard.ts +1 -1
  70. package/src/cli/simple-commands/init/skills-copier.js +1 -1
  71. package/src/cli/simple-orchestrator.ts +1 -1
  72. package/src/coordination/conflict-resolution.ts +1 -1
  73. package/src/coordination/load-balancer.ts +1 -1
  74. package/src/core/config.ts +1 -1
  75. package/src/enterprise/audit-manager.ts +1 -1
  76. package/src/providers/openai-provider.ts +2 -2
  77. package/src/sdk/checkpoint-manager.ts +1 -1
  78. package/src/services/agentic-flow-hooks/workflow-hooks.ts +1 -1
  79. package/src/swarm/coordinator.ts +1 -1
  80. package/src/verification/rollback.ts +2 -2
  81. package/src/verification/tests/mocks/false-reporting-scenarios.test.ts +6 -3
  82. /package/docs/{BUG_REPORT_MEMORY_STATS.md → bug-reports/BUG_REPORT_MEMORY_STATS.md} +0 -0
  83. /package/docs/{AUTOMATIC_ERROR_RECOVERY_v2.7.35.md → features/AUTOMATIC_ERROR_RECOVERY_v2.7.35.md} +0 -0
  84. /package/docs/{MCP_2025_FEATURE_CONFIRMATION.md → features/MCP_2025_FEATURE_CONFIRMATION.md} +0 -0
  85. /package/docs/{OPTIONAL_LOCAL_EMBEDDINGS.md → features/OPTIONAL_LOCAL_EMBEDDINGS.md} +0 -0
  86. /package/docs/{mcp-2025-implementation-summary.md → features/mcp-2025-implementation-summary.md} +0 -0
  87. /package/docs/{mcp-spec-2025-implementation-plan.md → features/mcp-spec-2025-implementation-plan.md} +0 -0
  88. /package/docs/{AGENTIC_FLOW_ENABLED_LOG_FIX.md → fixes/AGENTIC_FLOW_ENABLED_LOG_FIX.md} +0 -0
  89. /package/docs/{MEMORY_COMMAND_FIX.md → fixes/MEMORY_COMMAND_FIX.md} +0 -0
  90. /package/docs/{NPX_MEMORY_FIX_v2.7.19.md → fixes/NPX_MEMORY_FIX_v2.7.19.md} +0 -0
  91. /package/docs/{REMOTE_INSTALL_FIX.md → fixes/REMOTE_INSTALL_FIX.md} +0 -0
  92. /package/docs/{SQLITE_FIX_COMPLETE_v2.7.21.md → fixes/SQLITE_FIX_COMPLETE_v2.7.21.md} +0 -0
  93. /package/docs/{NPM_PUBLISH_GUIDE_v2.7.33.md → guides/NPM_PUBLISH_GUIDE_v2.7.33.md} +0 -0
  94. /package/docs/{SWARM_INITIALIZATION_GUIDE.md → guides/SWARM_INITIALIZATION_GUIDE.md} +0 -0
  95. /package/docs/{AGENTDB_BRANCH_MERGE_VERIFICATION.md → integration/AGENTDB_BRANCH_MERGE_VERIFICATION.md} +0 -0
  96. /package/docs/{INTEGRATION_STATUS_FINAL.md → integration/INTEGRATION_STATUS_FINAL.md} +0 -0
  97. /package/docs/{agentic-flow-agentdb-mcp-integration.md → integration/agentic-flow-agentdb-mcp-integration.md} +0 -0
  98. /package/docs/{phase-1-2-implementation-summary.md → integration/phase-1-2-implementation-summary.md} +0 -0
  99. /package/docs/{.github-release-issue-v2.7.33.md → releases/.github-release-issue-v2.7.33.md} +0 -0
  100. /package/docs/{RELEASE_NOTES_v2.7.15.md → releases/RELEASE_NOTES_v2.7.15.md} +0 -0
  101. /package/docs/{RELEASE_NOTES_v2.7.33.md → releases/RELEASE_NOTES_v2.7.33.md} +0 -0
  102. /package/docs/{RELEASE_READINESS_SUMMARY.md → releases/RELEASE_READINESS_SUMMARY.md} +0 -0
  103. /package/docs/{RELEASE_SUMMARY_v2.7.33.md → releases/RELEASE_SUMMARY_v2.7.33.md} +0 -0
  104. /package/docs/{V2.7.14_RELEASE_NOTES.md → releases/V2.7.14_RELEASE_NOTES.md} +0 -0
  105. /package/docs/{V2.7.25_RELEASE_NOTES.md → releases/V2.7.25_RELEASE_NOTES.md} +0 -0
  106. /package/docs/{V2.7.26_RELEASE_SUMMARY.md → releases/V2.7.26_RELEASE_SUMMARY.md} +0 -0
  107. /package/docs/{V2.7.27_RELEASE_NOTES.md → releases/V2.7.27_RELEASE_NOTES.md} +0 -0
  108. /package/docs/{V2.7.28_RELEASE_NOTES.md → releases/V2.7.28_RELEASE_NOTES.md} +0 -0
  109. /package/docs/{AGENTIC_FLOW_INTEGRATION_REVIEW.md → reviews/AGENTIC_FLOW_INTEGRATION_REVIEW.md} +0 -0
  110. /package/docs/{BRANCH_REVIEW_SUMMARY.md → reviews/BRANCH_REVIEW_SUMMARY.md} +0 -0
  111. /package/docs/{DEEP_CODE_REVIEW_v2.7.33.md → reviews/DEEP_CODE_REVIEW_v2.7.33.md} +0 -0
  112. /package/docs/{LATEST_LIBRARIES_REVIEW.md → reviews/LATEST_LIBRARIES_REVIEW.md} +0 -0
  113. /package/docs/{CONFIRMATION_AUTOMATIC_ERROR_RECOVERY.md → testing/CONFIRMATION_AUTOMATIC_ERROR_RECOVERY.md} +0 -0
  114. /package/docs/{DOCKER_TEST_RESULTS_v2.7.35.md → testing/DOCKER_TEST_RESULTS_v2.7.35.md} +0 -0
  115. /package/docs/{REGRESSION_TEST_REPORT_v2.7.33.md → testing/REGRESSION_TEST_REPORT_v2.7.33.md} +0 -0
  116. /package/docs/{V2.7.27_TEST_REPORT.md → testing/V2.7.27_TEST_REPORT.md} +0 -0
  117. /package/docs/{regression-analysis-phase-1-2.md → testing/regression-analysis-phase-1-2.md} +0 -0
  118. /package/docs/{TRANSFORMER_INITIALIZATION_ISSUE.md → troubleshooting/TRANSFORMER_INITIALIZATION_ISSUE.md} +0 -0
  119. /package/docs/{FIX_VERIFICATION_MEMORY_STATS.md → validation/FIX_VERIFICATION_MEMORY_STATS.md} +0 -0
  120. /package/docs/{TOOL_VALIDATION_REPORT.md → validation/TOOL_VALIDATION_REPORT.md} +0 -0
  121. /package/docs/{VALIDATION_REPORT_v2.7.1.md → validation/VALIDATION_REPORT_v2.7.1.md} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/api/auth-service.ts"],"sourcesContent":["/**\n * Authentication and authorization service for swarm coordination system\n * Provides secure access control with JWT tokens, API keys, and role-based permissions\n */\n\nimport { ILogger } from '../core/logger.js';\nimport { AuthenticationError, AuthorizationError } from '../utils/errors.js';\nimport { nanoid } from 'nanoid';\nimport { createHash, createHmac, timingSafeEqual } from 'crypto';\n\nexport interface AuthConfig {\n jwtSecret: string;\n jwtExpiresIn?: string; // Default: '24h'\n apiKeyLength?: number; // Default: 32\n bcryptRounds?: number; // Default: 12\n sessionTimeout?: number; // Default: 3600000 (1 hour)\n maxLoginAttempts?: number; // Default: 5\n lockoutDuration?: number; // Default: 900000 (15 minutes)\n requireMFA?: boolean; // Default: false\n}\n\nexport interface User {\n id: string;\n email: string;\n passwordHash: string;\n role: UserRole;\n permissions: Permission[];\n apiKeys: ApiKey[];\n isActive: boolean;\n lastLogin?: Date;\n loginAttempts: number;\n lockedUntil?: Date;\n mfaSecret?: string;\n mfaEnabled: boolean;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface ApiKey {\n id: string;\n key: string;\n keyHash: string;\n name: string;\n permissions: Permission[];\n expiresAt?: Date;\n lastUsed?: Date;\n isActive: boolean;\n createdAt: Date;\n}\n\nexport interface AuthToken {\n token: string;\n type: 'jwt' | 'api_key';\n userId?: string;\n apiKeyId?: string;\n permissions: Permission[];\n expiresAt: Date;\n createdAt: Date;\n}\n\nexport interface AuthSession {\n id: string;\n userId: string;\n token: string;\n clientInfo?: {\n userAgent?: string;\n ip?: string;\n device?: string;\n };\n isActive: boolean;\n expiresAt: Date;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type UserRole = \n | 'admin' // Full system access\n | 'operator' // Can manage swarms and agents\n | 'developer' // Can create and monitor tasks\n | 'viewer' // Read-only access\n | 'service'; // Service-to-service authentication\n\nexport type Permission = \n | 'swarm.create'\n | 'swarm.read'\n | 'swarm.update'\n | 'swarm.delete'\n | 'swarm.scale'\n | 'agent.spawn'\n | 'agent.read'\n | 'agent.terminate'\n | 'task.create'\n | 'task.read'\n | 'task.cancel'\n | 'metrics.read'\n | 'system.admin'\n | 'api.access';\n\nconst ROLE_PERMISSIONS: Record<UserRole, Permission[]> = {\n admin: [\n 'swarm.create', 'swarm.read', 'swarm.update', 'swarm.delete', 'swarm.scale',\n 'agent.spawn', 'agent.read', 'agent.terminate',\n 'task.create', 'task.read', 'task.cancel',\n 'metrics.read', 'system.admin', 'api.access'\n ],\n operator: [\n 'swarm.create', 'swarm.read', 'swarm.update', 'swarm.scale',\n 'agent.spawn', 'agent.read', 'agent.terminate',\n 'task.create', 'task.read', 'task.cancel',\n 'metrics.read', 'api.access'\n ],\n developer: [\n 'swarm.read', 'agent.read',\n 'task.create', 'task.read', 'task.cancel',\n 'metrics.read', 'api.access'\n ],\n viewer: [\n 'swarm.read', 'agent.read', 'task.read', 'metrics.read', 'api.access'\n ],\n service: [\n 'api.access'\n ]\n};\n\n/**\n * Authentication service implementation\n */\nexport class AuthService {\n private users = new Map<string, User>();\n private sessions = new Map<string, AuthSession>();\n private apiKeys = new Map<string, ApiKey>();\n private loginAttempts = new Map<string, { count: number; lastAttempt: Date }>();\n\n constructor(\n private config: AuthConfig,\n private logger: ILogger,\n ) {\n this.initializeDefaultUsers();\n }\n\n /**\n * Authenticate user with email and password\n */\n async authenticateUser(email: string, password: string, clientInfo?: {\n userAgent?: string;\n ip?: string;\n device?: string;\n }): Promise<{ user: User; token: string; session: AuthSession }> {\n try {\n // Check for rate limiting\n await this.checkRateLimit(email);\n\n // Find user\n const user = Array.from(this.users.values()).find(u => u.email === email);\n if (!user) {\n await this.recordFailedLogin(email);\n throw new AuthenticationError('Invalid credentials');\n }\n\n // Check if account is locked\n if (user.lockedUntil && user.lockedUntil > new Date()) {\n throw new AuthenticationError('Account locked due to too many failed attempts');\n }\n\n // Check if account is active\n if (!user.isActive) {\n throw new AuthenticationError('Account is disabled');\n }\n\n // Verify password\n const isValid = await this.verifyPassword(password, user.passwordHash);\n if (!isValid) {\n await this.recordFailedLogin(email);\n throw new AuthenticationError('Invalid credentials');\n }\n\n // Reset login attempts on successful authentication\n this.loginAttempts.delete(email);\n user.loginAttempts = 0;\n user.lockedUntil = undefined;\n user.lastLogin = new Date();\n\n // Create session\n const session = await this.createSession(user.id, clientInfo);\n\n // Generate JWT token\n const token = await this.generateJWT(user, session.id);\n\n this.logger.info('User authenticated successfully', {\n userId: user.id,\n email: user.email,\n sessionId: session.id,\n });\n\n return { user, token, session };\n } catch (error) {\n this.logger.error('Authentication failed', {\n email,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Authenticate API key\n */\n async authenticateApiKey(apiKey: string): Promise<{ key: ApiKey; user?: User }> {\n try {\n // Hash the provided key to compare with stored hash\n const keyHash = this.hashApiKey(apiKey);\n \n // Find matching API key\n const storedKey = Array.from(this.apiKeys.values()).find(k => \n this.constantTimeCompare(k.keyHash, keyHash)\n );\n\n if (!storedKey) {\n throw new AuthenticationError('Invalid API key');\n }\n\n // Check if key is active\n if (!storedKey.isActive) {\n throw new AuthenticationError('API key is disabled');\n }\n\n // Check if key is expired\n if (storedKey.expiresAt && storedKey.expiresAt < new Date()) {\n throw new AuthenticationError('API key has expired');\n }\n\n // Update last used timestamp\n storedKey.lastUsed = new Date();\n\n // Find associated user (if any)\n const user = Array.from(this.users.values()).find(u => \n u.apiKeys.some(k => k.id === storedKey.id)\n );\n\n this.logger.info('API key authenticated successfully', {\n keyId: storedKey.id,\n keyName: storedKey.name,\n userId: user?.id,\n });\n\n return { key: storedKey, user };\n } catch (error) {\n this.logger.error('API key authentication failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Verify JWT token\n */\n async verifyJWT(token: string): Promise<{ user: User; session: AuthSession }> {\n try {\n const payload = this.decodeJWT(token);\n \n if (!payload.userId || !payload.sessionId) {\n throw new AuthenticationError('Invalid token payload');\n }\n\n // Check if session exists and is active\n const session = this.sessions.get(payload.sessionId);\n if (!session || !session.isActive) {\n throw new AuthenticationError('Invalid or expired session');\n }\n\n // Check if session is expired\n if (session.expiresAt < new Date()) {\n session.isActive = false;\n throw new AuthenticationError('Session expired');\n }\n\n // Get user\n const user = this.users.get(payload.userId);\n if (!user || !user.isActive) {\n throw new AuthenticationError('User not found or inactive');\n }\n\n // Update session activity\n session.updatedAt = new Date();\n\n return { user, session };\n } catch (error) {\n this.logger.error('JWT verification failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Check if user has required permission\n */\n hasPermission(userOrPermissions: User | Permission[], requiredPermission: Permission): boolean {\n const permissions = Array.isArray(userOrPermissions) \n ? userOrPermissions \n : userOrPermissions.permissions;\n \n return permissions.includes(requiredPermission) || permissions.includes('system.admin');\n }\n\n /**\n * Create new user\n */\n async createUser(userData: {\n email: string;\n password: string;\n role: UserRole;\n isActive?: boolean;\n }): Promise<User> {\n // Check if email already exists\n const existingUser = Array.from(this.users.values()).find(u => u.email === userData.email);\n if (existingUser) {\n throw new AuthenticationError('Email already exists');\n }\n\n const userId = `user_${Date.now()}_${nanoid(8)}`;\n const passwordHash = await this.hashPassword(userData.password);\n const permissions = ROLE_PERMISSIONS[userData.role] || [];\n\n const user: User = {\n id: userId,\n email: userData.email,\n passwordHash,\n role: userData.role,\n permissions,\n apiKeys: [],\n isActive: userData.isActive ?? true,\n loginAttempts: 0,\n mfaEnabled: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.users.set(userId, user);\n\n this.logger.info('User created', {\n userId,\n email: userData.email,\n role: userData.role,\n });\n\n return user;\n }\n\n /**\n * Create API key for user\n */\n async createApiKey(userId: string, keyData: {\n name: string;\n permissions?: Permission[];\n expiresAt?: Date;\n }): Promise<{ apiKey: ApiKey; key: string }> {\n const user = this.users.get(userId);\n if (!user) {\n throw new AuthenticationError('User not found');\n }\n\n const key = this.generateApiKey();\n const keyHash = this.hashApiKey(key);\n const keyId = `key_${Date.now()}_${nanoid(8)}`;\n\n const permissions = keyData.permissions || user.permissions;\n\n const apiKey: ApiKey = {\n id: keyId,\n key: key.substring(0, 8) + '...', // Store only prefix for display\n keyHash,\n name: keyData.name,\n permissions,\n expiresAt: keyData.expiresAt,\n isActive: true,\n createdAt: new Date(),\n };\n\n // Add to user's API keys\n user.apiKeys.push(apiKey);\n \n // Store in global API keys map\n this.apiKeys.set(keyId, apiKey);\n\n this.logger.info('API key created', {\n userId,\n keyId,\n keyName: keyData.name,\n });\n\n return { apiKey, key };\n }\n\n /**\n * Revoke API key\n */\n async revokeApiKey(keyId: string): Promise<void> {\n const apiKey = this.apiKeys.get(keyId);\n if (!apiKey) {\n throw new AuthenticationError('API key not found');\n }\n\n apiKey.isActive = false;\n \n // Remove from user's keys\n const user = Array.from(this.users.values()).find(u => \n u.apiKeys.some(k => k.id === keyId)\n );\n if (user) {\n user.apiKeys = user.apiKeys.filter(k => k.id !== keyId);\n }\n\n this.logger.info('API key revoked', {\n keyId,\n keyName: apiKey.name,\n userId: user?.id,\n });\n }\n\n /**\n * Invalidate session\n */\n async invalidateSession(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.isActive = false;\n this.logger.info('Session invalidated', {\n sessionId,\n userId: session.userId,\n });\n }\n }\n\n /**\n * Clean up expired sessions\n */\n async cleanupSessions(): Promise<void> {\n const now = new Date();\n let cleaned = 0;\n\n for (const [sessionId, session] of this.sessions) {\n if (!session.isActive || session.expiresAt < now) {\n this.sessions.delete(sessionId);\n cleaned++;\n }\n }\n\n if (cleaned > 0) {\n this.logger.info('Cleaned up expired sessions', { count: cleaned });\n }\n }\n\n /**\n * Get user by ID\n */\n getUser(userId: string): User | undefined {\n return this.users.get(userId);\n }\n\n /**\n * List all users (admin only)\n */\n listUsers(): User[] {\n return Array.from(this.users.values());\n }\n\n // Private helper methods\n private async checkRateLimit(email: string): Promise<void> {\n const attempts = this.loginAttempts.get(email);\n const maxAttempts = this.config.maxLoginAttempts || 5;\n const lockoutDuration = this.config.lockoutDuration || 900000; // 15 minutes\n\n if (attempts && attempts.count >= maxAttempts) {\n const timeSinceLastAttempt = Date.now() - attempts.lastAttempt.getTime();\n if (timeSinceLastAttempt < lockoutDuration) {\n throw new AuthenticationError('Too many failed login attempts. Please try again later.');\n } else {\n // Reset attempts after lockout period\n this.loginAttempts.delete(email);\n }\n }\n }\n\n private async recordFailedLogin(email: string): Promise<void> {\n const attempts = this.loginAttempts.get(email) || { count: 0, lastAttempt: new Date() };\n attempts.count++;\n attempts.lastAttempt = new Date();\n this.loginAttempts.set(email, attempts);\n }\n\n private async createSession(userId: string, clientInfo?: {\n userAgent?: string;\n ip?: string;\n device?: string;\n }): Promise<AuthSession> {\n const sessionId = `session_${Date.now()}_${nanoid(16)}`;\n const sessionTimeout = this.config.sessionTimeout || 3600000; // 1 hour\n const expiresAt = new Date(Date.now() + sessionTimeout);\n\n const session: AuthSession = {\n id: sessionId,\n userId,\n token: nanoid(32),\n clientInfo,\n isActive: true,\n expiresAt,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.sessions.set(sessionId, session);\n return session;\n }\n\n private async generateJWT(user: User, sessionId: string): Promise<string> {\n const payload = {\n userId: user.id,\n email: user.email,\n role: user.role,\n permissions: user.permissions,\n sessionId,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + (24 * 60 * 60), // 24 hours\n };\n\n const header = {\n alg: 'HS256',\n typ: 'JWT',\n };\n\n const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64url');\n const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64url');\n \n const signature = createHmac('sha256', this.config.jwtSecret)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest('base64url');\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n }\n\n private decodeJWT(token: string): any {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new AuthenticationError('Invalid token format');\n }\n\n const [encodedHeader, encodedPayload, signature] = parts;\n \n // Verify signature\n const expectedSignature = createHmac('sha256', this.config.jwtSecret)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest('base64url');\n \n if (!this.constantTimeCompare(signature, expectedSignature)) {\n throw new AuthenticationError('Invalid token signature');\n }\n\n // Decode payload\n const payload = JSON.parse(Buffer.from(encodedPayload, 'base64url').toString());\n \n // Check expiration\n if (payload.exp && payload.exp < Math.floor(Date.now() / 1000)) {\n throw new AuthenticationError('Token expired');\n }\n\n return payload;\n }\n\n private generateApiKey(): string {\n const length = this.config.apiKeyLength || 32;\n return nanoid(length);\n }\n\n private hashApiKey(key: string): string {\n return createHash('sha256').update(key).digest('hex');\n }\n\n private async hashPassword(password: string): Promise<string> {\n // In a real implementation, use bcrypt\n return createHash('sha256').update(password + 'salt').digest('hex');\n }\n\n private async verifyPassword(password: string, hash: string): Promise<boolean> {\n // In a real implementation, use bcrypt.compare\n const passwordHash = createHash('sha256').update(password + 'salt').digest('hex');\n return this.constantTimeCompare(passwordHash, hash);\n }\n\n private constantTimeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n \n const bufferA = Buffer.from(a, 'hex');\n const bufferB = Buffer.from(b, 'hex');\n \n return timingSafeEqual(bufferA, bufferB);\n }\n\n private initializeDefaultUsers(): void {\n // Create default admin user\n const adminId = 'admin_default';\n const adminUser: User = {\n id: adminId,\n email: 'admin@claude-flow.local',\n passwordHash: createHash('sha256').update('admin123' + 'salt').digest('hex'),\n role: 'admin',\n permissions: ROLE_PERMISSIONS.admin,\n apiKeys: [],\n isActive: true,\n loginAttempts: 0,\n mfaEnabled: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.users.set(adminId, adminUser);\n\n // Create default service user\n const serviceId = 'service_default';\n const serviceUser: User = {\n id: serviceId,\n email: 'service@claude-flow.local',\n passwordHash: createHash('sha256').update('service123' + 'salt').digest('hex'),\n role: 'service',\n permissions: ROLE_PERMISSIONS.service,\n apiKeys: [],\n isActive: true,\n loginAttempts: 0,\n mfaEnabled: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.users.set(serviceId, serviceUser);\n\n this.logger.info('Default users initialized', {\n admin: adminUser.email,\n service: serviceUser.email,\n });\n }\n}"],"names":["AuthenticationError","nanoid","createHash","createHmac","timingSafeEqual","ROLE_PERMISSIONS","admin","operator","developer","viewer","service","AuthService","users","Map","sessions","apiKeys","loginAttempts","config","logger","initializeDefaultUsers","authenticateUser","email","password","clientInfo","checkRateLimit","user","Array","from","values","find","u","recordFailedLogin","lockedUntil","Date","isActive","isValid","verifyPassword","passwordHash","delete","undefined","lastLogin","session","createSession","id","token","generateJWT","info","userId","sessionId","error","Error","message","authenticateApiKey","apiKey","keyHash","hashApiKey","storedKey","k","constantTimeCompare","expiresAt","lastUsed","some","keyId","keyName","name","key","verifyJWT","payload","decodeJWT","get","updatedAt","hasPermission","userOrPermissions","requiredPermission","permissions","isArray","includes","createUser","userData","existingUser","now","hashPassword","role","mfaEnabled","createdAt","set","createApiKey","keyData","generateApiKey","substring","push","revokeApiKey","filter","invalidateSession","cleanupSessions","cleaned","count","getUser","listUsers","attempts","maxAttempts","maxLoginAttempts","lockoutDuration","timeSinceLastAttempt","lastAttempt","getTime","sessionTimeout","iat","Math","floor","exp","header","alg","typ","encodedHeader","Buffer","JSON","stringify","toString","encodedPayload","signature","jwtSecret","update","digest","parts","split","length","expectedSignature","parse","apiKeyLength","hash","a","b","bufferA","bufferB","adminId","adminUser","serviceId","serviceUser"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/api/auth-service.ts"],"sourcesContent":["/**\n * Authentication and authorization service for swarm coordination system\n * Provides secure access control with JWT tokens, API keys, and role-based permissions\n */\n\nimport { ILogger } from '../core/logger.js';\nimport { AuthenticationError } from '../utils/errors.js';\nimport { nanoid } from 'nanoid';\nimport { createHash, createHmac, timingSafeEqual } from 'crypto';\n\nexport interface AuthConfig {\n jwtSecret: string;\n jwtExpiresIn?: string; // Default: '24h'\n apiKeyLength?: number; // Default: 32\n bcryptRounds?: number; // Default: 12\n sessionTimeout?: number; // Default: 3600000 (1 hour)\n maxLoginAttempts?: number; // Default: 5\n lockoutDuration?: number; // Default: 900000 (15 minutes)\n requireMFA?: boolean; // Default: false\n}\n\nexport interface User {\n id: string;\n email: string;\n passwordHash: string;\n role: UserRole;\n permissions: Permission[];\n apiKeys: ApiKey[];\n isActive: boolean;\n lastLogin?: Date;\n loginAttempts: number;\n lockedUntil?: Date;\n mfaSecret?: string;\n mfaEnabled: boolean;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface ApiKey {\n id: string;\n key: string;\n keyHash: string;\n name: string;\n permissions: Permission[];\n expiresAt?: Date;\n lastUsed?: Date;\n isActive: boolean;\n createdAt: Date;\n}\n\nexport interface AuthToken {\n token: string;\n type: 'jwt' | 'api_key';\n userId?: string;\n apiKeyId?: string;\n permissions: Permission[];\n expiresAt: Date;\n createdAt: Date;\n}\n\nexport interface AuthSession {\n id: string;\n userId: string;\n token: string;\n clientInfo?: {\n userAgent?: string;\n ip?: string;\n device?: string;\n };\n isActive: boolean;\n expiresAt: Date;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type UserRole = \n | 'admin' // Full system access\n | 'operator' // Can manage swarms and agents\n | 'developer' // Can create and monitor tasks\n | 'viewer' // Read-only access\n | 'service'; // Service-to-service authentication\n\nexport type Permission = \n | 'swarm.create'\n | 'swarm.read'\n | 'swarm.update'\n | 'swarm.delete'\n | 'swarm.scale'\n | 'agent.spawn'\n | 'agent.read'\n | 'agent.terminate'\n | 'task.create'\n | 'task.read'\n | 'task.cancel'\n | 'metrics.read'\n | 'system.admin'\n | 'api.access';\n\nconst ROLE_PERMISSIONS: Record<UserRole, Permission[]> = {\n admin: [\n 'swarm.create', 'swarm.read', 'swarm.update', 'swarm.delete', 'swarm.scale',\n 'agent.spawn', 'agent.read', 'agent.terminate',\n 'task.create', 'task.read', 'task.cancel',\n 'metrics.read', 'system.admin', 'api.access'\n ],\n operator: [\n 'swarm.create', 'swarm.read', 'swarm.update', 'swarm.scale',\n 'agent.spawn', 'agent.read', 'agent.terminate',\n 'task.create', 'task.read', 'task.cancel',\n 'metrics.read', 'api.access'\n ],\n developer: [\n 'swarm.read', 'agent.read',\n 'task.create', 'task.read', 'task.cancel',\n 'metrics.read', 'api.access'\n ],\n viewer: [\n 'swarm.read', 'agent.read', 'task.read', 'metrics.read', 'api.access'\n ],\n service: [\n 'api.access'\n ]\n};\n\n/**\n * Authentication service implementation\n */\nexport class AuthService {\n private users = new Map<string, User>();\n private sessions = new Map<string, AuthSession>();\n private apiKeys = new Map<string, ApiKey>();\n private loginAttempts = new Map<string, { count: number; lastAttempt: Date }>();\n\n constructor(\n private config: AuthConfig,\n private logger: ILogger,\n ) {\n this.initializeDefaultUsers();\n }\n\n /**\n * Authenticate user with email and password\n */\n async authenticateUser(email: string, password: string, clientInfo?: {\n userAgent?: string;\n ip?: string;\n device?: string;\n }): Promise<{ user: User; token: string; session: AuthSession }> {\n try {\n // Check for rate limiting\n await this.checkRateLimit(email);\n\n // Find user\n const user = Array.from(this.users.values()).find(u => u.email === email);\n if (!user) {\n await this.recordFailedLogin(email);\n throw new AuthenticationError('Invalid credentials');\n }\n\n // Check if account is locked\n if (user.lockedUntil && user.lockedUntil > new Date()) {\n throw new AuthenticationError('Account locked due to too many failed attempts');\n }\n\n // Check if account is active\n if (!user.isActive) {\n throw new AuthenticationError('Account is disabled');\n }\n\n // Verify password\n const isValid = await this.verifyPassword(password, user.passwordHash);\n if (!isValid) {\n await this.recordFailedLogin(email);\n throw new AuthenticationError('Invalid credentials');\n }\n\n // Reset login attempts on successful authentication\n this.loginAttempts.delete(email);\n user.loginAttempts = 0;\n user.lockedUntil = undefined;\n user.lastLogin = new Date();\n\n // Create session\n const session = await this.createSession(user.id, clientInfo);\n\n // Generate JWT token\n const token = await this.generateJWT(user, session.id);\n\n this.logger.info('User authenticated successfully', {\n userId: user.id,\n email: user.email,\n sessionId: session.id,\n });\n\n return { user, token, session };\n } catch (error) {\n this.logger.error('Authentication failed', {\n email,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Authenticate API key\n */\n async authenticateApiKey(apiKey: string): Promise<{ key: ApiKey; user?: User }> {\n try {\n // Hash the provided key to compare with stored hash\n const keyHash = this.hashApiKey(apiKey);\n \n // Find matching API key\n const storedKey = Array.from(this.apiKeys.values()).find(k => \n this.constantTimeCompare(k.keyHash, keyHash)\n );\n\n if (!storedKey) {\n throw new AuthenticationError('Invalid API key');\n }\n\n // Check if key is active\n if (!storedKey.isActive) {\n throw new AuthenticationError('API key is disabled');\n }\n\n // Check if key is expired\n if (storedKey.expiresAt && storedKey.expiresAt < new Date()) {\n throw new AuthenticationError('API key has expired');\n }\n\n // Update last used timestamp\n storedKey.lastUsed = new Date();\n\n // Find associated user (if any)\n const user = Array.from(this.users.values()).find(u => \n u.apiKeys.some(k => k.id === storedKey.id)\n );\n\n this.logger.info('API key authenticated successfully', {\n keyId: storedKey.id,\n keyName: storedKey.name,\n userId: user?.id,\n });\n\n return { key: storedKey, user };\n } catch (error) {\n this.logger.error('API key authentication failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Verify JWT token\n */\n async verifyJWT(token: string): Promise<{ user: User; session: AuthSession }> {\n try {\n const payload = this.decodeJWT(token);\n \n if (!payload.userId || !payload.sessionId) {\n throw new AuthenticationError('Invalid token payload');\n }\n\n // Check if session exists and is active\n const session = this.sessions.get(payload.sessionId);\n if (!session || !session.isActive) {\n throw new AuthenticationError('Invalid or expired session');\n }\n\n // Check if session is expired\n if (session.expiresAt < new Date()) {\n session.isActive = false;\n throw new AuthenticationError('Session expired');\n }\n\n // Get user\n const user = this.users.get(payload.userId);\n if (!user || !user.isActive) {\n throw new AuthenticationError('User not found or inactive');\n }\n\n // Update session activity\n session.updatedAt = new Date();\n\n return { user, session };\n } catch (error) {\n this.logger.error('JWT verification failed', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n }\n\n /**\n * Check if user has required permission\n */\n hasPermission(userOrPermissions: User | Permission[], requiredPermission: Permission): boolean {\n const permissions = Array.isArray(userOrPermissions) \n ? userOrPermissions \n : userOrPermissions.permissions;\n \n return permissions.includes(requiredPermission) || permissions.includes('system.admin');\n }\n\n /**\n * Create new user\n */\n async createUser(userData: {\n email: string;\n password: string;\n role: UserRole;\n isActive?: boolean;\n }): Promise<User> {\n // Check if email already exists\n const existingUser = Array.from(this.users.values()).find(u => u.email === userData.email);\n if (existingUser) {\n throw new AuthenticationError('Email already exists');\n }\n\n const userId = `user_${Date.now()}_${nanoid(8)}`;\n const passwordHash = await this.hashPassword(userData.password);\n const permissions = ROLE_PERMISSIONS[userData.role] || [];\n\n const user: User = {\n id: userId,\n email: userData.email,\n passwordHash,\n role: userData.role,\n permissions,\n apiKeys: [],\n isActive: userData.isActive ?? true,\n loginAttempts: 0,\n mfaEnabled: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.users.set(userId, user);\n\n this.logger.info('User created', {\n userId,\n email: userData.email,\n role: userData.role,\n });\n\n return user;\n }\n\n /**\n * Create API key for user\n */\n async createApiKey(userId: string, keyData: {\n name: string;\n permissions?: Permission[];\n expiresAt?: Date;\n }): Promise<{ apiKey: ApiKey; key: string }> {\n const user = this.users.get(userId);\n if (!user) {\n throw new AuthenticationError('User not found');\n }\n\n const key = this.generateApiKey();\n const keyHash = this.hashApiKey(key);\n const keyId = `key_${Date.now()}_${nanoid(8)}`;\n\n const permissions = keyData.permissions || user.permissions;\n\n const apiKey: ApiKey = {\n id: keyId,\n key: key.substring(0, 8) + '...', // Store only prefix for display\n keyHash,\n name: keyData.name,\n permissions,\n expiresAt: keyData.expiresAt,\n isActive: true,\n createdAt: new Date(),\n };\n\n // Add to user's API keys\n user.apiKeys.push(apiKey);\n \n // Store in global API keys map\n this.apiKeys.set(keyId, apiKey);\n\n this.logger.info('API key created', {\n userId,\n keyId,\n keyName: keyData.name,\n });\n\n return { apiKey, key };\n }\n\n /**\n * Revoke API key\n */\n async revokeApiKey(keyId: string): Promise<void> {\n const apiKey = this.apiKeys.get(keyId);\n if (!apiKey) {\n throw new AuthenticationError('API key not found');\n }\n\n apiKey.isActive = false;\n \n // Remove from user's keys\n const user = Array.from(this.users.values()).find(u => \n u.apiKeys.some(k => k.id === keyId)\n );\n if (user) {\n user.apiKeys = user.apiKeys.filter(k => k.id !== keyId);\n }\n\n this.logger.info('API key revoked', {\n keyId,\n keyName: apiKey.name,\n userId: user?.id,\n });\n }\n\n /**\n * Invalidate session\n */\n async invalidateSession(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.isActive = false;\n this.logger.info('Session invalidated', {\n sessionId,\n userId: session.userId,\n });\n }\n }\n\n /**\n * Clean up expired sessions\n */\n async cleanupSessions(): Promise<void> {\n const now = new Date();\n let cleaned = 0;\n\n for (const [sessionId, session] of this.sessions) {\n if (!session.isActive || session.expiresAt < now) {\n this.sessions.delete(sessionId);\n cleaned++;\n }\n }\n\n if (cleaned > 0) {\n this.logger.info('Cleaned up expired sessions', { count: cleaned });\n }\n }\n\n /**\n * Get user by ID\n */\n getUser(userId: string): User | undefined {\n return this.users.get(userId);\n }\n\n /**\n * List all users (admin only)\n */\n listUsers(): User[] {\n return Array.from(this.users.values());\n }\n\n // Private helper methods\n private async checkRateLimit(email: string): Promise<void> {\n const attempts = this.loginAttempts.get(email);\n const maxAttempts = this.config.maxLoginAttempts || 5;\n const lockoutDuration = this.config.lockoutDuration || 900000; // 15 minutes\n\n if (attempts && attempts.count >= maxAttempts) {\n const timeSinceLastAttempt = Date.now() - attempts.lastAttempt.getTime();\n if (timeSinceLastAttempt < lockoutDuration) {\n throw new AuthenticationError('Too many failed login attempts. Please try again later.');\n } else {\n // Reset attempts after lockout period\n this.loginAttempts.delete(email);\n }\n }\n }\n\n private async recordFailedLogin(email: string): Promise<void> {\n const attempts = this.loginAttempts.get(email) || { count: 0, lastAttempt: new Date() };\n attempts.count++;\n attempts.lastAttempt = new Date();\n this.loginAttempts.set(email, attempts);\n }\n\n private async createSession(userId: string, clientInfo?: {\n userAgent?: string;\n ip?: string;\n device?: string;\n }): Promise<AuthSession> {\n const sessionId = `session_${Date.now()}_${nanoid(16)}`;\n const sessionTimeout = this.config.sessionTimeout || 3600000; // 1 hour\n const expiresAt = new Date(Date.now() + sessionTimeout);\n\n const session: AuthSession = {\n id: sessionId,\n userId,\n token: nanoid(32),\n clientInfo,\n isActive: true,\n expiresAt,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.sessions.set(sessionId, session);\n return session;\n }\n\n private async generateJWT(user: User, sessionId: string): Promise<string> {\n const payload = {\n userId: user.id,\n email: user.email,\n role: user.role,\n permissions: user.permissions,\n sessionId,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + (24 * 60 * 60), // 24 hours\n };\n\n const header = {\n alg: 'HS256',\n typ: 'JWT',\n };\n\n const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64url');\n const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64url');\n \n const signature = createHmac('sha256', this.config.jwtSecret)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest('base64url');\n\n return `${encodedHeader}.${encodedPayload}.${signature}`;\n }\n\n private decodeJWT(token: string): any {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new AuthenticationError('Invalid token format');\n }\n\n const [encodedHeader, encodedPayload, signature] = parts;\n \n // Verify signature\n const expectedSignature = createHmac('sha256', this.config.jwtSecret)\n .update(`${encodedHeader}.${encodedPayload}`)\n .digest('base64url');\n \n if (!this.constantTimeCompare(signature, expectedSignature)) {\n throw new AuthenticationError('Invalid token signature');\n }\n\n // Decode payload\n const payload = JSON.parse(Buffer.from(encodedPayload, 'base64url').toString());\n \n // Check expiration\n if (payload.exp && payload.exp < Math.floor(Date.now() / 1000)) {\n throw new AuthenticationError('Token expired');\n }\n\n return payload;\n }\n\n private generateApiKey(): string {\n const length = this.config.apiKeyLength || 32;\n return nanoid(length);\n }\n\n private hashApiKey(key: string): string {\n return createHash('sha256').update(key).digest('hex');\n }\n\n private async hashPassword(password: string): Promise<string> {\n // In a real implementation, use bcrypt\n return createHash('sha256').update(password + 'salt').digest('hex');\n }\n\n private async verifyPassword(password: string, hash: string): Promise<boolean> {\n // In a real implementation, use bcrypt.compare\n const passwordHash = createHash('sha256').update(password + 'salt').digest('hex');\n return this.constantTimeCompare(passwordHash, hash);\n }\n\n private constantTimeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n \n const bufferA = Buffer.from(a, 'hex');\n const bufferB = Buffer.from(b, 'hex');\n \n return timingSafeEqual(bufferA, bufferB);\n }\n\n private initializeDefaultUsers(): void {\n // Create default admin user\n const adminId = 'admin_default';\n const adminUser: User = {\n id: adminId,\n email: 'admin@claude-flow.local',\n passwordHash: createHash('sha256').update('admin123' + 'salt').digest('hex'),\n role: 'admin',\n permissions: ROLE_PERMISSIONS.admin,\n apiKeys: [],\n isActive: true,\n loginAttempts: 0,\n mfaEnabled: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.users.set(adminId, adminUser);\n\n // Create default service user\n const serviceId = 'service_default';\n const serviceUser: User = {\n id: serviceId,\n email: 'service@claude-flow.local',\n passwordHash: createHash('sha256').update('service123' + 'salt').digest('hex'),\n role: 'service',\n permissions: ROLE_PERMISSIONS.service,\n apiKeys: [],\n isActive: true,\n loginAttempts: 0,\n mfaEnabled: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n\n this.users.set(serviceId, serviceUser);\n\n this.logger.info('Default users initialized', {\n admin: adminUser.email,\n service: serviceUser.email,\n });\n }\n}"],"names":["AuthenticationError","nanoid","createHash","createHmac","timingSafeEqual","ROLE_PERMISSIONS","admin","operator","developer","viewer","service","AuthService","users","Map","sessions","apiKeys","loginAttempts","config","logger","initializeDefaultUsers","authenticateUser","email","password","clientInfo","checkRateLimit","user","Array","from","values","find","u","recordFailedLogin","lockedUntil","Date","isActive","isValid","verifyPassword","passwordHash","delete","undefined","lastLogin","session","createSession","id","token","generateJWT","info","userId","sessionId","error","Error","message","authenticateApiKey","apiKey","keyHash","hashApiKey","storedKey","k","constantTimeCompare","expiresAt","lastUsed","some","keyId","keyName","name","key","verifyJWT","payload","decodeJWT","get","updatedAt","hasPermission","userOrPermissions","requiredPermission","permissions","isArray","includes","createUser","userData","existingUser","now","hashPassword","role","mfaEnabled","createdAt","set","createApiKey","keyData","generateApiKey","substring","push","revokeApiKey","filter","invalidateSession","cleanupSessions","cleaned","count","getUser","listUsers","attempts","maxAttempts","maxLoginAttempts","lockoutDuration","timeSinceLastAttempt","lastAttempt","getTime","sessionTimeout","iat","Math","floor","exp","header","alg","typ","encodedHeader","Buffer","JSON","stringify","toString","encodedPayload","signature","jwtSecret","update","digest","parts","split","length","expectedSignature","parse","apiKeyLength","hash","a","b","bufferA","bufferB","adminId","adminUser","serviceId","serviceUser"],"mappings":"AAMA,SAASA,mBAAmB,QAAQ,qBAAqB;AACzD,SAASC,MAAM,QAAQ,SAAS;AAChC,SAASC,UAAU,EAAEC,UAAU,EAAEC,eAAe,QAAQ,SAAS;AA0FjE,MAAMC,mBAAmD;IACvDC,OAAO;QACL;QAAgB;QAAc;QAAgB;QAAgB;QAC9D;QAAe;QAAc;QAC7B;QAAe;QAAa;QAC5B;QAAgB;QAAgB;KACjC;IACDC,UAAU;QACR;QAAgB;QAAc;QAAgB;QAC9C;QAAe;QAAc;QAC7B;QAAe;QAAa;QAC5B;QAAgB;KACjB;IACDC,WAAW;QACT;QAAc;QACd;QAAe;QAAa;QAC5B;QAAgB;KACjB;IACDC,QAAQ;QACN;QAAc;QAAc;QAAa;QAAgB;KAC1D;IACDC,SAAS;QACP;KACD;AACH;AAKA,OAAO,MAAMC;;;IACHC,QAAQ,IAAIC,MAAoB;IAChCC,WAAW,IAAID,MAA2B;IAC1CE,UAAU,IAAIF,MAAsB;IACpCG,gBAAgB,IAAIH,MAAoD;IAEhF,YACE,AAAQI,MAAkB,EAC1B,AAAQC,MAAe,CACvB;aAFQD,SAAAA;aACAC,SAAAA;QAER,IAAI,CAACC,sBAAsB;IAC7B;IAKA,MAAMC,iBAAiBC,KAAa,EAAEC,QAAgB,EAAEC,UAIvD,EAAgE;QAC/D,IAAI;YAEF,MAAM,IAAI,CAACC,cAAc,CAACH;YAG1B,MAAMI,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACf,KAAK,CAACgB,MAAM,IAAIC,IAAI,CAACC,CAAAA,IAAKA,EAAET,KAAK,KAAKA;YACnE,IAAI,CAACI,MAAM;gBACT,MAAM,IAAI,CAACM,iBAAiB,CAACV;gBAC7B,MAAM,IAAIrB,oBAAoB;YAChC;YAGA,IAAIyB,KAAKO,WAAW,IAAIP,KAAKO,WAAW,GAAG,IAAIC,QAAQ;gBACrD,MAAM,IAAIjC,oBAAoB;YAChC;YAGA,IAAI,CAACyB,KAAKS,QAAQ,EAAE;gBAClB,MAAM,IAAIlC,oBAAoB;YAChC;YAGA,MAAMmC,UAAU,MAAM,IAAI,CAACC,cAAc,CAACd,UAAUG,KAAKY,YAAY;YACrE,IAAI,CAACF,SAAS;gBACZ,MAAM,IAAI,CAACJ,iBAAiB,CAACV;gBAC7B,MAAM,IAAIrB,oBAAoB;YAChC;YAGA,IAAI,CAACgB,aAAa,CAACsB,MAAM,CAACjB;YAC1BI,KAAKT,aAAa,GAAG;YACrBS,KAAKO,WAAW,GAAGO;YACnBd,KAAKe,SAAS,GAAG,IAAIP;YAGrB,MAAMQ,UAAU,MAAM,IAAI,CAACC,aAAa,CAACjB,KAAKkB,EAAE,EAAEpB;YAGlD,MAAMqB,QAAQ,MAAM,IAAI,CAACC,WAAW,CAACpB,MAAMgB,QAAQE,EAAE;YAErD,IAAI,CAACzB,MAAM,CAAC4B,IAAI,CAAC,mCAAmC;gBAClDC,QAAQtB,KAAKkB,EAAE;gBACftB,OAAOI,KAAKJ,KAAK;gBACjB2B,WAAWP,QAAQE,EAAE;YACvB;YAEA,OAAO;gBAAElB;gBAAMmB;gBAAOH;YAAQ;QAChC,EAAE,OAAOQ,OAAO;YACd,IAAI,CAAC/B,MAAM,CAAC+B,KAAK,CAAC,yBAAyB;gBACzC5B;gBACA4B,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAG;YAClD;YACA,MAAMF;QACR;IACF;IAKA,MAAMG,mBAAmBC,MAAc,EAAyC;QAC9E,IAAI;YAEF,MAAMC,UAAU,IAAI,CAACC,UAAU,CAACF;YAGhC,MAAMG,YAAY9B,MAAMC,IAAI,CAAC,IAAI,CAACZ,OAAO,CAACa,MAAM,IAAIC,IAAI,CAAC4B,CAAAA,IACvD,IAAI,CAACC,mBAAmB,CAACD,EAAEH,OAAO,EAAEA;YAGtC,IAAI,CAACE,WAAW;gBACd,MAAM,IAAIxD,oBAAoB;YAChC;YAGA,IAAI,CAACwD,UAAUtB,QAAQ,EAAE;gBACvB,MAAM,IAAIlC,oBAAoB;YAChC;YAGA,IAAIwD,UAAUG,SAAS,IAAIH,UAAUG,SAAS,GAAG,IAAI1B,QAAQ;gBAC3D,MAAM,IAAIjC,oBAAoB;YAChC;YAGAwD,UAAUI,QAAQ,GAAG,IAAI3B;YAGzB,MAAMR,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACf,KAAK,CAACgB,MAAM,IAAIC,IAAI,CAACC,CAAAA,IAChDA,EAAEf,OAAO,CAAC8C,IAAI,CAACJ,CAAAA,IAAKA,EAAEd,EAAE,KAAKa,UAAUb,EAAE;YAG3C,IAAI,CAACzB,MAAM,CAAC4B,IAAI,CAAC,sCAAsC;gBACrDgB,OAAON,UAAUb,EAAE;gBACnBoB,SAASP,UAAUQ,IAAI;gBACvBjB,QAAQtB,MAAMkB;YAChB;YAEA,OAAO;gBAAEsB,KAAKT;gBAAW/B;YAAK;QAChC,EAAE,OAAOwB,OAAO;YACd,IAAI,CAAC/B,MAAM,CAAC+B,KAAK,CAAC,iCAAiC;gBACjDA,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAG;YAClD;YACA,MAAMF;QACR;IACF;IAKA,MAAMiB,UAAUtB,KAAa,EAAiD;QAC5E,IAAI;YACF,MAAMuB,UAAU,IAAI,CAACC,SAAS,CAACxB;YAE/B,IAAI,CAACuB,QAAQpB,MAAM,IAAI,CAACoB,QAAQnB,SAAS,EAAE;gBACzC,MAAM,IAAIhD,oBAAoB;YAChC;YAGA,MAAMyC,UAAU,IAAI,CAAC3B,QAAQ,CAACuD,GAAG,CAACF,QAAQnB,SAAS;YACnD,IAAI,CAACP,WAAW,CAACA,QAAQP,QAAQ,EAAE;gBACjC,MAAM,IAAIlC,oBAAoB;YAChC;YAGA,IAAIyC,QAAQkB,SAAS,GAAG,IAAI1B,QAAQ;gBAClCQ,QAAQP,QAAQ,GAAG;gBACnB,MAAM,IAAIlC,oBAAoB;YAChC;YAGA,MAAMyB,OAAO,IAAI,CAACb,KAAK,CAACyD,GAAG,CAACF,QAAQpB,MAAM;YAC1C,IAAI,CAACtB,QAAQ,CAACA,KAAKS,QAAQ,EAAE;gBAC3B,MAAM,IAAIlC,oBAAoB;YAChC;YAGAyC,QAAQ6B,SAAS,GAAG,IAAIrC;YAExB,OAAO;gBAAER;gBAAMgB;YAAQ;QACzB,EAAE,OAAOQ,OAAO;YACd,IAAI,CAAC/B,MAAM,CAAC+B,KAAK,CAAC,2BAA2B;gBAC3CA,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAG;YAClD;YACA,MAAMF;QACR;IACF;IAKAsB,cAAcC,iBAAsC,EAAEC,kBAA8B,EAAW;QAC7F,MAAMC,cAAchD,MAAMiD,OAAO,CAACH,qBAC9BA,oBACAA,kBAAkBE,WAAW;QAEjC,OAAOA,YAAYE,QAAQ,CAACH,uBAAuBC,YAAYE,QAAQ,CAAC;IAC1E;IAKA,MAAMC,WAAWC,QAKhB,EAAiB;QAEhB,MAAMC,eAAerD,MAAMC,IAAI,CAAC,IAAI,CAACf,KAAK,CAACgB,MAAM,IAAIC,IAAI,CAACC,CAAAA,IAAKA,EAAET,KAAK,KAAKyD,SAASzD,KAAK;QACzF,IAAI0D,cAAc;YAChB,MAAM,IAAI/E,oBAAoB;QAChC;QAEA,MAAM+C,SAAS,CAAC,KAAK,EAAEd,KAAK+C,GAAG,GAAG,CAAC,EAAE/E,OAAO,IAAI;QAChD,MAAMoC,eAAe,MAAM,IAAI,CAAC4C,YAAY,CAACH,SAASxD,QAAQ;QAC9D,MAAMoD,cAAcrE,gBAAgB,CAACyE,SAASI,IAAI,CAAC,IAAI,EAAE;QAEzD,MAAMzD,OAAa;YACjBkB,IAAII;YACJ1B,OAAOyD,SAASzD,KAAK;YACrBgB;YACA6C,MAAMJ,SAASI,IAAI;YACnBR;YACA3D,SAAS,EAAE;YACXmB,UAAU4C,SAAS5C,QAAQ,IAAI;YAC/BlB,eAAe;YACfmE,YAAY;YACZC,WAAW,IAAInD;YACfqC,WAAW,IAAIrC;QACjB;QAEA,IAAI,CAACrB,KAAK,CAACyE,GAAG,CAACtC,QAAQtB;QAEvB,IAAI,CAACP,MAAM,CAAC4B,IAAI,CAAC,gBAAgB;YAC/BC;YACA1B,OAAOyD,SAASzD,KAAK;YACrB6D,MAAMJ,SAASI,IAAI;QACrB;QAEA,OAAOzD;IACT;IAKA,MAAM6D,aAAavC,MAAc,EAAEwC,OAIlC,EAA4C;QAC3C,MAAM9D,OAAO,IAAI,CAACb,KAAK,CAACyD,GAAG,CAACtB;QAC5B,IAAI,CAACtB,MAAM;YACT,MAAM,IAAIzB,oBAAoB;QAChC;QAEA,MAAMiE,MAAM,IAAI,CAACuB,cAAc;QAC/B,MAAMlC,UAAU,IAAI,CAACC,UAAU,CAACU;QAChC,MAAMH,QAAQ,CAAC,IAAI,EAAE7B,KAAK+C,GAAG,GAAG,CAAC,EAAE/E,OAAO,IAAI;QAE9C,MAAMyE,cAAca,QAAQb,WAAW,IAAIjD,KAAKiD,WAAW;QAE3D,MAAMrB,SAAiB;YACrBV,IAAImB;YACJG,KAAKA,IAAIwB,SAAS,CAAC,GAAG,KAAK;YAC3BnC;YACAU,MAAMuB,QAAQvB,IAAI;YAClBU;YACAf,WAAW4B,QAAQ5B,SAAS;YAC5BzB,UAAU;YACVkD,WAAW,IAAInD;QACjB;QAGAR,KAAKV,OAAO,CAAC2E,IAAI,CAACrC;QAGlB,IAAI,CAACtC,OAAO,CAACsE,GAAG,CAACvB,OAAOT;QAExB,IAAI,CAACnC,MAAM,CAAC4B,IAAI,CAAC,mBAAmB;YAClCC;YACAe;YACAC,SAASwB,QAAQvB,IAAI;QACvB;QAEA,OAAO;YAAEX;YAAQY;QAAI;IACvB;IAKA,MAAM0B,aAAa7B,KAAa,EAAiB;QAC/C,MAAMT,SAAS,IAAI,CAACtC,OAAO,CAACsD,GAAG,CAACP;QAChC,IAAI,CAACT,QAAQ;YACX,MAAM,IAAIrD,oBAAoB;QAChC;QAEAqD,OAAOnB,QAAQ,GAAG;QAGlB,MAAMT,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACf,KAAK,CAACgB,MAAM,IAAIC,IAAI,CAACC,CAAAA,IAChDA,EAAEf,OAAO,CAAC8C,IAAI,CAACJ,CAAAA,IAAKA,EAAEd,EAAE,KAAKmB;QAE/B,IAAIrC,MAAM;YACRA,KAAKV,OAAO,GAAGU,KAAKV,OAAO,CAAC6E,MAAM,CAACnC,CAAAA,IAAKA,EAAEd,EAAE,KAAKmB;QACnD;QAEA,IAAI,CAAC5C,MAAM,CAAC4B,IAAI,CAAC,mBAAmB;YAClCgB;YACAC,SAASV,OAAOW,IAAI;YACpBjB,QAAQtB,MAAMkB;QAChB;IACF;IAKA,MAAMkD,kBAAkB7C,SAAiB,EAAiB;QACxD,MAAMP,UAAU,IAAI,CAAC3B,QAAQ,CAACuD,GAAG,CAACrB;QAClC,IAAIP,SAAS;YACXA,QAAQP,QAAQ,GAAG;YACnB,IAAI,CAAChB,MAAM,CAAC4B,IAAI,CAAC,uBAAuB;gBACtCE;gBACAD,QAAQN,QAAQM,MAAM;YACxB;QACF;IACF;IAKA,MAAM+C,kBAAiC;QACrC,MAAMd,MAAM,IAAI/C;QAChB,IAAI8D,UAAU;QAEd,KAAK,MAAM,CAAC/C,WAAWP,QAAQ,IAAI,IAAI,CAAC3B,QAAQ,CAAE;YAChD,IAAI,CAAC2B,QAAQP,QAAQ,IAAIO,QAAQkB,SAAS,GAAGqB,KAAK;gBAChD,IAAI,CAAClE,QAAQ,CAACwB,MAAM,CAACU;gBACrB+C;YACF;QACF;QAEA,IAAIA,UAAU,GAAG;YACf,IAAI,CAAC7E,MAAM,CAAC4B,IAAI,CAAC,+BAA+B;gBAAEkD,OAAOD;YAAQ;QACnE;IACF;IAKAE,QAAQlD,MAAc,EAAoB;QACxC,OAAO,IAAI,CAACnC,KAAK,CAACyD,GAAG,CAACtB;IACxB;IAKAmD,YAAoB;QAClB,OAAOxE,MAAMC,IAAI,CAAC,IAAI,CAACf,KAAK,CAACgB,MAAM;IACrC;IAGA,MAAcJ,eAAeH,KAAa,EAAiB;QACzD,MAAM8E,WAAW,IAAI,CAACnF,aAAa,CAACqD,GAAG,CAAChD;QACxC,MAAM+E,cAAc,IAAI,CAACnF,MAAM,CAACoF,gBAAgB,IAAI;QACpD,MAAMC,kBAAkB,IAAI,CAACrF,MAAM,CAACqF,eAAe,IAAI;QAEvD,IAAIH,YAAYA,SAASH,KAAK,IAAII,aAAa;YAC7C,MAAMG,uBAAuBtE,KAAK+C,GAAG,KAAKmB,SAASK,WAAW,CAACC,OAAO;YACtE,IAAIF,uBAAuBD,iBAAiB;gBAC1C,MAAM,IAAItG,oBAAoB;YAChC,OAAO;gBAEL,IAAI,CAACgB,aAAa,CAACsB,MAAM,CAACjB;YAC5B;QACF;IACF;IAEA,MAAcU,kBAAkBV,KAAa,EAAiB;QAC5D,MAAM8E,WAAW,IAAI,CAACnF,aAAa,CAACqD,GAAG,CAAChD,UAAU;YAAE2E,OAAO;YAAGQ,aAAa,IAAIvE;QAAO;QACtFkE,SAASH,KAAK;QACdG,SAASK,WAAW,GAAG,IAAIvE;QAC3B,IAAI,CAACjB,aAAa,CAACqE,GAAG,CAAChE,OAAO8E;IAChC;IAEA,MAAczD,cAAcK,MAAc,EAAExB,UAI3C,EAAwB;QACvB,MAAMyB,YAAY,CAAC,QAAQ,EAAEf,KAAK+C,GAAG,GAAG,CAAC,EAAE/E,OAAO,KAAK;QACvD,MAAMyG,iBAAiB,IAAI,CAACzF,MAAM,CAACyF,cAAc,IAAI;QACrD,MAAM/C,YAAY,IAAI1B,KAAKA,KAAK+C,GAAG,KAAK0B;QAExC,MAAMjE,UAAuB;YAC3BE,IAAIK;YACJD;YACAH,OAAO3C,OAAO;YACdsB;YACAW,UAAU;YACVyB;YACAyB,WAAW,IAAInD;YACfqC,WAAW,IAAIrC;QACjB;QAEA,IAAI,CAACnB,QAAQ,CAACuE,GAAG,CAACrC,WAAWP;QAC7B,OAAOA;IACT;IAEA,MAAcI,YAAYpB,IAAU,EAAEuB,SAAiB,EAAmB;QACxE,MAAMmB,UAAU;YACdpB,QAAQtB,KAAKkB,EAAE;YACftB,OAAOI,KAAKJ,KAAK;YACjB6D,MAAMzD,KAAKyD,IAAI;YACfR,aAAajD,KAAKiD,WAAW;YAC7B1B;YACA2D,KAAKC,KAAKC,KAAK,CAAC5E,KAAK+C,GAAG,KAAK;YAC7B8B,KAAKF,KAAKC,KAAK,CAAC5E,KAAK+C,GAAG,KAAK,QAAS,KAAK,KAAK;QAClD;QAEA,MAAM+B,SAAS;YACbC,KAAK;YACLC,KAAK;QACP;QAEA,MAAMC,gBAAgBC,OAAOxF,IAAI,CAACyF,KAAKC,SAAS,CAACN,SAASO,QAAQ,CAAC;QACnE,MAAMC,iBAAiBJ,OAAOxF,IAAI,CAACyF,KAAKC,SAAS,CAAClD,UAAUmD,QAAQ,CAAC;QAErE,MAAME,YAAYrH,WAAW,UAAU,IAAI,CAACc,MAAM,CAACwG,SAAS,EACzDC,MAAM,CAAC,GAAGR,cAAc,CAAC,EAAEK,gBAAgB,EAC3CI,MAAM,CAAC;QAEV,OAAO,GAAGT,cAAc,CAAC,EAAEK,eAAe,CAAC,EAAEC,WAAW;IAC1D;IAEQpD,UAAUxB,KAAa,EAAO;QACpC,MAAMgF,QAAQhF,MAAMiF,KAAK,CAAC;QAC1B,IAAID,MAAME,MAAM,KAAK,GAAG;YACtB,MAAM,IAAI9H,oBAAoB;QAChC;QAEA,MAAM,CAACkH,eAAeK,gBAAgBC,UAAU,GAAGI;QAGnD,MAAMG,oBAAoB5H,WAAW,UAAU,IAAI,CAACc,MAAM,CAACwG,SAAS,EACjEC,MAAM,CAAC,GAAGR,cAAc,CAAC,EAAEK,gBAAgB,EAC3CI,MAAM,CAAC;QAEV,IAAI,CAAC,IAAI,CAACjE,mBAAmB,CAAC8D,WAAWO,oBAAoB;YAC3D,MAAM,IAAI/H,oBAAoB;QAChC;QAGA,MAAMmE,UAAUiD,KAAKY,KAAK,CAACb,OAAOxF,IAAI,CAAC4F,gBAAgB,aAAaD,QAAQ;QAG5E,IAAInD,QAAQ2C,GAAG,IAAI3C,QAAQ2C,GAAG,GAAGF,KAAKC,KAAK,CAAC5E,KAAK+C,GAAG,KAAK,OAAO;YAC9D,MAAM,IAAIhF,oBAAoB;QAChC;QAEA,OAAOmE;IACT;IAEQqB,iBAAyB;QAC/B,MAAMsC,SAAS,IAAI,CAAC7G,MAAM,CAACgH,YAAY,IAAI;QAC3C,OAAOhI,OAAO6H;IAChB;IAEQvE,WAAWU,GAAW,EAAU;QACtC,OAAO/D,WAAW,UAAUwH,MAAM,CAACzD,KAAK0D,MAAM,CAAC;IACjD;IAEA,MAAc1C,aAAa3D,QAAgB,EAAmB;QAE5D,OAAOpB,WAAW,UAAUwH,MAAM,CAACpG,WAAW,QAAQqG,MAAM,CAAC;IAC/D;IAEA,MAAcvF,eAAed,QAAgB,EAAE4G,IAAY,EAAoB;QAE7E,MAAM7F,eAAenC,WAAW,UAAUwH,MAAM,CAACpG,WAAW,QAAQqG,MAAM,CAAC;QAC3E,OAAO,IAAI,CAACjE,mBAAmB,CAACrB,cAAc6F;IAChD;IAEQxE,oBAAoByE,CAAS,EAAEC,CAAS,EAAW;QACzD,IAAID,EAAEL,MAAM,KAAKM,EAAEN,MAAM,EAAE;YACzB,OAAO;QACT;QAEA,MAAMO,UAAUlB,OAAOxF,IAAI,CAACwG,GAAG;QAC/B,MAAMG,UAAUnB,OAAOxF,IAAI,CAACyG,GAAG;QAE/B,OAAOhI,gBAAgBiI,SAASC;IAClC;IAEQnH,yBAA+B;QAErC,MAAMoH,UAAU;QAChB,MAAMC,YAAkB;YACtB7F,IAAI4F;YACJlH,OAAO;YACPgB,cAAcnC,WAAW,UAAUwH,MAAM,CAAC,aAAa,QAAQC,MAAM,CAAC;YACtEzC,MAAM;YACNR,aAAarE,iBAAiBC,KAAK;YACnCS,SAAS,EAAE;YACXmB,UAAU;YACVlB,eAAe;YACfmE,YAAY;YACZC,WAAW,IAAInD;YACfqC,WAAW,IAAIrC;QACjB;QAEA,IAAI,CAACrB,KAAK,CAACyE,GAAG,CAACkD,SAASC;QAGxB,MAAMC,YAAY;QAClB,MAAMC,cAAoB;YACxB/F,IAAI8F;YACJpH,OAAO;YACPgB,cAAcnC,WAAW,UAAUwH,MAAM,CAAC,eAAe,QAAQC,MAAM,CAAC;YACxEzC,MAAM;YACNR,aAAarE,iBAAiBK,OAAO;YACrCK,SAAS,EAAE;YACXmB,UAAU;YACVlB,eAAe;YACfmE,YAAY;YACZC,WAAW,IAAInD;YACfqC,WAAW,IAAIrC;QACjB;QAEA,IAAI,CAACrB,KAAK,CAACyE,GAAG,CAACoD,WAAWC;QAE1B,IAAI,CAACxH,MAAM,CAAC4B,IAAI,CAAC,6BAA6B;YAC5CxC,OAAOkI,UAAUnH,KAAK;YACtBX,SAASgI,YAAYrH,KAAK;QAC5B;IACF;AACF"}
@@ -330,8 +330,10 @@ export class EnhancedClaudeAPIClient extends EventEmitter {
330
330
  case 403:
331
331
  return new ClaudeAuthenticationError(message, errorData);
332
332
  case 429:
333
- const retryAfter = errorData.error?.retry_after;
334
- return new ClaudeRateLimitError(message, retryAfter, errorData);
333
+ {
334
+ const retryAfter = errorData.error?.retry_after;
335
+ return new ClaudeRateLimitError(message, retryAfter, errorData);
336
+ }
335
337
  case 500:
336
338
  return new ClaudeInternalServerError(message, errorData);
337
339
  case 503:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/api/claude-client-enhanced.ts"],"sourcesContent":["/**\n * Enhanced Claude API client with comprehensive error handling\n * Implements exponential backoff, health checks, and improved error messages\n */\n\nimport { EventEmitter } from 'events';\nimport { ILogger } from '../core/logger.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { \n ClaudeAPIError,\n ClaudeInternalServerError,\n ClaudeServiceUnavailableError,\n ClaudeRateLimitError,\n ClaudeTimeoutError,\n ClaudeNetworkError,\n ClaudeAuthenticationError,\n ClaudeValidationError,\n HealthCheckResult,\n getUserFriendlyError,\n} from './claude-api-errors.js';\nimport { circuitBreaker, CircuitBreaker } from '../utils/helpers.js';\nimport { \n ClaudeAPIConfig, \n ClaudeModel, \n ClaudeMessage, \n ClaudeRequest, \n ClaudeResponse,\n ClaudeStreamEvent,\n} from './claude-client.js';\n\nexport interface EnhancedClaudeAPIConfig extends ClaudeAPIConfig {\n enableHealthCheck?: boolean;\n healthCheckInterval?: number;\n circuitBreakerThreshold?: number;\n circuitBreakerTimeout?: number;\n circuitBreakerResetTimeout?: number;\n maxRetries?: number;\n retryBaseDelay?: number;\n retryMaxDelay?: number;\n retryJitter?: boolean;\n}\n\nexport class EnhancedClaudeAPIClient extends EventEmitter {\n private config: EnhancedClaudeAPIConfig;\n private logger: ILogger;\n private configManager: ConfigManager;\n private circuitBreaker: CircuitBreaker;\n private lastHealthCheck?: HealthCheckResult;\n private healthCheckTimer?: NodeJS.Timeout;\n\n constructor(logger: ILogger, configManager: ConfigManager, config?: Partial<EnhancedClaudeAPIConfig>) {\n super();\n this.logger = logger;\n this.configManager = configManager;\n this.config = this.loadConfiguration(config);\n \n // Initialize circuit breaker\n this.circuitBreaker = circuitBreaker('claude-api', {\n threshold: this.config.circuitBreakerThreshold || 5,\n timeout: this.config.circuitBreakerTimeout || 60000,\n resetTimeout: this.config.circuitBreakerResetTimeout || 300000,\n });\n\n // Start health check if enabled\n if (this.config.enableHealthCheck) {\n this.startHealthCheck();\n }\n }\n\n /**\n * Load configuration with enhanced defaults\n */\n private loadConfiguration(overrides?: Partial<EnhancedClaudeAPIConfig>): EnhancedClaudeAPIConfig {\n const config: EnhancedClaudeAPIConfig = {\n apiKey: '',\n apiUrl: 'https://api.anthropic.com/v1/messages',\n model: 'claude-3-sonnet-20240229',\n temperature: 0.7,\n maxTokens: 4096,\n topP: 1,\n topK: undefined,\n systemPrompt: undefined,\n timeout: 60000,\n retryAttempts: 3,\n retryDelay: 1000,\n // Enhanced configurations\n enableHealthCheck: true,\n healthCheckInterval: 300000, // 5 minutes\n circuitBreakerThreshold: 5,\n circuitBreakerTimeout: 60000,\n circuitBreakerResetTimeout: 300000,\n maxRetries: 3,\n retryBaseDelay: 1000,\n retryMaxDelay: 30000,\n retryJitter: true,\n };\n\n // Load from environment\n if (process.env.ANTHROPIC_API_KEY) {\n config.apiKey = process.env.ANTHROPIC_API_KEY;\n }\n\n // Load from config manager\n const claudeConfig = this.configManager.get('claude');\n if (claudeConfig) {\n Object.assign(config, claudeConfig);\n }\n\n // Apply overrides\n if (overrides) {\n Object.assign(config, overrides);\n }\n\n this.validateConfiguration(config);\n return config;\n }\n\n /**\n * Validate configuration\n */\n private validateConfiguration(config: EnhancedClaudeAPIConfig): void {\n if (!config.apiKey) {\n throw new ClaudeAuthenticationError('Claude API key is required. Set ANTHROPIC_API_KEY environment variable.');\n }\n\n if (config.temperature !== undefined && (config.temperature < 0 || config.temperature > 1)) {\n throw new ClaudeValidationError('Temperature must be between 0 and 1');\n }\n\n if (config.maxTokens !== undefined && (config.maxTokens < 1 || config.maxTokens > 100000)) {\n throw new ClaudeValidationError('Max tokens must be between 1 and 100000');\n }\n }\n\n /**\n * Start periodic health checks\n */\n private startHealthCheck(): void {\n this.performHealthCheck(); // Initial check\n \n this.healthCheckTimer = setInterval(\n () => this.performHealthCheck(),\n this.config.healthCheckInterval || 300000,\n );\n }\n\n /**\n * Perform a health check on the API\n */\n async performHealthCheck(): Promise<HealthCheckResult> {\n const startTime = Date.now();\n \n try {\n // Simple health check request\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: [{ role: 'user', content: 'Hi' }],\n max_tokens: 1,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n \n const latency = Date.now() - startTime;\n const healthy = response.ok || response.status === 429; // Rate limit is still \"healthy\"\n \n this.lastHealthCheck = {\n healthy,\n latency,\n error: healthy ? undefined : `Status: ${response.status}`,\n timestamp: new Date(),\n };\n\n this.logger.debug('Claude API health check completed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n } catch (error) {\n const latency = Date.now() - startTime;\n \n this.lastHealthCheck = {\n healthy: false,\n latency,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date(),\n };\n\n this.logger.warn('Claude API health check failed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n }\n }\n\n /**\n * Get last health check result\n */\n getHealthStatus(): HealthCheckResult | undefined {\n return this.lastHealthCheck;\n }\n\n /**\n * Send a message with enhanced error handling\n */\n async sendMessage(\n messages: ClaudeMessage[],\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n stream?: boolean;\n },\n ): Promise<ClaudeResponse | AsyncIterable<ClaudeStreamEvent>> {\n const request: ClaudeRequest = {\n model: options?.model || this.config.model || 'claude-3-sonnet-20240229',\n messages,\n system: options?.systemPrompt || this.config.systemPrompt,\n max_tokens: options?.maxTokens || this.config.maxTokens || 4096,\n temperature: options?.temperature ?? this.config.temperature,\n top_p: this.config.topP,\n top_k: this.config.topK,\n stream: options?.stream || false,\n };\n\n this.logger.debug('Sending Claude API request', {\n model: request.model,\n temperature: request.temperature,\n maxTokens: request.max_tokens,\n messageCount: messages.length,\n stream: request.stream,\n });\n\n try {\n // Use circuit breaker for the request\n const result = await this.circuitBreaker.execute(async () => {\n if (request.stream) {\n return this.streamRequestWithRetry(request);\n } else {\n return this.sendRequestWithRetry(request);\n }\n });\n\n return result;\n } catch (error) {\n // Handle circuit breaker open state\n if (error instanceof Error && error.message.includes('Circuit breaker')) {\n const apiError = new ClaudeServiceUnavailableError(\n 'Claude API is temporarily unavailable due to repeated failures. Please try again later.',\n );\n this.handleError(apiError);\n throw apiError;\n }\n throw error;\n }\n }\n\n /**\n * Send request with retry logic and enhanced error handling\n */\n private async sendRequestWithRetry(request: ClaudeRequest): Promise<ClaudeResponse> {\n let lastError: ClaudeAPIError | undefined;\n const maxRetries = this.config.maxRetries || 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await this.sendRequestOnce(request);\n } catch (error) {\n lastError = this.transformError(error);\n \n // Don't retry non-retryable errors\n if (!lastError.retryable) {\n this.handleError(lastError);\n throw lastError;\n }\n\n this.logger.warn(\n `Claude API request failed (attempt ${attempt + 1}/${maxRetries})`,\n {\n error: lastError.message,\n statusCode: lastError.statusCode,\n retryable: lastError.retryable,\n },\n );\n\n // Don't retry on the last attempt\n if (attempt < maxRetries - 1) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.logger.info(`Retrying after ${delay}ms...`);\n await this.delay(delay);\n }\n }\n }\n\n this.handleError(lastError!);\n throw lastError;\n }\n\n /**\n * Send a single request\n */\n private async sendRequestOnce(request: ClaudeRequest): Promise<ClaudeResponse> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeout || 60000);\n\n try {\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n // Handle different error status codes\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n const data = (await response.json()) as ClaudeResponse;\n\n this.logger.info('Claude API response received', {\n model: data.model,\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n stopReason: data.stop_reason,\n });\n\n this.emit('response', data);\n return data;\n } catch (error) {\n clearTimeout(timeout);\n \n // Handle abort/timeout\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ClaudeTimeoutError(\n 'Request timed out',\n this.config.timeout || 60000,\n );\n }\n \n throw error;\n }\n }\n\n /**\n * Stream request with retry logic\n */\n private async *streamRequestWithRetry(request: ClaudeRequest): AsyncIterable<ClaudeStreamEvent> {\n let lastError: ClaudeAPIError | undefined;\n const maxRetries = this.config.maxRetries || 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n yield* this.streamRequestOnce(request);\n return;\n } catch (error) {\n lastError = this.transformError(error);\n \n if (!lastError.retryable) {\n this.handleError(lastError);\n throw lastError;\n }\n\n this.logger.warn(\n `Claude API stream request failed (attempt ${attempt + 1}/${maxRetries})`,\n { error: lastError.message },\n );\n\n if (attempt < maxRetries - 1) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n await this.delay(delay);\n }\n }\n }\n\n this.handleError(lastError!);\n throw lastError;\n }\n\n /**\n * Send a single streaming request\n */\n private async *streamRequestOnce(request: ClaudeRequest): AsyncIterable<ClaudeStreamEvent> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), (this.config.timeout || 60000) * 2);\n\n try {\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n if (!response.body) {\n throw new ClaudeAPIError('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const event = JSON.parse(data) as ClaudeStreamEvent;\n this.emit('stream_event', event);\n yield event;\n } catch (e) {\n this.logger.warn('Failed to parse stream event', { data, error: e });\n }\n }\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /**\n * Create appropriate error based on status code\n */\n private createAPIError(statusCode: number, errorData: any): ClaudeAPIError {\n const message = errorData.error?.message || errorData.message || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n return new ClaudeValidationError(message, errorData);\n case 401:\n case 403:\n return new ClaudeAuthenticationError(message, errorData);\n case 429:\n const retryAfter = errorData.error?.retry_after;\n return new ClaudeRateLimitError(message, retryAfter, errorData);\n case 500:\n return new ClaudeInternalServerError(message, errorData);\n case 503:\n return new ClaudeServiceUnavailableError(message, errorData);\n default:\n return new ClaudeAPIError(message, statusCode, statusCode >= 500, errorData);\n }\n }\n\n /**\n * Transform generic errors to Claude API errors\n */\n private transformError(error: unknown): ClaudeAPIError {\n if (error instanceof ClaudeAPIError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Network errors\n if (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED')) {\n return new ClaudeNetworkError(error.message);\n }\n \n // Timeout errors\n if (error.name === 'AbortError' || error.message.includes('timeout')) {\n return new ClaudeTimeoutError(error.message, this.config.timeout || 60000);\n }\n }\n\n return new ClaudeAPIError(\n error instanceof Error ? error.message : String(error),\n undefined,\n true, // Assume unknown errors are retryable\n );\n }\n\n /**\n * Calculate retry delay with exponential backoff and jitter\n */\n private calculateRetryDelay(attempt: number, error: ClaudeAPIError): number {\n // If rate limit error with retry-after header, use that\n if (error instanceof ClaudeRateLimitError && error.retryAfter) {\n return error.retryAfter * 1000; // Convert to milliseconds\n }\n\n const baseDelay = this.config.retryBaseDelay || 1000;\n const maxDelay = this.config.retryMaxDelay || 30000;\n \n // Exponential backoff: delay = baseDelay * (2 ^ attempt)\n let delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);\n \n // Add jitter to prevent thundering herd\n if (this.config.retryJitter) {\n const jitter = Math.random() * 0.3 * delay; // Up to 30% jitter\n delay = delay + jitter;\n }\n\n return Math.floor(delay);\n }\n\n /**\n * Handle errors with user-friendly messages and logging\n */\n private handleError(error: ClaudeAPIError): void {\n const errorInfo = getUserFriendlyError(error);\n \n this.logger.error(`${errorInfo.title}: ${errorInfo.message}`, {\n error: error.message,\n code: error.code,\n statusCode: error.statusCode,\n retryable: error.retryable,\n details: error.details,\n });\n\n // Log suggestions in debug mode\n if (this.logger.level === 'debug' && errorInfo.suggestions.length > 0) {\n this.logger.debug('Suggestions to resolve the issue:', errorInfo.suggestions);\n }\n\n this.emit('error', {\n error,\n userFriendly: errorInfo,\n });\n }\n\n /**\n * Helper method for simple completions with error handling\n */\n async complete(\n prompt: string,\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n },\n ): Promise<string> {\n try {\n const messages: ClaudeMessage[] = [{ role: 'user', content: prompt }];\n const response = (await this.sendMessage(messages, options)) as ClaudeResponse;\n return response.content[0].text;\n } catch (error) {\n if (error instanceof ClaudeAPIError) {\n const errorInfo = getUserFriendlyError(error);\n throw new Error(`${errorInfo.title}: ${errorInfo.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Delay helper\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = undefined;\n }\n this.removeAllListeners();\n }\n}"],"names":["EventEmitter","ClaudeAPIError","ClaudeInternalServerError","ClaudeServiceUnavailableError","ClaudeRateLimitError","ClaudeTimeoutError","ClaudeNetworkError","ClaudeAuthenticationError","ClaudeValidationError","getUserFriendlyError","circuitBreaker","EnhancedClaudeAPIClient","config","logger","configManager","lastHealthCheck","healthCheckTimer","loadConfiguration","threshold","circuitBreakerThreshold","timeout","circuitBreakerTimeout","resetTimeout","circuitBreakerResetTimeout","enableHealthCheck","startHealthCheck","overrides","apiKey","apiUrl","model","temperature","maxTokens","topP","topK","undefined","systemPrompt","retryAttempts","retryDelay","healthCheckInterval","maxRetries","retryBaseDelay","retryMaxDelay","retryJitter","process","env","ANTHROPIC_API_KEY","claudeConfig","get","Object","assign","validateConfiguration","performHealthCheck","setInterval","startTime","Date","now","controller","AbortController","setTimeout","abort","response","fetch","method","headers","body","JSON","stringify","messages","role","content","max_tokens","signal","clearTimeout","latency","healthy","ok","status","error","timestamp","debug","emit","Error","message","warn","getHealthStatus","sendMessage","options","request","system","top_p","top_k","stream","messageCount","length","result","execute","streamRequestWithRetry","sendRequestWithRetry","includes","apiError","handleError","lastError","attempt","sendRequestOnce","transformError","retryable","statusCode","delay","calculateRetryDelay","info","errorText","text","errorData","parse","createAPIError","data","json","inputTokens","usage","input_tokens","outputTokens","output_tokens","stopReason","stop_reason","name","streamRequestOnce","reader","getReader","decoder","TextDecoder","buffer","done","value","read","decode","lines","split","pop","line","startsWith","slice","event","e","retryAfter","retry_after","String","baseDelay","maxDelay","Math","min","pow","jitter","random","floor","errorInfo","title","code","details","level","suggestions","userFriendly","complete","prompt","ms","Promise","resolve","destroy","clearInterval","removeAllListeners"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/api/claude-client-enhanced.ts"],"sourcesContent":["/**\n * Enhanced Claude API client with comprehensive error handling\n * Implements exponential backoff, health checks, and improved error messages\n */\n\nimport { EventEmitter } from 'events';\nimport { ILogger } from '../core/logger.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { \n ClaudeAPIError,\n ClaudeInternalServerError,\n ClaudeServiceUnavailableError,\n ClaudeRateLimitError,\n ClaudeTimeoutError,\n ClaudeNetworkError,\n ClaudeAuthenticationError,\n ClaudeValidationError,\n HealthCheckResult,\n getUserFriendlyError,\n} from './claude-api-errors.js';\nimport { circuitBreaker, CircuitBreaker } from '../utils/helpers.js';\nimport { \n ClaudeAPIConfig, \n ClaudeModel, \n ClaudeMessage, \n ClaudeRequest, \n ClaudeResponse,\n ClaudeStreamEvent,\n} from './claude-client.js';\n\nexport interface EnhancedClaudeAPIConfig extends ClaudeAPIConfig {\n enableHealthCheck?: boolean;\n healthCheckInterval?: number;\n circuitBreakerThreshold?: number;\n circuitBreakerTimeout?: number;\n circuitBreakerResetTimeout?: number;\n maxRetries?: number;\n retryBaseDelay?: number;\n retryMaxDelay?: number;\n retryJitter?: boolean;\n}\n\nexport class EnhancedClaudeAPIClient extends EventEmitter {\n private config: EnhancedClaudeAPIConfig;\n private logger: ILogger;\n private configManager: ConfigManager;\n private circuitBreaker: CircuitBreaker;\n private lastHealthCheck?: HealthCheckResult;\n private healthCheckTimer?: NodeJS.Timeout;\n\n constructor(logger: ILogger, configManager: ConfigManager, config?: Partial<EnhancedClaudeAPIConfig>) {\n super();\n this.logger = logger;\n this.configManager = configManager;\n this.config = this.loadConfiguration(config);\n \n // Initialize circuit breaker\n this.circuitBreaker = circuitBreaker('claude-api', {\n threshold: this.config.circuitBreakerThreshold || 5,\n timeout: this.config.circuitBreakerTimeout || 60000,\n resetTimeout: this.config.circuitBreakerResetTimeout || 300000,\n });\n\n // Start health check if enabled\n if (this.config.enableHealthCheck) {\n this.startHealthCheck();\n }\n }\n\n /**\n * Load configuration with enhanced defaults\n */\n private loadConfiguration(overrides?: Partial<EnhancedClaudeAPIConfig>): EnhancedClaudeAPIConfig {\n const config: EnhancedClaudeAPIConfig = {\n apiKey: '',\n apiUrl: 'https://api.anthropic.com/v1/messages',\n model: 'claude-3-sonnet-20240229',\n temperature: 0.7,\n maxTokens: 4096,\n topP: 1,\n topK: undefined,\n systemPrompt: undefined,\n timeout: 60000,\n retryAttempts: 3,\n retryDelay: 1000,\n // Enhanced configurations\n enableHealthCheck: true,\n healthCheckInterval: 300000, // 5 minutes\n circuitBreakerThreshold: 5,\n circuitBreakerTimeout: 60000,\n circuitBreakerResetTimeout: 300000,\n maxRetries: 3,\n retryBaseDelay: 1000,\n retryMaxDelay: 30000,\n retryJitter: true,\n };\n\n // Load from environment\n if (process.env.ANTHROPIC_API_KEY) {\n config.apiKey = process.env.ANTHROPIC_API_KEY;\n }\n\n // Load from config manager\n const claudeConfig = this.configManager.get('claude');\n if (claudeConfig) {\n Object.assign(config, claudeConfig);\n }\n\n // Apply overrides\n if (overrides) {\n Object.assign(config, overrides);\n }\n\n this.validateConfiguration(config);\n return config;\n }\n\n /**\n * Validate configuration\n */\n private validateConfiguration(config: EnhancedClaudeAPIConfig): void {\n if (!config.apiKey) {\n throw new ClaudeAuthenticationError('Claude API key is required. Set ANTHROPIC_API_KEY environment variable.');\n }\n\n if (config.temperature !== undefined && (config.temperature < 0 || config.temperature > 1)) {\n throw new ClaudeValidationError('Temperature must be between 0 and 1');\n }\n\n if (config.maxTokens !== undefined && (config.maxTokens < 1 || config.maxTokens > 100000)) {\n throw new ClaudeValidationError('Max tokens must be between 1 and 100000');\n }\n }\n\n /**\n * Start periodic health checks\n */\n private startHealthCheck(): void {\n this.performHealthCheck(); // Initial check\n \n this.healthCheckTimer = setInterval(\n () => this.performHealthCheck(),\n this.config.healthCheckInterval || 300000,\n );\n }\n\n /**\n * Perform a health check on the API\n */\n async performHealthCheck(): Promise<HealthCheckResult> {\n const startTime = Date.now();\n \n try {\n // Simple health check request\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: [{ role: 'user', content: 'Hi' }],\n max_tokens: 1,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n \n const latency = Date.now() - startTime;\n const healthy = response.ok || response.status === 429; // Rate limit is still \"healthy\"\n \n this.lastHealthCheck = {\n healthy,\n latency,\n error: healthy ? undefined : `Status: ${response.status}`,\n timestamp: new Date(),\n };\n\n this.logger.debug('Claude API health check completed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n } catch (error) {\n const latency = Date.now() - startTime;\n \n this.lastHealthCheck = {\n healthy: false,\n latency,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date(),\n };\n\n this.logger.warn('Claude API health check failed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n }\n }\n\n /**\n * Get last health check result\n */\n getHealthStatus(): HealthCheckResult | undefined {\n return this.lastHealthCheck;\n }\n\n /**\n * Send a message with enhanced error handling\n */\n async sendMessage(\n messages: ClaudeMessage[],\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n stream?: boolean;\n },\n ): Promise<ClaudeResponse | AsyncIterable<ClaudeStreamEvent>> {\n const request: ClaudeRequest = {\n model: options?.model || this.config.model || 'claude-3-sonnet-20240229',\n messages,\n system: options?.systemPrompt || this.config.systemPrompt,\n max_tokens: options?.maxTokens || this.config.maxTokens || 4096,\n temperature: options?.temperature ?? this.config.temperature,\n top_p: this.config.topP,\n top_k: this.config.topK,\n stream: options?.stream || false,\n };\n\n this.logger.debug('Sending Claude API request', {\n model: request.model,\n temperature: request.temperature,\n maxTokens: request.max_tokens,\n messageCount: messages.length,\n stream: request.stream,\n });\n\n try {\n // Use circuit breaker for the request\n const result = await this.circuitBreaker.execute(async () => {\n if (request.stream) {\n return this.streamRequestWithRetry(request);\n } else {\n return this.sendRequestWithRetry(request);\n }\n });\n\n return result;\n } catch (error) {\n // Handle circuit breaker open state\n if (error instanceof Error && error.message.includes('Circuit breaker')) {\n const apiError = new ClaudeServiceUnavailableError(\n 'Claude API is temporarily unavailable due to repeated failures. Please try again later.',\n );\n this.handleError(apiError);\n throw apiError;\n }\n throw error;\n }\n }\n\n /**\n * Send request with retry logic and enhanced error handling\n */\n private async sendRequestWithRetry(request: ClaudeRequest): Promise<ClaudeResponse> {\n let lastError: ClaudeAPIError | undefined;\n const maxRetries = this.config.maxRetries || 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n return await this.sendRequestOnce(request);\n } catch (error) {\n lastError = this.transformError(error);\n \n // Don't retry non-retryable errors\n if (!lastError.retryable) {\n this.handleError(lastError);\n throw lastError;\n }\n\n this.logger.warn(\n `Claude API request failed (attempt ${attempt + 1}/${maxRetries})`,\n {\n error: lastError.message,\n statusCode: lastError.statusCode,\n retryable: lastError.retryable,\n },\n );\n\n // Don't retry on the last attempt\n if (attempt < maxRetries - 1) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n this.logger.info(`Retrying after ${delay}ms...`);\n await this.delay(delay);\n }\n }\n }\n\n this.handleError(lastError!);\n throw lastError;\n }\n\n /**\n * Send a single request\n */\n private async sendRequestOnce(request: ClaudeRequest): Promise<ClaudeResponse> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeout || 60000);\n\n try {\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n // Handle different error status codes\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n const data = (await response.json()) as ClaudeResponse;\n\n this.logger.info('Claude API response received', {\n model: data.model,\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n stopReason: data.stop_reason,\n });\n\n this.emit('response', data);\n return data;\n } catch (error) {\n clearTimeout(timeout);\n \n // Handle abort/timeout\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ClaudeTimeoutError(\n 'Request timed out',\n this.config.timeout || 60000,\n );\n }\n \n throw error;\n }\n }\n\n /**\n * Stream request with retry logic\n */\n private async *streamRequestWithRetry(request: ClaudeRequest): AsyncIterable<ClaudeStreamEvent> {\n let lastError: ClaudeAPIError | undefined;\n const maxRetries = this.config.maxRetries || 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n yield* this.streamRequestOnce(request);\n return;\n } catch (error) {\n lastError = this.transformError(error);\n \n if (!lastError.retryable) {\n this.handleError(lastError);\n throw lastError;\n }\n\n this.logger.warn(\n `Claude API stream request failed (attempt ${attempt + 1}/${maxRetries})`,\n { error: lastError.message },\n );\n\n if (attempt < maxRetries - 1) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n await this.delay(delay);\n }\n }\n }\n\n this.handleError(lastError!);\n throw lastError;\n }\n\n /**\n * Send a single streaming request\n */\n private async *streamRequestOnce(request: ClaudeRequest): AsyncIterable<ClaudeStreamEvent> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), (this.config.timeout || 60000) * 2);\n\n try {\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n if (!response.body) {\n throw new ClaudeAPIError('Response body is null');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const event = JSON.parse(data) as ClaudeStreamEvent;\n this.emit('stream_event', event);\n yield event;\n } catch (e) {\n this.logger.warn('Failed to parse stream event', { data, error: e });\n }\n }\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /**\n * Create appropriate error based on status code\n */\n private createAPIError(statusCode: number, errorData: any): ClaudeAPIError {\n const message = errorData.error?.message || errorData.message || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n return new ClaudeValidationError(message, errorData);\n case 401:\n case 403:\n return new ClaudeAuthenticationError(message, errorData);\n case 429: {\n const retryAfter = errorData.error?.retry_after;\n return new ClaudeRateLimitError(message, retryAfter, errorData);\n }\n case 500:\n return new ClaudeInternalServerError(message, errorData);\n case 503:\n return new ClaudeServiceUnavailableError(message, errorData);\n default:\n return new ClaudeAPIError(message, statusCode, statusCode >= 500, errorData);\n }\n }\n\n /**\n * Transform generic errors to Claude API errors\n */\n private transformError(error: unknown): ClaudeAPIError {\n if (error instanceof ClaudeAPIError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Network errors\n if (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED')) {\n return new ClaudeNetworkError(error.message);\n }\n \n // Timeout errors\n if (error.name === 'AbortError' || error.message.includes('timeout')) {\n return new ClaudeTimeoutError(error.message, this.config.timeout || 60000);\n }\n }\n\n return new ClaudeAPIError(\n error instanceof Error ? error.message : String(error),\n undefined,\n true, // Assume unknown errors are retryable\n );\n }\n\n /**\n * Calculate retry delay with exponential backoff and jitter\n */\n private calculateRetryDelay(attempt: number, error: ClaudeAPIError): number {\n // If rate limit error with retry-after header, use that\n if (error instanceof ClaudeRateLimitError && error.retryAfter) {\n return error.retryAfter * 1000; // Convert to milliseconds\n }\n\n const baseDelay = this.config.retryBaseDelay || 1000;\n const maxDelay = this.config.retryMaxDelay || 30000;\n \n // Exponential backoff: delay = baseDelay * (2 ^ attempt)\n let delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);\n \n // Add jitter to prevent thundering herd\n if (this.config.retryJitter) {\n const jitter = Math.random() * 0.3 * delay; // Up to 30% jitter\n delay = delay + jitter;\n }\n\n return Math.floor(delay);\n }\n\n /**\n * Handle errors with user-friendly messages and logging\n */\n private handleError(error: ClaudeAPIError): void {\n const errorInfo = getUserFriendlyError(error);\n \n this.logger.error(`${errorInfo.title}: ${errorInfo.message}`, {\n error: error.message,\n code: error.code,\n statusCode: error.statusCode,\n retryable: error.retryable,\n details: error.details,\n });\n\n // Log suggestions in debug mode\n if (this.logger.level === 'debug' && errorInfo.suggestions.length > 0) {\n this.logger.debug('Suggestions to resolve the issue:', errorInfo.suggestions);\n }\n\n this.emit('error', {\n error,\n userFriendly: errorInfo,\n });\n }\n\n /**\n * Helper method for simple completions with error handling\n */\n async complete(\n prompt: string,\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n },\n ): Promise<string> {\n try {\n const messages: ClaudeMessage[] = [{ role: 'user', content: prompt }];\n const response = (await this.sendMessage(messages, options)) as ClaudeResponse;\n return response.content[0].text;\n } catch (error) {\n if (error instanceof ClaudeAPIError) {\n const errorInfo = getUserFriendlyError(error);\n throw new Error(`${errorInfo.title}: ${errorInfo.message}`);\n }\n throw error;\n }\n }\n\n /**\n * Delay helper\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = undefined;\n }\n this.removeAllListeners();\n }\n}"],"names":["EventEmitter","ClaudeAPIError","ClaudeInternalServerError","ClaudeServiceUnavailableError","ClaudeRateLimitError","ClaudeTimeoutError","ClaudeNetworkError","ClaudeAuthenticationError","ClaudeValidationError","getUserFriendlyError","circuitBreaker","EnhancedClaudeAPIClient","config","logger","configManager","lastHealthCheck","healthCheckTimer","loadConfiguration","threshold","circuitBreakerThreshold","timeout","circuitBreakerTimeout","resetTimeout","circuitBreakerResetTimeout","enableHealthCheck","startHealthCheck","overrides","apiKey","apiUrl","model","temperature","maxTokens","topP","topK","undefined","systemPrompt","retryAttempts","retryDelay","healthCheckInterval","maxRetries","retryBaseDelay","retryMaxDelay","retryJitter","process","env","ANTHROPIC_API_KEY","claudeConfig","get","Object","assign","validateConfiguration","performHealthCheck","setInterval","startTime","Date","now","controller","AbortController","setTimeout","abort","response","fetch","method","headers","body","JSON","stringify","messages","role","content","max_tokens","signal","clearTimeout","latency","healthy","ok","status","error","timestamp","debug","emit","Error","message","warn","getHealthStatus","sendMessage","options","request","system","top_p","top_k","stream","messageCount","length","result","execute","streamRequestWithRetry","sendRequestWithRetry","includes","apiError","handleError","lastError","attempt","sendRequestOnce","transformError","retryable","statusCode","delay","calculateRetryDelay","info","errorText","text","errorData","parse","createAPIError","data","json","inputTokens","usage","input_tokens","outputTokens","output_tokens","stopReason","stop_reason","name","streamRequestOnce","reader","getReader","decoder","TextDecoder","buffer","done","value","read","decode","lines","split","pop","line","startsWith","slice","event","e","retryAfter","retry_after","String","baseDelay","maxDelay","Math","min","pow","jitter","random","floor","errorInfo","title","code","details","level","suggestions","userFriendly","complete","prompt","ms","Promise","resolve","destroy","clearInterval","removeAllListeners"],"mappings":"AAKA,SAASA,YAAY,QAAQ,SAAS;AAGtC,SACEC,cAAc,EACdC,yBAAyB,EACzBC,6BAA6B,EAC7BC,oBAAoB,EACpBC,kBAAkB,EAClBC,kBAAkB,EAClBC,yBAAyB,EACzBC,qBAAqB,EAErBC,oBAAoB,QACf,yBAAyB;AAChC,SAASC,cAAc,QAAwB,sBAAsB;AAsBrE,OAAO,MAAMC,gCAAgCX;IACnCY,OAAgC;IAChCC,OAAgB;IAChBC,cAA6B;IAC7BJ,eAA+B;IAC/BK,gBAAoC;IACpCC,iBAAkC;IAE1C,YAAYH,MAAe,EAAEC,aAA4B,EAAEF,MAAyC,CAAE;QACpG,KAAK;QACL,IAAI,CAACC,MAAM,GAAGA;QACd,IAAI,CAACC,aAAa,GAAGA;QACrB,IAAI,CAACF,MAAM,GAAG,IAAI,CAACK,iBAAiB,CAACL;QAGrC,IAAI,CAACF,cAAc,GAAGA,eAAe,cAAc;YACjDQ,WAAW,IAAI,CAACN,MAAM,CAACO,uBAAuB,IAAI;YAClDC,SAAS,IAAI,CAACR,MAAM,CAACS,qBAAqB,IAAI;YAC9CC,cAAc,IAAI,CAACV,MAAM,CAACW,0BAA0B,IAAI;QAC1D;QAGA,IAAI,IAAI,CAACX,MAAM,CAACY,iBAAiB,EAAE;YACjC,IAAI,CAACC,gBAAgB;QACvB;IACF;IAKQR,kBAAkBS,SAA4C,EAA2B;QAC/F,MAAMd,SAAkC;YACtCe,QAAQ;YACRC,QAAQ;YACRC,OAAO;YACPC,aAAa;YACbC,WAAW;YACXC,MAAM;YACNC,MAAMC;YACNC,cAAcD;YACdd,SAAS;YACTgB,eAAe;YACfC,YAAY;YAEZb,mBAAmB;YACnBc,qBAAqB;YACrBnB,yBAAyB;YACzBE,uBAAuB;YACvBE,4BAA4B;YAC5BgB,YAAY;YACZC,gBAAgB;YAChBC,eAAe;YACfC,aAAa;QACf;QAGA,IAAIC,QAAQC,GAAG,CAACC,iBAAiB,EAAE;YACjCjC,OAAOe,MAAM,GAAGgB,QAAQC,GAAG,CAACC,iBAAiB;QAC/C;QAGA,MAAMC,eAAe,IAAI,CAAChC,aAAa,CAACiC,GAAG,CAAC;QAC5C,IAAID,cAAc;YAChBE,OAAOC,MAAM,CAACrC,QAAQkC;QACxB;QAGA,IAAIpB,WAAW;YACbsB,OAAOC,MAAM,CAACrC,QAAQc;QACxB;QAEA,IAAI,CAACwB,qBAAqB,CAACtC;QAC3B,OAAOA;IACT;IAKQsC,sBAAsBtC,MAA+B,EAAQ;QACnE,IAAI,CAACA,OAAOe,MAAM,EAAE;YAClB,MAAM,IAAIpB,0BAA0B;QACtC;QAEA,IAAIK,OAAOkB,WAAW,KAAKI,aAActB,CAAAA,OAAOkB,WAAW,GAAG,KAAKlB,OAAOkB,WAAW,GAAG,CAAA,GAAI;YAC1F,MAAM,IAAItB,sBAAsB;QAClC;QAEA,IAAII,OAAOmB,SAAS,KAAKG,aAActB,CAAAA,OAAOmB,SAAS,GAAG,KAAKnB,OAAOmB,SAAS,GAAG,MAAK,GAAI;YACzF,MAAM,IAAIvB,sBAAsB;QAClC;IACF;IAKQiB,mBAAyB;QAC/B,IAAI,CAAC0B,kBAAkB;QAEvB,IAAI,CAACnC,gBAAgB,GAAGoC,YACtB,IAAM,IAAI,CAACD,kBAAkB,IAC7B,IAAI,CAACvC,MAAM,CAAC0B,mBAAmB,IAAI;IAEvC;IAKA,MAAMa,qBAAiD;QACrD,MAAME,YAAYC,KAAKC,GAAG;QAE1B,IAAI;YAEF,MAAMC,aAAa,IAAIC;YACvB,MAAMrC,UAAUsC,WAAW,IAAMF,WAAWG,KAAK,IAAI;YAErD,MAAMC,WAAW,MAAMC,MAAM,IAAI,CAACjD,MAAM,CAACgB,MAAM,IAAI,IAAI;gBACrDkC,QAAQ;gBACRC,SAAS;oBACP,gBAAgB;oBAChB,qBAAqB;oBACrB,aAAa,IAAI,CAACnD,MAAM,CAACe,MAAM;gBACjC;gBACAqC,MAAMC,KAAKC,SAAS,CAAC;oBACnBrC,OAAO,IAAI,CAACjB,MAAM,CAACiB,KAAK;oBACxBsC,UAAU;wBAAC;4BAAEC,MAAM;4BAAQC,SAAS;wBAAK;qBAAE;oBAC3CC,YAAY;gBACd;gBACAC,QAAQf,WAAWe,MAAM;YAC3B;YAEAC,aAAapD;YAEb,MAAMqD,UAAUnB,KAAKC,GAAG,KAAKF;YAC7B,MAAMqB,UAAUd,SAASe,EAAE,IAAIf,SAASgB,MAAM,KAAK;YAEnD,IAAI,CAAC7D,eAAe,GAAG;gBACrB2D;gBACAD;gBACAI,OAAOH,UAAUxC,YAAY,CAAC,QAAQ,EAAE0B,SAASgB,MAAM,EAAE;gBACzDE,WAAW,IAAIxB;YACjB;YAEA,IAAI,CAACzC,MAAM,CAACkE,KAAK,CAAC,qCAAqC,IAAI,CAAChE,eAAe;YAC3E,IAAI,CAACiE,IAAI,CAAC,gBAAgB,IAAI,CAACjE,eAAe;YAE9C,OAAO,IAAI,CAACA,eAAe;QAC7B,EAAE,OAAO8D,OAAO;YACd,MAAMJ,UAAUnB,KAAKC,GAAG,KAAKF;YAE7B,IAAI,CAACtC,eAAe,GAAG;gBACrB2D,SAAS;gBACTD;gBACAI,OAAOA,iBAAiBI,QAAQJ,MAAMK,OAAO,GAAG;gBAChDJ,WAAW,IAAIxB;YACjB;YAEA,IAAI,CAACzC,MAAM,CAACsE,IAAI,CAAC,kCAAkC,IAAI,CAACpE,eAAe;YACvE,IAAI,CAACiE,IAAI,CAAC,gBAAgB,IAAI,CAACjE,eAAe;YAE9C,OAAO,IAAI,CAACA,eAAe;QAC7B;IACF;IAKAqE,kBAAiD;QAC/C,OAAO,IAAI,CAACrE,eAAe;IAC7B;IAKA,MAAMsE,YACJlB,QAAyB,EACzBmB,OAMC,EAC2D;QAC5D,MAAMC,UAAyB;YAC7B1D,OAAOyD,SAASzD,SAAS,IAAI,CAACjB,MAAM,CAACiB,KAAK,IAAI;YAC9CsC;YACAqB,QAAQF,SAASnD,gBAAgB,IAAI,CAACvB,MAAM,CAACuB,YAAY;YACzDmC,YAAYgB,SAASvD,aAAa,IAAI,CAACnB,MAAM,CAACmB,SAAS,IAAI;YAC3DD,aAAawD,SAASxD,eAAe,IAAI,CAAClB,MAAM,CAACkB,WAAW;YAC5D2D,OAAO,IAAI,CAAC7E,MAAM,CAACoB,IAAI;YACvB0D,OAAO,IAAI,CAAC9E,MAAM,CAACqB,IAAI;YACvB0D,QAAQL,SAASK,UAAU;QAC7B;QAEA,IAAI,CAAC9E,MAAM,CAACkE,KAAK,CAAC,8BAA8B;YAC9ClD,OAAO0D,QAAQ1D,KAAK;YACpBC,aAAayD,QAAQzD,WAAW;YAChCC,WAAWwD,QAAQjB,UAAU;YAC7BsB,cAAczB,SAAS0B,MAAM;YAC7BF,QAAQJ,QAAQI,MAAM;QACxB;QAEA,IAAI;YAEF,MAAMG,SAAS,MAAM,IAAI,CAACpF,cAAc,CAACqF,OAAO,CAAC;gBAC/C,IAAIR,QAAQI,MAAM,EAAE;oBAClB,OAAO,IAAI,CAACK,sBAAsB,CAACT;gBACrC,OAAO;oBACL,OAAO,IAAI,CAACU,oBAAoB,CAACV;gBACnC;YACF;YAEA,OAAOO;QACT,EAAE,OAAOjB,OAAO;YAEd,IAAIA,iBAAiBI,SAASJ,MAAMK,OAAO,CAACgB,QAAQ,CAAC,oBAAoB;gBACvE,MAAMC,WAAW,IAAIhG,8BACnB;gBAEF,IAAI,CAACiG,WAAW,CAACD;gBACjB,MAAMA;YACR;YACA,MAAMtB;QACR;IACF;IAKA,MAAcoB,qBAAqBV,OAAsB,EAA2B;QAClF,IAAIc;QACJ,MAAM9D,aAAa,IAAI,CAAC3B,MAAM,CAAC2B,UAAU,IAAI;QAE7C,IAAK,IAAI+D,UAAU,GAAGA,UAAU/D,YAAY+D,UAAW;YACrD,IAAI;gBACF,OAAO,MAAM,IAAI,CAACC,eAAe,CAAChB;YACpC,EAAE,OAAOV,OAAO;gBACdwB,YAAY,IAAI,CAACG,cAAc,CAAC3B;gBAGhC,IAAI,CAACwB,UAAUI,SAAS,EAAE;oBACxB,IAAI,CAACL,WAAW,CAACC;oBACjB,MAAMA;gBACR;gBAEA,IAAI,CAACxF,MAAM,CAACsE,IAAI,CACd,CAAC,mCAAmC,EAAEmB,UAAU,EAAE,CAAC,EAAE/D,WAAW,CAAC,CAAC,EAClE;oBACEsC,OAAOwB,UAAUnB,OAAO;oBACxBwB,YAAYL,UAAUK,UAAU;oBAChCD,WAAWJ,UAAUI,SAAS;gBAChC;gBAIF,IAAIH,UAAU/D,aAAa,GAAG;oBAC5B,MAAMoE,QAAQ,IAAI,CAACC,mBAAmB,CAACN,SAASD;oBAChD,IAAI,CAACxF,MAAM,CAACgG,IAAI,CAAC,CAAC,eAAe,EAAEF,MAAM,KAAK,CAAC;oBAC/C,MAAM,IAAI,CAACA,KAAK,CAACA;gBACnB;YACF;QACF;QAEA,IAAI,CAACP,WAAW,CAACC;QACjB,MAAMA;IACR;IAKA,MAAcE,gBAAgBhB,OAAsB,EAA2B;QAC7E,MAAM/B,aAAa,IAAIC;QACvB,MAAMrC,UAAUsC,WAAW,IAAMF,WAAWG,KAAK,IAAI,IAAI,CAAC/C,MAAM,CAACQ,OAAO,IAAI;QAE5E,IAAI;YACF,MAAMwC,WAAW,MAAMC,MAAM,IAAI,CAACjD,MAAM,CAACgB,MAAM,IAAI,IAAI;gBACrDkC,QAAQ;gBACRC,SAAS;oBACP,gBAAgB;oBAChB,qBAAqB;oBACrB,aAAa,IAAI,CAACnD,MAAM,CAACe,MAAM;gBACjC;gBACAqC,MAAMC,KAAKC,SAAS,CAACqB;gBACrBhB,QAAQf,WAAWe,MAAM;YAC3B;YAEAC,aAAapD;YAGb,IAAI,CAACwC,SAASe,EAAE,EAAE;gBAChB,MAAMmC,YAAY,MAAMlD,SAASmD,IAAI;gBACrC,IAAIC;gBAEJ,IAAI;oBACFA,YAAY/C,KAAKgD,KAAK,CAACH;gBACzB,EAAE,OAAM;oBACNE,YAAY;wBAAE9B,SAAS4B;oBAAU;gBACnC;gBAEA,MAAM,IAAI,CAACI,cAAc,CAACtD,SAASgB,MAAM,EAAEoC;YAC7C;YAEA,MAAMG,OAAQ,MAAMvD,SAASwD,IAAI;YAEjC,IAAI,CAACvG,MAAM,CAACgG,IAAI,CAAC,gCAAgC;gBAC/ChF,OAAOsF,KAAKtF,KAAK;gBACjBwF,aAAaF,KAAKG,KAAK,CAACC,YAAY;gBACpCC,cAAcL,KAAKG,KAAK,CAACG,aAAa;gBACtCC,YAAYP,KAAKQ,WAAW;YAC9B;YAEA,IAAI,CAAC3C,IAAI,CAAC,YAAYmC;YACtB,OAAOA;QACT,EAAE,OAAOtC,OAAO;YACdL,aAAapD;YAGb,IAAIyD,iBAAiBI,SAASJ,MAAM+C,IAAI,KAAK,cAAc;gBACzD,MAAM,IAAIvH,mBACR,qBACA,IAAI,CAACO,MAAM,CAACQ,OAAO,IAAI;YAE3B;YAEA,MAAMyD;QACR;IACF;IAKA,OAAemB,uBAAuBT,OAAsB,EAAoC;QAC9F,IAAIc;QACJ,MAAM9D,aAAa,IAAI,CAAC3B,MAAM,CAAC2B,UAAU,IAAI;QAE7C,IAAK,IAAI+D,UAAU,GAAGA,UAAU/D,YAAY+D,UAAW;YACrD,IAAI;gBACF,OAAO,IAAI,CAACuB,iBAAiB,CAACtC;gBAC9B;YACF,EAAE,OAAOV,OAAO;gBACdwB,YAAY,IAAI,CAACG,cAAc,CAAC3B;gBAEhC,IAAI,CAACwB,UAAUI,SAAS,EAAE;oBACxB,IAAI,CAACL,WAAW,CAACC;oBACjB,MAAMA;gBACR;gBAEA,IAAI,CAACxF,MAAM,CAACsE,IAAI,CACd,CAAC,0CAA0C,EAAEmB,UAAU,EAAE,CAAC,EAAE/D,WAAW,CAAC,CAAC,EACzE;oBAAEsC,OAAOwB,UAAUnB,OAAO;gBAAC;gBAG7B,IAAIoB,UAAU/D,aAAa,GAAG;oBAC5B,MAAMoE,QAAQ,IAAI,CAACC,mBAAmB,CAACN,SAASD;oBAChD,MAAM,IAAI,CAACM,KAAK,CAACA;gBACnB;YACF;QACF;QAEA,IAAI,CAACP,WAAW,CAACC;QACjB,MAAMA;IACR;IAKA,OAAewB,kBAAkBtC,OAAsB,EAAoC;QACzF,MAAM/B,aAAa,IAAIC;QACvB,MAAMrC,UAAUsC,WAAW,IAAMF,WAAWG,KAAK,IAAI,AAAC,CAAA,IAAI,CAAC/C,MAAM,CAACQ,OAAO,IAAI,KAAI,IAAK;QAEtF,IAAI;YACF,MAAMwC,WAAW,MAAMC,MAAM,IAAI,CAACjD,MAAM,CAACgB,MAAM,IAAI,IAAI;gBACrDkC,QAAQ;gBACRC,SAAS;oBACP,gBAAgB;oBAChB,qBAAqB;oBACrB,aAAa,IAAI,CAACnD,MAAM,CAACe,MAAM;gBACjC;gBACAqC,MAAMC,KAAKC,SAAS,CAAC;oBAAE,GAAGqB,OAAO;oBAAEI,QAAQ;gBAAK;gBAChDpB,QAAQf,WAAWe,MAAM;YAC3B;YAEA,IAAI,CAACX,SAASe,EAAE,EAAE;gBAChB,MAAMmC,YAAY,MAAMlD,SAASmD,IAAI;gBACrC,IAAIC;gBAEJ,IAAI;oBACFA,YAAY/C,KAAKgD,KAAK,CAACH;gBACzB,EAAE,OAAM;oBACNE,YAAY;wBAAE9B,SAAS4B;oBAAU;gBACnC;gBAEA,MAAM,IAAI,CAACI,cAAc,CAACtD,SAASgB,MAAM,EAAEoC;YAC7C;YAEA,IAAI,CAACpD,SAASI,IAAI,EAAE;gBAClB,MAAM,IAAI/D,eAAe;YAC3B;YAEA,MAAM6H,SAASlE,SAASI,IAAI,CAAC+D,SAAS;YACtC,MAAMC,UAAU,IAAIC;YACpB,IAAIC,SAAS;YAEb,MAAO,KAAM;gBACX,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAG,MAAMN,OAAOO,IAAI;gBACzC,IAAIF,MAAM;gBAEVD,UAAUF,QAAQM,MAAM,CAACF,OAAO;oBAAEzC,QAAQ;gBAAK;gBAC/C,MAAM4C,QAAQL,OAAOM,KAAK,CAAC;gBAC3BN,SAASK,MAAME,GAAG,MAAM;gBAExB,KAAK,MAAMC,QAAQH,MAAO;oBACxB,IAAIG,KAAKC,UAAU,CAAC,WAAW;wBAC7B,MAAMxB,OAAOuB,KAAKE,KAAK,CAAC;wBACxB,IAAIzB,SAAS,UAAU;wBAEvB,IAAI;4BACF,MAAM0B,QAAQ5E,KAAKgD,KAAK,CAACE;4BACzB,IAAI,CAACnC,IAAI,CAAC,gBAAgB6D;4BAC1B,MAAMA;wBACR,EAAE,OAAOC,GAAG;4BACV,IAAI,CAACjI,MAAM,CAACsE,IAAI,CAAC,gCAAgC;gCAAEgC;gCAAMtC,OAAOiE;4BAAE;wBACpE;oBACF;gBACF;YACF;QACF,SAAU;YACRtE,aAAapD;QACf;IACF;IAKQ8F,eAAeR,UAAkB,EAAEM,SAAc,EAAkB;QACzE,MAAM9B,UAAU8B,UAAUnC,KAAK,EAAEK,WAAW8B,UAAU9B,OAAO,IAAI;QAEjE,OAAQwB;YACN,KAAK;gBACH,OAAO,IAAIlG,sBAAsB0E,SAAS8B;YAC5C,KAAK;YACL,KAAK;gBACH,OAAO,IAAIzG,0BAA0B2E,SAAS8B;YAChD,KAAK;gBAAK;oBACR,MAAM+B,aAAa/B,UAAUnC,KAAK,EAAEmE;oBACpC,OAAO,IAAI5I,qBAAqB8E,SAAS6D,YAAY/B;gBACvD;YACA,KAAK;gBACH,OAAO,IAAI9G,0BAA0BgF,SAAS8B;YAChD,KAAK;gBACH,OAAO,IAAI7G,8BAA8B+E,SAAS8B;YACpD;gBACE,OAAO,IAAI/G,eAAeiF,SAASwB,YAAYA,cAAc,KAAKM;QACtE;IACF;IAKQR,eAAe3B,KAAc,EAAkB;QACrD,IAAIA,iBAAiB5E,gBAAgB;YACnC,OAAO4E;QACT;QAEA,IAAIA,iBAAiBI,OAAO;YAE1B,IAAIJ,MAAMK,OAAO,CAACgB,QAAQ,CAAC,mBAAmBrB,MAAMK,OAAO,CAACgB,QAAQ,CAAC,iBAAiB;gBACpF,OAAO,IAAI5F,mBAAmBuE,MAAMK,OAAO;YAC7C;YAGA,IAAIL,MAAM+C,IAAI,KAAK,gBAAgB/C,MAAMK,OAAO,CAACgB,QAAQ,CAAC,YAAY;gBACpE,OAAO,IAAI7F,mBAAmBwE,MAAMK,OAAO,EAAE,IAAI,CAACtE,MAAM,CAACQ,OAAO,IAAI;YACtE;QACF;QAEA,OAAO,IAAInB,eACT4E,iBAAiBI,QAAQJ,MAAMK,OAAO,GAAG+D,OAAOpE,QAChD3C,WACA;IAEJ;IAKQ0E,oBAAoBN,OAAe,EAAEzB,KAAqB,EAAU;QAE1E,IAAIA,iBAAiBzE,wBAAwByE,MAAMkE,UAAU,EAAE;YAC7D,OAAOlE,MAAMkE,UAAU,GAAG;QAC5B;QAEA,MAAMG,YAAY,IAAI,CAACtI,MAAM,CAAC4B,cAAc,IAAI;QAChD,MAAM2G,WAAW,IAAI,CAACvI,MAAM,CAAC6B,aAAa,IAAI;QAG9C,IAAIkE,QAAQyC,KAAKC,GAAG,CAACH,YAAYE,KAAKE,GAAG,CAAC,GAAGhD,UAAU6C;QAGvD,IAAI,IAAI,CAACvI,MAAM,CAAC8B,WAAW,EAAE;YAC3B,MAAM6G,SAASH,KAAKI,MAAM,KAAK,MAAM7C;YACrCA,QAAQA,QAAQ4C;QAClB;QAEA,OAAOH,KAAKK,KAAK,CAAC9C;IACpB;IAKQP,YAAYvB,KAAqB,EAAQ;QAC/C,MAAM6E,YAAYjJ,qBAAqBoE;QAEvC,IAAI,CAAChE,MAAM,CAACgE,KAAK,CAAC,GAAG6E,UAAUC,KAAK,CAAC,EAAE,EAAED,UAAUxE,OAAO,EAAE,EAAE;YAC5DL,OAAOA,MAAMK,OAAO;YACpB0E,MAAM/E,MAAM+E,IAAI;YAChBlD,YAAY7B,MAAM6B,UAAU;YAC5BD,WAAW5B,MAAM4B,SAAS;YAC1BoD,SAAShF,MAAMgF,OAAO;QACxB;QAGA,IAAI,IAAI,CAAChJ,MAAM,CAACiJ,KAAK,KAAK,WAAWJ,UAAUK,WAAW,CAAClE,MAAM,GAAG,GAAG;YACrE,IAAI,CAAChF,MAAM,CAACkE,KAAK,CAAC,qCAAqC2E,UAAUK,WAAW;QAC9E;QAEA,IAAI,CAAC/E,IAAI,CAAC,SAAS;YACjBH;YACAmF,cAAcN;QAChB;IACF;IAKA,MAAMO,SACJC,MAAc,EACd5E,OAKC,EACgB;QACjB,IAAI;YACF,MAAMnB,WAA4B;gBAAC;oBAAEC,MAAM;oBAAQC,SAAS6F;gBAAO;aAAE;YACrE,MAAMtG,WAAY,MAAM,IAAI,CAACyB,WAAW,CAAClB,UAAUmB;YACnD,OAAO1B,SAASS,OAAO,CAAC,EAAE,CAAC0C,IAAI;QACjC,EAAE,OAAOlC,OAAO;YACd,IAAIA,iBAAiB5E,gBAAgB;gBACnC,MAAMyJ,YAAYjJ,qBAAqBoE;gBACvC,MAAM,IAAII,MAAM,GAAGyE,UAAUC,KAAK,CAAC,EAAE,EAAED,UAAUxE,OAAO,EAAE;YAC5D;YACA,MAAML;QACR;IACF;IAKQ8B,MAAMwD,EAAU,EAAiB;QACvC,OAAO,IAAIC,QAAQ,CAACC,UAAY3G,WAAW2G,SAASF;IACtD;IAKAG,UAAgB;QACd,IAAI,IAAI,CAACtJ,gBAAgB,EAAE;YACzBuJ,cAAc,IAAI,CAACvJ,gBAAgB;YACnC,IAAI,CAACA,gBAAgB,GAAGkB;QAC1B;QACA,IAAI,CAACsI,kBAAkB;IACzB;AACF"}
@@ -401,8 +401,10 @@ export class ClaudeAPIClient extends EventEmitter {
401
401
  case 403:
402
402
  return new ClaudeAuthenticationError(message, errorData);
403
403
  case 429:
404
- const retryAfter = errorData.error?.retry_after;
405
- return new ClaudeRateLimitError(message, retryAfter, errorData);
404
+ {
405
+ const retryAfter = errorData.error?.retry_after;
406
+ return new ClaudeRateLimitError(message, retryAfter, errorData);
407
+ }
406
408
  case 500:
407
409
  return new ClaudeInternalServerError(message, errorData);
408
410
  case 503:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/api/claude-client.ts"],"sourcesContent":["/**\n * Claude API client for Claude-Flow\n * Provides direct integration with Claude's API including temperature and model selection\n */\n\nimport { EventEmitter } from 'events';\nimport { ILogger } from '../core/logger.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { getErrorMessage } from '../utils/error-handler.js';\nimport { \n ClaudeAPIError,\n ClaudeInternalServerError,\n ClaudeServiceUnavailableError,\n ClaudeRateLimitError,\n ClaudeTimeoutError,\n ClaudeNetworkError,\n ClaudeAuthenticationError,\n ClaudeValidationError,\n HealthCheckResult,\n getUserFriendlyError,\n} from './claude-api-errors.js';\nimport { circuitBreaker, CircuitBreaker } from '../utils/helpers.js';\n\nexport interface ClaudeAPIConfig {\n apiKey: string;\n apiUrl?: string;\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n topK?: number;\n systemPrompt?: string;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n // Enhanced error handling options\n enableHealthCheck?: boolean;\n healthCheckInterval?: number;\n circuitBreakerThreshold?: number;\n circuitBreakerTimeout?: number;\n circuitBreakerResetTimeout?: number;\n retryJitter?: boolean;\n}\n\nexport type ClaudeModel =\n | 'claude-3-opus-20240229'\n | 'claude-3-sonnet-20240229'\n | 'claude-3-haiku-20240307'\n | 'claude-2.1'\n | 'claude-2.0'\n | 'claude-instant-1.2';\n\nexport interface ClaudeMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface ClaudeRequest {\n model: ClaudeModel;\n messages: ClaudeMessage[];\n system?: string;\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n metadata?: {\n user_id?: string;\n };\n stop_sequences?: string[];\n stream?: boolean;\n}\n\nexport interface ClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<{\n type: 'text';\n text: string;\n }>;\n model: ClaudeModel;\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence';\n stop_sequence?: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n\nexport interface ClaudeStreamEvent {\n type:\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping'\n | 'error';\n message?: Partial<ClaudeResponse>;\n index?: number;\n delta?: {\n type?: 'text_delta';\n text?: string;\n stop_reason?: string;\n stop_sequence?: string;\n };\n content_block?: {\n type: 'text';\n text: string;\n };\n usage?: {\n output_tokens: number;\n };\n error?: {\n type: string;\n message: string;\n };\n}\n\nexport class ClaudeAPIClient extends EventEmitter {\n private config: ClaudeAPIConfig;\n private logger: ILogger;\n private configManager: ConfigManager;\n private defaultModel: ClaudeModel = 'claude-3-sonnet-20240229';\n private defaultTemperature: number = 0.7;\n private defaultMaxTokens: number = 4096;\n private circuitBreaker: CircuitBreaker;\n private lastHealthCheck?: HealthCheckResult;\n private healthCheckTimer?: NodeJS.Timeout;\n\n constructor(logger: ILogger, configManager: ConfigManager, config?: Partial<ClaudeAPIConfig>) {\n super();\n this.logger = logger;\n this.configManager = configManager;\n\n // Load config from environment and merge with provided config\n this.config = this.loadConfiguration(config);\n \n // Initialize circuit breaker for API reliability\n this.circuitBreaker = circuitBreaker('claude-api', {\n threshold: this.config.circuitBreakerThreshold || 5,\n timeout: this.config.circuitBreakerTimeout || 60000,\n resetTimeout: this.config.circuitBreakerResetTimeout || 300000,\n });\n\n // Start health check if enabled\n if (this.config.enableHealthCheck) {\n this.startHealthCheck();\n }\n }\n\n /**\n * Load configuration from various sources\n */\n private loadConfiguration(overrides?: Partial<ClaudeAPIConfig>): ClaudeAPIConfig {\n // Start with defaults\n const config: ClaudeAPIConfig = {\n apiKey: '',\n apiUrl: 'https://api.anthropic.com/v1/messages',\n model: this.defaultModel,\n temperature: this.defaultTemperature,\n maxTokens: this.defaultMaxTokens,\n topP: 1,\n topK: undefined,\n systemPrompt: undefined,\n timeout: 60000, // 60 seconds\n retryAttempts: 3,\n retryDelay: 1000,\n // Enhanced error handling defaults\n enableHealthCheck: false,\n healthCheckInterval: 300000, // 5 minutes\n circuitBreakerThreshold: 5,\n circuitBreakerTimeout: 60000,\n circuitBreakerResetTimeout: 300000,\n retryJitter: true,\n };\n\n // Load from environment variables\n if (process.env.ANTHROPIC_API_KEY) {\n config.apiKey = process.env.ANTHROPIC_API_KEY;\n }\n if (process.env.CLAUDE_API_URL) {\n config.apiUrl = process.env.CLAUDE_API_URL;\n }\n if (process.env.CLAUDE_MODEL) {\n config.model = process.env.CLAUDE_MODEL as ClaudeModel;\n }\n if (process.env.CLAUDE_TEMPERATURE) {\n config.temperature = parseFloat(process.env.CLAUDE_TEMPERATURE);\n }\n if (process.env.CLAUDE_MAX_TOKENS) {\n config.maxTokens = parseInt(process.env.CLAUDE_MAX_TOKENS, 10);\n }\n\n // Load from config manager if available\n const claudeConfig = this.configManager.get('claude');\n if (claudeConfig) {\n Object.assign(config, claudeConfig);\n }\n\n // Apply overrides\n if (overrides) {\n Object.assign(config, overrides);\n }\n\n // Validate configuration\n this.validateConfiguration(config);\n\n return config;\n }\n\n /**\n * Validate configuration settings\n */\n private validateConfiguration(config: ClaudeAPIConfig): void {\n if (!config.apiKey) {\n throw new ClaudeAuthenticationError('Claude API key is required. Set ANTHROPIC_API_KEY environment variable.');\n }\n\n if (config.temperature !== undefined) {\n if (config.temperature < 0 || config.temperature > 1) {\n throw new ClaudeValidationError('Temperature must be between 0 and 1');\n }\n }\n\n if (config.topP !== undefined) {\n if (config.topP < 0 || config.topP > 1) {\n throw new ClaudeValidationError('Top-p must be between 0 and 1');\n }\n }\n\n if (config.maxTokens !== undefined && (config.maxTokens < 1 || config.maxTokens > 100000)) {\n throw new ClaudeValidationError('Max tokens must be between 1 and 100000');\n }\n }\n\n /**\n * Update configuration dynamically\n */\n updateConfig(updates: Partial<ClaudeAPIConfig>): void {\n this.config = { ...this.config, ...updates };\n this.validateConfiguration(this.config);\n this.logger.info('Claude API configuration updated', {\n model: this.config.model,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n });\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ClaudeAPIConfig {\n return { ...this.config };\n }\n\n /**\n * Send a message to Claude API\n */\n async sendMessage(\n messages: ClaudeMessage[],\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n stream?: boolean;\n },\n ): Promise<ClaudeResponse | AsyncIterable<ClaudeStreamEvent>> {\n const request: ClaudeRequest = {\n model: options?.model || this.config.model || 'claude-3-opus-20240229',\n messages,\n system: options?.systemPrompt || this.config.systemPrompt,\n max_tokens: options?.maxTokens || this.config.maxTokens || 4096,\n temperature: options?.temperature ?? this.config.temperature,\n top_p: this.config.topP,\n top_k: this.config.topK,\n stream: options?.stream || false,\n };\n\n this.logger.debug('Sending Claude API request', {\n model: request.model,\n temperature: request.temperature,\n maxTokens: request.max_tokens,\n messageCount: messages.length,\n stream: request.stream,\n });\n\n if (request.stream) {\n return this.streamRequest(request);\n } else {\n return this.sendRequest(request);\n }\n }\n\n /**\n * Send a non-streaming request\n */\n private async sendRequest(request: ClaudeRequest): Promise<ClaudeResponse> {\n let lastError: ClaudeAPIError | undefined;\n\n for (let attempt = 0; attempt < (this.config.retryAttempts || 3); attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeout || 30000);\n\n const response = await fetch(this.config.apiUrl || 'https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n const data = (await response.json()) as ClaudeResponse;\n\n this.logger.info('Claude API response received', {\n model: data.model,\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n stopReason: data.stop_reason,\n });\n\n this.emit('response', data);\n return data;\n } catch (error) {\n lastError = this.transformError(error);\n \n // Don't retry non-retryable errors\n if (!lastError.retryable) {\n this.handleError(lastError);\n throw lastError;\n }\n\n this.logger.warn(\n `Claude API request failed (attempt ${attempt + 1}/${this.config.retryAttempts})`,\n {\n error: lastError.message,\n statusCode: lastError.statusCode,\n retryable: lastError.retryable,\n },\n );\n\n if (attempt < (this.config.retryAttempts || 3) - 1) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n await this.delay(delay);\n }\n }\n }\n\n this.handleError(lastError!);\n throw lastError;\n }\n\n /**\n * Send a streaming request\n */\n private async *streamRequest(request: ClaudeRequest): AsyncIterable<ClaudeStreamEvent> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), (this.config.timeout || 30000) * 2); // Double timeout for streaming\n\n try {\n const response = await fetch(this.config.apiUrl || 'https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n if (!response.body) {\n throw new ClaudeAPIError('Response body is null');\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const event = JSON.parse(data) as ClaudeStreamEvent;\n this.emit('stream_event', event);\n yield event;\n } catch (e) {\n this.logger.warn('Failed to parse stream event', { data, error: e });\n }\n }\n }\n }\n } catch (error) {\n clearTimeout(timeout);\n \n // Handle abort/timeout\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ClaudeTimeoutError(\n 'Request timed out',\n this.config.timeout || 60000,\n );\n }\n \n throw error;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /**\n * Helper method for simple completions\n */\n async complete(\n prompt: string,\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n },\n ): Promise<string> {\n const messages: ClaudeMessage[] = [{ role: 'user', content: prompt }];\n const response = (await this.sendMessage(messages, options)) as ClaudeResponse;\n return response.content[0].text;\n }\n\n /**\n * Helper method for streaming completions\n */\n async *streamComplete(\n prompt: string,\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n },\n ): AsyncIterable<string> {\n const messages: ClaudeMessage[] = [{ role: 'user', content: prompt }];\n const stream = (await this.sendMessage(messages, {\n ...options,\n stream: true,\n })) as AsyncIterable<ClaudeStreamEvent>;\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta' && event.delta?.text) {\n yield event.delta.text;\n }\n }\n }\n\n /**\n * Get available models\n */\n getAvailableModels(): ClaudeModel[] {\n return [\n 'claude-3-opus-20240229',\n 'claude-3-sonnet-20240229',\n 'claude-3-haiku-20240307',\n 'claude-2.1',\n 'claude-2.0',\n 'claude-instant-1.2',\n ];\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: ClaudeModel): {\n name: string;\n contextWindow: number;\n description: string;\n } {\n const modelInfo: Record<\n ClaudeModel,\n { name: string; contextWindow: number; description: string }\n > = {\n 'claude-3-opus-20240229': {\n name: 'Claude 3 Opus',\n contextWindow: 200000,\n description: 'Most capable model, best for complex tasks',\n },\n 'claude-3-sonnet-20240229': {\n name: 'Claude 3 Sonnet',\n contextWindow: 200000,\n description: 'Balanced performance and speed',\n },\n 'claude-3-haiku-20240307': {\n name: 'Claude 3 Haiku',\n contextWindow: 200000,\n description: 'Fastest model, best for simple tasks',\n },\n 'claude-2.1': {\n name: 'Claude 2.1',\n contextWindow: 200000,\n description: 'Previous generation, enhanced capabilities',\n },\n 'claude-2.0': {\n name: 'Claude 2.0',\n contextWindow: 100000,\n description: 'Previous generation model',\n },\n 'claude-instant-1.2': {\n name: 'Claude Instant 1.2',\n contextWindow: 100000,\n description: 'Fast, cost-effective model',\n },\n };\n\n return (\n modelInfo[model] || {\n name: model,\n contextWindow: 100000,\n description: 'Unknown model',\n }\n );\n }\n\n /**\n * Delay helper for retries\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Start periodic health checks\n */\n private startHealthCheck(): void {\n this.performHealthCheck(); // Initial check\n \n this.healthCheckTimer = setInterval(\n () => this.performHealthCheck(),\n this.config.healthCheckInterval || 300000,\n );\n }\n\n /**\n * Perform a health check on the API\n */\n async performHealthCheck(): Promise<HealthCheckResult> {\n const startTime = Date.now();\n \n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: [{ role: 'user', content: 'Hi' }],\n max_tokens: 1,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n \n const latency = Date.now() - startTime;\n const healthy = response.ok || response.status === 429; // Rate limit is still \"healthy\"\n \n this.lastHealthCheck = {\n healthy,\n latency,\n error: healthy ? undefined : `Status: ${response.status}`,\n timestamp: new Date(),\n };\n\n this.logger.debug('Claude API health check completed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n } catch (error) {\n const latency = Date.now() - startTime;\n \n this.lastHealthCheck = {\n healthy: false,\n latency,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date(),\n };\n\n this.logger.warn('Claude API health check failed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n }\n }\n\n /**\n * Get last health check result\n */\n getHealthStatus(): HealthCheckResult | undefined {\n return this.lastHealthCheck;\n }\n\n /**\n * Create appropriate error based on status code\n */\n private createAPIError(statusCode: number, errorData: any): ClaudeAPIError {\n const message = errorData.error?.message || errorData.message || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n return new ClaudeValidationError(message, errorData);\n case 401:\n case 403:\n return new ClaudeAuthenticationError(message, errorData);\n case 429:\n const retryAfter = errorData.error?.retry_after;\n return new ClaudeRateLimitError(message, retryAfter, errorData);\n case 500:\n return new ClaudeInternalServerError(message, errorData);\n case 503:\n return new ClaudeServiceUnavailableError(message, errorData);\n default:\n return new ClaudeAPIError(message, statusCode, statusCode >= 500, errorData);\n }\n }\n\n /**\n * Transform generic errors to Claude API errors\n */\n private transformError(error: unknown): ClaudeAPIError {\n if (error instanceof ClaudeAPIError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Network errors\n if (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED')) {\n return new ClaudeNetworkError(error.message);\n }\n \n // Timeout errors\n if (error.name === 'AbortError' || error.message.includes('timeout')) {\n return new ClaudeTimeoutError(error.message, this.config.timeout || 60000);\n }\n }\n\n return new ClaudeAPIError(\n error instanceof Error ? error.message : String(error),\n undefined,\n true, // Assume unknown errors are retryable\n );\n }\n\n /**\n * Calculate retry delay with exponential backoff and jitter\n */\n private calculateRetryDelay(attempt: number, error: ClaudeAPIError): number {\n // If rate limit error with retry-after header, use that\n if (error instanceof ClaudeRateLimitError && error.retryAfter) {\n return error.retryAfter * 1000; // Convert to milliseconds\n }\n\n const baseDelay = this.config.retryDelay || 1000;\n const maxDelay = 30000; // 30 seconds max\n \n // Exponential backoff: delay = baseDelay * (2 ^ attempt)\n let delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);\n \n // Add jitter to prevent thundering herd\n if (this.config.retryJitter) {\n const jitter = Math.random() * 0.3 * delay; // Up to 30% jitter\n delay = delay + jitter;\n }\n\n return Math.floor(delay);\n }\n\n /**\n * Handle errors with user-friendly messages and logging\n */\n private handleError(error: ClaudeAPIError): void {\n const errorInfo = getUserFriendlyError(error);\n \n this.logger.error(`${errorInfo.title}: ${errorInfo.message}`, {\n error: error.message,\n code: error.code,\n statusCode: error.statusCode,\n retryable: error.retryable,\n details: error.details,\n });\n\n // Log suggestions in debug mode\n if (this.logger.level === 'debug' && errorInfo.suggestions.length > 0) {\n this.logger.debug('Suggestions to resolve the issue:', errorInfo.suggestions);\n }\n\n this.emit('error', {\n error,\n userFriendly: errorInfo,\n });\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = undefined;\n }\n this.removeAllListeners();\n }\n}\n"],"names":["EventEmitter","ClaudeAPIError","ClaudeInternalServerError","ClaudeServiceUnavailableError","ClaudeRateLimitError","ClaudeTimeoutError","ClaudeNetworkError","ClaudeAuthenticationError","ClaudeValidationError","getUserFriendlyError","circuitBreaker","ClaudeAPIClient","config","logger","configManager","defaultModel","defaultTemperature","defaultMaxTokens","lastHealthCheck","healthCheckTimer","loadConfiguration","threshold","circuitBreakerThreshold","timeout","circuitBreakerTimeout","resetTimeout","circuitBreakerResetTimeout","enableHealthCheck","startHealthCheck","overrides","apiKey","apiUrl","model","temperature","maxTokens","topP","topK","undefined","systemPrompt","retryAttempts","retryDelay","healthCheckInterval","retryJitter","process","env","ANTHROPIC_API_KEY","CLAUDE_API_URL","CLAUDE_MODEL","CLAUDE_TEMPERATURE","parseFloat","CLAUDE_MAX_TOKENS","parseInt","claudeConfig","get","Object","assign","validateConfiguration","updateConfig","updates","info","getConfig","sendMessage","messages","options","request","system","max_tokens","top_p","top_k","stream","debug","messageCount","length","streamRequest","sendRequest","lastError","attempt","controller","AbortController","setTimeout","abort","response","fetch","method","headers","body","JSON","stringify","signal","clearTimeout","ok","errorText","text","errorData","parse","message","createAPIError","status","data","json","inputTokens","usage","input_tokens","outputTokens","output_tokens","stopReason","stop_reason","emit","error","transformError","retryable","handleError","warn","statusCode","delay","calculateRetryDelay","reader","getReader","decoder","TextDecoder","buffer","done","value","read","decode","lines","split","pop","line","startsWith","slice","event","e","Error","name","complete","prompt","role","content","streamComplete","type","delta","getAvailableModels","getModelInfo","modelInfo","contextWindow","description","ms","Promise","resolve","performHealthCheck","setInterval","startTime","Date","now","latency","healthy","timestamp","getHealthStatus","retryAfter","retry_after","includes","String","baseDelay","maxDelay","Math","min","pow","jitter","random","floor","errorInfo","title","code","details","level","suggestions","userFriendly","destroy","clearInterval","removeAllListeners"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/api/claude-client.ts"],"sourcesContent":["/**\n * Claude API client for Claude-Flow\n * Provides direct integration with Claude's API including temperature and model selection\n */\n\nimport { EventEmitter } from 'events';\nimport { ILogger } from '../core/logger.js';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { \n ClaudeAPIError,\n ClaudeInternalServerError,\n ClaudeServiceUnavailableError,\n ClaudeRateLimitError,\n ClaudeTimeoutError,\n ClaudeNetworkError,\n ClaudeAuthenticationError,\n ClaudeValidationError,\n HealthCheckResult,\n getUserFriendlyError,\n} from './claude-api-errors.js';\nimport { circuitBreaker, CircuitBreaker } from '../utils/helpers.js';\n\nexport interface ClaudeAPIConfig {\n apiKey: string;\n apiUrl?: string;\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n topK?: number;\n systemPrompt?: string;\n timeout?: number;\n retryAttempts?: number;\n retryDelay?: number;\n // Enhanced error handling options\n enableHealthCheck?: boolean;\n healthCheckInterval?: number;\n circuitBreakerThreshold?: number;\n circuitBreakerTimeout?: number;\n circuitBreakerResetTimeout?: number;\n retryJitter?: boolean;\n}\n\nexport type ClaudeModel =\n | 'claude-3-opus-20240229'\n | 'claude-3-sonnet-20240229'\n | 'claude-3-haiku-20240307'\n | 'claude-2.1'\n | 'claude-2.0'\n | 'claude-instant-1.2';\n\nexport interface ClaudeMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface ClaudeRequest {\n model: ClaudeModel;\n messages: ClaudeMessage[];\n system?: string;\n max_tokens: number;\n temperature?: number;\n top_p?: number;\n top_k?: number;\n metadata?: {\n user_id?: string;\n };\n stop_sequences?: string[];\n stream?: boolean;\n}\n\nexport interface ClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: Array<{\n type: 'text';\n text: string;\n }>;\n model: ClaudeModel;\n stop_reason: 'end_turn' | 'max_tokens' | 'stop_sequence';\n stop_sequence?: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n };\n}\n\nexport interface ClaudeStreamEvent {\n type:\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping'\n | 'error';\n message?: Partial<ClaudeResponse>;\n index?: number;\n delta?: {\n type?: 'text_delta';\n text?: string;\n stop_reason?: string;\n stop_sequence?: string;\n };\n content_block?: {\n type: 'text';\n text: string;\n };\n usage?: {\n output_tokens: number;\n };\n error?: {\n type: string;\n message: string;\n };\n}\n\nexport class ClaudeAPIClient extends EventEmitter {\n private config: ClaudeAPIConfig;\n private logger: ILogger;\n private configManager: ConfigManager;\n private defaultModel: ClaudeModel = 'claude-3-sonnet-20240229';\n private defaultTemperature: number = 0.7;\n private defaultMaxTokens: number = 4096;\n private circuitBreaker: CircuitBreaker;\n private lastHealthCheck?: HealthCheckResult;\n private healthCheckTimer?: NodeJS.Timeout;\n\n constructor(logger: ILogger, configManager: ConfigManager, config?: Partial<ClaudeAPIConfig>) {\n super();\n this.logger = logger;\n this.configManager = configManager;\n\n // Load config from environment and merge with provided config\n this.config = this.loadConfiguration(config);\n \n // Initialize circuit breaker for API reliability\n this.circuitBreaker = circuitBreaker('claude-api', {\n threshold: this.config.circuitBreakerThreshold || 5,\n timeout: this.config.circuitBreakerTimeout || 60000,\n resetTimeout: this.config.circuitBreakerResetTimeout || 300000,\n });\n\n // Start health check if enabled\n if (this.config.enableHealthCheck) {\n this.startHealthCheck();\n }\n }\n\n /**\n * Load configuration from various sources\n */\n private loadConfiguration(overrides?: Partial<ClaudeAPIConfig>): ClaudeAPIConfig {\n // Start with defaults\n const config: ClaudeAPIConfig = {\n apiKey: '',\n apiUrl: 'https://api.anthropic.com/v1/messages',\n model: this.defaultModel,\n temperature: this.defaultTemperature,\n maxTokens: this.defaultMaxTokens,\n topP: 1,\n topK: undefined,\n systemPrompt: undefined,\n timeout: 60000, // 60 seconds\n retryAttempts: 3,\n retryDelay: 1000,\n // Enhanced error handling defaults\n enableHealthCheck: false,\n healthCheckInterval: 300000, // 5 minutes\n circuitBreakerThreshold: 5,\n circuitBreakerTimeout: 60000,\n circuitBreakerResetTimeout: 300000,\n retryJitter: true,\n };\n\n // Load from environment variables\n if (process.env.ANTHROPIC_API_KEY) {\n config.apiKey = process.env.ANTHROPIC_API_KEY;\n }\n if (process.env.CLAUDE_API_URL) {\n config.apiUrl = process.env.CLAUDE_API_URL;\n }\n if (process.env.CLAUDE_MODEL) {\n config.model = process.env.CLAUDE_MODEL as ClaudeModel;\n }\n if (process.env.CLAUDE_TEMPERATURE) {\n config.temperature = parseFloat(process.env.CLAUDE_TEMPERATURE);\n }\n if (process.env.CLAUDE_MAX_TOKENS) {\n config.maxTokens = parseInt(process.env.CLAUDE_MAX_TOKENS, 10);\n }\n\n // Load from config manager if available\n const claudeConfig = this.configManager.get('claude');\n if (claudeConfig) {\n Object.assign(config, claudeConfig);\n }\n\n // Apply overrides\n if (overrides) {\n Object.assign(config, overrides);\n }\n\n // Validate configuration\n this.validateConfiguration(config);\n\n return config;\n }\n\n /**\n * Validate configuration settings\n */\n private validateConfiguration(config: ClaudeAPIConfig): void {\n if (!config.apiKey) {\n throw new ClaudeAuthenticationError('Claude API key is required. Set ANTHROPIC_API_KEY environment variable.');\n }\n\n if (config.temperature !== undefined) {\n if (config.temperature < 0 || config.temperature > 1) {\n throw new ClaudeValidationError('Temperature must be between 0 and 1');\n }\n }\n\n if (config.topP !== undefined) {\n if (config.topP < 0 || config.topP > 1) {\n throw new ClaudeValidationError('Top-p must be between 0 and 1');\n }\n }\n\n if (config.maxTokens !== undefined && (config.maxTokens < 1 || config.maxTokens > 100000)) {\n throw new ClaudeValidationError('Max tokens must be between 1 and 100000');\n }\n }\n\n /**\n * Update configuration dynamically\n */\n updateConfig(updates: Partial<ClaudeAPIConfig>): void {\n this.config = { ...this.config, ...updates };\n this.validateConfiguration(this.config);\n this.logger.info('Claude API configuration updated', {\n model: this.config.model,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n });\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ClaudeAPIConfig {\n return { ...this.config };\n }\n\n /**\n * Send a message to Claude API\n */\n async sendMessage(\n messages: ClaudeMessage[],\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n stream?: boolean;\n },\n ): Promise<ClaudeResponse | AsyncIterable<ClaudeStreamEvent>> {\n const request: ClaudeRequest = {\n model: options?.model || this.config.model || 'claude-3-opus-20240229',\n messages,\n system: options?.systemPrompt || this.config.systemPrompt,\n max_tokens: options?.maxTokens || this.config.maxTokens || 4096,\n temperature: options?.temperature ?? this.config.temperature,\n top_p: this.config.topP,\n top_k: this.config.topK,\n stream: options?.stream || false,\n };\n\n this.logger.debug('Sending Claude API request', {\n model: request.model,\n temperature: request.temperature,\n maxTokens: request.max_tokens,\n messageCount: messages.length,\n stream: request.stream,\n });\n\n if (request.stream) {\n return this.streamRequest(request);\n } else {\n return this.sendRequest(request);\n }\n }\n\n /**\n * Send a non-streaming request\n */\n private async sendRequest(request: ClaudeRequest): Promise<ClaudeResponse> {\n let lastError: ClaudeAPIError | undefined;\n\n for (let attempt = 0; attempt < (this.config.retryAttempts || 3); attempt++) {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeout || 30000);\n\n const response = await fetch(this.config.apiUrl || 'https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n const data = (await response.json()) as ClaudeResponse;\n\n this.logger.info('Claude API response received', {\n model: data.model,\n inputTokens: data.usage.input_tokens,\n outputTokens: data.usage.output_tokens,\n stopReason: data.stop_reason,\n });\n\n this.emit('response', data);\n return data;\n } catch (error) {\n lastError = this.transformError(error);\n \n // Don't retry non-retryable errors\n if (!lastError.retryable) {\n this.handleError(lastError);\n throw lastError;\n }\n\n this.logger.warn(\n `Claude API request failed (attempt ${attempt + 1}/${this.config.retryAttempts})`,\n {\n error: lastError.message,\n statusCode: lastError.statusCode,\n retryable: lastError.retryable,\n },\n );\n\n if (attempt < (this.config.retryAttempts || 3) - 1) {\n const delay = this.calculateRetryDelay(attempt, lastError);\n await this.delay(delay);\n }\n }\n }\n\n this.handleError(lastError!);\n throw lastError;\n }\n\n /**\n * Send a streaming request\n */\n private async *streamRequest(request: ClaudeRequest): AsyncIterable<ClaudeStreamEvent> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), (this.config.timeout || 30000) * 2); // Double timeout for streaming\n\n try {\n const response = await fetch(this.config.apiUrl || 'https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData: any;\n \n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n\n throw this.createAPIError(response.status, errorData);\n }\n\n if (!response.body) {\n throw new ClaudeAPIError('Response body is null');\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') continue;\n\n try {\n const event = JSON.parse(data) as ClaudeStreamEvent;\n this.emit('stream_event', event);\n yield event;\n } catch (e) {\n this.logger.warn('Failed to parse stream event', { data, error: e });\n }\n }\n }\n }\n } catch (error) {\n clearTimeout(timeout);\n \n // Handle abort/timeout\n if (error instanceof Error && error.name === 'AbortError') {\n throw new ClaudeTimeoutError(\n 'Request timed out',\n this.config.timeout || 60000,\n );\n }\n \n throw error;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /**\n * Helper method for simple completions\n */\n async complete(\n prompt: string,\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n },\n ): Promise<string> {\n const messages: ClaudeMessage[] = [{ role: 'user', content: prompt }];\n const response = (await this.sendMessage(messages, options)) as ClaudeResponse;\n return response.content[0].text;\n }\n\n /**\n * Helper method for streaming completions\n */\n async *streamComplete(\n prompt: string,\n options?: {\n model?: ClaudeModel;\n temperature?: number;\n maxTokens?: number;\n systemPrompt?: string;\n },\n ): AsyncIterable<string> {\n const messages: ClaudeMessage[] = [{ role: 'user', content: prompt }];\n const stream = (await this.sendMessage(messages, {\n ...options,\n stream: true,\n })) as AsyncIterable<ClaudeStreamEvent>;\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta' && event.delta?.text) {\n yield event.delta.text;\n }\n }\n }\n\n /**\n * Get available models\n */\n getAvailableModels(): ClaudeModel[] {\n return [\n 'claude-3-opus-20240229',\n 'claude-3-sonnet-20240229',\n 'claude-3-haiku-20240307',\n 'claude-2.1',\n 'claude-2.0',\n 'claude-instant-1.2',\n ];\n }\n\n /**\n * Get model information\n */\n getModelInfo(model: ClaudeModel): {\n name: string;\n contextWindow: number;\n description: string;\n } {\n const modelInfo: Record<\n ClaudeModel,\n { name: string; contextWindow: number; description: string }\n > = {\n 'claude-3-opus-20240229': {\n name: 'Claude 3 Opus',\n contextWindow: 200000,\n description: 'Most capable model, best for complex tasks',\n },\n 'claude-3-sonnet-20240229': {\n name: 'Claude 3 Sonnet',\n contextWindow: 200000,\n description: 'Balanced performance and speed',\n },\n 'claude-3-haiku-20240307': {\n name: 'Claude 3 Haiku',\n contextWindow: 200000,\n description: 'Fastest model, best for simple tasks',\n },\n 'claude-2.1': {\n name: 'Claude 2.1',\n contextWindow: 200000,\n description: 'Previous generation, enhanced capabilities',\n },\n 'claude-2.0': {\n name: 'Claude 2.0',\n contextWindow: 100000,\n description: 'Previous generation model',\n },\n 'claude-instant-1.2': {\n name: 'Claude Instant 1.2',\n contextWindow: 100000,\n description: 'Fast, cost-effective model',\n },\n };\n\n return (\n modelInfo[model] || {\n name: model,\n contextWindow: 100000,\n description: 'Unknown model',\n }\n );\n }\n\n /**\n * Delay helper for retries\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Start periodic health checks\n */\n private startHealthCheck(): void {\n this.performHealthCheck(); // Initial check\n \n this.healthCheckTimer = setInterval(\n () => this.performHealthCheck(),\n this.config.healthCheckInterval || 300000,\n );\n }\n\n /**\n * Perform a health check on the API\n */\n async performHealthCheck(): Promise<HealthCheckResult> {\n const startTime = Date.now();\n \n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10000); // 10 second timeout\n\n const response = await fetch(this.config.apiUrl || '', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'x-api-key': this.config.apiKey,\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: [{ role: 'user', content: 'Hi' }],\n max_tokens: 1,\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n \n const latency = Date.now() - startTime;\n const healthy = response.ok || response.status === 429; // Rate limit is still \"healthy\"\n \n this.lastHealthCheck = {\n healthy,\n latency,\n error: healthy ? undefined : `Status: ${response.status}`,\n timestamp: new Date(),\n };\n\n this.logger.debug('Claude API health check completed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n } catch (error) {\n const latency = Date.now() - startTime;\n \n this.lastHealthCheck = {\n healthy: false,\n latency,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date(),\n };\n\n this.logger.warn('Claude API health check failed', this.lastHealthCheck);\n this.emit('health_check', this.lastHealthCheck);\n \n return this.lastHealthCheck;\n }\n }\n\n /**\n * Get last health check result\n */\n getHealthStatus(): HealthCheckResult | undefined {\n return this.lastHealthCheck;\n }\n\n /**\n * Create appropriate error based on status code\n */\n private createAPIError(statusCode: number, errorData: any): ClaudeAPIError {\n const message = errorData.error?.message || errorData.message || 'Unknown error';\n\n switch (statusCode) {\n case 400:\n return new ClaudeValidationError(message, errorData);\n case 401:\n case 403:\n return new ClaudeAuthenticationError(message, errorData);\n case 429: {\n const retryAfter = errorData.error?.retry_after;\n return new ClaudeRateLimitError(message, retryAfter, errorData);\n }\n case 500:\n return new ClaudeInternalServerError(message, errorData);\n case 503:\n return new ClaudeServiceUnavailableError(message, errorData);\n default:\n return new ClaudeAPIError(message, statusCode, statusCode >= 500, errorData);\n }\n }\n\n /**\n * Transform generic errors to Claude API errors\n */\n private transformError(error: unknown): ClaudeAPIError {\n if (error instanceof ClaudeAPIError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Network errors\n if (error.message.includes('fetch failed') || error.message.includes('ECONNREFUSED')) {\n return new ClaudeNetworkError(error.message);\n }\n \n // Timeout errors\n if (error.name === 'AbortError' || error.message.includes('timeout')) {\n return new ClaudeTimeoutError(error.message, this.config.timeout || 60000);\n }\n }\n\n return new ClaudeAPIError(\n error instanceof Error ? error.message : String(error),\n undefined,\n true, // Assume unknown errors are retryable\n );\n }\n\n /**\n * Calculate retry delay with exponential backoff and jitter\n */\n private calculateRetryDelay(attempt: number, error: ClaudeAPIError): number {\n // If rate limit error with retry-after header, use that\n if (error instanceof ClaudeRateLimitError && error.retryAfter) {\n return error.retryAfter * 1000; // Convert to milliseconds\n }\n\n const baseDelay = this.config.retryDelay || 1000;\n const maxDelay = 30000; // 30 seconds max\n \n // Exponential backoff: delay = baseDelay * (2 ^ attempt)\n let delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);\n \n // Add jitter to prevent thundering herd\n if (this.config.retryJitter) {\n const jitter = Math.random() * 0.3 * delay; // Up to 30% jitter\n delay = delay + jitter;\n }\n\n return Math.floor(delay);\n }\n\n /**\n * Handle errors with user-friendly messages and logging\n */\n private handleError(error: ClaudeAPIError): void {\n const errorInfo = getUserFriendlyError(error);\n \n this.logger.error(`${errorInfo.title}: ${errorInfo.message}`, {\n error: error.message,\n code: error.code,\n statusCode: error.statusCode,\n retryable: error.retryable,\n details: error.details,\n });\n\n // Log suggestions in debug mode\n if (this.logger.level === 'debug' && errorInfo.suggestions.length > 0) {\n this.logger.debug('Suggestions to resolve the issue:', errorInfo.suggestions);\n }\n\n this.emit('error', {\n error,\n userFriendly: errorInfo,\n });\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = undefined;\n }\n this.removeAllListeners();\n }\n}\n"],"names":["EventEmitter","ClaudeAPIError","ClaudeInternalServerError","ClaudeServiceUnavailableError","ClaudeRateLimitError","ClaudeTimeoutError","ClaudeNetworkError","ClaudeAuthenticationError","ClaudeValidationError","getUserFriendlyError","circuitBreaker","ClaudeAPIClient","config","logger","configManager","defaultModel","defaultTemperature","defaultMaxTokens","lastHealthCheck","healthCheckTimer","loadConfiguration","threshold","circuitBreakerThreshold","timeout","circuitBreakerTimeout","resetTimeout","circuitBreakerResetTimeout","enableHealthCheck","startHealthCheck","overrides","apiKey","apiUrl","model","temperature","maxTokens","topP","topK","undefined","systemPrompt","retryAttempts","retryDelay","healthCheckInterval","retryJitter","process","env","ANTHROPIC_API_KEY","CLAUDE_API_URL","CLAUDE_MODEL","CLAUDE_TEMPERATURE","parseFloat","CLAUDE_MAX_TOKENS","parseInt","claudeConfig","get","Object","assign","validateConfiguration","updateConfig","updates","info","getConfig","sendMessage","messages","options","request","system","max_tokens","top_p","top_k","stream","debug","messageCount","length","streamRequest","sendRequest","lastError","attempt","controller","AbortController","setTimeout","abort","response","fetch","method","headers","body","JSON","stringify","signal","clearTimeout","ok","errorText","text","errorData","parse","message","createAPIError","status","data","json","inputTokens","usage","input_tokens","outputTokens","output_tokens","stopReason","stop_reason","emit","error","transformError","retryable","handleError","warn","statusCode","delay","calculateRetryDelay","reader","getReader","decoder","TextDecoder","buffer","done","value","read","decode","lines","split","pop","line","startsWith","slice","event","e","Error","name","complete","prompt","role","content","streamComplete","type","delta","getAvailableModels","getModelInfo","modelInfo","contextWindow","description","ms","Promise","resolve","performHealthCheck","setInterval","startTime","Date","now","latency","healthy","timestamp","getHealthStatus","retryAfter","retry_after","includes","String","baseDelay","maxDelay","Math","min","pow","jitter","random","floor","errorInfo","title","code","details","level","suggestions","userFriendly","destroy","clearInterval","removeAllListeners"],"mappings":"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"}