agentic-flow 3.0.0 → 3.2.0

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 (115) hide show
  1. package/.agents/skills/agentic-flow-ecosystem/SKILL.md +50 -0
  2. package/.claude/skills/agentic-flow-ecosystem/skill.md +58 -0
  3. package/.claude/skills/agentic-flow-quickstart/skill.md +6 -6
  4. package/.claude/skills/hooks-automation/skill.md +11 -11
  5. package/.claude/skills/memory-patterns/skill.md +7 -7
  6. package/.claude/skills/sparc-methodology/skill.md +13 -13
  7. package/.claude/skills/swarm-coordination/skill.md +5 -5
  8. package/.claude/skills/worker-benchmarks/skill.md +5 -5
  9. package/.claude/skills/worker-integration/skill.md +5 -5
  10. package/.claude/statusline.mjs +22 -5
  11. package/CHANGELOG.md +48 -0
  12. package/README.md +83 -71
  13. package/dist/.tsbuildinfo +1 -1
  14. package/dist/cli/commands/hooks.d.ts.map +1 -1
  15. package/dist/cli/commands/hooks.js +17 -17
  16. package/dist/cli/commands/hooks.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts +2 -5
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +11 -15
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/swarm.d.ts.map +1 -1
  22. package/dist/cli/commands/swarm.js +3 -2
  23. package/dist/cli/commands/swarm.js.map +1 -1
  24. package/dist/core/agentdb-fast.d.ts +21 -11
  25. package/dist/core/agentdb-fast.d.ts.map +1 -1
  26. package/dist/core/agentdb-fast.js +39 -14
  27. package/dist/core/agentdb-fast.js.map +1 -1
  28. package/dist/integrations/agent-booster.d.ts +35 -0
  29. package/dist/integrations/agent-booster.d.ts.map +1 -0
  30. package/dist/integrations/agent-booster.js +45 -0
  31. package/dist/integrations/agent-booster.js.map +1 -0
  32. package/dist/integrations/index.d.ts +15 -0
  33. package/dist/integrations/index.d.ts.map +1 -0
  34. package/dist/integrations/index.js +11 -0
  35. package/dist/integrations/index.js.map +1 -0
  36. package/dist/integrations/onnx-wasm-embedder.d.ts +59 -0
  37. package/dist/integrations/onnx-wasm-embedder.d.ts.map +1 -0
  38. package/dist/integrations/onnx-wasm-embedder.js +145 -0
  39. package/dist/integrations/onnx-wasm-embedder.js.map +1 -0
  40. package/dist/integrations/optional.d.ts +44 -0
  41. package/dist/integrations/optional.d.ts.map +1 -0
  42. package/dist/integrations/optional.js +107 -0
  43. package/dist/integrations/optional.js.map +1 -0
  44. package/dist/integrations/prompt-injection.d.ts +52 -0
  45. package/dist/integrations/prompt-injection.d.ts.map +1 -0
  46. package/dist/integrations/prompt-injection.js +126 -0
  47. package/dist/integrations/prompt-injection.js.map +1 -0
  48. package/dist/integrations/sublinear.d.ts +71 -0
  49. package/dist/integrations/sublinear.d.ts.map +1 -0
  50. package/dist/integrations/sublinear.js +227 -0
  51. package/dist/integrations/sublinear.js.map +1 -0
  52. package/dist/integrations/task-partition.d.ts +40 -0
  53. package/dist/integrations/task-partition.d.ts.map +1 -0
  54. package/dist/integrations/task-partition.js +173 -0
  55. package/dist/integrations/task-partition.js.map +1 -0
  56. package/dist/mcp/mcp-policy.d.ts.map +1 -1
  57. package/dist/mcp/mcp-policy.js +2 -0
  58. package/dist/mcp/mcp-policy.js.map +1 -1
  59. package/dist/mcp/standalone-stdio.js +12 -26
  60. package/dist/mcp/standalone-stdio.js.map +1 -1
  61. package/dist/mcp/tools/ecosystem-tools.d.ts +49 -0
  62. package/dist/mcp/tools/ecosystem-tools.d.ts.map +1 -0
  63. package/dist/mcp/tools/ecosystem-tools.js +126 -0
  64. package/dist/mcp/tools/ecosystem-tools.js.map +1 -0
  65. package/dist/proxy/anthropic-to-gemini.d.ts.map +1 -1
  66. package/dist/proxy/anthropic-to-gemini.js +10 -14
  67. package/dist/proxy/anthropic-to-gemini.js.map +1 -1
  68. package/dist/proxy/anthropic-to-openrouter.d.ts.map +1 -1
  69. package/dist/proxy/anthropic-to-openrouter.js +6 -25
  70. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  71. package/dist/proxy/anthropic-to-requesty.d.ts.map +1 -1
  72. package/dist/proxy/anthropic-to-requesty.js +8 -10
  73. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  74. package/dist/proxy/sse-lines.d.ts +9 -0
  75. package/dist/proxy/sse-lines.d.ts.map +1 -0
  76. package/dist/proxy/sse-lines.js +37 -0
  77. package/dist/proxy/sse-lines.js.map +1 -0
  78. package/dist/reasoningbank/index.d.ts +2 -1
  79. package/dist/reasoningbank/index.d.ts.map +1 -1
  80. package/dist/reasoningbank/index.js +1 -1
  81. package/dist/reasoningbank/index.js.map +1 -1
  82. package/dist/reasoningbank/utils/embeddings.d.ts +17 -0
  83. package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
  84. package/dist/reasoningbank/utils/embeddings.js +48 -17
  85. package/dist/reasoningbank/utils/embeddings.js.map +1 -1
  86. package/dist/routing/SemanticRouter.d.ts +25 -9
  87. package/dist/routing/SemanticRouter.d.ts.map +1 -1
  88. package/dist/routing/SemanticRouter.js +63 -12
  89. package/dist/routing/SemanticRouter.js.map +1 -1
  90. package/dist/utils/input-validator.d.ts +10 -2
  91. package/dist/utils/input-validator.d.ts.map +1 -1
  92. package/dist/utils/input-validator.js +30 -2
  93. package/dist/utils/input-validator.js.map +1 -1
  94. package/dist/utils/model-cache.d.ts.map +1 -1
  95. package/dist/utils/model-cache.js +6 -25
  96. package/dist/utils/model-cache.js.map +1 -1
  97. package/dist/utils/package-version.d.ts +9 -0
  98. package/dist/utils/package-version.d.ts.map +1 -0
  99. package/dist/utils/package-version.js +39 -0
  100. package/dist/utils/package-version.js.map +1 -0
  101. package/dist/wasm/onnx-embeddings-wasm.d.ts.map +1 -1
  102. package/dist/wasm/onnx-embeddings-wasm.js +21 -10
  103. package/dist/wasm/onnx-embeddings-wasm.js.map +1 -1
  104. package/docs/docker-tests/TEST-V1.7.8.Dockerfile +2 -2
  105. package/docs/docker-tests/TEST-V1.7.9-NODE20.Dockerfile +2 -2
  106. package/docs/docker-tests/TEST-V1.7.9.Dockerfile +2 -2
  107. package/docs/guides/CLAUDE-CODE-INTEGRATION.md +25 -8
  108. package/docs/guides/PROXY-ARCHITECTURE-AND-EXTENSION.md +22 -9
  109. package/docs/guides/STANDALONE_PROXY_GUIDE.md +16 -6
  110. package/docs/integrations/FASTMCP_CLI_INTEGRATION.md +1 -1
  111. package/docs/plans/requesty/02-architecture.md +5 -6
  112. package/docs/plans/requesty/03-implementation-phases.md +3 -4
  113. package/docs/plans/requesty/05-migration-guide.md +2 -2
  114. package/package.json +12 -7
  115. package/scripts/validate-providers.sh +7 -4
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-to-requesty.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"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","sourcesContent":["// Anthropic to Requesty Proxy Server\n// Converts Anthropic API format to Requesty format\nimport express, { Request, Response, NextFunction } from 'express';\nimport type { Server } from 'http';\nimport { createProxyMiddleware, Options } from 'http-proxy-middleware';\nimport { logger } from '../utils/logger.js';\nimport { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';\nimport { getInstructionsForModel, formatInstructions, taskRequiresFileOps, getMaxTokensForModel } from './provider-instructions.js';\nimport { ModelCapabilities, detectModelCapabilities } from '../utils/modelCapabilities.js';\nimport { ToolEmulator, executeEmulation, ToolCall } from './tool-emulation.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string | Array<{ type: string; text?: string; [key: string]: any }>; // Can be string OR array of blocks\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\ninterface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: any;\n };\n}\n\ninterface OpenAIRequest {\n model: string;\n messages: OpenAIMessage[];\n max_tokens?: number;\n temperature?: number;\n stream?: boolean;\n tools?: OpenAITool[];\n [key: string]: any;\n}\n\nexport class AnthropicToRequestyProxy {\n private app: express.Application;\n private requestyApiKey: string;\n private requestyBaseUrl: string;\n private defaultModel: string;\n private authToken: string;\n private server?: Server;\n private capabilities?: ModelCapabilities;\n\n constructor(config: {\n requestyApiKey: string;\n requestyBaseUrl?: string;\n defaultModel?: string;\n capabilities?: ModelCapabilities;\n /** Token clients must send; defaults to AGENTIC_FLOW_PROXY_TOKEN or a random one. */\n authToken?: string;\n }) {\n this.app = express();\n this.authToken = config.authToken || resolveProxyToken();\n this.requestyApiKey = config.requestyApiKey;\n this.requestyBaseUrl = config.requestyBaseUrl || 'https://router.requesty.ai/v1';\n this.defaultModel = config.defaultModel || 'deepseek/deepseek-chat';\n this.capabilities = config.capabilities;\n\n // Debug logging\n if (this.capabilities) {\n logger.info('Proxy initialized with capabilities', {\n model: this.defaultModel,\n requiresEmulation: this.capabilities.requiresEmulation,\n strategy: this.capabilities.emulationStrategy\n });\n }\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n /** The token clients must present as x-api-key or Authorization: Bearer. */\n public getAuthToken(): string {\n return this.authToken;\n }\n\n private setupMiddleware(): void {\n // Reject unauthenticated callers before parsing their (up to 50mb) body\n this.app.use(createProxyAuthMiddleware(this.authToken));\n\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-requesty-proxy' });\n });\n\n // Anthropic Messages API → Requesty Chat Completions\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n console.log('🔵 REQUEST RECEIVED AT PROXY - /v1/messages');\n logger.info('🔵 REQUEST RECEIVED AT PROXY - /v1/messages');\n try {\n const anthropicReq: AnthropicRequest = req.body;\n console.log('🔵 Request body parsed successfully');\n\n // VERBOSE LOGGING: Log incoming Anthropic request\n // Handle system prompt which can be string OR array of content blocks\n const systemPreview = typeof anthropicReq.system === 'string'\n ? anthropicReq.system.substring(0, 200)\n : Array.isArray(anthropicReq.system)\n ? JSON.stringify(anthropicReq.system).substring(0, 200)\n : undefined;\n\n logger.debug('=== INCOMING ANTHROPIC REQUEST ===', {\n model: anthropicReq.model,\n systemPrompt: systemPreview,\n systemType: typeof anthropicReq.system,\n messageCount: anthropicReq.messages?.length,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || [],\n maxTokens: anthropicReq.max_tokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n });\n\n // Log first user message for debugging\n if (anthropicReq.messages && anthropicReq.messages.length > 0) {\n const firstMsg = anthropicReq.messages[0];\n logger.debug('First user message:', {\n role: firstMsg.role,\n contentPreview: typeof firstMsg.content === 'string'\n ? firstMsg.content.substring(0, 200)\n : JSON.stringify(firstMsg.content).substring(0, 200)\n });\n }\n\n // Route to appropriate handler based on capabilities\n const result = await this.handleRequest(anthropicReq, res);\n if (result) {\n res.json(result);\n }\n } catch (error: any) {\n logger.error('Proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by proxy`\n }\n });\n });\n }\n\n private async handleRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n let model = anthropicReq.model || this.defaultModel;\n\n // If SDK is requesting a Claude model but we're using Requesty with a different default,\n // override to use the CLI-specified model\n if (model.startsWith('claude-') && this.defaultModel && !this.defaultModel.startsWith('claude-')) {\n logger.info(`Overriding SDK Claude model ${model} with CLI-specified ${this.defaultModel}`);\n model = this.defaultModel;\n anthropicReq.model = model;\n }\n\n const capabilities = this.capabilities || detectModelCapabilities(model);\n\n // Check if emulation is required\n if (capabilities.requiresEmulation && anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info(`Using tool emulation for model: ${model}`);\n return this.handleEmulatedRequest(anthropicReq, capabilities);\n }\n\n return this.handleNativeRequest(anthropicReq, res);\n }\n\n private async handleNativeRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n // Convert Anthropic format to OpenAI format\n const openaiReq = this.convertAnthropicToOpenAI(anthropicReq);\n\n // VERBOSE LOGGING: Log converted OpenAI request\n logger.debug('=== CONVERTED OPENAI REQUEST ===', {\n anthropicModel: anthropicReq.model,\n openaiModel: openaiReq.model,\n messageCount: openaiReq.messages.length,\n systemPrompt: openaiReq.messages[0]?.content?.substring(0, 300),\n toolCount: openaiReq.tools?.length || 0,\n toolNames: openaiReq.tools?.map(t => t.function.name) || [],\n maxTokens: openaiReq.max_tokens,\n apiKeyPresent: !!this.requestyApiKey\n });\n\n // Forward to Requesty\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('Requesty API error', { status: response.status, error });\n res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n return null;\n }\n\n // VERBOSE LOGGING: Log Requesty response status\n logger.info('=== REQUESTY RESPONSE RECEIVED ===', {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries((response.headers as any).entries())\n });\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n logger.info('Handling streaming response...');\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const chunk = decoder.decode(value);\n const anthropicChunk = this.convertOpenAIStreamToAnthropic(chunk);\n res.write(anthropicChunk);\n }\n\n res.end();\n return null; // Already sent response\n } else {\n logger.info('Handling non-streaming response...');\n // Non-streaming response\n const openaiRes = await response.json();\n\n // VERBOSE LOGGING: Log raw OpenAI response\n logger.debug('=== RAW OPENAI RESPONSE ===', {\n id: openaiRes.id,\n model: openaiRes.model,\n choices: openaiRes.choices?.length,\n finishReason: openaiRes.choices?.[0]?.finish_reason,\n hasToolCalls: !!(openaiRes.choices?.[0]?.message?.tool_calls),\n toolCallCount: openaiRes.choices?.[0]?.message?.tool_calls?.length || 0,\n toolCallNames: openaiRes.choices?.[0]?.message?.tool_calls?.map((tc: any) => tc.function.name) || [],\n contentPreview: openaiRes.choices?.[0]?.message?.content?.substring(0, 300),\n usage: openaiRes.usage\n });\n\n const anthropicRes = this.convertOpenAIToAnthropic(openaiRes);\n\n // VERBOSE LOGGING: Log converted Anthropic response\n logger.info('=== CONVERTED ANTHROPIC RESPONSE ===', {\n id: anthropicRes.id,\n model: anthropicRes.model,\n role: anthropicRes.role,\n stopReason: anthropicRes.stop_reason,\n contentBlocks: anthropicRes.content?.length,\n contentTypes: anthropicRes.content?.map((c: any) => c.type),\n toolUseCount: anthropicRes.content?.filter((c: any) => c.type === 'tool_use').length,\n textPreview: anthropicRes.content?.find((c: any) => c.type === 'text')?.text?.substring(0, 200),\n usage: anthropicRes.usage\n });\n\n return anthropicRes;\n }\n }\n\n private async handleEmulatedRequest(\n anthropicReq: AnthropicRequest,\n capabilities: ModelCapabilities\n ): Promise<any> {\n const emulator = new ToolEmulator(\n anthropicReq.tools || [],\n capabilities.emulationStrategy as 'react' | 'prompt'\n );\n\n const lastMessage = anthropicReq.messages[anthropicReq.messages.length - 1];\n const userMessage = typeof lastMessage.content === 'string'\n ? lastMessage.content\n : (lastMessage.content.find(c => c.type === 'text')?.text || '');\n\n const result = await executeEmulation(\n emulator,\n userMessage,\n async (prompt) => {\n // Call model with emulation prompt\n // Cap max_tokens at 8192 for OpenAI models via Requesty\n let maxTokens = anthropicReq.max_tokens;\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: maxTokens\n };\n const response = await this.callRequesty(openaiReq);\n return response.choices[0].message.content;\n },\n async (toolCall: ToolCall) => {\n logger.warn(`Tool execution not yet implemented: ${toolCall.name}`);\n return { error: 'Tool execution not implemented in Phase 2' };\n },\n { maxIterations: 5, verbose: process.env.VERBOSE === 'true' }\n );\n\n return {\n id: `emulated_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: result.finalAnswer || 'No response' }],\n model: anthropicReq.model || this.defaultModel,\n stop_reason: 'end_turn',\n usage: { input_tokens: 0, output_tokens: 0 }\n };\n }\n\n private async callRequesty(openaiReq: any): Promise<any> {\n // Add timeout for Requesty API calls (60 seconds)\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000);\n\n try {\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Requesty API error: ${error}`);\n }\n\n return response.json();\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === 'AbortError') {\n throw new Error('Requesty API request timed out after 60 seconds');\n }\n throw error;\n }\n }\n\n\n /**\n * Sanitize JSON Schema to be OpenAI-compatible\n * Fixes array properties without items, removes unsupported keywords\n */\n private sanitizeJsonSchema(schema: any, path: string = 'root'): any {\n if (!schema || typeof schema !== 'object') {\n return schema;\n }\n\n // Create a shallow copy to avoid mutations\n const sanitized = { ...schema };\n\n // Fix array types without items\n if (sanitized.type === 'array' && !sanitized.items) {\n logger.warn(`Schema sanitization: Adding missing 'items' for array at ${path}`);\n sanitized.items = { type: 'string' };\n }\n\n // Remove JSON Schema 2020-12 keywords not supported by OpenAI\n const unsupportedKeywords = [\n '$schema', '$id', '$ref', '$defs', 'definitions',\n 'if', 'then', 'else', 'dependentSchemas', 'dependentRequired',\n 'prefixItems', 'unevaluatedItems', 'unevaluatedProperties',\n 'minContains', 'maxContains', 'patternProperties',\n 'additionalItems', 'contains'\n ];\n\n for (const keyword of unsupportedKeywords) {\n if (keyword in sanitized) {\n logger.warn(`Schema sanitization: Removing unsupported keyword '${keyword}' at ${path}`);\n delete sanitized[keyword];\n }\n }\n\n // Recursively sanitize nested properties\n if (sanitized.properties && typeof sanitized.properties === 'object') {\n sanitized.properties = {};\n for (const [key, value] of Object.entries(schema.properties)) {\n sanitized.properties[key] = this.sanitizeJsonSchema(value, `${path}.properties.${key}`);\n }\n }\n\n // Recursively sanitize array items\n if (sanitized.items && typeof sanitized.items === 'object') {\n sanitized.items = this.sanitizeJsonSchema(sanitized.items, `${path}.items`);\n }\n\n // Recursively sanitize allOf, anyOf, oneOf\n for (const combinator of ['allOf', 'anyOf', 'oneOf']) {\n if (Array.isArray(sanitized[combinator])) {\n sanitized[combinator] = sanitized[combinator].map((subschema: any, index: number) =>\n this.sanitizeJsonSchema(subschema, `${path}.${combinator}[${index}]`)\n );\n }\n }\n\n return sanitized;\n }\n\n private convertAnthropicToOpenAI(anthropicReq: AnthropicRequest): OpenAIRequest {\n logger.info('=== STARTING ANTHROPIC TO OPENAI CONVERSION ===');\n const messages: OpenAIMessage[] = [];\n\n // Get model-specific tool instructions\n const modelId = anthropicReq.model || this.defaultModel;\n const provider = this.extractProvider(modelId);\n\n logger.info('Model detection:', {\n requestedModel: anthropicReq.model,\n defaultModel: this.defaultModel,\n finalModelId: modelId,\n extractedProvider: provider\n });\n\n // CRITICAL: Requesty models use native OpenAI tool calling\n // - If MCP tools are provided, Requesty handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let Requesty models use tools via OpenAI's tool_calls format\n\n let systemContent = '';\n\n // Check if we have MCP tools (function calling)\n const hasMcpTools = anthropicReq.tools && anthropicReq.tools.length > 0;\n\n logger.info('Tool detection:', {\n hasMcpTools,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || []\n });\n\n if (hasMcpTools) {\n // MCP tools present - Requesty will handle via function calling\n systemContent = 'You are a helpful AI assistant. When you need to perform actions, use the available tools by calling functions. Always explain what you\\'re doing.';\n logger.info('Using MCP tools system prompt (with function calling support)');\n } else {\n // No tools - simple response mode\n systemContent = 'You are a helpful AI assistant. Provide clear, well-formatted code and explanations.';\n logger.info('Using simple system prompt (no tools)');\n }\n\n if (anthropicReq.system) {\n // System can be string OR array of content blocks\n let originalSystem: string;\n if (typeof anthropicReq.system === 'string') {\n originalSystem = anthropicReq.system;\n } else if (Array.isArray(anthropicReq.system)) {\n // Extract text from content blocks\n originalSystem = anthropicReq.system\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text)\n .join('\\n');\n } else {\n originalSystem = '';\n }\n\n logger.debug('Appending original system prompt:', {\n systemType: typeof anthropicReq.system,\n isArray: Array.isArray(anthropicReq.system),\n originalSystemLength: originalSystem.length,\n originalSystemPreview: originalSystem.substring(0, 200)\n });\n\n if (originalSystem) {\n systemContent += '\\n\\n' + originalSystem;\n }\n }\n\n messages.push({\n role: 'system',\n content: systemContent\n });\n\n logger.info('System message created:', {\n systemContentLength: systemContent.length,\n systemContentPreview: systemContent.substring(0, 300)\n });\n\n // Override model - if request has a Claude model, use defaultModel instead\n const requestedModel = anthropicReq.model || '';\n const shouldOverrideModel = requestedModel.startsWith('claude-') || !requestedModel;\n const finalModel = shouldOverrideModel ? this.defaultModel : requestedModel;\n\n // Convert Anthropic messages to OpenAI format\n for (const msg of anthropicReq.messages) {\n let content: string;\n\n if (typeof msg.content === 'string') {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n content = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n content = '';\n }\n\n messages.push({\n role: msg.role as 'user' | 'assistant',\n content\n });\n }\n\n // Get appropriate max_tokens for this model\n let maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n // Cap at 8192 for OpenAI models via Requesty\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\n\n const openaiReq: OpenAIRequest = {\n model: finalModel,\n messages,\n max_tokens: maxTokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n };\n\n // Convert MCP/Anthropic tools to OpenAI tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info('Converting MCP tools to OpenAI format...', {\n totalTools: anthropicReq.tools.length\n });\n\n // Requesty has strict limits - only send a subset of tools to avoid timeouts\n // Requesty also rejects empty tools arrays, so we either send tools or omit the parameter\n const MAX_TOOLS_FOR_REQUESTY = 10; // Very conservative limit - Requesty timeouts with more\n const toolsToConvert = anthropicReq.tools.slice(0, MAX_TOOLS_FOR_REQUESTY);\n\n if (anthropicReq.tools.length > MAX_TOOLS_FOR_REQUESTY) {\n logger.warn(`Limiting tools to ${MAX_TOOLS_FOR_REQUESTY} for Requesty (${anthropicReq.tools.length} available)`);\n }\n\n // Only set tools if we have at least one (Requesty rejects empty arrays)\n if (toolsToConvert.length > 0) {\n openaiReq.tools = toolsToConvert.map(tool => {\n // Sanitize the input schema to fix array properties without items\n const rawSchema = tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n };\n const sanitizedSchema = this.sanitizeJsonSchema(rawSchema, `tool.${tool.name}`);\n\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: sanitizedSchema\n }\n };\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to Requesty', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name).slice(0, 5)\n });\n } else {\n logger.info('No tools to send (omitting tools parameter entirely for Requesty)');\n // Don't set openaiReq.tools at all - Requesty rejects empty arrays\n }\n } else {\n logger.info('No MCP tools to convert');\n }\n\n logger.info('=== CONVERSION COMPLETE ===', {\n messageCount: openaiReq.messages.length,\n hasMcpTools: !!openaiReq.tools,\n toolCount: openaiReq.tools?.length || 0,\n maxTokens: openaiReq.max_tokens,\n model: openaiReq.model\n });\n\n return openaiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertOpenAIToAnthropic(openaiRes: any): any {\n const choice = openaiRes.choices?.[0];\n if (!choice) {\n throw new Error('No choices in OpenAI response');\n }\n\n const message = choice.message || {};\n const rawText = message.content || choice.text || '';\n const toolCalls = message.tool_calls || [];\n\n logger.info('=== CONVERTING OPENAI TO ANTHROPIC ===', {\n hasMessage: !!message,\n hasContent: !!rawText,\n contentLength: rawText?.length,\n hasToolCalls: toolCalls.length > 0,\n toolCallCount: toolCalls.length,\n finishReason: choice.finish_reason\n });\n\n // CRITICAL: Use ONLY native OpenAI tool_calls format\n // Do NOT parse XML from text - models output malformed XML\n // Requesty handles tools via OpenAI function calling standard\n\n const contentBlocks: any[] = [];\n\n // Add tool uses from OpenAI tool_calls (MCP tools via function calling)\n if (toolCalls.length > 0) {\n logger.info('Processing tool calls from OpenAI response...');\n for (const toolCall of toolCalls) {\n try {\n logger.info('Tool call details:', {\n id: toolCall.id,\n name: toolCall.function.name,\n argumentsRaw: toolCall.function.arguments\n });\n\n contentBlocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments || '{}')\n });\n } catch (error) {\n logger.error('Failed to parse tool call arguments', {\n toolCall,\n error: (error as Error).message\n });\n }\n }\n\n logger.info('Converted Requesty tool calls to Anthropic format', {\n toolCallCount: toolCalls.length,\n toolNames: toolCalls.map((tc: any) => tc.function.name)\n });\n }\n\n // Add text response if present\n if (rawText && rawText.trim()) {\n logger.info('Adding text content block', {\n textLength: rawText.length,\n textPreview: rawText.substring(0, 200)\n });\n contentBlocks.push({\n type: 'text',\n text: rawText\n });\n }\n\n // If no content blocks, add empty text\n if (contentBlocks.length === 0) {\n logger.warn('No content blocks found, adding empty text block');\n contentBlocks.push({\n type: 'text',\n text: rawText || ''\n });\n }\n\n logger.info('Final content blocks:', {\n blockCount: contentBlocks.length,\n blockTypes: contentBlocks.map(b => b.type)\n });\n\n const result = {\n id: openaiRes.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: openaiRes.model,\n content: contentBlocks,\n stop_reason: this.mapFinishReason(choice.finish_reason),\n usage: {\n input_tokens: openaiRes.usage?.prompt_tokens || 0,\n output_tokens: openaiRes.usage?.completion_tokens || 0\n }\n };\n\n logger.info('Conversion complete, returning Anthropic response');\n return result;\n }\n\n private convertOpenAIStreamToAnthropic(chunk: string): string {\n // Convert OpenAI SSE format to Anthropic SSE format\n const lines = chunk.split('\\n').filter(line => line.trim());\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text: delta.content }\n })}\\n\\n`\n );\n }\n } catch (e) {\n // Ignore parse errors\n }\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private extractProvider(modelId: string): string {\n // Extract provider from model ID (e.g., \"openai/gpt-4\" -> \"openai\")\n const parts = modelId.split('/');\n return parts.length > 1 ? parts[0] : '';\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'stop': 'end_turn',\n 'length': 'max_tokens',\n 'content_filter': 'stop_sequence',\n 'function_call': 'tool_use'\n };\n return mapping[reason || 'stop'] || 'end_turn';\n }\n\n /**\n * Start listening. Binds 127.0.0.1 unless `host` or AGENTIC_FLOW_PROXY_HOST\n * says otherwise. Returns the underlying server.\n */\n public start(port: number, host: string = resolveProxyHost()): Server {\n this.server = this.app.listen(port, host, () => {\n logger.info('Anthropic to Requesty proxy started', {\n port,\n host,\n requestyBaseUrl: this.requestyBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\n✅ Anthropic Proxy running at http://${host}:${port}`);\n console.log(` Requesty Base URL: ${this.requestyBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}`);\n\n if (this.capabilities?.requiresEmulation) {\n console.log(`\\n ⚙️ Tool Emulation: ${this.capabilities.emulationStrategy.toUpperCase()} pattern`);\n console.log(` 📊 Expected reliability: ${this.capabilities.emulationStrategy === 'react' ? '70-85%' : '50-70%'}`);\n }\n console.log('');\n });\n return this.server;\n }\n\n /** Stop listening. Safe to call when the proxy was never started. */\n public stop(): Promise<void> {\n const server = this.server;\n this.server = undefined;\n if (!server) return Promise.resolve();\n return new Promise((resolve, reject) => server.close(err => (err ? reject(err) : resolve())));\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3000');\n const requestyApiKey = process.env.REQUESTY_API_KEY;\n\n if (!requestyApiKey) {\n console.error('❌ Error: REQUESTY_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToRequestyProxy({\n requestyApiKey,\n requestyBaseUrl: process.env.ANTHROPIC_PROXY_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n console.log(` Proxy token (send as x-api-key / ANTHROPIC_API_KEY): ${proxy.getAuthToken()}`);\n}\n"]}
1
+ {"version":3,"file":"anthropic-to-requesty.js","sourceRoot":"","sources":["../../src/proxy/anthropic-to-requesty.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,mDAAmD;AACnD,OAAO,OAA4C,MAAM,SAAS,CAAC;AAGnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAoE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACpI,OAAO,EAAqB,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAY,MAAM,qBAAqB,CAAC;AAoD/E,MAAM,OAAO,wBAAwB;IAC3B,GAAG,CAAsB;IACzB,cAAc,CAAS;IACvB,eAAe,CAAS;IACxB,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,MAAM,CAAU;IAChB,YAAY,CAAqB;IAEzC,YAAY,MAOX;QACC,IAAI,CAAC,GAAG,GAAG,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,iBAAiB,EAAE,CAAC;QACzD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,+BAA+B,CAAC;QACjF,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,wBAAwB,CAAC;QACpE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAExC,gBAAgB;QAChB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACjD,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB;gBACtD,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB;aAC9C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,4EAA4E;IACrE,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEO,eAAe;QACrB,wEAAwE;QACxE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAExD,oBAAoB;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9C,qBAAqB;QACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YAC/D,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE;gBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,eAAe;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACtD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;YAClE,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,YAAY,GAAqB,GAAG,CAAC,IAAI,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBAEnD,kDAAkD;gBAClD,sEAAsE;gBACtE,MAAM,aAAa,GAAG,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ;oBAC3D,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;oBACvC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;wBACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;wBACvD,CAAC,CAAC,SAAS,CAAC;gBAEd,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;oBACjD,KAAK,EAAE,YAAY,CAAC,KAAK;oBACzB,YAAY,EAAE,aAAa;oBAC3B,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM;oBACtC,YAAY,EAAE,YAAY,CAAC,QAAQ,EAAE,MAAM;oBAC3C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;oBAC1C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBACrD,SAAS,EAAE,YAAY,CAAC,UAAU;oBAClC,WAAW,EAAE,YAAY,CAAC,WAAW;oBACrC,MAAM,EAAE,YAAY,CAAC,MAAM;iBAC5B,CAAC,CAAC;gBAEH,uCAAuC;gBACvC,IAAI,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9D,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;wBAClC,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,cAAc,EAAE,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;4BAClD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;4BACpC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;qBACvD,CAAC,CAAC;gBACL,CAAC;gBAED,qDAAqD;gBACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;gBAC3D,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC1E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE;wBACL,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,YAAY,GAAG,CAAC,IAAI,yBAAyB;iBACvD;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,YAA8B,EAAE,GAAa;QACvE,IAAI,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAEpD,yFAAyF;QACzF,0CAA0C;QAC1C,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACjG,MAAM,CAAC,IAAI,CAAC,+BAA+B,KAAK,uBAAuB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YAC5F,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;YAC1B,YAAY,CAAC,KAAK,GAAG,KAAK,CAAC;QAC7B,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAEzE,iCAAiC;QACjC,IAAI,YAAY,CAAC,iBAAiB,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,YAA8B,EAAE,GAAa;QAC7E,4CAA4C;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAE9D,gDAAgD;QAChD,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;YAC/C,cAAc,EAAE,YAAY,CAAC,KAAK;YAClC,WAAW,EAAE,SAAS,CAAC,KAAK;YAC5B,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;YACvC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YAC/D,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YACvC,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;YAC3D,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc;SACrC,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,mBAAmB,EAAE;YACvE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,cAAc,EAAE;gBAChD,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,wCAAwC;gBACxD,SAAS,EAAE,cAAc;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBAC/B,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gDAAgD;QAChD,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;YAChD,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,MAAM,CAAC,WAAW,CAAE,QAAQ,CAAC,OAAe,CAAC,OAAO,EAAE,CAAC;SACjE,CAAC,CAAC;QAEH,oCAAoC;QACpC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,kBAAkB;YAClB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtC,CAAC;YAED,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;gBACpC,MAAM,cAAc,GAAG,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;gBAClE,IAAI,cAAc;oBAAE,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,CAAC,wBAAwB;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,yBAAyB;YACzB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAExC,2CAA2C;YAC3C,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gBAC1C,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM;gBAClC,YAAY,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa;gBACnD,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC;gBAC7D,aAAa,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;gBACvE,aAAa,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpG,cAAc,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC3E,KAAK,EAAE,SAAS,CAAC,KAAK;aACvB,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YAE9D,oDAAoD;YACpD,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBAClD,EAAE,EAAE,YAAY,CAAC,EAAE;gBACnB,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,UAAU,EAAE,YAAY,CAAC,WAAW;gBACpC,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM;gBAC3C,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC3D,YAAY,EAAE,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,MAAM;gBACpF,WAAW,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBAC/F,KAAK,EAAE,YAAY,CAAC,KAAK;aAC1B,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,YAA8B,EAC9B,YAA+B;QAE/B,MAAM,QAAQ,GAAG,IAAI,YAAY,CAC/B,YAAY,CAAC,KAAK,IAAI,EAAE,EACxB,YAAY,CAAC,iBAAuC,CACrD,CAAC;QAEF,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ;YACzD,CAAC,CAAC,WAAW,CAAC,OAAO;YACrB,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,QAAQ,EACR,WAAW,EACX,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,mCAAmC;YACnC,wDAAwD;YACxD,IAAI,SAAS,GAAG,YAAY,CAAC,UAAU,CAAC;YACxC,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;gBAClC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,MAAM,SAAS,GAAG;gBAChB,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;gBAC9C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7C,WAAW,EAAE,YAAY,CAAC,WAAW;gBACrC,UAAU,EAAE,SAAS;aACtB,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7C,CAAC,EACD,KAAK,EAAE,QAAkB,EAAE,EAAE;YAC3B,MAAM,CAAC,IAAI,CAAC,uCAAuC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;QAChE,CAAC,EACD,EAAE,aAAa,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,CAC9D,CAAC;QAEF,OAAO;YACL,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;YACtE,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;YAC9C,WAAW,EAAE,UAAU;YACvB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE;SAC7C,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,SAAc;QACvC,kDAAkD;QAClD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,eAAe,mBAAmB,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,IAAI,CAAC,cAAc,EAAE;oBAChD,cAAc,EAAE,kBAAkB;oBAClC,cAAc,EAAE,wCAAwC;oBACxD,SAAS,EAAE,cAAc;iBAC1B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;gBAC/B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAGD;;;OAGG;IACK,kBAAkB,CAAC,MAAW,EAAE,OAAe,MAAM;QAC3D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2CAA2C;QAC3C,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QAEhC,gCAAgC;QAChC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,4DAA4D,IAAI,EAAE,CAAC,CAAC;YAChF,SAAS,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACvC,CAAC;QAED,8DAA8D;QAC9D,MAAM,mBAAmB,GAAG;YAC1B,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;YAChD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,mBAAmB;YAC7D,aAAa,EAAE,kBAAkB,EAAE,uBAAuB;YAC1D,aAAa,EAAE,aAAa,EAAE,mBAAmB;YACjD,iBAAiB,EAAE,UAAU;SAC9B,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;YAC1C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,sDAAsD,OAAO,QAAQ,IAAI,EAAE,CAAC,CAAC;gBACzF,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,SAAS,CAAC,UAAU,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACrE,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7D,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,IAAI,eAAe,GAAG,EAAE,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,IAAI,SAAS,CAAC,KAAK,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3D,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC9E,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACrD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACzC,SAAS,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,KAAa,EAAE,EAAE,CAClF,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,UAAU,IAAI,KAAK,GAAG,CAAC,CACtE,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,wBAAwB,CAAC,YAA8B;QAC7D,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QAErC,uCAAuC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC9B,cAAc,EAAE,YAAY,CAAC,KAAK;YAClC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,OAAO;YACrB,iBAAiB,EAAE,QAAQ;SAC5B,CAAC,CAAC;QAEH,2DAA2D;QAC3D,0EAA0E;QAC1E,iEAAiE;QACjE,iEAAiE;QAEjE,IAAI,aAAa,GAAG,EAAE,CAAC;QAEvB,gDAAgD;QAChD,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAExE,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC7B,WAAW;YACX,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YAC1C,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SACtD,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,gEAAgE;YAChE,aAAa,GAAG,oJAAoJ,CAAC;YACrK,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,aAAa,GAAG,sFAAsF,CAAC;YACvG,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,kDAAkD;YAClD,IAAI,cAAsB,CAAC;YAC3B,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC5C,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;YACvC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,mCAAmC;gBACnC,cAAc,GAAG,YAAY,CAAC,MAAM;qBACjC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;qBACpD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,EAAE,CAAC;YACtB,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBAChD,UAAU,EAAE,OAAO,YAAY,CAAC,MAAM;gBACtC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC3C,oBAAoB,EAAE,cAAc,CAAC,MAAM;gBAC3C,qBAAqB,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACxD,CAAC,CAAC;YAEH,IAAI,cAAc,EAAE,CAAC;gBACnB,aAAa,IAAI,MAAM,GAAG,cAAc,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,mBAAmB,EAAE,aAAa,CAAC,MAAM;YACzC,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;SACtD,CAAC,CAAC;QAEH,2EAA2E;QAC3E,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,mBAAmB,GAAG,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QACpF,MAAM,UAAU,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;QAE5E,8CAA8C;QAC9C,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,OAAe,CAAC;YAEpB,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,mCAAmC;gBACnC,OAAO,GAAG,GAAG,CAAC,OAAO;qBAClB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;qBACtC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;qBACxB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,GAAG,CAAC,IAA4B;gBACtC,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,SAAS,GAAG,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QAE1E,6CAA6C;QAC7C,IAAI,SAAS,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;YAClC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAkB;YAC/B,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,MAAM,EAAE,YAAY,CAAC,MAAM;SAC5B,CAAC;QAEF,qDAAqD;QACrD,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;gBACtD,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM;aACtC,CAAC,CAAC;YAEH,6EAA6E;YAC7E,0FAA0F;YAC1F,MAAM,sBAAsB,GAAG,EAAE,CAAC,CAAC,wDAAwD;YAC3F,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAE3E,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,CAAC,qBAAqB,sBAAsB,kBAAkB,YAAY,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC;YACnH,CAAC;YAED,yEAAyE;YACzE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,SAAS,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAC1C,kEAAkE;oBAClE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,IAAI;wBACrC,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE,EAAE;wBACd,QAAQ,EAAE,EAAE;qBACb,CAAC;oBACF,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAEhF,MAAM,UAAU,GAAG;wBACjB,IAAI,EAAE,UAAmB;wBACzB,QAAQ,EAAE;4BACR,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;4BACnC,UAAU,EAAE,eAAe;yBAC5B;qBACF,CAAC;oBACF,OAAO,UAAU,CAAC;gBACpB,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;oBAC9C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;oBACjC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;iBACjE,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;gBACjF,mEAAmE;YACrE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;YACvC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK;YAC9B,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YACvC,SAAS,EAAE,SAAS,CAAC,UAAU;YAC/B,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,uBAAuB,CAAC,IAAY;QAI1C,MAAM,QAAQ,GAAU,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,4BAA4B;QAC5B,MAAM,cAAc,GAAG,sDAAsD,CAAC;QAC9E,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;oBACnB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,2BAA2B;QAC3B,MAAM,aAAa,GAAG,+BAA+B,CAAC;QACtD,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;iBACpB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,2CAA2C,CAAC;QAC9D,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE;gBAC3C,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;iBACzB;aACF,CAAC,CAAC;YACH,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC;IACnD,CAAC;IAEO,wBAAwB,CAAC,SAAc;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;YACpD,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,UAAU,EAAE,CAAC,CAAC,OAAO;YACrB,aAAa,EAAE,OAAO,EAAE,MAAM;YAC9B,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;YAClC,aAAa,EAAE,SAAS,CAAC,MAAM;YAC/B,YAAY,EAAE,MAAM,CAAC,aAAa;SACnC,CAAC,CAAC;QAEH,qDAAqD;QACrD,2DAA2D;QAC3D,8DAA8D;QAE9D,MAAM,aAAa,GAAU,EAAE,CAAC;QAEhC,wEAAwE;QACxE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC7D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;wBAChC,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;wBAC5B,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS;qBAC1C,CAAC,CAAC;oBAEH,aAAa,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,QAAQ,CAAC,EAAE;wBACf,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;wBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;qBACvD,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;wBAClD,QAAQ;wBACR,KAAK,EAAG,KAAe,CAAC,OAAO;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE;gBAC/D,aAAa,EAAE,SAAS,CAAC,MAAM;gBAC/B,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACvC,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;aACvC,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;QACL,CAAC;QAED,uCAAuC;QACvC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAChE,aAAa,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO,IAAI,EAAE;aACpB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACnC,UAAU,EAAE,aAAa,CAAC,MAAM;YAChC,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG;YACb,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;YACvC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC;YACvD,KAAK,EAAE;gBACL,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;gBACjD,aAAa,EAAE,SAAS,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;aACvD;SACF,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,uEAAuE;IAC/D,8BAA8B,CAAC,KAAa;QAClD,oDAAoD;QACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACtB,eAAe,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;oBAC1D,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAChC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;oBAEzC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;wBACnB,eAAe,CAAC,IAAI,CAClB,qCAAqC,IAAI,CAAC,SAAS,CAAC;4BAClD,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;yBACnD,CAAC,MAAM,CACT,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,sBAAsB;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,oEAAoE;QACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IAEO,eAAe,CAAC,MAAe;QACrC,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,YAAY;YACtB,gBAAgB,EAAE,eAAe;YACjC,eAAe,EAAE,UAAU;SAC5B,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC;IACjD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,IAAY,EAAE,OAAe,gBAAgB,EAAE;QAC1D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACjD,IAAI;gBACJ,IAAI;gBACJ,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,yCAAyC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YAEtD,IAAI,IAAI,CAAC,YAAY,EAAE,iBAAiB,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBACrG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,YAAY,CAAC,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,qEAAqE;IAC9D,IAAI;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;CACF;AAED,kBAAkB;AAClB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAEpD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,wBAAwB,CAAC;QACzC,cAAc;QACd,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACrD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;KAC1E,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,2DAA2D,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACjG,CAAC","sourcesContent":["// Anthropic to Requesty Proxy Server\n// Converts Anthropic API format to Requesty format\nimport express, { Request, Response, NextFunction } from 'express';\nimport type { Server } from 'http';\nimport { createProxyMiddleware, Options } from 'http-proxy-middleware';\nimport { logger } from '../utils/logger.js';\nimport { createProxyAuthMiddleware, resolveProxyHost, resolveProxyToken } from './proxy-auth.js';\nimport { forEachSseLines, sseLines } from './sse-lines.js';\nimport { getInstructionsForModel, formatInstructions, taskRequiresFileOps, getMaxTokensForModel } from './provider-instructions.js';\nimport { ModelCapabilities, detectModelCapabilities } from '../utils/modelCapabilities.js';\nimport { ToolEmulator, executeEmulation, ToolCall } from './tool-emulation.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string; [key: string]: any }>;\n}\n\ninterface AnthropicTool {\n name: string;\n description?: string;\n input_schema?: {\n type: string;\n properties?: Record<string, any>;\n required?: string[];\n };\n}\n\ninterface AnthropicRequest {\n model?: string;\n messages: AnthropicMessage[];\n max_tokens?: number;\n temperature?: number;\n system?: string | Array<{ type: string; text?: string; [key: string]: any }>; // Can be string OR array of blocks\n stream?: boolean;\n tools?: AnthropicTool[];\n [key: string]: any;\n}\n\ninterface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\ninterface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: any;\n };\n}\n\ninterface OpenAIRequest {\n model: string;\n messages: OpenAIMessage[];\n max_tokens?: number;\n temperature?: number;\n stream?: boolean;\n tools?: OpenAITool[];\n [key: string]: any;\n}\n\nexport class AnthropicToRequestyProxy {\n private app: express.Application;\n private requestyApiKey: string;\n private requestyBaseUrl: string;\n private defaultModel: string;\n private authToken: string;\n private server?: Server;\n private capabilities?: ModelCapabilities;\n\n constructor(config: {\n requestyApiKey: string;\n requestyBaseUrl?: string;\n defaultModel?: string;\n capabilities?: ModelCapabilities;\n /** Token clients must send; defaults to AGENTIC_FLOW_PROXY_TOKEN or a random one. */\n authToken?: string;\n }) {\n this.app = express();\n this.authToken = config.authToken || resolveProxyToken();\n this.requestyApiKey = config.requestyApiKey;\n this.requestyBaseUrl = config.requestyBaseUrl || 'https://router.requesty.ai/v1';\n this.defaultModel = config.defaultModel || 'deepseek/deepseek-chat';\n this.capabilities = config.capabilities;\n\n // Debug logging\n if (this.capabilities) {\n logger.info('Proxy initialized with capabilities', {\n model: this.defaultModel,\n requiresEmulation: this.capabilities.requiresEmulation,\n strategy: this.capabilities.emulationStrategy\n });\n }\n\n this.setupMiddleware();\n this.setupRoutes();\n }\n\n /** The token clients must present as x-api-key or Authorization: Bearer. */\n public getAuthToken(): string {\n return this.authToken;\n }\n\n private setupMiddleware(): void {\n // Reject unauthenticated callers before parsing their (up to 50mb) body\n this.app.use(createProxyAuthMiddleware(this.authToken));\n\n // Parse JSON bodies\n this.app.use(express.json({ limit: '50mb' }));\n\n // Logging middleware\n this.app.use((req: Request, res: Response, next: NextFunction) => {\n logger.debug('Proxy request', {\n method: req.method,\n path: req.path,\n headers: Object.keys(req.headers)\n });\n next();\n });\n }\n\n private setupRoutes(): void {\n // Health check\n this.app.get('/health', (req: Request, res: Response) => {\n res.json({ status: 'ok', service: 'anthropic-to-requesty-proxy' });\n });\n\n // Anthropic Messages API → Requesty Chat Completions\n this.app.post('/v1/messages', async (req: Request, res: Response) => {\n console.log('🔵 REQUEST RECEIVED AT PROXY - /v1/messages');\n logger.info('🔵 REQUEST RECEIVED AT PROXY - /v1/messages');\n try {\n const anthropicReq: AnthropicRequest = req.body;\n console.log('🔵 Request body parsed successfully');\n\n // VERBOSE LOGGING: Log incoming Anthropic request\n // Handle system prompt which can be string OR array of content blocks\n const systemPreview = typeof anthropicReq.system === 'string'\n ? anthropicReq.system.substring(0, 200)\n : Array.isArray(anthropicReq.system)\n ? JSON.stringify(anthropicReq.system).substring(0, 200)\n : undefined;\n\n logger.debug('=== INCOMING ANTHROPIC REQUEST ===', {\n model: anthropicReq.model,\n systemPrompt: systemPreview,\n systemType: typeof anthropicReq.system,\n messageCount: anthropicReq.messages?.length,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || [],\n maxTokens: anthropicReq.max_tokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n });\n\n // Log first user message for debugging\n if (anthropicReq.messages && anthropicReq.messages.length > 0) {\n const firstMsg = anthropicReq.messages[0];\n logger.debug('First user message:', {\n role: firstMsg.role,\n contentPreview: typeof firstMsg.content === 'string'\n ? firstMsg.content.substring(0, 200)\n : JSON.stringify(firstMsg.content).substring(0, 200)\n });\n }\n\n // Route to appropriate handler based on capabilities\n const result = await this.handleRequest(anthropicReq, res);\n if (result) {\n res.json(result);\n }\n } catch (error: any) {\n logger.error('Proxy error', { error: error.message, stack: error.stack });\n res.status(500).json({\n error: {\n type: 'proxy_error',\n message: error.message\n }\n });\n }\n });\n\n // Fallback for other Anthropic API endpoints\n this.app.use((req: Request, res: Response) => {\n logger.warn('Unsupported endpoint', { path: req.path, method: req.method });\n res.status(404).json({\n error: {\n type: 'not_found',\n message: `Endpoint ${req.path} not supported by proxy`\n }\n });\n });\n }\n\n private async handleRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n let model = anthropicReq.model || this.defaultModel;\n\n // If SDK is requesting a Claude model but we're using Requesty with a different default,\n // override to use the CLI-specified model\n if (model.startsWith('claude-') && this.defaultModel && !this.defaultModel.startsWith('claude-')) {\n logger.info(`Overriding SDK Claude model ${model} with CLI-specified ${this.defaultModel}`);\n model = this.defaultModel;\n anthropicReq.model = model;\n }\n\n const capabilities = this.capabilities || detectModelCapabilities(model);\n\n // Check if emulation is required\n if (capabilities.requiresEmulation && anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info(`Using tool emulation for model: ${model}`);\n return this.handleEmulatedRequest(anthropicReq, capabilities);\n }\n\n return this.handleNativeRequest(anthropicReq, res);\n }\n\n private async handleNativeRequest(anthropicReq: AnthropicRequest, res: Response): Promise<any> {\n // Convert Anthropic format to OpenAI format\n const openaiReq = this.convertAnthropicToOpenAI(anthropicReq);\n\n // VERBOSE LOGGING: Log converted OpenAI request\n logger.debug('=== CONVERTED OPENAI REQUEST ===', {\n anthropicModel: anthropicReq.model,\n openaiModel: openaiReq.model,\n messageCount: openaiReq.messages.length,\n systemPrompt: openaiReq.messages[0]?.content?.substring(0, 300),\n toolCount: openaiReq.tools?.length || 0,\n toolNames: openaiReq.tools?.map(t => t.function.name) || [],\n maxTokens: openaiReq.max_tokens,\n apiKeyPresent: !!this.requestyApiKey\n });\n\n // Forward to Requesty\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq)\n });\n\n if (!response.ok) {\n const error = await response.text();\n logger.error('Requesty API error', { status: response.status, error });\n res.status(response.status).json({\n error: {\n type: 'api_error',\n message: error\n }\n });\n return null;\n }\n\n // VERBOSE LOGGING: Log Requesty response status\n logger.info('=== REQUESTY RESPONSE RECEIVED ===', {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries((response.headers as any).entries())\n });\n\n // Handle streaming vs non-streaming\n if (anthropicReq.stream) {\n logger.info('Handling streaming response...');\n // Stream response\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n await forEachSseLines(reader, lines => {\n const anthropicChunk = this.convertOpenAIStreamToAnthropic(lines);\n if (anthropicChunk) res.write(anthropicChunk);\n });\n\n res.end();\n return null; // Already sent response\n } else {\n logger.info('Handling non-streaming response...');\n // Non-streaming response\n const openaiRes = await response.json();\n\n // VERBOSE LOGGING: Log raw OpenAI response\n logger.debug('=== RAW OPENAI RESPONSE ===', {\n id: openaiRes.id,\n model: openaiRes.model,\n choices: openaiRes.choices?.length,\n finishReason: openaiRes.choices?.[0]?.finish_reason,\n hasToolCalls: !!(openaiRes.choices?.[0]?.message?.tool_calls),\n toolCallCount: openaiRes.choices?.[0]?.message?.tool_calls?.length || 0,\n toolCallNames: openaiRes.choices?.[0]?.message?.tool_calls?.map((tc: any) => tc.function.name) || [],\n contentPreview: openaiRes.choices?.[0]?.message?.content?.substring(0, 300),\n usage: openaiRes.usage\n });\n\n const anthropicRes = this.convertOpenAIToAnthropic(openaiRes);\n\n // VERBOSE LOGGING: Log converted Anthropic response\n logger.info('=== CONVERTED ANTHROPIC RESPONSE ===', {\n id: anthropicRes.id,\n model: anthropicRes.model,\n role: anthropicRes.role,\n stopReason: anthropicRes.stop_reason,\n contentBlocks: anthropicRes.content?.length,\n contentTypes: anthropicRes.content?.map((c: any) => c.type),\n toolUseCount: anthropicRes.content?.filter((c: any) => c.type === 'tool_use').length,\n textPreview: anthropicRes.content?.find((c: any) => c.type === 'text')?.text?.substring(0, 200),\n usage: anthropicRes.usage\n });\n\n return anthropicRes;\n }\n }\n\n private async handleEmulatedRequest(\n anthropicReq: AnthropicRequest,\n capabilities: ModelCapabilities\n ): Promise<any> {\n const emulator = new ToolEmulator(\n anthropicReq.tools || [],\n capabilities.emulationStrategy as 'react' | 'prompt'\n );\n\n const lastMessage = anthropicReq.messages[anthropicReq.messages.length - 1];\n const userMessage = typeof lastMessage.content === 'string'\n ? lastMessage.content\n : (lastMessage.content.find(c => c.type === 'text')?.text || '');\n\n const result = await executeEmulation(\n emulator,\n userMessage,\n async (prompt) => {\n // Call model with emulation prompt\n // Cap max_tokens at 8192 for OpenAI models via Requesty\n let maxTokens = anthropicReq.max_tokens;\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\n const openaiReq = {\n model: anthropicReq.model || this.defaultModel,\n messages: [{ role: 'user', content: prompt }],\n temperature: anthropicReq.temperature,\n max_tokens: maxTokens\n };\n const response = await this.callRequesty(openaiReq);\n return response.choices[0].message.content;\n },\n async (toolCall: ToolCall) => {\n logger.warn(`Tool execution not yet implemented: ${toolCall.name}`);\n return { error: 'Tool execution not implemented in Phase 2' };\n },\n { maxIterations: 5, verbose: process.env.VERBOSE === 'true' }\n );\n\n return {\n id: `emulated_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: result.finalAnswer || 'No response' }],\n model: anthropicReq.model || this.defaultModel,\n stop_reason: 'end_turn',\n usage: { input_tokens: 0, output_tokens: 0 }\n };\n }\n\n private async callRequesty(openaiReq: any): Promise<any> {\n // Add timeout for Requesty API calls (60 seconds)\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000);\n\n try {\n const response = await fetch(`${this.requestyBaseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.requestyApiKey}`,\n 'Content-Type': 'application/json',\n 'HTTP-Referer': 'https://github.com/ruvnet/agentic-flow',\n 'X-Title': 'Agentic Flow'\n },\n body: JSON.stringify(openaiReq),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Requesty API error: ${error}`);\n }\n\n return response.json();\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === 'AbortError') {\n throw new Error('Requesty API request timed out after 60 seconds');\n }\n throw error;\n }\n }\n\n\n /**\n * Sanitize JSON Schema to be OpenAI-compatible\n * Fixes array properties without items, removes unsupported keywords\n */\n private sanitizeJsonSchema(schema: any, path: string = 'root'): any {\n if (!schema || typeof schema !== 'object') {\n return schema;\n }\n\n // Create a shallow copy to avoid mutations\n const sanitized = { ...schema };\n\n // Fix array types without items\n if (sanitized.type === 'array' && !sanitized.items) {\n logger.warn(`Schema sanitization: Adding missing 'items' for array at ${path}`);\n sanitized.items = { type: 'string' };\n }\n\n // Remove JSON Schema 2020-12 keywords not supported by OpenAI\n const unsupportedKeywords = [\n '$schema', '$id', '$ref', '$defs', 'definitions',\n 'if', 'then', 'else', 'dependentSchemas', 'dependentRequired',\n 'prefixItems', 'unevaluatedItems', 'unevaluatedProperties',\n 'minContains', 'maxContains', 'patternProperties',\n 'additionalItems', 'contains'\n ];\n\n for (const keyword of unsupportedKeywords) {\n if (keyword in sanitized) {\n logger.warn(`Schema sanitization: Removing unsupported keyword '${keyword}' at ${path}`);\n delete sanitized[keyword];\n }\n }\n\n // Recursively sanitize nested properties\n if (sanitized.properties && typeof sanitized.properties === 'object') {\n sanitized.properties = {};\n for (const [key, value] of Object.entries(schema.properties)) {\n sanitized.properties[key] = this.sanitizeJsonSchema(value, `${path}.properties.${key}`);\n }\n }\n\n // Recursively sanitize array items\n if (sanitized.items && typeof sanitized.items === 'object') {\n sanitized.items = this.sanitizeJsonSchema(sanitized.items, `${path}.items`);\n }\n\n // Recursively sanitize allOf, anyOf, oneOf\n for (const combinator of ['allOf', 'anyOf', 'oneOf']) {\n if (Array.isArray(sanitized[combinator])) {\n sanitized[combinator] = sanitized[combinator].map((subschema: any, index: number) =>\n this.sanitizeJsonSchema(subschema, `${path}.${combinator}[${index}]`)\n );\n }\n }\n\n return sanitized;\n }\n\n private convertAnthropicToOpenAI(anthropicReq: AnthropicRequest): OpenAIRequest {\n logger.info('=== STARTING ANTHROPIC TO OPENAI CONVERSION ===');\n const messages: OpenAIMessage[] = [];\n\n // Get model-specific tool instructions\n const modelId = anthropicReq.model || this.defaultModel;\n const provider = this.extractProvider(modelId);\n\n logger.info('Model detection:', {\n requestedModel: anthropicReq.model,\n defaultModel: this.defaultModel,\n finalModelId: modelId,\n extractedProvider: provider\n });\n\n // CRITICAL: Requesty models use native OpenAI tool calling\n // - If MCP tools are provided, Requesty handles them via function calling\n // - Do NOT inject XML instructions - they cause malformed output\n // - Let Requesty models use tools via OpenAI's tool_calls format\n\n let systemContent = '';\n\n // Check if we have MCP tools (function calling)\n const hasMcpTools = anthropicReq.tools && anthropicReq.tools.length > 0;\n\n logger.info('Tool detection:', {\n hasMcpTools,\n toolCount: anthropicReq.tools?.length || 0,\n toolNames: anthropicReq.tools?.map(t => t.name) || []\n });\n\n if (hasMcpTools) {\n // MCP tools present - Requesty will handle via function calling\n systemContent = 'You are a helpful AI assistant. When you need to perform actions, use the available tools by calling functions. Always explain what you\\'re doing.';\n logger.info('Using MCP tools system prompt (with function calling support)');\n } else {\n // No tools - simple response mode\n systemContent = 'You are a helpful AI assistant. Provide clear, well-formatted code and explanations.';\n logger.info('Using simple system prompt (no tools)');\n }\n\n if (anthropicReq.system) {\n // System can be string OR array of content blocks\n let originalSystem: string;\n if (typeof anthropicReq.system === 'string') {\n originalSystem = anthropicReq.system;\n } else if (Array.isArray(anthropicReq.system)) {\n // Extract text from content blocks\n originalSystem = anthropicReq.system\n .filter(block => block.type === 'text' && block.text)\n .map(block => block.text)\n .join('\\n');\n } else {\n originalSystem = '';\n }\n\n logger.debug('Appending original system prompt:', {\n systemType: typeof anthropicReq.system,\n isArray: Array.isArray(anthropicReq.system),\n originalSystemLength: originalSystem.length,\n originalSystemPreview: originalSystem.substring(0, 200)\n });\n\n if (originalSystem) {\n systemContent += '\\n\\n' + originalSystem;\n }\n }\n\n messages.push({\n role: 'system',\n content: systemContent\n });\n\n logger.info('System message created:', {\n systemContentLength: systemContent.length,\n systemContentPreview: systemContent.substring(0, 300)\n });\n\n // Override model - if request has a Claude model, use defaultModel instead\n const requestedModel = anthropicReq.model || '';\n const shouldOverrideModel = requestedModel.startsWith('claude-') || !requestedModel;\n const finalModel = shouldOverrideModel ? this.defaultModel : requestedModel;\n\n // Convert Anthropic messages to OpenAI format\n for (const msg of anthropicReq.messages) {\n let content: string;\n\n if (typeof msg.content === 'string') {\n content = msg.content;\n } else if (Array.isArray(msg.content)) {\n // Extract text from content blocks\n content = msg.content\n .filter(block => block.type === 'text')\n .map(block => block.text)\n .join('\\n');\n } else {\n content = '';\n }\n\n messages.push({\n role: msg.role as 'user' | 'assistant',\n content\n });\n }\n\n // Get appropriate max_tokens for this model\n let maxTokens = getMaxTokensForModel(finalModel, anthropicReq.max_tokens);\n\n // Cap at 8192 for OpenAI models via Requesty\n if (maxTokens && maxTokens > 8192) {\n maxTokens = 8192;\n }\n\n const openaiReq: OpenAIRequest = {\n model: finalModel,\n messages,\n max_tokens: maxTokens,\n temperature: anthropicReq.temperature,\n stream: anthropicReq.stream\n };\n\n // Convert MCP/Anthropic tools to OpenAI tools format\n if (anthropicReq.tools && anthropicReq.tools.length > 0) {\n logger.info('Converting MCP tools to OpenAI format...', {\n totalTools: anthropicReq.tools.length\n });\n\n // Requesty has strict limits - only send a subset of tools to avoid timeouts\n // Requesty also rejects empty tools arrays, so we either send tools or omit the parameter\n const MAX_TOOLS_FOR_REQUESTY = 10; // Very conservative limit - Requesty timeouts with more\n const toolsToConvert = anthropicReq.tools.slice(0, MAX_TOOLS_FOR_REQUESTY);\n\n if (anthropicReq.tools.length > MAX_TOOLS_FOR_REQUESTY) {\n logger.warn(`Limiting tools to ${MAX_TOOLS_FOR_REQUESTY} for Requesty (${anthropicReq.tools.length} available)`);\n }\n\n // Only set tools if we have at least one (Requesty rejects empty arrays)\n if (toolsToConvert.length > 0) {\n openaiReq.tools = toolsToConvert.map(tool => {\n // Sanitize the input schema to fix array properties without items\n const rawSchema = tool.input_schema || {\n type: 'object',\n properties: {},\n required: []\n };\n const sanitizedSchema = this.sanitizeJsonSchema(rawSchema, `tool.${tool.name}`);\n\n const openaiTool = {\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description || '',\n parameters: sanitizedSchema\n }\n };\n return openaiTool;\n });\n\n logger.info('Forwarding MCP tools to Requesty', {\n toolCount: openaiReq.tools.length,\n toolNames: openaiReq.tools.map(t => t.function.name).slice(0, 5)\n });\n } else {\n logger.info('No tools to send (omitting tools parameter entirely for Requesty)');\n // Don't set openaiReq.tools at all - Requesty rejects empty arrays\n }\n } else {\n logger.info('No MCP tools to convert');\n }\n\n logger.info('=== CONVERSION COMPLETE ===', {\n messageCount: openaiReq.messages.length,\n hasMcpTools: !!openaiReq.tools,\n toolCount: openaiReq.tools?.length || 0,\n maxTokens: openaiReq.max_tokens,\n model: openaiReq.model\n });\n\n return openaiReq;\n }\n\n private parseStructuredCommands(text: string): {\n cleanText: string;\n toolUses: any[]\n } {\n const toolUses: any[] = [];\n let cleanText = text;\n\n // Parse file_write commands\n const fileWriteRegex = /<file_write path=\"([^\"]+)\">([\\s\\S]*?)<\\/file_write>/g;\n let match;\n while ((match = fileWriteRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Write',\n input: {\n file_path: match[1],\n content: match[2].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[File written: ${match[1]}]`);\n }\n\n // Parse file_read commands\n const fileReadRegex = /<file_read path=\"([^\"]+)\"\\/>/g;\n while ((match = fileReadRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Read',\n input: {\n file_path: match[1]\n }\n });\n cleanText = cleanText.replace(match[0], `[Reading file: ${match[1]}]`);\n }\n\n // Parse bash commands\n const bashRegex = /<bash_command>([\\s\\S]*?)<\\/bash_command>/g;\n while ((match = bashRegex.exec(text)) !== null) {\n toolUses.push({\n type: 'tool_use',\n id: `tool_${Date.now()}_${toolUses.length}`,\n name: 'Bash',\n input: {\n command: match[1].trim()\n }\n });\n cleanText = cleanText.replace(match[0], `[Executing: ${match[1].trim()}]`);\n }\n\n return { cleanText: cleanText.trim(), toolUses };\n }\n\n private convertOpenAIToAnthropic(openaiRes: any): any {\n const choice = openaiRes.choices?.[0];\n if (!choice) {\n throw new Error('No choices in OpenAI response');\n }\n\n const message = choice.message || {};\n const rawText = message.content || choice.text || '';\n const toolCalls = message.tool_calls || [];\n\n logger.info('=== CONVERTING OPENAI TO ANTHROPIC ===', {\n hasMessage: !!message,\n hasContent: !!rawText,\n contentLength: rawText?.length,\n hasToolCalls: toolCalls.length > 0,\n toolCallCount: toolCalls.length,\n finishReason: choice.finish_reason\n });\n\n // CRITICAL: Use ONLY native OpenAI tool_calls format\n // Do NOT parse XML from text - models output malformed XML\n // Requesty handles tools via OpenAI function calling standard\n\n const contentBlocks: any[] = [];\n\n // Add tool uses from OpenAI tool_calls (MCP tools via function calling)\n if (toolCalls.length > 0) {\n logger.info('Processing tool calls from OpenAI response...');\n for (const toolCall of toolCalls) {\n try {\n logger.info('Tool call details:', {\n id: toolCall.id,\n name: toolCall.function.name,\n argumentsRaw: toolCall.function.arguments\n });\n\n contentBlocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments || '{}')\n });\n } catch (error) {\n logger.error('Failed to parse tool call arguments', {\n toolCall,\n error: (error as Error).message\n });\n }\n }\n\n logger.info('Converted Requesty tool calls to Anthropic format', {\n toolCallCount: toolCalls.length,\n toolNames: toolCalls.map((tc: any) => tc.function.name)\n });\n }\n\n // Add text response if present\n if (rawText && rawText.trim()) {\n logger.info('Adding text content block', {\n textLength: rawText.length,\n textPreview: rawText.substring(0, 200)\n });\n contentBlocks.push({\n type: 'text',\n text: rawText\n });\n }\n\n // If no content blocks, add empty text\n if (contentBlocks.length === 0) {\n logger.warn('No content blocks found, adding empty text block');\n contentBlocks.push({\n type: 'text',\n text: rawText || ''\n });\n }\n\n logger.info('Final content blocks:', {\n blockCount: contentBlocks.length,\n blockTypes: contentBlocks.map(b => b.type)\n });\n\n const result = {\n id: openaiRes.id || `msg_${Date.now()}`,\n type: 'message',\n role: 'assistant',\n model: openaiRes.model,\n content: contentBlocks,\n stop_reason: this.mapFinishReason(choice.finish_reason),\n usage: {\n input_tokens: openaiRes.usage?.prompt_tokens || 0,\n output_tokens: openaiRes.usage?.completion_tokens || 0\n }\n };\n\n logger.info('Conversion complete, returning Anthropic response');\n return result;\n }\n\n // Takes only complete lines; forEachSseLines buffers any partial tail.\n private convertOpenAIStreamToAnthropic(chunk: string): string {\n // Convert OpenAI SSE format to Anthropic SSE format\n const lines = sseLines(chunk);\n const anthropicChunks: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n if (data === '[DONE]') {\n anthropicChunks.push('event: message_stop\\ndata: {}\\n\\n');\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n\n if (delta?.content) {\n anthropicChunks.push(\n `event: content_block_delta\\ndata: ${JSON.stringify({\n type: 'content_block_delta',\n delta: { type: 'text_delta', text: delta.content }\n })}\\n\\n`\n );\n }\n } catch (e) {\n // Ignore parse errors\n }\n }\n }\n\n return anthropicChunks.join('');\n }\n\n private extractProvider(modelId: string): string {\n // Extract provider from model ID (e.g., \"openai/gpt-4\" -> \"openai\")\n const parts = modelId.split('/');\n return parts.length > 1 ? parts[0] : '';\n }\n\n private mapFinishReason(reason?: string): string {\n const mapping: Record<string, string> = {\n 'stop': 'end_turn',\n 'length': 'max_tokens',\n 'content_filter': 'stop_sequence',\n 'function_call': 'tool_use'\n };\n return mapping[reason || 'stop'] || 'end_turn';\n }\n\n /**\n * Start listening. Binds 127.0.0.1 unless `host` or AGENTIC_FLOW_PROXY_HOST\n * says otherwise. Returns the underlying server.\n */\n public start(port: number, host: string = resolveProxyHost()): Server {\n this.server = this.app.listen(port, host, () => {\n logger.info('Anthropic to Requesty proxy started', {\n port,\n host,\n requestyBaseUrl: this.requestyBaseUrl,\n defaultModel: this.defaultModel\n });\n console.log(`\\n✅ Anthropic Proxy running at http://${host}:${port}`);\n console.log(` Requesty Base URL: ${this.requestyBaseUrl}`);\n console.log(` Default Model: ${this.defaultModel}`);\n\n if (this.capabilities?.requiresEmulation) {\n console.log(`\\n ⚙️ Tool Emulation: ${this.capabilities.emulationStrategy.toUpperCase()} pattern`);\n console.log(` 📊 Expected reliability: ${this.capabilities.emulationStrategy === 'react' ? '70-85%' : '50-70%'}`);\n }\n console.log('');\n });\n return this.server;\n }\n\n /** Stop listening. Safe to call when the proxy was never started. */\n public stop(): Promise<void> {\n const server = this.server;\n this.server = undefined;\n if (!server) return Promise.resolve();\n return new Promise((resolve, reject) => server.close(err => (err ? reject(err) : resolve())));\n }\n}\n\n// CLI entry point\nif (import.meta.url === `file://${process.argv[1]}`) {\n const port = parseInt(process.env.PORT || '3000');\n const requestyApiKey = process.env.REQUESTY_API_KEY;\n\n if (!requestyApiKey) {\n console.error('❌ Error: REQUESTY_API_KEY environment variable required');\n process.exit(1);\n }\n\n const proxy = new AnthropicToRequestyProxy({\n requestyApiKey,\n requestyBaseUrl: process.env.ANTHROPIC_PROXY_BASE_URL,\n defaultModel: process.env.COMPLETION_MODEL || process.env.REASONING_MODEL\n });\n\n proxy.start(port);\n console.log(` Proxy token (send as x-api-key / ANTHROPIC_API_KEY): ${proxy.getAuthToken()}`);\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Read `reader` to the end, calling `onLines` with text made only of complete
3
+ * lines (each ending in '\n'), then once more with any unterminated tail.
4
+ * Returns the number of reads.
5
+ */
6
+ export declare function forEachSseLines(reader: ReadableStreamDefaultReader<Uint8Array>, onLines: (lines: string) => void): Promise<number>;
7
+ /** Non-empty lines of `text`, with any trailing '\r' removed. */
8
+ export declare function sseLines(text: string): string[];
9
+ //# sourceMappingURL=sse-lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-lines.d.ts","sourceRoot":"","sources":["../../src/proxy/sse-lines.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,EAC/C,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/C"}
@@ -0,0 +1,37 @@
1
+ // Shared SSE reader for the translation proxies.
2
+ //
3
+ // A network read can end anywhere: inside a data: line, or inside a multi-byte
4
+ // UTF-8 character. Decoding each read on its own and splitting on '\n' drops
5
+ // the split line and corrupts the character. This reader decodes with
6
+ // {stream:true} and holds back a partial line until its newline arrives.
7
+ /**
8
+ * Read `reader` to the end, calling `onLines` with text made only of complete
9
+ * lines (each ending in '\n'), then once more with any unterminated tail.
10
+ * Returns the number of reads.
11
+ */
12
+ export async function forEachSseLines(reader, onLines) {
13
+ const decoder = new TextDecoder();
14
+ let pending = '';
15
+ let reads = 0;
16
+ while (true) {
17
+ const { done, value } = await reader.read();
18
+ if (done)
19
+ break;
20
+ reads++;
21
+ pending += decoder.decode(value, { stream: true });
22
+ const lastNewline = pending.lastIndexOf('\n');
23
+ if (lastNewline === -1)
24
+ continue;
25
+ onLines(pending.slice(0, lastNewline + 1));
26
+ pending = pending.slice(lastNewline + 1);
27
+ }
28
+ pending += decoder.decode();
29
+ if (pending.trim())
30
+ onLines(pending);
31
+ return reads;
32
+ }
33
+ /** Non-empty lines of `text`, with any trailing '\r' removed. */
34
+ export function sseLines(text) {
35
+ return text.split('\n').map(line => line.replace(/\r$/, '')).filter(line => line.trim());
36
+ }
37
+ //# sourceMappingURL=sse-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-lines.js","sourceRoot":"","sources":["../../src/proxy/sse-lines.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,sEAAsE;AACtE,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA+C,EAC/C,OAAgC;IAEhC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,KAAK,EAAE,CAAC;QAER,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,WAAW,KAAK,CAAC,CAAC;YAAE,SAAS;QACjC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3F,CAAC","sourcesContent":["// Shared SSE reader for the translation proxies.\n//\n// A network read can end anywhere: inside a data: line, or inside a multi-byte\n// UTF-8 character. Decoding each read on its own and splitting on '\\n' drops\n// the split line and corrupts the character. This reader decodes with\n// {stream:true} and holds back a partial line until its newline arrives.\n\n/**\n * Read `reader` to the end, calling `onLines` with text made only of complete\n * lines (each ending in '\\n'), then once more with any unterminated tail.\n * Returns the number of reads.\n */\nexport async function forEachSseLines(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n onLines: (lines: string) => void\n): Promise<number> {\n const decoder = new TextDecoder();\n let pending = '';\n let reads = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n reads++;\n\n pending += decoder.decode(value, { stream: true });\n const lastNewline = pending.lastIndexOf('\\n');\n if (lastNewline === -1) continue;\n onLines(pending.slice(0, lastNewline + 1));\n pending = pending.slice(lastNewline + 1);\n }\n\n pending += decoder.decode();\n if (pending.trim()) onLines(pending);\n return reads;\n}\n\n/** Non-empty lines of `text`, with any trailing '\\r' removed. */\nexport function sseLines(text: string): string[] {\n return text.split('\\n').map(line => line.replace(/\\r$/, '')).filter(line => line.trim());\n}\n"]}
@@ -21,7 +21,8 @@ export { consolidate, shouldConsolidate } from './core/consolidate.js';
21
21
  export type { ConsolidationResult } from './core/consolidate.js';
22
22
  export { mattsParallel, mattsSequential } from './core/matts.js';
23
23
  export type { MattsResult } from './core/matts.js';
24
- export { computeEmbedding, clearEmbeddingCache, isSemanticEmbedding } from './utils/embeddings.js';
24
+ export { computeEmbedding, clearEmbeddingCache, isSemanticEmbedding, getEmbeddingKind, resetEmbeddingBackend, } from './utils/embeddings.js';
25
+ export type { EmbeddingKind } from './utils/embeddings.js';
25
26
  export { mmrSelection, cosineSimilarity } from './utils/mmr.js';
26
27
  export { scrubPII, containsPII, scrubMemory } from './utils/pii-scrubber.js';
27
28
  export { loadConfig } from './utils/config.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,mCAAmC,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EACL,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,CAAC;AACd,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,cAAc,EACf,MAAM,gBAAgB,CAAC;AASxB,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BhD;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9C,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,GAAG,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CA6BD;AAED,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,SAAS,wCAAwC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,mCAAmC,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EACL,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,CAAC;AACd,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,cAAc,EACf,MAAM,gBAAgB,CAAC;AASxB,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BhD;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9C,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,GAAG,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CA6BD;AAED,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,SAAS,wCAAwC,CAAC"}
@@ -18,7 +18,7 @@ export { judgeTrajectory } from './core/judge.js';
18
18
  export { distillMemories } from './core/distill.js';
19
19
  export { consolidate, shouldConsolidate } from './core/consolidate.js';
20
20
  export { mattsParallel, mattsSequential } from './core/matts.js';
21
- export { computeEmbedding, clearEmbeddingCache, isSemanticEmbedding } from './utils/embeddings.js';
21
+ export { computeEmbedding, clearEmbeddingCache, isSemanticEmbedding, getEmbeddingKind, resetEmbeddingBackend, } from './utils/embeddings.js';
22
22
  export { mmrSelection, cosineSimilarity } from './utils/mmr.js';
23
23
  export { scrubPII, containsPII, scrubMemory } from './utils/pii-scrubber.js';
24
24
  export { loadConfig } from './utils/config.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ReasoningBank - Closed-loop memory system for AI agents\n * Based on arXiv:2509.25140 (Google DeepMind)\n *\n * @since v1.7.0 - Integrated AgentDB for optimal performance\n */\n\n// Apply AgentDB runtime patch before any AgentDB imports\nimport '../utils/agentdb-runtime-patch.js';\n\n// New hybrid backend (recommended for new code)\nexport { HybridReasoningBank } from './HybridBackend.js';\nexport { HybridReasoningBank as ReasoningBank } from './HybridBackend.js'; // Alias for backwards compat\nexport { AdvancedMemorySystem } from './AdvancedMemory.js';\nexport type { PatternData, RetrievalOptions, CausalInsight } from './HybridBackend.js';\nexport type { FailureAnalysis, SkillComposition } from './AdvancedMemory.js';\n\n// Re-export AgentDB controllers for advanced usage\nexport {\n ReflexionMemory,\n SkillLibrary,\n CausalMemoryGraph,\n CausalRecall,\n NightlyLearner,\n EmbeddingService\n} from 'agentdb';\n\n// Original ReasoningBank implementations (backwards compatibility)\nexport { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';\nexport type { RetrievedMemory } from './core/retrieve.js';\n\nexport { judgeTrajectory } from './core/judge.js';\nexport type { Verdict } from './core/judge.js';\n\nexport { distillMemories } from './core/distill.js';\nexport type { DistilledMemory } from './core/distill.js';\n\nexport { consolidate, shouldConsolidate } from './core/consolidate.js';\nexport type { ConsolidationResult } from './core/consolidate.js';\n\nexport { mattsParallel, mattsSequential } from './core/matts.js';\nexport type { MattsResult } from './core/matts.js';\n\nexport { computeEmbedding, clearEmbeddingCache, isSemanticEmbedding } from './utils/embeddings.js';\nexport { mmrSelection, cosineSimilarity } from './utils/mmr.js';\nexport { scrubPII, containsPII, scrubMemory } from './utils/pii-scrubber.js';\nexport { loadConfig } from './utils/config.js';\n\n// Re-export database utilities\nimport * as db from './db/queries.js';\nexport { db };\nexport type {\n ReasoningMemory,\n PatternEmbedding,\n PatternLink,\n TaskTrajectory,\n MattsRun,\n ConsolidationRun,\n Trajectory,\n TrajectoryStep\n} from './db/schema.js';\n\n// Original functions (backwards compatibility)\nimport { loadConfig } from './utils/config.js';\nimport { retrieveMemories } from './core/retrieve.js';\nimport { judgeTrajectory } from './core/judge.js';\nimport { distillMemories } from './core/distill.js';\nimport { shouldConsolidate as shouldCons, consolidate as cons } from './core/consolidate.js';\n\nexport async function initialize(): Promise<void> {\n const config = loadConfig();\n console.error('[ReasoningBank] Initializing...');\n console.error('[ReasoningBank] Enabled: true (initializing...)');\n console.error(`[ReasoningBank] Database: ${process.env.CLAUDE_FLOW_DB_PATH || '.swarm/memory.db'}`);\n console.error(`[ReasoningBank] Embeddings: ${config.embeddings.provider}`);\n console.error(`[ReasoningBank] Retrieval k: ${config.retrieve.k}`);\n\n try {\n await db.runMigrations();\n console.error(`[ReasoningBank] Database migrated successfully`);\n } catch (error) {\n console.error('[ReasoningBank] Migration error:', error);\n throw new Error('ReasoningBank initialization failed: could not run migrations');\n }\n\n try {\n const dbConn = db.getDb();\n const tables = dbConn.prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'pattern%'\").all();\n console.error(`[ReasoningBank] Database OK: ${tables.length} tables found`);\n } catch (error) {\n console.error('[ReasoningBank] Database error:', error);\n throw new Error('ReasoningBank initialization failed: database not accessible');\n }\n\n console.error('[ReasoningBank] Initialization complete');\n}\n\nexport async function runTask(options: {\n taskId: string;\n agentId: string;\n query: string;\n domain?: string;\n executeFn: (memories: any[]) => Promise<any>;\n}): Promise<{\n verdict: any;\n usedMemories: any[];\n newMemories: string[];\n consolidated: boolean;\n}> {\n console.error(`[ReasoningBank] Running task: ${options.taskId}`);\n const memories = await retrieveMemories(options.query, {\n domain: options.domain,\n agent: options.agentId\n });\n console.error(`[ReasoningBank] Retrieved ${memories.length} memories`);\n const trajectory = await options.executeFn(memories);\n const verdict = await judgeTrajectory(trajectory, options.query);\n console.error(`[ReasoningBank] Verdict: ${verdict.label} (${verdict.confidence})`);\n // Close the loop: the memories this task used share its outcome.\n db.applyOutcomeToMemories(\n memories.map(m => m.id),\n verdict.label === 'Success',\n verdict.confidence\n );\n const newMemories = await distillMemories(trajectory, verdict, options.query, {\n taskId: options.taskId,\n agentId: options.agentId,\n domain: options.domain\n });\n console.error(`[ReasoningBank] Distilled ${newMemories.length} new memories`);\n let consolidated = false;\n if (shouldCons()) {\n console.error('[ReasoningBank] Running consolidation...');\n await cons();\n consolidated = true;\n }\n return { verdict, usedMemories: memories, newMemories, consolidated };\n}\n\nexport const VERSION = '1.7.1';\nexport const PAPER_URL = 'https://arxiv.org/html/2509.25140v1';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yDAAyD;AACzD,OAAO,mCAAmC,CAAC;AAE3C,gDAAgD;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC,CAAE,6BAA6B;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI3D,mDAAmD;AACnD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,mEAAmE;AACnE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG/E,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGjE,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,+BAA+B;AAC/B,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,CAAC;AAYd,+CAA+C;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,IAAI,UAAU,EAAE,WAAW,IAAI,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7F,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,6BAA6B,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,kBAAkB,EAAE,CAAC,CAAC;IACpG,OAAO,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC,GAAG,EAAE,CAAC;QAClH,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,eAAe,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAM7B;IAMC,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE;QACrD,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,OAAO;KACvB,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,4BAA4B,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC;IACnF,iEAAiE;IACjE,EAAE,CAAC,sBAAsB,CACvB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACvB,OAAO,CAAC,KAAK,KAAK,SAAS,EAC3B,OAAO,CAAC,UAAU,CACnB,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE;QAC5E,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,6BAA6B,WAAW,CAAC,MAAM,eAAe,CAAC,CAAC;IAC9E,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,MAAM,IAAI,EAAE,CAAC;QACb,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,SAAS,GAAG,qCAAqC,CAAC","sourcesContent":["/**\n * ReasoningBank - Closed-loop memory system for AI agents\n * Based on arXiv:2509.25140 (Google DeepMind)\n *\n * @since v1.7.0 - Integrated AgentDB for optimal performance\n */\n\n// Apply AgentDB runtime patch before any AgentDB imports\nimport '../utils/agentdb-runtime-patch.js';\n\n// New hybrid backend (recommended for new code)\nexport { HybridReasoningBank } from './HybridBackend.js';\nexport { HybridReasoningBank as ReasoningBank } from './HybridBackend.js'; // Alias for backwards compat\nexport { AdvancedMemorySystem } from './AdvancedMemory.js';\nexport type { PatternData, RetrievalOptions, CausalInsight } from './HybridBackend.js';\nexport type { FailureAnalysis, SkillComposition } from './AdvancedMemory.js';\n\n// Re-export AgentDB controllers for advanced usage\nexport {\n ReflexionMemory,\n SkillLibrary,\n CausalMemoryGraph,\n CausalRecall,\n NightlyLearner,\n EmbeddingService\n} from 'agentdb';\n\n// Original ReasoningBank implementations (backwards compatibility)\nexport { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';\nexport type { RetrievedMemory } from './core/retrieve.js';\n\nexport { judgeTrajectory } from './core/judge.js';\nexport type { Verdict } from './core/judge.js';\n\nexport { distillMemories } from './core/distill.js';\nexport type { DistilledMemory } from './core/distill.js';\n\nexport { consolidate, shouldConsolidate } from './core/consolidate.js';\nexport type { ConsolidationResult } from './core/consolidate.js';\n\nexport { mattsParallel, mattsSequential } from './core/matts.js';\nexport type { MattsResult } from './core/matts.js';\n\nexport {\n computeEmbedding,\n clearEmbeddingCache,\n isSemanticEmbedding,\n getEmbeddingKind,\n resetEmbeddingBackend,\n} from './utils/embeddings.js';\nexport type { EmbeddingKind } from './utils/embeddings.js';\nexport { mmrSelection, cosineSimilarity } from './utils/mmr.js';\nexport { scrubPII, containsPII, scrubMemory } from './utils/pii-scrubber.js';\nexport { loadConfig } from './utils/config.js';\n\n// Re-export database utilities\nimport * as db from './db/queries.js';\nexport { db };\nexport type {\n ReasoningMemory,\n PatternEmbedding,\n PatternLink,\n TaskTrajectory,\n MattsRun,\n ConsolidationRun,\n Trajectory,\n TrajectoryStep\n} from './db/schema.js';\n\n// Original functions (backwards compatibility)\nimport { loadConfig } from './utils/config.js';\nimport { retrieveMemories } from './core/retrieve.js';\nimport { judgeTrajectory } from './core/judge.js';\nimport { distillMemories } from './core/distill.js';\nimport { shouldConsolidate as shouldCons, consolidate as cons } from './core/consolidate.js';\n\nexport async function initialize(): Promise<void> {\n const config = loadConfig();\n console.error('[ReasoningBank] Initializing...');\n console.error('[ReasoningBank] Enabled: true (initializing...)');\n console.error(`[ReasoningBank] Database: ${process.env.CLAUDE_FLOW_DB_PATH || '.swarm/memory.db'}`);\n console.error(`[ReasoningBank] Embeddings: ${config.embeddings.provider}`);\n console.error(`[ReasoningBank] Retrieval k: ${config.retrieve.k}`);\n\n try {\n await db.runMigrations();\n console.error(`[ReasoningBank] Database migrated successfully`);\n } catch (error) {\n console.error('[ReasoningBank] Migration error:', error);\n throw new Error('ReasoningBank initialization failed: could not run migrations');\n }\n\n try {\n const dbConn = db.getDb();\n const tables = dbConn.prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'pattern%'\").all();\n console.error(`[ReasoningBank] Database OK: ${tables.length} tables found`);\n } catch (error) {\n console.error('[ReasoningBank] Database error:', error);\n throw new Error('ReasoningBank initialization failed: database not accessible');\n }\n\n console.error('[ReasoningBank] Initialization complete');\n}\n\nexport async function runTask(options: {\n taskId: string;\n agentId: string;\n query: string;\n domain?: string;\n executeFn: (memories: any[]) => Promise<any>;\n}): Promise<{\n verdict: any;\n usedMemories: any[];\n newMemories: string[];\n consolidated: boolean;\n}> {\n console.error(`[ReasoningBank] Running task: ${options.taskId}`);\n const memories = await retrieveMemories(options.query, {\n domain: options.domain,\n agent: options.agentId\n });\n console.error(`[ReasoningBank] Retrieved ${memories.length} memories`);\n const trajectory = await options.executeFn(memories);\n const verdict = await judgeTrajectory(trajectory, options.query);\n console.error(`[ReasoningBank] Verdict: ${verdict.label} (${verdict.confidence})`);\n // Close the loop: the memories this task used share its outcome.\n db.applyOutcomeToMemories(\n memories.map(m => m.id),\n verdict.label === 'Success',\n verdict.confidence\n );\n const newMemories = await distillMemories(trajectory, verdict, options.query, {\n taskId: options.taskId,\n agentId: options.agentId,\n domain: options.domain\n });\n console.error(`[ReasoningBank] Distilled ${newMemories.length} new memories`);\n let consolidated = false;\n if (shouldCons()) {\n console.error('[ReasoningBank] Running consolidation...');\n await cons();\n consolidated = true;\n }\n return { verdict, usedMemories: memories, newMemories, consolidated };\n}\n\nexport const VERSION = '1.7.1';\nexport const PAPER_URL = 'https://arxiv.org/html/2509.25140v1';\n"]}
@@ -5,6 +5,12 @@
5
5
  * Logs go to stderr so that stdout stays clean for callers that pipe
6
6
  * structured output (CLIs, MCP stdio servers).
7
7
  */
8
+ /**
9
+ * The space every vector in this process belongs to. Set by the first
10
+ * embedding and kept until resetEmbeddingBackend(): model vectors and hash
11
+ * vectors are not comparable, so a process never mixes them (issue #246).
12
+ */
13
+ export type EmbeddingKind = 'local' | 'hash';
8
14
  /**
9
15
  * True when embeddings come from the transformer model; false when they come
10
16
  * from the deterministic hash fallback, whose vectors carry no semantic
@@ -12,6 +18,17 @@
12
18
  * model.
13
19
  */
14
20
  export declare function isSemanticEmbedding(): boolean;
21
+ /**
22
+ * The space this process's embeddings are in, or null before the first one.
23
+ * Vectors of different kinds must never be compared.
24
+ */
25
+ export declare function getEmbeddingKind(): EmbeddingKind | null;
26
+ /**
27
+ * Forget the backend choice and the cache, so the next embedding tries to load
28
+ * the model again. Vectors produced before the reset may be in a different
29
+ * space from those produced after it; re-embed anything you keep.
30
+ */
31
+ export declare function resetEmbeddingBackend(): void;
15
32
  /**
16
33
  * Compute embedding for text using local model
17
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/reasoningbank/utils/embeddings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8FH;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8B1E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA8CpF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AA+CD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/reasoningbank/utils/embeddings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyBH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAyE7C;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAK5C;AAkBD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA4B1E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA6CpF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AA+CD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
@@ -24,6 +24,7 @@ const CACHE_MAX_ENTRIES = 1000;
24
24
  const BATCH_CHUNK_SIZE = 32;
25
25
  let embeddingPipeline = null;
26
26
  let initializationPromise = null;
27
+ let embeddingKind = null;
27
28
  const embeddingCache = new Map();
28
29
  function cacheGet(key) {
29
30
  const entry = embeddingCache.get(key);
@@ -72,8 +73,9 @@ async function initializeEmbeddings() {
72
73
  catch (error) {
73
74
  console.error('[Embeddings] Failed to initialize:', error?.message || error);
74
75
  console.error('[Embeddings] Falling back to hash-based embeddings (not semantic)');
75
- // Reset promise so retry is possible
76
- initializationPromise = null;
76
+ // No automatic retry: a later successful load would put new vectors in a
77
+ // different space from the hash vectors already handed out. Call
78
+ // resetEmbeddingBackend() to try the model again.
77
79
  }
78
80
  })();
79
81
  return initializationPromise;
@@ -85,20 +87,50 @@ async function initializeEmbeddings() {
85
87
  * model.
86
88
  */
87
89
  export function isSemanticEmbedding() {
88
- return embeddingPipeline !== null;
90
+ return embeddingKind === 'local' || (embeddingKind === null && embeddingPipeline !== null);
91
+ }
92
+ /**
93
+ * The space this process's embeddings are in, or null before the first one.
94
+ * Vectors of different kinds must never be compared.
95
+ */
96
+ export function getEmbeddingKind() {
97
+ return embeddingKind;
98
+ }
99
+ /**
100
+ * Forget the backend choice and the cache, so the next embedding tries to load
101
+ * the model again. Vectors produced before the reset may be in a different
102
+ * space from those produced after it; re-embed anything you keep.
103
+ */
104
+ export function resetEmbeddingBackend() {
105
+ embeddingPipeline = null;
106
+ initializationPromise = null;
107
+ embeddingKind = null;
108
+ embeddingCache.clear();
109
+ }
110
+ /** Fix the process to one space on first use; refuse to switch afterwards. */
111
+ function commitKind(kind) {
112
+ if (embeddingKind === null)
113
+ embeddingKind = kind;
114
+ else if (embeddingKind !== kind) {
115
+ throw new Error(`[Embeddings] refusing to produce a ${kind} vector: this process already embeds with ${embeddingKind}`);
116
+ }
117
+ }
118
+ function modelFailure(error) {
119
+ return new Error(`[Embeddings] model failed (${error?.message || error}); not substituting a hash vector, which would not be comparable with the model vectors already produced`);
89
120
  }
90
121
  /**
91
122
  * Compute embedding for text using local model
92
123
  */
93
124
  export async function computeEmbedding(text) {
94
- const cached = cacheGet(`local:${text}`) ?? cacheGet(`hash:${text}`);
125
+ const cached = cacheGet(text);
95
126
  if (cached)
96
127
  return cached;
97
- // Initialize if needed
98
- await initializeEmbeddings();
128
+ // A process already in the hash space stays there; don't load the model.
129
+ if (embeddingKind !== 'hash')
130
+ await initializeEmbeddings();
99
131
  let embedding;
100
- let kind = 'local';
101
132
  if (embeddingPipeline) {
133
+ commitKind('local');
102
134
  try {
103
135
  const output = await embeddingPipeline(text, {
104
136
  pooling: 'mean',
@@ -108,16 +140,15 @@ export async function computeEmbedding(text) {
108
140
  }
109
141
  catch (error) {
110
142
  console.error('[Embeddings] Generation failed:', error?.message || error);
111
- embedding = hashEmbed(text, MODEL_DIMS);
112
- kind = 'hash';
143
+ throw modelFailure(error);
113
144
  }
114
145
  }
115
146
  else {
147
+ commitKind('hash');
116
148
  const dims = loadConfig()?.embeddings?.dimensions || MODEL_DIMS;
117
149
  embedding = hashEmbed(text, dims);
118
- kind = 'hash';
119
150
  }
120
- cacheSet(`${kind}:${text}`, embedding, cacheTtlSeconds());
151
+ cacheSet(text, embedding, cacheTtlSeconds());
121
152
  return embedding;
122
153
  }
123
154
  /**
@@ -125,14 +156,16 @@ export async function computeEmbedding(text) {
125
156
  * per chunk of texts rather than one call per text.
126
157
  */
127
158
  export async function computeEmbeddingBatch(texts) {
128
- await initializeEmbeddings();
159
+ if (embeddingKind !== 'hash')
160
+ await initializeEmbeddings();
129
161
  if (!embeddingPipeline) {
130
162
  return Promise.all(texts.map(text => computeEmbedding(text)));
131
163
  }
164
+ commitKind('local');
132
165
  const results = new Array(texts.length);
133
166
  const missing = new Map(); // text -> result indices
134
167
  texts.forEach((text, i) => {
135
- const cached = cacheGet(`local:${text}`);
168
+ const cached = cacheGet(text);
136
169
  if (cached) {
137
170
  results[i] = cached;
138
171
  return;
@@ -148,7 +181,6 @@ export async function computeEmbeddingBatch(texts) {
148
181
  for (let start = 0; start < uniqueTexts.length; start += BATCH_CHUNK_SIZE) {
149
182
  const chunk = uniqueTexts.slice(start, start + BATCH_CHUNK_SIZE);
150
183
  let vectors;
151
- let kind = 'local';
152
184
  try {
153
185
  const output = await embeddingPipeline(chunk, { pooling: 'mean', normalize: true });
154
186
  const dims = output.dims[output.dims.length - 1];
@@ -157,11 +189,10 @@ export async function computeEmbeddingBatch(texts) {
157
189
  }
158
190
  catch (error) {
159
191
  console.error('[Embeddings] Batch generation failed:', error?.message || error);
160
- vectors = chunk.map(text => hashEmbed(text, MODEL_DIMS));
161
- kind = 'hash';
192
+ throw modelFailure(error);
162
193
  }
163
194
  chunk.forEach((text, j) => {
164
- cacheSet(`${kind}:${text}`, vectors[j], ttl);
195
+ cacheSet(text, vectors[j], ttl);
165
196
  for (const i of missing.get(text))
166
197
  results[i] = vectors[j];
167
198
  });