@mcpjam/inspector 0.9.54 → 0.9.55
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.
- package/dist/server/index.js +29 -18
- package/dist/server/index.js.map +1 -1
- package/package.json +3 -2
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/index.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/routes/mcp/servers.ts","../../server/routes/mcp/tools.ts","../../server/routes/mcp/resources.ts","../../server/routes/mcp/prompts.ts","../../server/routes/mcp/chat.ts","../../client/src/lib/chat-utils.ts","../../server/utils/chat-helpers.ts","../../shared/tools.ts","../../shared/http-tool-calls.ts","../../server/routes/mcp/tests.ts","../../server/utils/mcp-utils.ts","../../server/routes/mcp/oauth.ts","../../server/routes/mcp/export.ts","../../server/routes/mcp/interceptor.ts","../../server/services/interceptor-store.ts","../../server/routes/mcp/http-adapters.ts","../../server/services/mcp-http-bridge.ts","../../server/services/mcpjam-client-manager.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport dotenv from \"dotenv\";\nimport fixPath from \"fix-path\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { logger } from \"hono/logger\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\n// ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n};\n\n// Utility function to create a boxed console output\nfunction logBox(content: string, title?: string) {\n const lines = content.split(\"\\n\");\n const maxLength = Math.max(...lines.map((line) => line.length));\n const width = maxLength + 4;\n\n console.log(\"┌\" + \"─\".repeat(width) + \"┐\");\n if (title) {\n const titlePadding = Math.floor((width - title.length - 2) / 2);\n console.log(\n \"│\" +\n \" \".repeat(titlePadding) +\n title +\n \" \".repeat(width - title.length - titlePadding) +\n \"│\",\n );\n console.log(\"├\" + \"─\".repeat(width) + \"┤\");\n }\n\n lines.forEach((line) => {\n const padding = width - line.length - 2;\n console.log(\"│ \" + line + \" \".repeat(padding) + \" │\");\n });\n\n console.log(\"└\" + \"─\".repeat(width) + \"┘\");\n}\n\n// Import routes and services\nimport mcpRoutes from \"./routes/mcp/index\";\nimport { interceptorStore } from \"./services/interceptor-store\";\nimport { MCPJamClientManager } from \"./services/mcpjam-client-manager\";\nimport \"./types/hono\"; // Type extensions\n\n// Utility function to extract MCP server config from environment variables\nfunction getMCPConfigFromEnv() {\n // First check if we have a full config file\n const configData = process.env.MCP_CONFIG_DATA;\n if (configData) {\n try {\n const config = JSON.parse(configData);\n console.log(\"Parsed config data:\", config);\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n // Transform the config to match client expectations\n const servers = Object.entries(config.mcpServers).map(\n ([name, serverConfig]: [string, any]) => ({\n name,\n type: serverConfig.type || \"stdio\", // Default to stdio if not specified\n command: serverConfig.command,\n args: serverConfig.args || [],\n env: serverConfig.env || {},\n url: serverConfig.url, // For SSE/HTTP connections\n }),\n );\n console.log(\"Transformed servers:\", servers);\n\n // Check for auto-connect server filter\n const autoConnectServer = process.env.MCP_AUTO_CONNECT_SERVER;\n console.log(\n \"Auto-connect server filter:\",\n autoConnectServer || \"none (connect to all)\",\n );\n\n return {\n servers,\n autoConnectServer: autoConnectServer || null,\n };\n }\n } catch (error) {\n console.error(\"Failed to parse MCP_CONFIG_DATA:\", error);\n }\n }\n\n // Fall back to legacy single server mode\n const command = process.env.MCP_SERVER_COMMAND;\n if (!command) {\n return null;\n }\n\n const argsString = process.env.MCP_SERVER_ARGS;\n const args = argsString ? JSON.parse(argsString) : [];\n\n return {\n servers: [\n {\n command,\n args,\n name: \"CLI Server\", // Default name for CLI-provided servers\n env: {},\n },\n ],\n };\n}\n\n// Ensure PATH is initialized from the user's shell so spawned processes can find binaries (e.g., npx)\ntry {\n fixPath();\n} catch {}\n\nconst app = new Hono();\n\n// Load environment variables early so route handlers can read CONVEX_HTTP_URL\ntry {\n const envFile =\n process.env.NODE_ENV === \"production\"\n ? \".env.production\"\n : \".env.development\";\n dotenv.config({ path: envFile });\n if (!process.env.CONVEX_HTTP_URL) {\n dotenv.config();\n }\n} catch (error) {\n console.warn(\"[startup] Failed loading env files\", error);\n}\n\n// Initialize centralized MCPJam Client Manager\nconst mcpJamClientManager = new MCPJamClientManager();\n\n// Middleware to inject client manager into context\napp.use(\"*\", async (c, next) => {\n c.mcpJamClientManager = mcpJamClientManager;\n await next();\n});\n\n// Middleware\napp.use(\"*\", logger());\n// Dynamic CORS origin based on PORT environment variable\nconst serverPort = process.env.PORT || \"3001\";\nconst corsOrigins = [\n `http://localhost:${serverPort}`,\n \"http://localhost:3000\", // Keep for frontend development\n];\n\napp.use(\n \"*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n);\n\n// API Routes\napp.route(\"/api/mcp\", mcpRoutes);\n\n// Fallback for clients that post to \"/sse/message\" instead of the rewritten proxy messages URL.\n// We resolve the upstream messages endpoint via sessionId and forward with any injected auth.\n// CORS preflight\napp.options(\"/sse/message\", (c) => {\n return c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"POST,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Max-Age\": \"86400\",\n Vary: \"Origin, Access-Control-Request-Headers\",\n });\n});\n\napp.post(\"/sse/message\", async (c) => {\n try {\n const url = new URL(c.req.url);\n const sessionId =\n url.searchParams.get(\"sessionId\") || url.searchParams.get(\"sid\") || \"\";\n if (!sessionId) {\n return c.json({ error: \"Missing sessionId\" }, 400);\n }\n const mapping = interceptorStore.getSessionMapping(sessionId);\n if (!mapping) {\n return c.json({ error: \"Unknown sessionId\" }, 404);\n }\n const entry = interceptorStore.get(mapping.interceptorId);\n if (!entry) {\n return c.json({ error: \"Interceptor not found\" }, 404);\n }\n\n // Read body as text (JSON-RPC envelope) and forward\n let bodyText = \"\";\n try {\n bodyText = await c.req.text();\n } catch {}\n const headers = new Headers();\n c.req.raw.headers.forEach((v, k) => {\n const key = k.toLowerCase();\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"host\",\n \"content-length\",\n ].includes(key)\n )\n return;\n headers.set(k, v);\n });\n if (entry.injectHeaders) {\n for (const [k, v] of Object.entries(entry.injectHeaders)) {\n const key = k.toLowerCase();\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"host\",\n \"content-length\",\n ].includes(key)\n )\n continue;\n if (key === \"authorization\" && headers.has(\"authorization\")) continue;\n headers.set(k, v);\n }\n }\n // Forward to upstream messages endpoint\n try {\n await fetch(\n new Request(mapping.url, { method: \"POST\", headers, body: bodyText }),\n );\n } catch {}\n // Per spec semantics, reply 202 regardless (response arrives via SSE)\n return c.body(\"Accepted\", 202, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n } catch (e: any) {\n return c.body(\n JSON.stringify({ error: e?.message || \"Forward error\" }),\n 400,\n {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n },\n );\n }\n});\n\n// Health check\napp.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", timestamp: new Date().toISOString() });\n});\n\n// API endpoint to get MCP CLI config (for development mode)\napp.get(\"/api/mcp-cli-config\", (c) => {\n const mcpConfig = getMCPConfigFromEnv();\n return c.json({ config: mcpConfig });\n});\n\n// Static file serving (for production)\nif (process.env.NODE_ENV === \"production\") {\n // Serve public assets (logos, etc.) at root level\n app.use(\"/*.png\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.svg\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.jpg\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.jpeg\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.ico\", serveStatic({ root: \"./public\" }));\n\n // Serve static assets (JS, CSS, images, etc.)\n app.use(\"/*\", serveStatic({ root: \"./dist/client\" }));\n\n // SPA fallback - serve index.html for all non-API routes\n app.get(\"*\", async (c) => {\n const path = c.req.path;\n // Don't intercept API routes\n if (path.startsWith(\"/api/\")) {\n return c.notFound();\n }\n // Return index.html for SPA routes\n const indexPath = join(process.cwd(), \"dist\", \"client\", \"index.html\");\n let htmlContent = readFileSync(indexPath, \"utf-8\");\n\n // Inject MCP server config if provided via CLI\n const mcpConfig = getMCPConfigFromEnv();\n if (mcpConfig) {\n const configScript = `<script>window.MCP_CLI_CONFIG = ${JSON.stringify(mcpConfig)};</script>`;\n htmlContent = htmlContent.replace(\"</head>\", `${configScript}</head>`);\n }\n\n return c.html(htmlContent);\n });\n} else {\n // Development mode - just API\n app.get(\"/\", (c) => {\n return c.json({\n message: \"MCPJam API Server\",\n environment: \"development\",\n frontend: `http://localhost:${serverPort}`,\n });\n });\n}\n\nconst port = parseInt(process.env.PORT || \"3001\");\n\n// Default to localhost unless explicitly running in production\nconst hostname =\n process.env.NODE_ENV === \"production\" ? \"127.0.0.1\" : \"localhost\";\nlogBox(`http://${hostname}:${port}`, \"🚀 Inspector Launched\");\n\n// Graceful shutdown handling\nconst server = serve({\n fetch: app.fetch,\n port,\n hostname: \"0.0.0.0\", // Bind to all interfaces for Docker\n});\n\n// Handle graceful shutdown\nprocess.on(\"SIGINT\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nexport default app;\n","import { Hono } from \"hono\";\nimport connect from \"./connect\";\nimport servers from \"./servers\";\nimport tools from \"./tools\";\nimport resources from \"./resources\";\nimport prompts from \"./prompts\";\nimport chat from \"./chat\";\nimport tests from \"./tests.ts\";\nimport oauth from \"./oauth\";\nimport exporter from \"./export\";\nimport interceptor from \"./interceptor\";\nimport { adapterHttp, managerHttp } from \"./http-adapters\";\n\nconst mcp = new Hono();\n\n// Health check\nmcp.get(\"/health\", (c) => {\n return c.json({\n service: \"MCP API\",\n status: \"ready\",\n timestamp: new Date().toISOString(),\n });\n});\n\n// Chat endpoint - REAL IMPLEMENTATION\nmcp.route(\"/chat\", chat);\n\n// Connect endpoint - REAL IMPLEMENTATION\nmcp.route(\"/connect\", connect);\n\n// Servers management endpoints - REAL IMPLEMENTATION\nmcp.route(\"/servers\", servers);\n\n// Tools endpoint - REAL IMPLEMENTATION\nmcp.route(\"/tools\", tools);\n\n// Tests endpoint - generate per-test agents\nmcp.route(\"/tests\", tests);\n\n// Resources endpoints - REAL IMPLEMENTATION\nmcp.route(\"/resources\", resources);\n\n// Prompts endpoints - REAL IMPLEMENTATION\nmcp.route(\"/prompts\", prompts);\n\n// OAuth proxy endpoints\nmcp.route(\"/oauth\", oauth);\n\n// Export endpoints - REAL IMPLEMENTATION\nmcp.route(\"/export\", exporter);\n\n// Interceptor endpoints - create proxy and stream logs\nmcp.route(\"/interceptor\", interceptor);\n\n// Unified HTTP bridges (SSE + POST) for connected servers\nmcp.route(\"/adapter-http\", adapterHttp);\nmcp.route(\"/manager-http\", managerHttp);\n\nexport default mcp;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst connect = new Hono();\n\nconnect.post(\"/\", async (c) => {\n try {\n const { serverConfig, serverId } = await c.req.json();\n\n if (!serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverConfig is required\",\n },\n 400,\n );\n }\n\n if (!serverId) {\n return c.json(\n {\n success: false,\n error: \"serverId is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n try {\n await mcpClientManager.connectToServer(serverId, serverConfig);\n const status = mcpClientManager.getConnectionStatus(serverId);\n if (status === \"connected\") {\n return c.json({\n success: true,\n status: \"connected\",\n });\n } else {\n return c.json(\n {\n success: false,\n error: \"Connection failed\",\n status,\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `MCP configuration is invalid. Please double check your server configuration: ${JSON.stringify(serverConfig)}`,\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: \"Failed to parse request body\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 400,\n );\n }\n});\n\nexport default connect;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst servers = new Hono();\n\n// List all connected servers with their status\nservers.get(\"/\", async (c) => {\n try {\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get all server configurations and statuses\n const connectedServers = mcpJamClientManager.getConnectedServers();\n\n const serverList = Object.entries(connectedServers).map(\n ([serverId, serverInfo]) => ({\n id: serverId,\n name: serverId,\n status: serverInfo.status,\n config: serverInfo.config,\n }),\n );\n\n return c.json({\n success: true,\n servers: serverList,\n });\n } catch (error) {\n console.error(\"Error listing servers:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get status for a specific server\nservers.get(\"/status/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n });\n } catch (error) {\n console.error(\"Error getting server status:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Disconnect from a server\nservers.delete(\"/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n await mcpJamClientManager.disconnectFromServer(serverId);\n\n return c.json({\n success: true,\n message: `Disconnected from server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error disconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Reconnect to a server\nservers.post(\"/reconnect\", async (c) => {\n try {\n const { serverId, serverConfig } = await c.req.json();\n\n if (!serverId || !serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverId and serverConfig are required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Disconnect first, then reconnect\n await mcpJamClientManager.disconnectFromServer(serverId);\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n message: `Reconnected to server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error reconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default servers;\n","import { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport \"../../types/hono\"; // Type extensions\n\nconst tools = new Hono();\n\ntype ElicitationEvent = {\n requestId: string;\n message: string;\n schema: any;\n toolName: string;\n timestamp: string;\n};\n\ntype ExecutionState = {\n id: string;\n serverId: string;\n toolName: string;\n execPromise: Promise<{ result: any }>;\n completed: boolean;\n result?: { result: any };\n error?: any;\n queue: ElicitationEvent[];\n waiters: Array<(ev: ElicitationEvent) => void>;\n};\n\nlet activeExecution: ExecutionState | null = null;\n\nfunction nowIso() {\n return new Date().toISOString();\n}\n\nfunction takeNextElicitation(state: ExecutionState): Promise<ElicitationEvent> {\n if (state.queue.length > 0) {\n return Promise.resolve(state.queue.shift()!);\n }\n return new Promise((resolve) => {\n state.waiters.push(resolve);\n });\n}\n\n// POST /list — return tools as JSON (no SSE)\ntools.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n const mcp = c.mcpJamClientManager;\n const status = mcp.getConnectionStatus(serverId);\n if (status !== \"connected\") {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n const flattenedTools = await mcp.getToolsetsForServer(serverId);\n\n const toolsWithJsonSchema: Record<string, any> = {};\n for (const [name, tool] of Object.entries(flattenedTools)) {\n let inputSchema = (tool as any).inputSchema;\n try {\n inputSchema = zodToJsonSchema(inputSchema as z.ZodType<any>);\n } catch {}\n toolsWithJsonSchema[name] = {\n name,\n description: (tool as any).description,\n inputSchema,\n outputSchema: (tool as any).outputSchema,\n };\n }\n return c.json({ tools: toolsWithJsonSchema });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\n// POST /execute — execute a tool; may return completed or an elicitation requirement\ntools.post(\"/execute\", async (c) => {\n try {\n const { serverId, toolName, parameters } = await c.req.json();\n if (!serverId) return c.json({ error: \"serverId is required\" }, 400);\n if (!toolName) return c.json({ error: \"toolName is required\" }, 400);\n\n if (activeExecution) {\n return c.json({ error: \"Another execution is already in progress\" }, 409);\n }\n\n const mcp = c.mcpJamClientManager;\n const status = mcp.getConnectionStatus(serverId);\n if (status !== \"connected\") {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n\n const executionId = `exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n const state: ExecutionState = {\n id: executionId,\n serverId,\n toolName,\n execPromise: Promise.resolve().then(() =>\n mcp.executeToolDirect(toolName, parameters || {}),\n ),\n completed: false,\n queue: [],\n waiters: [],\n };\n\n activeExecution = state;\n\n mcp.setElicitationCallback(async ({ requestId, message, schema }) => {\n if (!activeExecution) {\n // No active execution; reject so upstream can handle\n throw new Error(\"No active execution\");\n }\n const event: ElicitationEvent = {\n requestId,\n message,\n schema,\n toolName,\n timestamp: nowIso(),\n };\n // push to queue and notify waiter if present\n if (activeExecution.waiters.length > 0) {\n const waiter = activeExecution.waiters.shift()!;\n waiter(event);\n } else {\n activeExecution.queue.push(event);\n }\n\n // Return a promise that resolves when respond endpoint supplies an answer\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(\n () => reject(new Error(\"Elicitation timeout\")),\n 300000,\n );\n mcp.getPendingElicitations().set(requestId, {\n resolve: (response: any) => {\n clearTimeout(timeout);\n resolve(response);\n },\n reject: (error: any) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n });\n });\n\n // Race: next elicitation vs completion\n const race = await Promise.race([\n state.execPromise.then((res) => ({ kind: \"done\", res }) as const),\n takeNextElicitation(state).then(\n (ev) => ({ kind: \"elicit\", ev }) as const,\n ),\n ]);\n\n if (race.kind === \"done\") {\n state.completed = true;\n state.result = race.res;\n // clear global state\n activeExecution = null;\n mcp.clearElicitationCallback();\n return c.json(\n { status: \"completed\", toolName, result: race.res.result },\n 200,\n );\n }\n\n // Elicitation required\n return c.json(\n {\n status: \"elicitation_required\",\n executionId,\n requestId: race.ev.requestId,\n toolName,\n message: race.ev.message,\n schema: race.ev.schema,\n timestamp: race.ev.timestamp,\n },\n 202,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\n// POST /respond — respond to the current elicitation; may return next elicitation or completion\ntools.post(\"/respond\", async (c) => {\n try {\n const { requestId, response } = await c.req.json();\n if (!requestId) return c.json({ error: \"requestId is required\" }, 400);\n if (!activeExecution) return c.json({ error: \"No active execution\" }, 404);\n\n const mcp = c.mcpJamClientManager;\n const ok = mcp.respondToElicitation(requestId, response);\n if (!ok)\n return c.json({ error: \"No pending elicitation for requestId\" }, 404);\n\n // After responding, wait for either next elicitation or completion\n const state = activeExecution;\n try {\n const race = await Promise.race([\n state.execPromise.then((res) => ({ kind: \"done\", res }) as const),\n takeNextElicitation(state).then(\n (ev) => ({ kind: \"elicit\", ev }) as const,\n ),\n ]);\n\n if (race.kind === \"done\") {\n state.completed = true;\n state.result = race.res;\n activeExecution = null;\n mcp.clearElicitationCallback();\n return c.json(\n {\n status: \"completed\",\n toolName: state.toolName,\n result: race.res.result,\n },\n 200,\n );\n }\n\n return c.json(\n {\n status: \"elicitation_required\",\n executionId: state.id,\n requestId: race.ev.requestId,\n toolName: state.toolName,\n message: race.ev.message,\n schema: race.ev.schema,\n timestamp: race.ev.timestamp,\n },\n 202,\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return c.json({ error: msg }, 500);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\n// Optional: legacy root route returns 410 Gone to indicate migration\ntools.post(\"/\", async () => {\n return new Response(\n JSON.stringify({\n error: \"Endpoint migrated. Use /list, /execute, or /respond.\",\n }),\n { status: 410, headers: { \"Content-Type\": \"application/json\" } },\n );\n});\n\nexport default tools;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst resources = new Hono();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n const mcpClientManager = c.mcpJamClientManager;\n const serverResources = mcpClientManager.getResourcesForServer(serverId);\n return c.json({ resources: { [serverId]: serverResources } });\n } catch (error) {\n console.error(\"Error fetching resources:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Read resource endpoint\nresources.post(\"/read\", async (c) => {\n try {\n const { serverId, uri } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!uri) {\n return c.json(\n {\n success: false,\n error: \"Resource URI is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n const content = await mcpClientManager.getResource(uri, serverId);\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error reading resource:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default resources;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst prompts = new Hono();\n\n// List prompts endpoint\nprompts.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompts for specific server\n const serverPrompts = mcpJamClientManager.getPromptsForServer(serverId);\n\n return c.json({ prompts: { [serverId]: serverPrompts } });\n } catch (error) {\n console.error(\"Error fetching prompts:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get prompt endpoint\nprompts.post(\"/get\", async (c) => {\n try {\n const { serverId, name, args } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!name) {\n return c.json(\n {\n success: false,\n error: \"Prompt name is required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompt content directly - servers are already connected\n const content = await mcpJamClientManager.getPrompt(\n name,\n serverId,\n args || {},\n );\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error getting prompt:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default prompts;\n","import { Hono } from \"hono\";\nimport { streamText } from \"ai\";\nimport {\n ChatMessage,\n ModelDefinition,\n ModelProvider,\n} from \"../../../shared/types\";\nimport { TextEncoder } from \"util\";\nimport { getDefaultTemperatureByProvider } from \"../../../client/src/lib/chat-utils\";\nimport { createLlmModel } from \"../../utils/chat-helpers\";\nimport { SSEvent } from \"../../../shared/sse\";\nimport { convertMastraToolsToVercelTools } from \"../../../shared/tools\";\nimport {\n hasUnresolvedToolCalls,\n executeToolCallsFromMessages,\n} from \"../../../shared/http-tool-calls\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { ModelMessage, Tool } from \"ai\";\n\n// Types\ninterface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\ninterface StreamingContext {\n controller: ReadableStreamDefaultController;\n encoder: TextEncoder;\n toolCallId: number;\n lastEmittedToolCallId: number | null;\n stepIndex: number;\n}\n\ninterface ChatRequest {\n model: ModelDefinition;\n provider: ModelProvider;\n apiKey?: string;\n systemPrompt?: string;\n temperature?: number;\n messages?: ChatMessage[];\n ollamaBaseUrl?: string;\n action?: string;\n requestId?: string;\n response?: any;\n sendMessagesToBackend?: boolean;\n selectedServers?: string[]; // original names from UI\n}\n\n// Constants\nconst ELICITATION_TIMEOUT = 300000; // 5 minutes\nconst MAX_AGENT_STEPS = 10;\nconst BACKEND_FETCH_ERROR_MESSAGE =\n \"We are having difficulties processing your message right now. Please try again later.\";\n\ntry {\n (process as any).setMaxListeners?.(50);\n} catch {}\n\nconst chat = new Hono();\n\n// Small helper to send one SSE event consistently\nconst sendSseEvent = (\n controller: ReadableStreamDefaultController,\n encoder: TextEncoder,\n event: SSEvent | \"[DONE]\",\n) => {\n const payload = event === \"[DONE]\" ? \"[DONE]\" : JSON.stringify(event);\n controller.enqueue(encoder.encode(`data: ${payload}\\n\\n`));\n};\n\nconst sendBackendErrorText = (streamingContext: StreamingContext) => {\n sendSseEvent(streamingContext.controller, streamingContext.encoder, {\n type: \"text\",\n content: BACKEND_FETCH_ERROR_MESSAGE,\n });\n};\n\nconst sendBackendRequest = async (\n baseUrl: string,\n authHeader: string | undefined,\n body: any,\n streamingContext: StreamingContext,\n): Promise<any | null> => {\n try {\n const res = await fetch(`${baseUrl}/streaming`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(authHeader ? { Authorization: authHeader } : {}),\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n sendBackendErrorText(streamingContext);\n return null;\n }\n\n try {\n const data = await res.json();\n return data;\n } catch {\n sendBackendErrorText(streamingContext);\n return null;\n }\n } catch {\n sendBackendErrorText(streamingContext);\n return null;\n }\n};\n\nconst handleAgentStepFinish = (\n streamingContext: StreamingContext,\n text: string,\n toolCalls: any[] | undefined,\n toolResults: any[] | undefined,\n emitToolEvents: boolean = true,\n) => {\n try {\n if (emitToolEvents) {\n // Handle tool calls\n if (toolCalls && Array.isArray(toolCalls)) {\n for (const call of toolCalls) {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder,\n {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name || call.toolName,\n parameters: call.params || call.args || {},\n timestamp: new Date().toISOString(),\n status: \"executing\",\n },\n },\n );\n }\n }\n }\n\n // Handle tool results\n if (toolResults && Array.isArray(toolResults)) {\n for (const result of toolResults) {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder,\n {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: result.result,\n error: (result as any).error,\n timestamp: new Date().toISOString(),\n },\n },\n );\n }\n }\n }\n }\n\n // Emit a consolidated trace step event for UI tracing panels\n streamingContext.stepIndex = (streamingContext.stepIndex || 0) + 1;\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(streamingContext.controller, streamingContext.encoder, {\n type: \"trace_step\",\n step: streamingContext.stepIndex,\n text,\n toolCalls: (toolCalls || []).map((c: any) => ({\n name: c.name || c.toolName,\n params: c.params || c.args || {},\n })),\n toolResults: (toolResults || []).map((r: any) => ({\n result: r.result,\n error: (r as any).error,\n })),\n timestamp: new Date().toISOString(),\n });\n }\n } catch {}\n};\n\nconst createStreamingResponse = async (\n model: any,\n aiSdkTools: Record<string, Tool>,\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n provider: ModelProvider,\n temperature?: number,\n systemPrompt?: string,\n) => {\n const messageHistory: ModelMessage[] = (messages || []).map((m) => {\n switch (m.role) {\n case \"system\":\n return { role: \"system\", content: m.content } as ModelMessage;\n case \"user\":\n return { role: \"user\", content: m.content } as ModelMessage;\n case \"assistant\":\n return { role: \"assistant\", content: m.content } as ModelMessage;\n default:\n return { role: \"user\", content: m.content } as ModelMessage;\n }\n });\n\n let steps = 0;\n while (steps < MAX_AGENT_STEPS) {\n let accumulatedText = \"\";\n const iterationToolCalls: any[] = [];\n const iterationToolResults: any[] = [];\n\n const streamResult = await streamText({\n model,\n system:\n systemPrompt || \"You are a helpful assistant with access to MCP tools.\",\n temperature: temperature ?? getDefaultTemperatureByProvider(provider),\n tools: aiSdkTools,\n messages: messageHistory,\n onChunk: async (chunk) => {\n switch (chunk.chunk.type) {\n case \"text-delta\":\n case \"reasoning-delta\": {\n const text = chunk.chunk.text;\n if (text) {\n accumulatedText += text;\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"text\",\n content: text,\n },\n );\n }\n break;\n }\n case \"tool-input-start\": {\n // Do not emit a tool_call for input-start; wait for the concrete tool-call\n break;\n }\n case \"tool-call\": {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n const name =\n (chunk.chunk as any).toolName || (chunk.chunk as any).name;\n const parameters =\n (chunk.chunk as any).input ??\n (chunk.chunk as any).parameters ??\n (chunk.chunk as any).args ??\n {};\n iterationToolCalls.push({ name, params: parameters });\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name,\n parameters,\n timestamp: new Date().toISOString(),\n status: \"executing\",\n },\n },\n );\n break;\n }\n case \"tool-result\": {\n const result =\n (chunk.chunk as any).output ??\n (chunk.chunk as any).result ??\n (chunk.chunk as any).value;\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : streamingContext.toolCallId;\n iterationToolResults.push({ result });\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result,\n timestamp: new Date().toISOString(),\n },\n },\n );\n break;\n }\n default:\n break;\n }\n },\n });\n\n await streamResult.consumeStream();\n\n handleAgentStepFinish(\n streamingContext,\n accumulatedText,\n iterationToolCalls,\n iterationToolResults,\n false,\n );\n\n const resp = await streamResult.response;\n const responseMessages = (resp?.messages || []) as ModelMessage[];\n if (responseMessages.length) {\n messageHistory.push(...responseMessages);\n\n // Some providers (e.g., Ollama v2) place tool outputs as ToolModelMessages\n // in the response rather than streaming a tool-result chunk.\n for (const m of responseMessages) {\n if ((m as any).role === \"tool\") {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n const value = (m as any).content;\n iterationToolResults.push({ result: value });\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: value,\n timestamp: new Date().toISOString(),\n },\n });\n }\n }\n }\n\n steps++;\n const finishReason = await streamResult.finishReason;\n const shouldContinue =\n finishReason === \"tool-calls\" ||\n (accumulatedText.length === 0 && iterationToolResults.length > 0);\n\n if (!shouldContinue) break;\n }\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"elicitation_complete\",\n });\n\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n \"[DONE]\",\n );\n};\n\nconst sendMessagesToBackend = async (\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n mcpClientManager: any,\n baseUrl: string,\n authHeader?: string,\n selectedServers?: string[],\n): Promise<void> => {\n // Build message history\n const messageHistory: ModelMessage[] = (messages || []).map((m) => {\n switch (m.role) {\n case \"system\":\n return { role: \"system\", content: m.content } as ModelMessage;\n case \"user\":\n return { role: \"user\", content: m.content } as ModelMessage;\n case \"assistant\":\n return { role: \"assistant\", content: m.content } as ModelMessage;\n default:\n return { role: \"user\", content: m.content } as ModelMessage;\n }\n });\n\n const flatTools =\n await mcpClientManager.getFlattenedToolsetsForEnabledServers(\n selectedServers,\n );\n\n const toolDefs = Object.entries(flatTools).map(([name, tool]) => ({\n name,\n description: tool?.description,\n inputSchema: zodToJsonSchema(tool?.inputSchema),\n }));\n\n if (!baseUrl) {\n throw new Error(\"CONVEX_HTTP_URL is not set\");\n }\n let steps = 0;\n while (steps < MAX_AGENT_STEPS) {\n const data = await sendBackendRequest(\n baseUrl,\n authHeader,\n {\n tools: toolDefs,\n messages: JSON.stringify(messageHistory),\n },\n streamingContext,\n );\n if (!data) break;\n if (data?.ok && Array.isArray(data.messages)) {\n // Append assistant messages and emit their text/tool_call events\n for (const msg of data.messages as ModelMessage[]) {\n messageHistory.push(msg);\n if (\n (msg as any).role === \"assistant\" &&\n Array.isArray((msg as any).content)\n ) {\n for (const c of (msg as any).content) {\n if (c?.type === \"text\" && typeof c.text === \"string\") {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"text\",\n content: c.text,\n },\n );\n } else if (c?.type === \"tool-call\") {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: c.toolName || c.name,\n parameters: c.input || c.parameters || c.args || {},\n timestamp: new Date().toISOString(),\n status: \"executing\",\n },\n },\n );\n }\n }\n }\n }\n } else {\n sendBackendErrorText(streamingContext);\n break;\n }\n\n // Execute unresolved tool calls locally and emit tool_result events\n const beforeLen = messageHistory.length;\n if (hasUnresolvedToolCalls(messageHistory as any)) {\n await executeToolCallsFromMessages(messageHistory as ModelMessage[], {\n tools: flatTools as any,\n });\n const newMsgs = messageHistory.slice(beforeLen);\n for (const m of newMsgs) {\n if ((m as any).role === \"tool\" && Array.isArray((m as any).content)) {\n for (const tc of (m as any).content) {\n if (tc.type === \"tool-result\") {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n const out = tc.output;\n const value =\n out && typeof out === \"object\" && \"value\" in out\n ? out.value\n : out;\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: value,\n timestamp: new Date().toISOString(),\n },\n },\n );\n }\n }\n }\n }\n } else {\n break;\n }\n\n steps++;\n }\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"elicitation_complete\",\n });\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n \"[DONE]\",\n );\n};\n\n// Main chat endpoint\nchat.post(\"/\", async (c) => {\n const mcpClientManager = c.mcpJamClientManager;\n try {\n const requestData: ChatRequest = await c.req.json();\n const {\n model,\n provider,\n apiKey,\n systemPrompt,\n temperature,\n messages,\n ollamaBaseUrl: _ollama_unused,\n action,\n requestId,\n response,\n } = requestData;\n\n // Handle elicitation response\n if (action === \"elicitation_response\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for elicitation_response action\",\n },\n 400,\n );\n }\n\n const success = mcpClientManager.respondToElicitation(\n requestId,\n response,\n );\n if (!success) {\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n return c.json({ success: true });\n }\n\n // Validate required parameters\n if (!messages) {\n return c.json(\n {\n success: false,\n error: \"messages are required\",\n },\n 400,\n );\n }\n const sendToBackend =\n provider === \"meta\" && Boolean(requestData.sendMessagesToBackend);\n\n if (!sendToBackend && (!model?.id || !apiKey)) {\n return c.json(\n {\n success: false,\n error: \"model (with id) and apiKey are required\",\n },\n 400,\n );\n }\n\n if (sendToBackend && !process.env.CONVEX_HTTP_URL) {\n return c.json(\n {\n success: false,\n error: \"Server missing CONVEX_HTTP_URL configuration\",\n },\n 500,\n );\n }\n\n // Create streaming response\n const encoder = new TextEncoder();\n const authHeader = c.req.header(\"authorization\") || undefined;\n const readableStream = new ReadableStream({\n async start(controller) {\n const streamingContext: StreamingContext = {\n controller,\n encoder,\n toolCallId: 0,\n lastEmittedToolCallId: null,\n stepIndex: 0,\n };\n\n // Register elicitation handler with MCPJamClientManager\n mcpClientManager.setElicitationCallback(async (request) => {\n // Convert MCPJamClientManager format to createElicitationHandler format\n const elicitationRequest = {\n message: request.message,\n requestedSchema: request.schema,\n };\n\n // Stream elicitation request to client using the provided requestId\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder,\n {\n type: \"elicitation_request\",\n requestId: request.requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n timestamp: new Date().toISOString(),\n },\n );\n }\n\n // Return a promise that will be resolved when user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n // Set timeout to clean up if no response\n const timeout = setTimeout(() => {\n reject(new Error(\"Elicitation timeout\"));\n }, ELICITATION_TIMEOUT);\n\n // Store the resolver in the manager's pending elicitations\n mcpClientManager.getPendingElicitations().set(request.requestId, {\n resolve: (response: ElicitationResponse) => {\n clearTimeout(timeout);\n resolve(response);\n },\n reject: (error: any) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n });\n });\n\n try {\n if (sendToBackend) {\n await sendMessagesToBackend(\n messages,\n streamingContext,\n mcpClientManager,\n process.env.CONVEX_HTTP_URL!,\n authHeader,\n requestData.selectedServers,\n );\n } else {\n // Use existing streaming path with tools\n const flatTools =\n await mcpClientManager.getFlattenedToolsetsForEnabledServers(\n requestData.selectedServers,\n );\n\n const aiSdkTools: Record<string, Tool> =\n convertMastraToolsToVercelTools(flatTools as any);\n\n const llmModel = createLlmModel(\n model as ModelDefinition,\n apiKey || \"\",\n _ollama_unused,\n );\n await createStreamingResponse(\n llmModel,\n aiSdkTools,\n messages,\n streamingContext,\n provider,\n temperature,\n systemPrompt,\n );\n }\n } catch (error) {\n sendSseEvent(controller, encoder, {\n type: \"error\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n } finally {\n // Clear elicitation callback to prevent memory leaks\n mcpClientManager.clearElicitationCallback();\n controller.close();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"[mcp/chat] Error in chat API:\", error);\n\n try {\n mcpClientManager.clearElicitationCallback();\n } catch (cleanupError) {\n console.error(\"[mcp/chat] Error during cleanup:\", cleanupError);\n }\n\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default chat;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ChatMessage } from \"./chat-types\";\nimport { ModelDefinition } from \"@/shared/types.js\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substr(2, 9);\n}\n\nexport function sanitizeText(text: string): string {\n // Basic sanitization - in production you might want more robust sanitization\n return text.trim();\n}\n\nexport function formatTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nexport function formatMessageDate(date: Date): string {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));\n\n if (diffInDays === 0) {\n return formatTimestamp(date);\n } else if (diffInDays === 1) {\n return `Yesterday ${formatTimestamp(date)}`;\n } else if (diffInDays < 7) {\n return `${diffInDays} days ago`;\n } else {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n }).format(date);\n }\n}\n\nexport function createMessage(\n role: \"user\" | \"assistant\",\n content: string,\n attachments?: any[],\n): ChatMessage {\n return {\n id: generateId(),\n role,\n content,\n timestamp: new Date(),\n attachments,\n metadata: {\n createdAt: new Date().toISOString(),\n },\n };\n}\n\nexport function isValidFileType(file: File): boolean {\n const allowedTypes = [\n \"text/plain\",\n \"application/pdf\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"application/json\",\n \"text/csv\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ];\n\n return allowedTypes.includes(file.type);\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\");\n}\n\nexport function isImageUrl(url: string): boolean {\n const imageExtensions = [\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".svg\"];\n const lowerUrl = url.toLowerCase();\n return (\n imageExtensions.some((ext) => lowerUrl.includes(ext)) ||\n lowerUrl.includes(\"data:image/\") ||\n lowerUrl.includes(\"blob:\")\n );\n}\n\nexport function getImageDimensions(\n url: string,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n}\n\nexport function scrollToBottom(element?: Element | null) {\n if (element) {\n element.scrollTop = element.scrollHeight;\n } else {\n window.scrollTo(0, document.body.scrollHeight);\n }\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\nexport function getDefaultTemperatureByProvider(provider: string): number {\n switch (provider) {\n case \"openai\":\n return 1.0;\n case \"anthropic\":\n return 0;\n case \"google\":\n return 0.9; // Google's recommended default\n default:\n return 0;\n }\n}\n\nexport function getDefaultTemperatureForModel(model: ModelDefinition): number {\n return getDefaultTemperatureByProvider(model.provider);\n}\n","import { ModelDefinition } from \"@/shared/types\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOllama } from \"ollama-ai-provider-v2\";\n\nexport const createLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n) => {\n if (!modelDefinition?.id || !modelDefinition?.provider) {\n throw new Error(\n `Invalid model definition: ${JSON.stringify(modelDefinition)}`,\n );\n }\n\n switch (modelDefinition.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey })(modelDefinition.id);\n case \"openai\":\n return createOpenAI({ apiKey })(modelDefinition.id);\n case \"deepseek\":\n return createDeepSeek({ apiKey })(modelDefinition.id);\n case \"google\":\n return createGoogleGenerativeAI({ apiKey })(modelDefinition.id);\n case \"ollama\": {\n const raw = ollamaBaseUrl || \"http://localhost:11434/api\";\n const normalized = /\\/api\\/?$/.test(raw)\n ? raw\n : `${raw.replace(/\\/+$/, \"\")}/api`;\n return createOllama({ baseURL: normalized })(modelDefinition.id);\n }\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n","import { z, ZodTypeAny } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { tool, type Tool as VercelTool, type ToolCallOptions } from \"ai\";\n\ntype MastraToolExecuteArgs = {\n context?: unknown;\n runtimeContext?: unknown;\n};\n\ntype MastraToolInstance = {\n description?: string;\n inputSchema?: unknown;\n outputSchema?: unknown;\n execute?: (\n args: MastraToolExecuteArgs,\n options?: ToolCallOptions,\n ) => Promise<unknown> | unknown;\n};\n\nconst fallbackInputSchema = z.object({}).passthrough();\n\nconst UNREPRESENTABLE_JSON_SCHEMA_MESSAGES = [\n \"Custom types cannot be represented in JSON Schema\",\n \"Function types cannot be represented in JSON Schema\",\n];\n\nfunction isUnrepresentableSchemaError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n UNREPRESENTABLE_JSON_SCHEMA_MESSAGES.some((message) =>\n error.message.includes(message),\n )\n );\n}\n\nfunction isZodSchema(value: unknown): value is ZodTypeAny {\n return Boolean(\n value && typeof value === \"object\" && \"safeParse\" in (value as ZodTypeAny),\n );\n}\n\nfunction isDirectlyUnrepresentable(schema: ZodTypeAny): boolean {\n const schemaType = (schema as any)?._def?.type;\n return schemaType === \"custom\" || schemaType === \"function\";\n}\n\nfunction canConvertToJSONSchema(schema: ZodTypeAny): boolean {\n const toJSONSchema = (\n z as unknown as {\n toJSONSchema?: (\n schema: ZodTypeAny,\n options?: Record<string, unknown>,\n ) => unknown;\n }\n ).toJSONSchema;\n\n if (typeof toJSONSchema === \"function\") {\n try {\n toJSONSchema(schema);\n return true;\n } catch (error) {\n if (isUnrepresentableSchemaError(error)) {\n return false;\n }\n\n throw error;\n }\n }\n\n try {\n zodToJsonSchema(schema);\n return true;\n } catch (error) {\n if (isUnrepresentableSchemaError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction ensureInputSchema(schema: unknown): ZodTypeAny {\n if (!isZodSchema(schema)) {\n return fallbackInputSchema;\n }\n\n if (isDirectlyUnrepresentable(schema)) {\n return fallbackInputSchema;\n }\n\n if (!canConvertToJSONSchema(schema)) {\n return fallbackInputSchema;\n }\n\n return schema;\n}\n\nfunction ensureOutputSchema(schema: unknown): ZodTypeAny | undefined {\n if (!isZodSchema(schema)) {\n return undefined;\n }\n\n if (isDirectlyUnrepresentable(schema)) {\n return undefined;\n }\n\n if (!canConvertToJSONSchema(schema)) {\n return undefined;\n }\n\n return schema;\n}\n\nfunction extractPureToolName(toolKey: string): string {\n const separatorIndex = toolKey.indexOf(\"_\");\n\n if (separatorIndex === -1 || separatorIndex === toolKey.length - 1) {\n return toolKey;\n }\n\n return toolKey.slice(separatorIndex + 1);\n}\n\nexport function convertMastraToolToVercelTool(\n toolName: string,\n mastraTool: MastraToolInstance,\n options?: { originalName?: string },\n): VercelTool {\n const inputSchema = ensureInputSchema(mastraTool.inputSchema);\n const outputSchema = ensureOutputSchema(mastraTool.outputSchema);\n const displayName = options?.originalName ?? toolName;\n\n const vercelToolConfig: {\n type: \"dynamic\";\n description?: string;\n inputSchema: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n execute?: (input: unknown, options: ToolCallOptions) => Promise<unknown>;\n } = {\n type: \"dynamic\",\n description: mastraTool.description,\n inputSchema,\n };\n\n if (outputSchema) {\n vercelToolConfig.outputSchema = outputSchema;\n }\n\n if (typeof mastraTool.execute === \"function\") {\n vercelToolConfig.execute = async (input, options) => {\n const executionArgs: MastraToolExecuteArgs = { context: input };\n\n if (options) {\n executionArgs.runtimeContext = options;\n }\n\n const result = await mastraTool.execute?.(executionArgs, options);\n\n if (outputSchema) {\n const parsed = outputSchema.safeParse(result);\n\n if (!parsed.success) {\n throw new Error(\n `Mastra tool '${displayName}' returned invalid output: ${parsed.error.message}`,\n );\n }\n\n return parsed.data;\n }\n\n return result;\n };\n }\n\n try {\n return tool(vercelToolConfig);\n } catch (error) {\n if (!isUnrepresentableSchemaError(error)) {\n throw error;\n }\n\n if (vercelToolConfig.outputSchema) {\n const {\n outputSchema: _unusedOutputSchema,\n ...configWithoutOutputSchema\n } = vercelToolConfig;\n\n try {\n return tool(configWithoutOutputSchema);\n } catch (errorWithoutOutputSchema) {\n if (!isUnrepresentableSchemaError(errorWithoutOutputSchema)) {\n throw errorWithoutOutputSchema;\n }\n\n const fallbackConfig = {\n ...configWithoutOutputSchema,\n inputSchema: fallbackInputSchema,\n };\n\n return tool(fallbackConfig);\n }\n }\n\n const fallbackConfig = {\n ...vercelToolConfig,\n inputSchema: fallbackInputSchema,\n };\n\n return tool(fallbackConfig);\n }\n}\n\nexport function convertMastraToolsToVercelTools(\n mastraTools: Record<string, MastraToolInstance>,\n): Record<string, VercelTool> {\n return Object.fromEntries(\n Object.entries(mastraTools).map(([name, mastraTool]) => {\n const pureToolName = extractPureToolName(name);\n\n return [\n pureToolName,\n convertMastraToolToVercelTool(pureToolName, mastraTool, {\n originalName: name,\n }),\n ];\n }),\n );\n}\n","import { ModelMessage } from \"@ai-sdk/provider-utils\";\nimport { LanguageModelV2ToolResultOutput } from \"@ai-sdk/provider-v5\";\nimport type { MCPClient } from \"@mastra/mcp\";\n\ntype ToolsMap = Record<string, any>;\ntype Toolsets = Record<string, ToolsMap>;\n\nfunction flattenToolsets(toolsets: Toolsets): ToolsMap {\n const flattened: ToolsMap = {};\n for (const serverTools of Object.values(toolsets || {})) {\n if (serverTools && typeof serverTools === \"object\") {\n Object.assign(flattened, serverTools as any);\n }\n }\n return flattened;\n}\n\nfunction buildIndexWithAliases(tools: ToolsMap): ToolsMap {\n const index: ToolsMap = {};\n for (const [toolName, tool] of Object.entries<any>(tools || {})) {\n if (!tool || typeof tool !== \"object\" || !(\"execute\" in tool)) continue;\n const idx = toolName.indexOf(\"_\");\n const pure =\n idx > -1 && idx < toolName.length - 1\n ? toolName.slice(idx + 1)\n : toolName;\n if (!(toolName in index)) index[toolName] = tool;\n if (!(pure in index)) index[pure] = tool;\n }\n return index;\n}\n\nexport const hasUnresolvedToolCalls = (messages: ModelMessage[]): boolean => {\n const toolCallIds = new Set<string>();\n const toolResultIds = new Set<string>();\n\n for (const msg of messages) {\n if (!msg) continue;\n if (msg.role === \"assistant\" && Array.isArray((msg as any).content)) {\n for (const c of (msg as any).content) {\n if (c?.type === \"tool-call\") toolCallIds.add(c.toolCallId);\n }\n } else if (msg.role === \"tool\" && Array.isArray((msg as any).content)) {\n for (const c of (msg as any).content) {\n if (c?.type === \"tool-result\") toolResultIds.add(c.toolCallId);\n }\n }\n }\n for (const id of toolCallIds) if (!toolResultIds.has(id)) return true;\n return false;\n};\n\nexport async function executeToolCallsFromMessages(\n messages: ModelMessage[],\n options: { tools: ToolsMap } | { toolsets: Toolsets } | { client: MCPClient },\n): Promise<void> {\n // Build tools index\n let tools: ToolsMap = {};\n if ((options as any).client) {\n const toolsets = await (options as any).client.getToolsets();\n tools = flattenToolsets(toolsets as any);\n } else if ((options as any).toolsets) {\n tools = flattenToolsets((options as any).toolsets as any);\n } else {\n tools = (options as any).tools as ToolsMap;\n }\n const index = buildIndexWithAliases(tools);\n\n // Collect existing tool-result IDs\n const existingToolResultIds = new Set<string>();\n for (const msg of messages) {\n if (!msg || msg.role !== \"tool\" || !Array.isArray((msg as any).content))\n continue;\n for (const c of (msg as any).content) {\n if (c?.type === \"tool-result\") existingToolResultIds.add(c.toolCallId);\n }\n }\n\n const toolResultsToAdd: ModelMessage[] = [];\n for (const msg of messages) {\n if (\n !msg ||\n msg.role !== \"assistant\" ||\n !Array.isArray((msg as any).content)\n )\n continue;\n for (const content of (msg as any).content) {\n if (\n content?.type === \"tool-call\" &&\n !existingToolResultIds.has(content.toolCallId)\n ) {\n try {\n const toolName: string = content.toolName;\n const tool = index[toolName];\n if (!tool) throw new Error(`Tool '${toolName}' not found`);\n const input = content.input || {};\n const result = await tool.execute({ context: input });\n\n let output: LanguageModelV2ToolResultOutput;\n if (result && typeof result === \"object\" && (result as any).content) {\n const rc: any = (result as any).content;\n if (\n rc &&\n typeof rc === \"object\" &&\n \"text\" in rc &&\n typeof rc.text === \"string\"\n ) {\n output = { type: \"text\", value: rc.text } as any;\n } else if (\n rc &&\n typeof rc === \"object\" &&\n \"type\" in rc &&\n \"value\" in rc\n ) {\n output = {\n type: (rc.type as any) || \"text\",\n value: rc.value,\n } as any;\n } else {\n output = { type: \"text\", value: JSON.stringify(rc) } as any;\n }\n } else {\n output = { type: \"text\", value: String(result) } as any;\n }\n\n const toolResultMessage: ModelMessage = {\n role: \"tool\" as const,\n content: [\n {\n type: \"tool-result\",\n toolCallId: content.toolCallId,\n toolName: toolName,\n output,\n },\n ],\n } as any;\n toolResultsToAdd.push(toolResultMessage);\n } catch (error: any) {\n const errorOutput: LanguageModelV2ToolResultOutput = {\n type: \"error-text\",\n value: error instanceof Error ? error.message : String(error),\n } as any;\n const errorToolResultMessage: ModelMessage = {\n role: \"tool\" as const,\n content: [\n {\n type: \"tool-result\",\n toolCallId: content.toolCallId,\n toolName: content.toolName,\n output: errorOutput,\n },\n ],\n } as any;\n toolResultsToAdd.push(errorToolResultMessage);\n }\n }\n }\n }\n\n messages.push(...toolResultsToAdd);\n}\n","import { Hono } from \"hono\";\nimport { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\nimport type { ModelDefinition } from \"../../../shared/types\";\nimport {\n validateMultipleServerConfigs,\n createMCPClientWithMultipleConnections,\n} from \"../../utils/mcp-utils\";\n\nconst tests = new Hono();\n\n// Helper functions\nfunction normalizeToolName(toolName: string, serverIds: string[]): string {\n for (const id of serverIds) {\n const prefix = `${id}_`;\n if (toolName.startsWith(prefix)) {\n return toolName.slice(prefix.length);\n }\n }\n return toolName;\n}\n\nfunction extractToolSchema(tool: any): any {\n if (!tool?.inputSchema) return {};\n\n // Try toJSON() first\n const jsonSchema = tool.inputSchema.toJSON?.();\n if (jsonSchema && typeof jsonSchema === \"object\") {\n return jsonSchema;\n }\n\n // Fallback for ZodObject\n const zodDef = tool.inputSchema._def;\n if (zodDef?.typeName === \"ZodObject\") {\n const baseSchema = {\n type: \"object\",\n additionalProperties: false,\n properties: {},\n required: [],\n };\n\n try {\n if (zodDef.shape && typeof zodDef.shape === \"function\") {\n const shape = zodDef.shape();\n const properties: any = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = { type: \"string\" };\n if ((value as any)?._def?.typeName !== \"ZodOptional\") {\n required.push(key);\n }\n }\n\n return { ...baseSchema, properties, required };\n }\n } catch {\n // Keep base schema\n }\n\n return baseSchema;\n }\n\n return {};\n}\n\nfunction resolveBackendUrl(overrideUrl?: string): string {\n return \"https://industrious-stingray-146.convex.site\";\n if (overrideUrl) return overrideUrl.replace(/\\/$/, \"\");\n\n const explicit = process.env.CONVEX_HTTP_URL;\n if (explicit) return explicit.replace(/\\/$/, \"\");\n\n const convexUrl = process.env.VITE_CONVEX_URL || process.env.CONVEX_URL;\n if (convexUrl) {\n try {\n const u = new URL(convexUrl);\n const host = u.host.replace(\".convex.cloud\", \".convex.site\");\n return `${u.protocol}//${host}`;\n } catch {}\n }\n\n return \"http://localhost:3210\";\n}\n\nexport default tests;\n\n// Run-all (parallel orchestrated) endpoint\ntests.post(\"/run-all\", async (c) => {\n const encoder = new TextEncoder();\n try {\n const body = await c.req.json();\n const testsInput = (body?.tests || []) as Array<{\n id: string;\n title: string;\n prompt: string;\n expectedTools: string[];\n model: ModelDefinition;\n selectedServers?: string[];\n }>;\n const overrideBackendHttpUrl = body?.backendHttpUrl as string | undefined;\n const allServers = (body?.allServers || {}) as Record<\n string,\n MastraMCPServerDefinition\n >;\n const maxConcurrency: number = Math.max(\n 1,\n Math.min(8, body?.concurrency ?? 5),\n );\n\n if (!Array.isArray(testsInput) || testsInput.length === 0) {\n return c.json({ success: false, error: \"No tests provided\" }, 400);\n }\n const readableStream = new ReadableStream({\n async start(controller) {\n let active = 0;\n let index = 0;\n let failed = false;\n\n const runNext = async () => {\n if (index >= testsInput.length) {\n if (active === 0) {\n // All done\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"run_complete\", passed: !failed })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n }\n return;\n }\n const test = testsInput[index++];\n active++;\n (async () => {\n const calledTools = new Set<string>();\n const expectedSet = new Set<string>(test.expectedTools || []);\n let step = 0;\n let client: MCPClient | null = null;\n try {\n // Build servers for this test\n let serverConfigs: Record<string, MastraMCPServerDefinition> = {};\n if (test.selectedServers && test.selectedServers.length > 0) {\n for (const name of test.selectedServers) {\n if (allServers[name]) serverConfigs[name] = allServers[name];\n }\n } else {\n for (const [name, cfg] of Object.entries(allServers)) {\n serverConfigs[name] = cfg;\n }\n }\n\n // Validate and connect with multiple servers like chat endpoint to ensure headers/eventSourceInit are set\n const validation = validateMultipleServerConfigs(serverConfigs);\n let finalServers: Record<string, MastraMCPServerDefinition> = {};\n if (validation.success && validation.validConfigs) {\n finalServers = validation.validConfigs;\n } else if (\n validation.validConfigs &&\n Object.keys(validation.validConfigs).length > 0\n ) {\n finalServers = validation.validConfigs; // partial success; continue with valid ones\n } else {\n throw new Error(\"No valid MCP server configs for test\");\n }\n\n client = createMCPClientWithMultipleConnections(finalServers);\n const tools = await client.getTools();\n const toolsSchemas = Object.entries(tools).map(\n ([name, tool]) => ({\n toolName: name,\n inputSchema: extractToolSchema(tool),\n }),\n );\n\n const runId = `${Date.now()}-${test.id}`;\n const backendUrl = resolveBackendUrl(overrideBackendHttpUrl);\n\n // Emit debug info\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"debug\", testId: test.id, backendUrl })}\\n\\n`,\n ),\n );\n\n // Start one-step on backend\n const startRes = await fetch(`${backendUrl}/evals/agent/start`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n runId,\n model: test.model,\n toolsSchemas,\n messages: [\n {\n role: \"system\",\n content:\n \"You are a helpful assistant with access to MCP tools.\",\n },\n { role: \"user\", content: test.prompt || \"\" },\n ],\n }),\n });\n if (!startRes.ok) {\n const errText = await startRes.text().catch(() => \"\");\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed: false, error: `Backend start failed: ${startRes.status} ${errText}` })}\\n\\n`,\n ),\n );\n throw new Error(\n `Backend start failed: ${startRes.status} ${errText}`,\n );\n }\n const startJson: any = await startRes.json();\n if (!startJson.ok)\n throw new Error((startJson as any).error || \"start failed\");\n\n let state: any = startJson;\n const serverIds = Object.keys(finalServers);\n\n // Loop until assistant_text\n while (state.kind === \"tool_call\") {\n const name = state.toolName as string;\n const args = state.args || {};\n const tool = (tools as any)[name];\n\n try {\n const result = await tool?.execute({ context: args });\n calledTools.add(name);\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n testId: test.id,\n step: ++step,\n text: \"Executed tool\",\n toolCalls: [normalizeToolName(name, serverIds)],\n toolResults: [result],\n })}\\n\\n`,\n ),\n );\n\n const stepRes = await fetch(\n `${backendUrl}/evals/agent/step`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n runId,\n model: test.model,\n toolsSchemas,\n messages: state.steps?.[state.steps.length - 1]\n ?.messages || [\n {\n role: \"system\",\n content:\n \"You are a helpful assistant with access to MCP tools.\",\n },\n { role: \"user\", content: test.prompt || \"\" },\n ],\n toolResultMessage: {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: state.toolCallId,\n toolName: name,\n output: result,\n },\n ],\n },\n }),\n },\n );\n\n const stepJson: any = await stepRes.json();\n if (!stepJson.ok) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"result\",\n testId: test.id,\n passed: false,\n error: (stepJson as any).error || \"step failed\",\n })}\\n\\n`,\n ),\n );\n throw new Error((stepJson as any).error || \"step failed\");\n }\n state = stepJson as any;\n } catch (err) {\n throw new Error(\n `Tool '${name}' failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const called = Array.from(calledTools).map((t) =>\n normalizeToolName(t, serverIds),\n );\n const missing = Array.from(expectedSet).filter(\n (t) => !called.includes(t),\n );\n const unexpected = called.filter((t) => !expectedSet.has(t));\n const passed = missing.length === 0 && unexpected.length === 0;\n if (!passed) failed = true;\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"result\",\n testId: test.id,\n passed,\n calledTools: called,\n missingTools: missing,\n unexpectedTools: unexpected,\n })}\\n\\n`,\n ),\n );\n } catch (err) {\n failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed: false, error: (err as Error)?.message })}\\n\\n`,\n ),\n );\n } finally {\n try {\n await client?.disconnect();\n } catch {}\n active--;\n runNext();\n }\n })();\n };\n\n for (let i = 0; i < Math.min(maxConcurrency, testsInput.length); i++) {\n runNext();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (err) {\n return c.json(\n { success: false, error: (err as Error)?.message || \"Unknown error\" },\n 500,\n );\n }\n});\n","import { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\n\n// Hono-compatible error response type\nexport interface HonoErrorResponse {\n message: string;\n status: number;\n}\n\nexport interface ValidationResult {\n success: boolean;\n config?: MastraMCPServerDefinition;\n error?: HonoErrorResponse;\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\nexport function validateServerConfig(serverConfig: any): ValidationResult {\n if (!serverConfig) {\n return {\n success: false,\n error: {\n message: \"Server configuration is required\",\n status: 400,\n },\n };\n }\n\n // Validate and prepare config\n const config = { ...serverConfig };\n\n // Validate and convert URL if provided\n if (config.url) {\n try {\n // Convert string URL to URL object if needed and strip query/hash\n if (typeof config.url === \"string\") {\n config.url = new URL(config.url);\n } else if (typeof config.url === \"object\" && !config.url.href) {\n return {\n success: false,\n error: {\n message: \"Invalid URL configuration\",\n status: 400,\n },\n };\n }\n\n // Handle OAuth authentication for HTTP servers\n if (config.oauth?.access_token) {\n const authHeaders = {\n Authorization: `Bearer ${config.oauth.access_token}`,\n ...(config.requestInit?.headers || {}),\n };\n\n config.requestInit = {\n ...config.requestInit,\n headers: authHeaders,\n };\n\n // For SSE connections, add eventSourceInit with OAuth headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Add OAuth authorization header\n headers.set(\n \"Authorization\",\n `Bearer ${config.oauth!.access_token}`,\n );\n\n // Copy other headers from requestInit\n if (config.requestInit?.headers) {\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n if (key.toLowerCase() !== \"authorization\") {\n headers.set(key, value);\n }\n });\n }\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n } else if (config.requestInit?.headers) {\n // For SSE connections without OAuth, add eventSourceInit if requestInit has custom headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Copy headers from requestInit\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n headers.set(key, value);\n });\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n }\n } catch (error) {\n return {\n success: false,\n error: {\n message: `Invalid URL format: ${error}`,\n status: 400,\n },\n };\n }\n }\n\n return {\n success: true,\n config,\n };\n}\n\nexport function createMCPClient(\n config: MastraMCPServerDefinition,\n id: string,\n): MCPClient {\n return new MCPClient({\n id,\n servers: {\n server: config,\n },\n });\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n serverNameMapping?: Record<string, string>; // serverID -> originalName\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\n// Generate unique server ID that avoids collisions\nfunction generateUniqueServerID(serverName: string): string {\n // Use normalized name as base + timestamp + random suffix to ensure uniqueness\n const normalizedBase = normalizeServerConfigName(serverName);\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nexport const validateMultipleServerConfigs = (\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MultipleValidationResult => {\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return {\n success: false,\n error: {\n message: \"At least one server configuration is required\",\n status: 400,\n },\n };\n }\n\n const validConfigs: Record<string, MastraMCPServerDefinition> = {};\n const serverNameMapping: Record<string, string> = {};\n const errors: Record<string, string> = {};\n let hasErrors = false;\n\n // Validate each server configuration\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n const validationResult = validateServerConfig(serverConfig);\n\n if (validationResult.success && validationResult.config) {\n // Generate unique server ID to avoid collisions from normalized names\n const serverID = generateUniqueServerID(serverName);\n validConfigs[serverID] = validationResult.config;\n serverNameMapping[serverID] = serverName; // Map serverID back to original name\n } else {\n hasErrors = true;\n let errorMessage = \"Configuration validation failed\";\n if (validationResult.error) {\n errorMessage = validationResult.error.message;\n }\n // Use original server name for error keys since this is for user display\n errors[serverName] = errorMessage;\n }\n }\n\n // If all configs are valid, return success\n if (!hasErrors) {\n return {\n success: true,\n validConfigs,\n serverNameMapping,\n };\n }\n\n // If some configs are valid but others failed, return partial success\n if (Object.keys(validConfigs).length > 0) {\n return {\n success: false,\n validConfigs,\n serverNameMapping,\n errors,\n };\n }\n\n // If all configs failed, return error\n return {\n success: false,\n errors,\n error: {\n message: \"All server configurations failed validation\",\n status: 400,\n },\n };\n};\n\nexport function createMCPClientWithMultipleConnections(\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MCPClient {\n // Custom MCPClient wrapper to fix double prefixing issue\n const originalMCPClient = new MCPClient({\n id: `chat-${Date.now()}`,\n servers: serverConfigs,\n });\n\n // Override getTools method to fix double prefixing\n const originalGetTools = originalMCPClient.getTools.bind(originalMCPClient);\n originalMCPClient.getTools = async () => {\n const tools = await originalGetTools();\n const fixedTools: Record<string, any> = {};\n\n for (const [toolName, toolConfig] of Object.entries(tools)) {\n // Check if tool name has double prefix pattern (serverName_serverName_actualTool)\n const parts = toolName.split(\"_\");\n if (parts.length >= 3 && parts[0] === parts[1]) {\n // Remove the duplicate prefix: \"asana_asana_list_workspaces\" -> \"asana_list_workspaces\"\n const fixedName = parts.slice(1).join(\"_\");\n fixedTools[fixedName] = toolConfig;\n } else {\n fixedTools[toolName] = toolConfig;\n }\n }\n\n return fixedTools;\n };\n\n return originalMCPClient;\n}\n\nexport function normalizeServerConfigName(serverName: string): string {\n // Convert to lowercase and replace spaces/hyphens with underscores\n return serverName\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n}\n\nexport function createErrorResponse(\n message: string,\n details?: string,\n status: number = 500,\n): HonoErrorResponse {\n return {\n message: details ? `${message}: ${details}` : message,\n status,\n };\n}\n","import { Hono } from \"hono\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst oauth = new Hono();\n\n/**\n * Proxy OAuth metadata requests to bypass CORS restrictions\n * GET /api/mcp/oauth/metadata?url=https://mcp.asana.com/.well-known/oauth-authorization-server/sse\n */\noauth.get(\"/metadata\", async (c) => {\n try {\n const url = c.req.query(\"url\");\n\n if (!url) {\n return c.json({ error: \"Missing url parameter\" }, 400);\n }\n\n // Validate URL format and ensure it's HTTPS\n let metadataUrl: URL;\n try {\n metadataUrl = new URL(url);\n if (metadataUrl.protocol !== \"https:\") {\n return c.json({ error: \"Only HTTPS URLs are allowed\" }, 400);\n }\n } catch (error) {\n return c.json({ error: \"Invalid URL format\" }, 400);\n }\n\n // Fetch OAuth metadata from the server\n const response = await fetch(metadataUrl.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"MCP-Inspector/1.0\",\n },\n });\n\n if (!response.ok) {\n return c.json(\n {\n error: `Failed to fetch OAuth metadata: ${response.status} ${response.statusText}`,\n },\n response.status as ContentfulStatusCode,\n );\n }\n\n const metadata = (await response.json()) as Record<string, unknown>;\n\n // Return the metadata with proper CORS headers\n return c.json(metadata);\n } catch (error) {\n console.error(\"OAuth metadata proxy error:\", error);\n return c.json(\n {\n error:\n error instanceof Error ? error.message : \"Unknown error occurred\",\n },\n 500,\n );\n }\n});\n\nexport default oauth;\n","import { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport \"../../types/hono\"; // Type extensions\n\nconst exporter = new Hono();\n\n// POST /export/server — export all server info as JSON\nexporter.post(\"/server\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n\n const mcp = c.mcpJamClientManager;\n const status = mcp.getConnectionStatus(serverId);\n if (status !== \"connected\") {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n\n // Tools\n const flattenedTools = await mcp.getToolsetsForServer(serverId);\n const tools: Array<{\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n }> = [];\n\n for (const [name, tool] of Object.entries(flattenedTools)) {\n let inputSchema = (tool as any).inputSchema;\n try {\n inputSchema = zodToJsonSchema(inputSchema as z.ZodType<any>);\n } catch {}\n tools.push({\n name,\n description: (tool as any).description,\n inputSchema,\n outputSchema: (tool as any).outputSchema,\n });\n }\n\n // Resources\n const resources = mcp.getResourcesForServer(serverId).map((r) => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n }));\n\n // Prompts\n const prompts = mcp.getPromptsForServer(serverId).map((p) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n }));\n\n return c.json({\n serverId,\n exportedAt: new Date().toISOString(),\n tools,\n resources,\n prompts,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\nexport default exporter;\n","import { Hono } from \"hono\";\nimport { interceptorStore } from \"../../services/interceptor-store\";\n\nconst interceptor = new Hono();\n\n// Helper to add permissive CORS headers for public proxy endpoints\nfunction withCORS(res: Response): Response {\n const headers = new Headers(res.headers);\n headers.set(\"Access-Control-Allow-Origin\", \"*\");\n headers.set(\"Access-Control-Allow-Methods\", \"GET,POST,HEAD,OPTIONS\");\n // Be explicit: some clients won’t accept \"*\" for Authorization\n headers.set(\n \"Access-Control-Allow-Headers\",\n \"Authorization, Content-Type, Accept, Accept-Language\",\n );\n headers.set(\"Access-Control-Expose-Headers\", \"*\");\n headers.set(\"Vary\", \"Origin, Access-Control-Request-Headers\");\n // Avoid CL+TE conflicts in dev proxies: prefer chunked framing decided by runtime\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n}\n\nfunction maskHeaders(orig: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n orig.forEach((value, key) => {\n if (key.toLowerCase() === \"authorization\") {\n out[key] = value.startsWith(\"Bearer \") ? \"Bearer ***\" : \"***\";\n } else {\n out[key] = value;\n }\n });\n return out;\n}\n\n// Create interceptor pointing to a target MCP server (HTTP)\ninterceptor.post(\"/create\", async (c) => {\n try {\n const body = await c.req.json();\n const targetUrl = body?.targetUrl as string | undefined;\n // Back-compat: accept `serverId` or legacy `managerServerId`\n const serverId: string | undefined =\n (body?.serverId as string | undefined) ||\n (body?.managerServerId as string | undefined);\n const urlObj = new URL(c.req.url);\n let finalTarget: string | undefined = targetUrl;\n let injectHeaders: Record<string, string> | undefined;\n\n if (serverId) {\n // Use stored config for a connected server to derive headers and possibly URL\n const connected = c.mcpJamClientManager.getConnectedServers();\n const serverMeta = connected[serverId];\n const cfg: any | undefined = serverMeta?.config;\n if (!cfg || serverMeta?.status !== \"connected\") {\n return c.json(\n { success: false, error: `Server '${serverId}' is not connected` },\n 400,\n );\n }\n if (!finalTarget) {\n if (cfg.url) {\n finalTarget =\n typeof cfg.url === \"string\" ? cfg.url : (cfg.url as URL).toString();\n } else {\n const origin = new URL(c.req.url).origin;\n finalTarget = `${origin}/api/mcp/adapter-http/${encodeURIComponent(serverId)}`;\n }\n }\n // Derive Authorization and custom headers\n const hdrs: Record<string, string> = {};\n const fromReqInit = cfg.requestInit?.headers as\n | Record<string, string>\n | undefined;\n if (fromReqInit) {\n for (const [k, v] of Object.entries(fromReqInit)) {\n if (typeof v === \"string\") hdrs[k.toLowerCase()] = v;\n }\n }\n const token: string | undefined =\n cfg?.oauth?.access_token || cfg?.oauth?.accessToken;\n if (token && !hdrs[\"authorization\"]) {\n hdrs[\"authorization\"] = `Bearer ${token}`;\n hdrs[\"Authorization\"] = `Bearer ${token}`; // be generous with casing\n }\n injectHeaders = hdrs;\n }\n\n if (!finalTarget) {\n return c.json(\n { success: false, error: \"targetUrl or serverId is required\" },\n 400,\n );\n }\n try {\n const u = new URL(finalTarget);\n if (![\"http:\", \"https:\"].includes(u.protocol)) {\n return c.json(\n {\n success: false,\n error: \"Only HTTP/HTTPS MCP servers are supported\",\n },\n 400,\n );\n }\n } catch {\n return c.json({ success: false, error: \"Invalid URL\" }, 400);\n }\n\n const entry = interceptorStore.create(finalTarget, injectHeaders, serverId);\n\n // Compute local origin and optional public HTTPS origin via tunnel\n const localOrigin = urlObj.origin;\n // Tunneling disabled: always advertise local origin only\n const publicOrigin: string | null = null;\n\n const proxyPath = `/api/mcp/interceptor/${entry.id}/proxy`;\n const localProxyUrl = `${localOrigin}${proxyPath}`;\n const publicProxyUrl = publicOrigin ? `${publicOrigin}${proxyPath}` : null;\n // Prefer HTTPS tunnel when available for backward-compatible proxyUrl consumers\n const proxyUrl = publicProxyUrl || localProxyUrl;\n\n return c.json({\n success: true,\n id: entry.id,\n targetUrl: entry.targetUrl,\n proxyUrl,\n localProxyUrl,\n publicProxyUrl,\n });\n } catch (err) {\n return c.json(\n { success: false, error: (err as Error)?.message || \"Invalid JSON\" },\n 400,\n );\n }\n});\n\n// Info\ninterceptor.get(\"/:id\", (c) => {\n const id = c.req.param(\"id\");\n const info = interceptorStore.info(id);\n if (!info) return c.json({ success: false, error: \"not found\" }, 404);\n const urlObj = new URL(c.req.url);\n // HTTP-only mode: do not surface tunnel URL here\n const publicOrigin = null;\n const proxyPath = `/api/mcp/interceptor/${id}/proxy`;\n const localProxyUrl = `${urlObj.origin}${proxyPath}`;\n const publicProxyUrl = publicOrigin ? `${publicOrigin}${proxyPath}` : null;\n const proxyUrl = publicProxyUrl || localProxyUrl;\n return c.json({\n success: true,\n ...info,\n proxyUrl,\n localProxyUrl,\n publicProxyUrl,\n });\n});\n\n// Clear logs\ninterceptor.post(\"/:id/clear\", (c) => {\n const id = c.req.param(\"id\");\n const ok = interceptorStore.clearLogs(id);\n if (!ok) return c.json({ success: false, error: \"not found\" }, 404);\n return c.json({ success: true });\n});\n\n// Destroy interceptor (stop proxy)\ninterceptor.delete(\"/:id\", (c) => {\n const id = c.req.param(\"id\");\n const ok = interceptorStore.destroy(id);\n if (!ok) return c.json({ success: false, error: \"not found\" }, 404);\n return c.json({ success: true });\n});\n\n// Destroy all interceptors created for a connected server\ninterceptor.delete(\"/by-server/:serverId\", (c) => {\n const serverId = c.req.param(\"serverId\");\n const count = interceptorStore.destroyByServer(serverId);\n return c.json({ success: true, count });\n});\n\n// SSE stream of logs\ninterceptor.get(\"/:id/stream\", (c) => {\n const id = c.req.param(\"id\");\n const entry = interceptorStore.get(id);\n if (!entry) return c.json({ success: false, error: \"not found\" }, 404);\n\n const encoder = new TextEncoder();\n let unsubscribeFn: undefined | (() => void);\n const stream = new ReadableStream({\n start(controller) {\n // send history first\n for (const log of entry.logs) {\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify({ type: \"log\", log })}\\n\\n`),\n );\n }\n const subscriber = {\n send: (event: any) => {\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`),\n );\n },\n close: () => controller.close(),\n };\n const unsubscribe = interceptorStore.subscribe(id, subscriber);\n unsubscribeFn = unsubscribe;\n },\n cancel() {\n try {\n unsubscribeFn && unsubscribeFn();\n } catch {}\n },\n });\n return new Response(stream as any, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"*, Authorization, Content-Type, Accept, Accept-Language\",\n \"X-Accel-Buffering\": \"no\",\n },\n });\n});\n\n// CORS preflight for proxy endpoint\ninterceptor.options(\"/:id/proxy\", (c) => {\n return c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Max-Age\": \"86400\",\n Vary: \"Origin, Access-Control-Request-Headers\",\n });\n});\n\n// Also handle preflight on wildcard path\ninterceptor.options(\"/:id/proxy/*\", (c) => {\n return c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Max-Age\": \"86400\",\n Vary: \"Origin, Access-Control-Request-Headers\",\n });\n});\n\nasync function handleProxy(c: any) {\n const id = c.req.param(\"id\");\n const entry = interceptorStore.get(id);\n if (!entry) return c.json({ success: false, error: \"not found\" }, 404);\n\n const req = c.req.raw;\n const requestId = `${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n // read request body text safely\n let requestBody: string | undefined;\n try {\n const clone = req.clone();\n requestBody = await clone.text();\n } catch {\n requestBody = undefined;\n }\n\n // log request\n interceptorStore.appendLog(id, {\n id: requestId,\n timestamp: Date.now(),\n direction: \"request\",\n method: req.method,\n url: entry.targetUrl,\n headers: maskHeaders(req.headers),\n body: requestBody,\n });\n\n // Shim SSE for stateless servers (Cursor compatibility):\n try {\n const accept = (req.headers.get(\"accept\") || \"\").toLowerCase();\n const wantsSSE = accept.includes(\"text/event-stream\");\n const targetPathname = new URL(entry.targetUrl).pathname;\n const upstreamLooksLikeSse = /\\/sse(\\/|$)/i.test(targetPathname);\n if (req.method === \"HEAD\" && wantsSSE && !upstreamLooksLikeSse) {\n const headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n return withCORS(new Response(null, { status: 200, headers }));\n }\n if (req.method === \"GET\" && wantsSSE && !upstreamLooksLikeSse) {\n const xfProto = req.headers.get(\"x-forwarded-proto\");\n const xfHost = req.headers.get(\"x-forwarded-host\");\n const host = xfHost || req.headers.get(\"host\");\n let proto = xfProto;\n if (!proto) {\n const originHeader = req.headers.get(\"origin\");\n if (originHeader && /^https:/i.test(originHeader)) proto = \"https\";\n }\n if (!proto) proto = \"http\";\n const proxyOrigin = host ? `${proto}://${host}` : new URL(req.url).origin;\n const sessionId = crypto.randomUUID();\n // Map session to upstream base URL (stateless POST endpoint)\n interceptorStore.setSessionEndpoint(\n id,\n sessionId,\n new URL(entry.targetUrl).toString(),\n );\n const encoder = new TextEncoder();\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(encoder.encode(`event: ping\\n`));\n controller.enqueue(encoder.encode(`data: \\n\\n`));\n const endpoint = `${proxyOrigin}/api/mcp/interceptor/${id}/proxy/messages?sessionId=${sessionId}`;\n // Some clients (Cursor) expect JSON {url: ...}; others (Claude) choke on JSON and use string.\n const ua = c.req.header(\"user-agent\") || \"\";\n const isClaude = /claude/i.test(ua) || /anthropic/i.test(ua);\n if (!isClaude) {\n controller.enqueue(encoder.encode(`event: endpoint\\n`));\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify({ url: endpoint })}\\n\\n`),\n );\n }\n controller.enqueue(encoder.encode(`event: endpoint\\n`));\n controller.enqueue(encoder.encode(`data: ${endpoint}\\n\\n`));\n const t = setInterval(() => {\n try {\n controller.enqueue(\n encoder.encode(`: keepalive ${Date.now()}\\n\\n`),\n );\n } catch {}\n }, 15000);\n (controller as any)._t = t;\n },\n cancel() {\n try {\n clearInterval((this as any)._t);\n } catch {}\n },\n });\n {\n const headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n // Ensure no CL/TE conflict for dev proxies\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n return withCORS(new Response(stream as any, { headers }));\n }\n }\n } catch {}\n\n // Build upstream URL: preserve trailing path (/messages etc.) and query after /proxy/:id\n let upstreamUrl = new URL(entry.targetUrl);\n try {\n const originalUrl = new URL(req.url);\n const proxyBase = `/api/mcp/interceptor/${id}/proxy`;\n const rest = originalUrl.pathname.startsWith(proxyBase)\n ? originalUrl.pathname.slice(proxyBase.length)\n : \"\";\n const basePath = upstreamUrl.pathname.endsWith(\"/\")\n ? upstreamUrl.pathname.slice(0, -1)\n : upstreamUrl.pathname;\n const trailing = rest ? (rest.startsWith(\"/\") ? rest : `/${rest}`) : \"\";\n // Special-case: if this is our rewritten messages endpoint, forward to the original upstream endpoint\n if (trailing.startsWith(\"/messages\")) {\n const sessionId = new URL(req.url).searchParams.get(\"sessionId\") || \"\";\n const mapped = sessionId\n ? interceptorStore.getSessionEndpoint(id, sessionId)\n : undefined;\n if (mapped) {\n upstreamUrl = new URL(mapped);\n } else {\n // Stateless fallback: POST to upstream base URL (drop /messages path and local query)\n upstreamUrl.pathname = `${basePath}`;\n upstreamUrl.search = \"\";\n }\n } else {\n upstreamUrl.pathname = `${basePath}${trailing}`;\n // Preserve target URL's query parameters (e.g., API keys) and merge with request params\n const targetParams = new URLSearchParams(upstreamUrl.search);\n const requestParams = new URLSearchParams(originalUrl.search);\n // Add request params to target params (target params take precedence)\n requestParams.forEach((value, key) => {\n if (!targetParams.has(key)) {\n targetParams.set(key, value);\n }\n });\n upstreamUrl.search = targetParams.toString();\n }\n } catch {}\n\n // Filter hop-by-hop headers and forward Authorization. Drop content-length so Undici computes it.\n const filtered = new Headers();\n req.headers.forEach((value, key) => {\n const k = key.toLowerCase();\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n ].includes(k)\n )\n return;\n if (k === \"content-length\") return;\n // Let fetch set the correct Host for the upstream\n if (k === \"host\") return;\n filtered.set(key, value);\n });\n\n // Ensure Accept advertises both JSON and SSE for servers that require it (e.g., HF/Cloudflare)\n try {\n const acc = (filtered.get(\"accept\") || \"\").toLowerCase();\n const hasJson = acc.includes(\"application/json\");\n const hasSse = acc.includes(\"text/event-stream\");\n if (!hasJson || !hasSse) {\n const parts: string[] = [];\n if (!hasJson) parts.push(\"application/json\");\n if (!hasSse) parts.push(\"text/event-stream\");\n const suffix = parts.join(\", \");\n filtered.set(\"accept\", acc ? `${acc}, ${suffix}` : suffix);\n }\n } catch {}\n\n // Inject static headers (e.g., Authorization) if not already present from the client\n if (entry.injectHeaders) {\n for (const [key, value] of Object.entries(entry.injectHeaders)) {\n const k = key.toLowerCase();\n if (k === \"host\" || k === \"content-length\") continue;\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n ].includes(k)\n )\n continue;\n // Do not override an explicit client Authorization header\n if (k === \"authorization\" && filtered.has(\"authorization\")) continue;\n filtered.set(key, value);\n }\n }\n\n // No manager-backed mode: pure proxy only\n\n const init: RequestInit = {\n method: req.method,\n headers: filtered,\n };\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n init.body = requestBody;\n }\n const targetReq = new Request(upstreamUrl.toString(), init as any);\n\n try {\n const res = await fetch(targetReq);\n const resClone = res.clone();\n const ct = (res.headers.get(\"content-type\") || \"\").toLowerCase();\n const isStreaming =\n ct.includes(\"text/event-stream\") || ct.includes(\"application/x-ndjson\");\n let responseBody: string | undefined;\n try {\n if (\n ct.includes(\"text/event-stream\") ||\n ct.includes(\"application/x-ndjson\")\n ) {\n responseBody = \"[stream]\"; // avoid draining the stream\n } else {\n responseBody = await resClone.text();\n }\n } catch {\n responseBody = undefined;\n }\n // For streaming responses, skip the placeholder log and rely on detailed SSE message logs\n if (!isStreaming) {\n interceptorStore.appendLog(id, {\n id: `${requestId}-res`,\n timestamp: Date.now(),\n direction: \"response\",\n status: res.status,\n statusText: res.statusText,\n headers: Object.fromEntries(res.headers.entries()),\n body: responseBody,\n });\n }\n // If this is an SSE stream, rewrite endpoint events to point back through the proxy\n if (ct.includes(\"text/event-stream\")) {\n const upstreamBody = res.body;\n if (!upstreamBody) {\n return withCORS(\n new Response(null, { status: res.status, headers: res.headers }),\n );\n }\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let lastEventType: string | null = null;\n // Accumulate data lines for the current SSE event so we can log full payloads\n let currentEventData: string[] = [];\n const proxyBasePath = `/api/mcp/interceptor/${id}/proxy`;\n // Derive proxy origin from forwarded/host headers for direct access.\n const xfProto = c.req.header(\"x-forwarded-proto\");\n const xfHost = c.req.header(\"x-forwarded-host\");\n const reqHost = xfHost || c.req.header(\"host\");\n let reqProto = xfProto;\n if (!reqProto) {\n const originHeader = c.req.header(\"origin\");\n if (originHeader && /^https:/i.test(originHeader)) reqProto = \"https\";\n }\n if (!reqProto) reqProto = \"http\";\n const proxyOrigin = reqHost\n ? `${reqProto}://${reqHost}`\n : new URL(c.req.url).origin;\n // Prefer the resolved upstream response URL; fall back to request URL\n let upstreamOrigin = (() => {\n try {\n const u = new URL((res as any).url || upstreamUrl.toString());\n return `${u.protocol}//${u.host}`;\n } catch {\n try {\n return new URL(entry.targetUrl).origin;\n } catch {\n return \"\";\n }\n }\n })();\n const rewriteStream = new ReadableStream<Uint8Array>({\n async start(controller) {\n const reader = upstreamBody.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buffer.indexOf(\"\\n\")) !== -1) {\n const line = buffer.slice(0, idx + 1); // include newline\n buffer = buffer.slice(idx + 1);\n if (line.startsWith(\"event:\")) {\n lastEventType = line.slice(6).trim();\n controller.enqueue(encoder.encode(line));\n } else if (line.startsWith(\"data:\")) {\n // Parse data lines for endpoint hints\n const rawLine = line.slice(5); // keep trailing newline\n const trimmed = rawLine.trim();\n // Track data lines for this event so we can log at event boundary\n currentEventData.push(trimmed);\n let endpointUrl: string | null = null;\n try {\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const obj = JSON.parse(trimmed);\n // Accept various shapes\n endpointUrl =\n obj?.url ||\n obj?.endpoint?.url ||\n (obj?.type === \"endpoint\" &&\n (obj?.data?.url || obj?.data));\n }\n } catch {}\n if (!endpointUrl) {\n // Heuristic: plain string containing \"/message\" looks like endpoint URL\n const str = trimmed;\n if (/message\\?/.test(str) || /messages\\?/.test(str)) {\n endpointUrl = str;\n }\n }\n if (endpointUrl) {\n try {\n const u = new URL(\n endpointUrl,\n upstreamOrigin || undefined,\n );\n const sessionId =\n u.searchParams.get(\"sessionId\") ||\n u.searchParams.get(\"sid\") ||\n \"\";\n if (sessionId) {\n interceptorStore.setSessionEndpoint(\n id,\n sessionId,\n u.toString(),\n );\n try {\n console.log(\"[proxy] mapped session\", {\n id,\n sessionId,\n upstream: u.toString(),\n });\n } catch {}\n }\n const proxyEndpoint = `${proxyOrigin}${proxyBasePath}/messages${u.search}`;\n // Emit a single endpoint event with a plain string URL (most compatible)\n controller.enqueue(encoder.encode(`event: endpoint\\n`));\n controller.enqueue(\n encoder.encode(`data: ${proxyEndpoint}\\n\\n`),\n );\n // Reset current event buffer since we emitted a translated event\n currentEventData = [];\n continue; // skip original data line\n } catch {\n // fall through\n }\n }\n // Not an endpoint payload; pass through\n controller.enqueue(encoder.encode(line));\n } else if (line === \"\\n\") {\n // End of an SSE event — if it was a message event, mirror it into logs\n if (lastEventType === \"message\") {\n const dataText = currentEventData.join(\"\\n\");\n let bodyText = dataText;\n try {\n // Many servers send a single JSON line; keep original text if parse fails\n const parsed = JSON.parse(dataText);\n bodyText = JSON.stringify(parsed);\n } catch {}\n try {\n interceptorStore.appendLog(id, {\n id: `${requestId}-sse-${Date.now()}`,\n timestamp: Date.now(),\n direction: \"response\",\n status: 200,\n statusText: \"SSE message\",\n headers: { \"content-type\": \"text/event-stream\" },\n body: bodyText,\n });\n } catch {}\n }\n currentEventData = [];\n lastEventType = null;\n controller.enqueue(encoder.encode(line));\n } else {\n controller.enqueue(encoder.encode(line));\n }\n }\n }\n if (buffer.length) controller.enqueue(encoder.encode(buffer));\n } finally {\n try {\n controller.close();\n } catch {}\n }\n },\n });\n const headers = new Headers(res.headers);\n // For streaming responses, do not send Content-Length; Node will use chunked framing.\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n // Let the runtime decide Transfer-Encoding; keep-alive semantics for SSE\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n headers.set(\"Cache-Control\", \"no-cache\");\n headers.set(\"Connection\", \"keep-alive\");\n return withCORS(\n new Response(rewriteStream as any, {\n status: res.status,\n statusText: res.statusText,\n headers,\n }),\n );\n }\n\n // Non-SSE: passthrough (avoid CL+TE conflict) — always drop Content-Length\n const nonSseHeaders = new Headers(res.headers);\n nonSseHeaders.delete(\"content-length\");\n nonSseHeaders.delete(\"Content-Length\");\n const passthrough = new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers: nonSseHeaders,\n });\n return withCORS(passthrough);\n } catch (error) {\n const body = JSON.stringify({ error: String(error) });\n interceptorStore.appendLog(id, {\n id: `${requestId}-err`,\n timestamp: Date.now(),\n direction: \"response\",\n status: 500,\n statusText: \"Proxy Error\",\n headers: { \"content-type\": \"application/json\" },\n body,\n });\n return withCORS(\n new Response(body, {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n }),\n );\n }\n}\n\n// HTTP proxy for JSON-RPC\ninterceptor.all(\"/:id/proxy\", handleProxy);\ninterceptor.all(\"/:id/proxy/*\", handleProxy);\n\nexport default interceptor;\n","import { randomUUID } from \"crypto\";\n\nexport type InterceptorLog =\n | {\n id: string;\n timestamp: number;\n direction: \"request\";\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: string;\n }\n | {\n id: string;\n timestamp: number;\n direction: \"response\";\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body?: string;\n };\n\ntype SseSubscriber = {\n send: (event: any) => void;\n close: () => void;\n};\n\ntype InterceptorEntry = {\n id: string;\n targetUrl: string;\n createdAt: number;\n logs: InterceptorLog[];\n subscribers: Set<SseSubscriber>;\n // Optional static headers to inject on every upstream request (e.g., Authorization)\n injectHeaders?: Record<string, string>;\n // Map sessionId -> upstream messages endpoint URL (rewritten SSE support)\n sessionEndpoints: Map<string, string>;\n // Optional originating connected server id (for bulk cleanup)\n serverId?: string;\n};\n\nclass InterceptorStore {\n private interceptors: Map<string, InterceptorEntry> = new Map();\n private sessionIndex: Map<string, { interceptorId: string; url: string }> =\n new Map();\n private byServer: Map<string, Set<string>> = new Map();\n\n create(\n targetUrl: string,\n injectHeaders?: Record<string, string>,\n serverId?: string,\n ) {\n // Use a longer, hard-to-guess id (32 hex chars)\n const id = randomUUID().replace(/-/g, \"\");\n const entry: InterceptorEntry = {\n id,\n targetUrl,\n createdAt: Date.now(),\n logs: [],\n subscribers: new Set(),\n injectHeaders,\n sessionEndpoints: new Map(),\n serverId,\n };\n this.interceptors.set(id, entry);\n if (serverId) {\n if (!this.byServer.has(serverId)) this.byServer.set(serverId, new Set());\n this.byServer.get(serverId)!.add(id);\n }\n return entry;\n }\n\n get(id: string) {\n return this.interceptors.get(id);\n }\n\n info(id: string) {\n const e = this.interceptors.get(id);\n if (!e) return undefined;\n return {\n id: e.id,\n targetUrl: e.targetUrl,\n createdAt: e.createdAt,\n logCount: e.logs.length,\n hasInjectedAuth: !!e.injectHeaders?.authorization,\n };\n }\n\n clearLogs(id: string) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.logs = [];\n this.broadcast(e, { type: \"cleared\" });\n return true;\n }\n\n appendLog(id: string, log: InterceptorLog) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.logs.push(log);\n this.broadcast(e, { type: \"log\", log });\n return true;\n }\n\n listLogs(id: string) {\n const e = this.interceptors.get(id);\n return e?.logs ?? [];\n }\n\n subscribe(id: string, subscriber: SseSubscriber) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.subscribers.add(subscriber);\n return () => {\n e.subscribers.delete(subscriber);\n };\n }\n\n setSessionEndpoint(id: string, sessionId: string, url: string) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.sessionEndpoints.set(sessionId, url);\n this.sessionIndex.set(sessionId, { interceptorId: id, url });\n return true;\n }\n\n getSessionEndpoint(id: string, sessionId: string): string | undefined {\n const e = this.interceptors.get(id);\n return e?.sessionEndpoints.get(sessionId);\n }\n\n getSessionMapping(\n sessionId: string,\n ): { interceptorId: string; url: string } | undefined {\n return this.sessionIndex.get(sessionId);\n }\n\n destroy(id: string): boolean {\n const e = this.interceptors.get(id);\n if (!e) return false;\n // Close and remove subscribers\n for (const sub of Array.from(e.subscribers)) {\n try {\n sub.send({ type: \"closed\" });\n } catch {}\n try {\n sub.close();\n } catch {}\n }\n e.subscribers.clear();\n // Remove session mappings for this interceptor\n for (const sid of Array.from(e.sessionEndpoints.keys())) {\n this.sessionIndex.delete(sid);\n }\n this.interceptors.delete(id);\n return true;\n }\n\n destroyByServer(serverId: string): number {\n const set = this.byServer.get(serverId);\n if (!set || set.size === 0) return 0;\n let count = 0;\n for (const id of Array.from(set)) {\n if (this.destroy(id)) count++;\n }\n this.byServer.delete(serverId);\n return count;\n }\n\n private broadcast(e: InterceptorEntry, payload: any) {\n for (const sub of Array.from(e.subscribers)) {\n try {\n sub.send(payload);\n } catch {\n try {\n sub.close();\n } catch {}\n e.subscribers.delete(sub);\n }\n }\n }\n}\n\nexport const interceptorStore = new InterceptorStore();\n","import { Hono } from \"hono\";\nimport \"../../types/hono\";\nimport { handleJsonRpc, BridgeMode } from \"../../services/mcp-http-bridge\";\n\n// In-memory SSE session store per serverId:sessionId\ntype Session = {\n send: (event: string, data: string) => void;\n close: () => void;\n};\nconst sessions: Map<string, Session> = new Map();\nconst latestSessionByServer: Map<string, string> = new Map();\n\n// Unified HTTP adapter that handles both adapter-http and manager-http routes\n// with the same robust implementation but different JSON-RPC response modes\n\nfunction createHttpHandler(mode: BridgeMode, routePrefix: string) {\n const router = new Hono();\n\n router.options(\"/:serverId\", (c) =>\n c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"*, Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Expose-Headers\": \"*\",\n \"Access-Control-Max-Age\": \"86400\",\n }),\n );\n\n // Wildcard variants to tolerate trailing paths (e.g., /mcp)\n router.options(\"/:serverId/*\", (c) =>\n c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"*, Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Expose-Headers\": \"*\",\n \"Access-Control-Max-Age\": \"86400\",\n }),\n );\n\n async function handleHttp(c: any) {\n const serverId = c.req.param(\"serverId\");\n const method = c.req.method;\n\n // SSE endpoint for clients that probe/subscribe via GET; HEAD advertises event-stream\n if (method === \"HEAD\") {\n return c.body(null, 200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"X-Accel-Buffering\": \"no\",\n });\n }\n if (method === \"GET\") {\n const encoder = new TextEncoder();\n const incomingUrl = new URL(c.req.url);\n // Allow proxy to override the endpoint base so the client posts back through the proxy\n const overrideBase = c.req.header(\"x-mcpjam-endpoint-base\");\n let endpointBase: string;\n if (overrideBase && overrideBase.trim() !== \"\") {\n endpointBase = overrideBase.trim();\n } else {\n // Compute an absolute endpoint based on forwarded headers when present\n // so direct access (without the proxy) advertises a reachable URL.\n const xfProto = c.req.header(\"x-forwarded-proto\");\n const xfHost = c.req.header(\"x-forwarded-host\");\n const host = xfHost || c.req.header(\"host\");\n let proto = xfProto;\n if (!proto) {\n const originHeader = c.req.header(\"origin\");\n if (originHeader && /^https:/i.test(originHeader)) proto = \"https\";\n }\n if (!proto) proto = \"http\";\n const origin = host ? `${proto}://${host}` : incomingUrl.origin;\n endpointBase = `${origin}/api/mcp/${routePrefix}/${serverId}/messages`;\n }\n const sessionId = crypto.randomUUID();\n let timer: any;\n const stream = new ReadableStream({\n start(controller) {\n console.log(`[${routePrefix}] SSE open`, { serverId, sessionId });\n const send = (event: string, data: string) => {\n controller.enqueue(encoder.encode(`event: ${event}\\n`));\n controller.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n };\n const close = () => {\n try {\n controller.close();\n } catch {}\n };\n\n // Register session\n sessions.set(`${serverId}:${sessionId}`, { send, close });\n latestSessionByServer.set(serverId, sessionId);\n console.log(`[${routePrefix}] session registered`, {\n key: `${serverId}:${sessionId}`,\n });\n\n // Ping and endpoint per SSE transport handshake\n send(\"ping\", \"\");\n const sep = endpointBase.includes(\"?\") ? \"&\" : \"?\";\n const url = `${endpointBase}${sep}sessionId=${sessionId}`;\n console.log(`[${routePrefix}] endpoint`, {\n serverId,\n sessionId,\n url,\n });\n // Emit endpoint as JSON (spec-friendly) then as a plain string (compat).\n try {\n send(\"endpoint\", JSON.stringify({ url, headers: {} }));\n } catch {}\n try {\n send(\"endpoint\", url);\n } catch {}\n\n // Periodic keepalive comments so proxies don't buffer/close\n timer = setInterval(() => {\n try {\n controller.enqueue(\n encoder.encode(`: keepalive ${Date.now()}\\n\\n`),\n );\n } catch {}\n }, 15000);\n },\n cancel() {\n try {\n clearInterval(timer);\n } catch {}\n console.log(`[${routePrefix}] SSE close`, { serverId, sessionId });\n sessions.delete(`${serverId}:${sessionId}`);\n // If this session was the latest for this server, clear pointer\n if (latestSessionByServer.get(serverId) === sessionId) {\n latestSessionByServer.delete(serverId);\n }\n },\n });\n return c.body(stream as any, 200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n \"X-Accel-Buffering\": \"no\",\n \"Transfer-Encoding\": \"chunked\",\n });\n }\n\n if (method !== \"POST\") {\n return c.json({ error: \"Unsupported request\" }, 400);\n }\n\n // Parse JSON body (best effort)\n let body: any = undefined;\n try {\n body = await c.req.json();\n } catch {}\n\n const clientManager = c.mcpJamClientManager;\n const response = await handleJsonRpc(\n serverId,\n body as any,\n clientManager,\n mode,\n );\n if (!response) {\n // Notification → 202 Accepted\n return c.body(\"Accepted\", 202, { \"Access-Control-Allow-Origin\": \"*\" });\n }\n return c.body(JSON.stringify(response), 200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n }\n\n // Endpoint to receive client messages for SSE transport: /:serverId/messages?sessionId=...\n router.post(\"/:serverId/messages\", async (c) => {\n const serverId = c.req.param(\"serverId\");\n const url = new URL(c.req.url);\n const sessionId = url.searchParams.get(\"sessionId\") || \"\";\n const key = `${serverId}:${sessionId}`;\n let sess = sessions.get(key);\n if (!sess) {\n const fallbackId = latestSessionByServer.get(serverId);\n if (fallbackId) {\n sess = sessions.get(`${serverId}:${fallbackId}`);\n }\n }\n console.log(`[${routePrefix}] POST messages`, {\n key,\n resolved: !!sess,\n contentType: c.req.header(\"content-type\"),\n });\n if (!sess) {\n return c.json({ error: \"Invalid session\" }, 400);\n }\n let body: any;\n try {\n body = await c.req.json();\n } catch {\n try {\n const txt = await c.req.text();\n body = txt ? JSON.parse(txt) : undefined;\n } catch {\n body = undefined;\n }\n }\n const id = body?.id ?? null;\n const method = body?.method as string | undefined;\n const params = body?.params ?? {};\n\n // Reuse the JSON-RPC handling via bridge\n try {\n const responseMessage = await handleJsonRpc(\n serverId,\n { id, method, params },\n c.mcpJamClientManager,\n mode,\n );\n // If there is a JSON-RPC response, emit it over SSE to the client\n if (responseMessage) {\n try {\n console.log(`[${routePrefix}] emit message`, {\n key,\n id: responseMessage.id,\n method,\n });\n sess.send(\"message\", JSON.stringify(responseMessage));\n } catch {}\n }\n // 202 Accepted per SSE transport semantics\n return c.body(\"Accepted\", 202, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n } catch (e: any) {\n return c.body(\"Error\", 400, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n }\n });\n\n // Register catch-all handlers AFTER the messages route so it isn't shadowed\n router.all(\"/:serverId\", handleHttp);\n router.all(\"/:serverId/*\", handleHttp);\n\n return router;\n}\n\n// Create both adapters with their respective modes\nexport const adapterHttp = createHttpHandler(\"adapter\", \"adapter-http\");\nexport const managerHttp = createHttpHandler(\"manager\", \"manager-http\");\n\n// Export default for backward compatibility (adapter)\nexport default adapterHttp;\n","import { MCPJamClientManager } from \"./mcpjam-client-manager\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\n// Unify JSON-RPC handling used by adapter-http and manager-http routes\n// while preserving their minor response-shape differences.\n\nexport type BridgeMode = \"adapter\" | \"manager\";\n\ntype JsonRpcBody = {\n id?: string | number | null;\n method?: string;\n params?: any;\n};\n\nexport function buildInitializeResult(serverId: string, mode: BridgeMode) {\n if (mode === \"adapter\") {\n return {\n protocolVersion: \"2025-06-18\",\n capabilities: {\n tools: { listChanged: true },\n prompts: {},\n resources: { listChanged: true, subscribe: true },\n logging: {},\n roots: { listChanged: true },\n },\n serverInfo: { name: serverId, version: \"stdio-adapter\" },\n };\n }\n // manager mode (SSE transport facade)\n return {\n protocolVersion: \"2025-06-18\",\n capabilities: {\n tools: true,\n prompts: true,\n resources: true,\n logging: false,\n elicitation: {},\n roots: { listChanged: true },\n },\n serverInfo: { name: serverId, version: \"mcpjam-proxy\" },\n };\n}\n\nfunction toJsonSchemaMaybe(schema: any): any {\n try {\n if (schema && typeof schema === \"object\") {\n // Detect Zod schema heuristically\n if (\n schema instanceof z.ZodType ||\n (\"_def\" in schema && \"parse\" in schema)\n ) {\n return zodToJsonSchema(schema as z.ZodType<any>);\n }\n }\n } catch {}\n return schema;\n}\n\nexport async function handleJsonRpc(\n serverId: string,\n body: JsonRpcBody,\n clientManager: MCPJamClientManager,\n mode: BridgeMode,\n): Promise<any | null> {\n const id = (body?.id ?? null) as any;\n const method = body?.method as string | undefined;\n const params = body?.params ?? {};\n\n // Treat missing method and notifications/* as notifications (no response envelope)\n if (!method || method.startsWith(\"notifications/\")) {\n return null;\n }\n\n const respond = (payload: any) => ({ jsonrpc: \"2.0\", id, ...payload });\n\n try {\n switch (method) {\n case \"ping\":\n return respond({ result: {} });\n case \"initialize\": {\n const result = buildInitializeResult(serverId, mode);\n return respond({ result });\n }\n case \"tools/list\": {\n const toolsets = await clientManager.getToolsetsForServer(serverId);\n const tools = Object.keys(toolsets).map((name) => ({\n name,\n description: (toolsets as any)[name].description,\n inputSchema: toJsonSchemaMaybe((toolsets as any)[name].inputSchema),\n outputSchema: toJsonSchemaMaybe((toolsets as any)[name].outputSchema),\n }));\n return respond({ result: { tools } });\n }\n case \"tools/call\": {\n try {\n const exec = await clientManager.executeToolDirect(\n `${serverId}:${params?.name}`,\n params?.arguments || {},\n );\n if (mode === \"manager\") {\n // Spec-style CallToolResult\n const result = {\n content: [\n {\n type: \"text\",\n text:\n typeof (exec as any).result === \"string\"\n ? (exec as any).result\n : JSON.stringify((exec as any).result, null, 2),\n },\n ],\n isError: false,\n };\n return respond({ result });\n }\n // adapter mode returns raw result\n return respond({ result: (exec as any).result });\n } catch (e: any) {\n if (mode === \"manager\") {\n const result = {\n content: [\n { type: \"text\", text: `Error: ${e?.message || String(e)}` },\n ],\n isError: true,\n };\n return respond({ result });\n }\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n }\n case \"resources/list\": {\n const resources = clientManager\n .getResourcesForServer(serverId)\n .map((r) => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n }));\n return respond({ result: { resources } });\n }\n case \"resources/read\": {\n try {\n const content = await clientManager.getResource(\n params?.uri,\n serverId,\n );\n if (mode === \"manager\") {\n const result = {\n contents: [\n {\n uri: params?.uri,\n mimeType: (content as any)?.mimeType || \"text/plain\",\n text:\n typeof content === \"string\"\n ? content\n : JSON.stringify(content, null, 2),\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: content });\n } catch (e: any) {\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n }\n case \"prompts/list\": {\n const prompts = clientManager\n .getPromptsForServer(serverId)\n .map((p) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n }));\n return respond({ result: { prompts } });\n }\n case \"prompts/get\": {\n try {\n const content = await clientManager.getPrompt(\n params?.name,\n serverId,\n params?.arguments || {},\n );\n if (mode === \"manager\") {\n const result = {\n description:\n (content as any)?.description || `Prompt: ${params?.name}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text:\n typeof content === \"string\"\n ? content\n : JSON.stringify(content, null, 2),\n },\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: content });\n } catch (e: any) {\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n }\n case \"roots/list\": {\n return respond({ result: { roots: [] } });\n }\n case \"logging/setLevel\": {\n return respond({ result: { success: true } });\n }\n default: {\n return respond({\n error: { code: -32601, message: `Method not implemented: ${method}` },\n });\n }\n }\n } catch (e: any) {\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n}\n","import { MCPClient, MastraMCPServerDefinition } from \"@mastra/mcp\";\nimport { validateServerConfig } from \"../utils/mcp-utils\";\nimport { DynamicArgument } from \"@mastra/core/base\";\nimport { ToolsInput } from \"@mastra/core/agent\";\n\nexport type ConnectionStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport interface DiscoveredTool {\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n serverId: string;\n}\n\nexport interface DiscoveredResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n serverId: string;\n}\n\nexport interface DiscoveredPrompt {\n name: string;\n description?: string;\n arguments?: Record<string, any>;\n serverId: string;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n}\n\nexport interface ChatResponse {\n text?: string;\n toolCalls?: any[];\n toolResults?: any[];\n}\n\nexport interface ToolResult {\n result: any;\n}\n\nexport interface ElicitationRequest {\n message: string;\n requestedSchema: any;\n}\n\nexport interface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\nexport interface ResourceContent {\n contents: any[];\n}\n\nexport interface PromptResult {\n content: any;\n}\n\nfunction generateUniqueServerId(serverId: string) {\n // Generate unique server ID that avoids collisions\n const normalizedBase = serverId\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nclass MCPJamClientManager {\n private mcpClients: Map<string, MCPClient> = new Map();\n private statuses: Map<string, ConnectionStatus> = new Map();\n private configs: Map<string, MastraMCPServerDefinition> = new Map();\n\n // Map original server names to unique IDs\n private serverIdMapping: Map<string, string> = new Map();\n\n // Track in-flight connections to avoid duplicate concurrent connects\n private pendingConnections: Map<string, Promise<void>> = new Map();\n\n private toolRegistry: Map<string, DiscoveredTool> = new Map();\n private resourceRegistry: Map<string, DiscoveredResource> = new Map();\n private promptRegistry: Map<string, DiscoveredPrompt> = new Map();\n\n // Store for pending elicitation requests with Promise resolvers\n private pendingElicitations: Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > = new Map();\n\n // Optional callback for handling elicitation requests\n private elicitationCallback?: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>;\n\n // Centralized server ID resolution - handles both original names and unique IDs\n private resolveServerId(serverIdentifier: string): string | undefined {\n if (this.mcpClients.has(serverIdentifier)) {\n return serverIdentifier;\n }\n return this.serverIdMapping.get(serverIdentifier);\n }\n\n // Public method to get server ID for external use (like frontend)\n getServerIdForName(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n private flattenToolsets(toolsets: Record<string, any>): Record<string, any> {\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n return flattenedTools;\n }\n\n async getFlattenedToolsetsForEnabledServers(\n serverNameFilter?: string[],\n ): Promise<DynamicArgument<ToolsInput>> {\n const allFlattenedTools: Record<string, any> = {};\n const allServerIdsFromFilter = serverNameFilter?.map((serverName) =>\n this.getServerIdForName(serverName),\n ); // Optional filter by servers selected\n\n for (const [serverId, client] of this.mcpClients.entries()) {\n if (serverNameFilter && !allServerIdsFromFilter?.includes(serverId))\n continue;\n if (this.getConnectionStatus(serverId) !== \"connected\") continue;\n try {\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n Object.assign(allFlattenedTools, flattenedTools);\n } catch (error) {\n console.warn(`Failed to get tools from server ${serverId}:`, error);\n }\n }\n\n return allFlattenedTools as DynamicArgument<ToolsInput>;\n }\n\n async getToolsetsForServer(\n serverId: string,\n ): Promise<DynamicArgument<ToolsInput>> {\n const id = this.resolveServerId(serverId);\n if (!id) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n const client = this.mcpClients.get(id);\n if (!client) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n // Get toolsets and flatten them\n const toolsets = await client.getToolsets();\n return this.flattenToolsets(toolsets) as DynamicArgument<ToolsInput>;\n }\n\n async connectToServer(serverId: string, serverConfig: any): Promise<void> {\n // If a connection is already in-flight for this server name, wait for it\n const pending = this.pendingConnections.get(serverId);\n if (pending) {\n await pending;\n return;\n }\n\n const connectPromise = (async () => {\n // Reuse existing unique ID for this server name if present; otherwise generate and map one\n let id = this.serverIdMapping.get(serverId);\n if (!id) {\n id = generateUniqueServerId(serverId);\n this.serverIdMapping.set(serverId, id);\n }\n\n // If already connected, no-op\n if (this.mcpClients.has(id)) return;\n\n // Validate server configuration\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n this.statuses.set(id, \"error\");\n throw new Error(validation.error!.message);\n }\n\n this.configs.set(id, validation.config!);\n this.statuses.set(id, \"connecting\");\n\n const client = new MCPClient({\n id: `mcpjam-${id}`,\n servers: { [id]: validation.config! },\n });\n\n try {\n // touch the server to verify connection\n await client.getTools();\n this.mcpClients.set(id, client);\n this.statuses.set(id, \"connected\");\n\n // Register elicitation handler for this server\n if (client.elicitation?.onRequest) {\n client.elicitation.onRequest(\n id,\n async (elicitationRequest: ElicitationRequest) => {\n return await this.handleElicitationRequest(elicitationRequest);\n },\n );\n }\n\n await this.discoverServerResources(id);\n } catch (err) {\n this.statuses.set(id, \"error\");\n try {\n await client.disconnect();\n } catch {}\n this.mcpClients.delete(id);\n throw err;\n }\n })().finally(() => {\n this.pendingConnections.delete(serverId);\n });\n\n this.pendingConnections.set(serverId, connectPromise);\n await connectPromise;\n }\n\n async disconnectFromServer(serverId: string): Promise<void> {\n const id = this.resolveServerId(serverId);\n if (!id) return; // Server not found\n\n const client = this.mcpClients.get(id);\n if (client) {\n try {\n await client.disconnect();\n } catch {}\n }\n this.mcpClients.delete(id);\n this.statuses.set(id, \"disconnected\");\n this.serverIdMapping.delete(serverId); // Clean up the mapping\n\n // purge registries for this server\n for (const key of Array.from(this.toolRegistry.keys())) {\n const item = this.toolRegistry.get(key)!;\n if (item.serverId === id) this.toolRegistry.delete(key);\n }\n for (const key of Array.from(this.resourceRegistry.keys())) {\n const item = this.resourceRegistry.get(key)!;\n if (item.serverId === id) this.resourceRegistry.delete(key);\n }\n for (const key of Array.from(this.promptRegistry.keys())) {\n const item = this.promptRegistry.get(key)!;\n if (item.serverId === id) this.promptRegistry.delete(key);\n }\n }\n\n getConnectionStatus(serverId: string): ConnectionStatus {\n const id = this.resolveServerId(serverId);\n return id ? this.statuses.get(id) || \"disconnected\" : \"disconnected\";\n }\n\n getConnectedServers(): Record<\n string,\n { status: ConnectionStatus; config?: MastraMCPServerDefinition }\n > {\n const servers: Record<\n string,\n { status: ConnectionStatus; config?: MastraMCPServerDefinition }\n > = {};\n\n // Return data keyed by the original server names provided by callers\n for (const [originalName, uniqueId] of this.serverIdMapping.entries()) {\n servers[originalName] = {\n status: this.statuses.get(uniqueId) || \"disconnected\",\n config: this.configs.get(uniqueId),\n };\n }\n return servers;\n }\n\n async discoverAllResources(): Promise<void> {\n const serverIds = Array.from(this.mcpClients.keys());\n await Promise.all(serverIds.map((id) => this.discoverServerResources(id)));\n }\n\n private async discoverServerResources(serverId: string): Promise<void> {\n // serverId is already the unique ID when called from connectToServer\n const client = this.mcpClients.get(serverId);\n if (!client) return;\n\n // Tools - use toolsets instead of getTools for consistency\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n\n for (const [name, tool] of Object.entries<any>(flattenedTools)) {\n this.toolRegistry.set(`${serverId}:${name}`, {\n name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: (tool as any).outputSchema,\n serverId: serverId,\n });\n }\n\n // Resources\n try {\n const res = await client.resources.list();\n for (const [, list] of Object.entries<any>(res)) {\n for (const r of list as any[]) {\n this.resourceRegistry.set(`${serverId}:${r.uri}`, {\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n serverId: serverId,\n });\n }\n }\n } catch {}\n\n // Prompts\n try {\n const prompts = await client.prompts.list();\n for (const [, list] of Object.entries<any>(prompts)) {\n for (const p of list as any[]) {\n this.promptRegistry.set(`${serverId}:${p.name}`, {\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n serverId: serverId,\n });\n }\n }\n } catch {}\n }\n\n getAvailableTools(): DiscoveredTool[] {\n return Array.from(this.toolRegistry.values());\n }\n\n getAvailableResources(): DiscoveredResource[] {\n return Array.from(this.resourceRegistry.values());\n }\n\n getResourcesForServer(serverId: string): DiscoveredResource[] {\n const id = this.resolveServerId(serverId);\n if (!id) return [];\n return Array.from(this.resourceRegistry.values()).filter(\n (r) => r.serverId === id,\n );\n }\n\n getAvailablePrompts(): DiscoveredPrompt[] {\n return Array.from(this.promptRegistry.values());\n }\n\n getPromptsForServer(serverId: string): DiscoveredPrompt[] {\n const id = this.resolveServerId(serverId);\n if (!id) return [];\n return Array.from(this.promptRegistry.values()).filter(\n (p) => p.serverId === id,\n );\n }\n\n async executeToolDirect(\n toolName: string,\n parameters: Record<string, any> = {},\n ): Promise<ToolResult> {\n // toolName may include server prefix \"serverId:tool\"\n let serverId = \"\";\n let name = toolName;\n\n if (toolName.includes(\":\")) {\n const [sid, n] = toolName.split(\":\", 2);\n serverId = this.resolveServerId(sid) || \"\";\n name = n;\n } else {\n // Find which server has this tool by checking un-prefixed name\n for (const tool of this.toolRegistry.values()) {\n if (tool.name === toolName) {\n serverId = tool.serverId;\n name = toolName;\n break;\n }\n }\n }\n\n // If not found in registry, try to find it using toolsets from all connected servers\n if (!serverId) {\n for (const [clientServerId, client] of this.mcpClients.entries()) {\n try {\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n\n if (flattenedTools[toolName]) {\n serverId = clientServerId;\n name = toolName;\n break;\n }\n } catch {\n // Continue to next server if this one fails\n }\n }\n }\n\n if (!serverId) {\n throw new Error(`Tool not found in any connected server: ${toolName}`);\n }\n\n const client = this.mcpClients.get(serverId);\n if (!client)\n throw new Error(`No MCP client available for server: ${serverId}`);\n\n // Use toolsets to get the actual tool\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n\n const tool = flattenedTools[name];\n if (!tool)\n throw new Error(`Tool '${name}' not found in server '${serverId}'`);\n\n // Inspect input schema to choose the most likely argument shape, but be robust and\n // fall back to the alternate shape on invalid-arguments errors.\n const schema: any = (tool as any).inputSchema;\n const hasContextProperty =\n schema &&\n typeof schema === \"object\" &&\n (schema as any).properties &&\n Object.prototype.hasOwnProperty.call(\n (schema as any).properties,\n \"context\",\n );\n const requiresContext =\n hasContextProperty ||\n (schema &&\n Array.isArray((schema as any).required) &&\n (schema as any).required.includes(\"context\"));\n\n const contextWrapped = { context: parameters || {} };\n const direct = parameters || {};\n const attempts = requiresContext\n ? [contextWrapped, direct]\n : [direct, contextWrapped];\n\n let lastError: any = undefined;\n for (const args of attempts) {\n try {\n console.log(\"args\", args);\n const result = await tool.execute(args);\n\n // Check if the result indicates an error\n if (result && result.isError) {\n const errorText =\n result.content && result.content[0] && result.content[0].text\n ? result.content[0].text\n : \"Unknown error\";\n throw new Error(errorText);\n }\n\n return { result };\n } catch (err: any) {\n lastError = err;\n }\n }\n throw lastError;\n }\n\n async getResource(\n resourceUri: string,\n serverId: string,\n ): Promise<ResourceContent> {\n // resourceUri may include server prefix\n let uri = resourceUri;\n const resolvedServerId = this.resolveServerId(serverId);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.resources.read(resolvedServerId, uri);\n return { contents: content?.contents || [] };\n }\n\n async getPrompt(\n promptName: string,\n serverId: string,\n args?: Record<string, any>,\n ): Promise<PromptResult> {\n const resolvedServerId = this.resolveServerId(serverId);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.prompts.get({\n serverName: resolvedServerId,\n name: promptName,\n args: args || {},\n });\n return { content };\n }\n\n /**\n * Handles elicitation requests from MCP servers during direct tool execution\n */\n private async handleElicitationRequest(\n elicitationRequest: ElicitationRequest,\n ): Promise<ElicitationResponse> {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Create a promise that will be resolved when the user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n this.pendingElicitations.set(requestId, { resolve, reject });\n\n // If there's an active elicitation callback, use it\n if (this.elicitationCallback) {\n this.elicitationCallback({\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n })\n .then(resolve)\n .catch(reject);\n } else {\n // If no callback is set, reject with details for the tools route to handle\n const error = new Error(\"ELICITATION_REQUIRED\");\n (error as any).elicitationRequest = {\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n };\n reject(error);\n }\n });\n }\n\n /**\n * Responds to a pending elicitation request\n */\n respondToElicitation(\n requestId: string,\n response: ElicitationResponse,\n ): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) {\n return false;\n }\n\n pending.resolve(response);\n this.pendingElicitations.delete(requestId);\n return true;\n }\n\n /**\n * Gets the pending elicitations map for external access\n */\n getPendingElicitations(): Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n /**\n * Sets a callback to handle elicitation requests\n */\n setElicitationCallback(\n callback: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>,\n ): void {\n this.elicitationCallback = callback;\n }\n\n /**\n * Clears the elicitation callback\n */\n clearElicitationCallback(): void {\n this.elicitationCallback = undefined;\n }\n}\n\n// Export the class directly instead of singleton\nexport { MCPJamClientManager };\nexport default MCPJamClientManager;\n"],"mappings":"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","names":["Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","Hono","mcp","tool","Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","zodToJsonSchema","options","fallbackConfig","tools","tool","zodToJsonSchema","Hono","tool","TextEncoder","response","Hono","tools","Hono","tool","tools","Hono","Hono","zodToJsonSchema","Hono","mcp","tools","tool","zodToJsonSchema","resources","prompts","Hono","Hono","Hono","z","zodToJsonSchema","tools","resources","prompts","Hono","Hono","MCPClient","MCPClient","servers","tool","prompts","client","toolsets","flattenedTools","servers","Hono"]}
|
|
1
|
+
{"version":3,"sources":["../../server/index.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/routes/mcp/servers.ts","../../server/routes/mcp/tools.ts","../../server/routes/mcp/resources.ts","../../server/routes/mcp/prompts.ts","../../server/routes/mcp/chat.ts","../../client/src/lib/chat-utils.ts","../../server/utils/chat-helpers.ts","../../shared/tools.ts","../../shared/http-tool-calls.ts","../../server/routes/mcp/tests.ts","../../server/utils/mcp-utils.ts","../../server/routes/mcp/oauth.ts","../../server/routes/mcp/export.ts","../../server/routes/mcp/interceptor.ts","../../server/services/interceptor-store.ts","../../server/routes/mcp/http-adapters.ts","../../server/services/mcp-http-bridge.ts","../../server/services/mcpjam-client-manager.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport dotenv from \"dotenv\";\nimport fixPath from \"fix-path\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { logger } from \"hono/logger\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { join, dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n};\n\n// Utility function to create a boxed console output\nfunction logBox(content: string, title?: string) {\n const lines = content.split(\"\\n\");\n const maxLength = Math.max(...lines.map((line) => line.length));\n const width = maxLength + 4;\n\n console.log(\"┌\" + \"─\".repeat(width) + \"┐\");\n if (title) {\n const titlePadding = Math.floor((width - title.length - 2) / 2);\n console.log(\n \"│\" +\n \" \".repeat(titlePadding) +\n title +\n \" \".repeat(width - title.length - titlePadding) +\n \"│\",\n );\n console.log(\"├\" + \"─\".repeat(width) + \"┤\");\n }\n\n lines.forEach((line) => {\n const padding = width - line.length - 2;\n console.log(\"│ \" + line + \" \".repeat(padding) + \" │\");\n });\n\n console.log(\"└\" + \"─\".repeat(width) + \"┘\");\n}\n\n// Import routes and services\nimport mcpRoutes from \"./routes/mcp/index\";\nimport { interceptorStore } from \"./services/interceptor-store\";\nimport { MCPJamClientManager } from \"./services/mcpjam-client-manager\";\nimport \"./types/hono\"; // Type extensions\n\n// Utility function to extract MCP server config from environment variables\nfunction getMCPConfigFromEnv() {\n // First check if we have a full config file\n const configData = process.env.MCP_CONFIG_DATA;\n if (configData) {\n try {\n const config = JSON.parse(configData);\n console.log(\"Parsed config data:\", config);\n if (config.mcpServers && Object.keys(config.mcpServers).length > 0) {\n // Transform the config to match client expectations\n const servers = Object.entries(config.mcpServers).map(\n ([name, serverConfig]: [string, any]) => ({\n name,\n type: serverConfig.type || \"stdio\", // Default to stdio if not specified\n command: serverConfig.command,\n args: serverConfig.args || [],\n env: serverConfig.env || {},\n url: serverConfig.url, // For SSE/HTTP connections\n }),\n );\n console.log(\"Transformed servers:\", servers);\n\n // Check for auto-connect server filter\n const autoConnectServer = process.env.MCP_AUTO_CONNECT_SERVER;\n console.log(\n \"Auto-connect server filter:\",\n autoConnectServer || \"none (connect to all)\",\n );\n\n return {\n servers,\n autoConnectServer: autoConnectServer || null,\n };\n }\n } catch (error) {\n console.error(\"Failed to parse MCP_CONFIG_DATA:\", error);\n }\n }\n\n // Fall back to legacy single server mode\n const command = process.env.MCP_SERVER_COMMAND;\n if (!command) {\n return null;\n }\n\n const argsString = process.env.MCP_SERVER_ARGS;\n const args = argsString ? JSON.parse(argsString) : [];\n\n return {\n servers: [\n {\n command,\n args,\n name: \"CLI Server\", // Default name for CLI-provided servers\n env: {},\n },\n ],\n };\n}\n\n// Ensure PATH is initialized from the user's shell so spawned processes can find binaries (e.g., npx)\ntry {\n fixPath();\n} catch {}\n\nconst app = new Hono();\n\n// Load environment variables early so route handlers can read CONVEX_HTTP_URL\nconst envFile =\n process.env.NODE_ENV === \"production\"\n ? \".env.production\"\n : \".env.development\";\n\n// Determine where to look for .env file:\n// 1. Electron: Resources folder\n// 2. npm package: package root (two levels up from dist/server)\n// 3. Local dev: current working directory\nlet envPath = envFile;\nif (\n process.env.ELECTRON_APP === \"true\" &&\n process.env.ELECTRON_RESOURCES_PATH\n) {\n envPath = join(process.env.ELECTRON_RESOURCES_PATH, envFile);\n} else {\n const packageRoot = resolve(__dirname, \"..\", \"..\");\n const packageEnvPath = join(packageRoot, envFile);\n if (existsSync(packageEnvPath)) {\n envPath = packageEnvPath;\n }\n}\n\ndotenv.config({ path: envPath });\n\n// Validate required env vars\nif (!process.env.CONVEX_HTTP_URL) {\n throw new Error(\n \"CONVEX_HTTP_URL is required but not set. Please set it via environment variable or .env file.\",\n );\n}\n\n// Initialize centralized MCPJam Client Manager\nconst mcpJamClientManager = new MCPJamClientManager();\n\n// Middleware to inject client manager into context\napp.use(\"*\", async (c, next) => {\n c.mcpJamClientManager = mcpJamClientManager;\n await next();\n});\n\n// Middleware\napp.use(\"*\", logger());\n// Dynamic CORS origin based on PORT environment variable\nconst serverPort = process.env.PORT || \"3001\";\nconst corsOrigins = [\n `http://localhost:${serverPort}`,\n \"http://localhost:3000\", // Keep for frontend development\n];\n\napp.use(\n \"*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n);\n\n// API Routes\napp.route(\"/api/mcp\", mcpRoutes);\n\n// Fallback for clients that post to \"/sse/message\" instead of the rewritten proxy messages URL.\n// We resolve the upstream messages endpoint via sessionId and forward with any injected auth.\n// CORS preflight\napp.options(\"/sse/message\", (c) => {\n return c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"POST,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Max-Age\": \"86400\",\n Vary: \"Origin, Access-Control-Request-Headers\",\n });\n});\n\napp.post(\"/sse/message\", async (c) => {\n try {\n const url = new URL(c.req.url);\n const sessionId =\n url.searchParams.get(\"sessionId\") || url.searchParams.get(\"sid\") || \"\";\n if (!sessionId) {\n return c.json({ error: \"Missing sessionId\" }, 400);\n }\n const mapping = interceptorStore.getSessionMapping(sessionId);\n if (!mapping) {\n return c.json({ error: \"Unknown sessionId\" }, 404);\n }\n const entry = interceptorStore.get(mapping.interceptorId);\n if (!entry) {\n return c.json({ error: \"Interceptor not found\" }, 404);\n }\n\n // Read body as text (JSON-RPC envelope) and forward\n let bodyText = \"\";\n try {\n bodyText = await c.req.text();\n } catch {}\n const headers = new Headers();\n c.req.raw.headers.forEach((v, k) => {\n const key = k.toLowerCase();\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"host\",\n \"content-length\",\n ].includes(key)\n )\n return;\n headers.set(k, v);\n });\n if (entry.injectHeaders) {\n for (const [k, v] of Object.entries(entry.injectHeaders)) {\n const key = k.toLowerCase();\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"host\",\n \"content-length\",\n ].includes(key)\n )\n continue;\n if (key === \"authorization\" && headers.has(\"authorization\")) continue;\n headers.set(k, v);\n }\n }\n // Forward to upstream messages endpoint\n try {\n await fetch(\n new Request(mapping.url, { method: \"POST\", headers, body: bodyText }),\n );\n } catch {}\n // Per spec semantics, reply 202 regardless (response arrives via SSE)\n return c.body(\"Accepted\", 202, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n } catch (e: any) {\n return c.body(\n JSON.stringify({ error: e?.message || \"Forward error\" }),\n 400,\n {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n },\n );\n }\n});\n\n// Health check\napp.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", timestamp: new Date().toISOString() });\n});\n\n// API endpoint to get MCP CLI config (for development mode)\napp.get(\"/api/mcp-cli-config\", (c) => {\n const mcpConfig = getMCPConfigFromEnv();\n return c.json({ config: mcpConfig });\n});\n\n// Static file serving (for production)\nif (process.env.NODE_ENV === \"production\") {\n // Serve public assets (logos, etc.) at root level\n app.use(\"/*.png\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.svg\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.jpg\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.jpeg\", serveStatic({ root: \"./public\" }));\n app.use(\"/*.ico\", serveStatic({ root: \"./public\" }));\n\n // Serve static assets (JS, CSS, images, etc.)\n app.use(\"/*\", serveStatic({ root: \"./dist/client\" }));\n\n // SPA fallback - serve index.html for all non-API routes\n app.get(\"*\", async (c) => {\n const path = c.req.path;\n // Don't intercept API routes\n if (path.startsWith(\"/api/\")) {\n return c.notFound();\n }\n // Return index.html for SPA routes\n const indexPath = join(process.cwd(), \"dist\", \"client\", \"index.html\");\n let htmlContent = readFileSync(indexPath, \"utf-8\");\n\n // Inject MCP server config if provided via CLI\n const mcpConfig = getMCPConfigFromEnv();\n if (mcpConfig) {\n const configScript = `<script>window.MCP_CLI_CONFIG = ${JSON.stringify(mcpConfig)};</script>`;\n htmlContent = htmlContent.replace(\"</head>\", `${configScript}</head>`);\n }\n\n return c.html(htmlContent);\n });\n} else {\n // Development mode - just API\n app.get(\"/\", (c) => {\n return c.json({\n message: \"MCPJam API Server\",\n environment: \"development\",\n frontend: `http://localhost:${serverPort}`,\n });\n });\n}\n\nconst port = parseInt(process.env.PORT || \"3001\");\n\n// Default to localhost unless explicitly running in production\nconst hostname =\n process.env.NODE_ENV === \"production\" ? \"127.0.0.1\" : \"localhost\";\nlogBox(`http://${hostname}:${port}`, \"🚀 Inspector Launched\");\n\n// Graceful shutdown handling\nconst server = serve({\n fetch: app.fetch,\n port,\n hostname: \"0.0.0.0\", // Bind to all interfaces for Docker\n});\n\n// Handle graceful shutdown\nprocess.on(\"SIGINT\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nexport default app;\n","import { Hono } from \"hono\";\nimport connect from \"./connect\";\nimport servers from \"./servers\";\nimport tools from \"./tools\";\nimport resources from \"./resources\";\nimport prompts from \"./prompts\";\nimport chat from \"./chat\";\nimport tests from \"./tests.ts\";\nimport oauth from \"./oauth\";\nimport exporter from \"./export\";\nimport interceptor from \"./interceptor\";\nimport { adapterHttp, managerHttp } from \"./http-adapters\";\n\nconst mcp = new Hono();\n\n// Health check\nmcp.get(\"/health\", (c) => {\n return c.json({\n service: \"MCP API\",\n status: \"ready\",\n timestamp: new Date().toISOString(),\n });\n});\n\n// Chat endpoint - REAL IMPLEMENTATION\nmcp.route(\"/chat\", chat);\n\n// Connect endpoint - REAL IMPLEMENTATION\nmcp.route(\"/connect\", connect);\n\n// Servers management endpoints - REAL IMPLEMENTATION\nmcp.route(\"/servers\", servers);\n\n// Tools endpoint - REAL IMPLEMENTATION\nmcp.route(\"/tools\", tools);\n\n// Tests endpoint - generate per-test agents\nmcp.route(\"/tests\", tests);\n\n// Resources endpoints - REAL IMPLEMENTATION\nmcp.route(\"/resources\", resources);\n\n// Prompts endpoints - REAL IMPLEMENTATION\nmcp.route(\"/prompts\", prompts);\n\n// OAuth proxy endpoints\nmcp.route(\"/oauth\", oauth);\n\n// Export endpoints - REAL IMPLEMENTATION\nmcp.route(\"/export\", exporter);\n\n// Interceptor endpoints - create proxy and stream logs\nmcp.route(\"/interceptor\", interceptor);\n\n// Unified HTTP bridges (SSE + POST) for connected servers\nmcp.route(\"/adapter-http\", adapterHttp);\nmcp.route(\"/manager-http\", managerHttp);\n\nexport default mcp;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst connect = new Hono();\n\nconnect.post(\"/\", async (c) => {\n try {\n const { serverConfig, serverId } = await c.req.json();\n\n if (!serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverConfig is required\",\n },\n 400,\n );\n }\n\n if (!serverId) {\n return c.json(\n {\n success: false,\n error: \"serverId is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n try {\n await mcpClientManager.connectToServer(serverId, serverConfig);\n const status = mcpClientManager.getConnectionStatus(serverId);\n if (status === \"connected\") {\n return c.json({\n success: true,\n status: \"connected\",\n });\n } else {\n return c.json(\n {\n success: false,\n error: \"Connection failed\",\n status,\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `MCP configuration is invalid. Please double check your server configuration: ${JSON.stringify(serverConfig)}`,\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: \"Failed to parse request body\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 400,\n );\n }\n});\n\nexport default connect;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst servers = new Hono();\n\n// List all connected servers with their status\nservers.get(\"/\", async (c) => {\n try {\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get all server configurations and statuses\n const connectedServers = mcpJamClientManager.getConnectedServers();\n\n const serverList = Object.entries(connectedServers).map(\n ([serverId, serverInfo]) => ({\n id: serverId,\n name: serverId,\n status: serverInfo.status,\n config: serverInfo.config,\n }),\n );\n\n return c.json({\n success: true,\n servers: serverList,\n });\n } catch (error) {\n console.error(\"Error listing servers:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get status for a specific server\nservers.get(\"/status/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n });\n } catch (error) {\n console.error(\"Error getting server status:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Disconnect from a server\nservers.delete(\"/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n await mcpJamClientManager.disconnectFromServer(serverId);\n\n return c.json({\n success: true,\n message: `Disconnected from server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error disconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Reconnect to a server\nservers.post(\"/reconnect\", async (c) => {\n try {\n const { serverId, serverConfig } = await c.req.json();\n\n if (!serverId || !serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverId and serverConfig are required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Disconnect first, then reconnect\n await mcpJamClientManager.disconnectFromServer(serverId);\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n message: `Reconnected to server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error reconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default servers;\n","import { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport \"../../types/hono\"; // Type extensions\n\nconst tools = new Hono();\n\ntype ElicitationEvent = {\n requestId: string;\n message: string;\n schema: any;\n toolName: string;\n timestamp: string;\n};\n\ntype ExecutionState = {\n id: string;\n serverId: string;\n toolName: string;\n execPromise: Promise<{ result: any }>;\n completed: boolean;\n result?: { result: any };\n error?: any;\n queue: ElicitationEvent[];\n waiters: Array<(ev: ElicitationEvent) => void>;\n};\n\nlet activeExecution: ExecutionState | null = null;\n\nfunction nowIso() {\n return new Date().toISOString();\n}\n\nfunction takeNextElicitation(state: ExecutionState): Promise<ElicitationEvent> {\n if (state.queue.length > 0) {\n return Promise.resolve(state.queue.shift()!);\n }\n return new Promise((resolve) => {\n state.waiters.push(resolve);\n });\n}\n\n// POST /list — return tools as JSON (no SSE)\ntools.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n const mcp = c.mcpJamClientManager;\n const status = mcp.getConnectionStatus(serverId);\n if (status !== \"connected\") {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n const flattenedTools = await mcp.getToolsetsForServer(serverId);\n\n const toolsWithJsonSchema: Record<string, any> = {};\n for (const [name, tool] of Object.entries(flattenedTools)) {\n let inputSchema = (tool as any).inputSchema;\n try {\n inputSchema = zodToJsonSchema(inputSchema as z.ZodType<any>);\n } catch {}\n toolsWithJsonSchema[name] = {\n name,\n description: (tool as any).description,\n inputSchema,\n outputSchema: (tool as any).outputSchema,\n };\n }\n return c.json({ tools: toolsWithJsonSchema });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\n// POST /execute — execute a tool; may return completed or an elicitation requirement\ntools.post(\"/execute\", async (c) => {\n try {\n const { serverId, toolName, parameters } = await c.req.json();\n if (!serverId) return c.json({ error: \"serverId is required\" }, 400);\n if (!toolName) return c.json({ error: \"toolName is required\" }, 400);\n\n if (activeExecution) {\n return c.json({ error: \"Another execution is already in progress\" }, 409);\n }\n\n const mcp = c.mcpJamClientManager;\n const status = mcp.getConnectionStatus(serverId);\n if (status !== \"connected\") {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n\n const executionId = `exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n const state: ExecutionState = {\n id: executionId,\n serverId,\n toolName,\n execPromise: Promise.resolve().then(() =>\n mcp.executeToolDirect(toolName, parameters || {}),\n ),\n completed: false,\n queue: [],\n waiters: [],\n };\n\n activeExecution = state;\n\n mcp.setElicitationCallback(async ({ requestId, message, schema }) => {\n if (!activeExecution) {\n // No active execution; reject so upstream can handle\n throw new Error(\"No active execution\");\n }\n const event: ElicitationEvent = {\n requestId,\n message,\n schema,\n toolName,\n timestamp: nowIso(),\n };\n // push to queue and notify waiter if present\n if (activeExecution.waiters.length > 0) {\n const waiter = activeExecution.waiters.shift()!;\n waiter(event);\n } else {\n activeExecution.queue.push(event);\n }\n\n // Return a promise that resolves when respond endpoint supplies an answer\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(\n () => reject(new Error(\"Elicitation timeout\")),\n 300000,\n );\n mcp.getPendingElicitations().set(requestId, {\n resolve: (response: any) => {\n clearTimeout(timeout);\n resolve(response);\n },\n reject: (error: any) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n });\n });\n\n // Race: next elicitation vs completion\n const race = await Promise.race([\n state.execPromise.then((res) => ({ kind: \"done\", res }) as const),\n takeNextElicitation(state).then(\n (ev) => ({ kind: \"elicit\", ev }) as const,\n ),\n ]);\n\n if (race.kind === \"done\") {\n state.completed = true;\n state.result = race.res;\n // clear global state\n activeExecution = null;\n mcp.clearElicitationCallback();\n return c.json(\n { status: \"completed\", toolName, result: race.res.result },\n 200,\n );\n }\n\n // Elicitation required\n return c.json(\n {\n status: \"elicitation_required\",\n executionId,\n requestId: race.ev.requestId,\n toolName,\n message: race.ev.message,\n schema: race.ev.schema,\n timestamp: race.ev.timestamp,\n },\n 202,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\n// POST /respond — respond to the current elicitation; may return next elicitation or completion\ntools.post(\"/respond\", async (c) => {\n try {\n const { requestId, response } = await c.req.json();\n if (!requestId) return c.json({ error: \"requestId is required\" }, 400);\n if (!activeExecution) return c.json({ error: \"No active execution\" }, 404);\n\n const mcp = c.mcpJamClientManager;\n const ok = mcp.respondToElicitation(requestId, response);\n if (!ok)\n return c.json({ error: \"No pending elicitation for requestId\" }, 404);\n\n // After responding, wait for either next elicitation or completion\n const state = activeExecution;\n try {\n const race = await Promise.race([\n state.execPromise.then((res) => ({ kind: \"done\", res }) as const),\n takeNextElicitation(state).then(\n (ev) => ({ kind: \"elicit\", ev }) as const,\n ),\n ]);\n\n if (race.kind === \"done\") {\n state.completed = true;\n state.result = race.res;\n activeExecution = null;\n mcp.clearElicitationCallback();\n return c.json(\n {\n status: \"completed\",\n toolName: state.toolName,\n result: race.res.result,\n },\n 200,\n );\n }\n\n return c.json(\n {\n status: \"elicitation_required\",\n executionId: state.id,\n requestId: race.ev.requestId,\n toolName: state.toolName,\n message: race.ev.message,\n schema: race.ev.schema,\n timestamp: race.ev.timestamp,\n },\n 202,\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return c.json({ error: msg }, 500);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\n// Optional: legacy root route returns 410 Gone to indicate migration\ntools.post(\"/\", async () => {\n return new Response(\n JSON.stringify({\n error: \"Endpoint migrated. Use /list, /execute, or /respond.\",\n }),\n { status: 410, headers: { \"Content-Type\": \"application/json\" } },\n );\n});\n\nexport default tools;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst resources = new Hono();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n const mcpClientManager = c.mcpJamClientManager;\n const serverResources = mcpClientManager.getResourcesForServer(serverId);\n return c.json({ resources: { [serverId]: serverResources } });\n } catch (error) {\n console.error(\"Error fetching resources:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Read resource endpoint\nresources.post(\"/read\", async (c) => {\n try {\n const { serverId, uri } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!uri) {\n return c.json(\n {\n success: false,\n error: \"Resource URI is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n const content = await mcpClientManager.getResource(uri, serverId);\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error reading resource:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default resources;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst prompts = new Hono();\n\n// List prompts endpoint\nprompts.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompts for specific server\n const serverPrompts = mcpJamClientManager.getPromptsForServer(serverId);\n\n return c.json({ prompts: { [serverId]: serverPrompts } });\n } catch (error) {\n console.error(\"Error fetching prompts:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get prompt endpoint\nprompts.post(\"/get\", async (c) => {\n try {\n const { serverId, name, args } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!name) {\n return c.json(\n {\n success: false,\n error: \"Prompt name is required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompt content directly - servers are already connected\n const content = await mcpJamClientManager.getPrompt(\n name,\n serverId,\n args || {},\n );\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error getting prompt:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default prompts;\n","import { Hono } from \"hono\";\nimport { streamText } from \"ai\";\nimport {\n ChatMessage,\n ModelDefinition,\n ModelProvider,\n} from \"../../../shared/types\";\nimport { TextEncoder } from \"util\";\nimport { getDefaultTemperatureByProvider } from \"../../../client/src/lib/chat-utils\";\nimport { createLlmModel } from \"../../utils/chat-helpers\";\nimport { SSEvent } from \"../../../shared/sse\";\nimport { convertMastraToolsToVercelTools } from \"../../../shared/tools\";\nimport {\n hasUnresolvedToolCalls,\n executeToolCallsFromMessages,\n} from \"../../../shared/http-tool-calls\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport type { ModelMessage, Tool } from \"ai\";\n\n// Types\ninterface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\ninterface StreamingContext {\n controller: ReadableStreamDefaultController;\n encoder: TextEncoder;\n toolCallId: number;\n lastEmittedToolCallId: number | null;\n stepIndex: number;\n}\n\ninterface ChatRequest {\n model: ModelDefinition;\n provider: ModelProvider;\n apiKey?: string;\n systemPrompt?: string;\n temperature?: number;\n messages?: ChatMessage[];\n ollamaBaseUrl?: string;\n action?: string;\n requestId?: string;\n response?: any;\n sendMessagesToBackend?: boolean;\n selectedServers?: string[]; // original names from UI\n}\n\n// Constants\nconst ELICITATION_TIMEOUT = 300000; // 5 minutes\nconst MAX_AGENT_STEPS = 10;\nconst BACKEND_FETCH_ERROR_MESSAGE =\n \"We are having difficulties processing your message right now. Please try again later.\";\n\ntry {\n (process as any).setMaxListeners?.(50);\n} catch {}\n\nconst chat = new Hono();\n\n// Small helper to send one SSE event consistently\nconst sendSseEvent = (\n controller: ReadableStreamDefaultController,\n encoder: TextEncoder,\n event: SSEvent | \"[DONE]\",\n) => {\n const payload = event === \"[DONE]\" ? \"[DONE]\" : JSON.stringify(event);\n controller.enqueue(encoder.encode(`data: ${payload}\\n\\n`));\n};\n\nconst sendBackendErrorText = (streamingContext: StreamingContext) => {\n sendSseEvent(streamingContext.controller, streamingContext.encoder, {\n type: \"text\",\n content: BACKEND_FETCH_ERROR_MESSAGE,\n });\n};\n\nconst sendBackendRequest = async (\n baseUrl: string,\n authHeader: string | undefined,\n body: any,\n streamingContext: StreamingContext,\n): Promise<any | null> => {\n try {\n const res = await fetch(`${baseUrl}/streaming`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(authHeader ? { Authorization: authHeader } : {}),\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n sendBackendErrorText(streamingContext);\n return null;\n }\n\n try {\n const data = await res.json();\n return data;\n } catch {\n sendBackendErrorText(streamingContext);\n return null;\n }\n } catch {\n sendBackendErrorText(streamingContext);\n return null;\n }\n};\n\nconst handleAgentStepFinish = (\n streamingContext: StreamingContext,\n text: string,\n toolCalls: any[] | undefined,\n toolResults: any[] | undefined,\n emitToolEvents: boolean = true,\n) => {\n try {\n if (emitToolEvents) {\n // Handle tool calls\n if (toolCalls && Array.isArray(toolCalls)) {\n for (const call of toolCalls) {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder,\n {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name || call.toolName,\n parameters: call.params || call.args || {},\n timestamp: new Date().toISOString(),\n status: \"executing\",\n },\n },\n );\n }\n }\n }\n\n // Handle tool results\n if (toolResults && Array.isArray(toolResults)) {\n for (const result of toolResults) {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder,\n {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: result.result,\n error: (result as any).error,\n timestamp: new Date().toISOString(),\n },\n },\n );\n }\n }\n }\n }\n\n // Emit a consolidated trace step event for UI tracing panels\n streamingContext.stepIndex = (streamingContext.stepIndex || 0) + 1;\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(streamingContext.controller, streamingContext.encoder, {\n type: \"trace_step\",\n step: streamingContext.stepIndex,\n text,\n toolCalls: (toolCalls || []).map((c: any) => ({\n name: c.name || c.toolName,\n params: c.params || c.args || {},\n })),\n toolResults: (toolResults || []).map((r: any) => ({\n result: r.result,\n error: (r as any).error,\n })),\n timestamp: new Date().toISOString(),\n });\n }\n } catch {}\n};\n\nconst createStreamingResponse = async (\n model: any,\n aiSdkTools: Record<string, Tool>,\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n provider: ModelProvider,\n temperature?: number,\n systemPrompt?: string,\n) => {\n const messageHistory: ModelMessage[] = (messages || []).map((m) => {\n switch (m.role) {\n case \"system\":\n return { role: \"system\", content: m.content } as ModelMessage;\n case \"user\":\n return { role: \"user\", content: m.content } as ModelMessage;\n case \"assistant\":\n return { role: \"assistant\", content: m.content } as ModelMessage;\n default:\n return { role: \"user\", content: m.content } as ModelMessage;\n }\n });\n\n let steps = 0;\n while (steps < MAX_AGENT_STEPS) {\n let accumulatedText = \"\";\n const iterationToolCalls: any[] = [];\n const iterationToolResults: any[] = [];\n\n const streamResult = await streamText({\n model,\n system:\n systemPrompt || \"You are a helpful assistant with access to MCP tools.\",\n temperature: temperature ?? getDefaultTemperatureByProvider(provider),\n tools: aiSdkTools,\n messages: messageHistory,\n onChunk: async (chunk) => {\n switch (chunk.chunk.type) {\n case \"text-delta\":\n case \"reasoning-delta\": {\n const text = chunk.chunk.text;\n if (text) {\n accumulatedText += text;\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"text\",\n content: text,\n },\n );\n }\n break;\n }\n case \"tool-input-start\": {\n // Do not emit a tool_call for input-start; wait for the concrete tool-call\n break;\n }\n case \"tool-call\": {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n const name =\n (chunk.chunk as any).toolName || (chunk.chunk as any).name;\n const parameters =\n (chunk.chunk as any).input ??\n (chunk.chunk as any).parameters ??\n (chunk.chunk as any).args ??\n {};\n iterationToolCalls.push({ name, params: parameters });\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name,\n parameters,\n timestamp: new Date().toISOString(),\n status: \"executing\",\n },\n },\n );\n break;\n }\n case \"tool-result\": {\n const result =\n (chunk.chunk as any).output ??\n (chunk.chunk as any).result ??\n (chunk.chunk as any).value;\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : streamingContext.toolCallId;\n iterationToolResults.push({ result });\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result,\n timestamp: new Date().toISOString(),\n },\n },\n );\n break;\n }\n default:\n break;\n }\n },\n });\n\n await streamResult.consumeStream();\n\n handleAgentStepFinish(\n streamingContext,\n accumulatedText,\n iterationToolCalls,\n iterationToolResults,\n false,\n );\n\n const resp = await streamResult.response;\n const responseMessages = (resp?.messages || []) as ModelMessage[];\n if (responseMessages.length) {\n messageHistory.push(...responseMessages);\n\n // Some providers (e.g., Ollama v2) place tool outputs as ToolModelMessages\n // in the response rather than streaming a tool-result chunk.\n for (const m of responseMessages) {\n if ((m as any).role === \"tool\") {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n const value = (m as any).content;\n iterationToolResults.push({ result: value });\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: value,\n timestamp: new Date().toISOString(),\n },\n });\n }\n }\n }\n\n steps++;\n const finishReason = await streamResult.finishReason;\n const shouldContinue =\n finishReason === \"tool-calls\" ||\n (accumulatedText.length === 0 && iterationToolResults.length > 0);\n\n if (!shouldContinue) break;\n }\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"elicitation_complete\",\n });\n\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n \"[DONE]\",\n );\n};\n\nconst sendMessagesToBackend = async (\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n mcpClientManager: any,\n baseUrl: string,\n authHeader?: string,\n selectedServers?: string[],\n): Promise<void> => {\n // Build message history\n const messageHistory: ModelMessage[] = (messages || []).map((m) => {\n switch (m.role) {\n case \"system\":\n return { role: \"system\", content: m.content } as ModelMessage;\n case \"user\":\n return { role: \"user\", content: m.content } as ModelMessage;\n case \"assistant\":\n return { role: \"assistant\", content: m.content } as ModelMessage;\n default:\n return { role: \"user\", content: m.content } as ModelMessage;\n }\n });\n\n const flatTools =\n await mcpClientManager.getFlattenedToolsetsForEnabledServers(\n selectedServers,\n );\n\n const toolDefs = Object.entries(flatTools).map(([name, tool]) => ({\n name,\n description: tool?.description,\n inputSchema: zodToJsonSchema(tool?.inputSchema),\n }));\n\n if (!baseUrl) {\n throw new Error(\"CONVEX_HTTP_URL is not set\");\n }\n let steps = 0;\n while (steps < MAX_AGENT_STEPS) {\n const data = await sendBackendRequest(\n baseUrl,\n authHeader,\n {\n tools: toolDefs,\n messages: JSON.stringify(messageHistory),\n },\n streamingContext,\n );\n if (!data) break;\n if (data?.ok && Array.isArray(data.messages)) {\n // Append assistant messages and emit their text/tool_call events\n for (const msg of data.messages as ModelMessage[]) {\n messageHistory.push(msg);\n if (\n (msg as any).role === \"assistant\" &&\n Array.isArray((msg as any).content)\n ) {\n for (const c of (msg as any).content) {\n if (c?.type === \"text\" && typeof c.text === \"string\") {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"text\",\n content: c.text,\n },\n );\n } else if (c?.type === \"tool-call\") {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: c.toolName || c.name,\n parameters: c.input || c.parameters || c.args || {},\n timestamp: new Date().toISOString(),\n status: \"executing\",\n },\n },\n );\n }\n }\n }\n }\n } else {\n sendBackendErrorText(streamingContext);\n break;\n }\n\n // Execute unresolved tool calls locally and emit tool_result events\n const beforeLen = messageHistory.length;\n if (hasUnresolvedToolCalls(messageHistory as any)) {\n await executeToolCallsFromMessages(messageHistory as ModelMessage[], {\n tools: flatTools as any,\n });\n const newMsgs = messageHistory.slice(beforeLen);\n for (const m of newMsgs) {\n if ((m as any).role === \"tool\" && Array.isArray((m as any).content)) {\n for (const tc of (m as any).content) {\n if (tc.type === \"tool-result\") {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n const out = tc.output;\n const value =\n out && typeof out === \"object\" && \"value\" in out\n ? out.value\n : out;\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: value,\n timestamp: new Date().toISOString(),\n },\n },\n );\n }\n }\n }\n }\n } else {\n break;\n }\n\n steps++;\n }\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"elicitation_complete\",\n });\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n \"[DONE]\",\n );\n};\n\n// Main chat endpoint\nchat.post(\"/\", async (c) => {\n const mcpClientManager = c.mcpJamClientManager;\n try {\n const requestData: ChatRequest = await c.req.json();\n const {\n model,\n provider,\n apiKey,\n systemPrompt,\n temperature,\n messages,\n ollamaBaseUrl: _ollama_unused,\n action,\n requestId,\n response,\n } = requestData;\n\n // Handle elicitation response\n if (action === \"elicitation_response\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for elicitation_response action\",\n },\n 400,\n );\n }\n\n const success = mcpClientManager.respondToElicitation(\n requestId,\n response,\n );\n if (!success) {\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n return c.json({ success: true });\n }\n\n // Validate required parameters\n if (!messages) {\n return c.json(\n {\n success: false,\n error: \"messages are required\",\n },\n 400,\n );\n }\n const sendToBackend =\n provider === \"meta\" && Boolean(requestData.sendMessagesToBackend);\n\n if (!sendToBackend && (!model?.id || !apiKey)) {\n return c.json(\n {\n success: false,\n error: \"model (with id) and apiKey are required\",\n },\n 400,\n );\n }\n\n if (sendToBackend && !process.env.CONVEX_HTTP_URL) {\n return c.json(\n {\n success: false,\n error: \"Server missing CONVEX_HTTP_URL configuration\",\n },\n 500,\n );\n }\n\n // Create streaming response\n const encoder = new TextEncoder();\n const authHeader = c.req.header(\"authorization\") || undefined;\n const readableStream = new ReadableStream({\n async start(controller) {\n const streamingContext: StreamingContext = {\n controller,\n encoder,\n toolCallId: 0,\n lastEmittedToolCallId: null,\n stepIndex: 0,\n };\n\n // Register elicitation handler with MCPJamClientManager\n mcpClientManager.setElicitationCallback(async (request) => {\n // Convert MCPJamClientManager format to createElicitationHandler format\n const elicitationRequest = {\n message: request.message,\n requestedSchema: request.schema,\n };\n\n // Stream elicitation request to client using the provided requestId\n if (streamingContext.controller && streamingContext.encoder) {\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder,\n {\n type: \"elicitation_request\",\n requestId: request.requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n timestamp: new Date().toISOString(),\n },\n );\n }\n\n // Return a promise that will be resolved when user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n // Set timeout to clean up if no response\n const timeout = setTimeout(() => {\n reject(new Error(\"Elicitation timeout\"));\n }, ELICITATION_TIMEOUT);\n\n // Store the resolver in the manager's pending elicitations\n mcpClientManager.getPendingElicitations().set(request.requestId, {\n resolve: (response: ElicitationResponse) => {\n clearTimeout(timeout);\n resolve(response);\n },\n reject: (error: any) => {\n clearTimeout(timeout);\n reject(error);\n },\n });\n });\n });\n\n try {\n if (sendToBackend) {\n await sendMessagesToBackend(\n messages,\n streamingContext,\n mcpClientManager,\n process.env.CONVEX_HTTP_URL!,\n authHeader,\n requestData.selectedServers,\n );\n } else {\n // Use existing streaming path with tools\n const flatTools =\n await mcpClientManager.getFlattenedToolsetsForEnabledServers(\n requestData.selectedServers,\n );\n\n const aiSdkTools: Record<string, Tool> =\n convertMastraToolsToVercelTools(flatTools as any);\n\n const llmModel = createLlmModel(\n model as ModelDefinition,\n apiKey || \"\",\n _ollama_unused,\n );\n await createStreamingResponse(\n llmModel,\n aiSdkTools,\n messages,\n streamingContext,\n provider,\n temperature,\n systemPrompt,\n );\n }\n } catch (error) {\n sendSseEvent(controller, encoder, {\n type: \"error\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n } finally {\n // Clear elicitation callback to prevent memory leaks\n mcpClientManager.clearElicitationCallback();\n controller.close();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"[mcp/chat] Error in chat API:\", error);\n\n try {\n mcpClientManager.clearElicitationCallback();\n } catch (cleanupError) {\n console.error(\"[mcp/chat] Error during cleanup:\", cleanupError);\n }\n\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default chat;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ChatMessage } from \"./chat-types\";\nimport { ModelDefinition } from \"@/shared/types.js\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substr(2, 9);\n}\n\nexport function sanitizeText(text: string): string {\n // Basic sanitization - in production you might want more robust sanitization\n return text.trim();\n}\n\nexport function formatTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nexport function formatMessageDate(date: Date): string {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));\n\n if (diffInDays === 0) {\n return formatTimestamp(date);\n } else if (diffInDays === 1) {\n return `Yesterday ${formatTimestamp(date)}`;\n } else if (diffInDays < 7) {\n return `${diffInDays} days ago`;\n } else {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n }).format(date);\n }\n}\n\nexport function createMessage(\n role: \"user\" | \"assistant\",\n content: string,\n attachments?: any[],\n): ChatMessage {\n return {\n id: generateId(),\n role,\n content,\n timestamp: new Date(),\n attachments,\n metadata: {\n createdAt: new Date().toISOString(),\n },\n };\n}\n\nexport function isValidFileType(file: File): boolean {\n const allowedTypes = [\n \"text/plain\",\n \"application/pdf\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"application/json\",\n \"text/csv\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ];\n\n return allowedTypes.includes(file.type);\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\");\n}\n\nexport function isImageUrl(url: string): boolean {\n const imageExtensions = [\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".svg\"];\n const lowerUrl = url.toLowerCase();\n return (\n imageExtensions.some((ext) => lowerUrl.includes(ext)) ||\n lowerUrl.includes(\"data:image/\") ||\n lowerUrl.includes(\"blob:\")\n );\n}\n\nexport function getImageDimensions(\n url: string,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n}\n\nexport function scrollToBottom(element?: Element | null) {\n if (element) {\n element.scrollTop = element.scrollHeight;\n } else {\n window.scrollTo(0, document.body.scrollHeight);\n }\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\nexport function getDefaultTemperatureByProvider(provider: string): number {\n switch (provider) {\n case \"openai\":\n return 1.0;\n case \"anthropic\":\n return 0;\n case \"google\":\n return 0.9; // Google's recommended default\n default:\n return 0;\n }\n}\n\nexport function getDefaultTemperatureForModel(model: ModelDefinition): number {\n return getDefaultTemperatureByProvider(model.provider);\n}\n","import { ModelDefinition } from \"@/shared/types\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOllama } from \"ollama-ai-provider-v2\";\n\nexport const createLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n) => {\n if (!modelDefinition?.id || !modelDefinition?.provider) {\n throw new Error(\n `Invalid model definition: ${JSON.stringify(modelDefinition)}`,\n );\n }\n\n switch (modelDefinition.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey })(modelDefinition.id);\n case \"openai\":\n return createOpenAI({ apiKey })(modelDefinition.id);\n case \"deepseek\":\n return createDeepSeek({ apiKey })(modelDefinition.id);\n case \"google\":\n return createGoogleGenerativeAI({ apiKey })(modelDefinition.id);\n case \"ollama\": {\n const raw = ollamaBaseUrl || \"http://localhost:11434/api\";\n const normalized = /\\/api\\/?$/.test(raw)\n ? raw\n : `${raw.replace(/\\/+$/, \"\")}/api`;\n return createOllama({ baseURL: normalized })(modelDefinition.id);\n }\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n","import { z, ZodTypeAny } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { tool, type Tool as VercelTool, type ToolCallOptions } from \"ai\";\n\ntype MastraToolExecuteArgs = {\n context?: unknown;\n runtimeContext?: unknown;\n};\n\ntype MastraToolInstance = {\n description?: string;\n inputSchema?: unknown;\n outputSchema?: unknown;\n execute?: (\n args: MastraToolExecuteArgs,\n options?: ToolCallOptions,\n ) => Promise<unknown> | unknown;\n};\n\nconst fallbackInputSchema = z.object({}).passthrough();\n\nconst UNREPRESENTABLE_JSON_SCHEMA_MESSAGES = [\n \"Custom types cannot be represented in JSON Schema\",\n \"Function types cannot be represented in JSON Schema\",\n];\n\nfunction isUnrepresentableSchemaError(error: unknown): error is Error {\n return (\n error instanceof Error &&\n UNREPRESENTABLE_JSON_SCHEMA_MESSAGES.some((message) =>\n error.message.includes(message),\n )\n );\n}\n\nfunction isZodSchema(value: unknown): value is ZodTypeAny {\n return Boolean(\n value && typeof value === \"object\" && \"safeParse\" in (value as ZodTypeAny),\n );\n}\n\nfunction isDirectlyUnrepresentable(schema: ZodTypeAny): boolean {\n const schemaType = (schema as any)?._def?.type;\n return schemaType === \"custom\" || schemaType === \"function\";\n}\n\nfunction canConvertToJSONSchema(schema: ZodTypeAny): boolean {\n const toJSONSchema = (\n z as unknown as {\n toJSONSchema?: (\n schema: ZodTypeAny,\n options?: Record<string, unknown>,\n ) => unknown;\n }\n ).toJSONSchema;\n\n if (typeof toJSONSchema === \"function\") {\n try {\n toJSONSchema(schema);\n return true;\n } catch (error) {\n if (isUnrepresentableSchemaError(error)) {\n return false;\n }\n\n throw error;\n }\n }\n\n try {\n zodToJsonSchema(schema);\n return true;\n } catch (error) {\n if (isUnrepresentableSchemaError(error)) {\n return false;\n }\n\n throw error;\n }\n}\n\nfunction ensureInputSchema(schema: unknown): ZodTypeAny {\n if (!isZodSchema(schema)) {\n return fallbackInputSchema;\n }\n\n if (isDirectlyUnrepresentable(schema)) {\n return fallbackInputSchema;\n }\n\n if (!canConvertToJSONSchema(schema)) {\n return fallbackInputSchema;\n }\n\n return schema;\n}\n\nfunction ensureOutputSchema(schema: unknown): ZodTypeAny | undefined {\n if (!isZodSchema(schema)) {\n return undefined;\n }\n\n if (isDirectlyUnrepresentable(schema)) {\n return undefined;\n }\n\n if (!canConvertToJSONSchema(schema)) {\n return undefined;\n }\n\n return schema;\n}\n\nfunction extractPureToolName(toolKey: string): string {\n const separatorIndex = toolKey.indexOf(\"_\");\n\n if (separatorIndex === -1 || separatorIndex === toolKey.length - 1) {\n return toolKey;\n }\n\n return toolKey.slice(separatorIndex + 1);\n}\n\nexport function convertMastraToolToVercelTool(\n toolName: string,\n mastraTool: MastraToolInstance,\n options?: { originalName?: string },\n): VercelTool {\n const inputSchema = ensureInputSchema(mastraTool.inputSchema);\n const outputSchema = ensureOutputSchema(mastraTool.outputSchema);\n const displayName = options?.originalName ?? toolName;\n\n const vercelToolConfig: {\n type: \"dynamic\";\n description?: string;\n inputSchema: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n execute?: (input: unknown, options: ToolCallOptions) => Promise<unknown>;\n } = {\n type: \"dynamic\",\n description: mastraTool.description,\n inputSchema,\n };\n\n if (outputSchema) {\n vercelToolConfig.outputSchema = outputSchema;\n }\n\n if (typeof mastraTool.execute === \"function\") {\n vercelToolConfig.execute = async (input, options) => {\n const executionArgs: MastraToolExecuteArgs = { context: input };\n\n if (options) {\n executionArgs.runtimeContext = options;\n }\n\n const result = await mastraTool.execute?.(executionArgs, options);\n\n if (outputSchema) {\n const parsed = outputSchema.safeParse(result);\n\n if (!parsed.success) {\n throw new Error(\n `Mastra tool '${displayName}' returned invalid output: ${parsed.error.message}`,\n );\n }\n\n return parsed.data;\n }\n\n return result;\n };\n }\n\n try {\n return tool(vercelToolConfig);\n } catch (error) {\n if (!isUnrepresentableSchemaError(error)) {\n throw error;\n }\n\n if (vercelToolConfig.outputSchema) {\n const {\n outputSchema: _unusedOutputSchema,\n ...configWithoutOutputSchema\n } = vercelToolConfig;\n\n try {\n return tool(configWithoutOutputSchema);\n } catch (errorWithoutOutputSchema) {\n if (!isUnrepresentableSchemaError(errorWithoutOutputSchema)) {\n throw errorWithoutOutputSchema;\n }\n\n const fallbackConfig = {\n ...configWithoutOutputSchema,\n inputSchema: fallbackInputSchema,\n };\n\n return tool(fallbackConfig);\n }\n }\n\n const fallbackConfig = {\n ...vercelToolConfig,\n inputSchema: fallbackInputSchema,\n };\n\n return tool(fallbackConfig);\n }\n}\n\nexport function convertMastraToolsToVercelTools(\n mastraTools: Record<string, MastraToolInstance>,\n): Record<string, VercelTool> {\n return Object.fromEntries(\n Object.entries(mastraTools).map(([name, mastraTool]) => {\n const pureToolName = extractPureToolName(name);\n\n return [\n pureToolName,\n convertMastraToolToVercelTool(pureToolName, mastraTool, {\n originalName: name,\n }),\n ];\n }),\n );\n}\n","import { ModelMessage } from \"@ai-sdk/provider-utils\";\nimport { LanguageModelV2ToolResultOutput } from \"@ai-sdk/provider-v5\";\nimport type { MCPClient } from \"@mastra/mcp\";\n\ntype ToolsMap = Record<string, any>;\ntype Toolsets = Record<string, ToolsMap>;\n\nfunction flattenToolsets(toolsets: Toolsets): ToolsMap {\n const flattened: ToolsMap = {};\n for (const serverTools of Object.values(toolsets || {})) {\n if (serverTools && typeof serverTools === \"object\") {\n Object.assign(flattened, serverTools as any);\n }\n }\n return flattened;\n}\n\nfunction buildIndexWithAliases(tools: ToolsMap): ToolsMap {\n const index: ToolsMap = {};\n for (const [toolName, tool] of Object.entries<any>(tools || {})) {\n if (!tool || typeof tool !== \"object\" || !(\"execute\" in tool)) continue;\n const idx = toolName.indexOf(\"_\");\n const pure =\n idx > -1 && idx < toolName.length - 1\n ? toolName.slice(idx + 1)\n : toolName;\n if (!(toolName in index)) index[toolName] = tool;\n if (!(pure in index)) index[pure] = tool;\n }\n return index;\n}\n\nexport const hasUnresolvedToolCalls = (messages: ModelMessage[]): boolean => {\n const toolCallIds = new Set<string>();\n const toolResultIds = new Set<string>();\n\n for (const msg of messages) {\n if (!msg) continue;\n if (msg.role === \"assistant\" && Array.isArray((msg as any).content)) {\n for (const c of (msg as any).content) {\n if (c?.type === \"tool-call\") toolCallIds.add(c.toolCallId);\n }\n } else if (msg.role === \"tool\" && Array.isArray((msg as any).content)) {\n for (const c of (msg as any).content) {\n if (c?.type === \"tool-result\") toolResultIds.add(c.toolCallId);\n }\n }\n }\n for (const id of toolCallIds) if (!toolResultIds.has(id)) return true;\n return false;\n};\n\nexport async function executeToolCallsFromMessages(\n messages: ModelMessage[],\n options: { tools: ToolsMap } | { toolsets: Toolsets } | { client: MCPClient },\n): Promise<void> {\n // Build tools index\n let tools: ToolsMap = {};\n if ((options as any).client) {\n const toolsets = await (options as any).client.getToolsets();\n tools = flattenToolsets(toolsets as any);\n } else if ((options as any).toolsets) {\n tools = flattenToolsets((options as any).toolsets as any);\n } else {\n tools = (options as any).tools as ToolsMap;\n }\n const index = buildIndexWithAliases(tools);\n\n // Collect existing tool-result IDs\n const existingToolResultIds = new Set<string>();\n for (const msg of messages) {\n if (!msg || msg.role !== \"tool\" || !Array.isArray((msg as any).content))\n continue;\n for (const c of (msg as any).content) {\n if (c?.type === \"tool-result\") existingToolResultIds.add(c.toolCallId);\n }\n }\n\n const toolResultsToAdd: ModelMessage[] = [];\n for (const msg of messages) {\n if (\n !msg ||\n msg.role !== \"assistant\" ||\n !Array.isArray((msg as any).content)\n )\n continue;\n for (const content of (msg as any).content) {\n if (\n content?.type === \"tool-call\" &&\n !existingToolResultIds.has(content.toolCallId)\n ) {\n try {\n const toolName: string = content.toolName;\n const tool = index[toolName];\n if (!tool) throw new Error(`Tool '${toolName}' not found`);\n const input = content.input || {};\n const result = await tool.execute({ context: input });\n\n let output: LanguageModelV2ToolResultOutput;\n if (result && typeof result === \"object\" && (result as any).content) {\n const rc: any = (result as any).content;\n if (\n rc &&\n typeof rc === \"object\" &&\n \"text\" in rc &&\n typeof rc.text === \"string\"\n ) {\n output = { type: \"text\", value: rc.text } as any;\n } else if (\n rc &&\n typeof rc === \"object\" &&\n \"type\" in rc &&\n \"value\" in rc\n ) {\n output = {\n type: (rc.type as any) || \"text\",\n value: rc.value,\n } as any;\n } else {\n output = { type: \"text\", value: JSON.stringify(rc) } as any;\n }\n } else {\n output = { type: \"text\", value: String(result) } as any;\n }\n\n const toolResultMessage: ModelMessage = {\n role: \"tool\" as const,\n content: [\n {\n type: \"tool-result\",\n toolCallId: content.toolCallId,\n toolName: toolName,\n output,\n },\n ],\n } as any;\n toolResultsToAdd.push(toolResultMessage);\n } catch (error: any) {\n const errorOutput: LanguageModelV2ToolResultOutput = {\n type: \"error-text\",\n value: error instanceof Error ? error.message : String(error),\n } as any;\n const errorToolResultMessage: ModelMessage = {\n role: \"tool\" as const,\n content: [\n {\n type: \"tool-result\",\n toolCallId: content.toolCallId,\n toolName: content.toolName,\n output: errorOutput,\n },\n ],\n } as any;\n toolResultsToAdd.push(errorToolResultMessage);\n }\n }\n }\n }\n\n messages.push(...toolResultsToAdd);\n}\n","import { Hono } from \"hono\";\nimport { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\nimport type { ModelDefinition } from \"../../../shared/types\";\nimport {\n validateMultipleServerConfigs,\n createMCPClientWithMultipleConnections,\n} from \"../../utils/mcp-utils\";\n\nconst tests = new Hono();\n\n// Helper functions\nfunction normalizeToolName(toolName: string, serverIds: string[]): string {\n for (const id of serverIds) {\n const prefix = `${id}_`;\n if (toolName.startsWith(prefix)) {\n return toolName.slice(prefix.length);\n }\n }\n return toolName;\n}\n\nfunction extractToolSchema(tool: any): any {\n if (!tool?.inputSchema) return {};\n\n // Try toJSON() first\n const jsonSchema = tool.inputSchema.toJSON?.();\n if (jsonSchema && typeof jsonSchema === \"object\") {\n return jsonSchema;\n }\n\n // Fallback for ZodObject\n const zodDef = tool.inputSchema._def;\n if (zodDef?.typeName === \"ZodObject\") {\n const baseSchema = {\n type: \"object\",\n additionalProperties: false,\n properties: {},\n required: [],\n };\n\n try {\n if (zodDef.shape && typeof zodDef.shape === \"function\") {\n const shape = zodDef.shape();\n const properties: any = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = { type: \"string\" };\n if ((value as any)?._def?.typeName !== \"ZodOptional\") {\n required.push(key);\n }\n }\n\n return { ...baseSchema, properties, required };\n }\n } catch {\n // Keep base schema\n }\n\n return baseSchema;\n }\n\n return {};\n}\n\nfunction resolveBackendUrl(overrideUrl?: string): string {\n return \"https://industrious-stingray-146.convex.site\";\n if (overrideUrl) return overrideUrl.replace(/\\/$/, \"\");\n\n const explicit = process.env.CONVEX_HTTP_URL;\n if (explicit) return explicit.replace(/\\/$/, \"\");\n\n const convexUrl = process.env.VITE_CONVEX_URL || process.env.CONVEX_URL;\n if (convexUrl) {\n try {\n const u = new URL(convexUrl);\n const host = u.host.replace(\".convex.cloud\", \".convex.site\");\n return `${u.protocol}//${host}`;\n } catch {}\n }\n\n return \"http://localhost:3210\";\n}\n\nexport default tests;\n\n// Run-all (parallel orchestrated) endpoint\ntests.post(\"/run-all\", async (c) => {\n const encoder = new TextEncoder();\n try {\n const body = await c.req.json();\n const testsInput = (body?.tests || []) as Array<{\n id: string;\n title: string;\n prompt: string;\n expectedTools: string[];\n model: ModelDefinition;\n selectedServers?: string[];\n }>;\n const overrideBackendHttpUrl = body?.backendHttpUrl as string | undefined;\n const allServers = (body?.allServers || {}) as Record<\n string,\n MastraMCPServerDefinition\n >;\n const maxConcurrency: number = Math.max(\n 1,\n Math.min(8, body?.concurrency ?? 5),\n );\n\n if (!Array.isArray(testsInput) || testsInput.length === 0) {\n return c.json({ success: false, error: \"No tests provided\" }, 400);\n }\n const readableStream = new ReadableStream({\n async start(controller) {\n let active = 0;\n let index = 0;\n let failed = false;\n\n const runNext = async () => {\n if (index >= testsInput.length) {\n if (active === 0) {\n // All done\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"run_complete\", passed: !failed })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n }\n return;\n }\n const test = testsInput[index++];\n active++;\n (async () => {\n const calledTools = new Set<string>();\n const expectedSet = new Set<string>(test.expectedTools || []);\n let step = 0;\n let client: MCPClient | null = null;\n try {\n // Build servers for this test\n let serverConfigs: Record<string, MastraMCPServerDefinition> = {};\n if (test.selectedServers && test.selectedServers.length > 0) {\n for (const name of test.selectedServers) {\n if (allServers[name]) serverConfigs[name] = allServers[name];\n }\n } else {\n for (const [name, cfg] of Object.entries(allServers)) {\n serverConfigs[name] = cfg;\n }\n }\n\n // Validate and connect with multiple servers like chat endpoint to ensure headers/eventSourceInit are set\n const validation = validateMultipleServerConfigs(serverConfigs);\n let finalServers: Record<string, MastraMCPServerDefinition> = {};\n if (validation.success && validation.validConfigs) {\n finalServers = validation.validConfigs;\n } else if (\n validation.validConfigs &&\n Object.keys(validation.validConfigs).length > 0\n ) {\n finalServers = validation.validConfigs; // partial success; continue with valid ones\n } else {\n throw new Error(\"No valid MCP server configs for test\");\n }\n\n client = createMCPClientWithMultipleConnections(finalServers);\n const tools = await client.getTools();\n const toolsSchemas = Object.entries(tools).map(\n ([name, tool]) => ({\n toolName: name,\n inputSchema: extractToolSchema(tool),\n }),\n );\n\n const runId = `${Date.now()}-${test.id}`;\n const backendUrl = resolveBackendUrl(overrideBackendHttpUrl);\n\n // Emit debug info\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"debug\", testId: test.id, backendUrl })}\\n\\n`,\n ),\n );\n\n // Start one-step on backend\n const startRes = await fetch(`${backendUrl}/evals/agent/start`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n runId,\n model: test.model,\n toolsSchemas,\n messages: [\n {\n role: \"system\",\n content:\n \"You are a helpful assistant with access to MCP tools.\",\n },\n { role: \"user\", content: test.prompt || \"\" },\n ],\n }),\n });\n if (!startRes.ok) {\n const errText = await startRes.text().catch(() => \"\");\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed: false, error: `Backend start failed: ${startRes.status} ${errText}` })}\\n\\n`,\n ),\n );\n throw new Error(\n `Backend start failed: ${startRes.status} ${errText}`,\n );\n }\n const startJson: any = await startRes.json();\n if (!startJson.ok)\n throw new Error((startJson as any).error || \"start failed\");\n\n let state: any = startJson;\n const serverIds = Object.keys(finalServers);\n\n // Loop until assistant_text\n while (state.kind === \"tool_call\") {\n const name = state.toolName as string;\n const args = state.args || {};\n const tool = (tools as any)[name];\n\n try {\n const result = await tool?.execute({ context: args });\n calledTools.add(name);\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n testId: test.id,\n step: ++step,\n text: \"Executed tool\",\n toolCalls: [normalizeToolName(name, serverIds)],\n toolResults: [result],\n })}\\n\\n`,\n ),\n );\n\n const stepRes = await fetch(\n `${backendUrl}/evals/agent/step`,\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n runId,\n model: test.model,\n toolsSchemas,\n messages: state.steps?.[state.steps.length - 1]\n ?.messages || [\n {\n role: \"system\",\n content:\n \"You are a helpful assistant with access to MCP tools.\",\n },\n { role: \"user\", content: test.prompt || \"\" },\n ],\n toolResultMessage: {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\",\n toolCallId: state.toolCallId,\n toolName: name,\n output: result,\n },\n ],\n },\n }),\n },\n );\n\n const stepJson: any = await stepRes.json();\n if (!stepJson.ok) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"result\",\n testId: test.id,\n passed: false,\n error: (stepJson as any).error || \"step failed\",\n })}\\n\\n`,\n ),\n );\n throw new Error((stepJson as any).error || \"step failed\");\n }\n state = stepJson as any;\n } catch (err) {\n throw new Error(\n `Tool '${name}' failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const called = Array.from(calledTools).map((t) =>\n normalizeToolName(t, serverIds),\n );\n const missing = Array.from(expectedSet).filter(\n (t) => !called.includes(t),\n );\n const unexpected = called.filter((t) => !expectedSet.has(t));\n const passed = missing.length === 0 && unexpected.length === 0;\n if (!passed) failed = true;\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"result\",\n testId: test.id,\n passed,\n calledTools: called,\n missingTools: missing,\n unexpectedTools: unexpected,\n })}\\n\\n`,\n ),\n );\n } catch (err) {\n failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed: false, error: (err as Error)?.message })}\\n\\n`,\n ),\n );\n } finally {\n try {\n await client?.disconnect();\n } catch {}\n active--;\n runNext();\n }\n })();\n };\n\n for (let i = 0; i < Math.min(maxConcurrency, testsInput.length); i++) {\n runNext();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (err) {\n return c.json(\n { success: false, error: (err as Error)?.message || \"Unknown error\" },\n 500,\n );\n }\n});\n","import { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\n\n// Hono-compatible error response type\nexport interface HonoErrorResponse {\n message: string;\n status: number;\n}\n\nexport interface ValidationResult {\n success: boolean;\n config?: MastraMCPServerDefinition;\n error?: HonoErrorResponse;\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\nexport function validateServerConfig(serverConfig: any): ValidationResult {\n if (!serverConfig) {\n return {\n success: false,\n error: {\n message: \"Server configuration is required\",\n status: 400,\n },\n };\n }\n\n // Validate and prepare config\n const config = { ...serverConfig };\n\n // Validate and convert URL if provided\n if (config.url) {\n try {\n // Convert string URL to URL object if needed and strip query/hash\n if (typeof config.url === \"string\") {\n config.url = new URL(config.url);\n } else if (typeof config.url === \"object\" && !config.url.href) {\n return {\n success: false,\n error: {\n message: \"Invalid URL configuration\",\n status: 400,\n },\n };\n }\n\n // Handle OAuth authentication for HTTP servers\n if (config.oauth?.access_token) {\n const authHeaders = {\n Authorization: `Bearer ${config.oauth.access_token}`,\n ...(config.requestInit?.headers || {}),\n };\n\n config.requestInit = {\n ...config.requestInit,\n headers: authHeaders,\n };\n\n // For SSE connections, add eventSourceInit with OAuth headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Add OAuth authorization header\n headers.set(\n \"Authorization\",\n `Bearer ${config.oauth!.access_token}`,\n );\n\n // Copy other headers from requestInit\n if (config.requestInit?.headers) {\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n if (key.toLowerCase() !== \"authorization\") {\n headers.set(key, value);\n }\n });\n }\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n } else if (config.requestInit?.headers) {\n // For SSE connections without OAuth, add eventSourceInit if requestInit has custom headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Copy headers from requestInit\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n headers.set(key, value);\n });\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n }\n } catch (error) {\n return {\n success: false,\n error: {\n message: `Invalid URL format: ${error}`,\n status: 400,\n },\n };\n }\n }\n\n return {\n success: true,\n config,\n };\n}\n\nexport function createMCPClient(\n config: MastraMCPServerDefinition,\n id: string,\n): MCPClient {\n return new MCPClient({\n id,\n servers: {\n server: config,\n },\n });\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n serverNameMapping?: Record<string, string>; // serverID -> originalName\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\n// Generate unique server ID that avoids collisions\nfunction generateUniqueServerID(serverName: string): string {\n // Use normalized name as base + timestamp + random suffix to ensure uniqueness\n const normalizedBase = normalizeServerConfigName(serverName);\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nexport const validateMultipleServerConfigs = (\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MultipleValidationResult => {\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return {\n success: false,\n error: {\n message: \"At least one server configuration is required\",\n status: 400,\n },\n };\n }\n\n const validConfigs: Record<string, MastraMCPServerDefinition> = {};\n const serverNameMapping: Record<string, string> = {};\n const errors: Record<string, string> = {};\n let hasErrors = false;\n\n // Validate each server configuration\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n const validationResult = validateServerConfig(serverConfig);\n\n if (validationResult.success && validationResult.config) {\n // Generate unique server ID to avoid collisions from normalized names\n const serverID = generateUniqueServerID(serverName);\n validConfigs[serverID] = validationResult.config;\n serverNameMapping[serverID] = serverName; // Map serverID back to original name\n } else {\n hasErrors = true;\n let errorMessage = \"Configuration validation failed\";\n if (validationResult.error) {\n errorMessage = validationResult.error.message;\n }\n // Use original server name for error keys since this is for user display\n errors[serverName] = errorMessage;\n }\n }\n\n // If all configs are valid, return success\n if (!hasErrors) {\n return {\n success: true,\n validConfigs,\n serverNameMapping,\n };\n }\n\n // If some configs are valid but others failed, return partial success\n if (Object.keys(validConfigs).length > 0) {\n return {\n success: false,\n validConfigs,\n serverNameMapping,\n errors,\n };\n }\n\n // If all configs failed, return error\n return {\n success: false,\n errors,\n error: {\n message: \"All server configurations failed validation\",\n status: 400,\n },\n };\n};\n\nexport function createMCPClientWithMultipleConnections(\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MCPClient {\n // Custom MCPClient wrapper to fix double prefixing issue\n const originalMCPClient = new MCPClient({\n id: `chat-${Date.now()}`,\n servers: serverConfigs,\n });\n\n // Override getTools method to fix double prefixing\n const originalGetTools = originalMCPClient.getTools.bind(originalMCPClient);\n originalMCPClient.getTools = async () => {\n const tools = await originalGetTools();\n const fixedTools: Record<string, any> = {};\n\n for (const [toolName, toolConfig] of Object.entries(tools)) {\n // Check if tool name has double prefix pattern (serverName_serverName_actualTool)\n const parts = toolName.split(\"_\");\n if (parts.length >= 3 && parts[0] === parts[1]) {\n // Remove the duplicate prefix: \"asana_asana_list_workspaces\" -> \"asana_list_workspaces\"\n const fixedName = parts.slice(1).join(\"_\");\n fixedTools[fixedName] = toolConfig;\n } else {\n fixedTools[toolName] = toolConfig;\n }\n }\n\n return fixedTools;\n };\n\n return originalMCPClient;\n}\n\nexport function normalizeServerConfigName(serverName: string): string {\n // Convert to lowercase and replace spaces/hyphens with underscores\n return serverName\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n}\n\nexport function createErrorResponse(\n message: string,\n details?: string,\n status: number = 500,\n): HonoErrorResponse {\n return {\n message: details ? `${message}: ${details}` : message,\n status,\n };\n}\n","import { Hono } from \"hono\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst oauth = new Hono();\n\n/**\n * Proxy OAuth metadata requests to bypass CORS restrictions\n * GET /api/mcp/oauth/metadata?url=https://mcp.asana.com/.well-known/oauth-authorization-server/sse\n */\noauth.get(\"/metadata\", async (c) => {\n try {\n const url = c.req.query(\"url\");\n\n if (!url) {\n return c.json({ error: \"Missing url parameter\" }, 400);\n }\n\n // Validate URL format and ensure it's HTTPS\n let metadataUrl: URL;\n try {\n metadataUrl = new URL(url);\n if (metadataUrl.protocol !== \"https:\") {\n return c.json({ error: \"Only HTTPS URLs are allowed\" }, 400);\n }\n } catch (error) {\n return c.json({ error: \"Invalid URL format\" }, 400);\n }\n\n // Fetch OAuth metadata from the server\n const response = await fetch(metadataUrl.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"MCP-Inspector/1.0\",\n },\n });\n\n if (!response.ok) {\n return c.json(\n {\n error: `Failed to fetch OAuth metadata: ${response.status} ${response.statusText}`,\n },\n response.status as ContentfulStatusCode,\n );\n }\n\n const metadata = (await response.json()) as Record<string, unknown>;\n\n // Return the metadata with proper CORS headers\n return c.json(metadata);\n } catch (error) {\n console.error(\"OAuth metadata proxy error:\", error);\n return c.json(\n {\n error:\n error instanceof Error ? error.message : \"Unknown error occurred\",\n },\n 500,\n );\n }\n});\n\nexport default oauth;\n","import { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport \"../../types/hono\"; // Type extensions\n\nconst exporter = new Hono();\n\n// POST /export/server — export all server info as JSON\nexporter.post(\"/server\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n\n const mcp = c.mcpJamClientManager;\n const status = mcp.getConnectionStatus(serverId);\n if (status !== \"connected\") {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n\n // Tools\n const flattenedTools = await mcp.getToolsetsForServer(serverId);\n const tools: Array<{\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n }> = [];\n\n for (const [name, tool] of Object.entries(flattenedTools)) {\n let inputSchema = (tool as any).inputSchema;\n try {\n inputSchema = zodToJsonSchema(inputSchema as z.ZodType<any>);\n } catch {}\n tools.push({\n name,\n description: (tool as any).description,\n inputSchema,\n outputSchema: (tool as any).outputSchema,\n });\n }\n\n // Resources\n const resources = mcp.getResourcesForServer(serverId).map((r) => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n }));\n\n // Prompts\n const prompts = mcp.getPromptsForServer(serverId).map((p) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n }));\n\n return c.json({\n serverId,\n exportedAt: new Date().toISOString(),\n tools,\n resources,\n prompts,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return c.json({ error: msg }, 500);\n }\n});\n\nexport default exporter;\n","import { Hono } from \"hono\";\nimport { interceptorStore } from \"../../services/interceptor-store\";\n\nconst interceptor = new Hono();\n\n// Helper to add permissive CORS headers for public proxy endpoints\nfunction withCORS(res: Response): Response {\n const headers = new Headers(res.headers);\n headers.set(\"Access-Control-Allow-Origin\", \"*\");\n headers.set(\"Access-Control-Allow-Methods\", \"GET,POST,HEAD,OPTIONS\");\n // Be explicit: some clients won’t accept \"*\" for Authorization\n headers.set(\n \"Access-Control-Allow-Headers\",\n \"Authorization, Content-Type, Accept, Accept-Language\",\n );\n headers.set(\"Access-Control-Expose-Headers\", \"*\");\n headers.set(\"Vary\", \"Origin, Access-Control-Request-Headers\");\n // Avoid CL+TE conflicts in dev proxies: prefer chunked framing decided by runtime\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n}\n\nfunction maskHeaders(orig: Headers): Record<string, string> {\n const out: Record<string, string> = {};\n orig.forEach((value, key) => {\n if (key.toLowerCase() === \"authorization\") {\n out[key] = value.startsWith(\"Bearer \") ? \"Bearer ***\" : \"***\";\n } else {\n out[key] = value;\n }\n });\n return out;\n}\n\n// Create interceptor pointing to a target MCP server (HTTP)\ninterceptor.post(\"/create\", async (c) => {\n try {\n const body = await c.req.json();\n const targetUrl = body?.targetUrl as string | undefined;\n // Back-compat: accept `serverId` or legacy `managerServerId`\n const serverId: string | undefined =\n (body?.serverId as string | undefined) ||\n (body?.managerServerId as string | undefined);\n const urlObj = new URL(c.req.url);\n let finalTarget: string | undefined = targetUrl;\n let injectHeaders: Record<string, string> | undefined;\n\n if (serverId) {\n // Use stored config for a connected server to derive headers and possibly URL\n const connected = c.mcpJamClientManager.getConnectedServers();\n const serverMeta = connected[serverId];\n const cfg: any | undefined = serverMeta?.config;\n if (!cfg || serverMeta?.status !== \"connected\") {\n return c.json(\n { success: false, error: `Server '${serverId}' is not connected` },\n 400,\n );\n }\n if (!finalTarget) {\n if (cfg.url) {\n finalTarget =\n typeof cfg.url === \"string\" ? cfg.url : (cfg.url as URL).toString();\n } else {\n const origin = new URL(c.req.url).origin;\n finalTarget = `${origin}/api/mcp/adapter-http/${encodeURIComponent(serverId)}`;\n }\n }\n // Derive Authorization and custom headers\n const hdrs: Record<string, string> = {};\n const fromReqInit = cfg.requestInit?.headers as\n | Record<string, string>\n | undefined;\n if (fromReqInit) {\n for (const [k, v] of Object.entries(fromReqInit)) {\n if (typeof v === \"string\") hdrs[k.toLowerCase()] = v;\n }\n }\n const token: string | undefined =\n cfg?.oauth?.access_token || cfg?.oauth?.accessToken;\n if (token && !hdrs[\"authorization\"]) {\n hdrs[\"authorization\"] = `Bearer ${token}`;\n hdrs[\"Authorization\"] = `Bearer ${token}`; // be generous with casing\n }\n injectHeaders = hdrs;\n }\n\n if (!finalTarget) {\n return c.json(\n { success: false, error: \"targetUrl or serverId is required\" },\n 400,\n );\n }\n try {\n const u = new URL(finalTarget);\n if (![\"http:\", \"https:\"].includes(u.protocol)) {\n return c.json(\n {\n success: false,\n error: \"Only HTTP/HTTPS MCP servers are supported\",\n },\n 400,\n );\n }\n } catch {\n return c.json({ success: false, error: \"Invalid URL\" }, 400);\n }\n\n const entry = interceptorStore.create(finalTarget, injectHeaders, serverId);\n\n // Compute local origin and optional public HTTPS origin via tunnel\n const localOrigin = urlObj.origin;\n // Tunneling disabled: always advertise local origin only\n const publicOrigin: string | null = null;\n\n const proxyPath = `/api/mcp/interceptor/${entry.id}/proxy`;\n const localProxyUrl = `${localOrigin}${proxyPath}`;\n const publicProxyUrl = publicOrigin ? `${publicOrigin}${proxyPath}` : null;\n // Prefer HTTPS tunnel when available for backward-compatible proxyUrl consumers\n const proxyUrl = publicProxyUrl || localProxyUrl;\n\n return c.json({\n success: true,\n id: entry.id,\n targetUrl: entry.targetUrl,\n proxyUrl,\n localProxyUrl,\n publicProxyUrl,\n });\n } catch (err) {\n return c.json(\n { success: false, error: (err as Error)?.message || \"Invalid JSON\" },\n 400,\n );\n }\n});\n\n// Info\ninterceptor.get(\"/:id\", (c) => {\n const id = c.req.param(\"id\");\n const info = interceptorStore.info(id);\n if (!info) return c.json({ success: false, error: \"not found\" }, 404);\n const urlObj = new URL(c.req.url);\n // HTTP-only mode: do not surface tunnel URL here\n const publicOrigin = null;\n const proxyPath = `/api/mcp/interceptor/${id}/proxy`;\n const localProxyUrl = `${urlObj.origin}${proxyPath}`;\n const publicProxyUrl = publicOrigin ? `${publicOrigin}${proxyPath}` : null;\n const proxyUrl = publicProxyUrl || localProxyUrl;\n return c.json({\n success: true,\n ...info,\n proxyUrl,\n localProxyUrl,\n publicProxyUrl,\n });\n});\n\n// Clear logs\ninterceptor.post(\"/:id/clear\", (c) => {\n const id = c.req.param(\"id\");\n const ok = interceptorStore.clearLogs(id);\n if (!ok) return c.json({ success: false, error: \"not found\" }, 404);\n return c.json({ success: true });\n});\n\n// Destroy interceptor (stop proxy)\ninterceptor.delete(\"/:id\", (c) => {\n const id = c.req.param(\"id\");\n const ok = interceptorStore.destroy(id);\n if (!ok) return c.json({ success: false, error: \"not found\" }, 404);\n return c.json({ success: true });\n});\n\n// Destroy all interceptors created for a connected server\ninterceptor.delete(\"/by-server/:serverId\", (c) => {\n const serverId = c.req.param(\"serverId\");\n const count = interceptorStore.destroyByServer(serverId);\n return c.json({ success: true, count });\n});\n\n// SSE stream of logs\ninterceptor.get(\"/:id/stream\", (c) => {\n const id = c.req.param(\"id\");\n const entry = interceptorStore.get(id);\n if (!entry) return c.json({ success: false, error: \"not found\" }, 404);\n\n const encoder = new TextEncoder();\n let unsubscribeFn: undefined | (() => void);\n const stream = new ReadableStream({\n start(controller) {\n // send history first\n for (const log of entry.logs) {\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify({ type: \"log\", log })}\\n\\n`),\n );\n }\n const subscriber = {\n send: (event: any) => {\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(event)}\\n\\n`),\n );\n },\n close: () => controller.close(),\n };\n const unsubscribe = interceptorStore.subscribe(id, subscriber);\n unsubscribeFn = unsubscribe;\n },\n cancel() {\n try {\n unsubscribeFn && unsubscribeFn();\n } catch {}\n },\n });\n return new Response(stream as any, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"*, Authorization, Content-Type, Accept, Accept-Language\",\n \"X-Accel-Buffering\": \"no\",\n },\n });\n});\n\n// CORS preflight for proxy endpoint\ninterceptor.options(\"/:id/proxy\", (c) => {\n return c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Max-Age\": \"86400\",\n Vary: \"Origin, Access-Control-Request-Headers\",\n });\n});\n\n// Also handle preflight on wildcard path\ninterceptor.options(\"/:id/proxy/*\", (c) => {\n return c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Max-Age\": \"86400\",\n Vary: \"Origin, Access-Control-Request-Headers\",\n });\n});\n\nasync function handleProxy(c: any) {\n const id = c.req.param(\"id\");\n const entry = interceptorStore.get(id);\n if (!entry) return c.json({ success: false, error: \"not found\" }, 404);\n\n const req = c.req.raw;\n const requestId = `${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n // read request body text safely\n let requestBody: string | undefined;\n try {\n const clone = req.clone();\n requestBody = await clone.text();\n } catch {\n requestBody = undefined;\n }\n\n // log request\n interceptorStore.appendLog(id, {\n id: requestId,\n timestamp: Date.now(),\n direction: \"request\",\n method: req.method,\n url: entry.targetUrl,\n headers: maskHeaders(req.headers),\n body: requestBody,\n });\n\n // Shim SSE for stateless servers (Cursor compatibility):\n try {\n const accept = (req.headers.get(\"accept\") || \"\").toLowerCase();\n const wantsSSE = accept.includes(\"text/event-stream\");\n const targetPathname = new URL(entry.targetUrl).pathname;\n const upstreamLooksLikeSse = /\\/sse(\\/|$)/i.test(targetPathname);\n if (req.method === \"HEAD\" && wantsSSE && !upstreamLooksLikeSse) {\n const headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n return withCORS(new Response(null, { status: 200, headers }));\n }\n if (req.method === \"GET\" && wantsSSE && !upstreamLooksLikeSse) {\n const xfProto = req.headers.get(\"x-forwarded-proto\");\n const xfHost = req.headers.get(\"x-forwarded-host\");\n const host = xfHost || req.headers.get(\"host\");\n let proto = xfProto;\n if (!proto) {\n const originHeader = req.headers.get(\"origin\");\n if (originHeader && /^https:/i.test(originHeader)) proto = \"https\";\n }\n if (!proto) proto = \"http\";\n const proxyOrigin = host ? `${proto}://${host}` : new URL(req.url).origin;\n const sessionId = crypto.randomUUID();\n // Map session to upstream base URL (stateless POST endpoint)\n interceptorStore.setSessionEndpoint(\n id,\n sessionId,\n new URL(entry.targetUrl).toString(),\n );\n const encoder = new TextEncoder();\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(encoder.encode(`event: ping\\n`));\n controller.enqueue(encoder.encode(`data: \\n\\n`));\n const endpoint = `${proxyOrigin}/api/mcp/interceptor/${id}/proxy/messages?sessionId=${sessionId}`;\n // Some clients (Cursor) expect JSON {url: ...}; others (Claude) choke on JSON and use string.\n const ua = c.req.header(\"user-agent\") || \"\";\n const isClaude = /claude/i.test(ua) || /anthropic/i.test(ua);\n if (!isClaude) {\n controller.enqueue(encoder.encode(`event: endpoint\\n`));\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify({ url: endpoint })}\\n\\n`),\n );\n }\n controller.enqueue(encoder.encode(`event: endpoint\\n`));\n controller.enqueue(encoder.encode(`data: ${endpoint}\\n\\n`));\n const t = setInterval(() => {\n try {\n controller.enqueue(\n encoder.encode(`: keepalive ${Date.now()}\\n\\n`),\n );\n } catch {}\n }, 15000);\n (controller as any)._t = t;\n },\n cancel() {\n try {\n clearInterval((this as any)._t);\n } catch {}\n },\n });\n {\n const headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n });\n // Ensure no CL/TE conflict for dev proxies\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n return withCORS(new Response(stream as any, { headers }));\n }\n }\n } catch {}\n\n // Build upstream URL: preserve trailing path (/messages etc.) and query after /proxy/:id\n let upstreamUrl = new URL(entry.targetUrl);\n try {\n const originalUrl = new URL(req.url);\n const proxyBase = `/api/mcp/interceptor/${id}/proxy`;\n const rest = originalUrl.pathname.startsWith(proxyBase)\n ? originalUrl.pathname.slice(proxyBase.length)\n : \"\";\n const basePath = upstreamUrl.pathname.endsWith(\"/\")\n ? upstreamUrl.pathname.slice(0, -1)\n : upstreamUrl.pathname;\n const trailing = rest ? (rest.startsWith(\"/\") ? rest : `/${rest}`) : \"\";\n // Special-case: if this is our rewritten messages endpoint, forward to the original upstream endpoint\n if (trailing.startsWith(\"/messages\")) {\n const sessionId = new URL(req.url).searchParams.get(\"sessionId\") || \"\";\n const mapped = sessionId\n ? interceptorStore.getSessionEndpoint(id, sessionId)\n : undefined;\n if (mapped) {\n upstreamUrl = new URL(mapped);\n } else {\n // Stateless fallback: POST to upstream base URL (drop /messages path and local query)\n upstreamUrl.pathname = `${basePath}`;\n upstreamUrl.search = \"\";\n }\n } else {\n upstreamUrl.pathname = `${basePath}${trailing}`;\n // Preserve target URL's query parameters (e.g., API keys) and merge with request params\n const targetParams = new URLSearchParams(upstreamUrl.search);\n const requestParams = new URLSearchParams(originalUrl.search);\n // Add request params to target params (target params take precedence)\n requestParams.forEach((value, key) => {\n if (!targetParams.has(key)) {\n targetParams.set(key, value);\n }\n });\n upstreamUrl.search = targetParams.toString();\n }\n } catch {}\n\n // Filter hop-by-hop headers and forward Authorization. Drop content-length so Undici computes it.\n const filtered = new Headers();\n req.headers.forEach((value, key) => {\n const k = key.toLowerCase();\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n ].includes(k)\n )\n return;\n if (k === \"content-length\") return;\n // Let fetch set the correct Host for the upstream\n if (k === \"host\") return;\n filtered.set(key, value);\n });\n\n // Ensure Accept advertises both JSON and SSE for servers that require it (e.g., HF/Cloudflare)\n try {\n const acc = (filtered.get(\"accept\") || \"\").toLowerCase();\n const hasJson = acc.includes(\"application/json\");\n const hasSse = acc.includes(\"text/event-stream\");\n if (!hasJson || !hasSse) {\n const parts: string[] = [];\n if (!hasJson) parts.push(\"application/json\");\n if (!hasSse) parts.push(\"text/event-stream\");\n const suffix = parts.join(\", \");\n filtered.set(\"accept\", acc ? `${acc}, ${suffix}` : suffix);\n }\n } catch {}\n\n // Inject static headers (e.g., Authorization) if not already present from the client\n if (entry.injectHeaders) {\n for (const [key, value] of Object.entries(entry.injectHeaders)) {\n const k = key.toLowerCase();\n if (k === \"host\" || k === \"content-length\") continue;\n if (\n [\n \"connection\",\n \"keep-alive\",\n \"transfer-encoding\",\n \"upgrade\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n ].includes(k)\n )\n continue;\n // Do not override an explicit client Authorization header\n if (k === \"authorization\" && filtered.has(\"authorization\")) continue;\n filtered.set(key, value);\n }\n }\n\n // No manager-backed mode: pure proxy only\n\n const init: RequestInit = {\n method: req.method,\n headers: filtered,\n };\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n init.body = requestBody;\n }\n const targetReq = new Request(upstreamUrl.toString(), init as any);\n\n try {\n const res = await fetch(targetReq);\n const resClone = res.clone();\n const ct = (res.headers.get(\"content-type\") || \"\").toLowerCase();\n const isStreaming =\n ct.includes(\"text/event-stream\") || ct.includes(\"application/x-ndjson\");\n let responseBody: string | undefined;\n try {\n if (\n ct.includes(\"text/event-stream\") ||\n ct.includes(\"application/x-ndjson\")\n ) {\n responseBody = \"[stream]\"; // avoid draining the stream\n } else {\n responseBody = await resClone.text();\n }\n } catch {\n responseBody = undefined;\n }\n // For streaming responses, skip the placeholder log and rely on detailed SSE message logs\n if (!isStreaming) {\n interceptorStore.appendLog(id, {\n id: `${requestId}-res`,\n timestamp: Date.now(),\n direction: \"response\",\n status: res.status,\n statusText: res.statusText,\n headers: Object.fromEntries(res.headers.entries()),\n body: responseBody,\n });\n }\n // If this is an SSE stream, rewrite endpoint events to point back through the proxy\n if (ct.includes(\"text/event-stream\")) {\n const upstreamBody = res.body;\n if (!upstreamBody) {\n return withCORS(\n new Response(null, { status: res.status, headers: res.headers }),\n );\n }\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let lastEventType: string | null = null;\n // Accumulate data lines for the current SSE event so we can log full payloads\n let currentEventData: string[] = [];\n const proxyBasePath = `/api/mcp/interceptor/${id}/proxy`;\n // Derive proxy origin from forwarded/host headers for direct access.\n const xfProto = c.req.header(\"x-forwarded-proto\");\n const xfHost = c.req.header(\"x-forwarded-host\");\n const reqHost = xfHost || c.req.header(\"host\");\n let reqProto = xfProto;\n if (!reqProto) {\n const originHeader = c.req.header(\"origin\");\n if (originHeader && /^https:/i.test(originHeader)) reqProto = \"https\";\n }\n if (!reqProto) reqProto = \"http\";\n const proxyOrigin = reqHost\n ? `${reqProto}://${reqHost}`\n : new URL(c.req.url).origin;\n // Prefer the resolved upstream response URL; fall back to request URL\n let upstreamOrigin = (() => {\n try {\n const u = new URL((res as any).url || upstreamUrl.toString());\n return `${u.protocol}//${u.host}`;\n } catch {\n try {\n return new URL(entry.targetUrl).origin;\n } catch {\n return \"\";\n }\n }\n })();\n const rewriteStream = new ReadableStream<Uint8Array>({\n async start(controller) {\n const reader = upstreamBody.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buffer.indexOf(\"\\n\")) !== -1) {\n const line = buffer.slice(0, idx + 1); // include newline\n buffer = buffer.slice(idx + 1);\n if (line.startsWith(\"event:\")) {\n lastEventType = line.slice(6).trim();\n controller.enqueue(encoder.encode(line));\n } else if (line.startsWith(\"data:\")) {\n // Parse data lines for endpoint hints\n const rawLine = line.slice(5); // keep trailing newline\n const trimmed = rawLine.trim();\n // Track data lines for this event so we can log at event boundary\n currentEventData.push(trimmed);\n let endpointUrl: string | null = null;\n try {\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const obj = JSON.parse(trimmed);\n // Accept various shapes\n endpointUrl =\n obj?.url ||\n obj?.endpoint?.url ||\n (obj?.type === \"endpoint\" &&\n (obj?.data?.url || obj?.data));\n }\n } catch {}\n if (!endpointUrl) {\n // Heuristic: plain string containing \"/message\" looks like endpoint URL\n const str = trimmed;\n if (/message\\?/.test(str) || /messages\\?/.test(str)) {\n endpointUrl = str;\n }\n }\n if (endpointUrl) {\n try {\n const u = new URL(\n endpointUrl,\n upstreamOrigin || undefined,\n );\n const sessionId =\n u.searchParams.get(\"sessionId\") ||\n u.searchParams.get(\"sid\") ||\n \"\";\n if (sessionId) {\n interceptorStore.setSessionEndpoint(\n id,\n sessionId,\n u.toString(),\n );\n try {\n console.log(\"[proxy] mapped session\", {\n id,\n sessionId,\n upstream: u.toString(),\n });\n } catch {}\n }\n const proxyEndpoint = `${proxyOrigin}${proxyBasePath}/messages${u.search}`;\n // Emit a single endpoint event with a plain string URL (most compatible)\n controller.enqueue(encoder.encode(`event: endpoint\\n`));\n controller.enqueue(\n encoder.encode(`data: ${proxyEndpoint}\\n\\n`),\n );\n // Reset current event buffer since we emitted a translated event\n currentEventData = [];\n continue; // skip original data line\n } catch {\n // fall through\n }\n }\n // Not an endpoint payload; pass through\n controller.enqueue(encoder.encode(line));\n } else if (line === \"\\n\") {\n // End of an SSE event — if it was a message event, mirror it into logs\n if (lastEventType === \"message\") {\n const dataText = currentEventData.join(\"\\n\");\n let bodyText = dataText;\n try {\n // Many servers send a single JSON line; keep original text if parse fails\n const parsed = JSON.parse(dataText);\n bodyText = JSON.stringify(parsed);\n } catch {}\n try {\n interceptorStore.appendLog(id, {\n id: `${requestId}-sse-${Date.now()}`,\n timestamp: Date.now(),\n direction: \"response\",\n status: 200,\n statusText: \"SSE message\",\n headers: { \"content-type\": \"text/event-stream\" },\n body: bodyText,\n });\n } catch {}\n }\n currentEventData = [];\n lastEventType = null;\n controller.enqueue(encoder.encode(line));\n } else {\n controller.enqueue(encoder.encode(line));\n }\n }\n }\n if (buffer.length) controller.enqueue(encoder.encode(buffer));\n } finally {\n try {\n controller.close();\n } catch {}\n }\n },\n });\n const headers = new Headers(res.headers);\n // For streaming responses, do not send Content-Length; Node will use chunked framing.\n headers.delete(\"content-length\");\n headers.delete(\"Content-Length\");\n // Let the runtime decide Transfer-Encoding; keep-alive semantics for SSE\n headers.delete(\"transfer-encoding\");\n headers.delete(\"Transfer-Encoding\");\n headers.set(\"Cache-Control\", \"no-cache\");\n headers.set(\"Connection\", \"keep-alive\");\n return withCORS(\n new Response(rewriteStream as any, {\n status: res.status,\n statusText: res.statusText,\n headers,\n }),\n );\n }\n\n // Non-SSE: passthrough (avoid CL+TE conflict) — always drop Content-Length\n const nonSseHeaders = new Headers(res.headers);\n nonSseHeaders.delete(\"content-length\");\n nonSseHeaders.delete(\"Content-Length\");\n const passthrough = new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers: nonSseHeaders,\n });\n return withCORS(passthrough);\n } catch (error) {\n const body = JSON.stringify({ error: String(error) });\n interceptorStore.appendLog(id, {\n id: `${requestId}-err`,\n timestamp: Date.now(),\n direction: \"response\",\n status: 500,\n statusText: \"Proxy Error\",\n headers: { \"content-type\": \"application/json\" },\n body,\n });\n return withCORS(\n new Response(body, {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n }),\n );\n }\n}\n\n// HTTP proxy for JSON-RPC\ninterceptor.all(\"/:id/proxy\", handleProxy);\ninterceptor.all(\"/:id/proxy/*\", handleProxy);\n\nexport default interceptor;\n","import { randomUUID } from \"crypto\";\n\nexport type InterceptorLog =\n | {\n id: string;\n timestamp: number;\n direction: \"request\";\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: string;\n }\n | {\n id: string;\n timestamp: number;\n direction: \"response\";\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body?: string;\n };\n\ntype SseSubscriber = {\n send: (event: any) => void;\n close: () => void;\n};\n\ntype InterceptorEntry = {\n id: string;\n targetUrl: string;\n createdAt: number;\n logs: InterceptorLog[];\n subscribers: Set<SseSubscriber>;\n // Optional static headers to inject on every upstream request (e.g., Authorization)\n injectHeaders?: Record<string, string>;\n // Map sessionId -> upstream messages endpoint URL (rewritten SSE support)\n sessionEndpoints: Map<string, string>;\n // Optional originating connected server id (for bulk cleanup)\n serverId?: string;\n};\n\nclass InterceptorStore {\n private interceptors: Map<string, InterceptorEntry> = new Map();\n private sessionIndex: Map<string, { interceptorId: string; url: string }> =\n new Map();\n private byServer: Map<string, Set<string>> = new Map();\n\n create(\n targetUrl: string,\n injectHeaders?: Record<string, string>,\n serverId?: string,\n ) {\n // Use a longer, hard-to-guess id (32 hex chars)\n const id = randomUUID().replace(/-/g, \"\");\n const entry: InterceptorEntry = {\n id,\n targetUrl,\n createdAt: Date.now(),\n logs: [],\n subscribers: new Set(),\n injectHeaders,\n sessionEndpoints: new Map(),\n serverId,\n };\n this.interceptors.set(id, entry);\n if (serverId) {\n if (!this.byServer.has(serverId)) this.byServer.set(serverId, new Set());\n this.byServer.get(serverId)!.add(id);\n }\n return entry;\n }\n\n get(id: string) {\n return this.interceptors.get(id);\n }\n\n info(id: string) {\n const e = this.interceptors.get(id);\n if (!e) return undefined;\n return {\n id: e.id,\n targetUrl: e.targetUrl,\n createdAt: e.createdAt,\n logCount: e.logs.length,\n hasInjectedAuth: !!e.injectHeaders?.authorization,\n };\n }\n\n clearLogs(id: string) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.logs = [];\n this.broadcast(e, { type: \"cleared\" });\n return true;\n }\n\n appendLog(id: string, log: InterceptorLog) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.logs.push(log);\n this.broadcast(e, { type: \"log\", log });\n return true;\n }\n\n listLogs(id: string) {\n const e = this.interceptors.get(id);\n return e?.logs ?? [];\n }\n\n subscribe(id: string, subscriber: SseSubscriber) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.subscribers.add(subscriber);\n return () => {\n e.subscribers.delete(subscriber);\n };\n }\n\n setSessionEndpoint(id: string, sessionId: string, url: string) {\n const e = this.interceptors.get(id);\n if (!e) return false;\n e.sessionEndpoints.set(sessionId, url);\n this.sessionIndex.set(sessionId, { interceptorId: id, url });\n return true;\n }\n\n getSessionEndpoint(id: string, sessionId: string): string | undefined {\n const e = this.interceptors.get(id);\n return e?.sessionEndpoints.get(sessionId);\n }\n\n getSessionMapping(\n sessionId: string,\n ): { interceptorId: string; url: string } | undefined {\n return this.sessionIndex.get(sessionId);\n }\n\n destroy(id: string): boolean {\n const e = this.interceptors.get(id);\n if (!e) return false;\n // Close and remove subscribers\n for (const sub of Array.from(e.subscribers)) {\n try {\n sub.send({ type: \"closed\" });\n } catch {}\n try {\n sub.close();\n } catch {}\n }\n e.subscribers.clear();\n // Remove session mappings for this interceptor\n for (const sid of Array.from(e.sessionEndpoints.keys())) {\n this.sessionIndex.delete(sid);\n }\n this.interceptors.delete(id);\n return true;\n }\n\n destroyByServer(serverId: string): number {\n const set = this.byServer.get(serverId);\n if (!set || set.size === 0) return 0;\n let count = 0;\n for (const id of Array.from(set)) {\n if (this.destroy(id)) count++;\n }\n this.byServer.delete(serverId);\n return count;\n }\n\n private broadcast(e: InterceptorEntry, payload: any) {\n for (const sub of Array.from(e.subscribers)) {\n try {\n sub.send(payload);\n } catch {\n try {\n sub.close();\n } catch {}\n e.subscribers.delete(sub);\n }\n }\n }\n}\n\nexport const interceptorStore = new InterceptorStore();\n","import { Hono } from \"hono\";\nimport \"../../types/hono\";\nimport { handleJsonRpc, BridgeMode } from \"../../services/mcp-http-bridge\";\n\n// In-memory SSE session store per serverId:sessionId\ntype Session = {\n send: (event: string, data: string) => void;\n close: () => void;\n};\nconst sessions: Map<string, Session> = new Map();\nconst latestSessionByServer: Map<string, string> = new Map();\n\n// Unified HTTP adapter that handles both adapter-http and manager-http routes\n// with the same robust implementation but different JSON-RPC response modes\n\nfunction createHttpHandler(mode: BridgeMode, routePrefix: string) {\n const router = new Hono();\n\n router.options(\"/:serverId\", (c) =>\n c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"*, Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Expose-Headers\": \"*\",\n \"Access-Control-Max-Age\": \"86400\",\n }),\n );\n\n // Wildcard variants to tolerate trailing paths (e.g., /mcp)\n router.options(\"/:serverId/*\", (c) =>\n c.body(null, 204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET,POST,HEAD,OPTIONS\",\n \"Access-Control-Allow-Headers\":\n \"*, Authorization, Content-Type, Accept, Accept-Language\",\n \"Access-Control-Expose-Headers\": \"*\",\n \"Access-Control-Max-Age\": \"86400\",\n }),\n );\n\n async function handleHttp(c: any) {\n const serverId = c.req.param(\"serverId\");\n const method = c.req.method;\n\n // SSE endpoint for clients that probe/subscribe via GET; HEAD advertises event-stream\n if (method === \"HEAD\") {\n return c.body(null, 200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"X-Accel-Buffering\": \"no\",\n });\n }\n if (method === \"GET\") {\n const encoder = new TextEncoder();\n const incomingUrl = new URL(c.req.url);\n // Allow proxy to override the endpoint base so the client posts back through the proxy\n const overrideBase = c.req.header(\"x-mcpjam-endpoint-base\");\n let endpointBase: string;\n if (overrideBase && overrideBase.trim() !== \"\") {\n endpointBase = overrideBase.trim();\n } else {\n // Compute an absolute endpoint based on forwarded headers when present\n // so direct access (without the proxy) advertises a reachable URL.\n const xfProto = c.req.header(\"x-forwarded-proto\");\n const xfHost = c.req.header(\"x-forwarded-host\");\n const host = xfHost || c.req.header(\"host\");\n let proto = xfProto;\n if (!proto) {\n const originHeader = c.req.header(\"origin\");\n if (originHeader && /^https:/i.test(originHeader)) proto = \"https\";\n }\n if (!proto) proto = \"http\";\n const origin = host ? `${proto}://${host}` : incomingUrl.origin;\n endpointBase = `${origin}/api/mcp/${routePrefix}/${serverId}/messages`;\n }\n const sessionId = crypto.randomUUID();\n let timer: any;\n const stream = new ReadableStream({\n start(controller) {\n console.log(`[${routePrefix}] SSE open`, { serverId, sessionId });\n const send = (event: string, data: string) => {\n controller.enqueue(encoder.encode(`event: ${event}\\n`));\n controller.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n };\n const close = () => {\n try {\n controller.close();\n } catch {}\n };\n\n // Register session\n sessions.set(`${serverId}:${sessionId}`, { send, close });\n latestSessionByServer.set(serverId, sessionId);\n console.log(`[${routePrefix}] session registered`, {\n key: `${serverId}:${sessionId}`,\n });\n\n // Ping and endpoint per SSE transport handshake\n send(\"ping\", \"\");\n const sep = endpointBase.includes(\"?\") ? \"&\" : \"?\";\n const url = `${endpointBase}${sep}sessionId=${sessionId}`;\n console.log(`[${routePrefix}] endpoint`, {\n serverId,\n sessionId,\n url,\n });\n // Emit endpoint as JSON (spec-friendly) then as a plain string (compat).\n try {\n send(\"endpoint\", JSON.stringify({ url, headers: {} }));\n } catch {}\n try {\n send(\"endpoint\", url);\n } catch {}\n\n // Periodic keepalive comments so proxies don't buffer/close\n timer = setInterval(() => {\n try {\n controller.enqueue(\n encoder.encode(`: keepalive ${Date.now()}\\n\\n`),\n );\n } catch {}\n }, 15000);\n },\n cancel() {\n try {\n clearInterval(timer);\n } catch {}\n console.log(`[${routePrefix}] SSE close`, { serverId, sessionId });\n sessions.delete(`${serverId}:${sessionId}`);\n // If this session was the latest for this server, clear pointer\n if (latestSessionByServer.get(serverId) === sessionId) {\n latestSessionByServer.delete(serverId);\n }\n },\n });\n return c.body(stream as any, 200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n \"X-Accel-Buffering\": \"no\",\n \"Transfer-Encoding\": \"chunked\",\n });\n }\n\n if (method !== \"POST\") {\n return c.json({ error: \"Unsupported request\" }, 400);\n }\n\n // Parse JSON body (best effort)\n let body: any = undefined;\n try {\n body = await c.req.json();\n } catch {}\n\n const clientManager = c.mcpJamClientManager;\n const response = await handleJsonRpc(\n serverId,\n body as any,\n clientManager,\n mode,\n );\n if (!response) {\n // Notification → 202 Accepted\n return c.body(\"Accepted\", 202, { \"Access-Control-Allow-Origin\": \"*\" });\n }\n return c.body(JSON.stringify(response), 200, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n }\n\n // Endpoint to receive client messages for SSE transport: /:serverId/messages?sessionId=...\n router.post(\"/:serverId/messages\", async (c) => {\n const serverId = c.req.param(\"serverId\");\n const url = new URL(c.req.url);\n const sessionId = url.searchParams.get(\"sessionId\") || \"\";\n const key = `${serverId}:${sessionId}`;\n let sess = sessions.get(key);\n if (!sess) {\n const fallbackId = latestSessionByServer.get(serverId);\n if (fallbackId) {\n sess = sessions.get(`${serverId}:${fallbackId}`);\n }\n }\n console.log(`[${routePrefix}] POST messages`, {\n key,\n resolved: !!sess,\n contentType: c.req.header(\"content-type\"),\n });\n if (!sess) {\n return c.json({ error: \"Invalid session\" }, 400);\n }\n let body: any;\n try {\n body = await c.req.json();\n } catch {\n try {\n const txt = await c.req.text();\n body = txt ? JSON.parse(txt) : undefined;\n } catch {\n body = undefined;\n }\n }\n const id = body?.id ?? null;\n const method = body?.method as string | undefined;\n const params = body?.params ?? {};\n\n // Reuse the JSON-RPC handling via bridge\n try {\n const responseMessage = await handleJsonRpc(\n serverId,\n { id, method, params },\n c.mcpJamClientManager,\n mode,\n );\n // If there is a JSON-RPC response, emit it over SSE to the client\n if (responseMessage) {\n try {\n console.log(`[${routePrefix}] emit message`, {\n key,\n id: responseMessage.id,\n method,\n });\n sess.send(\"message\", JSON.stringify(responseMessage));\n } catch {}\n }\n // 202 Accepted per SSE transport semantics\n return c.body(\"Accepted\", 202, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n } catch (e: any) {\n return c.body(\"Error\", 400, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"*\",\n });\n }\n });\n\n // Register catch-all handlers AFTER the messages route so it isn't shadowed\n router.all(\"/:serverId\", handleHttp);\n router.all(\"/:serverId/*\", handleHttp);\n\n return router;\n}\n\n// Create both adapters with their respective modes\nexport const adapterHttp = createHttpHandler(\"adapter\", \"adapter-http\");\nexport const managerHttp = createHttpHandler(\"manager\", \"manager-http\");\n\n// Export default for backward compatibility (adapter)\nexport default adapterHttp;\n","import { MCPJamClientManager } from \"./mcpjam-client-manager\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\n// Unify JSON-RPC handling used by adapter-http and manager-http routes\n// while preserving their minor response-shape differences.\n\nexport type BridgeMode = \"adapter\" | \"manager\";\n\ntype JsonRpcBody = {\n id?: string | number | null;\n method?: string;\n params?: any;\n};\n\nexport function buildInitializeResult(serverId: string, mode: BridgeMode) {\n if (mode === \"adapter\") {\n return {\n protocolVersion: \"2025-06-18\",\n capabilities: {\n tools: { listChanged: true },\n prompts: {},\n resources: { listChanged: true, subscribe: true },\n logging: {},\n roots: { listChanged: true },\n },\n serverInfo: { name: serverId, version: \"stdio-adapter\" },\n };\n }\n // manager mode (SSE transport facade)\n return {\n protocolVersion: \"2025-06-18\",\n capabilities: {\n tools: true,\n prompts: true,\n resources: true,\n logging: false,\n elicitation: {},\n roots: { listChanged: true },\n },\n serverInfo: { name: serverId, version: \"mcpjam-proxy\" },\n };\n}\n\nfunction toJsonSchemaMaybe(schema: any): any {\n try {\n if (schema && typeof schema === \"object\") {\n // Detect Zod schema heuristically\n if (\n schema instanceof z.ZodType ||\n (\"_def\" in schema && \"parse\" in schema)\n ) {\n return zodToJsonSchema(schema as z.ZodType<any>);\n }\n }\n } catch {}\n return schema;\n}\n\nexport async function handleJsonRpc(\n serverId: string,\n body: JsonRpcBody,\n clientManager: MCPJamClientManager,\n mode: BridgeMode,\n): Promise<any | null> {\n const id = (body?.id ?? null) as any;\n const method = body?.method as string | undefined;\n const params = body?.params ?? {};\n\n // Treat missing method and notifications/* as notifications (no response envelope)\n if (!method || method.startsWith(\"notifications/\")) {\n return null;\n }\n\n const respond = (payload: any) => ({ jsonrpc: \"2.0\", id, ...payload });\n\n try {\n switch (method) {\n case \"ping\":\n return respond({ result: {} });\n case \"initialize\": {\n const result = buildInitializeResult(serverId, mode);\n return respond({ result });\n }\n case \"tools/list\": {\n const toolsets = await clientManager.getToolsetsForServer(serverId);\n const tools = Object.keys(toolsets).map((name) => ({\n name,\n description: (toolsets as any)[name].description,\n inputSchema: toJsonSchemaMaybe((toolsets as any)[name].inputSchema),\n outputSchema: toJsonSchemaMaybe((toolsets as any)[name].outputSchema),\n }));\n return respond({ result: { tools } });\n }\n case \"tools/call\": {\n try {\n const exec = await clientManager.executeToolDirect(\n `${serverId}:${params?.name}`,\n params?.arguments || {},\n );\n if (mode === \"manager\") {\n // Spec-style CallToolResult\n const result = {\n content: [\n {\n type: \"text\",\n text:\n typeof (exec as any).result === \"string\"\n ? (exec as any).result\n : JSON.stringify((exec as any).result, null, 2),\n },\n ],\n isError: false,\n };\n return respond({ result });\n }\n // adapter mode returns raw result\n return respond({ result: (exec as any).result });\n } catch (e: any) {\n if (mode === \"manager\") {\n const result = {\n content: [\n { type: \"text\", text: `Error: ${e?.message || String(e)}` },\n ],\n isError: true,\n };\n return respond({ result });\n }\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n }\n case \"resources/list\": {\n const resources = clientManager\n .getResourcesForServer(serverId)\n .map((r) => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n }));\n return respond({ result: { resources } });\n }\n case \"resources/read\": {\n try {\n const content = await clientManager.getResource(\n params?.uri,\n serverId,\n );\n if (mode === \"manager\") {\n const result = {\n contents: [\n {\n uri: params?.uri,\n mimeType: (content as any)?.mimeType || \"text/plain\",\n text:\n typeof content === \"string\"\n ? content\n : JSON.stringify(content, null, 2),\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: content });\n } catch (e: any) {\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n }\n case \"prompts/list\": {\n const prompts = clientManager\n .getPromptsForServer(serverId)\n .map((p) => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n }));\n return respond({ result: { prompts } });\n }\n case \"prompts/get\": {\n try {\n const content = await clientManager.getPrompt(\n params?.name,\n serverId,\n params?.arguments || {},\n );\n if (mode === \"manager\") {\n const result = {\n description:\n (content as any)?.description || `Prompt: ${params?.name}`,\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text:\n typeof content === \"string\"\n ? content\n : JSON.stringify(content, null, 2),\n },\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: content });\n } catch (e: any) {\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n }\n case \"roots/list\": {\n return respond({ result: { roots: [] } });\n }\n case \"logging/setLevel\": {\n return respond({ result: { success: true } });\n }\n default: {\n return respond({\n error: { code: -32601, message: `Method not implemented: ${method}` },\n });\n }\n }\n } catch (e: any) {\n return respond({\n error: { code: -32000, message: e?.message || String(e) },\n });\n }\n}\n","import { MCPClient, MastraMCPServerDefinition } from \"@mastra/mcp\";\nimport { validateServerConfig } from \"../utils/mcp-utils\";\nimport { DynamicArgument } from \"@mastra/core/base\";\nimport { ToolsInput } from \"@mastra/core/agent\";\n\nexport type ConnectionStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport interface DiscoveredTool {\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n serverId: string;\n}\n\nexport interface DiscoveredResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n serverId: string;\n}\n\nexport interface DiscoveredPrompt {\n name: string;\n description?: string;\n arguments?: Record<string, any>;\n serverId: string;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n}\n\nexport interface ChatResponse {\n text?: string;\n toolCalls?: any[];\n toolResults?: any[];\n}\n\nexport interface ToolResult {\n result: any;\n}\n\nexport interface ElicitationRequest {\n message: string;\n requestedSchema: any;\n}\n\nexport interface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\nexport interface ResourceContent {\n contents: any[];\n}\n\nexport interface PromptResult {\n content: any;\n}\n\nfunction generateUniqueServerId(serverId: string) {\n // Generate unique server ID that avoids collisions\n const normalizedBase = serverId\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nclass MCPJamClientManager {\n private mcpClients: Map<string, MCPClient> = new Map();\n private statuses: Map<string, ConnectionStatus> = new Map();\n private configs: Map<string, MastraMCPServerDefinition> = new Map();\n\n // Map original server names to unique IDs\n private serverIdMapping: Map<string, string> = new Map();\n\n // Track in-flight connections to avoid duplicate concurrent connects\n private pendingConnections: Map<string, Promise<void>> = new Map();\n\n private toolRegistry: Map<string, DiscoveredTool> = new Map();\n private resourceRegistry: Map<string, DiscoveredResource> = new Map();\n private promptRegistry: Map<string, DiscoveredPrompt> = new Map();\n\n // Store for pending elicitation requests with Promise resolvers\n private pendingElicitations: Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > = new Map();\n\n // Optional callback for handling elicitation requests\n private elicitationCallback?: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>;\n\n // Centralized server ID resolution - handles both original names and unique IDs\n private resolveServerId(serverIdentifier: string): string | undefined {\n if (this.mcpClients.has(serverIdentifier)) {\n return serverIdentifier;\n }\n return this.serverIdMapping.get(serverIdentifier);\n }\n\n // Public method to get server ID for external use (like frontend)\n getServerIdForName(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n private flattenToolsets(toolsets: Record<string, any>): Record<string, any> {\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n return flattenedTools;\n }\n\n async getFlattenedToolsetsForEnabledServers(\n serverNameFilter?: string[],\n ): Promise<DynamicArgument<ToolsInput>> {\n const allFlattenedTools: Record<string, any> = {};\n const allServerIdsFromFilter = serverNameFilter?.map((serverName) =>\n this.getServerIdForName(serverName),\n ); // Optional filter by servers selected\n\n for (const [serverId, client] of this.mcpClients.entries()) {\n if (serverNameFilter && !allServerIdsFromFilter?.includes(serverId))\n continue;\n if (this.getConnectionStatus(serverId) !== \"connected\") continue;\n try {\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n Object.assign(allFlattenedTools, flattenedTools);\n } catch (error) {\n console.warn(`Failed to get tools from server ${serverId}:`, error);\n }\n }\n\n return allFlattenedTools as DynamicArgument<ToolsInput>;\n }\n\n async getToolsetsForServer(\n serverId: string,\n ): Promise<DynamicArgument<ToolsInput>> {\n const id = this.resolveServerId(serverId);\n if (!id) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n const client = this.mcpClients.get(id);\n if (!client) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n // Get toolsets and flatten them\n const toolsets = await client.getToolsets();\n return this.flattenToolsets(toolsets) as DynamicArgument<ToolsInput>;\n }\n\n async connectToServer(serverId: string, serverConfig: any): Promise<void> {\n // If a connection is already in-flight for this server name, wait for it\n const pending = this.pendingConnections.get(serverId);\n if (pending) {\n await pending;\n return;\n }\n\n const connectPromise = (async () => {\n // Reuse existing unique ID for this server name if present; otherwise generate and map one\n let id = this.serverIdMapping.get(serverId);\n if (!id) {\n id = generateUniqueServerId(serverId);\n this.serverIdMapping.set(serverId, id);\n }\n\n // If already connected, no-op\n if (this.mcpClients.has(id)) return;\n\n // Validate server configuration\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n this.statuses.set(id, \"error\");\n throw new Error(validation.error!.message);\n }\n\n this.configs.set(id, validation.config!);\n this.statuses.set(id, \"connecting\");\n\n const client = new MCPClient({\n id: `mcpjam-${id}`,\n servers: { [id]: validation.config! },\n });\n\n try {\n // touch the server to verify connection\n await client.getTools();\n this.mcpClients.set(id, client);\n this.statuses.set(id, \"connected\");\n\n // Register elicitation handler for this server\n if (client.elicitation?.onRequest) {\n client.elicitation.onRequest(\n id,\n async (elicitationRequest: ElicitationRequest) => {\n return await this.handleElicitationRequest(elicitationRequest);\n },\n );\n }\n\n await this.discoverServerResources(id);\n } catch (err) {\n this.statuses.set(id, \"error\");\n try {\n await client.disconnect();\n } catch {}\n this.mcpClients.delete(id);\n throw err;\n }\n })().finally(() => {\n this.pendingConnections.delete(serverId);\n });\n\n this.pendingConnections.set(serverId, connectPromise);\n await connectPromise;\n }\n\n async disconnectFromServer(serverId: string): Promise<void> {\n const id = this.resolveServerId(serverId);\n if (!id) return; // Server not found\n\n const client = this.mcpClients.get(id);\n if (client) {\n try {\n await client.disconnect();\n } catch {}\n }\n this.mcpClients.delete(id);\n this.statuses.set(id, \"disconnected\");\n this.serverIdMapping.delete(serverId); // Clean up the mapping\n\n // purge registries for this server\n for (const key of Array.from(this.toolRegistry.keys())) {\n const item = this.toolRegistry.get(key)!;\n if (item.serverId === id) this.toolRegistry.delete(key);\n }\n for (const key of Array.from(this.resourceRegistry.keys())) {\n const item = this.resourceRegistry.get(key)!;\n if (item.serverId === id) this.resourceRegistry.delete(key);\n }\n for (const key of Array.from(this.promptRegistry.keys())) {\n const item = this.promptRegistry.get(key)!;\n if (item.serverId === id) this.promptRegistry.delete(key);\n }\n }\n\n getConnectionStatus(serverId: string): ConnectionStatus {\n const id = this.resolveServerId(serverId);\n return id ? this.statuses.get(id) || \"disconnected\" : \"disconnected\";\n }\n\n getConnectedServers(): Record<\n string,\n { status: ConnectionStatus; config?: MastraMCPServerDefinition }\n > {\n const servers: Record<\n string,\n { status: ConnectionStatus; config?: MastraMCPServerDefinition }\n > = {};\n\n // Return data keyed by the original server names provided by callers\n for (const [originalName, uniqueId] of this.serverIdMapping.entries()) {\n servers[originalName] = {\n status: this.statuses.get(uniqueId) || \"disconnected\",\n config: this.configs.get(uniqueId),\n };\n }\n return servers;\n }\n\n async discoverAllResources(): Promise<void> {\n const serverIds = Array.from(this.mcpClients.keys());\n await Promise.all(serverIds.map((id) => this.discoverServerResources(id)));\n }\n\n private async discoverServerResources(serverId: string): Promise<void> {\n // serverId is already the unique ID when called from connectToServer\n const client = this.mcpClients.get(serverId);\n if (!client) return;\n\n // Tools - use toolsets instead of getTools for consistency\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n\n for (const [name, tool] of Object.entries<any>(flattenedTools)) {\n this.toolRegistry.set(`${serverId}:${name}`, {\n name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: (tool as any).outputSchema,\n serverId: serverId,\n });\n }\n\n // Resources\n try {\n const res = await client.resources.list();\n for (const [, list] of Object.entries<any>(res)) {\n for (const r of list as any[]) {\n this.resourceRegistry.set(`${serverId}:${r.uri}`, {\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n serverId: serverId,\n });\n }\n }\n } catch {}\n\n // Prompts\n try {\n const prompts = await client.prompts.list();\n for (const [, list] of Object.entries<any>(prompts)) {\n for (const p of list as any[]) {\n this.promptRegistry.set(`${serverId}:${p.name}`, {\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n serverId: serverId,\n });\n }\n }\n } catch {}\n }\n\n getAvailableTools(): DiscoveredTool[] {\n return Array.from(this.toolRegistry.values());\n }\n\n getAvailableResources(): DiscoveredResource[] {\n return Array.from(this.resourceRegistry.values());\n }\n\n getResourcesForServer(serverId: string): DiscoveredResource[] {\n const id = this.resolveServerId(serverId);\n if (!id) return [];\n return Array.from(this.resourceRegistry.values()).filter(\n (r) => r.serverId === id,\n );\n }\n\n getAvailablePrompts(): DiscoveredPrompt[] {\n return Array.from(this.promptRegistry.values());\n }\n\n getPromptsForServer(serverId: string): DiscoveredPrompt[] {\n const id = this.resolveServerId(serverId);\n if (!id) return [];\n return Array.from(this.promptRegistry.values()).filter(\n (p) => p.serverId === id,\n );\n }\n\n async executeToolDirect(\n toolName: string,\n parameters: Record<string, any> = {},\n ): Promise<ToolResult> {\n // toolName may include server prefix \"serverId:tool\"\n let serverId = \"\";\n let name = toolName;\n\n if (toolName.includes(\":\")) {\n const [sid, n] = toolName.split(\":\", 2);\n serverId = this.resolveServerId(sid) || \"\";\n name = n;\n } else {\n // Find which server has this tool by checking un-prefixed name\n for (const tool of this.toolRegistry.values()) {\n if (tool.name === toolName) {\n serverId = tool.serverId;\n name = toolName;\n break;\n }\n }\n }\n\n // If not found in registry, try to find it using toolsets from all connected servers\n if (!serverId) {\n for (const [clientServerId, client] of this.mcpClients.entries()) {\n try {\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n\n if (flattenedTools[toolName]) {\n serverId = clientServerId;\n name = toolName;\n break;\n }\n } catch {\n // Continue to next server if this one fails\n }\n }\n }\n\n if (!serverId) {\n throw new Error(`Tool not found in any connected server: ${toolName}`);\n }\n\n const client = this.mcpClients.get(serverId);\n if (!client)\n throw new Error(`No MCP client available for server: ${serverId}`);\n\n // Use toolsets to get the actual tool\n const toolsets = await client.getToolsets();\n const flattenedTools = this.flattenToolsets(toolsets);\n\n const tool = flattenedTools[name];\n if (!tool)\n throw new Error(`Tool '${name}' not found in server '${serverId}'`);\n\n // Inspect input schema to choose the most likely argument shape, but be robust and\n // fall back to the alternate shape on invalid-arguments errors.\n const schema: any = (tool as any).inputSchema;\n const hasContextProperty =\n schema &&\n typeof schema === \"object\" &&\n (schema as any).properties &&\n Object.prototype.hasOwnProperty.call(\n (schema as any).properties,\n \"context\",\n );\n const requiresContext =\n hasContextProperty ||\n (schema &&\n Array.isArray((schema as any).required) &&\n (schema as any).required.includes(\"context\"));\n\n const contextWrapped = { context: parameters || {} };\n const direct = parameters || {};\n const attempts = requiresContext\n ? [contextWrapped, direct]\n : [direct, contextWrapped];\n\n let lastError: any = undefined;\n for (const args of attempts) {\n try {\n console.log(\"args\", args);\n const result = await tool.execute(args);\n\n // Check if the result indicates an error\n if (result && result.isError) {\n const errorText =\n result.content && result.content[0] && result.content[0].text\n ? result.content[0].text\n : \"Unknown error\";\n throw new Error(errorText);\n }\n\n return { result };\n } catch (err: any) {\n lastError = err;\n }\n }\n throw lastError;\n }\n\n async getResource(\n resourceUri: string,\n serverId: string,\n ): Promise<ResourceContent> {\n // resourceUri may include server prefix\n let uri = resourceUri;\n const resolvedServerId = this.resolveServerId(serverId);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.resources.read(resolvedServerId, uri);\n return { contents: content?.contents || [] };\n }\n\n async getPrompt(\n promptName: string,\n serverId: string,\n args?: Record<string, any>,\n ): Promise<PromptResult> {\n const resolvedServerId = this.resolveServerId(serverId);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.prompts.get({\n serverName: resolvedServerId,\n name: promptName,\n args: args || {},\n });\n return { content };\n }\n\n /**\n * Handles elicitation requests from MCP servers during direct tool execution\n */\n private async handleElicitationRequest(\n elicitationRequest: ElicitationRequest,\n ): Promise<ElicitationResponse> {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Create a promise that will be resolved when the user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n this.pendingElicitations.set(requestId, { resolve, reject });\n\n // If there's an active elicitation callback, use it\n if (this.elicitationCallback) {\n this.elicitationCallback({\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n })\n .then(resolve)\n .catch(reject);\n } else {\n // If no callback is set, reject with details for the tools route to handle\n const error = new Error(\"ELICITATION_REQUIRED\");\n (error as any).elicitationRequest = {\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n };\n reject(error);\n }\n });\n }\n\n /**\n * Responds to a pending elicitation request\n */\n respondToElicitation(\n requestId: string,\n response: ElicitationResponse,\n ): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) {\n return false;\n }\n\n pending.resolve(response);\n this.pendingElicitations.delete(requestId);\n return true;\n }\n\n /**\n * Gets the pending elicitations map for external access\n */\n getPendingElicitations(): Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n /**\n * Sets a callback to handle elicitation requests\n */\n setElicitationCallback(\n callback: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>,\n ): void {\n this.elicitationCallback = callback;\n }\n\n /**\n * Clears the elicitation callback\n */\n clearElicitationCallback(): void {\n this.elicitationCallback = undefined;\n }\n}\n\n// Export the class directly instead of singleton\nexport { MCPJamClientManager };\nexport default MCPJamClientManager;\n"],"mappings":";AAAA,SAAS,aAAa;AACtB,OAAO,YAAY;AACnB,OAAO,aAAa;AACpB,SAAS,QAAAA,cAAY;AACrB,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,cAAc,kBAAkB;AACzC,SAAS,MAAM,SAAS,eAAe;AACvC,SAAS,qBAAqB;;;ACT9B,SAAS,QAAAC,cAAY;;;ACArB,SAAS,YAAY;AAGrB,IAAM,UAAU,IAAI,KAAK;AAEzB,QAAQ,KAAK,KAAK,OAAO,MAAM;AAC7B,MAAI;AACF,UAAM,EAAE,cAAc,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AAEpD,QAAI,CAAC,cAAc;AACjB,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAAmB,EAAE;AAE3B,QAAI;AACF,YAAM,iBAAiB,gBAAgB,UAAU,YAAY;AAC7D,YAAM,SAAS,iBAAiB,oBAAoB,QAAQ;AAC5D,UAAI,WAAW,aAAa;AAC1B,eAAO,EAAE,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,YACP;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO,gFAAgF,KAAK,UAAU,YAAY,CAAC;AAAA,UACnH,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACpD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;ACvEf,SAAS,QAAAC,aAAY;AAGrB,IAAM,UAAU,IAAIC,MAAK;AAGzB,QAAQ,IAAI,KAAK,OAAO,MAAM;AAC5B,MAAI;AACF,UAAMC,uBAAsB,EAAE;AAG9B,UAAM,mBAAmBA,qBAAoB,oBAAoB;AAEjE,UAAM,aAAa,OAAO,QAAQ,gBAAgB,EAAE;AAAA,MAClD,CAAC,CAAC,UAAU,UAAU,OAAO;AAAA,QAC3B,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,WAAW;AAAA,QACnB,QAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAEA,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,KAAK;AAC7C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,IAAI,qBAAqB,OAAO,MAAM;AAC5C,MAAI;AACF,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAMA,uBAAsB,EAAE;AAE9B,UAAM,SAASA,qBAAoB,oBAAoB,QAAQ;AAE/D,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,OAAO,cAAc,OAAO,MAAM;AACxC,MAAI;AACF,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAMA,uBAAsB,EAAE;AAE9B,UAAMA,qBAAoB,qBAAqB,QAAQ;AAEvD,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,SAAS,6BAA6B,QAAQ;AAAA,IAChD,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,KAAK,cAAc,OAAO,MAAM;AACtC,MAAI;AACF,UAAM,EAAE,UAAU,aAAa,IAAI,MAAM,EAAE,IAAI,KAAK;AAEpD,QAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAMA,uBAAsB,EAAE;AAG9B,UAAMA,qBAAoB,qBAAqB,QAAQ;AACvD,UAAMA,qBAAoB,gBAAgB,UAAU,YAAY;AAEhE,UAAM,SAASA,qBAAoB,oBAAoB,QAAQ;AAE/D,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,SAAS,0BAA0B,QAAQ;AAAA,IAC7C,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AACjD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;AChIf,SAAS,QAAAC,aAAY;AAErB,SAAS,uBAAuB;AAGhC,IAAM,QAAQ,IAAIC,MAAK;AAsBvB,IAAI,kBAAyC;AAE7C,SAAS,SAAS;AAChB,UAAO,oBAAI,KAAK,GAAE,YAAY;AAChC;AAEA,SAAS,oBAAoB,OAAkD;AAC7E,MAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,WAAO,QAAQ,QAAQ,MAAM,MAAM,MAAM,CAAE;AAAA,EAC7C;AACA,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,UAAM,QAAQ,KAAKA,QAAO;AAAA,EAC5B,CAAC;AACH;AAGA,MAAM,KAAK,SAAS,OAAO,MAAM;AAC/B,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AACtC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtD;AACA,UAAMC,OAAM,EAAE;AACd,UAAM,SAASA,KAAI,oBAAoB,QAAQ;AAC/C,QAAI,WAAW,aAAa;AAC1B,aAAO,EAAE,KAAK,EAAE,OAAO,WAAW,QAAQ,qBAAqB,GAAG,GAAG;AAAA,IACvE;AACA,UAAM,iBAAiB,MAAMA,KAAI,qBAAqB,QAAQ;AAE9D,UAAM,sBAA2C,CAAC;AAClD,eAAW,CAAC,MAAMC,KAAI,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,UAAI,cAAeA,MAAa;AAChC,UAAI;AACF,sBAAc,gBAAgB,WAA6B;AAAA,MAC7D,QAAQ;AAAA,MAAC;AACT,0BAAoB,IAAI,IAAI;AAAA,QAC1B;AAAA,QACA,aAAcA,MAAa;AAAA,QAC3B;AAAA,QACA,cAAeA,MAAa;AAAA,MAC9B;AAAA,IACF;AACA,WAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,EACnC;AACF,CAAC;AAGD,MAAM,KAAK,YAAY,OAAO,MAAM;AAClC,MAAI;AACF,UAAM,EAAE,UAAU,UAAU,WAAW,IAAI,MAAM,EAAE,IAAI,KAAK;AAC5D,QAAI,CAAC,SAAU,QAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,QAAI,CAAC,SAAU,QAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAEnE,QAAI,iBAAiB;AACnB,aAAO,EAAE,KAAK,EAAE,OAAO,2CAA2C,GAAG,GAAG;AAAA,IAC1E;AAEA,UAAMD,OAAM,EAAE;AACd,UAAM,SAASA,KAAI,oBAAoB,QAAQ;AAC/C,QAAI,WAAW,aAAa;AAC1B,aAAO,EAAE,KAAK,EAAE,OAAO,WAAW,QAAQ,qBAAqB,GAAG,GAAG;AAAA,IACvE;AAEA,UAAM,cAAc,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAEhF,UAAM,QAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,QAAQ,EAAE;AAAA,QAAK,MAClCA,KAAI,kBAAkB,UAAU,cAAc,CAAC,CAAC;AAAA,MAClD;AAAA,MACA,WAAW;AAAA,MACX,OAAO,CAAC;AAAA,MACR,SAAS,CAAC;AAAA,IACZ;AAEA,sBAAkB;AAElB,IAAAA,KAAI,uBAAuB,OAAO,EAAE,WAAW,SAAS,OAAO,MAAM;AACnE,UAAI,CAAC,iBAAiB;AAEpB,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AACA,YAAM,QAA0B;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,OAAO;AAAA,MACpB;AAEA,UAAI,gBAAgB,QAAQ,SAAS,GAAG;AACtC,cAAM,SAAS,gBAAgB,QAAQ,MAAM;AAC7C,eAAO,KAAK;AAAA,MACd,OAAO;AACL,wBAAgB,MAAM,KAAK,KAAK;AAAA,MAClC;AAGA,aAAO,IAAI,QAAQ,CAACD,UAAS,WAAW;AACtC,cAAM,UAAU;AAAA,UACd,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,UAC7C;AAAA,QACF;AACA,QAAAC,KAAI,uBAAuB,EAAE,IAAI,WAAW;AAAA,UAC1C,SAAS,CAAC,aAAkB;AAC1B,yBAAa,OAAO;AACpB,YAAAD,SAAQ,QAAQ;AAAA,UAClB;AAAA,UACA,QAAQ,CAAC,UAAe;AACtB,yBAAa,OAAO;AACpB,mBAAO,KAAK;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAGD,UAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,MAC9B,MAAM,YAAY,KAAK,CAAC,SAAS,EAAE,MAAM,QAAQ,IAAI,EAAW;AAAA,MAChE,oBAAoB,KAAK,EAAE;AAAA,QACzB,CAAC,QAAQ,EAAE,MAAM,UAAU,GAAG;AAAA,MAChC;AAAA,IACF,CAAC;AAED,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,YAAY;AAClB,YAAM,SAAS,KAAK;AAEpB,wBAAkB;AAClB,MAAAC,KAAI,yBAAyB;AAC7B,aAAO,EAAE;AAAA,QACP,EAAE,QAAQ,aAAa,UAAU,QAAQ,KAAK,IAAI,OAAO;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAGA,WAAO,EAAE;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA,WAAW,KAAK,GAAG;AAAA,QACnB;AAAA,QACA,SAAS,KAAK,GAAG;AAAA,QACjB,QAAQ,KAAK,GAAG;AAAA,QAChB,WAAW,KAAK,GAAG;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,EACnC;AACF,CAAC;AAGD,MAAM,KAAK,YAAY,OAAO,MAAM;AAClC,MAAI;AACF,UAAM,EAAE,WAAW,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AACjD,QAAI,CAAC,UAAW,QAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AACrE,QAAI,CAAC,gBAAiB,QAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAEzE,UAAMA,OAAM,EAAE;AACd,UAAM,KAAKA,KAAI,qBAAqB,WAAW,QAAQ;AACvD,QAAI,CAAC;AACH,aAAO,EAAE,KAAK,EAAE,OAAO,uCAAuC,GAAG,GAAG;AAGtE,UAAM,QAAQ;AACd,QAAI;AACF,YAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,QAC9B,MAAM,YAAY,KAAK,CAAC,SAAS,EAAE,MAAM,QAAQ,IAAI,EAAW;AAAA,QAChE,oBAAoB,KAAK,EAAE;AAAA,UACzB,CAAC,QAAQ,EAAE,MAAM,UAAU,GAAG;AAAA,QAChC;AAAA,MACF,CAAC;AAED,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,YAAY;AAClB,cAAM,SAAS,KAAK;AACpB,0BAAkB;AAClB,QAAAA,KAAI,yBAAyB;AAC7B,eAAO,EAAE;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,UAAU,MAAM;AAAA,YAChB,QAAQ,KAAK,IAAI;AAAA,UACnB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE;AAAA,QACP;AAAA,UACE,QAAQ;AAAA,UACR,aAAa,MAAM;AAAA,UACnB,WAAW,KAAK,GAAG;AAAA,UACnB,UAAU,MAAM;AAAA,UAChB,SAAS,KAAK,GAAG;AAAA,UACjB,QAAQ,KAAK,GAAG;AAAA,UAChB,WAAW,KAAK,GAAG;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AACV,YAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,aAAO,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,IACnC;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,EACnC;AACF,CAAC;AAGD,MAAM,KAAK,KAAK,YAAY;AAC1B,SAAO,IAAI;AAAA,IACT,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AAAA,IACD,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,EACjE;AACF,CAAC;AAED,IAAO,gBAAQ;;;AChQf,SAAS,QAAAE,aAAY;AAGrB,IAAM,YAAY,IAAIC,MAAK;AAG3B,UAAU,KAAK,SAAS,OAAO,MAAM;AACnC,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AAEtC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AACA,UAAM,mBAAmB,EAAE;AAC3B,UAAM,kBAAkB,iBAAiB,sBAAsB,QAAQ;AACvE,WAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,GAAG,gBAAgB,EAAE,CAAC;AAAA,EAC9D,SAAS,OAAO;AACd,YAAQ,MAAM,6BAA6B,KAAK;AAChD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,UAAU,KAAK,SAAS,OAAO,MAAM;AACnC,MAAI;AACF,UAAM,EAAE,UAAU,IAAI,IAAI,MAAM,EAAE,IAAI,KAAK;AAE3C,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,QAAI,CAAC,KAAK;AACR,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAAmB,EAAE;AAE3B,UAAM,UAAU,MAAM,iBAAiB,YAAY,KAAK,QAAQ;AAEhE,WAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,oBAAQ;;;AChEf,SAAS,QAAAC,aAAY;AAGrB,IAAM,UAAU,IAAIC,MAAK;AAGzB,QAAQ,KAAK,SAAS,OAAO,MAAM;AACjC,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AAEtC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,UAAMC,uBAAsB,EAAE;AAG9B,UAAM,gBAAgBA,qBAAoB,oBAAoB,QAAQ;AAEtE,WAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,GAAG,cAAc,EAAE,CAAC;AAAA,EAC1D,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,KAAK,QAAQ,OAAO,MAAM;AAChC,MAAI;AACF,UAAM,EAAE,UAAU,MAAM,KAAK,IAAI,MAAM,EAAE,IAAI,KAAK;AAElD,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,QAAI,CAAC,MAAM;AACT,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAMA,uBAAsB,EAAE;AAG9B,UAAM,UAAU,MAAMA,qBAAoB;AAAA,MACxC;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAEA,WAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,yBAAyB,KAAK;AAC5C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;ACzEf,SAAS,QAAAC,aAAY;AACrB,SAAS,kBAAkB;AAM3B,SAAS,eAAAC,oBAAmB;;;ACP5B,SAA0B,YAAY;AACtC,SAAS,eAAe;AA6IjB,SAAS,gCAAgC,UAA0B;AACxE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACxJA,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,gCAAgC;AACzC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAEtB,IAAM,iBAAiB,CAC5B,iBACA,QACA,kBACG;AACH,MAAI,CAAC,iBAAiB,MAAM,CAAC,iBAAiB,UAAU;AACtD,UAAM,IAAI;AAAA,MACR,6BAA6B,KAAK,UAAU,eAAe,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,UAAQ,gBAAgB,UAAU;AAAA,IAChC,KAAK;AACH,aAAO,gBAAgB,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACpD,KAAK;AACH,aAAO,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACtD,KAAK;AACH,aAAO,yBAAyB,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IAChE,KAAK,UAAU;AACb,YAAM,MAAM,iBAAiB;AAC7B,YAAM,aAAa,YAAY,KAAK,GAAG,IACnC,MACA,GAAG,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAC9B,aAAO,aAAa,EAAE,SAAS,WAAW,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACjE;AAAA,IACA;AACE,YAAM,IAAI;AAAA,QACR,yBAAyB,gBAAgB,QAAQ,eAAe,gBAAgB,EAAE;AAAA,MACpF;AAAA,EACJ;AACF;;;ACvCA,SAAS,SAAqB;AAC9B,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,YAA2D;AAiBpE,IAAM,sBAAsB,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAErD,IAAM,uCAAuC;AAAA,EAC3C;AAAA,EACA;AACF;AAEA,SAAS,6BAA6B,OAAgC;AACpE,SACE,iBAAiB,SACjB,qCAAqC;AAAA,IAAK,CAAC,YACzC,MAAM,QAAQ,SAAS,OAAO;AAAA,EAChC;AAEJ;AAEA,SAAS,YAAY,OAAqC;AACxD,SAAO;AAAA,IACL,SAAS,OAAO,UAAU,YAAY,eAAgB;AAAA,EACxD;AACF;AAEA,SAAS,0BAA0B,QAA6B;AAC9D,QAAM,aAAc,QAAgB,MAAM;AAC1C,SAAO,eAAe,YAAY,eAAe;AACnD;AAEA,SAAS,uBAAuB,QAA6B;AAC3D,QAAM,eACJ,EAMA;AAEF,MAAI,OAAO,iBAAiB,YAAY;AACtC,QAAI;AACF,mBAAa,MAAM;AACnB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,6BAA6B,KAAK,GAAG;AACvC,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI;AACF,IAAAA,iBAAgB,MAAM;AACtB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,6BAA6B,KAAK,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,kBAAkB,QAA6B;AACtD,MAAI,CAAC,YAAY,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,0BAA0B,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,uBAAuB,MAAM,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAyC;AACnE,MAAI,CAAC,YAAY,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,0BAA0B,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,uBAAuB,MAAM,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAAyB;AACpD,QAAM,iBAAiB,QAAQ,QAAQ,GAAG;AAE1C,MAAI,mBAAmB,MAAM,mBAAmB,QAAQ,SAAS,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,MAAM,iBAAiB,CAAC;AACzC;AAEO,SAAS,8BACd,UACA,YACA,SACY;AACZ,QAAM,cAAc,kBAAkB,WAAW,WAAW;AAC5D,QAAM,eAAe,mBAAmB,WAAW,YAAY;AAC/D,QAAM,cAAc,SAAS,gBAAgB;AAE7C,QAAM,mBAMF;AAAA,IACF,MAAM;AAAA,IACN,aAAa,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,cAAc;AAChB,qBAAiB,eAAe;AAAA,EAClC;AAEA,MAAI,OAAO,WAAW,YAAY,YAAY;AAC5C,qBAAiB,UAAU,OAAO,OAAOC,aAAY;AACnD,YAAM,gBAAuC,EAAE,SAAS,MAAM;AAE9D,UAAIA,UAAS;AACX,sBAAc,iBAAiBA;AAAA,MACjC;AAEA,YAAM,SAAS,MAAM,WAAW,UAAU,eAAeA,QAAO;AAEhE,UAAI,cAAc;AAChB,cAAM,SAAS,aAAa,UAAU,MAAM;AAE5C,YAAI,CAAC,OAAO,SAAS;AACnB,gBAAM,IAAI;AAAA,YACR,gBAAgB,WAAW,8BAA8B,OAAO,MAAM,OAAO;AAAA,UAC/E;AAAA,QACF;AAEA,eAAO,OAAO;AAAA,MAChB;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACF,WAAO,KAAK,gBAAgB;AAAA,EAC9B,SAAS,OAAO;AACd,QAAI,CAAC,6BAA6B,KAAK,GAAG;AACxC,YAAM;AAAA,IACR;AAEA,QAAI,iBAAiB,cAAc;AACjC,YAAM;AAAA,QACJ,cAAc;AAAA,QACd,GAAG;AAAA,MACL,IAAI;AAEJ,UAAI;AACF,eAAO,KAAK,yBAAyB;AAAA,MACvC,SAAS,0BAA0B;AACjC,YAAI,CAAC,6BAA6B,wBAAwB,GAAG;AAC3D,gBAAM;AAAA,QACR;AAEA,cAAMC,kBAAiB;AAAA,UACrB,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAEA,eAAO,KAAKA,eAAc;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,MACH,aAAa;AAAA,IACf;AAEA,WAAO,KAAK,cAAc;AAAA,EAC5B;AACF;AAEO,SAAS,gCACd,aAC4B;AAC5B,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,MAAM,UAAU,MAAM;AACtD,YAAM,eAAe,oBAAoB,IAAI;AAE7C,aAAO;AAAA,QACL;AAAA,QACA,8BAA8B,cAAc,YAAY;AAAA,UACtD,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC5NA,SAAS,gBAAgB,UAA8B;AACrD,QAAM,YAAsB,CAAC;AAC7B,aAAW,eAAe,OAAO,OAAO,YAAY,CAAC,CAAC,GAAG;AACvD,QAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,aAAO,OAAO,WAAW,WAAkB;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsBC,QAA2B;AACxD,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,UAAUC,KAAI,KAAK,OAAO,QAAaD,UAAS,CAAC,CAAC,GAAG;AAC/D,QAAI,CAACC,SAAQ,OAAOA,UAAS,YAAY,EAAE,aAAaA,OAAO;AAC/D,UAAM,MAAM,SAAS,QAAQ,GAAG;AAChC,UAAM,OACJ,MAAM,MAAM,MAAM,SAAS,SAAS,IAChC,SAAS,MAAM,MAAM,CAAC,IACtB;AACN,QAAI,EAAE,YAAY,OAAQ,OAAM,QAAQ,IAAIA;AAC5C,QAAI,EAAE,QAAQ,OAAQ,OAAM,IAAI,IAAIA;AAAA,EACtC;AACA,SAAO;AACT;AAEO,IAAM,yBAAyB,CAAC,aAAsC;AAC3E,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,IAAK;AACV,QAAI,IAAI,SAAS,eAAe,MAAM,QAAS,IAAY,OAAO,GAAG;AACnE,iBAAW,KAAM,IAAY,SAAS;AACpC,YAAI,GAAG,SAAS,YAAa,aAAY,IAAI,EAAE,UAAU;AAAA,MAC3D;AAAA,IACF,WAAW,IAAI,SAAS,UAAU,MAAM,QAAS,IAAY,OAAO,GAAG;AACrE,iBAAW,KAAM,IAAY,SAAS;AACpC,YAAI,GAAG,SAAS,cAAe,eAAc,IAAI,EAAE,UAAU;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACA,aAAW,MAAM,YAAa,KAAI,CAAC,cAAc,IAAI,EAAE,EAAG,QAAO;AACjE,SAAO;AACT;AAEA,eAAsB,6BACpB,UACA,SACe;AAEf,MAAID,SAAkB,CAAC;AACvB,MAAK,QAAgB,QAAQ;AAC3B,UAAM,WAAW,MAAO,QAAgB,OAAO,YAAY;AAC3D,IAAAA,SAAQ,gBAAgB,QAAe;AAAA,EACzC,WAAY,QAAgB,UAAU;AACpC,IAAAA,SAAQ,gBAAiB,QAAgB,QAAe;AAAA,EAC1D,OAAO;AACL,IAAAA,SAAS,QAAgB;AAAA,EAC3B;AACA,QAAM,QAAQ,sBAAsBA,MAAK;AAGzC,QAAM,wBAAwB,oBAAI,IAAY;AAC9C,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,OAAO,IAAI,SAAS,UAAU,CAAC,MAAM,QAAS,IAAY,OAAO;AACpE;AACF,eAAW,KAAM,IAAY,SAAS;AACpC,UAAI,GAAG,SAAS,cAAe,uBAAsB,IAAI,EAAE,UAAU;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,mBAAmC,CAAC;AAC1C,aAAW,OAAO,UAAU;AAC1B,QACE,CAAC,OACD,IAAI,SAAS,eACb,CAAC,MAAM,QAAS,IAAY,OAAO;AAEnC;AACF,eAAW,WAAY,IAAY,SAAS;AAC1C,UACE,SAAS,SAAS,eAClB,CAAC,sBAAsB,IAAI,QAAQ,UAAU,GAC7C;AACA,YAAI;AACF,gBAAM,WAAmB,QAAQ;AACjC,gBAAMC,QAAO,MAAM,QAAQ;AAC3B,cAAI,CAACA,MAAM,OAAM,IAAI,MAAM,SAAS,QAAQ,aAAa;AACzD,gBAAM,QAAQ,QAAQ,SAAS,CAAC;AAChC,gBAAM,SAAS,MAAMA,MAAK,QAAQ,EAAE,SAAS,MAAM,CAAC;AAEpD,cAAI;AACJ,cAAI,UAAU,OAAO,WAAW,YAAa,OAAe,SAAS;AACnE,kBAAM,KAAW,OAAe;AAChC,gBACE,MACA,OAAO,OAAO,YACd,UAAU,MACV,OAAO,GAAG,SAAS,UACnB;AACA,uBAAS,EAAE,MAAM,QAAQ,OAAO,GAAG,KAAK;AAAA,YAC1C,WACE,MACA,OAAO,OAAO,YACd,UAAU,MACV,WAAW,IACX;AACA,uBAAS;AAAA,gBACP,MAAO,GAAG,QAAgB;AAAA,gBAC1B,OAAO,GAAG;AAAA,cACZ;AAAA,YACF,OAAO;AACL,uBAAS,EAAE,MAAM,QAAQ,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,YACrD;AAAA,UACF,OAAO;AACL,qBAAS,EAAE,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE;AAAA,UACjD;AAEA,gBAAM,oBAAkC;AAAA,YACtC,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY,QAAQ;AAAA,gBACpB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,2BAAiB,KAAK,iBAAiB;AAAA,QACzC,SAAS,OAAY;AACnB,gBAAM,cAA+C;AAAA,YACnD,MAAM;AAAA,YACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D;AACA,gBAAM,yBAAuC;AAAA,YAC3C,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY,QAAQ;AAAA,gBACpB,UAAU,QAAQ;AAAA,gBAClB,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AACA,2BAAiB,KAAK,sBAAsB;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,KAAK,GAAG,gBAAgB;AACnC;;;AJhJA,SAAS,mBAAAC,wBAAuB;AAmChC,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AACxB,IAAM,8BACJ;AAEF,IAAI;AACF,EAAC,QAAgB,kBAAkB,EAAE;AACvC,QAAQ;AAAC;AAET,IAAM,OAAO,IAAIC,MAAK;AAGtB,IAAM,eAAe,CACnB,YACA,SACA,UACG;AACH,QAAM,UAAU,UAAU,WAAW,WAAW,KAAK,UAAU,KAAK;AACpE,aAAW,QAAQ,QAAQ,OAAO,SAAS,OAAO;AAAA;AAAA,CAAM,CAAC;AAC3D;AAEA,IAAM,uBAAuB,CAAC,qBAAuC;AACnE,eAAa,iBAAiB,YAAY,iBAAiB,SAAS;AAAA,IAClE,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AACH;AAEA,IAAM,qBAAqB,OACzB,SACA,YACA,MACA,qBACwB;AACxB,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,cAAc;AAAA,MAC9C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,aAAa,EAAE,eAAe,WAAW,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,2BAAqB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAO;AAAA,IACT,QAAQ;AACN,2BAAqB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,yBAAqB,gBAAgB;AACrC,WAAO;AAAA,EACT;AACF;AAEA,IAAM,wBAAwB,CAC5B,kBACA,MACA,WACA,aACA,iBAA0B,SACvB;AACH,MAAI;AACF,QAAI,gBAAgB;AAElB,UAAI,aAAa,MAAM,QAAQ,SAAS,GAAG;AACzC,mBAAW,QAAQ,WAAW;AAC5B,gBAAM,oBAAoB,EAAE,iBAAiB;AAC7C,2BAAiB,wBAAwB;AAEzC,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,IAAI;AAAA,kBACJ,MAAM,KAAK,QAAQ,KAAK;AAAA,kBACxB,YAAY,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,kBACzC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,kBAClC,QAAQ;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,eAAe,MAAM,QAAQ,WAAW,GAAG;AAC7C,mBAAW,UAAU,aAAa;AAChC,gBAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,EAAE,iBAAiB;AAEzB,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV,IAAI;AAAA,kBACJ,YAAY;AAAA,kBACZ,QAAQ,OAAO;AAAA,kBACf,OAAQ,OAAe;AAAA,kBACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,gBACpC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,qBAAiB,aAAa,iBAAiB,aAAa,KAAK;AACjE,QAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,mBAAa,iBAAiB,YAAY,iBAAiB,SAAS;AAAA,QAClE,MAAM;AAAA,QACN,MAAM,iBAAiB;AAAA,QACvB;AAAA,QACA,YAAY,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UAC5C,MAAM,EAAE,QAAQ,EAAE;AAAA,UAClB,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;AAAA,QACjC,EAAE;AAAA,QACF,cAAc,eAAe,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UAChD,QAAQ,EAAE;AAAA,UACV,OAAQ,EAAU;AAAA,QACpB,EAAE;AAAA,QACF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AAAA,EAAC;AACX;AAEA,IAAM,0BAA0B,OAC9B,OACA,YACA,UACA,kBACA,UACA,aACA,iBACG;AACH,QAAM,kBAAkC,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM;AACjE,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,EAAE,MAAM,UAAU,SAAS,EAAE,QAAQ;AAAA,MAC9C,KAAK;AACH,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,MAC5C,KAAK;AACH,eAAO,EAAE,MAAM,aAAa,SAAS,EAAE,QAAQ;AAAA,MACjD;AACE,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,MAAI,QAAQ;AACZ,SAAO,QAAQ,iBAAiB;AAC9B,QAAI,kBAAkB;AACtB,UAAM,qBAA4B,CAAC;AACnC,UAAM,uBAA8B,CAAC;AAErC,UAAM,eAAe,MAAM,WAAW;AAAA,MACpC;AAAA,MACA,QACE,gBAAgB;AAAA,MAClB,aAAa,eAAe,gCAAgC,QAAQ;AAAA,MACpE,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS,OAAO,UAAU;AACxB,gBAAQ,MAAM,MAAM,MAAM;AAAA,UACxB,KAAK;AAAA,UACL,KAAK,mBAAmB;AACtB,kBAAM,OAAO,MAAM,MAAM;AACzB,gBAAI,MAAM;AACR,iCAAmB;AACnB;AAAA,gBACE,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,gBACX;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF;AAAA,UACA,KAAK,oBAAoB;AAEvB;AAAA,UACF;AAAA,UACA,KAAK,aAAa;AAChB,kBAAM,oBAAoB,EAAE,iBAAiB;AAC7C,6BAAiB,wBAAwB;AACzC,kBAAM,OACH,MAAM,MAAc,YAAa,MAAM,MAAc;AACxD,kBAAM,aACH,MAAM,MAAc,SACpB,MAAM,MAAc,cACpB,MAAM,MAAc,QACrB,CAAC;AACH,+BAAmB,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACpD;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,IAAI;AAAA,kBACJ;AAAA,kBACA;AAAA,kBACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,kBAClC,QAAQ;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF;AAAA,UACA,KAAK,eAAe;AAClB,kBAAM,SACH,MAAM,MAAc,UACpB,MAAM,MAAc,UACpB,MAAM,MAAc;AACvB,kBAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,iBAAiB;AACvB,iCAAqB,KAAK,EAAE,OAAO,CAAC;AACpC;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV,IAAI;AAAA,kBACJ,YAAY;AAAA,kBACZ;AAAA,kBACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,gBACpC;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF;AAAA,UACA;AACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,aAAa,cAAc;AAEjC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,aAAa;AAChC,UAAM,mBAAoB,MAAM,YAAY,CAAC;AAC7C,QAAI,iBAAiB,QAAQ;AAC3B,qBAAe,KAAK,GAAG,gBAAgB;AAIvC,iBAAW,KAAK,kBAAkB;AAChC,YAAK,EAAU,SAAS,QAAQ;AAC9B,gBAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,EAAE,iBAAiB;AACzB,gBAAM,QAAS,EAAU;AACzB,+BAAqB,KAAK,EAAE,QAAQ,MAAM,CAAC;AAC3C,uBAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,YACnE,MAAM;AAAA,YACN,YAAY;AAAA,cACV,IAAI;AAAA,cACJ,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YACpC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA;AACA,UAAM,eAAe,MAAM,aAAa;AACxC,UAAM,iBACJ,iBAAiB,gBAChB,gBAAgB,WAAW,KAAK,qBAAqB,SAAS;AAEjE,QAAI,CAAC,eAAgB;AAAA,EACvB;AAEA,eAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,IACnE,MAAM;AAAA,EACR,CAAC;AAED;AAAA,IACE,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB,OAC5B,UACA,kBACA,kBACA,SACA,YACA,oBACkB;AAElB,QAAM,kBAAkC,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM;AACjE,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,EAAE,MAAM,UAAU,SAAS,EAAE,QAAQ;AAAA,MAC9C,KAAK;AACH,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,MAC5C,KAAK;AACH,eAAO,EAAE,MAAM,aAAa,SAAS,EAAE,QAAQ;AAAA,MACjD;AACE,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,QAAM,YACJ,MAAM,iBAAiB;AAAA,IACrB;AAAA,EACF;AAEF,QAAM,WAAW,OAAO,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,MAAMC,KAAI,OAAO;AAAA,IAChE;AAAA,IACA,aAAaA,OAAM;AAAA,IACnB,aAAaF,iBAAgBE,OAAM,WAAW;AAAA,EAChD,EAAE;AAEF,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACA,MAAI,QAAQ;AACZ,SAAO,QAAQ,iBAAiB;AAC9B,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,UAAU,KAAK,UAAU,cAAc;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,KAAM;AACX,QAAI,MAAM,MAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAE5C,iBAAW,OAAO,KAAK,UAA4B;AACjD,uBAAe,KAAK,GAAG;AACvB,YACG,IAAY,SAAS,eACtB,MAAM,QAAS,IAAY,OAAO,GAClC;AACA,qBAAW,KAAM,IAAY,SAAS;AACpC,gBAAI,GAAG,SAAS,UAAU,OAAO,EAAE,SAAS,UAAU;AACpD;AAAA,gBACE,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS,EAAE;AAAA,gBACb;AAAA,cACF;AAAA,YACF,WAAW,GAAG,SAAS,aAAa;AAClC,oBAAM,oBAAoB,EAAE,iBAAiB;AAC7C,+BAAiB,wBAAwB;AACzC;AAAA,gBACE,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,kBACE,MAAM;AAAA,kBACN,UAAU;AAAA,oBACR,IAAI;AAAA,oBACJ,MAAM,EAAE,YAAY,EAAE;AAAA,oBACtB,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC;AAAA,oBAClD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,oBAClC,QAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,2BAAqB,gBAAgB;AACrC;AAAA,IACF;AAGA,UAAM,YAAY,eAAe;AACjC,QAAI,uBAAuB,cAAqB,GAAG;AACjD,YAAM,6BAA6B,gBAAkC;AAAA,QACnE,OAAO;AAAA,MACT,CAAC;AACD,YAAM,UAAU,eAAe,MAAM,SAAS;AAC9C,iBAAW,KAAK,SAAS;AACvB,YAAK,EAAU,SAAS,UAAU,MAAM,QAAS,EAAU,OAAO,GAAG;AACnE,qBAAW,MAAO,EAAU,SAAS;AACnC,gBAAI,GAAG,SAAS,eAAe;AAC7B,oBAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,EAAE,iBAAiB;AACzB,oBAAM,MAAM,GAAG;AACf,oBAAM,QACJ,OAAO,OAAO,QAAQ,YAAY,WAAW,MACzC,IAAI,QACJ;AACN;AAAA,gBACE,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,kBACE,MAAM;AAAA,kBACN,YAAY;AAAA,oBACV,IAAI;AAAA,oBACJ,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,kBACpC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAEA;AAAA,EACF;AAEA,eAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,IACnE,MAAM;AAAA,EACR,CAAC;AACD;AAAA,IACE,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB;AAAA,EACF;AACF;AAGA,KAAK,KAAK,KAAK,OAAO,MAAM;AAC1B,QAAM,mBAAmB,EAAE;AAC3B,MAAI;AACF,UAAM,cAA2B,MAAM,EAAE,IAAI,KAAK;AAClD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,QAAI,WAAW,wBAAwB;AACrC,UAAI,CAAC,WAAW;AACd,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,iBAAiB;AAAA,QAC/B;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,IACjC;AAGA,QAAI,CAAC,UAAU;AACb,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,gBACJ,aAAa,UAAU,QAAQ,YAAY,qBAAqB;AAElE,QAAI,CAAC,kBAAkB,CAAC,OAAO,MAAM,CAAC,SAAS;AAC7C,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,CAAC,QAAQ,IAAI,iBAAiB;AACjD,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,IAAIC,aAAY;AAChC,UAAM,aAAa,EAAE,IAAI,OAAO,eAAe,KAAK;AACpD,UAAM,iBAAiB,IAAI,eAAe;AAAA,MACxC,MAAM,MAAM,YAAY;AACtB,cAAM,mBAAqC;AAAA,UACzC;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ,uBAAuB;AAAA,UACvB,WAAW;AAAA,QACb;AAGA,yBAAiB,uBAAuB,OAAO,YAAY;AAEzD,gBAAM,qBAAqB;AAAA,YACzB,SAAS,QAAQ;AAAA,YACjB,iBAAiB,QAAQ;AAAA,UAC3B;AAGA,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,QAAQ;AAAA,gBACnB,SAAS,mBAAmB;AAAA,gBAC5B,QAAQ,mBAAmB;AAAA,gBAC3B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,cACpC;AAAA,YACF;AAAA,UACF;AAGA,iBAAO,IAAI,QAA6B,CAACC,UAAS,WAAW;AAE3D,kBAAM,UAAU,WAAW,MAAM;AAC/B,qBAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,YACzC,GAAG,mBAAmB;AAGtB,6BAAiB,uBAAuB,EAAE,IAAI,QAAQ,WAAW;AAAA,cAC/D,SAAS,CAACC,cAAkC;AAC1C,6BAAa,OAAO;AACpB,gBAAAD,SAAQC,SAAQ;AAAA,cAClB;AAAA,cACA,QAAQ,CAAC,UAAe;AACtB,6BAAa,OAAO;AACpB,uBAAO,KAAK;AAAA,cACd;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH,CAAC;AAED,YAAI;AACF,cAAI,eAAe;AACjB,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA,QAAQ,IAAI;AAAA,cACZ;AAAA,cACA,YAAY;AAAA,YACd;AAAA,UACF,OAAO;AAEL,kBAAM,YACJ,MAAM,iBAAiB;AAAA,cACrB,YAAY;AAAA,YACd;AAEF,kBAAM,aACJ,gCAAgC,SAAgB;AAElD,kBAAM,WAAW;AAAA,cACf;AAAA,cACA,UAAU;AAAA,cACV;AAAA,YACF;AACA,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,uBAAa,YAAY,SAAS;AAAA,YAChC,MAAM;AAAA,YACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAClD,CAAC;AAAA,QACH,UAAE;AAEA,2BAAiB,yBAAyB;AAC1C,qBAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS,gBAAgB;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,iCAAiC,KAAK;AAEpD,QAAI;AACF,uBAAiB,yBAAyB;AAAA,IAC5C,SAAS,cAAc;AACrB,cAAQ,MAAM,oCAAoC,YAAY;AAAA,IAChE;AAEA,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,eAAQ;;;AKttBf,SAAS,QAAAC,aAAY;;;ACArB,SAAoC,iBAAiB;AAqB9C,SAAS,qBAAqB,cAAqC;AACxE,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAS,EAAE,GAAG,aAAa;AAGjC,MAAI,OAAO,KAAK;AACd,QAAI;AAEF,UAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,eAAO,MAAM,IAAI,IAAI,OAAO,GAAG;AAAA,MACjC,WAAW,OAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,IAAI,MAAM;AAC7D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,OAAO,cAAc;AAC9B,cAAM,cAAc;AAAA,UAClB,eAAe,UAAU,OAAO,MAAM,YAAY;AAAA,UAClD,GAAI,OAAO,aAAa,WAAW,CAAC;AAAA,QACtC;AAEA,eAAO,cAAc;AAAA,UACnB,GAAG,OAAO;AAAA,UACV,SAAS;AAAA,QACX;AAGA,eAAO,kBAAkB;AAAA,UACvB,MAAM,OAA+B,MAAoB;AACvD,kBAAM,UAAU,IAAI,QAAQ,MAAM,WAAW,CAAC,CAAC;AAG/C,oBAAQ;AAAA,cACN;AAAA,cACA,UAAU,OAAO,MAAO,YAAY;AAAA,YACtC;AAGA,gBAAI,OAAO,aAAa,SAAS;AAC/B,oBAAM,iBAAiB,IAAI,QAAQ,OAAO,YAAY,OAAO;AAC7D,6BAAe,QAAQ,CAAC,OAAO,QAAQ;AACrC,oBAAI,IAAI,YAAY,MAAM,iBAAiB;AACzC,0BAAQ,IAAI,KAAK,KAAK;AAAA,gBACxB;AAAA,cACF,CAAC;AAAA,YACH;AAEA,mBAAO,MAAM,OAAO;AAAA,cAClB,GAAG;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,WAAW,OAAO,aAAa,SAAS;AAEtC,eAAO,kBAAkB;AAAA,UACvB,MAAM,OAA+B,MAAoB;AACvD,kBAAM,UAAU,IAAI,QAAQ,MAAM,WAAW,CAAC,CAAC;AAG/C,kBAAM,iBAAiB,IAAI,QAAQ,OAAO,YAAY,OAAO;AAC7D,2BAAe,QAAQ,CAAC,OAAO,QAAQ;AACrC,sBAAQ,IAAI,KAAK,KAAK;AAAA,YACxB,CAAC;AAED,mBAAO,MAAM,OAAO;AAAA,cAClB,GAAG;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,SAAS,uBAAuB,KAAK;AAAA,UACrC,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAuBA,SAAS,uBAAuB,YAA4B;AAE1D,QAAM,iBAAiB,0BAA0B,UAAU;AAC3D,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,GAAG,cAAc,IAAI,SAAS,IAAI,MAAM;AACjD;AAEO,IAAM,gCAAgC,CAC3C,kBAC6B;AAC7B,MAAI,CAAC,iBAAiB,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AAC7D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAA0D,CAAC;AACjE,QAAM,oBAA4C,CAAC;AACnD,QAAM,SAAiC,CAAC;AACxC,MAAI,YAAY;AAGhB,aAAW,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,aAAa,GAAG;AACtE,UAAM,mBAAmB,qBAAqB,YAAY;AAE1D,QAAI,iBAAiB,WAAW,iBAAiB,QAAQ;AAEvD,YAAM,WAAW,uBAAuB,UAAU;AAClD,mBAAa,QAAQ,IAAI,iBAAiB;AAC1C,wBAAkB,QAAQ,IAAI;AAAA,IAChC,OAAO;AACL,kBAAY;AACZ,UAAI,eAAe;AACnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,iBAAiB,MAAM;AAAA,MACxC;AAEA,aAAO,UAAU,IAAI;AAAA,IACvB;AAAA,EACF;AAGA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,uCACd,eACW;AAEX,QAAM,oBAAoB,IAAI,UAAU;AAAA,IACtC,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,mBAAmB,kBAAkB,SAAS,KAAK,iBAAiB;AAC1E,oBAAkB,WAAW,YAAY;AACvC,UAAMC,SAAQ,MAAM,iBAAiB;AACrC,UAAM,aAAkC,CAAC;AAEzC,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQA,MAAK,GAAG;AAE1D,YAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAM,CAAC,GAAG;AAE9C,cAAM,YAAY,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACzC,mBAAW,SAAS,IAAI;AAAA,MAC1B,OAAO;AACL,mBAAW,QAAQ,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,0BAA0B,YAA4B;AAEpE,SAAO,WACJ,YAAY,EACZ,QAAQ,YAAY,GAAG,EACvB,QAAQ,eAAe,EAAE;AAC9B;;;AD9PA,IAAM,QAAQ,IAAIC,MAAK;AAGvB,SAAS,kBAAkB,UAAkB,WAA6B;AACxE,aAAW,MAAM,WAAW;AAC1B,UAAM,SAAS,GAAG,EAAE;AACpB,QAAI,SAAS,WAAW,MAAM,GAAG;AAC/B,aAAO,SAAS,MAAM,OAAO,MAAM;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkBC,OAAgB;AACzC,MAAI,CAACA,OAAM,YAAa,QAAO,CAAC;AAGhC,QAAM,aAAaA,MAAK,YAAY,SAAS;AAC7C,MAAI,cAAc,OAAO,eAAe,UAAU;AAChD,WAAO;AAAA,EACT;AAGA,QAAM,SAASA,MAAK,YAAY;AAChC,MAAI,QAAQ,aAAa,aAAa;AACpC,UAAM,aAAa;AAAA,MACjB,MAAM;AAAA,MACN,sBAAsB;AAAA,MACtB,YAAY,CAAC;AAAA,MACb,UAAU,CAAC;AAAA,IACb;AAEA,QAAI;AACF,UAAI,OAAO,SAAS,OAAO,OAAO,UAAU,YAAY;AACtD,cAAM,QAAQ,OAAO,MAAM;AAC3B,cAAM,aAAkB,CAAC;AACzB,cAAM,WAAqB,CAAC;AAE5B,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,qBAAW,GAAG,IAAI,EAAE,MAAM,SAAS;AACnC,cAAK,OAAe,MAAM,aAAa,eAAe;AACpD,qBAAS,KAAK,GAAG;AAAA,UACnB;AAAA,QACF;AAEA,eAAO,EAAE,GAAG,YAAY,YAAY,SAAS;AAAA,MAC/C;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,kBAAkB,aAA8B;AACvD,SAAO;AACP,MAAI,YAAa,QAAO,YAAY,QAAQ,OAAO,EAAE;AAErD,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,SAAU,QAAO,SAAS,QAAQ,OAAO,EAAE;AAE/C,QAAM,YAAY,QAAQ,IAAI,mBAAmB,QAAQ,IAAI;AAC7D,MAAI,WAAW;AACb,QAAI;AACF,YAAM,IAAI,IAAI,IAAI,SAAS;AAC3B,YAAM,OAAO,EAAE,KAAK,QAAQ,iBAAiB,cAAc;AAC3D,aAAO,GAAG,EAAE,QAAQ,KAAK,IAAI;AAAA,IAC/B,QAAQ;AAAA,IAAC;AAAA,EACX;AAEA,SAAO;AACT;AAEA,IAAO,gBAAQ;AAGf,MAAM,KAAK,YAAY,OAAO,MAAM;AAClC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI;AACF,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,UAAM,aAAc,MAAM,SAAS,CAAC;AAQpC,UAAM,yBAAyB,MAAM;AACrC,UAAM,aAAc,MAAM,cAAc,CAAC;AAIzC,UAAM,iBAAyB,KAAK;AAAA,MAClC;AAAA,MACA,KAAK,IAAI,GAAG,MAAM,eAAe,CAAC;AAAA,IACpC;AAEA,QAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,oBAAoB,GAAG,GAAG;AAAA,IACnE;AACA,UAAM,iBAAiB,IAAI,eAAe;AAAA,MACxC,MAAM,MAAM,YAAY;AACtB,YAAI,SAAS;AACb,YAAI,QAAQ;AACZ,YAAI,SAAS;AAEb,cAAM,UAAU,YAAY;AAC1B,cAAI,SAAS,WAAW,QAAQ;AAC9B,gBAAI,WAAW,GAAG;AAEhB,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,gBAAgB,QAAQ,CAAC,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA,gBACpE;AAAA,cACF;AACA,yBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,yBAAW,MAAM;AAAA,YACnB;AACA;AAAA,UACF;AACA,gBAAM,OAAO,WAAW,OAAO;AAC/B;AACA,WAAC,YAAY;AACX,kBAAM,cAAc,oBAAI,IAAY;AACpC,kBAAM,cAAc,IAAI,IAAY,KAAK,iBAAiB,CAAC,CAAC;AAC5D,gBAAI,OAAO;AACX,gBAAI,SAA2B;AAC/B,gBAAI;AAEF,kBAAI,gBAA2D,CAAC;AAChE,kBAAI,KAAK,mBAAmB,KAAK,gBAAgB,SAAS,GAAG;AAC3D,2BAAW,QAAQ,KAAK,iBAAiB;AACvC,sBAAI,WAAW,IAAI,EAAG,eAAc,IAAI,IAAI,WAAW,IAAI;AAAA,gBAC7D;AAAA,cACF,OAAO;AACL,2BAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACpD,gCAAc,IAAI,IAAI;AAAA,gBACxB;AAAA,cACF;AAGA,oBAAM,aAAa,8BAA8B,aAAa;AAC9D,kBAAI,eAA0D,CAAC;AAC/D,kBAAI,WAAW,WAAW,WAAW,cAAc;AACjD,+BAAe,WAAW;AAAA,cAC5B,WACE,WAAW,gBACX,OAAO,KAAK,WAAW,YAAY,EAAE,SAAS,GAC9C;AACA,+BAAe,WAAW;AAAA,cAC5B,OAAO;AACL,sBAAM,IAAI,MAAM,sCAAsC;AAAA,cACxD;AAEA,uBAAS,uCAAuC,YAAY;AAC5D,oBAAMC,SAAQ,MAAM,OAAO,SAAS;AACpC,oBAAM,eAAe,OAAO,QAAQA,MAAK,EAAE;AAAA,gBACzC,CAAC,CAAC,MAAMD,KAAI,OAAO;AAAA,kBACjB,UAAU;AAAA,kBACV,aAAa,kBAAkBA,KAAI;AAAA,gBACrC;AAAA,cACF;AAEA,oBAAM,QAAQ,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;AACtC,oBAAM,aAAa,kBAAkB,sBAAsB;AAG3D,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,SAAS,QAAQ,KAAK,IAAI,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA,gBACzE;AAAA,cACF;AAGA,oBAAM,WAAW,MAAM,MAAM,GAAG,UAAU,sBAAsB;AAAA,gBAC9D,QAAQ;AAAA,gBACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,gBAC9C,MAAM,KAAK,UAAU;AAAA,kBACnB;AAAA,kBACA,OAAO,KAAK;AAAA,kBACZ;AAAA,kBACA,UAAU;AAAA,oBACR;AAAA,sBACE,MAAM;AAAA,sBACN,SACE;AAAA,oBACJ;AAAA,oBACA,EAAE,MAAM,QAAQ,SAAS,KAAK,UAAU,GAAG;AAAA,kBAC7C;AAAA,gBACF,CAAC;AAAA,cACH,CAAC;AACD,kBAAI,CAAC,SAAS,IAAI;AAChB,sBAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACpD,2BAAW;AAAA,kBACT,QAAQ;AAAA,oBACN,SAAS,KAAK,UAAU,EAAE,MAAM,UAAU,QAAQ,KAAK,IAAI,QAAQ,OAAO,OAAO,yBAAyB,SAAS,MAAM,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA;AAAA;AAAA,kBAC3I;AAAA,gBACF;AACA,sBAAM,IAAI;AAAA,kBACR,yBAAyB,SAAS,MAAM,IAAI,OAAO;AAAA,gBACrD;AAAA,cACF;AACA,oBAAM,YAAiB,MAAM,SAAS,KAAK;AAC3C,kBAAI,CAAC,UAAU;AACb,sBAAM,IAAI,MAAO,UAAkB,SAAS,cAAc;AAE5D,kBAAI,QAAa;AACjB,oBAAM,YAAY,OAAO,KAAK,YAAY;AAG1C,qBAAO,MAAM,SAAS,aAAa;AACjC,sBAAM,OAAO,MAAM;AACnB,sBAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,sBAAMA,QAAQC,OAAc,IAAI;AAEhC,oBAAI;AACF,wBAAM,SAAS,MAAMD,OAAM,QAAQ,EAAE,SAAS,KAAK,CAAC;AACpD,8BAAY,IAAI,IAAI;AAEpB,6BAAW;AAAA,oBACT,QAAQ;AAAA,sBACN,SAAS,KAAK,UAAU;AAAA,wBACtB,MAAM;AAAA,wBACN,QAAQ,KAAK;AAAA,wBACb,MAAM,EAAE;AAAA,wBACR,MAAM;AAAA,wBACN,WAAW,CAAC,kBAAkB,MAAM,SAAS,CAAC;AAAA,wBAC9C,aAAa,CAAC,MAAM;AAAA,sBACtB,CAAC,CAAC;AAAA;AAAA;AAAA,oBACJ;AAAA,kBACF;AAEA,wBAAM,UAAU,MAAM;AAAA,oBACpB,GAAG,UAAU;AAAA,oBACb;AAAA,sBACE,QAAQ;AAAA,sBACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,sBAC9C,MAAM,KAAK,UAAU;AAAA,wBACnB;AAAA,wBACA,OAAO,KAAK;AAAA,wBACZ;AAAA,wBACA,UAAU,MAAM,QAAQ,MAAM,MAAM,SAAS,CAAC,GAC1C,YAAY;AAAA,0BACd;AAAA,4BACE,MAAM;AAAA,4BACN,SACE;AAAA,0BACJ;AAAA,0BACA,EAAE,MAAM,QAAQ,SAAS,KAAK,UAAU,GAAG;AAAA,wBAC7C;AAAA,wBACA,mBAAmB;AAAA,0BACjB,MAAM;AAAA,0BACN,SAAS;AAAA,4BACP;AAAA,8BACE,MAAM;AAAA,8BACN,YAAY,MAAM;AAAA,8BAClB,UAAU;AAAA,8BACV,QAAQ;AAAA,4BACV;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF,CAAC;AAAA,oBACH;AAAA,kBACF;AAEA,wBAAM,WAAgB,MAAM,QAAQ,KAAK;AACzC,sBAAI,CAAC,SAAS,IAAI;AAChB,+BAAW;AAAA,sBACT,QAAQ;AAAA,wBACN,SAAS,KAAK,UAAU;AAAA,0BACtB,MAAM;AAAA,0BACN,QAAQ,KAAK;AAAA,0BACb,QAAQ;AAAA,0BACR,OAAQ,SAAiB,SAAS;AAAA,wBACpC,CAAC,CAAC;AAAA;AAAA;AAAA,sBACJ;AAAA,oBACF;AACA,0BAAM,IAAI,MAAO,SAAiB,SAAS,aAAa;AAAA,kBAC1D;AACA,0BAAQ;AAAA,gBACV,SAAS,KAAK;AACZ,wBAAM,IAAI;AAAA,oBACR,SAAS,IAAI,aAAa,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,kBAC5E;AAAA,gBACF;AAAA,cACF;AAEA,oBAAM,SAAS,MAAM,KAAK,WAAW,EAAE;AAAA,gBAAI,CAAC,MAC1C,kBAAkB,GAAG,SAAS;AAAA,cAChC;AACA,oBAAM,UAAU,MAAM,KAAK,WAAW,EAAE;AAAA,gBACtC,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC;AAAA,cAC3B;AACA,oBAAM,aAAa,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;AAC3D,oBAAM,SAAS,QAAQ,WAAW,KAAK,WAAW,WAAW;AAC7D,kBAAI,CAAC,OAAQ,UAAS;AAEtB,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU;AAAA,oBACtB,MAAM;AAAA,oBACN,QAAQ,KAAK;AAAA,oBACb;AAAA,oBACA,aAAa;AAAA,oBACb,cAAc;AAAA,oBACd,iBAAiB;AAAA,kBACnB,CAAC,CAAC;AAAA;AAAA;AAAA,gBACJ;AAAA,cACF;AAAA,YACF,SAAS,KAAK;AACZ,uBAAS;AACT,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,UAAU,QAAQ,KAAK,IAAI,QAAQ,OAAO,OAAQ,KAAe,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,gBAC7G;AAAA,cACF;AAAA,YACF,UAAE;AACA,kBAAI;AACF,sBAAM,QAAQ,WAAW;AAAA,cAC3B,QAAQ;AAAA,cAAC;AACT;AACA,sBAAQ;AAAA,YACV;AAAA,UACF,GAAG;AAAA,QACL;AAEA,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,gBAAgB,WAAW,MAAM,GAAG,KAAK;AACpE,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS,gBAAgB;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,EAAE;AAAA,MACP,EAAE,SAAS,OAAO,OAAQ,KAAe,WAAW,gBAAgB;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AErWD,SAAS,QAAAE,aAAY;AAGrB,IAAM,QAAQ,IAAIA,MAAK;AAMvB,MAAM,IAAI,aAAa,OAAO,MAAM;AAClC,MAAI;AACF,UAAM,MAAM,EAAE,IAAI,MAAM,KAAK;AAE7B,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,IACvD;AAGA,QAAI;AACJ,QAAI;AACF,oBAAc,IAAI,IAAI,GAAG;AACzB,UAAI,YAAY,aAAa,UAAU;AACrC,eAAO,EAAE,KAAK,EAAE,OAAO,8BAA8B,GAAG,GAAG;AAAA,MAC7D;AAAA,IACF,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,OAAO,qBAAqB,GAAG,GAAG;AAAA,IACpD;AAGA,UAAM,WAAW,MAAM,MAAM,YAAY,SAAS,GAAG;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,EAAE;AAAA,QACP;AAAA,UACE,OAAO,mCAAmC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QAClF;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,WAAY,MAAM,SAAS,KAAK;AAGtC,WAAO,EAAE,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,OACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,gBAAQ;;;AC9Df,SAAS,QAAAC,aAAY;AAErB,SAAS,mBAAAC,wBAAuB;AAGhC,IAAM,WAAW,IAAIC,MAAK;AAG1B,SAAS,KAAK,WAAW,OAAO,MAAM;AACpC,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AACtC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtD;AAEA,UAAMC,OAAM,EAAE;AACd,UAAM,SAASA,KAAI,oBAAoB,QAAQ;AAC/C,QAAI,WAAW,aAAa;AAC1B,aAAO,EAAE,KAAK,EAAE,OAAO,WAAW,QAAQ,qBAAqB,GAAG,GAAG;AAAA,IACvE;AAGA,UAAM,iBAAiB,MAAMA,KAAI,qBAAqB,QAAQ;AAC9D,UAAMC,SAKD,CAAC;AAEN,eAAW,CAAC,MAAMC,KAAI,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,UAAI,cAAeA,MAAa;AAChC,UAAI;AACF,sBAAcC,iBAAgB,WAA6B;AAAA,MAC7D,QAAQ;AAAA,MAAC;AACT,MAAAF,OAAM,KAAK;AAAA,QACT;AAAA,QACA,aAAcC,MAAa;AAAA,QAC3B;AAAA,QACA,cAAeA,MAAa;AAAA,MAC9B,CAAC;AAAA,IACH;AAGA,UAAME,aAAYJ,KAAI,sBAAsB,QAAQ,EAAE,IAAI,CAAC,OAAO;AAAA,MAChE,KAAK,EAAE;AAAA,MACP,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,UAAU,EAAE;AAAA,IACd,EAAE;AAGF,UAAMK,WAAUL,KAAI,oBAAoB,QAAQ,EAAE,IAAI,CAAC,OAAO;AAAA,MAC5D,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,WAAW,EAAE;AAAA,IACf,EAAE;AAEF,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,OAAAC;AAAA,MACA,WAAAG;AAAA,MACA,SAAAC;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,EACnC;AACF,CAAC;AAED,IAAO,iBAAQ;;;ACvEf,SAAS,QAAAC,cAAY;;;ACArB,SAAS,kBAAkB;AAyC3B,IAAM,mBAAN,MAAuB;AAAA,EACb,eAA8C,oBAAI,IAAI;AAAA,EACtD,eACN,oBAAI,IAAI;AAAA,EACF,WAAqC,oBAAI,IAAI;AAAA,EAErD,OACE,WACA,eACA,UACA;AAEA,UAAM,KAAK,WAAW,EAAE,QAAQ,MAAM,EAAE;AACxC,UAAM,QAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,MAAM,CAAC;AAAA,MACP,aAAa,oBAAI,IAAI;AAAA,MACrB;AAAA,MACA,kBAAkB,oBAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AACA,SAAK,aAAa,IAAI,IAAI,KAAK;AAC/B,QAAI,UAAU;AACZ,UAAI,CAAC,KAAK,SAAS,IAAI,QAAQ,EAAG,MAAK,SAAS,IAAI,UAAU,oBAAI,IAAI,CAAC;AACvE,WAAK,SAAS,IAAI,QAAQ,EAAG,IAAI,EAAE;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,IAAY;AACd,WAAO,KAAK,aAAa,IAAI,EAAE;AAAA,EACjC;AAAA,EAEA,KAAK,IAAY;AACf,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO;AAAA,MACL,IAAI,EAAE;AAAA,MACN,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,UAAU,EAAE,KAAK;AAAA,MACjB,iBAAiB,CAAC,CAAC,EAAE,eAAe;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,UAAU,IAAY;AACpB,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,OAAO,CAAC;AACV,SAAK,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,IAAY,KAAqB;AACzC,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,KAAK,KAAK,GAAG;AACf,SAAK,UAAU,GAAG,EAAE,MAAM,OAAO,IAAI,CAAC;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,IAAY;AACnB,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,WAAO,GAAG,QAAQ,CAAC;AAAA,EACrB;AAAA,EAEA,UAAU,IAAY,YAA2B;AAC/C,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,YAAY,IAAI,UAAU;AAC5B,WAAO,MAAM;AACX,QAAE,YAAY,OAAO,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,mBAAmB,IAAY,WAAmB,KAAa;AAC7D,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,iBAAiB,IAAI,WAAW,GAAG;AACrC,SAAK,aAAa,IAAI,WAAW,EAAE,eAAe,IAAI,IAAI,CAAC;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,IAAY,WAAuC;AACpE,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,WAAO,GAAG,iBAAiB,IAAI,SAAS;AAAA,EAC1C;AAAA,EAEA,kBACE,WACoD;AACpD,WAAO,KAAK,aAAa,IAAI,SAAS;AAAA,EACxC;AAAA,EAEA,QAAQ,IAAqB;AAC3B,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AAEf,eAAW,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG;AAC3C,UAAI;AACF,YAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,MAC7B,QAAQ;AAAA,MAAC;AACT,UAAI;AACF,YAAI,MAAM;AAAA,MACZ,QAAQ;AAAA,MAAC;AAAA,IACX;AACA,MAAE,YAAY,MAAM;AAEpB,eAAW,OAAO,MAAM,KAAK,EAAE,iBAAiB,KAAK,CAAC,GAAG;AACvD,WAAK,aAAa,OAAO,GAAG;AAAA,IAC9B;AACA,SAAK,aAAa,OAAO,EAAE;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,UAA0B;AACxC,UAAM,MAAM,KAAK,SAAS,IAAI,QAAQ;AACtC,QAAI,CAAC,OAAO,IAAI,SAAS,EAAG,QAAO;AACnC,QAAI,QAAQ;AACZ,eAAW,MAAM,MAAM,KAAK,GAAG,GAAG;AAChC,UAAI,KAAK,QAAQ,EAAE,EAAG;AAAA,IACxB;AACA,SAAK,SAAS,OAAO,QAAQ;AAC7B,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,GAAqB,SAAc;AACnD,eAAW,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG;AAC3C,UAAI;AACF,YAAI,KAAK,OAAO;AAAA,MAClB,QAAQ;AACN,YAAI;AACF,cAAI,MAAM;AAAA,QACZ,QAAQ;AAAA,QAAC;AACT,UAAE,YAAY,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB,IAAI,iBAAiB;;;ADpLrD,IAAM,cAAc,IAAIC,OAAK;AAG7B,SAAS,SAAS,KAAyB;AACzC,QAAM,UAAU,IAAI,QAAQ,IAAI,OAAO;AACvC,UAAQ,IAAI,+BAA+B,GAAG;AAC9C,UAAQ,IAAI,gCAAgC,uBAAuB;AAEnE,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACA,UAAQ,IAAI,iCAAiC,GAAG;AAChD,UAAQ,IAAI,QAAQ,wCAAwC;AAE5D,UAAQ,OAAO,gBAAgB;AAC/B,UAAQ,OAAO,gBAAgB;AAC/B,UAAQ,OAAO,mBAAmB;AAClC,UAAQ,OAAO,mBAAmB;AAClC,SAAO,IAAI,SAAS,IAAI,MAAM;AAAA,IAC5B,QAAQ,IAAI;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YAAY,MAAuC;AAC1D,QAAM,MAA8B,CAAC;AACrC,OAAK,QAAQ,CAAC,OAAO,QAAQ;AAC3B,QAAI,IAAI,YAAY,MAAM,iBAAiB;AACzC,UAAI,GAAG,IAAI,MAAM,WAAW,SAAS,IAAI,eAAe;AAAA,IAC1D,OAAO;AACL,UAAI,GAAG,IAAI;AAAA,IACb;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAGA,YAAY,KAAK,WAAW,OAAO,MAAM;AACvC,MAAI;AACF,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,UAAM,YAAY,MAAM;AAExB,UAAM,WACH,MAAM,YACN,MAAM;AACT,UAAM,SAAS,IAAI,IAAI,EAAE,IAAI,GAAG;AAChC,QAAI,cAAkC;AACtC,QAAI;AAEJ,QAAI,UAAU;AAEZ,YAAM,YAAY,EAAE,oBAAoB,oBAAoB;AAC5D,YAAM,aAAa,UAAU,QAAQ;AACrC,YAAM,MAAuB,YAAY;AACzC,UAAI,CAAC,OAAO,YAAY,WAAW,aAAa;AAC9C,eAAO,EAAE;AAAA,UACP,EAAE,SAAS,OAAO,OAAO,WAAW,QAAQ,qBAAqB;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,aAAa;AAChB,YAAI,IAAI,KAAK;AACX,wBACE,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAO,IAAI,IAAY,SAAS;AAAA,QACtE,OAAO;AACL,gBAAM,SAAS,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE;AAClC,wBAAc,GAAG,MAAM,yBAAyB,mBAAmB,QAAQ,CAAC;AAAA,QAC9E;AAAA,MACF;AAEA,YAAM,OAA+B,CAAC;AACtC,YAAM,cAAc,IAAI,aAAa;AAGrC,UAAI,aAAa;AACf,mBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,WAAW,GAAG;AAChD,cAAI,OAAO,MAAM,SAAU,MAAK,EAAE,YAAY,CAAC,IAAI;AAAA,QACrD;AAAA,MACF;AACA,YAAM,QACJ,KAAK,OAAO,gBAAgB,KAAK,OAAO;AAC1C,UAAI,SAAS,CAAC,KAAK,eAAe,GAAG;AACnC,aAAK,eAAe,IAAI,UAAU,KAAK;AACvC,aAAK,eAAe,IAAI,UAAU,KAAK;AAAA,MACzC;AACA,sBAAgB;AAAA,IAClB;AAEA,QAAI,CAAC,aAAa;AAChB,aAAO,EAAE;AAAA,QACP,EAAE,SAAS,OAAO,OAAO,oCAAoC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACF,YAAM,IAAI,IAAI,IAAI,WAAW;AAC7B,UAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG;AAC7C,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,cAAc,GAAG,GAAG;AAAA,IAC7D;AAEA,UAAM,QAAQ,iBAAiB,OAAO,aAAa,eAAe,QAAQ;AAG1E,UAAM,cAAc,OAAO;AAE3B,UAAM,eAA8B;AAEpC,UAAM,YAAY,wBAAwB,MAAM,EAAE;AAClD,UAAM,gBAAgB,GAAG,WAAW,GAAG,SAAS;AAChD,UAAM,iBAAiB,eAAe,GAAG,YAAY,GAAG,SAAS,KAAK;AAEtE,UAAM,WAAW,kBAAkB;AAEnC,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,IAAI,MAAM;AAAA,MACV,WAAW,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,EAAE;AAAA,MACP,EAAE,SAAS,OAAO,OAAQ,KAAe,WAAW,eAAe;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,YAAY,IAAI,QAAQ,CAAC,MAAM;AAC7B,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,OAAO,iBAAiB,KAAK,EAAE;AACrC,MAAI,CAAC,KAAM,QAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,YAAY,GAAG,GAAG;AACpE,QAAM,SAAS,IAAI,IAAI,EAAE,IAAI,GAAG;AAEhC,QAAM,eAAe;AACrB,QAAM,YAAY,wBAAwB,EAAE;AAC5C,QAAM,gBAAgB,GAAG,OAAO,MAAM,GAAG,SAAS;AAClD,QAAM,iBAAiB,eAAe,GAAG,YAAY,GAAG,SAAS,KAAK;AACtE,QAAM,WAAW,kBAAkB;AACnC,SAAO,EAAE,KAAK;AAAA,IACZ,SAAS;AAAA,IACT,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH,CAAC;AAGD,YAAY,KAAK,cAAc,CAAC,MAAM;AACpC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,KAAK,iBAAiB,UAAU,EAAE;AACxC,MAAI,CAAC,GAAI,QAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,YAAY,GAAG,GAAG;AAClE,SAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AACjC,CAAC;AAGD,YAAY,OAAO,QAAQ,CAAC,MAAM;AAChC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,KAAK,iBAAiB,QAAQ,EAAE;AACtC,MAAI,CAAC,GAAI,QAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,YAAY,GAAG,GAAG;AAClE,SAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AACjC,CAAC;AAGD,YAAY,OAAO,wBAAwB,CAAC,MAAM;AAChD,QAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,QAAM,QAAQ,iBAAiB,gBAAgB,QAAQ;AACvD,SAAO,EAAE,KAAK,EAAE,SAAS,MAAM,MAAM,CAAC;AACxC,CAAC;AAGD,YAAY,IAAI,eAAe,CAAC,MAAM;AACpC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,QAAQ,iBAAiB,IAAI,EAAE;AACrC,MAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,YAAY,GAAG,GAAG;AAErE,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI;AACJ,QAAM,SAAS,IAAI,eAAe;AAAA,IAChC,MAAM,YAAY;AAEhB,iBAAW,OAAO,MAAM,MAAM;AAC5B,mBAAW;AAAA,UACT,QAAQ,OAAO,SAAS,KAAK,UAAU,EAAE,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA;AAAA,CAAM;AAAA,QACpE;AAAA,MACF;AACA,YAAM,aAAa;AAAA,QACjB,MAAM,CAAC,UAAe;AACpB,qBAAW;AAAA,YACT,QAAQ,OAAO,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM;AAAA,UACrD;AAAA,QACF;AAAA,QACA,OAAO,MAAM,WAAW,MAAM;AAAA,MAChC;AACA,YAAM,cAAc,iBAAiB,UAAU,IAAI,UAAU;AAC7D,sBAAgB;AAAA,IAClB;AAAA,IACA,SAAS;AACP,UAAI;AACF,yBAAiB,cAAc;AAAA,MACjC,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF,CAAC;AACD,SAAO,IAAI,SAAS,QAAe;AAAA,IACjC,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,+BAA+B;AAAA,MAC/B,gCAAgC;AAAA,MAChC,gCACE;AAAA,MACF,qBAAqB;AAAA,IACvB;AAAA,EACF,CAAC;AACH,CAAC;AAGD,YAAY,QAAQ,cAAc,CAAC,MAAM;AACvC,SAAO,EAAE,KAAK,MAAM,KAAK;AAAA,IACvB,+BAA+B;AAAA,IAC/B,gCAAgC;AAAA,IAChC,gCACE;AAAA,IACF,0BAA0B;AAAA,IAC1B,MAAM;AAAA,EACR,CAAC;AACH,CAAC;AAGD,YAAY,QAAQ,gBAAgB,CAAC,MAAM;AACzC,SAAO,EAAE,KAAK,MAAM,KAAK;AAAA,IACvB,+BAA+B;AAAA,IAC/B,gCAAgC;AAAA,IAChC,gCACE;AAAA,IACF,0BAA0B;AAAA,IAC1B,MAAM;AAAA,EACR,CAAC;AACH,CAAC;AAED,eAAe,YAAY,GAAQ;AACjC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,QAAQ,iBAAiB,IAAI,EAAE;AACrC,MAAI,CAAC,MAAO,QAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,YAAY,GAAG,GAAG;AAErE,QAAM,MAAM,EAAE,IAAI;AAClB,QAAM,YAAY,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAGzE,MAAI;AACJ,MAAI;AACF,UAAM,QAAQ,IAAI,MAAM;AACxB,kBAAc,MAAM,MAAM,KAAK;AAAA,EACjC,QAAQ;AACN,kBAAc;AAAA,EAChB;AAGA,mBAAiB,UAAU,IAAI;AAAA,IAC7B,IAAI;AAAA,IACJ,WAAW,KAAK,IAAI;AAAA,IACpB,WAAW;AAAA,IACX,QAAQ,IAAI;AAAA,IACZ,KAAK,MAAM;AAAA,IACX,SAAS,YAAY,IAAI,OAAO;AAAA,IAChC,MAAM;AAAA,EACR,CAAC;AAGD,MAAI;AACF,UAAM,UAAU,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,YAAY;AAC7D,UAAM,WAAW,OAAO,SAAS,mBAAmB;AACpD,UAAM,iBAAiB,IAAI,IAAI,MAAM,SAAS,EAAE;AAChD,UAAM,uBAAuB,eAAe,KAAK,cAAc;AAC/D,QAAI,IAAI,WAAW,UAAU,YAAY,CAAC,sBAAsB;AAC9D,YAAM,UAAU,IAAI,QAAQ;AAAA,QAC1B,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd,CAAC;AACD,cAAQ,OAAO,gBAAgB;AAC/B,cAAQ,OAAO,gBAAgB;AAC/B,cAAQ,OAAO,mBAAmB;AAClC,cAAQ,OAAO,mBAAmB;AAClC,aAAO,SAAS,IAAI,SAAS,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAAA,IAC9D;AACA,QAAI,IAAI,WAAW,SAAS,YAAY,CAAC,sBAAsB;AAC7D,YAAM,UAAU,IAAI,QAAQ,IAAI,mBAAmB;AACnD,YAAM,SAAS,IAAI,QAAQ,IAAI,kBAAkB;AACjD,YAAM,OAAO,UAAU,IAAI,QAAQ,IAAI,MAAM;AAC7C,UAAI,QAAQ;AACZ,UAAI,CAAC,OAAO;AACV,cAAM,eAAe,IAAI,QAAQ,IAAI,QAAQ;AAC7C,YAAI,gBAAgB,WAAW,KAAK,YAAY,EAAG,SAAQ;AAAA,MAC7D;AACA,UAAI,CAAC,MAAO,SAAQ;AACpB,YAAM,cAAc,OAAO,GAAG,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,EAAE;AACnE,YAAM,YAAY,OAAO,WAAW;AAEpC,uBAAiB;AAAA,QACf;AAAA,QACA;AAAA,QACA,IAAI,IAAI,MAAM,SAAS,EAAE,SAAS;AAAA,MACpC;AACA,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,SAAS,IAAI,eAA2B;AAAA,QAC5C,MAAM,YAAY;AAChB,qBAAW,QAAQ,QAAQ,OAAO;AAAA,CAAe,CAAC;AAClD,qBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAY,CAAC;AAC/C,gBAAM,WAAW,GAAG,WAAW,wBAAwB,EAAE,6BAA6B,SAAS;AAE/F,gBAAM,KAAK,EAAE,IAAI,OAAO,YAAY,KAAK;AACzC,gBAAM,WAAW,UAAU,KAAK,EAAE,KAAK,aAAa,KAAK,EAAE;AAC3D,cAAI,CAAC,UAAU;AACb,uBAAW,QAAQ,QAAQ,OAAO;AAAA,CAAmB,CAAC;AACtD,uBAAW;AAAA,cACT,QAAQ,OAAO,SAAS,KAAK,UAAU,EAAE,KAAK,SAAS,CAAC,CAAC;AAAA;AAAA,CAAM;AAAA,YACjE;AAAA,UACF;AACA,qBAAW,QAAQ,QAAQ,OAAO;AAAA,CAAmB,CAAC;AACtD,qBAAW,QAAQ,QAAQ,OAAO,SAAS,QAAQ;AAAA;AAAA,CAAM,CAAC;AAC1D,gBAAM,IAAI,YAAY,MAAM;AAC1B,gBAAI;AACF,yBAAW;AAAA,gBACT,QAAQ,OAAO,eAAe,KAAK,IAAI,CAAC;AAAA;AAAA,CAAM;AAAA,cAChD;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX,GAAG,IAAK;AACR,UAAC,WAAmB,KAAK;AAAA,QAC3B;AAAA,QACA,SAAS;AACP,cAAI;AACF,0BAAe,KAAa,EAAE;AAAA,UAChC,QAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF,CAAC;AACD;AACE,cAAM,UAAU,IAAI,QAAQ;AAAA,UAC1B,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,YAAY;AAAA,UACZ,qBAAqB;AAAA,QACvB,CAAC;AAED,gBAAQ,OAAO,gBAAgB;AAC/B,gBAAQ,OAAO,gBAAgB;AAC/B,gBAAQ,OAAO,mBAAmB;AAClC,gBAAQ,OAAO,mBAAmB;AAClC,eAAO,SAAS,IAAI,SAAS,QAAe,EAAE,QAAQ,CAAC,CAAC;AAAA,MAC1D;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAAC;AAGT,MAAI,cAAc,IAAI,IAAI,MAAM,SAAS;AACzC,MAAI;AACF,UAAM,cAAc,IAAI,IAAI,IAAI,GAAG;AACnC,UAAM,YAAY,wBAAwB,EAAE;AAC5C,UAAM,OAAO,YAAY,SAAS,WAAW,SAAS,IAClD,YAAY,SAAS,MAAM,UAAU,MAAM,IAC3C;AACJ,UAAM,WAAW,YAAY,SAAS,SAAS,GAAG,IAC9C,YAAY,SAAS,MAAM,GAAG,EAAE,IAChC,YAAY;AAChB,UAAM,WAAW,OAAQ,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,KAAM;AAErE,QAAI,SAAS,WAAW,WAAW,GAAG;AACpC,YAAM,YAAY,IAAI,IAAI,IAAI,GAAG,EAAE,aAAa,IAAI,WAAW,KAAK;AACpE,YAAM,SAAS,YACX,iBAAiB,mBAAmB,IAAI,SAAS,IACjD;AACJ,UAAI,QAAQ;AACV,sBAAc,IAAI,IAAI,MAAM;AAAA,MAC9B,OAAO;AAEL,oBAAY,WAAW,GAAG,QAAQ;AAClC,oBAAY,SAAS;AAAA,MACvB;AAAA,IACF,OAAO;AACL,kBAAY,WAAW,GAAG,QAAQ,GAAG,QAAQ;AAE7C,YAAM,eAAe,IAAI,gBAAgB,YAAY,MAAM;AAC3D,YAAM,gBAAgB,IAAI,gBAAgB,YAAY,MAAM;AAE5D,oBAAc,QAAQ,CAAC,OAAO,QAAQ;AACpC,YAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,uBAAa,IAAI,KAAK,KAAK;AAAA,QAC7B;AAAA,MACF,CAAC;AACD,kBAAY,SAAS,aAAa,SAAS;AAAA,IAC7C;AAAA,EACF,QAAQ;AAAA,EAAC;AAGT,QAAM,WAAW,IAAI,QAAQ;AAC7B,MAAI,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAClC,UAAM,IAAI,IAAI,YAAY;AAC1B,QACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,CAAC;AAEZ;AACF,QAAI,MAAM,iBAAkB;AAE5B,QAAI,MAAM,OAAQ;AAClB,aAAS,IAAI,KAAK,KAAK;AAAA,EACzB,CAAC;AAGD,MAAI;AACF,UAAM,OAAO,SAAS,IAAI,QAAQ,KAAK,IAAI,YAAY;AACvD,UAAM,UAAU,IAAI,SAAS,kBAAkB;AAC/C,UAAM,SAAS,IAAI,SAAS,mBAAmB;AAC/C,QAAI,CAAC,WAAW,CAAC,QAAQ;AACvB,YAAM,QAAkB,CAAC;AACzB,UAAI,CAAC,QAAS,OAAM,KAAK,kBAAkB;AAC3C,UAAI,CAAC,OAAQ,OAAM,KAAK,mBAAmB;AAC3C,YAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,eAAS,IAAI,UAAU,MAAM,GAAG,GAAG,KAAK,MAAM,KAAK,MAAM;AAAA,IAC3D;AAAA,EACF,QAAQ;AAAA,EAAC;AAGT,MAAI,MAAM,eAAe;AACvB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AAC9D,YAAM,IAAI,IAAI,YAAY;AAC1B,UAAI,MAAM,UAAU,MAAM,iBAAkB;AAC5C,UACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,CAAC;AAEZ;AAEF,UAAI,MAAM,mBAAmB,SAAS,IAAI,eAAe,EAAG;AAC5D,eAAS,IAAI,KAAK,KAAK;AAAA,IACzB;AAAA,EACF;AAIA,QAAM,OAAoB;AAAA,IACxB,QAAQ,IAAI;AAAA,IACZ,SAAS;AAAA,EACX;AACA,MAAI,IAAI,WAAW,SAAS,IAAI,WAAW,QAAQ;AACjD,SAAK,OAAO;AAAA,EACd;AACA,QAAM,YAAY,IAAI,QAAQ,YAAY,SAAS,GAAG,IAAW;AAEjE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,SAAS;AACjC,UAAM,WAAW,IAAI,MAAM;AAC3B,UAAM,MAAM,IAAI,QAAQ,IAAI,cAAc,KAAK,IAAI,YAAY;AAC/D,UAAM,cACJ,GAAG,SAAS,mBAAmB,KAAK,GAAG,SAAS,sBAAsB;AACxE,QAAI;AACJ,QAAI;AACF,UACE,GAAG,SAAS,mBAAmB,KAC/B,GAAG,SAAS,sBAAsB,GAClC;AACA,uBAAe;AAAA,MACjB,OAAO;AACL,uBAAe,MAAM,SAAS,KAAK;AAAA,MACrC;AAAA,IACF,QAAQ;AACN,qBAAe;AAAA,IACjB;AAEA,QAAI,CAAC,aAAa;AAChB,uBAAiB,UAAU,IAAI;AAAA,QAC7B,IAAI,GAAG,SAAS;AAAA,QAChB,WAAW,KAAK,IAAI;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ,IAAI;AAAA,QACZ,YAAY,IAAI;AAAA,QAChB,SAAS,OAAO,YAAY,IAAI,QAAQ,QAAQ,CAAC;AAAA,QACjD,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,QAAI,GAAG,SAAS,mBAAmB,GAAG;AACpC,YAAM,eAAe,IAAI;AACzB,UAAI,CAAC,cAAc;AACjB,eAAO;AAAA,UACL,IAAI,SAAS,MAAM,EAAE,QAAQ,IAAI,QAAQ,SAAS,IAAI,QAAQ,CAAC;AAAA,QACjE;AAAA,MACF;AACA,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,UAAU,IAAI,YAAY;AAChC,UAAI,SAAS;AACb,UAAI,gBAA+B;AAEnC,UAAI,mBAA6B,CAAC;AAClC,YAAM,gBAAgB,wBAAwB,EAAE;AAEhD,YAAM,UAAU,EAAE,IAAI,OAAO,mBAAmB;AAChD,YAAM,SAAS,EAAE,IAAI,OAAO,kBAAkB;AAC9C,YAAM,UAAU,UAAU,EAAE,IAAI,OAAO,MAAM;AAC7C,UAAI,WAAW;AACf,UAAI,CAAC,UAAU;AACb,cAAM,eAAe,EAAE,IAAI,OAAO,QAAQ;AAC1C,YAAI,gBAAgB,WAAW,KAAK,YAAY,EAAG,YAAW;AAAA,MAChE;AACA,UAAI,CAAC,SAAU,YAAW;AAC1B,YAAM,cAAc,UAChB,GAAG,QAAQ,MAAM,OAAO,KACxB,IAAI,IAAI,EAAE,IAAI,GAAG,EAAE;AAEvB,UAAI,kBAAkB,MAAM;AAC1B,YAAI;AACF,gBAAM,IAAI,IAAI,IAAK,IAAY,OAAO,YAAY,SAAS,CAAC;AAC5D,iBAAO,GAAG,EAAE,QAAQ,KAAK,EAAE,IAAI;AAAA,QACjC,QAAQ;AACN,cAAI;AACF,mBAAO,IAAI,IAAI,MAAM,SAAS,EAAE;AAAA,UAClC,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,GAAG;AACH,YAAM,gBAAgB,IAAI,eAA2B;AAAA,QACnD,MAAM,MAAM,YAAY;AACtB,gBAAM,SAAS,aAAa,UAAU;AACtC,cAAI;AACF,mBAAO,MAAM;AACX,oBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,kBAAI,KAAM;AACV,wBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,kBAAI;AACJ,sBAAQ,MAAM,OAAO,QAAQ,IAAI,OAAO,IAAI;AAC1C,sBAAM,OAAO,OAAO,MAAM,GAAG,MAAM,CAAC;AACpC,yBAAS,OAAO,MAAM,MAAM,CAAC;AAC7B,oBAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,kCAAgB,KAAK,MAAM,CAAC,EAAE,KAAK;AACnC,6BAAW,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,gBACzC,WAAW,KAAK,WAAW,OAAO,GAAG;AAEnC,wBAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,wBAAM,UAAU,QAAQ,KAAK;AAE7B,mCAAiB,KAAK,OAAO;AAC7B,sBAAI,cAA6B;AACjC,sBAAI;AACF,wBAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,4BAAM,MAAM,KAAK,MAAM,OAAO;AAE9B,oCACE,KAAK,OACL,KAAK,UAAU,OACd,KAAK,SAAS,eACZ,KAAK,MAAM,OAAO,KAAK;AAAA,oBAC9B;AAAA,kBACF,QAAQ;AAAA,kBAAC;AACT,sBAAI,CAAC,aAAa;AAEhB,0BAAM,MAAM;AACZ,wBAAI,YAAY,KAAK,GAAG,KAAK,aAAa,KAAK,GAAG,GAAG;AACnD,oCAAc;AAAA,oBAChB;AAAA,kBACF;AACA,sBAAI,aAAa;AACf,wBAAI;AACF,4BAAM,IAAI,IAAI;AAAA,wBACZ;AAAA,wBACA,kBAAkB;AAAA,sBACpB;AACA,4BAAM,YACJ,EAAE,aAAa,IAAI,WAAW,KAC9B,EAAE,aAAa,IAAI,KAAK,KACxB;AACF,0BAAI,WAAW;AACb,yCAAiB;AAAA,0BACf;AAAA,0BACA;AAAA,0BACA,EAAE,SAAS;AAAA,wBACb;AACA,4BAAI;AACF,kCAAQ,IAAI,0BAA0B;AAAA,4BACpC;AAAA,4BACA;AAAA,4BACA,UAAU,EAAE,SAAS;AAAA,0BACvB,CAAC;AAAA,wBACH,QAAQ;AAAA,wBAAC;AAAA,sBACX;AACA,4BAAM,gBAAgB,GAAG,WAAW,GAAG,aAAa,YAAY,EAAE,MAAM;AAExE,iCAAW,QAAQ,QAAQ,OAAO;AAAA,CAAmB,CAAC;AACtD,iCAAW;AAAA,wBACT,QAAQ,OAAO,SAAS,aAAa;AAAA;AAAA,CAAM;AAAA,sBAC7C;AAEA,yCAAmB,CAAC;AACpB;AAAA,oBACF,QAAQ;AAAA,oBAER;AAAA,kBACF;AAEA,6BAAW,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,gBACzC,WAAW,SAAS,MAAM;AAExB,sBAAI,kBAAkB,WAAW;AAC/B,0BAAM,WAAW,iBAAiB,KAAK,IAAI;AAC3C,wBAAI,WAAW;AACf,wBAAI;AAEF,4BAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,iCAAW,KAAK,UAAU,MAAM;AAAA,oBAClC,QAAQ;AAAA,oBAAC;AACT,wBAAI;AACF,uCAAiB,UAAU,IAAI;AAAA,wBAC7B,IAAI,GAAG,SAAS,QAAQ,KAAK,IAAI,CAAC;AAAA,wBAClC,WAAW,KAAK,IAAI;AAAA,wBACpB,WAAW;AAAA,wBACX,QAAQ;AAAA,wBACR,YAAY;AAAA,wBACZ,SAAS,EAAE,gBAAgB,oBAAoB;AAAA,wBAC/C,MAAM;AAAA,sBACR,CAAC;AAAA,oBACH,QAAQ;AAAA,oBAAC;AAAA,kBACX;AACA,qCAAmB,CAAC;AACpB,kCAAgB;AAChB,6BAAW,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,gBACzC,OAAO;AACL,6BAAW,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,gBACzC;AAAA,cACF;AAAA,YACF;AACA,gBAAI,OAAO,OAAQ,YAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAAA,UAC9D,UAAE;AACA,gBAAI;AACF,yBAAW,MAAM;AAAA,YACnB,QAAQ;AAAA,YAAC;AAAA,UACX;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,UAAU,IAAI,QAAQ,IAAI,OAAO;AAEvC,cAAQ,OAAO,gBAAgB;AAC/B,cAAQ,OAAO,gBAAgB;AAE/B,cAAQ,OAAO,mBAAmB;AAClC,cAAQ,OAAO,mBAAmB;AAClC,cAAQ,IAAI,iBAAiB,UAAU;AACvC,cAAQ,IAAI,cAAc,YAAY;AACtC,aAAO;AAAA,QACL,IAAI,SAAS,eAAsB;AAAA,UACjC,QAAQ,IAAI;AAAA,UACZ,YAAY,IAAI;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,gBAAgB,IAAI,QAAQ,IAAI,OAAO;AAC7C,kBAAc,OAAO,gBAAgB;AACrC,kBAAc,OAAO,gBAAgB;AACrC,UAAM,cAAc,IAAI,SAAS,IAAI,MAAM;AAAA,MACzC,QAAQ,IAAI;AAAA,MACZ,YAAY,IAAI;AAAA,MAChB,SAAS;AAAA,IACX,CAAC;AACD,WAAO,SAAS,WAAW;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,OAAO,KAAK,UAAU,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC;AACpD,qBAAiB,UAAU,IAAI;AAAA,MAC7B,IAAI,GAAG,SAAS;AAAA,MAChB,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,IAAI,SAAS,MAAM;AAAA,QACjB,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGA,YAAY,IAAI,cAAc,WAAW;AACzC,YAAY,IAAI,gBAAgB,WAAW;AAE3C,IAAO,sBAAQ;;;AEptBf,SAAS,QAAAC,cAAY;;;ACCrB,SAAS,KAAAC,UAAS;AAClB,SAAS,mBAAAC,wBAAuB;AAazB,SAAS,sBAAsB,UAAkB,MAAkB;AACxE,MAAI,SAAS,WAAW;AACtB,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,cAAc;AAAA,QACZ,OAAO,EAAE,aAAa,KAAK;AAAA,QAC3B,SAAS,CAAC;AAAA,QACV,WAAW,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,QAChD,SAAS,CAAC;AAAA,QACV,OAAO,EAAE,aAAa,KAAK;AAAA,MAC7B;AAAA,MACA,YAAY,EAAE,MAAM,UAAU,SAAS,gBAAgB;AAAA,IACzD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa,CAAC;AAAA,MACd,OAAO,EAAE,aAAa,KAAK;AAAA,IAC7B;AAAA,IACA,YAAY,EAAE,MAAM,UAAU,SAAS,eAAe;AAAA,EACxD;AACF;AAEA,SAAS,kBAAkB,QAAkB;AAC3C,MAAI;AACF,QAAI,UAAU,OAAO,WAAW,UAAU;AAExC,UACE,kBAAkBD,GAAE,WACnB,UAAU,UAAU,WAAW,QAChC;AACA,eAAOC,iBAAgB,MAAwB;AAAA,MACjD;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,eAAsB,cACpB,UACA,MACA,eACA,MACqB;AACrB,QAAM,KAAM,MAAM,MAAM;AACxB,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM,UAAU,CAAC;AAGhC,MAAI,CAAC,UAAU,OAAO,WAAW,gBAAgB,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,CAAC,aAAkB,EAAE,SAAS,OAAO,IAAI,GAAG,QAAQ;AAEpE,MAAI;AACF,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC/B,KAAK,cAAc;AACjB,cAAM,SAAS,sBAAsB,UAAU,IAAI;AACnD,eAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,MAC3B;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,WAAW,MAAM,cAAc,qBAAqB,QAAQ;AAClE,cAAMC,SAAQ,OAAO,KAAK,QAAQ,EAAE,IAAI,CAAC,UAAU;AAAA,UACjD;AAAA,UACA,aAAc,SAAiB,IAAI,EAAE;AAAA,UACrC,aAAa,kBAAmB,SAAiB,IAAI,EAAE,WAAW;AAAA,UAClE,cAAc,kBAAmB,SAAiB,IAAI,EAAE,YAAY;AAAA,QACtE,EAAE;AACF,eAAO,QAAQ,EAAE,QAAQ,EAAE,OAAAA,OAAM,EAAE,CAAC;AAAA,MACtC;AAAA,MACA,KAAK,cAAc;AACjB,YAAI;AACF,gBAAM,OAAO,MAAM,cAAc;AAAA,YAC/B,GAAG,QAAQ,IAAI,QAAQ,IAAI;AAAA,YAC3B,QAAQ,aAAa,CAAC;AAAA,UACxB;AACA,cAAI,SAAS,WAAW;AAEtB,kBAAM,SAAS;AAAA,cACb,SAAS;AAAA,gBACP;AAAA,kBACE,MAAM;AAAA,kBACN,MACE,OAAQ,KAAa,WAAW,WAC3B,KAAa,SACd,KAAK,UAAW,KAAa,QAAQ,MAAM,CAAC;AAAA,gBACpD;AAAA,cACF;AAAA,cACA,SAAS;AAAA,YACX;AACA,mBAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UAC3B;AAEA,iBAAO,QAAQ,EAAE,QAAS,KAAa,OAAO,CAAC;AAAA,QACjD,SAAS,GAAQ;AACf,cAAI,SAAS,WAAW;AACtB,kBAAM,SAAS;AAAA,cACb,SAAS;AAAA,gBACP,EAAE,MAAM,QAAQ,MAAM,UAAU,GAAG,WAAW,OAAO,CAAC,CAAC,GAAG;AAAA,cAC5D;AAAA,cACA,SAAS;AAAA,YACX;AACA,mBAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UAC3B;AACA,iBAAO,QAAQ;AAAA,YACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,UAC1D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAMC,aAAY,cACf,sBAAsB,QAAQ,EAC9B,IAAI,CAAC,OAAO;AAAA,UACX,KAAK,EAAE;AAAA,UACP,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,UAAU,EAAE;AAAA,QACd,EAAE;AACJ,eAAO,QAAQ,EAAE,QAAQ,EAAE,WAAAA,WAAU,EAAE,CAAC;AAAA,MAC1C;AAAA,MACA,KAAK,kBAAkB;AACrB,YAAI;AACF,gBAAM,UAAU,MAAM,cAAc;AAAA,YAClC,QAAQ;AAAA,YACR;AAAA,UACF;AACA,cAAI,SAAS,WAAW;AACtB,kBAAM,SAAS;AAAA,cACb,UAAU;AAAA,gBACR;AAAA,kBACE,KAAK,QAAQ;AAAA,kBACb,UAAW,SAAiB,YAAY;AAAA,kBACxC,MACE,OAAO,YAAY,WACf,UACA,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,gBACvC;AAAA,cACF;AAAA,YACF;AACA,mBAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UAC3B;AAEA,iBAAO,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AAAA,QACpC,SAAS,GAAQ;AACf,iBAAO,QAAQ;AAAA,YACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,UAC1D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAMC,WAAU,cACb,oBAAoB,QAAQ,EAC5B,IAAI,CAAC,OAAO;AAAA,UACX,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,WAAW,EAAE;AAAA,QACf,EAAE;AACJ,eAAO,QAAQ,EAAE,QAAQ,EAAE,SAAAA,SAAQ,EAAE,CAAC;AAAA,MACxC;AAAA,MACA,KAAK,eAAe;AAClB,YAAI;AACF,gBAAM,UAAU,MAAM,cAAc;AAAA,YAClC,QAAQ;AAAA,YACR;AAAA,YACA,QAAQ,aAAa,CAAC;AAAA,UACxB;AACA,cAAI,SAAS,WAAW;AACtB,kBAAM,SAAS;AAAA,cACb,aACG,SAAiB,eAAe,WAAW,QAAQ,IAAI;AAAA,cAC1D,UAAU;AAAA,gBACR;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,oBACP,MAAM;AAAA,oBACN,MACE,OAAO,YAAY,WACf,UACA,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,kBACvC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,mBAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UAC3B;AAEA,iBAAO,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AAAA,QACpC,SAAS,GAAQ;AACf,iBAAO,QAAQ;AAAA,YACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,UAC1D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,KAAK,cAAc;AACjB,eAAO,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;AAAA,MAC1C;AAAA,MACA,KAAK,oBAAoB;AACvB,eAAO,QAAQ,EAAE,QAAQ,EAAE,SAAS,KAAK,EAAE,CAAC;AAAA,MAC9C;AAAA,MACA,SAAS;AACP,eAAO,QAAQ;AAAA,UACb,OAAO,EAAE,MAAM,QAAQ,SAAS,2BAA2B,MAAM,GAAG;AAAA,QACtE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,GAAQ;AACf,WAAO,QAAQ;AAAA,MACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;;;ADjOA,IAAM,WAAiC,oBAAI,IAAI;AAC/C,IAAM,wBAA6C,oBAAI,IAAI;AAK3D,SAAS,kBAAkB,MAAkB,aAAqB;AAChE,QAAM,SAAS,IAAIC,OAAK;AAExB,SAAO;AAAA,IAAQ;AAAA,IAAc,CAAC,MAC5B,EAAE,KAAK,MAAM,KAAK;AAAA,MAChB,+BAA+B;AAAA,MAC/B,gCAAgC;AAAA,MAChC,gCACE;AAAA,MACF,iCAAiC;AAAA,MACjC,0BAA0B;AAAA,IAC5B,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IAAQ;AAAA,IAAgB,CAAC,MAC9B,EAAE,KAAK,MAAM,KAAK;AAAA,MAChB,+BAA+B;AAAA,MAC/B,gCAAgC;AAAA,MAChC,gCACE;AAAA,MACF,iCAAiC;AAAA,MACjC,0BAA0B;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,iBAAe,WAAW,GAAQ;AAChC,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAM,SAAS,EAAE,IAAI;AAGrB,QAAI,WAAW,QAAQ;AACrB,aAAO,EAAE,KAAK,MAAM,KAAK;AAAA,QACvB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,+BAA+B;AAAA,QAC/B,qBAAqB;AAAA,MACvB,CAAC;AAAA,IACH;AACA,QAAI,WAAW,OAAO;AACpB,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,cAAc,IAAI,IAAI,EAAE,IAAI,GAAG;AAErC,YAAM,eAAe,EAAE,IAAI,OAAO,wBAAwB;AAC1D,UAAI;AACJ,UAAI,gBAAgB,aAAa,KAAK,MAAM,IAAI;AAC9C,uBAAe,aAAa,KAAK;AAAA,MACnC,OAAO;AAGL,cAAM,UAAU,EAAE,IAAI,OAAO,mBAAmB;AAChD,cAAM,SAAS,EAAE,IAAI,OAAO,kBAAkB;AAC9C,cAAM,OAAO,UAAU,EAAE,IAAI,OAAO,MAAM;AAC1C,YAAI,QAAQ;AACZ,YAAI,CAAC,OAAO;AACV,gBAAM,eAAe,EAAE,IAAI,OAAO,QAAQ;AAC1C,cAAI,gBAAgB,WAAW,KAAK,YAAY,EAAG,SAAQ;AAAA,QAC7D;AACA,YAAI,CAAC,MAAO,SAAQ;AACpB,cAAM,SAAS,OAAO,GAAG,KAAK,MAAM,IAAI,KAAK,YAAY;AACzD,uBAAe,GAAG,MAAM,YAAY,WAAW,IAAI,QAAQ;AAAA,MAC7D;AACA,YAAM,YAAY,OAAO,WAAW;AACpC,UAAI;AACJ,YAAM,SAAS,IAAI,eAAe;AAAA,QAChC,MAAM,YAAY;AAChB,kBAAQ,IAAI,IAAI,WAAW,cAAc,EAAE,UAAU,UAAU,CAAC;AAChE,gBAAM,OAAO,CAAC,OAAe,SAAiB;AAC5C,uBAAW,QAAQ,QAAQ,OAAO,UAAU,KAAK;AAAA,CAAI,CAAC;AACtD,uBAAW,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAAA;AAAA,CAAM,CAAC;AAAA,UACxD;AACA,gBAAM,QAAQ,MAAM;AAClB,gBAAI;AACF,yBAAW,MAAM;AAAA,YACnB,QAAQ;AAAA,YAAC;AAAA,UACX;AAGA,mBAAS,IAAI,GAAG,QAAQ,IAAI,SAAS,IAAI,EAAE,MAAM,MAAM,CAAC;AACxD,gCAAsB,IAAI,UAAU,SAAS;AAC7C,kBAAQ,IAAI,IAAI,WAAW,wBAAwB;AAAA,YACjD,KAAK,GAAG,QAAQ,IAAI,SAAS;AAAA,UAC/B,CAAC;AAGD,eAAK,QAAQ,EAAE;AACf,gBAAM,MAAM,aAAa,SAAS,GAAG,IAAI,MAAM;AAC/C,gBAAM,MAAM,GAAG,YAAY,GAAG,GAAG,aAAa,SAAS;AACvD,kBAAQ,IAAI,IAAI,WAAW,cAAc;AAAA,YACvC;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAED,cAAI;AACF,iBAAK,YAAY,KAAK,UAAU,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;AAAA,UACvD,QAAQ;AAAA,UAAC;AACT,cAAI;AACF,iBAAK,YAAY,GAAG;AAAA,UACtB,QAAQ;AAAA,UAAC;AAGT,kBAAQ,YAAY,MAAM;AACxB,gBAAI;AACF,yBAAW;AAAA,gBACT,QAAQ,OAAO,eAAe,KAAK,IAAI,CAAC;AAAA;AAAA,CAAM;AAAA,cAChD;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX,GAAG,IAAK;AAAA,QACV;AAAA,QACA,SAAS;AACP,cAAI;AACF,0BAAc,KAAK;AAAA,UACrB,QAAQ;AAAA,UAAC;AACT,kBAAQ,IAAI,IAAI,WAAW,eAAe,EAAE,UAAU,UAAU,CAAC;AACjE,mBAAS,OAAO,GAAG,QAAQ,IAAI,SAAS,EAAE;AAE1C,cAAI,sBAAsB,IAAI,QAAQ,MAAM,WAAW;AACrD,kCAAsB,OAAO,QAAQ;AAAA,UACvC;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO,EAAE,KAAK,QAAe,KAAK;AAAA,QAChC,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,QACjC,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,QAAQ;AACrB,aAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,IACrD;AAGA,QAAI,OAAY;AAChB,QAAI;AACF,aAAO,MAAM,EAAE,IAAI,KAAK;AAAA,IAC1B,QAAQ;AAAA,IAAC;AAET,UAAM,gBAAgB,EAAE;AACxB,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AAEb,aAAO,EAAE,KAAK,YAAY,KAAK,EAAE,+BAA+B,IAAI,CAAC;AAAA,IACvE;AACA,WAAO,EAAE,KAAK,KAAK,UAAU,QAAQ,GAAG,KAAK;AAAA,MAC3C,gBAAgB;AAAA,MAChB,+BAA+B;AAAA,MAC/B,iCAAiC;AAAA,IACnC,CAAC;AAAA,EACH;AAGA,SAAO,KAAK,uBAAuB,OAAO,MAAM;AAC9C,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW,KAAK;AACvD,UAAM,MAAM,GAAG,QAAQ,IAAI,SAAS;AACpC,QAAI,OAAO,SAAS,IAAI,GAAG;AAC3B,QAAI,CAAC,MAAM;AACT,YAAM,aAAa,sBAAsB,IAAI,QAAQ;AACrD,UAAI,YAAY;AACd,eAAO,SAAS,IAAI,GAAG,QAAQ,IAAI,UAAU,EAAE;AAAA,MACjD;AAAA,IACF;AACA,YAAQ,IAAI,IAAI,WAAW,mBAAmB;AAAA,MAC5C;AAAA,MACA,UAAU,CAAC,CAAC;AAAA,MACZ,aAAa,EAAE,IAAI,OAAO,cAAc;AAAA,IAC1C,CAAC;AACD,QAAI,CAAC,MAAM;AACT,aAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,IACjD;AACA,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,EAAE,IAAI,KAAK;AAAA,IAC1B,QAAQ;AACN,UAAI;AACF,cAAM,MAAM,MAAM,EAAE,IAAI,KAAK;AAC7B,eAAO,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,MACjC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,KAAK,MAAM,MAAM;AACvB,UAAM,SAAS,MAAM;AACrB,UAAM,SAAS,MAAM,UAAU,CAAC;AAGhC,QAAI;AACF,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA,EAAE,IAAI,QAAQ,OAAO;AAAA,QACrB,EAAE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,iBAAiB;AACnB,YAAI;AACF,kBAAQ,IAAI,IAAI,WAAW,kBAAkB;AAAA,YAC3C;AAAA,YACA,IAAI,gBAAgB;AAAA,YACpB;AAAA,UACF,CAAC;AACD,eAAK,KAAK,WAAW,KAAK,UAAU,eAAe,CAAC;AAAA,QACtD,QAAQ;AAAA,QAAC;AAAA,MACX;AAEA,aAAO,EAAE,KAAK,YAAY,KAAK;AAAA,QAC7B,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,MACnC,CAAC;AAAA,IACH,SAAS,GAAQ;AACf,aAAO,EAAE,KAAK,SAAS,KAAK;AAAA,QAC1B,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,cAAc,UAAU;AACnC,SAAO,IAAI,gBAAgB,UAAU;AAErC,SAAO;AACT;AAGO,IAAM,cAAc,kBAAkB,WAAW,cAAc;AAC/D,IAAM,cAAc,kBAAkB,WAAW,cAAc;;;AjBjPtE,IAAM,MAAM,IAAIC,OAAK;AAGrB,IAAI,IAAI,WAAW,CAAC,MAAM;AACxB,SAAO,EAAE,KAAK;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AACH,CAAC;AAGD,IAAI,MAAM,SAAS,YAAI;AAGvB,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,cAAc,iBAAS;AAGjC,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,WAAW,cAAQ;AAG7B,IAAI,MAAM,gBAAgB,mBAAW;AAGrC,IAAI,MAAM,iBAAiB,WAAW;AACtC,IAAI,MAAM,iBAAiB,WAAW;AAEtC,IAAO,cAAQ;;;AmB1Df,SAAS,aAAAC,kBAA4C;AAqErD,SAAS,uBAAuB,UAAkB;AAEhD,QAAM,iBAAiB,SACpB,YAAY,EACZ,QAAQ,YAAY,GAAG,EACvB,QAAQ,eAAe,EAAE;AAC5B,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,GAAG,cAAc,IAAI,SAAS,IAAI,MAAM;AACjD;AAEA,IAAM,sBAAN,MAA0B;AAAA,EAChB,aAAqC,oBAAI,IAAI;AAAA,EAC7C,WAA0C,oBAAI,IAAI;AAAA,EAClD,UAAkD,oBAAI,IAAI;AAAA;AAAA,EAG1D,kBAAuC,oBAAI,IAAI;AAAA;AAAA,EAG/C,qBAAiD,oBAAI,IAAI;AAAA,EAEzD,eAA4C,oBAAI,IAAI;AAAA,EACpD,mBAAoD,oBAAI,IAAI;AAAA,EAC5D,iBAAgD,oBAAI,IAAI;AAAA;AAAA,EAGxD,sBAMJ,oBAAI,IAAI;AAAA;AAAA,EAGJ;AAAA;AAAA,EAOA,gBAAgB,kBAA8C;AACpE,QAAI,KAAK,WAAW,IAAI,gBAAgB,GAAG;AACzC,aAAO;AAAA,IACT;AACA,WAAO,KAAK,gBAAgB,IAAI,gBAAgB;AAAA,EAClD;AAAA;AAAA,EAGA,mBAAmB,YAAwC;AACzD,WAAO,KAAK,gBAAgB,IAAI,UAAU;AAAA,EAC5C;AAAA,EAEQ,gBAAgB,UAAoD;AAC1E,UAAM,iBAAsC,CAAC;AAC7C,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,gBAAqB;AACpD,aAAO,OAAO,gBAAgB,WAAW;AAAA,IAC3C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sCACJ,kBACsC;AACtC,UAAM,oBAAyC,CAAC;AAChD,UAAM,yBAAyB,kBAAkB;AAAA,MAAI,CAAC,eACpD,KAAK,mBAAmB,UAAU;AAAA,IACpC;AAEA,eAAW,CAAC,UAAU,MAAM,KAAK,KAAK,WAAW,QAAQ,GAAG;AAC1D,UAAI,oBAAoB,CAAC,wBAAwB,SAAS,QAAQ;AAChE;AACF,UAAI,KAAK,oBAAoB,QAAQ,MAAM,YAAa;AACxD,UAAI;AACF,cAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,cAAM,iBAAiB,KAAK,gBAAgB,QAAQ;AACpD,eAAO,OAAO,mBAAmB,cAAc;AAAA,MACjD,SAAS,OAAO;AACd,gBAAQ,KAAK,mCAAmC,QAAQ,KAAK,KAAK;AAAA,MACpE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,qBACJ,UACsC;AACtC,UAAM,KAAK,KAAK,gBAAgB,QAAQ;AACxC,QAAI,CAAC,IAAI;AACP,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AACA,UAAM,SAAS,KAAK,WAAW,IAAI,EAAE;AACrC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AAGA,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,WAAO,KAAK,gBAAgB,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,gBAAgB,UAAkB,cAAkC;AAExE,UAAM,UAAU,KAAK,mBAAmB,IAAI,QAAQ;AACpD,QAAI,SAAS;AACX,YAAM;AACN;AAAA,IACF;AAEA,UAAM,kBAAkB,YAAY;AAElC,UAAI,KAAK,KAAK,gBAAgB,IAAI,QAAQ;AAC1C,UAAI,CAAC,IAAI;AACP,aAAK,uBAAuB,QAAQ;AACpC,aAAK,gBAAgB,IAAI,UAAU,EAAE;AAAA,MACvC;AAGA,UAAI,KAAK,WAAW,IAAI,EAAE,EAAG;AAG7B,YAAM,aAAa,qBAAqB,YAAY;AACpD,UAAI,CAAC,WAAW,SAAS;AACvB,aAAK,SAAS,IAAI,IAAI,OAAO;AAC7B,cAAM,IAAI,MAAM,WAAW,MAAO,OAAO;AAAA,MAC3C;AAEA,WAAK,QAAQ,IAAI,IAAI,WAAW,MAAO;AACvC,WAAK,SAAS,IAAI,IAAI,YAAY;AAElC,YAAM,SAAS,IAAIC,WAAU;AAAA,QAC3B,IAAI,UAAU,EAAE;AAAA,QAChB,SAAS,EAAE,CAAC,EAAE,GAAG,WAAW,OAAQ;AAAA,MACtC,CAAC;AAED,UAAI;AAEF,cAAM,OAAO,SAAS;AACtB,aAAK,WAAW,IAAI,IAAI,MAAM;AAC9B,aAAK,SAAS,IAAI,IAAI,WAAW;AAGjC,YAAI,OAAO,aAAa,WAAW;AACjC,iBAAO,YAAY;AAAA,YACjB;AAAA,YACA,OAAO,uBAA2C;AAChD,qBAAO,MAAM,KAAK,yBAAyB,kBAAkB;AAAA,YAC/D;AAAA,UACF;AAAA,QACF;AAEA,cAAM,KAAK,wBAAwB,EAAE;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,SAAS,IAAI,IAAI,OAAO;AAC7B,YAAI;AACF,gBAAM,OAAO,WAAW;AAAA,QAC1B,QAAQ;AAAA,QAAC;AACT,aAAK,WAAW,OAAO,EAAE;AACzB,cAAM;AAAA,MACR;AAAA,IACF,GAAG,EAAE,QAAQ,MAAM;AACjB,WAAK,mBAAmB,OAAO,QAAQ;AAAA,IACzC,CAAC;AAED,SAAK,mBAAmB,IAAI,UAAU,cAAc;AACpD,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,qBAAqB,UAAiC;AAC1D,UAAM,KAAK,KAAK,gBAAgB,QAAQ;AACxC,QAAI,CAAC,GAAI;AAET,UAAM,SAAS,KAAK,WAAW,IAAI,EAAE;AACrC,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,OAAO,WAAW;AAAA,MAC1B,QAAQ;AAAA,MAAC;AAAA,IACX;AACA,SAAK,WAAW,OAAO,EAAE;AACzB,SAAK,SAAS,IAAI,IAAI,cAAc;AACpC,SAAK,gBAAgB,OAAO,QAAQ;AAGpC,eAAW,OAAO,MAAM,KAAK,KAAK,aAAa,KAAK,CAAC,GAAG;AACtD,YAAM,OAAO,KAAK,aAAa,IAAI,GAAG;AACtC,UAAI,KAAK,aAAa,GAAI,MAAK,aAAa,OAAO,GAAG;AAAA,IACxD;AACA,eAAW,OAAO,MAAM,KAAK,KAAK,iBAAiB,KAAK,CAAC,GAAG;AAC1D,YAAM,OAAO,KAAK,iBAAiB,IAAI,GAAG;AAC1C,UAAI,KAAK,aAAa,GAAI,MAAK,iBAAiB,OAAO,GAAG;AAAA,IAC5D;AACA,eAAW,OAAO,MAAM,KAAK,KAAK,eAAe,KAAK,CAAC,GAAG;AACxD,YAAM,OAAO,KAAK,eAAe,IAAI,GAAG;AACxC,UAAI,KAAK,aAAa,GAAI,MAAK,eAAe,OAAO,GAAG;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,oBAAoB,UAAoC;AACtD,UAAM,KAAK,KAAK,gBAAgB,QAAQ;AACxC,WAAO,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,iBAAiB;AAAA,EACxD;AAAA,EAEA,sBAGE;AACA,UAAMC,WAGF,CAAC;AAGL,eAAW,CAAC,cAAc,QAAQ,KAAK,KAAK,gBAAgB,QAAQ,GAAG;AACrE,MAAAA,SAAQ,YAAY,IAAI;AAAA,QACtB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK;AAAA,QACvC,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF;AACA,WAAOA;AAAA,EACT;AAAA,EAEA,MAAM,uBAAsC;AAC1C,UAAM,YAAY,MAAM,KAAK,KAAK,WAAW,KAAK,CAAC;AACnD,UAAM,QAAQ,IAAI,UAAU,IAAI,CAAC,OAAO,KAAK,wBAAwB,EAAE,CAAC,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAc,wBAAwB,UAAiC;AAErE,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,CAAC,OAAQ;AAGb,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,UAAM,iBAAiB,KAAK,gBAAgB,QAAQ;AAEpD,eAAW,CAAC,MAAMC,KAAI,KAAK,OAAO,QAAa,cAAc,GAAG;AAC9D,WAAK,aAAa,IAAI,GAAG,QAAQ,IAAI,IAAI,IAAI;AAAA,QAC3C;AAAA,QACA,aAAaA,MAAK;AAAA,QAClB,aAAaA,MAAK;AAAA,QAClB,cAAeA,MAAa;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,iBAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAa,GAAG,GAAG;AAC/C,mBAAW,KAAK,MAAe;AAC7B,eAAK,iBAAiB,IAAI,GAAG,QAAQ,IAAI,EAAE,GAAG,IAAI;AAAA,YAChD,KAAK,EAAE;AAAA,YACP,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,UAAU,EAAE;AAAA,YACZ;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAC;AAGT,QAAI;AACF,YAAMC,WAAU,MAAM,OAAO,QAAQ,KAAK;AAC1C,iBAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAaA,QAAO,GAAG;AACnD,mBAAW,KAAK,MAAe;AAC7B,eAAK,eAAe,IAAI,GAAG,QAAQ,IAAI,EAAE,IAAI,IAAI;AAAA,YAC/C,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,WAAW,EAAE;AAAA,YACb;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,oBAAsC;AACpC,WAAO,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC;AAAA,EAC9C;AAAA,EAEA,wBAA8C;AAC5C,WAAO,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC;AAAA,EAClD;AAAA,EAEA,sBAAsB,UAAwC;AAC5D,UAAM,KAAK,KAAK,gBAAgB,QAAQ;AACxC,QAAI,CAAC,GAAI,QAAO,CAAC;AACjB,WAAO,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC,EAAE;AAAA,MAChD,CAAC,MAAM,EAAE,aAAa;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,sBAA0C;AACxC,WAAO,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC;AAAA,EAChD;AAAA,EAEA,oBAAoB,UAAsC;AACxD,UAAM,KAAK,KAAK,gBAAgB,QAAQ;AACxC,QAAI,CAAC,GAAI,QAAO,CAAC;AACjB,WAAO,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,EAAE;AAAA,MAC9C,CAAC,MAAM,EAAE,aAAa;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,UACA,aAAkC,CAAC,GACd;AAErB,QAAI,WAAW;AACf,QAAI,OAAO;AAEX,QAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,YAAM,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,KAAK,CAAC;AACtC,iBAAW,KAAK,gBAAgB,GAAG,KAAK;AACxC,aAAO;AAAA,IACT,OAAO;AAEL,iBAAWD,SAAQ,KAAK,aAAa,OAAO,GAAG;AAC7C,YAAIA,MAAK,SAAS,UAAU;AAC1B,qBAAWA,MAAK;AAChB,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,UAAU;AACb,iBAAW,CAAC,gBAAgBE,OAAM,KAAK,KAAK,WAAW,QAAQ,GAAG;AAChE,YAAI;AACF,gBAAMC,YAAW,MAAMD,QAAO,YAAY;AAC1C,gBAAME,kBAAiB,KAAK,gBAAgBD,SAAQ;AAEpD,cAAIC,gBAAe,QAAQ,GAAG;AAC5B,uBAAW;AACX,mBAAO;AACP;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,2CAA2C,QAAQ,EAAE;AAAA,IACvE;AAEA,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAGnE,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,UAAM,iBAAiB,KAAK,gBAAgB,QAAQ;AAEpD,UAAMJ,QAAO,eAAe,IAAI;AAChC,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,SAAS,IAAI,0BAA0B,QAAQ,GAAG;AAIpE,UAAM,SAAeA,MAAa;AAClC,UAAM,qBACJ,UACA,OAAO,WAAW,YACjB,OAAe,cAChB,OAAO,UAAU,eAAe;AAAA,MAC7B,OAAe;AAAA,MAChB;AAAA,IACF;AACF,UAAM,kBACJ,sBACC,UACC,MAAM,QAAS,OAAe,QAAQ,KACrC,OAAe,SAAS,SAAS,SAAS;AAE/C,UAAM,iBAAiB,EAAE,SAAS,cAAc,CAAC,EAAE;AACnD,UAAM,SAAS,cAAc,CAAC;AAC9B,UAAM,WAAW,kBACb,CAAC,gBAAgB,MAAM,IACvB,CAAC,QAAQ,cAAc;AAE3B,QAAI,YAAiB;AACrB,eAAW,QAAQ,UAAU;AAC3B,UAAI;AACF,gBAAQ,IAAI,QAAQ,IAAI;AACxB,cAAM,SAAS,MAAMA,MAAK,QAAQ,IAAI;AAGtC,YAAI,UAAU,OAAO,SAAS;AAC5B,gBAAM,YACJ,OAAO,WAAW,OAAO,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,EAAE,OACrD,OAAO,QAAQ,CAAC,EAAE,OAClB;AACN,gBAAM,IAAI,MAAM,SAAS;AAAA,QAC3B;AAEA,eAAO,EAAE,OAAO;AAAA,MAClB,SAAS,KAAU;AACjB,oBAAY;AAAA,MACd;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,YACJ,aACA,UAC0B;AAE1B,QAAI,MAAM;AACV,UAAM,mBAAmB,KAAK,gBAAgB,QAAQ;AAEtD,QAAI,CAAC,kBAAkB;AACrB,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AAEA,UAAM,SAAS,KAAK,WAAW,IAAI,gBAAgB;AACnD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,yBAAyB;AACtD,UAAM,UAAU,MAAM,OAAO,UAAU,KAAK,kBAAkB,GAAG;AACjE,WAAO,EAAE,UAAU,SAAS,YAAY,CAAC,EAAE;AAAA,EAC7C;AAAA,EAEA,MAAM,UACJ,YACA,UACA,MACuB;AACvB,UAAM,mBAAmB,KAAK,gBAAgB,QAAQ;AAEtD,QAAI,CAAC,kBAAkB;AACrB,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AAEA,UAAM,SAAS,KAAK,WAAW,IAAI,gBAAgB;AACnD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,yBAAyB;AACtD,UAAM,UAAU,MAAM,OAAO,QAAQ,IAAI;AAAA,MACvC,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,MAAM,QAAQ,CAAC;AAAA,IACjB,CAAC;AACD,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,yBACZ,oBAC8B;AAC9B,UAAM,YAAY,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAGjF,WAAO,IAAI,QAA6B,CAACK,UAAS,WAAW;AAC3D,WAAK,oBAAoB,IAAI,WAAW,EAAE,SAAAA,UAAS,OAAO,CAAC;AAG3D,UAAI,KAAK,qBAAqB;AAC5B,aAAK,oBAAoB;AAAA,UACvB;AAAA,UACA,SAAS,mBAAmB;AAAA,UAC5B,QAAQ,mBAAmB;AAAA,QAC7B,CAAC,EACE,KAAKA,QAAO,EACZ,MAAM,MAAM;AAAA,MACjB,OAAO;AAEL,cAAM,QAAQ,IAAI,MAAM,sBAAsB;AAC9C,QAAC,MAAc,qBAAqB;AAAA,UAClC;AAAA,UACA,SAAS,mBAAmB;AAAA,UAC5B,QAAQ,mBAAmB;AAAA,QAC7B;AACA,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,qBACE,WACA,UACS;AACT,UAAM,UAAU,KAAK,oBAAoB,IAAI,SAAS;AACtD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,QAAQ,QAAQ;AACxB,SAAK,oBAAoB,OAAO,SAAS;AACzC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,yBAME;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,uBACE,UAKM;AACN,SAAK,sBAAsB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,2BAAiC;AAC/B,SAAK,sBAAsB;AAAA,EAC7B;AACF;;;ApB/kBA,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,QAAQ,UAAU;AAiBpC,SAAS,OAAO,SAAiB,OAAgB;AAC/C,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAC9D,QAAM,QAAQ,YAAY;AAE1B,UAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AACzC,MAAI,OAAO;AACT,UAAM,eAAe,KAAK,OAAO,QAAQ,MAAM,SAAS,KAAK,CAAC;AAC9D,YAAQ;AAAA,MACN,WACE,IAAI,OAAO,YAAY,IACvB,QACA,IAAI,OAAO,QAAQ,MAAM,SAAS,YAAY,IAC9C;AAAA,IACJ;AACA,YAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AAAA,EAC3C;AAEA,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,UAAU,QAAQ,KAAK,SAAS;AACtC,YAAQ,IAAI,YAAO,OAAO,IAAI,OAAO,OAAO,IAAI,SAAI;AAAA,EACtD,CAAC;AAED,UAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AAC3C;AASA,SAAS,sBAAsB;AAE7B,QAAM,aAAa,QAAQ,IAAI;AAC/B,MAAI,YAAY;AACd,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,UAAU;AACpC,cAAQ,IAAI,uBAAuB,MAAM;AACzC,UAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS,GAAG;AAElE,cAAMC,WAAU,OAAO,QAAQ,OAAO,UAAU,EAAE;AAAA,UAChD,CAAC,CAAC,MAAM,YAAY,OAAsB;AAAA,YACxC;AAAA,YACA,MAAM,aAAa,QAAQ;AAAA;AAAA,YAC3B,SAAS,aAAa;AAAA,YACtB,MAAM,aAAa,QAAQ,CAAC;AAAA,YAC5B,KAAK,aAAa,OAAO,CAAC;AAAA,YAC1B,KAAK,aAAa;AAAA;AAAA,UACpB;AAAA,QACF;AACA,gBAAQ,IAAI,wBAAwBA,QAAO;AAG3C,cAAM,oBAAoB,QAAQ,IAAI;AACtC,gBAAQ;AAAA,UACN;AAAA,UACA,qBAAqB;AAAA,QACvB;AAEA,eAAO;AAAA,UACL,SAAAA;AAAA,UACA,mBAAmB,qBAAqB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AAAA,IACzD;AAAA,EACF;AAGA,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,IAAI;AAC/B,QAAM,OAAO,aAAa,KAAK,MAAM,UAAU,IAAI,CAAC;AAEpD,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA,MAAM;AAAA;AAAA,QACN,KAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAI;AACF,UAAQ;AACV,QAAQ;AAAC;AAET,IAAM,MAAM,IAAIC,OAAK;AAGrB,IAAM,UACJ,QAAQ,IAAI,aAAa,eACrB,oBACA;AAMN,IAAI,UAAU;AACd,IACE,QAAQ,IAAI,iBAAiB,UAC7B,QAAQ,IAAI,yBACZ;AACA,YAAU,KAAK,QAAQ,IAAI,yBAAyB,OAAO;AAC7D,OAAO;AACL,QAAM,cAAc,QAAQ,WAAW,MAAM,IAAI;AACjD,QAAM,iBAAiB,KAAK,aAAa,OAAO;AAChD,MAAI,WAAW,cAAc,GAAG;AAC9B,cAAU;AAAA,EACZ;AACF;AAEA,OAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAG/B,IAAI,CAAC,QAAQ,IAAI,iBAAiB;AAChC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAGA,IAAM,sBAAsB,IAAI,oBAAoB;AAGpD,IAAI,IAAI,KAAK,OAAO,GAAG,SAAS;AAC9B,IAAE,sBAAsB;AACxB,QAAM,KAAK;AACb,CAAC;AAGD,IAAI,IAAI,KAAK,OAAO,CAAC;AAErB,IAAM,aAAa,QAAQ,IAAI,QAAQ;AACvC,IAAM,cAAc;AAAA,EAClB,oBAAoB,UAAU;AAAA,EAC9B;AAAA;AACF;AAEA,IAAI;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AACH;AAGA,IAAI,MAAM,YAAY,WAAS;AAK/B,IAAI,QAAQ,gBAAgB,CAAC,MAAM;AACjC,SAAO,EAAE,KAAK,MAAM,KAAK;AAAA,IACvB,+BAA+B;AAAA,IAC/B,gCAAgC;AAAA,IAChC,gCACE;AAAA,IACF,0BAA0B;AAAA,IAC1B,MAAM;AAAA,EACR,CAAC;AACH,CAAC;AAED,IAAI,KAAK,gBAAgB,OAAO,MAAM;AACpC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,UAAM,YACJ,IAAI,aAAa,IAAI,WAAW,KAAK,IAAI,aAAa,IAAI,KAAK,KAAK;AACtE,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;AAAA,IACnD;AACA,UAAM,UAAU,iBAAiB,kBAAkB,SAAS;AAC5D,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;AAAA,IACnD;AACA,UAAM,QAAQ,iBAAiB,IAAI,QAAQ,aAAa;AACxD,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,IACvD;AAGA,QAAI,WAAW;AACf,QAAI;AACF,iBAAW,MAAM,EAAE,IAAI,KAAK;AAAA,IAC9B,QAAQ;AAAA,IAAC;AACT,UAAM,UAAU,IAAI,QAAQ;AAC5B,MAAE,IAAI,IAAI,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAClC,YAAM,MAAM,EAAE,YAAY;AAC1B,UACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,GAAG;AAEd;AACF,cAAQ,IAAI,GAAG,CAAC;AAAA,IAClB,CAAC;AACD,QAAI,MAAM,eAAe;AACvB,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AACxD,cAAM,MAAM,EAAE,YAAY;AAC1B,YACE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,SAAS,GAAG;AAEd;AACF,YAAI,QAAQ,mBAAmB,QAAQ,IAAI,eAAe,EAAG;AAC7D,gBAAQ,IAAI,GAAG,CAAC;AAAA,MAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM;AAAA,QACJ,IAAI,QAAQ,QAAQ,KAAK,EAAE,QAAQ,QAAQ,SAAS,MAAM,SAAS,CAAC;AAAA,MACtE;AAAA,IACF,QAAQ;AAAA,IAAC;AAET,WAAO,EAAE,KAAK,YAAY,KAAK;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,iCAAiC;AAAA,IACnC,CAAC;AAAA,EACH,SAAS,GAAQ;AACf,WAAO,EAAE;AAAA,MACP,KAAK,UAAU,EAAE,OAAO,GAAG,WAAW,gBAAgB,CAAC;AAAA,MACvD;AAAA,MACA;AAAA,QACE,gBAAgB;AAAA,QAChB,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,IAAI,IAAI,WAAW,CAAC,MAAM;AACxB,SAAO,EAAE,KAAK,EAAE,QAAQ,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AACrE,CAAC;AAGD,IAAI,IAAI,uBAAuB,CAAC,MAAM;AACpC,QAAM,YAAY,oBAAoB;AACtC,SAAO,EAAE,KAAK,EAAE,QAAQ,UAAU,CAAC;AACrC,CAAC;AAGD,IAAI,QAAQ,IAAI,aAAa,cAAc;AAEzC,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACnD,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACnD,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACnD,MAAI,IAAI,WAAW,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACpD,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AAGnD,MAAI,IAAI,MAAM,YAAY,EAAE,MAAM,gBAAgB,CAAC,CAAC;AAGpD,MAAI,IAAI,KAAK,OAAO,MAAM;AACxB,UAAM,OAAO,EAAE,IAAI;AAEnB,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,aAAO,EAAE,SAAS;AAAA,IACpB;AAEA,UAAM,YAAY,KAAK,QAAQ,IAAI,GAAG,QAAQ,UAAU,YAAY;AACpE,QAAI,cAAc,aAAa,WAAW,OAAO;AAGjD,UAAM,YAAY,oBAAoB;AACtC,QAAI,WAAW;AACb,YAAM,eAAe,mCAAmC,KAAK,UAAU,SAAS,CAAC;AACjF,oBAAc,YAAY,QAAQ,WAAW,GAAG,YAAY,SAAS;AAAA,IACvE;AAEA,WAAO,EAAE,KAAK,WAAW;AAAA,EAC3B,CAAC;AACH,OAAO;AAEL,MAAI,IAAI,KAAK,CAAC,MAAM;AAClB,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,oBAAoB,UAAU;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAGhD,IAAM,WACJ,QAAQ,IAAI,aAAa,eAAe,cAAc;AACxD,OAAO,UAAU,QAAQ,IAAI,IAAI,IAAI,8BAAuB;AAG5D,IAAM,SAAS,MAAM;AAAA,EACnB,OAAO,IAAI;AAAA,EACX;AAAA,EACA,UAAU;AAAA;AACZ,CAAC;AAGD,QAAQ,GAAG,UAAU,MAAM;AACzB,UAAQ,IAAI,yCAAkC;AAC9C,SAAO,MAAM;AACb,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,QAAQ,GAAG,WAAW,MAAM;AAC1B,UAAQ,IAAI,yCAAkC;AAC9C,SAAO,MAAM;AACb,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,IAAO,gBAAQ;","names":["Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","Hono","resolve","mcp","tool","Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","zodToJsonSchema","options","fallbackConfig","tools","tool","zodToJsonSchema","Hono","tool","TextEncoder","resolve","response","Hono","tools","Hono","tool","tools","Hono","Hono","zodToJsonSchema","Hono","mcp","tools","tool","zodToJsonSchema","resources","prompts","Hono","Hono","Hono","z","zodToJsonSchema","tools","resources","prompts","Hono","Hono","MCPClient","MCPClient","servers","tool","prompts","client","toolsets","flattenedTools","resolve","servers","Hono"]}
|