@mcpjam/inspector 0.9.61 → 0.9.63
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/.env.production +1 -0
- package/dist/client/assets/index-BRIJqWuS.js +1859 -0
- package/dist/client/assets/index-CWv_DY46.css +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/index.js +7141 -699
- package/dist/server/index.js.map +1 -1
- package/package.json +4 -1
- package/dist/client/assets/index-B-6IFHCF.css +0 -1
- package/dist/client/assets/index-BukehDzl.js +0 -1864
- package/dist/client/assets/index-BukehDzl.js.map +0 -1
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/sentry.ts","../../shared/sentry-config.ts","../../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 * as Sentry from \"@sentry/node\";\nimport { serverSentryConfig } from \"../shared/sentry-config\";\n\n/**\n * Initialize Sentry for the Hono server.\n * This should be imported at the very top of server/index.ts before any other imports.\n */\nSentry.init(serverSentryConfig);\n","const baseSentryConfig = {\n environment: process.env.NODE_ENV || \"development\",\n sendDefaultPii: false,\n tracesSampleRate: 0.1,\n tracePropagationTargets: [\n \"localhost\",\n /^\\//, // All relative URLs (includes /api/*, /sse/message, /health, etc.)\n /^https?:\\/\\/[^/]*\\.convex\\.(cloud|site)/, // Convex backend\n ],\n};\n\nexport const electronSentryConfig = {\n ...baseSentryConfig,\n dsn: \"https://6a41a208e72267f181f66c47138f2b9d@o4510109778378752.ingest.us.sentry.io/4510112190431232\",\n};\nexport const serverSentryConfig = {\n ...baseSentryConfig,\n dsn: \"https://ec309069e18ebe1d0be9088fa7bf56d9@o4510109778378752.ingest.us.sentry.io/4510112186433536\",\n};\nexport const clientSentryConfig = {\n ...baseSentryConfig,\n dsn: \"https://c9df3785c734acfe9dad2d0c1e963e28@o4510109778378752.ingest.us.sentry.io/4510111435063296\",\n replaysSessionSampleRate: 0.1, // Session replay sample rate\n replaysOnErrorSampleRate: 1.0, // Always capture replay on error\n};\n","import \"./sentry\";\nimport * as Sentry from \"@sentry/node\";\n\nimport { serve } from \"@hono/node-server\";\nimport dotenv from \"dotenv\";\nimport fixPath from \"fix-path\";\nimport { Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\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().onError((err, c) => {\n console.error(\"Unhandled error:\", err);\n\n // Report all unhandled errors to Sentry (including HTTPExceptions)\n Sentry.captureException(err);\n\n // Return appropriate response\n if (err instanceof HTTPException) {\n return err.getResponse();\n }\n\n return c.json({ error: \"Internal server error\" }, 500);\n});\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":"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","names":["Sentry","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","init","tools","Hono","tool","tools","Hono","Hono","zodToJsonSchema","Hono","mcp","tools","tool","zodToJsonSchema","resources","prompts","Hono","Hono","init","Hono","z","zodToJsonSchema","tools","resources","prompts","Hono","Hono","MCPClient","MCPClient","servers","tool","prompts","client","toolsets","flattenedTools","resolve","servers","Hono"]}
|
|
1
|
+
{"version":3,"sources":["../../server/sentry.ts","../../shared/sentry-config.ts","../../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","../../shared/types.ts","../../client/src/lib/chat-utils.ts","../../server/utils/chat-helpers.ts","../../shared/tools.ts","../../shared/http-tool-calls.ts","../../shared/backend-conversation.ts","../../server/routes/mcp/oauth.ts","../../server/routes/mcp/export.ts","../../server/routes/mcp/interceptor.ts","../../server/services/interceptor-store.ts","../../server/routes/mcp/evals.ts","../../evals-cli/src/evals/runner.ts","../../node_modules/convex/src/index.ts","../../node_modules/convex/src/values/base64.ts","../../node_modules/convex/src/common/index.ts","../../node_modules/convex/src/values/value.ts","../../node_modules/convex/src/values/errors.ts","../../node_modules/convex/src/values/compare_utf8.ts","../../node_modules/convex/src/browser/logging.ts","../../node_modules/convex/src/server/functionName.ts","../../node_modules/convex/src/server/components/paths.ts","../../node_modules/convex/src/server/api.ts","../../node_modules/convex/src/browser/long.ts","../../node_modules/jwt-decode/build/esm/index.js","../../node_modules/convex/src/browser/sync/authentication_manager.ts","../../node_modules/convex/src/browser/http_client.ts","../../node_modules/convex/src/browser/simple_client.ts","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/stream.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/constants.js","../../node_modules/common/temp/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js","../../node_modules/common/temp/node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/index.js","../../node_modules/common/temp/node_modules/.pnpm/bufferutil@4.0.9/node_modules/bufferutil/fallback.js","../../node_modules/common/temp/node_modules/.pnpm/bufferutil@4.0.9/node_modules/bufferutil/index.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/buffer-util.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/limiter.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/permessage-deflate.js","../../node_modules/common/temp/node_modules/.pnpm/utf-8-validate@5.0.10/node_modules/utf-8-validate/fallback.js","../../node_modules/common/temp/node_modules/.pnpm/utf-8-validate@5.0.10/node_modules/utf-8-validate/index.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/validation.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/receiver.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/sender.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/event-target.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/extension.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/websocket.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/subprotocol.js","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/lib/websocket-server.js","../../node_modules/convex/src/browser/simple_client-node.ts","../../node_modules/common/temp/node_modules/.pnpm/ws@8.18.0_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ws/wrapper.mjs","../../evals-cli/node_modules/chalk/source/vendor/ansi-styles/index.js","../../evals-cli/node_modules/chalk/source/vendor/supports-color/index.js","../../evals-cli/node_modules/chalk/source/utilities.js","../../evals-cli/node_modules/chalk/source/index.js","../../evals-cli/src/utils/logger.ts","../../evals-cli/src/db/tests.ts","../../evals-cli/src/utils/validators.ts","../../evals-cli/src/utils/helpers.ts","../../evals-cli/src/evals/evaluator.ts","../../evals-cli/src/utils/user-id.ts","../../evals-cli/src/utils/hog.ts","../../server/utils/eval-transformer.ts","../../server/routes/mcp/http-adapters.ts","../../server/services/mcp-http-bridge.ts","../../server/services/mcpjam-client-manager.ts","../../server/utils/mcp-utils.ts"],"sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport { serverSentryConfig } from \"../shared/sentry-config\";\n\n/**\n * Initialize Sentry for the Hono server.\n * This should be imported at the very top of server/index.ts before any other imports.\n */\nSentry.init(serverSentryConfig);\n","const baseSentryConfig = {\n environment: process.env.NODE_ENV === \"production\" ? \"prod\" : \"dev\",\n sendDefaultPii: false,\n tracesSampleRate: 0.1,\n tracePropagationTargets: [\n \"localhost\",\n /^\\//, // All relative URLs (includes /api/*, /sse/message, /health, etc.)\n /^https?:\\/\\/[^/]*\\.convex\\.(cloud|site)/, // Convex backend\n ],\n};\n\nexport const electronSentryConfig = {\n ...baseSentryConfig,\n dsn: \"https://6a41a208e72267f181f66c47138f2b9d@o4510109778378752.ingest.us.sentry.io/4510112190431232\",\n};\nexport const serverSentryConfig = {\n ...baseSentryConfig,\n dsn: \"https://ec309069e18ebe1d0be9088fa7bf56d9@o4510109778378752.ingest.us.sentry.io/4510112186433536\",\n};\nexport const clientSentryConfig = {\n ...baseSentryConfig,\n dsn: \"https://c9df3785c734acfe9dad2d0c1e963e28@o4510109778378752.ingest.us.sentry.io/4510111435063296\",\n replaysSessionSampleRate: 0.1, // Session replay sample rate\n replaysOnErrorSampleRate: 1.0, // Always capture replay on error\n};\n","import \"./sentry\";\nimport * as Sentry from \"@sentry/node\";\n\nimport { serve } from \"@hono/node-server\";\nimport dotenv from \"dotenv\";\nimport fixPath from \"fix-path\";\nimport { Hono } from \"hono\";\nimport { HTTPException } from \"hono/http-exception\";\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().onError((err, c) => {\n console.error(\"Unhandled error:\", err);\n\n // Report all unhandled errors to Sentry (including HTTPExceptions)\n Sentry.captureException(err);\n\n // Return appropriate response\n if (err instanceof HTTPException) {\n return err.getResponse();\n }\n\n return c.json({ error: \"Internal server error\" }, 500);\n});\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 oauth from \"./oauth\";\nimport exporter from \"./export\";\nimport interceptor from \"./interceptor\";\nimport evals from \"./evals\";\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// Evals endpoint - run evaluations\nmcp.route(\"/evals\", evals);\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 isMCPJamProvidedModel,\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 { executeToolCallsFromMessages } from \"../../../shared/http-tool-calls\";\nimport {\n runBackendConversation,\n type BackendToolCallEvent,\n type BackendToolResultEvent,\n} from \"../../../shared/backend-conversation\";\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\n const emitToolCall = (call: BackendToolCallEvent) => {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name,\n parameters: call.params || {},\n timestamp: new Date().toISOString(),\n status: \"executing\",\n },\n });\n };\n\n const emitToolResult = (result: BackendToolResultEvent) => {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: result.result,\n error: result.error,\n timestamp: new Date().toISOString(),\n },\n });\n };\n\n await runBackendConversation({\n maxSteps: MAX_AGENT_STEPS,\n messageHistory,\n toolDefinitions: toolDefs,\n fetchBackend: async (payload) => {\n const data = await sendBackendRequest(\n baseUrl,\n authHeader,\n payload,\n streamingContext,\n );\n if (data && (!data.ok || !Array.isArray(data.messages))) {\n sendBackendErrorText(streamingContext);\n return null;\n }\n return data;\n },\n executeToolCalls: async (messages) => {\n await executeToolCallsFromMessages(messages, {\n tools: flatTools as any,\n });\n },\n handlers: {\n onAssistantText: (text) => {\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"text\",\n content: text,\n });\n },\n onToolCall: (call) => {\n emitToolCall(call);\n },\n onToolResult: (result) => {\n emitToolResult(result);\n },\n onStepComplete: ({ text, toolCalls, toolResults }) => {\n handleAgentStepFinish(\n streamingContext,\n text,\n toolCalls,\n toolResults.map((result) => ({\n result: result.result,\n error: result.error,\n })),\n false,\n );\n },\n },\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 isMCPJamProvidedModel(provider) &&\n 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","// Shared types between client and server\n\nimport { LogHandler } from \"@mastra/mcp\";\nimport { SSEClientTransportOptions } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { ClientCapabilities } from \"@modelcontextprotocol/sdk/types.js\";\n\n// Legacy server config (keeping for compatibility)\nexport interface ServerConfig {\n id: string;\n name: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n cwd?: string;\n}\n\n// Chat and messaging types\nexport interface ChatMessage {\n id: string;\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp: Date;\n attachments?: Attachment[];\n toolCalls?: ToolCall[];\n toolResults?: ToolResult[];\n metadata?: MessageMetadata;\n}\n\nexport interface ToolCall {\n id: string | number;\n name: string;\n parameters: Record<string, any>;\n timestamp: Date;\n status: \"pending\" | \"executing\" | \"completed\" | \"error\";\n result?: any;\n error?: string;\n}\n\nexport interface Attachment {\n id: string;\n name: string;\n url: string;\n contentType: string;\n size?: number;\n}\n\nexport interface ToolResult {\n id: string;\n toolCallId: string;\n result: any;\n error?: string;\n timestamp: Date;\n}\n\nexport interface MessageMetadata {\n createdAt: string;\n editedAt?: string;\n regenerated?: boolean;\n tokens?: {\n input: number;\n output: number;\n };\n}\n\nexport interface ChatState {\n messages: ChatMessage[];\n isLoading: boolean;\n error?: string;\n connectionStatus: \"connected\" | \"disconnected\" | \"connecting\";\n}\n\nexport interface ChatActions {\n sendMessage: (content: string, attachments?: Attachment[]) => Promise<void>;\n editMessage: (messageId: string, newContent: string) => Promise<void>;\n regenerateMessage: (messageId: string) => Promise<void>;\n deleteMessage: (messageId: string) => void;\n clearChat: () => void;\n stopGeneration: () => void;\n}\n\nexport interface MCPToolCall extends ToolCall {\n serverId: string;\n serverName: string;\n}\n\nexport interface MCPToolResult extends ToolResult {\n serverId: string;\n}\n\nexport type ChatStatus = \"idle\" | \"typing\" | \"streaming\" | \"error\";\n\nexport interface StreamingMessage {\n id: string;\n content: string;\n isComplete: boolean;\n}\n\n// Model definitions\nexport type ModelProvider =\n | \"anthropic\"\n | \"openai\"\n | \"ollama\"\n | \"deepseek\"\n | \"google\"\n | \"meta\";\n\n// Helper to check if a provider is MCPJam-provided (requires backend execution)\nexport const isMCPJamProvidedModel = (provider: ModelProvider): boolean => {\n const MCPJAM_PROVIDERS: ModelProvider[] = [\"meta\"];\n return MCPJAM_PROVIDERS.includes(provider);\n};\n\nexport interface ModelDefinition {\n id: Model | string;\n name: string;\n provider: ModelProvider;\n disabled?: boolean;\n disabledReason?: string;\n}\n\nexport enum Model {\n CLAUDE_OPUS_4_0 = \"claude-opus-4-0\",\n CLAUDE_SONNET_4_0 = \"claude-sonnet-4-0\",\n CLAUDE_3_7_SONNET_LATEST = \"claude-3-7-sonnet-latest\",\n CLAUDE_3_5_SONNET_LATEST = \"claude-3-5-sonnet-latest\",\n CLAUDE_3_5_HAIKU_LATEST = \"claude-3-5-haiku-latest\",\n GPT_4_1 = \"gpt-4.1\",\n GPT_4_1_MINI = \"gpt-4.1-mini\",\n GPT_4_1_NANO = \"gpt-4.1-nano\",\n GPT_4O = \"gpt-4o\",\n GPT_4O_MINI = \"gpt-4o-mini\",\n GPT_4_TURBO = \"gpt-4-turbo\",\n GPT_4 = \"gpt-4\",\n GPT_5 = \"gpt-5\",\n GPT_3_5_TURBO = \"gpt-3.5-turbo\",\n DEEPSEEK_CHAT = \"deepseek-chat\",\n DEEPSEEK_REASONER = \"deepseek-reasoner\",\n // Google Gemini models\n GEMINI_2_5_PRO = \"gemini-2.5-pro\",\n GEMINI_2_5_FLASH = \"gemini-2.5-flash\",\n GEMINI_2_5_FLASH_LITE = \"gemini-2.5-flash-lite\",\n GEMINI_2_0_FLASH_EXP = \"gemini-2.0-flash-exp\",\n GEMINI_1_5_PRO = \"gemini-1.5-pro\",\n GEMINI_1_5_PRO_002 = \"gemini-1.5-pro-002\",\n GEMINI_1_5_FLASH = \"gemini-1.5-flash\",\n GEMINI_1_5_FLASH_002 = \"gemini-1.5-flash-002\",\n GEMINI_1_5_FLASH_8B = \"gemini-1.5-flash-8b\",\n GEMINI_1_5_FLASH_8B_001 = \"gemini-1.5-flash-8b-001\",\n // Google Gemma models\n GEMMA_3_2B = \"gemma-3-2b\",\n GEMMA_3_9B = \"gemma-3-9b\",\n GEMMA_3_27B = \"gemma-3-27b\",\n GEMMA_2_2B = \"gemma-2-2b\",\n GEMMA_2_9B = \"gemma-2-9b\",\n GEMMA_2_27B = \"gemma-2-27b\",\n CODE_GEMMA_2B = \"codegemma-2b\",\n CODE_GEMMA_7B = \"codegemma-7b\",\n}\n\nexport const SUPPORTED_MODELS: ModelDefinition[] = [\n {\n id: Model.CLAUDE_OPUS_4_0,\n name: \"Claude Opus 4\",\n provider: \"anthropic\",\n },\n {\n id: Model.CLAUDE_SONNET_4_0,\n name: \"Claude Sonnet 4\",\n provider: \"anthropic\",\n },\n {\n id: Model.CLAUDE_3_7_SONNET_LATEST,\n name: \"Claude Sonnet 3.7\",\n provider: \"anthropic\",\n },\n {\n id: Model.CLAUDE_3_5_SONNET_LATEST,\n name: \"Claude Sonnet 3.5\",\n provider: \"anthropic\",\n },\n {\n id: Model.CLAUDE_3_5_HAIKU_LATEST,\n name: \"Claude Haiku 3.5\",\n provider: \"anthropic\",\n },\n { id: Model.GPT_4_1, name: \"GPT-4.1\", provider: \"openai\" },\n { id: Model.GPT_4_1_MINI, name: \"GPT-4.1 Mini\", provider: \"openai\" },\n { id: Model.GPT_4_1_NANO, name: \"GPT-4.1 Nano\", provider: \"openai\" },\n { id: Model.GPT_4O, name: \"GPT-4o\", provider: \"openai\" },\n { id: Model.GPT_4O_MINI, name: \"GPT-4o Mini\", provider: \"openai\" },\n { id: Model.DEEPSEEK_CHAT, name: \"DeepSeek Chat\", provider: \"deepseek\" },\n {\n id: Model.DEEPSEEK_REASONER,\n name: \"DeepSeek Reasoner\",\n provider: \"deepseek\",\n },\n // Google Gemini models (latest first)\n {\n id: Model.GEMINI_2_5_PRO,\n name: \"Gemini 2.5 Pro\",\n provider: \"google\",\n },\n {\n id: Model.GEMINI_2_5_FLASH,\n name: \"Gemini 2.5 Flash\",\n provider: \"google\",\n },\n {\n id: Model.GEMINI_2_0_FLASH_EXP,\n name: \"Gemini 2.0 Flash Experimental\",\n provider: \"google\",\n },\n {\n id: Model.GEMINI_1_5_PRO_002,\n name: \"Gemini 1.5 Pro 002\",\n provider: \"google\",\n },\n {\n id: Model.GEMINI_1_5_PRO,\n name: \"Gemini 1.5 Pro\",\n provider: \"google\",\n },\n {\n id: Model.GEMINI_1_5_FLASH_002,\n name: \"Gemini 1.5 Flash 002\",\n provider: \"google\",\n },\n {\n id: Model.GEMINI_1_5_FLASH,\n name: \"Gemini 1.5 Flash\",\n provider: \"google\",\n },\n {\n id: \"meta-llama/llama-3.3-70b-instruct\",\n name: \"Llama 3.3 70B (Free)\",\n provider: \"meta\",\n },\n];\n\n// Helper functions for models\nexport const getModelById = (id: string): ModelDefinition | undefined => {\n return SUPPORTED_MODELS.find((model) => model.id === id);\n};\n\nexport const isModelSupported = (id: string): boolean => {\n return SUPPORTED_MODELS.some((model) => model.id === id);\n};\n\n// MCP Server Definition Types\nexport type BaseServerOptions = {\n name?: string;\n logger?: LogHandler;\n timeout?: number;\n capabilities?: ClientCapabilities;\n enableServerLogs?: boolean;\n};\n\nexport type StdioServerDefinition = BaseServerOptions & {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n url?: never;\n requestInit?: never;\n eventSourceInit?: never;\n reconnectionOptions?: never;\n sessionId?: never;\n oauth?: never;\n};\n\nexport type HttpServerDefinition = BaseServerOptions & {\n url: URL;\n command?: never;\n args?: never;\n env?: never;\n requestInit?: StreamableHTTPClientTransportOptions[\"requestInit\"];\n eventSourceInit?: SSEClientTransportOptions[\"eventSourceInit\"];\n reconnectionOptions?: StreamableHTTPClientTransportOptions[\"reconnectionOptions\"];\n sessionId?: StreamableHTTPClientTransportOptions[\"sessionId\"];\n oauth?: any;\n};\n\nexport interface ServerFormData {\n name: string;\n type: \"stdio\" | \"http\";\n command?: string;\n args?: string[];\n url?: string;\n headers?: Record<string, string>;\n env?: Record<string, string>;\n useOAuth?: boolean;\n oauthScopes?: string[];\n clientId?: string;\n clientSecret?: string;\n}\n\nexport interface OauthTokens {\n client_id: string;\n client_secret: string;\n access_token: string;\n refresh_token: string;\n expires_in: number;\n scope: string;\n}\n\nexport interface OAuthTokens {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n}\n\nexport interface AuthSettings {\n serverUrl: string;\n tokens: OAuthTokens | null;\n isAuthenticating: boolean;\n error: string | null;\n statusMessage: StatusMessage | null;\n}\n\nexport interface StatusMessage {\n type: \"success\" | \"error\" | \"info\";\n message: string;\n}\n\nexport const DEFAULT_AUTH_SETTINGS: AuthSettings = {\n serverUrl: \"\",\n tokens: null,\n isAuthenticating: false,\n error: null,\n statusMessage: null,\n};\n\n// MCP Resource and Tool types\nexport interface MCPResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface MCPTool {\n name: string;\n description?: string;\n inputSchema: any;\n}\n\nexport interface MCPPrompt {\n name: string;\n description?: string;\n arguments?: Array<{\n name: string;\n description?: string;\n required?: boolean;\n }>;\n}\n\n// API Response types\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n}\n\nexport interface ConnectionTestResponse {\n success: boolean;\n error?: string;\n details?: string;\n}\n\nexport interface ChatStreamEvent {\n type:\n | \"text\"\n | \"tool_call\"\n | \"tool_result\"\n | \"elicitation_request\"\n | \"elicitation_complete\"\n | \"error\";\n content?: string;\n toolCall?: ToolCall;\n toolResult?: {\n id: string | number;\n toolCallId: string | number;\n result?: any;\n error?: string;\n timestamp: Date;\n };\n requestId?: string;\n message?: string;\n schema?: any;\n error?: string;\n timestamp?: Date;\n}\n\n// Server status types\nexport interface ServerStatus {\n status: \"ok\" | \"error\";\n timestamp: string;\n service?: string;\n}\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 type { ModelMessage, Tool } from \"ai\";\nimport { hasUnresolvedToolCalls } from \"./http-tool-calls\";\n\nexport type BackendFetchPayload = {\n tools: Tool[];\n messages: string;\n};\n\nexport type BackendFetchResponse = {\n ok?: boolean;\n messages?: ModelMessage[];\n [key: string]: unknown;\n};\n\nexport type BackendToolCallEvent = {\n name: string;\n params: unknown;\n};\n\nexport type BackendToolResultEvent = {\n toolName?: string;\n result: unknown;\n error?: unknown;\n};\n\nexport type BackendConversationHandlers = {\n onAssistantText?: (text: string) => void;\n onToolCall?: (call: BackendToolCallEvent) => void;\n onToolResult?: (result: BackendToolResultEvent) => void;\n onStepComplete?: (payload: {\n step: number;\n text: string;\n toolCalls: BackendToolCallEvent[];\n toolResults: BackendToolResultEvent[];\n }) => void;\n};\n\nexport type BackendConversationOptions = {\n maxSteps: number;\n messageHistory: ModelMessage[];\n toolDefinitions: Tool[];\n executeToolCalls: (messages: ModelMessage[]) => Promise<void>;\n fetchBackend: (\n payload: BackendFetchPayload,\n ) => Promise<BackendFetchResponse | null>;\n handlers?: BackendConversationHandlers;\n};\n\nexport type BackendConversationResult = {\n steps: number;\n messageHistory: ModelMessage[];\n};\n\nconst extractToolResultValue = (raw: unknown) => {\n if (\n raw &&\n typeof raw === \"object\" &&\n \"value\" in (raw as Record<string, unknown>)\n ) {\n return (raw as Record<string, unknown>).value;\n }\n\n return raw;\n};\n\nexport const runBackendConversation = async (\n options: BackendConversationOptions,\n): Promise<BackendConversationResult> => {\n const { handlers } = options;\n let step = 0;\n\n while (step < options.maxSteps) {\n const payload: BackendFetchPayload = {\n tools: options.toolDefinitions,\n messages: JSON.stringify(options.messageHistory),\n };\n const data = await options.fetchBackend(payload);\n\n if (!data || !data.ok || !Array.isArray(data.messages)) {\n break;\n }\n\n const iterationToolCalls: BackendToolCallEvent[] = [];\n const iterationToolResults: BackendToolResultEvent[] = [];\n let iterationText = \"\";\n\n for (const msg of data.messages) {\n options.messageHistory.push(msg);\n\n const content = (msg as any).content;\n if ((msg as any).role === \"assistant\" && Array.isArray(content)) {\n for (const item of content) {\n if (item?.type === \"text\" && typeof item.text === \"string\") {\n iterationText += item.text;\n handlers?.onAssistantText?.(item.text);\n } else if (item?.type === \"tool-call\") {\n const name = item.toolName ?? item.name;\n if (!name) {\n continue;\n }\n const params = item.input ?? item.parameters ?? item.args ?? {};\n const callEvent: BackendToolCallEvent = { name, params };\n iterationToolCalls.push(callEvent);\n handlers?.onToolCall?.(callEvent);\n }\n }\n }\n }\n\n const unresolved = hasUnresolvedToolCalls(options.messageHistory as any);\n\n if (unresolved) {\n const beforeLen = options.messageHistory.length;\n await options.executeToolCalls(options.messageHistory);\n const newMessages = options.messageHistory.slice(beforeLen);\n\n for (const msg of newMessages) {\n const content = (msg as any).content;\n if ((msg as any).role === \"tool\" && Array.isArray(content)) {\n for (const item of content) {\n if (item?.type === \"tool-result\") {\n const rawOutput =\n item.output ??\n item.result ??\n item.value ??\n item.data ??\n item.content;\n const resultEvent: BackendToolResultEvent = {\n toolName: item.toolName ?? item.name,\n result: extractToolResultValue(rawOutput),\n error: item.error,\n };\n iterationToolResults.push(resultEvent);\n handlers?.onToolResult?.(resultEvent);\n }\n }\n }\n }\n }\n\n step += 1;\n\n handlers?.onStepComplete?.({\n step,\n text: iterationText,\n toolCalls: iterationToolCalls,\n toolResults: iterationToolResults,\n });\n\n if (!unresolved) {\n break;\n }\n }\n\n return {\n steps: step,\n messageHistory: options.messageHistory,\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 { z } from \"zod\";\nimport { runEvalsWithAuth } from \"../../../evals-cli/src/evals/runner\";\nimport {\n transformServerConfigsToEnvironment,\n transformLLMConfigToLlmsConfig,\n} from \"../../utils/eval-transformer\";\nimport { ConvexHttpClient } from \"convex/browser\";\nimport \"../../types/hono\";\n\nconst evals = new Hono();\n\nconst RunEvalsRequestSchema = z.object({\n tests: z.array(\n z.object({\n title: z.string(),\n query: z.string(),\n runs: z.number().int().positive(),\n model: z.string(),\n provider: z.string(),\n expectedToolCalls: z.array(z.string()),\n judgeRequirement: z.string().optional(),\n advancedConfig: z\n .object({\n system: z.string().optional(),\n temperature: z.number().optional(),\n toolChoice: z.string().optional(),\n })\n .passthrough()\n .optional(),\n }),\n ),\n serverIds: z.array(z.string()).min(1, \"At least one server must be selected\"),\n llmConfig: z.object({\n provider: z.string(),\n apiKey: z.string(),\n }),\n convexAuthToken: z.string(),\n});\n\ntype RunEvalsRequest = z.infer<typeof RunEvalsRequestSchema>;\n\nevals.post(\"/run\", async (c) => {\n try {\n const body = await c.req.json();\n\n const validationResult = RunEvalsRequestSchema.safeParse(body);\n if (!validationResult.success) {\n return c.json(\n {\n error: \"Invalid request body\",\n details: validationResult.error.errors,\n },\n 400,\n );\n }\n\n const { tests, serverIds, llmConfig, convexAuthToken } =\n validationResult.data as RunEvalsRequest;\n\n const clientManager = c.mcpJamClientManager;\n\n const environment = transformServerConfigsToEnvironment(\n serverIds,\n clientManager,\n );\n const llms = transformLLMConfigToLlmsConfig(llmConfig);\n\n const convexUrl = process.env.CONVEX_URL;\n if (!convexUrl) {\n throw new Error(\"CONVEX_URL is not set\");\n }\n\n const convexHttpUrl = process.env.CONVEX_HTTP_URL;\n if (!convexHttpUrl) {\n throw new Error(\"CONVEX_HTTP_URL is not set\");\n }\n\n const convexClient = new ConvexHttpClient(convexUrl);\n convexClient.setAuth(convexAuthToken);\n\n runEvalsWithAuth(\n tests,\n environment,\n llms,\n convexClient,\n convexHttpUrl,\n convexAuthToken,\n ).catch((error) => {\n console.error(\"[Hono:Evals] Error running evals:\", error);\n });\n\n return c.json({\n success: true,\n message: \"Evals started successfully. Check the Evals tab for progress.\",\n });\n } catch (error) {\n console.error(\"Error in /evals/run:\", error);\n return c.json(\n {\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default evals;\n","import { MCPClient, MCPClientOptions } from \"@mastra/mcp\";\nimport { streamText, Tool, ToolChoice, ModelMessage, LanguageModel } from \"ai\";\nimport { ConvexHttpClient } from \"convex/browser\";\nimport { getUserIdFromApiKeyOrNull } from \"../db/user\";\nimport {\n createRunRecorder,\n createRunRecorderWithAuth,\n type SuiteConfig,\n type RunRecorder,\n type UsageTotals,\n} from \"../db/tests\";\nimport {\n convertMastraToolsToVercelTools,\n validateAndNormalizeMCPClientConfiguration,\n validateLlms,\n validateTestCase,\n LlmsConfig,\n TestCase,\n} from \"../utils/validators\";\nimport { createLlmModel, extractToolNamesAsArray } from \"../utils/helpers\";\nimport { Logger } from \"../utils/logger\";\nimport { evaluateResults } from \"./evaluator\";\nimport { getUserId } from \"../utils/user-id\";\nimport { hogClient } from \"../utils/hog\";\nimport { isMCPJamProvidedModel } from \"../../../shared/types\";\nimport { executeToolCallsFromMessages } from \"../../../shared/http-tool-calls\";\nimport {\n runBackendConversation,\n type BackendToolCallEvent,\n type BackendToolResultEvent,\n} from \"../../../shared/backend-conversation\";\n\nconst MAX_STEPS = 20;\n\ntype ToolMap = Record<string, Tool>;\ntype EvaluationResult = ReturnType<typeof evaluateResults>;\n\nconst accumulateTokenCount = (\n current: number | undefined,\n increment: number | undefined,\n): number | undefined => {\n if (typeof increment !== \"number\" || Number.isNaN(increment)) {\n return current;\n }\n\n return (current ?? 0) + increment;\n};\n\nconst ensureApiKeyIsValid = async (apiKey?: string) => {\n if (!apiKey) {\n return;\n }\n\n await getUserIdFromApiKeyOrNull(apiKey);\n};\n\nconst prepareSuite = async (\n validatedTests: TestCase[],\n mcpClientOptions: MCPClientOptions,\n validatedLlms: LlmsConfig,\n) => {\n const mcpClient = new MCPClient(mcpClientOptions);\n const availableTools = await mcpClient.getTools();\n const vercelTools = convertMastraToolsToVercelTools(availableTools);\n\n const serverNames = Object.keys(mcpClientOptions.servers);\n\n Logger.initiateTestMessage(\n serverNames.length,\n Object.keys(availableTools).length,\n serverNames,\n validatedTests.length,\n );\n\n return {\n validatedTests,\n validatedLlms,\n vercelTools,\n serverNames,\n mcpClient,\n };\n};\n\ntype RunIterationParams = {\n test: TestCase;\n runIndex: number;\n totalRuns: number;\n llms: LlmsConfig;\n tools: ToolMap;\n recorder: RunRecorder;\n testCaseId?: string;\n};\n\ntype RunIterationViaBackendParams = RunIterationParams & {\n convexUrl: string;\n authToken: string;\n};\n\nconst runIterationViaBackend = async ({\n test,\n runIndex,\n totalRuns,\n tools,\n recorder,\n testCaseId,\n convexUrl,\n authToken,\n}: RunIterationViaBackendParams): Promise<EvaluationResult> => {\n const { advancedConfig, query } = test;\n const { system } = advancedConfig ?? {};\n\n Logger.testRunStart({\n runNumber: runIndex + 1,\n totalRuns,\n provider: test.provider,\n model: test.model,\n temperature: advancedConfig?.temperature,\n });\n\n if (system) {\n Logger.conversation({ messages: [{ role: \"system\", content: system }] });\n }\n\n const userMessage: ModelMessage = {\n role: \"user\",\n content: query,\n };\n\n Logger.conversation({ messages: [userMessage] });\n\n const messageHistory: ModelMessage[] = [userMessage];\n const toolsCalled: string[] = [];\n\n const runStartedAt = Date.now();\n const iterationId = await recorder.startIteration({\n testCaseId,\n iterationNumber: runIndex + 1,\n startedAt: runStartedAt,\n });\n\n // Convert tools to serializable format for backend\n const toolDefs = Object.entries(tools).map(([name, tool]) => ({\n name,\n description: tool?.description,\n inputSchema: tool?.inputSchema,\n }));\n\n try {\n await runBackendConversation({\n maxSteps: MAX_STEPS,\n messageHistory,\n toolDefinitions: toolDefs,\n fetchBackend: async (payload) => {\n try {\n const res = await fetch(`${convexUrl}/streaming`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}),\n },\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) {\n console.error(`Backend request failed: ${res.statusText}`);\n return null;\n }\n\n const data = await res.json();\n\n if (!data?.ok || !Array.isArray(data.messages)) {\n console.error(\"Invalid response from backend\");\n return null;\n }\n\n return data;\n } catch (error) {\n console.error(\n `Backend fetch error: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n },\n executeToolCalls: async (messages) => {\n await executeToolCallsFromMessages(messages, {\n tools: tools as any,\n });\n },\n handlers: {\n onAssistantText: (text) => {\n Logger.conversation({\n messages: [{ role: \"assistant\", content: text }],\n });\n },\n onToolCall: (call: BackendToolCallEvent) => {\n toolsCalled.push(call.name);\n const parameters =\n call.params && typeof call.params === \"object\"\n ? (call.params as Record<string, unknown>)\n : {};\n Logger.streamToolCall(call.name, parameters);\n },\n onToolResult: (result: BackendToolResultEvent) => {\n Logger.streamToolResult(result.toolName ?? \"\", result.result);\n },\n },\n });\n } catch (error) {\n Logger.errorWithExit(\n `Backend execution error: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n\n const evaluation = evaluateResults(test.expectedToolCalls, toolsCalled);\n\n const usage: UsageTotals = {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n };\n\n await recorder.finishIteration({\n iterationId,\n passed: evaluation.passed,\n toolsCalled,\n usage,\n messages: messageHistory,\n });\n\n Logger.toolSummary({\n expected: evaluation.expectedToolCalls,\n actual: evaluation.toolsCalled,\n missing: evaluation.missing,\n unexpected: evaluation.unexpected,\n passed: evaluation.passed,\n });\n\n Logger.testRunResult({\n passed: evaluation.passed,\n durationMs: Date.now() - runStartedAt,\n usage: undefined,\n });\n\n return evaluation;\n};\n\nconst runIteration = async ({\n test,\n runIndex,\n totalRuns,\n llms,\n tools,\n recorder,\n testCaseId,\n}: RunIterationParams): Promise<EvaluationResult> => {\n const { provider, model, advancedConfig, query } = test;\n const { system, temperature, toolChoice } = advancedConfig ?? {};\n\n Logger.testRunStart({\n runNumber: runIndex + 1,\n totalRuns,\n provider,\n model,\n temperature,\n });\n\n if (system) {\n Logger.conversation({ messages: [{ role: \"system\", content: system }] });\n }\n\n const userMessage: ModelMessage = {\n role: \"user\",\n content: query,\n };\n\n Logger.conversation({ messages: [userMessage] });\n\n const messageHistory: ModelMessage[] = [userMessage];\n const toolsCalled: string[] = [];\n let inputTokensUsed: number | undefined;\n let outputTokensUsed: number | undefined;\n let totalTokensUsed: number | undefined;\n let stepCount = 0;\n\n const runStartedAt = Date.now();\n const iterationId = await recorder.startIteration({\n testCaseId,\n iterationNumber: runIndex + 1,\n startedAt: runStartedAt,\n });\n\n while (stepCount < MAX_STEPS) {\n let assistantStreaming = false;\n\n const streamResult = await streamText({\n model: createLlmModel(provider, model, llms) as LanguageModel,\n system,\n temperature,\n tools,\n toolChoice: toolChoice as ToolChoice<Record<string, Tool>> | undefined,\n messages: messageHistory,\n onChunk: async (chunk) => {\n switch (chunk.chunk.type) {\n case \"text-delta\":\n case \"reasoning-delta\": {\n if (!assistantStreaming) {\n Logger.beginStreamingMessage(\"assistant\");\n assistantStreaming = true;\n }\n Logger.appendStreamingText(chunk.chunk.text);\n break;\n }\n case \"tool-call\": {\n if (assistantStreaming) {\n Logger.finishStreamingMessage();\n assistantStreaming = false;\n }\n Logger.streamToolCall(chunk.chunk.toolName, chunk.chunk.input);\n break;\n }\n case \"tool-result\": {\n Logger.streamToolResult(chunk.chunk.toolName, chunk.chunk.output);\n break;\n }\n default:\n break;\n }\n },\n });\n\n await streamResult.consumeStream();\n\n if (assistantStreaming) {\n Logger.finishStreamingMessage();\n assistantStreaming = false;\n }\n\n const stepUsage = await streamResult.usage;\n const cumulativeUsage = await streamResult.totalUsage;\n\n inputTokensUsed = accumulateTokenCount(\n inputTokensUsed,\n stepUsage.inputTokens,\n );\n outputTokensUsed = accumulateTokenCount(\n outputTokensUsed,\n stepUsage.outputTokens,\n );\n\n const totalTokens = stepUsage.totalTokens ?? cumulativeUsage.totalTokens;\n totalTokensUsed = accumulateTokenCount(totalTokensUsed, totalTokens);\n\n const toolNamesForStep = extractToolNamesAsArray(\n await streamResult.toolCalls,\n );\n if (toolNamesForStep.length) {\n toolsCalled.push(...toolNamesForStep);\n }\n\n const responseMessages = ((await streamResult.response)?.messages ??\n []) as ModelMessage[];\n if (responseMessages.length) {\n messageHistory.push(...responseMessages);\n }\n\n stepCount++;\n\n const finishReason = await streamResult.finishReason;\n if (finishReason !== \"tool-calls\") {\n break;\n }\n }\n\n Logger.finishStreamingMessage();\n\n const evaluation = evaluateResults(test.expectedToolCalls, toolsCalled);\n\n const usage: UsageTotals = {\n inputTokens: inputTokensUsed,\n outputTokens: outputTokensUsed,\n totalTokens: totalTokensUsed,\n };\n\n await recorder.finishIteration({\n iterationId,\n passed: evaluation.passed,\n toolsCalled,\n usage,\n messages: messageHistory,\n });\n\n Logger.toolSummary({\n expected: evaluation.expectedToolCalls,\n actual: evaluation.toolsCalled,\n missing: evaluation.missing,\n unexpected: evaluation.unexpected,\n passed: evaluation.passed,\n });\n\n Logger.testRunResult({\n passed: evaluation.passed,\n durationMs: Date.now() - runStartedAt,\n usage:\n usage.inputTokens !== undefined ||\n usage.outputTokens !== undefined ||\n usage.totalTokens !== undefined\n ? usage\n : undefined,\n });\n\n return evaluation;\n};\n\ntype RunTestCaseParams = {\n test: TestCase;\n testIndex: number;\n llms: LlmsConfig;\n tools: ToolMap;\n recorder: RunRecorder;\n convexUrl?: string;\n authToken?: string;\n};\n\nconst runTestCase = async ({\n test,\n testIndex,\n llms,\n tools,\n recorder,\n convexUrl,\n authToken,\n}: RunTestCaseParams) => {\n const { runs, model, provider } = test;\n\n Logger.logTestGroupTitle(testIndex, test.title, provider, model);\n\n let passedRuns = 0;\n let failedRuns = 0;\n\n const testCaseId = await recorder.recordTestCase(test, testIndex);\n\n for (let runIndex = 0; runIndex < runs; runIndex++) {\n // Branch based on whether this is an MCPJam-provided model\n const usesBackend = isMCPJamProvidedModel(provider as any);\n\n const evaluation =\n usesBackend && convexUrl && authToken\n ? await runIterationViaBackend({\n test,\n runIndex,\n totalRuns: runs,\n llms,\n tools,\n recorder,\n testCaseId,\n convexUrl,\n authToken,\n })\n : await runIteration({\n test,\n runIndex,\n totalRuns: runs,\n llms,\n tools,\n recorder,\n testCaseId,\n });\n\n if (evaluation.passed) {\n passedRuns++;\n } else {\n failedRuns++;\n }\n }\n return { passedRuns, failedRuns };\n};\n\n// Shared core logic for running evals\nasync function runEvalSuiteCore(\n validatedTests: TestCase[],\n mcpClientOptions: MCPClientOptions,\n validatedLlms: LlmsConfig,\n recorder: RunRecorder,\n suiteStartedAt: number,\n convexUrl?: string,\n authToken?: string,\n) {\n const { vercelTools, serverNames, mcpClient } = await prepareSuite(\n validatedTests,\n mcpClientOptions,\n validatedLlms,\n );\n\n Logger.info(\n `[Suite prepared: ${validatedTests.length} tests, ${serverNames.length} servers`,\n );\n\n await recorder.ensureSuite();\n\n let passedRuns = 0;\n let failedRuns = 0;\n\n try {\n for (let index = 0; index < validatedTests.length; index++) {\n const test = validatedTests[index];\n if (!test) {\n continue;\n }\n Logger.info(\n `[Running test ${index + 1}/${validatedTests.length}: ${test.title}`,\n );\n const { passedRuns: casePassed, failedRuns: caseFailed } =\n await runTestCase({\n test,\n testIndex: index + 1,\n llms: validatedLlms,\n tools: vercelTools,\n recorder,\n convexUrl,\n authToken,\n });\n passedRuns += casePassed;\n failedRuns += caseFailed;\n }\n\n hogClient.capture({\n distinctId: getUserId(),\n event: \"evals suite complete\",\n properties: {\n environment: process.env.ENVIRONMENT,\n },\n });\n Logger.suiteComplete({\n durationMs: Date.now() - suiteStartedAt,\n passed: passedRuns,\n failed: failedRuns,\n });\n } finally {\n // Clean up the MCP client after all evals complete\n await mcpClient.disconnect();\n }\n}\n\nexport const runEvalsWithApiKey = async (\n tests: unknown,\n environment: unknown,\n llms: unknown,\n apiKey?: string,\n) => {\n const suiteStartedAt = Date.now();\n Logger.info(\"Starting eval suite with API key authentication\");\n await ensureApiKeyIsValid(apiKey);\n\n // prepareSuite is called inside runEvalSuiteCore, so we need to prepare config here\n const mcpClientOptions = validateAndNormalizeMCPClientConfiguration(\n environment,\n ) as MCPClientOptions;\n const validatedTests = validateTestCase(tests) as TestCase[];\n const validatedLlms = validateLlms(llms) as LlmsConfig;\n\n const serverNames = Object.keys(mcpClientOptions.servers);\n\n const suiteConfig: SuiteConfig = {\n tests: validatedTests,\n environment: { servers: serverNames },\n };\n\n const recorder = createRunRecorder(apiKey, suiteConfig);\n\n await runEvalSuiteCore(\n validatedTests,\n mcpClientOptions,\n validatedLlms,\n recorder,\n suiteStartedAt,\n );\n};\n\nexport const runEvalsWithAuth = async (\n tests: unknown,\n environment: unknown,\n llms: unknown,\n convexClient: ConvexHttpClient,\n convexUrl?: string,\n authToken?: string,\n) => {\n const suiteStartedAt = Date.now();\n Logger.info(\"Starting eval suite with session authentication\");\n\n // prepareSuite is called inside runEvalSuiteCore, so we need to prepare config here\n const mcpClientOptions = validateAndNormalizeMCPClientConfiguration(\n environment,\n ) as MCPClientOptions;\n const validatedTests = validateTestCase(tests) as TestCase[];\n const validatedLlms = validateLlms(llms) as LlmsConfig;\n\n const serverNames = Object.keys(mcpClientOptions.servers);\n\n const suiteConfig: SuiteConfig = {\n tests: validatedTests,\n environment: { servers: serverNames },\n };\n\n const recorder = createRunRecorderWithAuth(convexClient, suiteConfig);\n\n await runEvalSuiteCore(\n validatedTests,\n mcpClientOptions,\n validatedLlms,\n recorder,\n suiteStartedAt,\n convexUrl,\n authToken,\n );\n};\n","export const version = \"1.27.3\";\n","/*\nhttps://github.com/beatgammit/base64-js/blob/88957c9943c7e2a0f03cdf73e71d579e433627d3/index.js\nCopyright (c) 2014 Jameson Little\nThe MIT License (MIT)\n*/\n\n// Vendored because this library has no ESM build, and some environments\n// (SvelteKit) are happiest when all dependencies are ESM.\n\nvar lookup: string[] = [];\nvar revLookup: number[] = [];\nvar Arr = Uint8Array;\n\nvar code = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i];\n revLookup[code.charCodeAt(i)] = i;\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup[\"-\".charCodeAt(0)] = 62;\nrevLookup[\"_\".charCodeAt(0)] = 63;\n\nfunction getLens(b64: string) {\n var len = b64.length;\n\n if (len % 4 > 0) {\n throw new Error(\"Invalid string. Length must be a multiple of 4\");\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf(\"=\");\n if (validLen === -1) validLen = len;\n\n var placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4);\n\n return [validLen, placeHoldersLen];\n}\n\n// base64 is 4/3 + up to two characters of the original data\n/** @public */\nexport function byteLength(b64: string): number {\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen;\n}\n\nfunction _byteLength(_b64: string, validLen: number, placeHoldersLen: number) {\n return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen;\n}\n\n/** @public */\nexport function toByteArray(b64: string): Uint8Array {\n var tmp;\n var lens = getLens(b64);\n var validLen = lens[0];\n var placeHoldersLen = lens[1];\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen));\n\n var curByte = 0;\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0 ? validLen - 4 : validLen;\n\n var i;\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)];\n arr[curByte++] = (tmp >> 16) & 0xff;\n arr[curByte++] = (tmp >> 8) & 0xff;\n arr[curByte++] = tmp & 0xff;\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4);\n arr[curByte++] = tmp & 0xff;\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2);\n arr[curByte++] = (tmp >> 8) & 0xff;\n arr[curByte++] = tmp & 0xff;\n }\n\n return arr;\n}\n\nfunction tripletToBase64(num: number) {\n return (\n lookup[(num >> 18) & 0x3f] +\n lookup[(num >> 12) & 0x3f] +\n lookup[(num >> 6) & 0x3f] +\n lookup[num & 0x3f]\n );\n}\n\nfunction encodeChunk(uint8: Uint8Array, start: number, end: number) {\n var tmp;\n var output = [];\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xff0000) +\n ((uint8[i + 1] << 8) & 0xff00) +\n (uint8[i + 2] & 0xff);\n output.push(tripletToBase64(tmp));\n }\n return output.join(\"\");\n}\n\n/** @public */\nexport function fromByteArray(uint8: Uint8Array): string {\n var tmp;\n var len = uint8.length;\n var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes\n var parts = [];\n var maxChunkLength = 16383; // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(\n encodeChunk(\n uint8,\n i,\n i + maxChunkLength > len2 ? len2 : i + maxChunkLength,\n ),\n );\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1];\n parts.push(lookup[tmp >> 2] + lookup[(tmp << 4) & 0x3f] + \"==\");\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1];\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3f] +\n lookup[(tmp << 2) & 0x3f] +\n \"=\",\n );\n }\n\n return parts.join(\"\");\n}\n\nexport function fromByteArrayUrlSafeNoPadding(uint8: Uint8Array): string {\n return fromByteArray(uint8)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=/g, \"\");\n}\n","import type { Value } from \"../values/value.js\";\n\n/**\n * Validate that the arguments to a Convex function are an object, defaulting\n * `undefined` to `{}`.\n */\nexport function parseArgs(\n args: Record<string, Value> | undefined,\n): Record<string, Value> {\n if (args === undefined) {\n return {};\n }\n if (!isSimpleObject(args)) {\n throw new Error(\n `The arguments to a Convex function must be an object. Received: ${\n args as any\n }`,\n );\n }\n return args;\n}\n\nexport function validateDeploymentUrl(deploymentUrl: string) {\n // Don't use things like `new URL(deploymentUrl).hostname` since these aren't\n // supported by React Native's JS environment\n if (typeof deploymentUrl === \"undefined\") {\n throw new Error(\n `Client created with undefined deployment address. If you used an environment variable, check that it's set.`,\n );\n }\n if (typeof deploymentUrl !== \"string\") {\n throw new Error(\n `Invalid deployment address: found ${deploymentUrl as any}\".`,\n );\n }\n if (\n !(deploymentUrl.startsWith(\"http:\") || deploymentUrl.startsWith(\"https:\"))\n ) {\n throw new Error(\n `Invalid deployment address: Must start with \"https://\" or \"http://\". Found \"${deploymentUrl}\".`,\n );\n }\n\n // Most clients should connect to \".convex.cloud\". But we also support localhost and\n // custom custom. We validate the deployment url is a valid url, which is the most\n // common failure pattern.\n try {\n new URL(deploymentUrl);\n } catch {\n throw new Error(\n `Invalid deployment address: \"${deploymentUrl}\" is not a valid URL. If you believe this URL is correct, use the \\`skipConvexDeploymentUrlCheck\\` option to bypass this.`,\n );\n }\n\n // If a user uses .convex.site, this is very likely incorrect.\n if (deploymentUrl.endsWith(\".convex.site\")) {\n throw new Error(\n `Invalid deployment address: \"${deploymentUrl}\" ends with .convex.site, which is used for HTTP Actions. Convex deployment URLs typically end with .convex.cloud? If you believe this URL is correct, use the \\`skipConvexDeploymentUrlCheck\\` option to bypass this.`,\n );\n }\n}\n\n/**\n * Check whether a value is a plain old JavaScript object.\n */\nexport function isSimpleObject(value: unknown) {\n const isObject = typeof value === \"object\";\n const prototype = Object.getPrototypeOf(value);\n const isSimple =\n prototype === null ||\n prototype === Object.prototype ||\n // Objects generated from other contexts (e.g. across Node.js `vm` modules) will not satisfy the previous\n // conditions but are still simple objects.\n prototype?.constructor?.name === \"Object\";\n return isObject && isSimple;\n}\n","/**\n * Utilities for working with values stored in Convex.\n *\n * You can see the full set of supported types at\n * [Types](https://docs.convex.dev/using/types).\n * @module\n */\nimport * as Base64 from \"./base64.js\";\nimport { isSimpleObject } from \"../common/index.js\";\n\nconst LITTLE_ENDIAN = true;\n// This code is used by code that may not have bigint literals.\nconst MIN_INT64 = BigInt(\"-9223372036854775808\");\nconst MAX_INT64 = BigInt(\"9223372036854775807\");\nconst ZERO = BigInt(\"0\");\nconst EIGHT = BigInt(\"8\");\nconst TWOFIFTYSIX = BigInt(\"256\");\n\n/**\n * The type of JavaScript values serializable to JSON.\n *\n * @public\n */\nexport type JSONValue =\n | null\n | boolean\n | number\n | string\n | JSONValue[]\n | { [key: string]: JSONValue };\n\n/**\n * An identifier for a document in Convex.\n *\n * Convex documents are uniquely identified by their `Id`, which is accessible\n * on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/database/document-ids).\n *\n * Documents can be loaded using `db.get(id)` in query and mutation functions.\n *\n * IDs are base 32 encoded strings which are URL safe.\n *\n * IDs are just strings at runtime, but this type can be used to distinguish them from other\n * strings at compile time.\n *\n * If you're using code generation, use the `Id` type generated for your data model in\n * `convex/_generated/dataModel.d.ts`.\n *\n * @typeParam TableName - A string literal type of the table name (like \"users\").\n *\n * @public\n */\nexport type Id<TableName extends string> = string & { __tableName: TableName };\n\n/**\n * A value supported by Convex.\n *\n * Values can be:\n * - stored inside of documents.\n * - used as arguments and return types to queries and mutation functions.\n *\n * You can see the full set of supported types at\n * [Types](https://docs.convex.dev/using/types).\n *\n * @public\n */\nexport type Value =\n | null\n | bigint\n | number\n | boolean\n | string\n | ArrayBuffer\n | Value[]\n | { [key: string]: undefined | Value };\n\n/**\n * The types of {@link Value} that can be used to represent numbers.\n *\n * @public\n */\nexport type NumericValue = bigint | number;\n\nfunction isSpecial(n: number) {\n return Number.isNaN(n) || !Number.isFinite(n) || Object.is(n, -0);\n}\n\nexport function slowBigIntToBase64(value: bigint): string {\n // the conversion is easy if we pretend it's unsigned\n if (value < ZERO) {\n value -= MIN_INT64 + MIN_INT64;\n }\n let hex = value.toString(16);\n if (hex.length % 2 === 1) hex = \"0\" + hex;\n\n const bytes = new Uint8Array(new ArrayBuffer(8));\n let i = 0;\n for (const hexByte of hex.match(/.{2}/g)!.reverse()) {\n bytes.set([parseInt(hexByte, 16)], i++);\n value >>= EIGHT;\n }\n return Base64.fromByteArray(bytes);\n}\n\nexport function slowBase64ToBigInt(encoded: string): bigint {\n const integerBytes = Base64.toByteArray(encoded);\n if (integerBytes.byteLength !== 8) {\n throw new Error(\n `Received ${integerBytes.byteLength} bytes, expected 8 for $integer`,\n );\n }\n let value = ZERO;\n let power = ZERO;\n for (const byte of integerBytes) {\n value += BigInt(byte) * TWOFIFTYSIX ** power;\n power++;\n }\n if (value > MAX_INT64) {\n value += MIN_INT64 + MIN_INT64;\n }\n return value;\n}\n\nexport function modernBigIntToBase64(value: bigint): string {\n if (value < MIN_INT64 || MAX_INT64 < value) {\n throw new Error(\n `BigInt ${value} does not fit into a 64-bit signed integer.`,\n );\n }\n const buffer = new ArrayBuffer(8);\n new DataView(buffer).setBigInt64(0, value, true);\n return Base64.fromByteArray(new Uint8Array(buffer));\n}\n\nexport function modernBase64ToBigInt(encoded: string): bigint {\n const integerBytes = Base64.toByteArray(encoded);\n if (integerBytes.byteLength !== 8) {\n throw new Error(\n `Received ${integerBytes.byteLength} bytes, expected 8 for $integer`,\n );\n }\n const intBytesView = new DataView(integerBytes.buffer);\n return intBytesView.getBigInt64(0, true);\n}\n\n// Fall back to a slower version on Safari 14 which lacks these APIs.\nexport const bigIntToBase64 = (DataView.prototype as any).setBigInt64\n ? modernBigIntToBase64\n : slowBigIntToBase64;\nexport const base64ToBigInt = (DataView.prototype as any).getBigInt64\n ? modernBase64ToBigInt\n : slowBase64ToBigInt;\n\nconst MAX_IDENTIFIER_LEN = 1024;\n\nfunction validateObjectField(k: string) {\n if (k.length > MAX_IDENTIFIER_LEN) {\n throw new Error(\n `Field name ${k} exceeds maximum field name length ${MAX_IDENTIFIER_LEN}.`,\n );\n }\n if (k.startsWith(\"$\")) {\n throw new Error(`Field name ${k} starts with a '$', which is reserved.`);\n }\n for (let i = 0; i < k.length; i += 1) {\n const charCode = k.charCodeAt(i);\n // Non-control ASCII characters\n if (charCode < 32 || charCode >= 127) {\n throw new Error(\n `Field name ${k} has invalid character '${k[i]}': Field names can only contain non-control ASCII characters`,\n );\n }\n }\n}\n\n/**\n * Parse a Convex value from its JSON representation.\n *\n * This function will deserialize serialized Int64s to `BigInt`s, Bytes to `ArrayBuffer`s etc.\n *\n * To learn more about Convex values, see [Types](https://docs.convex.dev/using/types).\n *\n * @param value - The JSON representation of a Convex value previously created with {@link convexToJson}.\n * @returns The JavaScript representation of the Convex value.\n *\n * @public\n */\nexport function jsonToConvex(value: JSONValue): Value {\n if (value === null) {\n return value;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((value) => jsonToConvex(value));\n }\n if (typeof value !== \"object\") {\n throw new Error(`Unexpected type of ${value as any}`);\n }\n const entries = Object.entries(value);\n if (entries.length === 1) {\n const key = entries[0][0];\n if (key === \"$bytes\") {\n if (typeof value.$bytes !== \"string\") {\n throw new Error(`Malformed $bytes field on ${value as any}`);\n }\n return Base64.toByteArray(value.$bytes).buffer;\n }\n if (key === \"$integer\") {\n if (typeof value.$integer !== \"string\") {\n throw new Error(`Malformed $integer field on ${value as any}`);\n }\n return base64ToBigInt(value.$integer);\n }\n if (key === \"$float\") {\n if (typeof value.$float !== \"string\") {\n throw new Error(`Malformed $float field on ${value as any}`);\n }\n const floatBytes = Base64.toByteArray(value.$float);\n if (floatBytes.byteLength !== 8) {\n throw new Error(\n `Received ${floatBytes.byteLength} bytes, expected 8 for $float`,\n );\n }\n const floatBytesView = new DataView(floatBytes.buffer);\n const float = floatBytesView.getFloat64(0, LITTLE_ENDIAN);\n if (!isSpecial(float)) {\n throw new Error(`Float ${float} should be encoded as a number`);\n }\n return float;\n }\n if (key === \"$set\") {\n throw new Error(\n `Received a Set which is no longer supported as a Convex type.`,\n );\n }\n if (key === \"$map\") {\n throw new Error(\n `Received a Map which is no longer supported as a Convex type.`,\n );\n }\n }\n const out: { [key: string]: Value } = {};\n for (const [k, v] of Object.entries(value)) {\n validateObjectField(k);\n out[k] = jsonToConvex(v);\n }\n return out;\n}\n\nexport function stringifyValueForError(value: any) {\n return JSON.stringify(value, (_key, value) => {\n if (value === undefined) {\n // By default `JSON.stringify` converts undefined, functions, symbols,\n // Infinity, and NaN to null which produces a confusing error message.\n // We deal with `undefined` specifically because it's the most common.\n // Ideally we'd use a pretty-printing library that prints `undefined`\n // (no quotes), but it might not be worth the bundle size cost.\n return \"undefined\";\n }\n if (typeof value === \"bigint\") {\n // `JSON.stringify` throws on bigints by default.\n return `${value.toString()}n`;\n }\n return value;\n });\n}\n\nfunction convexToJsonInternal(\n value: Value,\n originalValue: Value,\n context: string,\n includeTopLevelUndefined: boolean,\n): JSONValue {\n if (value === undefined) {\n const contextText =\n context &&\n ` (present at path ${context} in original object ${stringifyValueForError(\n originalValue,\n )})`;\n throw new Error(\n `undefined is not a valid Convex value${contextText}. To learn about Convex's supported types, see https://docs.convex.dev/using/types.`,\n );\n }\n if (value === null) {\n return value;\n }\n if (typeof value === \"bigint\") {\n if (value < MIN_INT64 || MAX_INT64 < value) {\n throw new Error(\n `BigInt ${value} does not fit into a 64-bit signed integer.`,\n );\n }\n return { $integer: bigIntToBase64(value) };\n }\n if (typeof value === \"number\") {\n if (isSpecial(value)) {\n const buffer = new ArrayBuffer(8);\n new DataView(buffer).setFloat64(0, value, LITTLE_ENDIAN);\n return { $float: Base64.fromByteArray(new Uint8Array(buffer)) };\n } else {\n return value;\n }\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return { $bytes: Base64.fromByteArray(new Uint8Array(value)) };\n }\n if (Array.isArray(value)) {\n return value.map((value, i) =>\n convexToJsonInternal(value, originalValue, context + `[${i}]`, false),\n );\n }\n if (value instanceof Set) {\n throw new Error(\n errorMessageForUnsupportedType(context, \"Set\", [...value], originalValue),\n );\n }\n if (value instanceof Map) {\n throw new Error(\n errorMessageForUnsupportedType(context, \"Map\", [...value], originalValue),\n );\n }\n\n if (!isSimpleObject(value)) {\n const theType = value?.constructor?.name;\n const typeName = theType ? `${theType} ` : \"\";\n throw new Error(\n errorMessageForUnsupportedType(context, typeName, value, originalValue),\n );\n }\n\n const out: { [key: string]: JSONValue } = {};\n const entries = Object.entries(value);\n entries.sort(([k1, _v1], [k2, _v2]) => (k1 === k2 ? 0 : k1 < k2 ? -1 : 1));\n for (const [k, v] of entries) {\n if (v !== undefined) {\n validateObjectField(k);\n out[k] = convexToJsonInternal(v, originalValue, context + `.${k}`, false);\n } else if (includeTopLevelUndefined) {\n validateObjectField(k);\n out[k] = convexOrUndefinedToJsonInternal(\n v,\n originalValue,\n context + `.${k}`,\n );\n }\n }\n return out;\n}\n\nfunction errorMessageForUnsupportedType(\n context: string,\n typeName: string,\n value: any,\n originalValue: any,\n) {\n if (context) {\n return `${typeName}${stringifyValueForError(\n value,\n )} is not a supported Convex type (present at path ${context} in original object ${stringifyValueForError(\n originalValue,\n )}). To learn about Convex's supported types, see https://docs.convex.dev/using/types.`;\n } else {\n return `${typeName}${stringifyValueForError(\n value,\n )} is not a supported Convex type.`;\n }\n}\n\n// convexOrUndefinedToJsonInternal wrapper exists so we can pipe through the\n// `originalValue` and `context` through for better error messaging.\nfunction convexOrUndefinedToJsonInternal(\n value: Value | undefined,\n originalValue: Value | undefined,\n context: string,\n): JSONValue {\n if (value === undefined) {\n return { $undefined: null };\n } else {\n if (originalValue === undefined) {\n // This should not happen.\n throw new Error(\n `Programming error. Current value is ${stringifyValueForError(\n value,\n )} but original value is undefined`,\n );\n }\n return convexToJsonInternal(value, originalValue, context, false);\n }\n}\n\n/**\n * Convert a Convex value to its JSON representation.\n *\n * Use {@link jsonToConvex} to recreate the original value.\n *\n * To learn more about Convex values, see [Types](https://docs.convex.dev/using/types).\n *\n * @param value - A Convex value to convert into JSON.\n * @returns The JSON representation of `value`.\n *\n * @public\n */\nexport function convexToJson(value: Value): JSONValue {\n return convexToJsonInternal(value, value, \"\", false);\n}\n\n// Convert a Convex value or `undefined` into its JSON representation.\n// `undefined` is used in filters to represent a missing object field.\nexport function convexOrUndefinedToJson(value: Value | undefined): JSONValue {\n return convexOrUndefinedToJsonInternal(value, value, \"\");\n}\n\n/**\n * Similar to convexToJson but also serializes top level undefined fields\n * using convexOrUndefinedToJson().\n *\n * @param value - A Convex value to convert into JSON.\n * @returns The JSON representation of `value`.\n */\nexport function patchValueToJson(value: Value): JSONValue {\n return convexToJsonInternal(value, value, \"\", true);\n}\n","import { Value, stringifyValueForError } from \"./value.js\";\n\nconst IDENTIFYING_FIELD = Symbol.for(\"ConvexError\");\n\nexport class ConvexError<TData extends Value> extends Error {\n name = \"ConvexError\";\n data: TData;\n [IDENTIFYING_FIELD] = true;\n\n constructor(data: TData) {\n super(typeof data === \"string\" ? data : stringifyValueForError(data));\n this.data = data;\n }\n}\n","/**\n * Taken from https://github.com/rocicorp/compare-utf8/blob/main/LICENSE\n * (Apache Version 2.0, January 2004)\n */\n\n/**\n * This is copied here instead of added as a dependency to avoid bundling issues.\n */\n\n/**\n * Compares two JavaScript strings as if they were UTF-8 encoded byte arrays.\n * @param {string} a\n * @param {string} b\n * @returns {number}\n */\nexport function compareUTF8(a: string, b: string): number {\n const aLength = a.length;\n const bLength = b.length;\n const length = Math.min(aLength, bLength);\n for (let i = 0; i < length; ) {\n const aCodePoint = a.codePointAt(i)!;\n const bCodePoint = b.codePointAt(i)!;\n if (aCodePoint !== bCodePoint) {\n // Code points below 0x80 are represented the same way in UTF-8 as in\n // UTF-16.\n if (aCodePoint < 0x80 && bCodePoint < 0x80) {\n return aCodePoint - bCodePoint;\n }\n\n // get the UTF-8 bytes for the code points\n const aLength = utf8Bytes(aCodePoint, aBytes);\n const bLength = utf8Bytes(bCodePoint, bBytes);\n return compareArrays(aBytes, aLength, bBytes, bLength);\n }\n\n i += utf16LengthForCodePoint(aCodePoint);\n }\n\n return aLength - bLength;\n}\n\n/**\n * @param {number[]} a\n * @param {number} aLength\n * @param {number[]} b\n * @param {number} bLength\n * @returns {number}\n */\nfunction compareArrays(\n a: number[],\n aLength: number,\n b: number[],\n bLength: number,\n) {\n const length = Math.min(aLength, bLength);\n for (let i = 0; i < length; i++) {\n const aValue = a[i];\n const bValue = b[i];\n if (aValue !== bValue) {\n return aValue - bValue;\n }\n }\n return aLength - bLength;\n}\n\n/**\n * @param {number} aCodePoint\n * @returns {number}\n */\nexport function utf16LengthForCodePoint(aCodePoint: number) {\n return aCodePoint > 0xffff ? 2 : 1;\n}\n\n// 2 preallocated arrays for utf8Bytes.\nconst arr = () => Array.from({ length: 4 }, () => 0);\nconst aBytes = arr();\nconst bBytes = arr();\n\n/**\n * @param {number} codePoint\n * @param {number[]} bytes\n * @returns {number}\n */\nfunction utf8Bytes(codePoint: number, bytes: number[]) {\n if (codePoint < 0x80) {\n bytes[0] = codePoint;\n return 1;\n }\n\n let count;\n let offset;\n\n if (codePoint <= 0x07ff) {\n count = 1;\n offset = 0xc0;\n } else if (codePoint <= 0xffff) {\n count = 2;\n offset = 0xe0;\n } else if (codePoint <= 0x10ffff) {\n count = 3;\n offset = 0xf0;\n } else {\n throw new Error(\"Invalid code point\");\n }\n\n bytes[0] = (codePoint >> (6 * count)) + offset;\n let i = 1;\n for (; count > 0; count--) {\n const temp = codePoint >> (6 * (count - 1));\n bytes[i++] = 0x80 | (temp & 0x3f);\n }\n return i;\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @returns {boolean}\n */\nexport function greaterThan(a: string, b: string) {\n return compareUTF8(a, b) > 0;\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @returns {boolean}\n */\nexport function greaterThanEq(a: string, b: string) {\n return compareUTF8(a, b) >= 0;\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @returns {boolean}\n */\nexport function lessThan(a: string, b: string) {\n return compareUTF8(a, b) < 0;\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @returns {boolean}\n */\nexport function lessThanEq(a: string, b: string) {\n return compareUTF8(a, b) <= 0;\n}\n","/* eslint-disable no-console */ // This is the one file where we can `console.log` for the default logger implementation.\nimport { ConvexError, Value } from \"../values/index.js\";\nimport { FunctionFailure } from \"./sync/function_result.js\";\n\n// This is blue #9 from https://www.radix-ui.com/docs/colors/palette-composition/the-scales\n// It must look good in both light and dark mode.\nconst INFO_COLOR = \"color:rgb(0, 145, 255)\";\n\nexport type UdfType = \"query\" | \"mutation\" | \"action\" | \"any\";\n\nfunction prefix_for_source(source: UdfType) {\n switch (source) {\n case \"query\":\n return \"Q\";\n case \"mutation\":\n return \"M\";\n case \"action\":\n return \"A\";\n case \"any\":\n return \"?\";\n }\n}\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/**\n * A logger that can be used to log messages. By default, this is a wrapper\n * around `console`, but can be configured to not log at all or to log somewhere\n * else.\n */\nexport type Logger = {\n logVerbose(...args: any[]): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n};\n\nexport class DefaultLogger implements Logger {\n private _onLogLineFuncs: Record<\n string,\n (level: LogLevel, ...args: any[]) => void\n >;\n private _verbose: boolean;\n\n constructor(options: { verbose: boolean }) {\n this._onLogLineFuncs = {};\n this._verbose = options.verbose;\n }\n\n addLogLineListener(\n func: (level: LogLevel, ...args: any[]) => void,\n ): () => void {\n let id = Math.random().toString(36).substring(2, 15);\n for (let i = 0; i < 10; i++) {\n if (this._onLogLineFuncs[id] === undefined) {\n break;\n }\n id = Math.random().toString(36).substring(2, 15);\n }\n this._onLogLineFuncs[id] = func;\n return () => {\n delete this._onLogLineFuncs[id];\n };\n }\n\n logVerbose(...args: any[]) {\n if (this._verbose) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"debug\", `${new Date().toISOString()}`, ...args);\n }\n }\n }\n\n log(...args: any[]) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"info\", ...args);\n }\n }\n\n warn(...args: any[]) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"warn\", ...args);\n }\n }\n\n error(...args: any[]) {\n for (const func of Object.values(this._onLogLineFuncs)) {\n func(\"error\", ...args);\n }\n }\n}\n\nexport function instantiateDefaultLogger(options: {\n verbose: boolean;\n}): Logger {\n const logger = new DefaultLogger(options);\n logger.addLogLineListener((level, ...args) => {\n switch (level) {\n case \"debug\":\n console.debug(...args);\n break;\n case \"info\":\n console.log(...args);\n break;\n case \"warn\":\n console.warn(...args);\n break;\n case \"error\":\n console.error(...args);\n break;\n default: {\n level satisfies never;\n console.log(...args);\n }\n }\n });\n return logger;\n}\n\nexport function instantiateNoopLogger(options: { verbose: boolean }): Logger {\n return new DefaultLogger(options);\n}\n\nexport function logForFunction(\n logger: Logger,\n type: \"info\" | \"error\",\n source: UdfType,\n udfPath: string,\n message: string | { errorData: Value },\n) {\n const prefix = prefix_for_source(source);\n\n if (typeof message === \"object\") {\n message = `ConvexError ${JSON.stringify(message.errorData, null, 2)}`;\n }\n if (type === \"info\") {\n const match = message.match(/^\\[.*?\\] /);\n if (match === null) {\n logger.error(\n `[CONVEX ${prefix}(${udfPath})] Could not parse console.log`,\n );\n return;\n }\n const level = message.slice(1, match[0].length - 2);\n const args = message.slice(match[0].length);\n\n logger.log(`%c[CONVEX ${prefix}(${udfPath})] [${level}]`, INFO_COLOR, args);\n } else {\n logger.error(`[CONVEX ${prefix}(${udfPath})] ${message}`);\n }\n}\n\nexport function logFatalError(logger: Logger, message: string): Error {\n const errorMessage = `[CONVEX FATAL ERROR] ${message}`;\n logger.error(errorMessage);\n return new Error(errorMessage);\n}\n\nexport function createHybridErrorStacktrace(\n source: UdfType,\n udfPath: string,\n result: FunctionFailure,\n): string {\n const prefix = prefix_for_source(source);\n return `[CONVEX ${prefix}(${udfPath})] ${result.errorMessage}\\n Called by client`;\n}\n\nexport function forwardData(\n result: FunctionFailure,\n error: ConvexError<string>,\n) {\n (error as ConvexError<any>).data = result.errorData;\n return error;\n}\n","/**\n * A symbol for accessing the name of a {@link FunctionReference} at runtime.\n */\nexport const functionName = Symbol.for(\"functionName\");\n","import { functionName } from \"../functionName.js\";\n\nexport const toReferencePath = Symbol.for(\"toReferencePath\");\n\n// Multiple instances of the same Symbol.for() are equal at runtime but not\n// at type-time, so `[toReferencePath]` properties aren't used in types.\n// Use this function to set the property invisibly.\nexport function setReferencePath<T>(obj: T, value: string) {\n (obj as any)[toReferencePath] = value;\n}\n\nexport function extractReferencePath(reference: any): string | null {\n return reference[toReferencePath] ?? null;\n}\n\nexport function isFunctionHandle(s: string): boolean {\n return s.startsWith(\"function://\");\n}\n\nexport function getFunctionAddress(functionReference: any) {\n // The `run*` syscalls expect either a UDF path at \"name\" or a serialized\n // reference at \"reference\". Dispatch on `functionReference` to coerce\n // it to one or the other.\n let functionAddress;\n\n // Legacy path for passing in UDF paths directly as function references.\n if (typeof functionReference === \"string\") {\n if (isFunctionHandle(functionReference)) {\n functionAddress = { functionHandle: functionReference };\n } else {\n functionAddress = { name: functionReference };\n }\n }\n // Path for passing in a `FunctionReference`, either from `api` or directly\n // created from a UDF path with `makeFunctionReference`.\n else if (functionReference[functionName]) {\n functionAddress = { name: functionReference[functionName] };\n }\n // Reference to a component's function derived from `app` or `component`.\n else {\n const referencePath = extractReferencePath(functionReference);\n if (!referencePath) {\n throw new Error(`${functionReference} is not a functionReference`);\n }\n functionAddress = { reference: referencePath };\n }\n return functionAddress;\n}\n","import {\n EmptyObject,\n DefaultFunctionArgs,\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery,\n} from \"./registration.js\";\nimport { Expand, UnionToIntersection } from \"../type_utils.js\";\nimport { PaginationOptions, PaginationResult } from \"./pagination.js\";\nimport { functionName } from \"./functionName.js\";\nimport { getFunctionAddress } from \"./components/paths.js\";\n\n/**\n * The type of a Convex function.\n *\n * @public\n */\nexport type FunctionType = \"query\" | \"mutation\" | \"action\";\n\n/**\n * A reference to a registered Convex function.\n *\n * You can create a {@link FunctionReference} using the generated `api` utility:\n * ```js\n * import { api } from \"../convex/_generated/api\";\n *\n * const reference = api.myModule.myFunction;\n * ```\n *\n * If you aren't using code generation, you can create references using\n * {@link anyApi}:\n * ```js\n * import { anyApi } from \"convex/server\";\n *\n * const reference = anyApi.myModule.myFunction;\n * ```\n *\n * Function references can be used to invoke functions from the client. For\n * example, in React you can pass references to the {@link react.useQuery} hook:\n * ```js\n * const result = useQuery(api.myModule.myFunction);\n * ```\n *\n * @typeParam Type - The type of the function (\"query\", \"mutation\", or \"action\").\n * @typeParam Visibility - The visibility of the function (\"public\" or \"internal\").\n * @typeParam Args - The arguments to this function. This is an object mapping\n * argument names to their types.\n * @typeParam ReturnType - The return type of this function.\n * @public\n */\nexport type FunctionReference<\n Type extends FunctionType,\n Visibility extends FunctionVisibility = \"public\",\n Args extends DefaultFunctionArgs = any,\n ReturnType = any,\n ComponentPath = string | undefined,\n> = {\n _type: Type;\n _visibility: Visibility;\n _args: Args;\n _returnType: ReturnType;\n _componentPath: ComponentPath;\n};\n\n/**\n * Get the name of a function from a {@link FunctionReference}.\n *\n * The name is a string like \"myDir/myModule:myFunction\". If the exported name\n * of the function is `\"default\"`, the function name is omitted\n * (e.g. \"myDir/myModule\").\n *\n * @param functionReference - A {@link FunctionReference} to get the name of.\n * @returns A string of the function's name.\n *\n * @public\n */\nexport function getFunctionName(\n functionReference: AnyFunctionReference,\n): string {\n const address = getFunctionAddress(functionReference);\n\n if (address.name === undefined) {\n if (address.functionHandle !== undefined) {\n throw new Error(\n `Expected function reference like \"api.file.func\" or \"internal.file.func\", but received function handle ${address.functionHandle}`,\n );\n } else if (address.reference !== undefined) {\n throw new Error(\n `Expected function reference in the current component like \"api.file.func\" or \"internal.file.func\", but received reference ${address.reference}`,\n );\n }\n throw new Error(\n `Expected function reference like \"api.file.func\" or \"internal.file.func\", but received ${JSON.stringify(address)}`,\n );\n }\n // Both a legacy thing and also a convenience for interactive use:\n // the types won't check but a string is always allowed at runtime.\n if (typeof functionReference === \"string\") return functionReference;\n\n // Two different runtime values for FunctionReference implement this\n // interface: api objects returned from `createApi()` and standalone\n // function reference objects returned from makeFunctionReference.\n const name = (functionReference as any)[functionName];\n if (!name) {\n throw new Error(`${functionReference as any} is not a functionReference`);\n }\n return name;\n}\n\n/**\n * FunctionReferences generally come from generated code, but in custom clients\n * it may be useful to be able to build one manually.\n *\n * Real function references are empty objects at runtime, but the same interface\n * can be implemented with an object for tests and clients which don't use\n * code generation.\n *\n * @param name - The identifier of the function. E.g. `path/to/file:functionName`\n * @public\n */\nexport function makeFunctionReference<\n type extends FunctionType,\n args extends DefaultFunctionArgs = any,\n ret = any,\n>(name: string): FunctionReference<type, \"public\", args, ret> {\n return { [functionName]: name } as unknown as FunctionReference<\n type,\n \"public\",\n args,\n ret\n >;\n}\n\n/**\n * Create a runtime API object that implements {@link AnyApi}.\n *\n * This allows accessing any path regardless of what directories, modules,\n * or functions are defined.\n *\n * @param pathParts - The path to the current node in the API.\n * @returns An {@link AnyApi}\n * @public\n */\nfunction createApi(pathParts: string[] = []): AnyApi {\n const handler: ProxyHandler<object> = {\n get(_, prop: string | symbol) {\n if (typeof prop === \"string\") {\n const newParts = [...pathParts, prop];\n return createApi(newParts);\n } else if (prop === functionName) {\n if (pathParts.length < 2) {\n const found = [\"api\", ...pathParts].join(\".\");\n throw new Error(\n `API path is expected to be of the form \\`api.moduleName.functionName\\`. Found: \\`${found}\\``,\n );\n }\n const path = pathParts.slice(0, -1).join(\"/\");\n const exportName = pathParts[pathParts.length - 1];\n if (exportName === \"default\") {\n return path;\n } else {\n return path + \":\" + exportName;\n }\n } else if (prop === Symbol.toStringTag) {\n return \"FunctionReference\";\n } else {\n return undefined;\n }\n },\n };\n\n return new Proxy({}, handler);\n}\n\n/**\n * Given an export from a module, convert it to a {@link FunctionReference}\n * if it is a Convex function.\n */\nexport type FunctionReferenceFromExport<Export> =\n Export extends RegisteredQuery<\n infer Visibility,\n infer Args,\n infer ReturnValue\n >\n ? FunctionReference<\n \"query\",\n Visibility,\n Args,\n ConvertReturnType<ReturnValue>\n >\n : Export extends RegisteredMutation<\n infer Visibility,\n infer Args,\n infer ReturnValue\n >\n ? FunctionReference<\n \"mutation\",\n Visibility,\n Args,\n ConvertReturnType<ReturnValue>\n >\n : Export extends RegisteredAction<\n infer Visibility,\n infer Args,\n infer ReturnValue\n >\n ? FunctionReference<\n \"action\",\n Visibility,\n Args,\n ConvertReturnType<ReturnValue>\n >\n : never;\n\n/**\n * Given a module, convert all the Convex functions into\n * {@link FunctionReference}s and remove the other exports.\n *\n * BE CAREFUL WHEN EDITING THIS!\n *\n * This is written carefully to preserve jumping to function definitions using\n * cmd+click. If you edit it, please test that cmd+click still works.\n */\ntype FunctionReferencesInModule<Module extends Record<string, any>> = {\n -readonly [ExportName in keyof Module as Module[ExportName][\"isConvexFunction\"] extends true\n ? ExportName\n : never]: FunctionReferenceFromExport<Module[ExportName]>;\n};\n\n/**\n * Given a path to a module and it's type, generate an API type for this module.\n *\n * This is a nested object according to the module's path.\n */\ntype ApiForModule<\n ModulePath extends string,\n Module extends object,\n> = ModulePath extends `${infer First}/${infer Second}`\n ? {\n [_ in First]: ApiForModule<Second, Module>;\n }\n : { [_ in ModulePath]: FunctionReferencesInModule<Module> };\n\n/**\n * Given the types of all modules in the `convex/` directory, construct the type\n * of `api`.\n *\n * `api` is a utility for constructing {@link FunctionReference}s.\n *\n * @typeParam AllModules - A type mapping module paths (like `\"dir/myModule\"`) to\n * the types of the modules.\n * @public\n */\nexport type ApiFromModules<AllModules extends Record<string, object>> =\n FilterApi<\n ApiFromModulesAllowEmptyNodes<AllModules>,\n FunctionReference<any, any, any, any>\n >;\n\ntype ApiFromModulesAllowEmptyNodes<AllModules extends Record<string, object>> =\n ExpandModulesAndDirs<\n UnionToIntersection<\n {\n [ModulePath in keyof AllModules]: ApiForModule<\n ModulePath & string,\n AllModules[ModulePath]\n >;\n }[keyof AllModules]\n >\n >;\n\n/**\n * @public\n *\n * Filter a Convex deployment api object for functions which meet criteria,\n * for example all public queries.\n */\nexport type FilterApi<API, Predicate> = Expand<{\n [mod in keyof API as API[mod] extends Predicate\n ? mod\n : API[mod] extends FunctionReference<any, any, any, any>\n ? never\n : FilterApi<API[mod], Predicate> extends Record<string, never>\n ? never\n : mod]: API[mod] extends Predicate\n ? API[mod]\n : FilterApi<API[mod], Predicate>;\n}>;\n\n/**\n * Given an api of type API and a FunctionReference subtype, return an api object\n * containing only the function references that match.\n *\n * ```ts\n * const q = filterApi<typeof api, FunctionReference<\"query\">>(api)\n * ```\n *\n * @public\n */\nexport function filterApi<API, Predicate>(api: API): FilterApi<API, Predicate> {\n return api as any;\n}\n\n// These just* API filter helpers require no type parameters so are useable from JavaScript.\n/** @public */\nexport function justInternal<API>(\n api: API,\n): FilterApi<API, FunctionReference<any, \"internal\", any, any>> {\n return api as any;\n}\n\n/** @public */\nexport function justPublic<API>(\n api: API,\n): FilterApi<API, FunctionReference<any, \"public\", any, any>> {\n return api as any;\n}\n\n/** @public */\nexport function justQueries<API>(\n api: API,\n): FilterApi<API, FunctionReference<\"query\", any, any, any>> {\n return api as any;\n}\n\n/** @public */\nexport function justMutations<API>(\n api: API,\n): FilterApi<API, FunctionReference<\"mutation\", any, any, any>> {\n return api as any;\n}\n\n/** @public */\nexport function justActions<API>(\n api: API,\n): FilterApi<API, FunctionReference<\"action\", any, any, any>> {\n return api as any;\n}\n\n/** @public */\nexport function justPaginatedQueries<API>(\n api: API,\n): FilterApi<\n API,\n FunctionReference<\n \"query\",\n any,\n { paginationOpts: PaginationOptions },\n PaginationResult<any>\n >\n> {\n return api as any;\n}\n\n/** @public */\nexport function justSchedulable<API>(\n api: API,\n): FilterApi<API, FunctionReference<\"mutation\" | \"action\", any, any, any>> {\n return api as any;\n}\n\n/**\n * Like {@link Expand}, this simplifies how TypeScript displays object types.\n * The differences are:\n * 1. This version is recursive.\n * 2. This stops recursing when it hits a {@link FunctionReference}.\n */\ntype ExpandModulesAndDirs<ObjectType> = ObjectType extends AnyFunctionReference\n ? ObjectType\n : {\n [Key in keyof ObjectType]: ExpandModulesAndDirs<ObjectType[Key]>;\n };\n\n/**\n * A {@link FunctionReference} of any type and any visibility with any\n * arguments and any return type.\n *\n * @public\n */\nexport type AnyFunctionReference = FunctionReference<any, any>;\n\ntype AnyModuleDirOrFunc = {\n [key: string]: AnyModuleDirOrFunc;\n} & AnyFunctionReference;\n\n/**\n * The type that Convex api objects extend. If you were writing an api from\n * scratch it should extend this type.\n *\n * @public\n */\nexport type AnyApi = Record<string, Record<string, AnyModuleDirOrFunc>>;\n\n/**\n * Recursive partial API, useful for defining a subset of an API when mocking\n * or building custom api objects.\n *\n * @public\n */\nexport type PartialApi<API> = {\n [mod in keyof API]?: API[mod] extends FunctionReference<any, any, any, any>\n ? API[mod]\n : PartialApi<API[mod]>;\n};\n\n/**\n * A utility for constructing {@link FunctionReference}s in projects that\n * are not using code generation.\n *\n * You can create a reference to a function like:\n * ```js\n * const reference = anyApi.myModule.myFunction;\n * ```\n *\n * This supports accessing any path regardless of what directories and modules\n * are in your project. All function references are typed as\n * {@link AnyFunctionReference}.\n *\n *\n * If you're using code generation, use `api` from `convex/_generated/api`\n * instead. It will be more type-safe and produce better auto-complete\n * in your editor.\n *\n * @public\n */\nexport const anyApi: AnyApi = createApi() as any;\n\n/**\n * Given a {@link FunctionReference}, get the return type of the function.\n *\n * This is represented as an object mapping argument names to values.\n * @public\n */\nexport type FunctionArgs<FuncRef extends AnyFunctionReference> =\n FuncRef[\"_args\"];\n\n/**\n * A tuple type of the (maybe optional) arguments to `FuncRef`.\n *\n * This type is used to make methods involving arguments type safe while allowing\n * skipping the arguments for functions that don't require arguments.\n *\n * @public\n */\nexport type OptionalRestArgs<FuncRef extends AnyFunctionReference> =\n FuncRef[\"_args\"] extends EmptyObject\n ? [args?: EmptyObject]\n : [args: FuncRef[\"_args\"]];\n\n/**\n * A tuple type of the (maybe optional) arguments to `FuncRef`, followed by an options\n * object of type `Options`.\n *\n * This type is used to make methods like `useQuery` type-safe while allowing\n * 1. Skipping arguments for functions that don't require arguments.\n * 2. Skipping the options object.\n * @public\n */\nexport type ArgsAndOptions<\n FuncRef extends AnyFunctionReference,\n Options,\n> = FuncRef[\"_args\"] extends EmptyObject\n ? [args?: EmptyObject, options?: Options]\n : [args: FuncRef[\"_args\"], options?: Options];\n\n/**\n * Given a {@link FunctionReference}, get the return type of the function.\n *\n * @public\n */\nexport type FunctionReturnType<FuncRef extends AnyFunctionReference> =\n FuncRef[\"_returnType\"];\n\ntype UndefinedToNull<T> = T extends void ? null : T;\n\ntype NullToUndefinedOrNull<T> = T extends null ? T | undefined | void : T;\n\n/**\n * Convert the return type of a function to it's client-facing format.\n *\n * This means:\n * - Converting `undefined` and `void` to `null`\n * - Removing all `Promise` wrappers\n */\nexport type ConvertReturnType<T> = UndefinedToNull<Awaited<T>>;\n\nexport type ValidatorTypeToReturnType<T> =\n | Promise<NullToUndefinedOrNull<T>>\n | NullToUndefinedOrNull<T>;\n","// Implements an unsigned long.\n// This is a subset of https://github.com/dcodeIO/Long.js,\n// vendored to decrease bundle size.\n// Copyright Daniel Wirtz <dcode@dcode.io>\n// License: Apache Version 2.0\n/*\n\n Apache License\n Version 2.0, January 2004\n http://www.apache.org/licenses/\n\n TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n 1. Definitions.\n\n \"License\" shall mean the terms and conditions for use, reproduction,\n and distribution as defined by Sections 1 through 9 of this document.\n\n \"Licensor\" shall mean the copyright owner or entity authorized by\n the copyright owner that is granting the License.\n\n \"Legal Entity\" shall mean the union of the acting entity and all\n other entities that control, are controlled by, or are under common\n control with that entity. For the purposes of this definition,\n \"control\" means (i) the power, direct or indirect, to cause the\n direction or management of such entity, whether by contract or\n otherwise, or (ii) ownership of fifty percent (50%) or more of the\n outstanding shares, or (iii) beneficial ownership of such entity.\n\n \"You\" (or \"Your\") shall mean an individual or Legal Entity\n exercising permissions granted by this License.\n\n \"Source\" form shall mean the preferred form for making modifications,\n including but not limited to software source code, documentation\n source, and configuration files.\n\n \"Object\" form shall mean any form resulting from mechanical\n transformation or translation of a Source form, including but\n not limited to compiled object code, generated documentation,\n and conversions to other media types.\n\n \"Work\" shall mean the work of authorship, whether in Source or\n Object form, made available under the License, as indicated by a\n copyright notice that is included in or attached to the work\n (an example is provided in the Appendix below).\n\n \"Derivative Works\" shall mean any work, whether in Source or Object\n form, that is based on (or derived from) the Work and for which the\n editorial revisions, annotations, elaborations, or other modifications\n represent, as a whole, an original work of authorship. For the purposes\n of this License, Derivative Works shall not include works that remain\n separable from, or merely link (or bind by name) to the interfaces of,\n the Work and Derivative Works thereof.\n\n \"Contribution\" shall mean any work of authorship, including\n the original version of the Work and any modifications or additions\n to that Work or Derivative Works thereof, that is intentionally\n submitted to Licensor for inclusion in the Work by the copyright owner\n or by an individual or Legal Entity authorized to submit on behalf of\n the copyright owner. For the purposes of this definition, \"submitted\"\n means any form of electronic, verbal, or written communication sent\n to the Licensor or its representatives, including but not limited to\n communication on electronic mailing lists, source code control systems,\n and issue tracking systems that are managed by, or on behalf of, the\n Licensor for the purpose of discussing and improving the Work, but\n excluding communication that is conspicuously marked or otherwise\n designated in writing by the copyright owner as \"Not a Contribution.\"\n\n \"Contributor\" shall mean Licensor and any individual or Legal Entity\n on behalf of whom a Contribution has been received by Licensor and\n subsequently incorporated within the Work.\n\n 2. Grant of Copyright License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n copyright license to reproduce, prepare Derivative Works of,\n publicly display, publicly perform, sublicense, and distribute the\n Work and such Derivative Works in Source or Object form.\n\n 3. Grant of Patent License. Subject to the terms and conditions of\n this License, each Contributor hereby grants to You a perpetual,\n worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n (except as stated in this section) patent license to make, have made,\n use, offer to sell, sell, import, and otherwise transfer the Work,\n where such license applies only to those patent claims licensable\n by such Contributor that are necessarily infringed by their\n Contribution(s) alone or by combination of their Contribution(s)\n with the Work to which such Contribution(s) was submitted. If You\n institute patent litigation against any entity (including a\n cross-claim or counterclaim in a lawsuit) alleging that the Work\n or a Contribution incorporated within the Work constitutes direct\n or contributory patent infringement, then any patent licenses\n granted to You under this License for that Work shall terminate\n as of the date such litigation is filed.\n\n 4. Redistribution. You may reproduce and distribute copies of the\n Work or Derivative Works thereof in any medium, with or without\n modifications, and in Source or Object form, provided that You\n meet the following conditions:\n\n (a) You must give any other recipients of the Work or\n Derivative Works a copy of this License; and\n\n (b) You must cause any modified files to carry prominent notices\n stating that You changed the files; and\n\n (c) You must retain, in the Source form of any Derivative Works\n that You distribute, all copyright, patent, trademark, and\n attribution notices from the Source form of the Work,\n excluding those notices that do not pertain to any part of\n the Derivative Works; and\n\n (d) If the Work includes a \"NOTICE\" text file as part of its\n distribution, then any Derivative Works that You distribute must\n include a readable copy of the attribution notices contained\n within such NOTICE file, excluding those notices that do not\n pertain to any part of the Derivative Works, in at least one\n of the following places: within a NOTICE text file distributed\n as part of the Derivative Works; within the Source form or\n documentation, if provided along with the Derivative Works; or,\n within a display generated by the Derivative Works, if and\n wherever such third-party notices normally appear. The contents\n of the NOTICE file are for informational purposes only and\n do not modify the License. You may add Your own attribution\n notices within Derivative Works that You distribute, alongside\n or as an addendum to the NOTICE text from the Work, provided\n that such additional attribution notices cannot be construed\n as modifying the License.\n\n You may add Your own copyright statement to Your modifications and\n may provide additional or different license terms and conditions\n for use, reproduction, or distribution of Your modifications, or\n for any such Derivative Works as a whole, provided Your use,\n reproduction, and distribution of the Work otherwise complies with\n the conditions stated in this License.\n\n 5. Submission of Contributions. Unless You explicitly state otherwise,\n any Contribution intentionally submitted for inclusion in the Work\n by You to the Licensor shall be under the terms and conditions of\n this License, without any additional terms or conditions.\n Notwithstanding the above, nothing herein shall supersede or modify\n the terms of any separate license agreement you may have executed\n with Licensor regarding such Contributions.\n\n 6. Trademarks. This License does not grant permission to use the trade\n names, trademarks, service marks, or product names of the Licensor,\n except as required for reasonable and customary use in describing the\n origin of the Work and reproducing the content of the NOTICE file.\n\n 7. Disclaimer of Warranty. Unless required by applicable law or\n agreed to in writing, Licensor provides the Work (and each\n Contributor provides its Contributions) on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n implied, including, without limitation, any warranties or conditions\n of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n PARTICULAR PURPOSE. You are solely responsible for determining the\n appropriateness of using or redistributing the Work and assume any\n risks associated with Your exercise of permissions under this License.\n\n 8. Limitation of Liability. In no event and under no legal theory,\n whether in tort (including negligence), contract, or otherwise,\n unless required by applicable law (such as deliberate and grossly\n negligent acts) or agreed to in writing, shall any Contributor be\n liable to You for damages, including any direct, indirect, special,\n incidental, or consequential damages of any character arising as a\n result of this License or out of the use or inability to use the\n Work (including but not limited to damages for loss of goodwill,\n work stoppage, computer failure or malfunction, or any and all\n other commercial damages or losses), even if such Contributor\n has been advised of the possibility of such damages.\n\n 9. Accepting Warranty or Additional Liability. While redistributing\n the Work or Derivative Works thereof, You may choose to offer,\n and charge a fee for, acceptance of support, warranty, indemnity,\n or other liability obligations and/or rights consistent with this\n License. However, in accepting such obligations, You may act only\n on Your own behalf and on Your sole responsibility, not on behalf\n of any other Contributor, and only if You agree to indemnify,\n defend, and hold each Contributor harmless for any liability\n incurred by, or claims asserted against, such Contributor by reason\n of your accepting any such warranty or additional liability.\n\n END OF TERMS AND CONDITIONS\n\n APPENDIX: How to apply the Apache License to your work.\n\n To apply the Apache License to your work, attach the following\n boilerplate notice, with the fields enclosed by brackets \"[]\"\n replaced with your own identifying information. (Don't include\n the brackets!) The text should be enclosed in the appropriate\n comment syntax for the file format. We also recommend that a\n file or class name and description of purpose be included on the\n same \"printed page\" as the copyright notice for easier\n identification within third-party archives.\n\n Copyright 2023 Daniel Wirtz <dcode@dcode.io>\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n// This works... but don't try to compare one to a real Long.js Long!\n// For internal use only.\n// `| 0` assures the runtime that we are using integer arithmetic\nexport class Long {\n low: number;\n high: number;\n __isUnsignedLong__: boolean;\n\n static isLong(obj: Long) {\n return (obj && obj.__isUnsignedLong__) === true;\n }\n\n constructor(low: number, high: number) {\n this.low = low | 0;\n this.high = high | 0;\n this.__isUnsignedLong__ = true;\n }\n\n // prettier-ignore\n static fromBytesLE(bytes: number[]): Long {\n return new Long(\n bytes[0] |\n bytes[1] << 8 |\n bytes[2] << 16 |\n bytes[3] << 24,\n bytes[4] |\n bytes[5] << 8 |\n bytes[6] << 16 |\n bytes[7] << 24,\n );\n }\n\n // prettier-ignore\n toBytesLE() {\n const hi = this.high;\n const lo = this.low;\n return [\n lo & 0xff,\n lo >>> 8 & 0xff,\n lo >>> 16 & 0xff,\n lo >>> 24,\n hi & 0xff,\n hi >>> 8 & 0xff,\n hi >>> 16 & 0xff,\n hi >>> 24\n ];\n }\n\n static fromNumber(value: number) {\n if (isNaN(value)) return UZERO;\n if (value < 0) return UZERO;\n if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;\n return new Long(value % TWO_PWR_32_DBL | 0, (value / TWO_PWR_32_DBL) | 0);\n }\n\n toString() {\n return (\n BigInt(this.high) * BigInt(TWO_PWR_32_DBL) +\n BigInt(this.low)\n ).toString();\n }\n\n equals(other: Long) {\n if (!Long.isLong(other)) other = Long.fromValue(other);\n if (this.high >>> 31 === 1 && other.high >>> 31 === 1) return false;\n return this.high === other.high && this.low === other.low;\n }\n\n notEquals(other: Long) {\n return !this.equals(other);\n }\n\n comp(other: Long) {\n if (!Long.isLong(other)) other = Long.fromValue(other);\n if (this.equals(other)) return 0;\n return other.high >>> 0 > this.high >>> 0 ||\n (other.high === this.high && other.low >>> 0 > this.low >>> 0)\n ? -1\n : 1;\n }\n\n lessThanOrEqual(other: Long) {\n return this.comp(/* validates */ other) <= 0;\n }\n\n static fromValue(val: any) {\n if (typeof val === \"number\") return Long.fromNumber(val);\n // Throws for non-objects, converts non-instanceof Long:\n return new Long(val.low, val.high);\n }\n}\n\nconst UZERO = new Long(0, 0);\nconst TWO_PWR_16_DBL = 1 << 16;\nconst TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\nconst TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\nconst MAX_UNSIGNED_VALUE = new Long(0xffffffff | 0, 0xffffffff | 0);\n","export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }));\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n }\n catch (err) {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n }\n try {\n return JSON.parse(decoded);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n }\n}\n","import { Logger } from \"../logging.js\";\nimport { LocalSyncState } from \"./local_state.js\";\nimport { AuthError, IdentityVersion, Transition } from \"./protocol.js\";\nimport { jwtDecode } from \"jwt-decode\";\n\n// setTimout uses 32 bit integer, so it can only\n// schedule about 24 days in the future.\nconst MAXIMUM_REFRESH_DELAY = 20 * 24 * 60 * 60 * 1000; // 20 days\n\nconst MAX_TOKEN_CONFIRMATION_ATTEMPTS = 2;\n\n/**\n * An async function returning a JWT. Depending on the auth providers\n * configured in convex/auth.config.ts, this may be a JWT-encoded OpenID\n * Connect Identity Token or a traditional JWT.\n *\n * `forceRefreshToken` is `true` if the server rejected a previously\n * returned token or the token is anticipated to expiring soon\n * based on its `exp` time.\n *\n * See {@link ConvexReactClient.setAuth}.\n *\n * @public\n */\nexport type AuthTokenFetcher = (args: {\n forceRefreshToken: boolean;\n}) => Promise<string | null | undefined>;\n\n/**\n * What is provided to the client.\n */\ntype AuthConfig = {\n fetchToken: AuthTokenFetcher;\n onAuthChange: (isAuthenticated: boolean) => void;\n};\n\n/**\n * In general we take 3 steps:\n * 1. Fetch a possibly cached token\n * 2. Immediately fetch a fresh token without using a cache\n * 3. Repeat step 2 before the end of the fresh token's lifetime\n *\n * When we fetch without using a cache we know when the token\n * will expire, and can schedule refetching it.\n *\n * If we get an error before a scheduled refetch, we go back\n * to step 2.\n */\ntype AuthState =\n | { state: \"noAuth\" }\n | {\n state: \"waitingForServerConfirmationOfCachedToken\";\n config: AuthConfig;\n hasRetried: boolean;\n }\n | {\n state: \"initialRefetch\";\n config: AuthConfig;\n }\n | {\n state: \"waitingForServerConfirmationOfFreshToken\";\n config: AuthConfig;\n hadAuth: boolean;\n token: string;\n }\n | {\n state: \"waitingForScheduledRefetch\";\n config: AuthConfig;\n refetchTokenTimeoutId: ReturnType<typeof setTimeout>;\n }\n // Special/weird state when we got a valid token\n // but could not fetch a new one.\n | {\n state: \"notRefetching\";\n config: AuthConfig;\n };\n\n/**\n * Handles the state transitions for auth. The server is the source\n * of truth.\n */\nexport class AuthenticationManager {\n private authState: AuthState = { state: \"noAuth\" };\n // Used to detect races involving `setConfig` calls\n // while a token is being fetched.\n private configVersion = 0;\n // Shared by the BaseClient so that the auth manager can easily inspect it\n private readonly syncState: LocalSyncState;\n // Passed down by BaseClient, sends a message to the server\n private readonly authenticate: (token: string) => IdentityVersion;\n private readonly stopSocket: () => Promise<void>;\n private readonly tryRestartSocket: () => void;\n private readonly pauseSocket: () => void;\n private readonly resumeSocket: () => void;\n // Passed down by BaseClient, sends a message to the server\n private readonly clearAuth: () => void;\n private readonly logger: Logger;\n private readonly refreshTokenLeewaySeconds: number;\n // Number of times we have attempted to confirm the latest token. We retry up\n // to `MAX_TOKEN_CONFIRMATION_ATTEMPTS` times.\n private tokenConfirmationAttempts = 0;\n constructor(\n syncState: LocalSyncState,\n callbacks: {\n authenticate: (token: string) => IdentityVersion;\n stopSocket: () => Promise<void>;\n tryRestartSocket: () => void;\n pauseSocket: () => void;\n resumeSocket: () => void;\n clearAuth: () => void;\n },\n config: {\n refreshTokenLeewaySeconds: number;\n logger: Logger;\n },\n ) {\n this.syncState = syncState;\n this.authenticate = callbacks.authenticate;\n this.stopSocket = callbacks.stopSocket;\n this.tryRestartSocket = callbacks.tryRestartSocket;\n this.pauseSocket = callbacks.pauseSocket;\n this.resumeSocket = callbacks.resumeSocket;\n this.clearAuth = callbacks.clearAuth;\n this.logger = config.logger;\n this.refreshTokenLeewaySeconds = config.refreshTokenLeewaySeconds;\n }\n\n async setConfig(\n fetchToken: AuthTokenFetcher,\n onChange: (isAuthenticated: boolean) => void,\n ) {\n this.resetAuthState();\n this._logVerbose(\"pausing WS for auth token fetch\");\n this.pauseSocket();\n const token = await this.fetchTokenAndGuardAgainstRace(fetchToken, {\n forceRefreshToken: false,\n });\n if (token.isFromOutdatedConfig) {\n return;\n }\n if (token.value) {\n this.setAuthState({\n state: \"waitingForServerConfirmationOfCachedToken\",\n config: { fetchToken, onAuthChange: onChange },\n hasRetried: false,\n });\n this.authenticate(token.value);\n } else {\n this.setAuthState({\n state: \"initialRefetch\",\n config: { fetchToken, onAuthChange: onChange },\n });\n // Try again with `forceRefreshToken: true`\n await this.refetchToken();\n }\n this._logVerbose(\"resuming WS after auth token fetch\");\n this.resumeSocket();\n }\n\n onTransition(serverMessage: Transition) {\n if (\n !this.syncState.isCurrentOrNewerAuthVersion(\n serverMessage.endVersion.identity,\n )\n ) {\n // This is a stale transition - client has moved on to\n // a newer auth version.\n return;\n }\n if (\n serverMessage.endVersion.identity <= serverMessage.startVersion.identity\n ) {\n // This transition did not change auth - it is not a response to Authenticate.\n return;\n }\n\n if (this.authState.state === \"waitingForServerConfirmationOfCachedToken\") {\n this._logVerbose(\"server confirmed auth token is valid\");\n void this.refetchToken();\n this.authState.config.onAuthChange(true);\n return;\n }\n if (this.authState.state === \"waitingForServerConfirmationOfFreshToken\") {\n this._logVerbose(\"server confirmed new auth token is valid\");\n this.scheduleTokenRefetch(this.authState.token);\n this.tokenConfirmationAttempts = 0;\n if (!this.authState.hadAuth) {\n this.authState.config.onAuthChange(true);\n }\n }\n }\n\n onAuthError(serverMessage: AuthError) {\n // If the AuthError is not due to updating the token, and we're currently\n // waiting on the result of a token update, ignore.\n if (\n serverMessage.authUpdateAttempted === false &&\n (this.authState.state === \"waitingForServerConfirmationOfFreshToken\" ||\n this.authState.state === \"waitingForServerConfirmationOfCachedToken\")\n ) {\n this._logVerbose(\"ignoring non-auth token expired error\");\n return;\n }\n const { baseVersion } = serverMessage;\n // Versioned AuthErrors are ignored if the client advanced to\n // a newer auth identity\n // Error are reporting the previous version, since the server\n // didn't advance, hence `+ 1`.\n if (!this.syncState.isCurrentOrNewerAuthVersion(baseVersion + 1)) {\n this._logVerbose(\"ignoring auth error for previous auth attempt\");\n return;\n }\n void this.tryToReauthenticate(serverMessage);\n return;\n }\n\n // This is similar to `refetchToken` defined below, in fact we\n // don't represent them as different states, but it is different\n // in that we pause the WebSocket so that mutations\n // don't retry with bad auth.\n private async tryToReauthenticate(serverMessage: AuthError) {\n this._logVerbose(`attempting to reauthenticate: ${serverMessage.error}`);\n if (\n // No way to fetch another token, kaboom\n this.authState.state === \"noAuth\" ||\n // We failed on a fresh token. After a small number of retries, we give up\n // and clear the auth state to avoid infinite retries.\n (this.authState.state === \"waitingForServerConfirmationOfFreshToken\" &&\n this.tokenConfirmationAttempts >= MAX_TOKEN_CONFIRMATION_ATTEMPTS)\n ) {\n this.logger.error(\n `Failed to authenticate: \"${serverMessage.error}\", check your server auth config`,\n );\n if (this.syncState.hasAuth()) {\n this.syncState.clearAuth();\n }\n if (this.authState.state !== \"noAuth\") {\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n return;\n }\n if (this.authState.state === \"waitingForServerConfirmationOfFreshToken\") {\n this.tokenConfirmationAttempts++;\n this._logVerbose(\n `retrying reauthentication, ${MAX_TOKEN_CONFIRMATION_ATTEMPTS - this.tokenConfirmationAttempts} attempts remaining`,\n );\n }\n\n await this.stopSocket();\n const token = await this.fetchTokenAndGuardAgainstRace(\n this.authState.config.fetchToken,\n {\n forceRefreshToken: true,\n },\n );\n if (token.isFromOutdatedConfig) {\n return;\n }\n\n if (token.value && this.syncState.isNewAuth(token.value)) {\n this.authenticate(token.value);\n this.setAuthState({\n state: \"waitingForServerConfirmationOfFreshToken\",\n config: this.authState.config,\n token: token.value,\n hadAuth:\n this.authState.state === \"notRefetching\" ||\n this.authState.state === \"waitingForScheduledRefetch\",\n });\n } else {\n this._logVerbose(\"reauthentication failed, could not fetch a new token\");\n if (this.syncState.hasAuth()) {\n this.syncState.clearAuth();\n }\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n this.tryRestartSocket();\n }\n\n // Force refetch the token and schedule another refetch\n // before the token expires - an active client should never\n // need to reauthenticate.\n private async refetchToken() {\n if (this.authState.state === \"noAuth\") {\n return;\n }\n this._logVerbose(\"refetching auth token\");\n const token = await this.fetchTokenAndGuardAgainstRace(\n this.authState.config.fetchToken,\n {\n forceRefreshToken: true,\n },\n );\n if (token.isFromOutdatedConfig) {\n return;\n }\n\n if (token.value) {\n if (this.syncState.isNewAuth(token.value)) {\n this.setAuthState({\n state: \"waitingForServerConfirmationOfFreshToken\",\n hadAuth: this.syncState.hasAuth(),\n token: token.value,\n config: this.authState.config,\n });\n this.authenticate(token.value);\n } else {\n this.setAuthState({\n state: \"notRefetching\",\n config: this.authState.config,\n });\n }\n } else {\n this._logVerbose(\"refetching token failed\");\n if (this.syncState.hasAuth()) {\n this.clearAuth();\n }\n this.setAndReportAuthFailed(this.authState.config.onAuthChange);\n }\n // Restart in case this refetch was triggered via schedule during\n // a reauthentication attempt.\n this._logVerbose(\n \"restarting WS after auth token fetch (if currently stopped)\",\n );\n this.tryRestartSocket();\n }\n\n private scheduleTokenRefetch(token: string) {\n if (this.authState.state === \"noAuth\") {\n return;\n }\n const decodedToken = this.decodeToken(token);\n if (!decodedToken) {\n // This is no longer really possible, because\n // we wait on server response before scheduling token refetch,\n // and the server currently requires JWT tokens.\n this.logger.error(\n \"Auth token is not a valid JWT, cannot refetch the token\",\n );\n return;\n }\n // iat: issued at time, UTC seconds timestamp at which the JWT was issued\n // exp: expiration time, UTC seconds timestamp at which the JWT will expire\n const { iat, exp } = decodedToken as { iat?: number; exp?: number };\n if (!iat || !exp) {\n this.logger.error(\n \"Auth token does not have required fields, cannot refetch the token\",\n );\n return;\n }\n // Because the client and server clocks may be out of sync,\n // we only know that the token will expire after `exp - iat`,\n // and since we just fetched a fresh one we know when that\n // will happen.\n const tokenValiditySeconds = exp - iat;\n if (tokenValiditySeconds <= 2) {\n this.logger.error(\n \"Auth token does not live long enough, cannot refetch the token\",\n );\n return;\n }\n // Attempt to refresh the token `refreshTokenLeewaySeconds` before it expires,\n // or immediately if the token is already expiring soon.\n let delay = Math.min(\n MAXIMUM_REFRESH_DELAY,\n (tokenValiditySeconds - this.refreshTokenLeewaySeconds) * 1000,\n );\n if (delay <= 0) {\n // Refetch immediately, but this might be due to configuring a `refreshTokenLeewaySeconds`\n // that is too large compared to the token's actual lifetime.\n this.logger.warn(\n `Refetching auth token immediately, configured leeway ${this.refreshTokenLeewaySeconds}s is larger than the token's lifetime ${tokenValiditySeconds}s`,\n );\n delay = 0;\n }\n const refetchTokenTimeoutId = setTimeout(() => {\n this._logVerbose(\"running scheduled token refetch\");\n void this.refetchToken();\n }, delay);\n this.setAuthState({\n state: \"waitingForScheduledRefetch\",\n refetchTokenTimeoutId,\n config: this.authState.config,\n });\n this._logVerbose(\n `scheduled preemptive auth token refetching in ${delay}ms`,\n );\n }\n\n // Protects against simultaneous calls to `setConfig`\n // while we're fetching a token\n private async fetchTokenAndGuardAgainstRace(\n fetchToken: AuthTokenFetcher,\n fetchArgs: {\n forceRefreshToken: boolean;\n },\n ) {\n const originalConfigVersion = ++this.configVersion;\n this._logVerbose(\n `fetching token with config version ${originalConfigVersion}`,\n );\n const token = await fetchToken(fetchArgs);\n if (this.configVersion !== originalConfigVersion) {\n // This is a stale config\n this._logVerbose(\n `stale config version, expected ${originalConfigVersion}, got ${this.configVersion}`,\n );\n return { isFromOutdatedConfig: true };\n }\n return { isFromOutdatedConfig: false, value: token };\n }\n\n stop() {\n this.resetAuthState();\n // Bump this in case we are mid-token-fetch when we get stopped\n this.configVersion++;\n this._logVerbose(`config version bumped to ${this.configVersion}`);\n }\n\n private setAndReportAuthFailed(\n onAuthChange: (authenticated: boolean) => void,\n ) {\n onAuthChange(false);\n this.resetAuthState();\n }\n\n private resetAuthState() {\n this.setAuthState({ state: \"noAuth\" });\n }\n\n private setAuthState(newAuth: AuthState) {\n const authStateForLog =\n newAuth.state === \"waitingForServerConfirmationOfFreshToken\"\n ? {\n hadAuth: newAuth.hadAuth,\n state: newAuth.state,\n token: `...${newAuth.token.slice(-7)}`,\n }\n : { state: newAuth.state };\n this._logVerbose(\n `setting auth state to ${JSON.stringify(authStateForLog)}`,\n );\n switch (newAuth.state) {\n case \"waitingForScheduledRefetch\":\n case \"notRefetching\":\n case \"noAuth\":\n this.tokenConfirmationAttempts = 0;\n break;\n case \"waitingForServerConfirmationOfFreshToken\":\n case \"waitingForServerConfirmationOfCachedToken\":\n case \"initialRefetch\":\n break;\n default: {\n newAuth satisfies never;\n }\n }\n if (this.authState.state === \"waitingForScheduledRefetch\") {\n clearTimeout(this.authState.refetchTokenTimeoutId);\n\n // The waitingForScheduledRefetch state is the most quiesced authed state.\n // Let the syncState know that auth is in a good state, so it can reset failure backoffs\n this.syncState.markAuthCompletion();\n }\n this.authState = newAuth;\n }\n\n private decodeToken(token: string) {\n try {\n return jwtDecode(token);\n } catch (e) {\n this._logVerbose(\n `Error decoding token: ${e instanceof Error ? e.message : \"Unknown error\"}`,\n );\n return null;\n }\n }\n\n private _logVerbose(message: string) {\n this.logger.logVerbose(`${message} [v${this.configVersion}]`);\n }\n}\n","import {\n FunctionReference,\n FunctionReturnType,\n OptionalRestArgs,\n getFunctionName,\n} from \"../server/api.js\";\nimport { parseArgs, validateDeploymentUrl } from \"../common/index.js\";\nimport { version } from \"../index.js\";\nimport {\n ConvexError,\n JSONValue,\n convexToJson,\n jsonToConvex,\n} from \"../values/index.js\";\nimport {\n instantiateDefaultLogger,\n instantiateNoopLogger,\n logForFunction,\n Logger,\n} from \"./logging.js\";\nimport {\n ArgsAndOptions,\n FunctionArgs,\n UserIdentityAttributes,\n} from \"../server/index.js\";\n\nexport const STATUS_CODE_OK = 200;\nexport const STATUS_CODE_BAD_REQUEST = 400;\n// Special custom 5xx HTTP status code to mean that the UDF returned an error.\n//\n// Must match the constant of the same name in the backend.\nexport const STATUS_CODE_UDF_FAILED = 560;\n\n// Allow fetch to be shimmed in for Node.js < 18\nlet specifiedFetch: typeof globalThis.fetch | undefined = undefined;\nexport function setFetch(f: typeof globalThis.fetch) {\n specifiedFetch = f;\n}\n\nexport type HttpMutationOptions = {\n /**\n * Skip the default queue of mutations and run this immediately.\n *\n * This allows the same HttpConvexClient to be used to request multiple\n * mutations in parallel, something not possible with WebSocket-based clients.\n */\n skipQueue: boolean;\n};\n\n/**\n * A Convex client that runs queries and mutations over HTTP.\n *\n * This client is stateful (it has user credentials and queues mutations)\n * so take care to avoid sharing it between requests in a server.\n *\n * This is appropriate for server-side code (like Netlify Lambdas) or non-reactive\n * webapps.\n *\n * @public\n */\nexport class ConvexHttpClient {\n private readonly address: string;\n private auth: string | undefined;\n private adminAuth: string | undefined;\n private encodedTsPromise?: Promise<string>;\n private debug: boolean;\n private fetchOptions?: FetchOptions;\n private logger: Logger;\n private mutationQueue: Array<{\n mutation: FunctionReference<\"mutation\">;\n args: FunctionArgs<any>;\n resolve: (value: any) => void;\n reject: (error: any) => void;\n }> = [];\n private isProcessingQueue: boolean = false;\n\n /**\n * Create a new {@link ConvexHttpClient}.\n *\n * @param address - The url of your Convex deployment, often provided\n * by an environment variable. E.g. `https://small-mouse-123.convex.cloud`.\n * @param options - An object of options.\n * - `skipConvexDeploymentUrlCheck` - Skip validating that the Convex deployment URL looks like\n * `https://happy-animal-123.convex.cloud` or localhost. This can be useful if running a self-hosted\n * Convex backend that uses a different URL.\n * - `logger` - A logger or a boolean. If not provided, logs to the console.\n * You can construct your own logger to customize logging to log elsewhere\n * or not log at all, or use `false` as a shorthand for a no-op logger.\n * A logger is an object with 4 methods: log(), warn(), error(), and logVerbose().\n * These methods can receive multiple arguments of any types, like console.log().\n * - `auth` - A JWT containing identity claims accessible in Convex functions.\n * This identity may expire so it may be necessary to call `setAuth()` later,\n * but for short-lived clients it's convenient to specify this value here.\n */\n constructor(\n address: string,\n options?: {\n skipConvexDeploymentUrlCheck?: boolean;\n logger?: Logger | boolean;\n auth?: string;\n },\n ) {\n if (typeof options === \"boolean\") {\n throw new Error(\n \"skipConvexDeploymentUrlCheck as the second argument is no longer supported. Please pass an options object, `{ skipConvexDeploymentUrlCheck: true }`.\",\n );\n }\n const opts = options ?? {};\n if (opts.skipConvexDeploymentUrlCheck !== true) {\n validateDeploymentUrl(address);\n }\n this.logger =\n options?.logger === false\n ? instantiateNoopLogger({ verbose: false })\n : options?.logger !== true && options?.logger\n ? options.logger\n : instantiateDefaultLogger({ verbose: false });\n this.address = address;\n this.debug = true;\n this.auth = undefined;\n this.adminAuth = undefined;\n if (options?.auth) {\n this.setAuth(options.auth);\n }\n }\n\n /**\n * Obtain the {@link ConvexHttpClient}'s URL to its backend.\n * @deprecated Use url, which returns the url without /api at the end.\n *\n * @returns The URL to the Convex backend, including the client's API version.\n */\n backendUrl(): string {\n return `${this.address}/api`;\n }\n\n /**\n * Return the address for this client, useful for creating a new client.\n *\n * Not guaranteed to match the address with which this client was constructed:\n * it may be canonicalized.\n */\n get url() {\n return this.address;\n }\n\n /**\n * Set the authentication token to be used for subsequent queries and mutations.\n *\n * Should be called whenever the token changes (i.e. due to expiration and refresh).\n *\n * @param value - JWT-encoded OpenID Connect identity token.\n */\n setAuth(value: string) {\n this.clearAuth();\n this.auth = value;\n }\n\n /**\n * Set admin auth token to allow calling internal queries, mutations, and actions\n * and acting as an identity.\n *\n * @internal\n */\n setAdminAuth(token: string, actingAsIdentity?: UserIdentityAttributes) {\n this.clearAuth();\n if (actingAsIdentity !== undefined) {\n // Encode the identity to a base64 string\n const bytes = new TextEncoder().encode(JSON.stringify(actingAsIdentity));\n const actingAsIdentityEncoded = btoa(String.fromCodePoint(...bytes));\n this.adminAuth = `${token}:${actingAsIdentityEncoded}`;\n } else {\n this.adminAuth = token;\n }\n }\n\n /**\n * Clear the current authentication token if set.\n */\n clearAuth() {\n this.auth = undefined;\n this.adminAuth = undefined;\n }\n\n /**\n * Sets whether the result log lines should be printed on the console or not.\n *\n * @internal\n */\n setDebug(debug: boolean) {\n this.debug = debug;\n }\n\n /**\n * Used to customize the fetch behavior in some runtimes.\n *\n * @internal\n */\n setFetchOptions(fetchOptions: FetchOptions) {\n this.fetchOptions = fetchOptions;\n }\n\n /**\n * This API is experimental: it may change or disappear.\n *\n * Execute a Convex query function at the same timestamp as every other\n * consistent query execution run by this HTTP client.\n *\n * This doesn't make sense for long-lived ConvexHttpClients as Convex\n * backends can read a limited amount into the past: beyond 30 seconds\n * in the past may not be available.\n *\n * Create a new client to use a consistent time.\n *\n * @param name - The name of the query.\n * @param args - The arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the query's result.\n *\n * @deprecated This API is experimental: it may change or disappear.\n */\n async consistentQuery<Query extends FunctionReference<\"query\">>(\n query: Query,\n ...args: OptionalRestArgs<Query>\n ): Promise<FunctionReturnType<Query>> {\n const queryArgs = parseArgs(args[0]);\n\n const timestampPromise = this.getTimestamp();\n return await this.queryInner(query, queryArgs, { timestampPromise });\n }\n\n private async getTimestamp() {\n if (this.encodedTsPromise) {\n return this.encodedTsPromise;\n }\n return (this.encodedTsPromise = this.getTimestampInner());\n }\n\n private async getTimestampInner() {\n const localFetch = specifiedFetch || fetch;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Convex-Client\": `npm-${version}`,\n };\n const response = await localFetch(`${this.address}/api/query_ts`, {\n ...this.fetchOptions,\n method: \"POST\",\n headers: headers,\n });\n if (!response.ok) {\n throw new Error(await response.text());\n }\n const { ts } = (await response.json()) as { ts: string };\n return ts;\n }\n\n /**\n * Execute a Convex query function.\n *\n * @param name - The name of the query.\n * @param args - The arguments object for the query. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the query's result.\n */\n async query<Query extends FunctionReference<\"query\">>(\n query: Query,\n ...args: OptionalRestArgs<Query>\n ): Promise<FunctionReturnType<Query>> {\n const queryArgs = parseArgs(args[0]);\n return await this.queryInner(query, queryArgs, {});\n }\n\n private async queryInner<Query extends FunctionReference<\"query\">>(\n query: Query,\n queryArgs: FunctionArgs<Query>,\n options: { timestampPromise?: Promise<string> },\n ): Promise<FunctionReturnType<Query>> {\n const name = getFunctionName(query);\n const args = [convexToJson(queryArgs)];\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Convex-Client\": `npm-${version}`,\n };\n if (this.adminAuth) {\n headers[\"Authorization\"] = `Convex ${this.adminAuth}`;\n } else if (this.auth) {\n headers[\"Authorization\"] = `Bearer ${this.auth}`;\n }\n const localFetch = specifiedFetch || fetch;\n\n const timestamp = options.timestampPromise\n ? await options.timestampPromise\n : undefined;\n\n const body = JSON.stringify({\n path: name,\n format: \"convex_encoded_json\",\n args,\n ...(timestamp ? { ts: timestamp } : {}),\n });\n const endpoint = timestamp\n ? `${this.address}/api/query_at_ts`\n : `${this.address}/api/query`;\n\n const response = await localFetch(endpoint, {\n ...this.fetchOptions,\n body,\n method: \"POST\",\n headers: headers,\n });\n if (!response.ok && response.status !== STATUS_CODE_UDF_FAILED) {\n throw new Error(await response.text());\n }\n const respJSON = await response.json();\n\n if (this.debug) {\n for (const line of respJSON.logLines ?? []) {\n logForFunction(this.logger, \"info\", \"query\", name, line);\n }\n }\n switch (respJSON.status) {\n case \"success\":\n return jsonToConvex(respJSON.value);\n case \"error\":\n if (respJSON.errorData !== undefined) {\n throw forwardErrorData(\n respJSON.errorData,\n new ConvexError(respJSON.errorMessage),\n );\n }\n throw new Error(respJSON.errorMessage);\n default:\n throw new Error(`Invalid response: ${JSON.stringify(respJSON)}`);\n }\n }\n\n private async mutationInner<Mutation extends FunctionReference<\"mutation\">>(\n mutation: Mutation,\n mutationArgs: FunctionArgs<Mutation>,\n ): Promise<FunctionReturnType<Mutation>> {\n const name = getFunctionName(mutation);\n const body = JSON.stringify({\n path: name,\n format: \"convex_encoded_json\",\n args: [convexToJson(mutationArgs)],\n });\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Convex-Client\": `npm-${version}`,\n };\n if (this.adminAuth) {\n headers[\"Authorization\"] = `Convex ${this.adminAuth}`;\n } else if (this.auth) {\n headers[\"Authorization\"] = `Bearer ${this.auth}`;\n }\n const localFetch = specifiedFetch || fetch;\n const response = await localFetch(`${this.address}/api/mutation`, {\n ...this.fetchOptions,\n body,\n method: \"POST\",\n headers: headers,\n });\n if (!response.ok && response.status !== STATUS_CODE_UDF_FAILED) {\n throw new Error(await response.text());\n }\n const respJSON = await response.json();\n if (this.debug) {\n for (const line of respJSON.logLines ?? []) {\n logForFunction(this.logger, \"info\", \"mutation\", name, line);\n }\n }\n switch (respJSON.status) {\n case \"success\":\n return jsonToConvex(respJSON.value);\n case \"error\":\n if (respJSON.errorData !== undefined) {\n throw forwardErrorData(\n respJSON.errorData,\n new ConvexError(respJSON.errorMessage),\n );\n }\n throw new Error(respJSON.errorMessage);\n default:\n throw new Error(`Invalid response: ${JSON.stringify(respJSON)}`);\n }\n }\n\n private async processMutationQueue() {\n if (this.isProcessingQueue) {\n return;\n }\n\n this.isProcessingQueue = true;\n while (this.mutationQueue.length > 0) {\n const { mutation, args, resolve, reject } = this.mutationQueue.shift()!;\n try {\n const result = await this.mutationInner(mutation, args);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }\n this.isProcessingQueue = false;\n }\n\n private enqueueMutation<Mutation extends FunctionReference<\"mutation\">>(\n mutation: Mutation,\n args: FunctionArgs<Mutation>,\n ): Promise<FunctionReturnType<Mutation>> {\n return new Promise((resolve, reject) => {\n this.mutationQueue.push({ mutation, args, resolve, reject });\n void this.processMutationQueue();\n });\n }\n\n /**\n * Execute a Convex mutation function. Mutations are queued by default.\n *\n * @param name - The name of the mutation.\n * @param args - The arguments object for the mutation. If this is omitted,\n * the arguments will be `{}`.\n * @param options - An optional object containing\n * @returns A promise of the mutation's result.\n */\n async mutation<Mutation extends FunctionReference<\"mutation\">>(\n mutation: Mutation,\n ...args: ArgsAndOptions<Mutation, HttpMutationOptions>\n ): Promise<FunctionReturnType<Mutation>> {\n const [fnArgs, options] = args;\n const mutationArgs = parseArgs(fnArgs);\n const queued = !options?.skipQueue;\n\n if (queued) {\n return await this.enqueueMutation(mutation, mutationArgs);\n } else {\n return await this.mutationInner(mutation, mutationArgs);\n }\n }\n\n /**\n * Execute a Convex action function. Actions are not queued.\n *\n * @param name - The name of the action.\n * @param args - The arguments object for the action. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the action's result.\n */\n async action<Action extends FunctionReference<\"action\">>(\n action: Action,\n ...args: OptionalRestArgs<Action>\n ): Promise<FunctionReturnType<Action>> {\n const actionArgs = parseArgs(args[0]);\n const name = getFunctionName(action);\n const body = JSON.stringify({\n path: name,\n format: \"convex_encoded_json\",\n args: [convexToJson(actionArgs)],\n });\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Convex-Client\": `npm-${version}`,\n };\n if (this.adminAuth) {\n headers[\"Authorization\"] = `Convex ${this.adminAuth}`;\n } else if (this.auth) {\n headers[\"Authorization\"] = `Bearer ${this.auth}`;\n }\n const localFetch = specifiedFetch || fetch;\n const response = await localFetch(`${this.address}/api/action`, {\n ...this.fetchOptions,\n body,\n method: \"POST\",\n headers: headers,\n });\n if (!response.ok && response.status !== STATUS_CODE_UDF_FAILED) {\n throw new Error(await response.text());\n }\n const respJSON = await response.json();\n if (this.debug) {\n for (const line of respJSON.logLines ?? []) {\n logForFunction(this.logger, \"info\", \"action\", name, line);\n }\n }\n switch (respJSON.status) {\n case \"success\":\n return jsonToConvex(respJSON.value);\n case \"error\":\n if (respJSON.errorData !== undefined) {\n throw forwardErrorData(\n respJSON.errorData,\n new ConvexError(respJSON.errorMessage),\n );\n }\n throw new Error(respJSON.errorMessage);\n default:\n throw new Error(`Invalid response: ${JSON.stringify(respJSON)}`);\n }\n }\n\n /**\n * Execute a Convex function of an unknown type. These function calls are not queued.\n *\n * @param name - The name of the function.\n * @param args - The arguments object for the function. If this is omitted,\n * the arguments will be `{}`.\n * @returns A promise of the function's result.\n *\n * @internal\n */\n async function<\n AnyFunction extends FunctionReference<\"query\" | \"mutation\" | \"action\">,\n >(\n anyFunction: AnyFunction | string,\n componentPath?: string,\n ...args: OptionalRestArgs<AnyFunction>\n ): Promise<FunctionReturnType<AnyFunction>> {\n const functionArgs = parseArgs(args[0]);\n const name =\n typeof anyFunction === \"string\"\n ? anyFunction\n : getFunctionName(anyFunction);\n const body = JSON.stringify({\n componentPath: componentPath,\n path: name,\n format: \"convex_encoded_json\",\n args: convexToJson(functionArgs),\n });\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"Convex-Client\": `npm-${version}`,\n };\n if (this.adminAuth) {\n headers[\"Authorization\"] = `Convex ${this.adminAuth}`;\n } else if (this.auth) {\n headers[\"Authorization\"] = `Bearer ${this.auth}`;\n }\n const localFetch = specifiedFetch || fetch;\n const response = await localFetch(`${this.address}/api/function`, {\n ...this.fetchOptions,\n body,\n method: \"POST\",\n headers: headers,\n });\n if (!response.ok && response.status !== STATUS_CODE_UDF_FAILED) {\n throw new Error(await response.text());\n }\n const respJSON = await response.json();\n if (this.debug) {\n for (const line of respJSON.logLines ?? []) {\n logForFunction(this.logger, \"info\", \"any\", name, line);\n }\n }\n switch (respJSON.status) {\n case \"success\":\n return jsonToConvex(respJSON.value);\n case \"error\":\n if (respJSON.errorData !== undefined) {\n throw forwardErrorData(\n respJSON.errorData,\n new ConvexError(respJSON.errorMessage),\n );\n }\n throw new Error(respJSON.errorMessage);\n default:\n throw new Error(`Invalid response: ${JSON.stringify(respJSON)}`);\n }\n }\n}\n\nfunction forwardErrorData(errorData: JSONValue, error: ConvexError<string>) {\n (error as ConvexError<any>).data = jsonToConvex(errorData);\n return error;\n}\n\n/**\n * @internal\n */\ntype FetchOptions = { cache: \"force-cache\" | \"no-store\" };\n","import { validateDeploymentUrl } from \"../common/index.js\";\nimport {\n BaseConvexClient,\n BaseConvexClientOptions,\n MutationOptions,\n QueryToken,\n UserIdentityAttributes,\n} from \"./index.js\";\nimport {\n FunctionArgs,\n FunctionReference,\n FunctionReturnType,\n} from \"../server/index.js\";\nimport { getFunctionName } from \"../server/api.js\";\nimport { AuthTokenFetcher } from \"./sync/authentication_manager.js\";\nimport { ConnectionState } from \"./sync/client.js\";\n\n// In Node.js builds this points to a bundled WebSocket implementation. If no\n// WebSocket implementation is manually specified or globally available,\n// this one is used.\nlet defaultWebSocketConstructor: typeof WebSocket | undefined;\n\n/** internal */\nexport function setDefaultWebSocketConstructor(ws: typeof WebSocket) {\n defaultWebSocketConstructor = ws;\n}\n\nexport type ConvexClientOptions = BaseConvexClientOptions & {\n /**\n * `disabled` makes onUpdate callback registration a no-op and actions,\n * mutations and one-shot queries throw. Setting disabled to true may be\n * useful for server-side rendering, where subscriptions don't make sense.\n */\n disabled?: boolean;\n /**\n * Whether to prompt users in browsers about queued or in-flight mutations.\n * This only works in environments where `window.onbeforeunload` is available.\n *\n * Defaults to true when `window` is defined, otherwise false.\n */\n unsavedChangesWarning?: boolean;\n};\n\n/**\n * Stops callbacks from running.\n *\n * @public\n */\nexport type Unsubscribe<T> = {\n /** Stop calling callback when query results changes. If this is the last listener on this query, stop received updates. */\n (): void;\n /** Stop calling callback when query results changes. If this is the last listener on this query, stop received updates. */\n unsubscribe(): void;\n /** Get the last known value, possibly with local optimistic updates applied. */\n getCurrentValue(): T | undefined;\n /** @internal */\n getQueryLogs(): string[] | undefined;\n};\n\n/**\n * Subscribes to Convex query functions and executes mutations and actions over a WebSocket.\n *\n * Optimistic updates for mutations are not provided for this client.\n * Third party clients may choose to wrap {@link browser.BaseConvexClient} for additional control.\n *\n * ```ts\n * const client = new ConvexClient(\"https://happy-otter-123.convex.cloud\");\n * const unsubscribe = client.onUpdate(api.messages.list, {}, (messages) => {\n * console.log(messages[0].body);\n * });\n * ```\n *\n * @public\n */\nexport class ConvexClient {\n private listeners: Set<QueryInfo>;\n private _client: BaseConvexClient | undefined;\n // A synthetic server event to run callbacks the first time\n private callNewListenersWithCurrentValuesTimer:\n | ReturnType<typeof setTimeout>\n | undefined;\n private _closed: boolean;\n private _disabled: boolean;\n /**\n * Once closed no registered callbacks will fire again.\n */\n get closed(): boolean {\n return this._closed;\n }\n get client(): BaseConvexClient {\n if (this._client) return this._client;\n throw new Error(\"ConvexClient is disabled\");\n }\n get disabled(): boolean {\n return this._disabled;\n }\n\n /**\n * Construct a client and immediately initiate a WebSocket connection to the passed address.\n *\n * @public\n */\n constructor(address: string, options: ConvexClientOptions = {}) {\n if (options.skipConvexDeploymentUrlCheck !== true) {\n validateDeploymentUrl(address);\n }\n const { disabled, ...baseOptions } = options;\n this._closed = false;\n this._disabled = !!disabled;\n if (\n defaultWebSocketConstructor &&\n !(\"webSocketConstructor\" in baseOptions) &&\n typeof WebSocket === \"undefined\"\n ) {\n baseOptions.webSocketConstructor = defaultWebSocketConstructor;\n }\n if (\n typeof window === \"undefined\" &&\n !(\"unsavedChangesWarning\" in baseOptions)\n ) {\n baseOptions.unsavedChangesWarning = false;\n }\n if (!this.disabled) {\n this._client = new BaseConvexClient(\n address,\n (updatedQueries) => this._transition(updatedQueries),\n baseOptions,\n );\n }\n this.listeners = new Set();\n }\n\n /**\n * Call a callback whenever a new result for a query is received. The callback\n * will run soon after being registered if a result for the query is already\n * in memory.\n *\n * The return value is an {@link Unsubscribe} object which is both a function\n * an an object with properties. Both of the patterns below work with this object:\n *\n *```ts\n * // call the return value as a function\n * const unsubscribe = client.onUpdate(api.messages.list, {}, (messages) => {\n * console.log(messages);\n * });\n * unsubscribe();\n *\n * // unpack the return value into its properties\n * const {\n * getCurrentValue,\n * unsubscribe,\n * } = client.onUpdate(api.messages.list, {}, (messages) => {\n * console.log(messages);\n * });\n *```\n *\n * @param query - A {@link server.FunctionReference} for the public query to run.\n * @param args - The arguments to run the query with.\n * @param callback - Function to call when the query result updates.\n * @param onError - Function to call when the query result updates with an error.\n * If not provided, errors will be thrown instead of calling the callback.\n *\n * @return an {@link Unsubscribe} function to stop calling the onUpdate function.\n */\n onUpdate<Query extends FunctionReference<\"query\">>(\n query: Query,\n args: FunctionArgs<Query>,\n callback: (result: FunctionReturnType<Query>) => unknown,\n onError?: (e: Error) => unknown,\n ): Unsubscribe<Query[\"_returnType\"]> {\n if (this.disabled) {\n const disabledUnsubscribe = (() => {}) as Unsubscribe<\n Query[\"_returnType\"]\n >;\n const unsubscribeProps: RemoveCallSignature<\n Unsubscribe<Query[\"_returnType\"]>\n > = {\n unsubscribe: disabledUnsubscribe,\n getCurrentValue: () => undefined,\n getQueryLogs: () => undefined,\n };\n Object.assign(disabledUnsubscribe, unsubscribeProps);\n return disabledUnsubscribe;\n }\n\n // BaseConvexClient takes care of deduplicating queries subscriptions...\n const { queryToken, unsubscribe } = this.client.subscribe(\n getFunctionName(query),\n args,\n );\n\n // ...but we still need to bookkeep callbacks to actually call them.\n const queryInfo: QueryInfo = {\n queryToken,\n callback,\n onError,\n unsubscribe,\n hasEverRun: false,\n query,\n args,\n };\n this.listeners.add(queryInfo);\n\n // If the callback is registered for a query with a result immediately available\n // schedule a fake transition to call the callback soon instead of waiting for\n // a new server update (which could take seconds or days).\n if (\n this.queryResultReady(queryToken) &&\n this.callNewListenersWithCurrentValuesTimer === undefined\n ) {\n this.callNewListenersWithCurrentValuesTimer = setTimeout(\n () => this.callNewListenersWithCurrentValues(),\n 0,\n );\n }\n\n const unsubscribeProps: RemoveCallSignature<\n Unsubscribe<Query[\"_returnType\"]>\n > = {\n unsubscribe: () => {\n if (this.closed) {\n // all unsubscribes already ran\n return;\n }\n this.listeners.delete(queryInfo);\n unsubscribe();\n },\n getCurrentValue: () => this.client.localQueryResultByToken(queryToken),\n getQueryLogs: () => this.client.localQueryLogs(queryToken),\n };\n const ret = unsubscribeProps.unsubscribe as Unsubscribe<\n Query[\"_returnType\"]\n >;\n Object.assign(ret, unsubscribeProps);\n return ret;\n }\n\n // Run all callbacks that have never been run before if they have a query\n // result available now.\n private callNewListenersWithCurrentValues() {\n this.callNewListenersWithCurrentValuesTimer = undefined;\n this._transition([], true);\n }\n\n private queryResultReady(queryToken: QueryToken): boolean {\n return this.client.hasLocalQueryResultByToken(queryToken);\n }\n\n async close() {\n if (this.disabled) return;\n // prevent pending updates\n this.listeners.clear();\n this._closed = true;\n return this.client.close();\n }\n\n /**\n * Set the authentication token to be used for subsequent queries and mutations.\n * `fetchToken` will be called automatically again if a token expires.\n * `fetchToken` should return `null` if the token cannot be retrieved, for example\n * when the user's rights were permanently revoked.\n * @param fetchToken - an async function returning the JWT (typically an OpenID Connect Identity Token)\n * @param onChange - a callback that will be called when the authentication status changes\n */\n setAuth(\n fetchToken: AuthTokenFetcher,\n onChange?: (isAuthenticated: boolean) => void,\n ) {\n if (this.disabled) return;\n this.client.setAuth(\n fetchToken,\n onChange ??\n (() => {\n // Do nothing\n }),\n );\n }\n\n /**\n * @internal\n */\n setAdminAuth(token: string, identity?: UserIdentityAttributes) {\n if (this.closed) {\n throw new Error(\"ConvexClient has already been closed.\");\n }\n if (this.disabled) return;\n this.client.setAdminAuth(token, identity);\n }\n\n /**\n * @internal\n */\n _transition(updatedQueries: QueryToken[], callNewListeners = false) {\n // Deduping subscriptions happens in the BaseConvexClient, so not much to do here.\n\n // Call all callbacks in the order they were registered\n for (const queryInfo of this.listeners) {\n const { callback, queryToken, onError, hasEverRun } = queryInfo;\n if (\n updatedQueries.includes(queryToken) ||\n (callNewListeners &&\n !hasEverRun &&\n this.client.hasLocalQueryResultByToken(queryToken))\n ) {\n queryInfo.hasEverRun = true;\n let newValue;\n try {\n newValue = this.client.localQueryResultByToken(queryToken);\n } catch (error) {\n if (!(error instanceof Error)) throw error;\n if (onError) {\n onError(\n error,\n \"Second argument to onUpdate onError is reserved for later use\",\n );\n } else {\n // Make some noise without unsubscribing or failing to call other callbacks.\n void Promise.reject(error);\n }\n continue;\n }\n callback(\n newValue,\n \"Second argument to onUpdate callback is reserved for later use\",\n );\n }\n }\n }\n\n /**\n * Execute a mutation function.\n *\n * @param mutation - A {@link server.FunctionReference} for the public mutation\n * to run.\n * @param args - An arguments object for the mutation.\n * @param options - A {@link MutationOptions} options object for the mutation.\n * @returns A promise of the mutation's result.\n */\n async mutation<Mutation extends FunctionReference<\"mutation\">>(\n mutation: Mutation,\n args: FunctionArgs<Mutation>,\n options?: MutationOptions,\n ): Promise<Awaited<FunctionReturnType<Mutation>>> {\n if (this.disabled) throw new Error(\"ConvexClient is disabled\");\n return await this.client.mutation(getFunctionName(mutation), args, options);\n }\n\n /**\n * Execute an action function.\n *\n * @param action - A {@link server.FunctionReference} for the public action\n * to run.\n * @param args - An arguments object for the action.\n * @returns A promise of the action's result.\n */\n async action<Action extends FunctionReference<\"action\">>(\n action: Action,\n args: FunctionArgs<Action>,\n ): Promise<Awaited<FunctionReturnType<Action>>> {\n if (this.disabled) throw new Error(\"ConvexClient is disabled\");\n return await this.client.action(getFunctionName(action), args);\n }\n\n /**\n * Fetch a query result once.\n *\n * @param query - A {@link server.FunctionReference} for the public query\n * to run.\n * @param args - An arguments object for the query.\n * @returns A promise of the query's result.\n */\n async query<Query extends FunctionReference<\"query\">>(\n query: Query,\n args: Query[\"_args\"],\n ): Promise<Awaited<Query[\"_returnType\"]>> {\n if (this.disabled) throw new Error(\"ConvexClient is disabled\");\n const value = this.client.localQueryResult(getFunctionName(query), args) as\n | Awaited<Query[\"_returnType\"]>\n | undefined;\n if (value !== undefined) return Promise.resolve(value);\n\n return new Promise((resolve, reject) => {\n const { unsubscribe } = this.onUpdate(\n query,\n args,\n (value) => {\n unsubscribe();\n resolve(value);\n },\n (e: Error) => {\n unsubscribe();\n reject(e);\n },\n );\n });\n }\n\n /**\n * Get the current {@link ConnectionState} between the client and the Convex\n * backend.\n *\n * @returns The {@link ConnectionState} with the Convex backend.\n */\n connectionState(): ConnectionState {\n if (this.disabled) throw new Error(\"ConvexClient is disabled\");\n return this.client.connectionState();\n }\n\n /**\n * Subscribe to the {@link ConnectionState} between the client and the Convex\n * backend, calling a callback each time it changes.\n *\n * Subscribed callbacks will be called when any part of ConnectionState changes.\n * ConnectionState may grow in future versions (e.g. to provide a array of\n * inflight requests) in which case callbacks would be called more frequently.\n *\n * @returns An unsubscribe function to stop listening.\n */\n subscribeToConnectionState(\n cb: (connectionState: ConnectionState) => void,\n ): () => void {\n if (this.disabled) return () => {};\n return this.client.subscribeToConnectionState(cb);\n }\n}\n\n// internal information tracked about each registered callback\ntype QueryInfo = {\n callback: (result: any, meta: unknown) => unknown;\n onError: ((e: Error, meta: unknown) => unknown) | undefined;\n unsubscribe: () => void;\n queryToken: QueryToken;\n hasEverRun: boolean;\n // query and args are just here for debugging, the queryToken is authoritative\n query: FunctionReference<\"query\">;\n args: any;\n};\n\ntype RemoveCallSignature<T> = Omit<T, never>;\n","'use strict';\n\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let terminateOnDestroy = true;\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg, isBinary) {\n const data =\n !isBinary && duplex._readableState.objectMode ? msg.toString() : msg;\n\n if (!duplex.push(data)) ws.pause();\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (ws.isPaused) ws.resume();\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","'use strict';\n\nconst BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];\nconst hasBlob = typeof Blob !== 'undefined';\n\nif (hasBlob) BINARY_TYPES.push('blob');\n\nmodule.exports = {\n BINARY_TYPES,\n EMPTY_BUFFER: Buffer.alloc(0),\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n hasBlob,\n kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),\n kListener: Symbol('kListener'),\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n NOOP: () => {}\n};\n","var fs = require('fs')\nvar path = require('path')\nvar os = require('os')\n\n// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression'\nvar runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\n\nvar vars = (process.config && process.config.variables) || {}\nvar prebuildsOnly = !!process.env.PREBUILDS_ONLY\nvar abi = process.versions.modules // TODO: support old node where this is undef\nvar runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node')\n\nvar arch = process.env.npm_config_arch || os.arch()\nvar platform = process.env.npm_config_platform || os.platform()\nvar libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc')\nvar armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || ''\nvar uv = (process.versions.uv || '').split('.')[0]\n\nmodule.exports = load\n\nfunction load (dir) {\n return runtimeRequire(load.resolve(dir))\n}\n\nload.resolve = load.path = function (dir) {\n dir = path.resolve(dir || '.')\n\n try {\n var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_')\n if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']\n } catch (err) {}\n\n if (!prebuildsOnly) {\n var release = getFirst(path.join(dir, 'build/Release'), matchBuild)\n if (release) return release\n\n var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)\n if (debug) return debug\n }\n\n var prebuild = resolve(dir)\n if (prebuild) return prebuild\n\n var nearby = resolve(path.dirname(process.execPath))\n if (nearby) return nearby\n\n var target = [\n 'platform=' + platform,\n 'arch=' + arch,\n 'runtime=' + runtime,\n 'abi=' + abi,\n 'uv=' + uv,\n armv ? 'armv=' + armv : '',\n 'libc=' + libc,\n 'node=' + process.versions.node,\n process.versions.electron ? 'electron=' + process.versions.electron : '',\n typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line\n ].filter(Boolean).join(' ')\n\n throw new Error('No native build was found for ' + target + '\\n loaded from: ' + dir + '\\n')\n\n function resolve (dir) {\n // Find matching \"prebuilds/<platform>-<arch>\" directory\n var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)\n var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]\n if (!tuple) return\n\n // Find most specific flavor first\n var prebuilds = path.join(dir, 'prebuilds', tuple.name)\n var parsed = readdirSync(prebuilds).map(parseTags)\n var candidates = parsed.filter(matchTags(runtime, abi))\n var winner = candidates.sort(compareTags(runtime))[0]\n if (winner) return path.join(prebuilds, winner.file)\n }\n}\n\nfunction readdirSync (dir) {\n try {\n return fs.readdirSync(dir)\n } catch (err) {\n return []\n }\n}\n\nfunction getFirst (dir, filter) {\n var files = readdirSync(dir).filter(filter)\n return files[0] && path.join(dir, files[0])\n}\n\nfunction matchBuild (name) {\n return /\\.node$/.test(name)\n}\n\nfunction parseTuple (name) {\n // Example: darwin-x64+arm64\n var arr = name.split('-')\n if (arr.length !== 2) return\n\n var platform = arr[0]\n var architectures = arr[1].split('+')\n\n if (!platform) return\n if (!architectures.length) return\n if (!architectures.every(Boolean)) return\n\n return { name, platform, architectures }\n}\n\nfunction matchTuple (platform, arch) {\n return function (tuple) {\n if (tuple == null) return false\n if (tuple.platform !== platform) return false\n return tuple.architectures.includes(arch)\n }\n}\n\nfunction compareTuples (a, b) {\n // Prefer single-arch prebuilds over multi-arch\n return a.architectures.length - b.architectures.length\n}\n\nfunction parseTags (file) {\n var arr = file.split('.')\n var extension = arr.pop()\n var tags = { file: file, specificity: 0 }\n\n if (extension !== 'node') return\n\n for (var i = 0; i < arr.length; i++) {\n var tag = arr[i]\n\n if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') {\n tags.runtime = tag\n } else if (tag === 'napi') {\n tags.napi = true\n } else if (tag.slice(0, 3) === 'abi') {\n tags.abi = tag.slice(3)\n } else if (tag.slice(0, 2) === 'uv') {\n tags.uv = tag.slice(2)\n } else if (tag.slice(0, 4) === 'armv') {\n tags.armv = tag.slice(4)\n } else if (tag === 'glibc' || tag === 'musl') {\n tags.libc = tag\n } else {\n continue\n }\n\n tags.specificity++\n }\n\n return tags\n}\n\nfunction matchTags (runtime, abi) {\n return function (tags) {\n if (tags == null) return false\n if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false\n if (tags.abi && tags.abi !== abi && !tags.napi) return false\n if (tags.uv && tags.uv !== uv) return false\n if (tags.armv && tags.armv !== armv) return false\n if (tags.libc && tags.libc !== libc) return false\n\n return true\n }\n}\n\nfunction runtimeAgnostic (tags) {\n return tags.runtime === 'node' && tags.napi\n}\n\nfunction compareTags (runtime) {\n // Precedence: non-agnostic runtime, abi over napi, then by specificity.\n return function (a, b) {\n if (a.runtime !== b.runtime) {\n return a.runtime === runtime ? -1 : 1\n } else if (a.abi !== b.abi) {\n return a.abi ? -1 : 1\n } else if (a.specificity !== b.specificity) {\n return a.specificity > b.specificity ? -1 : 1\n } else {\n return 0\n }\n }\n}\n\nfunction isNwjs () {\n return !!(process.versions && process.versions.nw)\n}\n\nfunction isElectron () {\n if (process.versions && process.versions.electron) return true\n if (process.env.ELECTRON_RUN_AS_NODE) return true\n return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'\n}\n\nfunction isAlpine (platform) {\n return platform === 'linux' && fs.existsSync('/etc/alpine-release')\n}\n\n// Exposed for unit tests\n// TODO: move to lib\nload.parseTags = parseTags\nload.matchTags = matchTags\nload.compareTags = compareTags\nload.parseTuple = parseTuple\nload.matchTuple = matchTuple\nload.compareTuples = compareTuples\n","const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\nif (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that\n module.exports = runtimeRequire.addon.bind(runtimeRequire)\n} else { // else use the runtime version here\n module.exports = require('./node-gyp-build.js')\n}\n","'use strict';\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nconst mask = (source, mask, output, offset, length) => {\n for (var i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n};\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nconst unmask = (buffer, mask) => {\n // Required until https://github.com/nodejs/node/issues/9006 is resolved.\n const length = buffer.length;\n for (var i = 0; i < length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n};\n\nmodule.exports = { mask, unmask };\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) {\n return new FastBuffer(target.buffer, target.byteOffset, offset);\n }\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.length === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = new FastBuffer(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\nmodule.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n};\n\n/* istanbul ignore else */\nif (!process.env.WS_NO_BUFFER_UTIL) {\n try {\n const bufferUtil = require('bufferutil');\n\n module.exports.mask = function (source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bufferUtil.mask(source, mask, output, offset, length);\n };\n\n module.exports.unmask = function (buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bufferUtil.unmask(buffer, mask);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode } = require('./constants');\n\nconst FastBuffer = Buffer[Symbol.species];\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed if context takeover is disabled\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {(Buffer|String)} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) {\n data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4);\n }\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0x00) { // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) { // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) { // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80 || // overlong\n buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0 // surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80 || // overlong\n buf[i] === 0xf4 && buf[i + 1] > 0x8f || buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = isValidUTF8;\n","'use strict';\n\ntry {\n module.exports = require('node-gyp-build')(__dirname);\n} catch (e) {\n module.exports = require('./fallback');\n}\n","'use strict';\n\nconst { isUtf8 } = require('buffer');\n\nconst { hasBlob } = require('./constants');\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Determines whether a value is a `Blob`.\n *\n * @param {*} value The value to be tested\n * @return {Boolean} `true` if `value` is a `Blob`, else `false`\n * @private\n */\nfunction isBlob(value) {\n return (\n hasBlob &&\n typeof value === 'object' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n (value[Symbol.toStringTag] === 'Blob' ||\n value[Symbol.toStringTag] === 'File')\n );\n}\n\nmodule.exports = {\n isBlob,\n isValidStatusCode,\n isValidUTF8: _isValidUTF8,\n tokenChars\n};\n\nif (isUtf8) {\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf);\n };\n} /* istanbul ignore else */ else if (!process.env.WS_NO_UTF_8_VALIDATE) {\n try {\n const isValidUTF8 = require('utf-8-validate');\n\n module.exports.isValidUTF8 = function (buf) {\n return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf);\n };\n } catch (e) {\n // Continue regardless of the error.\n }\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst FastBuffer = Buffer[Symbol.species];\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\nconst DEFER_EVENT = 6;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {Object} [options] Options object\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {String} [options.binaryType=nodebuffer] The type for binary data\n * @param {Object} [options.extensions] An object containing the negotiated\n * extensions\n * @param {Boolean} [options.isServer=false] Specifies whether to operate in\n * client or server mode\n * @param {Number} [options.maxPayload=0] The maximum allowed message length\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n */\n constructor(options = {}) {\n super();\n\n this._allowSynchronousEvents =\n options.allowSynchronousEvents !== undefined\n ? options.allowSynchronousEvents\n : true;\n this._binaryType = options.binaryType || BINARY_TYPES[0];\n this._extensions = options.extensions || {};\n this._isServer = !!options.isServer;\n this._maxPayload = options.maxPayload | 0;\n this._skipUTF8Validation = !!options.skipUTF8Validation;\n this[kWebSocket] = undefined;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._errored = false;\n this._loop = false;\n this._state = GET_INFO;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n\n return new FastBuffer(buf.buffer, buf.byteOffset, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = new FastBuffer(\n buf.buffer,\n buf.byteOffset + n,\n buf.length - n\n );\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n this.getInfo(cb);\n break;\n case GET_PAYLOAD_LENGTH_16:\n this.getPayloadLength16(cb);\n break;\n case GET_PAYLOAD_LENGTH_64:\n this.getPayloadLength64(cb);\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n this.getData(cb);\n break;\n case INFLATING:\n case DEFER_EVENT:\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n if (!this._errored) cb();\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @param {Function} cb Callback\n * @private\n */\n getInfo(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n const error = this.createError(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n\n cb(error);\n return;\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fragmented) {\n const error = this.createError(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n const error = this.createError(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n\n cb(error);\n return;\n }\n\n if (compressed) {\n const error = this.createError(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n\n cb(error);\n return;\n }\n\n if (\n this._payloadLength > 0x7d ||\n (this._opcode === 0x08 && this._payloadLength === 1)\n ) {\n const error = this.createError(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n } else {\n const error = this.createError(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n\n cb(error);\n return;\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n } else if (this._masked) {\n const error = this.createError(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n\n cb(error);\n return;\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength16(cb) {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n this.haveLength(cb);\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @param {Function} cb Callback\n * @private\n */\n getPayloadLength64(cb) {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n const error = this.createError(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n this.haveLength(cb);\n }\n\n /**\n * Payload length has been read.\n *\n * @param {Function} cb Callback\n * @private\n */\n haveLength(cb) {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n\n if (\n this._masked &&\n (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0\n ) {\n unmask(data, this._mask);\n }\n }\n\n if (this._opcode > 0x07) {\n this.controlMessage(data, cb);\n return;\n }\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its length is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n this.dataMessage(cb);\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n const error = this.createError(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n\n cb(error);\n return;\n }\n\n this._fragments.push(buf);\n }\n\n this.dataMessage(cb);\n if (this._state === GET_INFO) this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @param {Function} cb Callback\n * @private\n */\n dataMessage(cb) {\n if (!this._fin) {\n this._state = GET_INFO;\n return;\n }\n\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else if (this._binaryType === 'blob') {\n data = new Blob(fragments);\n } else {\n data = fragments;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit('message', data, true);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', data, true);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n if (this._state === INFLATING || this._allowSynchronousEvents) {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit('message', buf, false);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data, cb) {\n if (this._opcode === 0x08) {\n if (data.length === 0) {\n this._loop = false;\n this.emit('conclude', 1005, EMPTY_BUFFER);\n this.end();\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n const error = this.createError(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n\n cb(error);\n return;\n }\n\n const buf = new FastBuffer(\n data.buffer,\n data.byteOffset + 2,\n data.length - 2\n );\n\n if (!this._skipUTF8Validation && !isValidUTF8(buf)) {\n const error = this.createError(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n\n cb(error);\n return;\n }\n\n this._loop = false;\n this.emit('conclude', code, buf);\n this.end();\n }\n\n this._state = GET_INFO;\n return;\n }\n\n if (this._allowSynchronousEvents) {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n } else {\n this._state = DEFER_EVENT;\n setImmediate(() => {\n this.emit(this._opcode === 0x09 ? 'ping' : 'pong', data);\n this._state = GET_INFO;\n this.startLoop(cb);\n });\n }\n }\n\n /**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\n createError(ErrorCtor, message, prefix, statusCode, errorCode) {\n this._loop = false;\n this._errored = true;\n\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, this.createError);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n }\n}\n\nmodule.exports = Receiver;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex\" }] */\n\n'use strict';\n\nconst { Duplex } = require('stream');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER, kWebSocket, NOOP } = require('./constants');\nconst { isBlob, isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst kByteLength = Symbol('kByteLength');\nconst maskBuffer = Buffer.alloc(4);\nconst RANDOM_POOL_SIZE = 8 * 1024;\nlet randomPool;\nlet randomPoolPointer = RANDOM_POOL_SIZE;\n\nconst DEFAULT = 0;\nconst DEFLATING = 1;\nconst GET_BLOB_DATA = 2;\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {Duplex} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Function} [generateMask] The function used to generate the masking\n * key\n */\n constructor(socket, extensions, generateMask) {\n this._extensions = extensions || {};\n\n if (generateMask) {\n this._generateMask = generateMask;\n this._maskBuffer = Buffer.alloc(4);\n }\n\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._queue = [];\n this._state = DEFAULT;\n this.onerror = NOOP;\n this[kWebSocket] = undefined;\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {(Buffer|String)} data The data to frame\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {(Buffer|String)[]} The framed data\n * @public\n */\n static frame(data, options) {\n let mask;\n let merge = false;\n let offset = 2;\n let skipMasking = false;\n\n if (options.mask) {\n mask = options.maskBuffer || maskBuffer;\n\n if (options.generateMask) {\n options.generateMask(mask);\n } else {\n if (randomPoolPointer === RANDOM_POOL_SIZE) {\n /* istanbul ignore else */\n if (randomPool === undefined) {\n //\n // This is lazily initialized because server-sent frames must not\n // be masked so it may never be used.\n //\n randomPool = Buffer.alloc(RANDOM_POOL_SIZE);\n }\n\n randomFillSync(randomPool, 0, RANDOM_POOL_SIZE);\n randomPoolPointer = 0;\n }\n\n mask[0] = randomPool[randomPoolPointer++];\n mask[1] = randomPool[randomPoolPointer++];\n mask[2] = randomPool[randomPoolPointer++];\n mask[3] = randomPool[randomPoolPointer++];\n }\n\n skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0;\n offset = 6;\n }\n\n let dataLength;\n\n if (typeof data === 'string') {\n if (\n (!options.mask || skipMasking) &&\n options[kByteLength] !== undefined\n ) {\n dataLength = options[kByteLength];\n } else {\n data = Buffer.from(data);\n dataLength = data.length;\n }\n } else {\n dataLength = data.length;\n merge = options.mask && options.readOnly && !skipMasking;\n }\n\n let payloadLength = dataLength;\n\n if (dataLength >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (dataLength > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(dataLength, 2);\n } else if (payloadLength === 127) {\n target[2] = target[3] = 0;\n target.writeUIntBE(dataLength, 4, 6);\n }\n\n if (!options.mask) return [target, data];\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (skipMasking) return [target, data];\n\n if (merge) {\n applyMask(data, mask, target, offset, dataLength);\n return [target];\n }\n\n applyMask(data, mask, data, 0, dataLength);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {(String|Buffer)} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || !data.length) {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n\n if (typeof data === 'string') {\n buf.write(data, 2);\n } else {\n buf.set(data, 2);\n }\n }\n\n const options = {\n [kByteLength]: buf.length,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x08,\n readOnly: false,\n rsv1: false\n };\n\n if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, buf, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(buf, options), cb);\n }\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x09,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (byteLength > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n const options = {\n [kByteLength]: byteLength,\n fin: true,\n generateMask: this._generateMask,\n mask,\n maskBuffer: this._maskBuffer,\n opcode: 0x0a,\n readOnly,\n rsv1: false\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, false, options, cb]);\n } else {\n this.getBlobData(data, false, options, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, false, options, cb]);\n } else {\n this.sendFrame(Sender.frame(data, options), cb);\n }\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n let byteLength;\n let readOnly;\n\n if (typeof data === 'string') {\n byteLength = Buffer.byteLength(data);\n readOnly = false;\n } else if (isBlob(data)) {\n byteLength = data.size;\n readOnly = false;\n } else {\n data = toBuffer(data);\n byteLength = data.length;\n readOnly = toBuffer.readOnly;\n }\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (\n rsv1 &&\n perMessageDeflate &&\n perMessageDeflate.params[\n perMessageDeflate._isServer\n ? 'server_no_context_takeover'\n : 'client_no_context_takeover'\n ]\n ) {\n rsv1 = byteLength >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n const opts = {\n [kByteLength]: byteLength,\n fin: options.fin,\n generateMask: this._generateMask,\n mask: options.mask,\n maskBuffer: this._maskBuffer,\n opcode,\n readOnly,\n rsv1\n };\n\n if (isBlob(data)) {\n if (this._state !== DEFAULT) {\n this.enqueue([this.getBlobData, data, this._compress, opts, cb]);\n } else {\n this.getBlobData(data, this._compress, opts, cb);\n }\n } else if (this._state !== DEFAULT) {\n this.enqueue([this.dispatch, data, this._compress, opts, cb]);\n } else {\n this.dispatch(data, this._compress, opts, cb);\n }\n }\n\n /**\n * Gets the contents of a blob as binary data.\n *\n * @param {Blob} blob The blob\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * the data\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n getBlobData(blob, compress, options, cb) {\n this._bufferedBytes += options[kByteLength];\n this._state = GET_BLOB_DATA;\n\n blob\n .arrayBuffer()\n .then((arrayBuffer) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while the blob was being read'\n );\n\n //\n // `callCallbacks` is called in the next tick to ensure that errors\n // that might be thrown in the callbacks behave like errors thrown\n // outside the promise chain.\n //\n process.nextTick(callCallbacks, this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n const data = toBuffer(arrayBuffer);\n\n if (!compress) {\n this._state = DEFAULT;\n this.sendFrame(Sender.frame(data, options), cb);\n this.dequeue();\n } else {\n this.dispatch(data, compress, options, cb);\n }\n })\n .catch((err) => {\n //\n // `onError` is called in the next tick for the same reason that\n // `callCallbacks` above is.\n //\n process.nextTick(onError, this, err, cb);\n });\n }\n\n /**\n * Dispatches a message.\n *\n * @param {(Buffer|String)} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Buffer} [options.maskBuffer] The buffer used to store the masking\n * key\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += options[kByteLength];\n this._state = DEFLATING;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n callCallbacks(this, err, cb);\n return;\n }\n\n this._bufferedBytes -= options[kByteLength];\n this._state = DEFAULT;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (this._state === DEFAULT && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[3][kByteLength];\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[3][kByteLength];\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {Buffer[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n\n/**\n * Calls queued callbacks with an error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error to call the callbacks with\n * @param {Function} [cb] The first callback\n * @private\n */\nfunction callCallbacks(sender, err, cb) {\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < sender._queue.length; i++) {\n const params = sender._queue[i];\n const callback = params[params.length - 1];\n\n if (typeof callback === 'function') callback(err);\n }\n}\n\n/**\n * Handles a `Sender` error.\n *\n * @param {Sender} sender The `Sender` instance\n * @param {Error} err The error\n * @param {Function} [cb] The first pending callback\n * @private\n */\nfunction onError(sender, err, cb) {\n callCallbacks(sender, err, cb);\n sender.onerror(err);\n}\n","'use strict';\n\nconst { kForOnEventAttribute, kListener } = require('./constants');\n\nconst kCode = Symbol('kCode');\nconst kData = Symbol('kData');\nconst kError = Symbol('kError');\nconst kMessage = Symbol('kMessage');\nconst kReason = Symbol('kReason');\nconst kTarget = Symbol('kTarget');\nconst kType = Symbol('kType');\nconst kWasClean = Symbol('kWasClean');\n\n/**\n * Class representing an event.\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @throws {TypeError} If the `type` argument is not specified\n */\n constructor(type) {\n this[kTarget] = null;\n this[kType] = type;\n }\n\n /**\n * @type {*}\n */\n get target() {\n return this[kTarget];\n }\n\n /**\n * @type {String}\n */\n get type() {\n return this[kType];\n }\n}\n\nObject.defineProperty(Event.prototype, 'target', { enumerable: true });\nObject.defineProperty(Event.prototype, 'type', { enumerable: true });\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {Number} [options.code=0] The status code explaining why the\n * connection was closed\n * @param {String} [options.reason=''] A human-readable string explaining why\n * the connection was closed\n * @param {Boolean} [options.wasClean=false] Indicates whether or not the\n * connection was cleanly closed\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kCode] = options.code === undefined ? 0 : options.code;\n this[kReason] = options.reason === undefined ? '' : options.reason;\n this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;\n }\n\n /**\n * @type {Number}\n */\n get code() {\n return this[kCode];\n }\n\n /**\n * @type {String}\n */\n get reason() {\n return this[kReason];\n }\n\n /**\n * @type {Boolean}\n */\n get wasClean() {\n return this[kWasClean];\n }\n}\n\nObject.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });\nObject.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.error=null] The error that generated this event\n * @param {String} [options.message=''] The error message\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kError] = options.error === undefined ? null : options.error;\n this[kMessage] = options.message === undefined ? '' : options.message;\n }\n\n /**\n * @type {*}\n */\n get error() {\n return this[kError];\n }\n\n /**\n * @type {String}\n */\n get message() {\n return this[kMessage];\n }\n}\n\nObject.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });\nObject.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {String} type The name of the event\n * @param {Object} [options] A dictionary object that allows for setting\n * attributes via object members of the same name\n * @param {*} [options.data=null] The message content\n */\n constructor(type, options = {}) {\n super(type);\n\n this[kData] = options.data === undefined ? null : options.data;\n }\n\n /**\n * @type {*}\n */\n get data() {\n return this[kData];\n }\n}\n\nObject.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {(Function|Object)} handler The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, handler, options = {}) {\n for (const listener of this.listeners(type)) {\n if (\n !options[kForOnEventAttribute] &&\n listener[kListener] === handler &&\n !listener[kForOnEventAttribute]\n ) {\n return;\n }\n }\n\n let wrapper;\n\n if (type === 'message') {\n wrapper = function onMessage(data, isBinary) {\n const event = new MessageEvent('message', {\n data: isBinary ? data : data.toString()\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'close') {\n wrapper = function onClose(code, message) {\n const event = new CloseEvent('close', {\n code,\n reason: message.toString(),\n wasClean: this._closeFrameReceived && this._closeFrameSent\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'error') {\n wrapper = function onError(error) {\n const event = new ErrorEvent('error', {\n error,\n message: error.message\n });\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else if (type === 'open') {\n wrapper = function onOpen() {\n const event = new Event('open');\n\n event[kTarget] = this;\n callListener(handler, this, event);\n };\n } else {\n return;\n }\n\n wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];\n wrapper[kListener] = handler;\n\n if (options.once) {\n this.once(type, wrapper);\n } else {\n this.on(type, wrapper);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {(Function|Object)} handler The listener to remove\n * @public\n */\n removeEventListener(type, handler) {\n for (const listener of this.listeners(type)) {\n if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {\n this.removeListener(type, listener);\n break;\n }\n }\n }\n};\n\nmodule.exports = {\n CloseEvent,\n ErrorEvent,\n Event,\n EventTarget,\n MessageEvent\n};\n\n/**\n * Call an event listener\n *\n * @param {(Function|Object)} listener The listener to call\n * @param {*} thisArg The value to use as `this`` when calling the listener\n * @param {Event} event The event to pass to the listener\n * @private\n */\nfunction callListener(listener, thisArg, event) {\n if (typeof listener === 'object' && listener.handleEvent) {\n listener.handleEvent.call(listener, event);\n } else {\n listener.call(thisArg, event);\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let code = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex|Readable$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Duplex, Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst { isBlob } = require('./validation');\n\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n GUID,\n kForOnEventAttribute,\n kListener,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst {\n EventTarget: { addEventListener, removeEventListener }\n} = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst closeTimeout = 30 * 1000;\nconst kAborted = Symbol('kAborted');\nconst protocolVersions = [8, 13];\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst subprotocolRegex = /^[!#$%&'*+\\-.0-9A-Z^_`|a-z~]+$/;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = EMPTY_BUFFER;\n this._closeTimer = null;\n this._errorEmitted = false;\n this._extensions = {};\n this._paused = false;\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (protocols === undefined) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = [];\n } else {\n protocols = [protocols];\n }\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._autoPong = options.autoPong;\n this._isServer = true;\n }\n }\n\n /**\n * For historical reasons, the custom \"nodebuffer\" type is used by the default\n * instead of \"blob\".\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Boolean}\n */\n get isPaused() {\n return this._paused;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return null;\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return null;\n }\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Object} options Options object\n * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.maxPayload=0] The maximum allowed message size\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\n setSocket(socket, head, options) {\n const receiver = new Receiver({\n allowSynchronousEvents: options.allowSynchronousEvents,\n binaryType: this.binaryType,\n extensions: this._extensions,\n isServer: this._isServer,\n maxPayload: options.maxPayload,\n skipUTF8Validation: options.skipUTF8Validation\n });\n\n const sender = new Sender(socket, this._extensions, options.generateMask);\n\n this._receiver = receiver;\n this._sender = sender;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n sender[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n sender.onerror = senderOnError;\n\n //\n // These methods may not be available if `socket` is just a `Duplex`.\n //\n if (socket.setTimeout) socket.setTimeout(0);\n if (socket.setNoDelay) socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {(String|Buffer)} [data] The reason why the connection is\n * closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n setCloseTimer(this);\n }\n\n /**\n * Pause the socket.\n *\n * @public\n */\n pause() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = true;\n this._socket.pause();\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Resume the socket.\n *\n * @public\n */\n resume() {\n if (\n this.readyState === WebSocket.CONNECTING ||\n this.readyState === WebSocket.CLOSED\n ) {\n return;\n }\n\n this._paused = false;\n if (!this._receiver._writableState.needDrain) this._socket.resume();\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n abortHandshake(this, this._req, msg);\n return;\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'isPaused',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) return listener[kListener];\n }\n\n return null;\n },\n set(handler) {\n for (const listener of this.listeners(method)) {\n if (listener[kForOnEventAttribute]) {\n this.removeListener(method, listener);\n break;\n }\n }\n\n if (typeof handler !== 'function') return;\n\n this.addEventListener(method, handler, {\n [kForOnEventAttribute]: true\n });\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {Array} protocols The subprotocols\n * @param {Object} [options] Connection options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether any\n * of the `'message'`, `'ping'`, and `'pong'` events can be emitted multiple\n * times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Function} [options.finishRequest] A function which can be used to\n * customize the headers of each http request before it is sent\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Function} [options.generateMask] The function used to generate the\n * masking key\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n allowSynchronousEvents: true,\n autoPong: true,\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: 'GET',\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n websocket._autoPong = opts.autoPong;\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n } else {\n try {\n parsedUrl = new URL(address);\n } catch (e) {\n throw new SyntaxError(`Invalid URL: ${address}`);\n }\n }\n\n if (parsedUrl.protocol === 'http:') {\n parsedUrl.protocol = 'ws:';\n } else if (parsedUrl.protocol === 'https:') {\n parsedUrl.protocol = 'wss:';\n }\n\n websocket._url = parsedUrl.href;\n\n const isSecure = parsedUrl.protocol === 'wss:';\n const isIpcUrl = parsedUrl.protocol === 'ws+unix:';\n let invalidUrlMessage;\n\n if (parsedUrl.protocol !== 'ws:' && !isSecure && !isIpcUrl) {\n invalidUrlMessage =\n 'The URL\\'s protocol must be one of \"ws:\", \"wss:\", ' +\n '\"http:\", \"https\", or \"ws+unix:\"';\n } else if (isIpcUrl && !parsedUrl.pathname) {\n invalidUrlMessage = \"The URL's pathname is empty\";\n } else if (parsedUrl.hash) {\n invalidUrlMessage = 'The URL contains a fragment identifier';\n }\n\n if (invalidUrlMessage) {\n const err = new SyntaxError(invalidUrlMessage);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const request = isSecure ? https.request : http.request;\n const protocolSet = new Set();\n let perMessageDeflate;\n\n opts.createConnection =\n opts.createConnection || (isSecure ? tlsConnect : netConnect);\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n ...opts.headers,\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket'\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols.length) {\n for (const protocol of protocols) {\n if (\n typeof protocol !== 'string' ||\n !subprotocolRegex.test(protocol) ||\n protocolSet.has(protocol)\n ) {\n throw new SyntaxError(\n 'An invalid or duplicated subprotocol was specified'\n );\n }\n\n protocolSet.add(protocol);\n }\n\n opts.headers['Sec-WebSocket-Protocol'] = protocols.join(',');\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isIpcUrl) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n let req;\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalIpc = isIpcUrl;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isIpcUrl\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else if (websocket.listenerCount('redirect') === 0) {\n const isSameHost = isIpcUrl\n ? websocket._originalIpc\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalIpc\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n\n req = websocket._req = request(opts);\n\n if (websocket._redirects) {\n //\n // Unlike what is done for the `'upgrade'` event, no early exit is\n // triggered here if the user calls `websocket.close()` or\n // `websocket.terminate()` from a listener of the `'redirect'` event. This\n // is because the user can also call `request.destroy()` with an error\n // before calling `websocket.close()` or `websocket.terminate()` and this\n // would result in an error being emitted on the `request` object with no\n // `'error'` event listeners attached.\n //\n websocket.emit('redirect', websocket.url, req);\n }\n } else {\n req = websocket._req = request(opts);\n }\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req[kAborted]) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (e) {\n const err = new SyntaxError(`Invalid URL: ${location}`);\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the\n // `'upgrade'` event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n const upgrade = res.headers.upgrade;\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n let protError;\n\n if (serverProt !== undefined) {\n if (!protocolSet.size) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (!protocolSet.has(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n } else if (protocolSet.size) {\n protError = 'Server sent no subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message = 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n\n websocket.setSocket(socket, head, {\n allowSynchronousEvents: opts.allowSynchronousEvents,\n generateMask: opts.generateMask,\n maxPayload: opts.maxPayload,\n skipUTF8Validation: opts.skipUTF8Validation\n });\n });\n\n if (opts.finishRequest) {\n opts.finishRequest(req, websocket);\n } else {\n req.end();\n }\n}\n\n/**\n * Emit the `'error'` and `'close'` events.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n //\n // The following assignment is practically useless and is done only for\n // consistency.\n //\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream[kAborted] = true;\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n process.nextTick(emitErrorAndClose, websocket, err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = isBlob(data) ? data.size : toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n process.nextTick(cb, err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {Buffer} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n const websocket = this[kWebSocket];\n\n if (!websocket.isPaused) websocket._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {Buffer|ArrayBuffer|Buffer[])} data The message\n * @param {Boolean} isBinary Specifies whether the message is binary or not\n * @private\n */\nfunction receiverOnMessage(data, isBinary) {\n this[kWebSocket].emit('message', data, isBinary);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The `Sender` error event handler.\n *\n * @param {Error} The error\n * @private\n */\nfunction senderOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket.readyState === WebSocket.CLOSED) return;\n if (websocket.readyState === WebSocket.OPEN) {\n websocket._readyState = WebSocket.CLOSING;\n setCloseTimer(websocket);\n }\n\n //\n // `socket.end()` is used instead of `socket.destroy()` to allow the other\n // peer to finish sending queued data. There is no need to set a timer here\n // because `CLOSING` means that it is already set or not needed.\n //\n this._socket.end();\n\n if (!websocket._errorEmitted) {\n websocket._errorEmitted = true;\n websocket.emit('error', err);\n }\n}\n\n/**\n * Set a timer to destroy the underlying raw socket of a WebSocket.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @private\n */\nfunction setCloseTimer(websocket) {\n websocket._closeTimer = setTimeout(\n websocket._socket.destroy.bind(websocket._socket),\n closeTimeout\n );\n}\n\n/**\n * The listener of the socket `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n let chunk;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written and `readable.read()`\n // will return `null`. If instead, the socket is paused, any possible buffered\n // data will be read as a single chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n (chunk = websocket._socket.read()) !== null\n ) {\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the socket `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the socket `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the socket `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","'use strict';\n\nconst { tokenChars } = require('./validation');\n\n/**\n * Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.\n *\n * @param {String} header The field value of the header\n * @return {Set} The subprotocol names\n * @public\n */\nfunction parse(header) {\n const protocols = new Set();\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (i; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (\n i !== 0 &&\n (code === 0x20 /* ' ' */ || code === 0x09) /* '\\t' */\n ) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n\n const protocol = header.slice(start, end);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n\n if (start === -1 || end !== -1) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n const protocol = header.slice(start, i);\n\n if (protocols.has(protocol)) {\n throw new SyntaxError(`The \"${protocol}\" subprotocol is duplicated`);\n }\n\n protocols.add(protocol);\n return protocols;\n}\n\nmodule.exports = { parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Duplex$\", \"caughtErrors\": \"none\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst { Duplex } = require('stream');\nconst { createHash } = require('crypto');\n\nconst extension = require('./extension');\nconst PerMessageDeflate = require('./permessage-deflate');\nconst subprotocol = require('./subprotocol');\nconst WebSocket = require('./websocket');\nconst { GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether\n * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted\n * multiple times in the same tick\n * @param {Boolean} [options.autoPong=true] Specifies whether or not to\n * automatically send a pong in response to a ping\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or\n * not to skip UTF-8 validation for text and close messages\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket`\n * class to use. It must be the `WebSocket` class or class that extends it\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n allowSynchronousEvents: true,\n autoPong: true,\n maxPayload: 100 * 1024 * 1024,\n skipUTF8Validation: false,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n WebSocket,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) {\n this.clients = new Set();\n this._shouldEmitClose = false;\n }\n\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Stop the server from accepting new connections and emit the `'close'` event\n * when all existing connections are closed.\n *\n * @param {Function} [cb] A one-time listener for the `'close'` event\n * @public\n */\n close(cb) {\n if (this._state === CLOSED) {\n if (cb) {\n this.once('close', () => {\n cb(new Error('The server is not running'));\n });\n }\n\n process.nextTick(emitClose, this);\n return;\n }\n\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n if (this.options.noServer || this.options.server) {\n if (this._server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n }\n\n if (this.clients) {\n if (!this.clients.size) {\n process.nextTick(emitClose, this);\n } else {\n this._shouldEmitClose = true;\n }\n } else {\n process.nextTick(emitClose, this);\n }\n } else {\n const server = this._server;\n\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // The HTTP/S server was created internally. Close it, and rely on its\n // `'close'` event.\n //\n server.close(() => {\n emitClose(this);\n });\n }\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key = req.headers['sec-websocket-key'];\n const upgrade = req.headers.upgrade;\n const version = +req.headers['sec-websocket-version'];\n\n if (req.method !== 'GET') {\n const message = 'Invalid HTTP method';\n abortHandshakeOrEmitwsClientError(this, req, socket, 405, message);\n return;\n }\n\n if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') {\n const message = 'Invalid Upgrade header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (key === undefined || !keyRegex.test(key)) {\n const message = 'Missing or invalid Sec-WebSocket-Key header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (version !== 8 && version !== 13) {\n const message = 'Missing or invalid Sec-WebSocket-Version header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n\n if (!this.shouldHandle(req)) {\n abortHandshake(socket, 400);\n return;\n }\n\n const secWebSocketProtocol = req.headers['sec-websocket-protocol'];\n let protocols = new Set();\n\n if (secWebSocketProtocol !== undefined) {\n try {\n protocols = subprotocol.parse(secWebSocketProtocol);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Protocol header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n const secWebSocketExtensions = req.headers['sec-websocket-extensions'];\n const extensions = {};\n\n if (\n this.options.perMessageDeflate &&\n secWebSocketExtensions !== undefined\n ) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = extension.parse(secWebSocketExtensions);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n const message =\n 'Invalid or unacceptable Sec-WebSocket-Extensions header';\n abortHandshakeOrEmitwsClientError(this, req, socket, 400, message);\n return;\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(\n extensions,\n key,\n protocols,\n req,\n socket,\n head,\n cb\n );\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {Object} extensions The accepted extensions\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Set} protocols The subprotocols\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The network socket between the server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(extensions, key, protocols, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new this.options.WebSocket(null, undefined, this.options);\n\n if (protocols.size) {\n //\n // Optionally call external protocol selection handler.\n //\n const protocol = this.options.handleProtocols\n ? this.options.handleProtocols(protocols, req)\n : protocols.values().next().value;\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = extension.format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, {\n allowSynchronousEvents: this.options.allowSynchronousEvents,\n maxPayload: this.options.maxPayload,\n skipUTF8Validation: this.options.skipUTF8Validation\n });\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => {\n this.clients.delete(ws);\n\n if (this._shouldEmitClose && !this.clients.size) {\n process.nextTick(emitClose, this);\n }\n });\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of <event, listener>\n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.<String, Function>} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n //\n // The socket is writable unless the user destroyed or ended it before calling\n // `server.handleUpgrade()` or in the `verifyClient` function, which is a user\n // error. Handling this does not make much sense as the worst that can happen\n // is that some of the data written by the user might be discarded due to the\n // call to `socket.end()` below, which triggers an `'error'` event that in\n // turn causes the socket to be destroyed.\n //\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.once('finish', socket.destroy);\n\n socket.end(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n}\n\n/**\n * Emit a `'wsClientError'` event on a `WebSocketServer` if there is at least\n * one listener for it, otherwise call `abortHandshake()`.\n *\n * @param {WebSocketServer} server The WebSocket server\n * @param {http.IncomingMessage} req The request object\n * @param {Duplex} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} message The HTTP response body\n * @private\n */\nfunction abortHandshakeOrEmitwsClientError(server, req, socket, code, message) {\n if (server.listenerCount('wsClientError')) {\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError);\n\n server.emit('wsClientError', err, socket, req);\n } else {\n abortHandshake(socket, code, message);\n }\n}\n","import {\n ConvexClient,\n setDefaultWebSocketConstructor,\n} from \"./simple_client.js\";\n\n// This file is compiled with `bundle: true` with an exception for\n// `./simple_client.js` so this \"ws\" import will be inlined.\nimport ws from \"ws\";\nconst nodeWebSocket = ws as unknown as typeof WebSocket;\n\nsetDefaultWebSocketConstructor(nodeWebSocket);\n\nexport { ConvexClient };\n","import createWebSocketStream from './lib/stream.js';\nimport Receiver from './lib/receiver.js';\nimport Sender from './lib/sender.js';\nimport WebSocket from './lib/websocket.js';\nimport WebSocketServer from './lib/websocket-server.js';\n\nexport { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer };\nexport default WebSocket;\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","import chalk from \"chalk\";\nimport type { ModelMessage } from \"ai\";\n\ntype MessageContent = string | Record<string, unknown> | MessageContent[];\n\ntype ToolSummaryOptions = {\n expected: string[];\n actual: string[];\n passed: boolean;\n missing?: string[];\n unexpected?: string[];\n};\n\ntype ConversationOptions = {\n messages: ModelMessage[];\n};\n\ntype ToolCallSummary = {\n toolName: string;\n args?: string;\n};\n\ntype RunResultOptions = {\n passed: boolean;\n durationMs: number;\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n};\n\ntype RunStartOptions = {\n runNumber: number;\n totalRuns: number;\n provider?: string;\n model?: string;\n temperature?: number;\n};\n\nconst MAX_CONTENT_LENGTH = 160;\n\nexport class Logger {\n private static activeStream: {\n role: ModelMessage[\"role\"];\n } | null = null;\n\n private static closeActiveStream(): void {\n if (this.activeStream) {\n process.stdout.write(\"\\n\");\n this.activeStream = null;\n }\n }\n\n private static startStream(role: ModelMessage[\"role\"]): void {\n this.closeActiveStream();\n const prefix = this.colorRole(role) + \": \";\n process.stdout.write(prefix);\n this.activeStream = { role };\n }\n\n private static appendToStream(text: string): void {\n if (!this.activeStream) {\n this.startStream(\"assistant\");\n }\n process.stdout.write(text);\n }\n\n private static logLine(text: string): void {\n this.closeActiveStream();\n console.log(text);\n }\n\n private static logMultiline(text: string): void {\n text.split(\"\\n\").forEach((line) => this.logLine(line));\n }\n\n static suiteIntro(options: { testCount: number; startedAt: Date }): void {\n const { testCount, startedAt } = options;\n this.logLine(\n chalk.bold.blue(\n `▸ Running ${testCount} test${testCount === 1 ? \"\" : \"s\"} (${startedAt.toISOString()})`,\n ),\n );\n }\n\n static suiteComplete(options: {\n durationMs: number;\n passed: number;\n failed: number;\n }): void {\n const { durationMs, passed, failed } = options;\n const total = passed + failed;\n const summary = `${passed}/${total} passed • ${this.formatDuration(durationMs)}`;\n const prefix = failed === 0 ? chalk.green(\"✔\") : chalk.red(\"✖\");\n this.logLine(`${prefix} ${summary}`);\n }\n\n static header(version: string): void {\n this.logLine(chalk.bold.blue(`MCPJAM CLI ${version}`));\n this.logLine(\"\");\n }\n\n static initiateTestMessage(\n serverCount: number,\n toolCount: number,\n serverNames: string[],\n testCount: number,\n ): void {\n this.logLine(\"\");\n this.logLine(chalk.bold.blue(\"Running tests\"));\n\n const serverLabel = serverCount === 1 ? \"server\" : \"servers\";\n const serverList = serverNames.length > 0 ? serverNames.join(\", \") : \"none\";\n this.logLine(\n `Connected to ${chalk.white.bold(serverCount)} ${serverLabel}: ${chalk.gray(serverList)}`,\n );\n\n const toolLabel = toolCount === 1 ? \"tool\" : \"tools\";\n this.logLine(`Found ${chalk.white.bold(toolCount)} total ${toolLabel}`);\n\n const testLabel = testCount === 1 ? \"test\" : \"tests\";\n this.logLine(`Running ${chalk.white.bold(testCount)} ${testLabel}`);\n\n this.logLine(\"\");\n }\n\n static logTestGroupTitle(\n testNumber: number,\n testName: string,\n modelProvider: string,\n modelId: string,\n ): void {\n this.logLine(chalk.cyan.bold(`Test ${testNumber}: ${testName}`));\n this.logLine(chalk.gray(`Using ${modelProvider}:${modelId}`));\n this.logLine(\"\");\n }\n\n static testRunStart(options: RunStartOptions): void {\n const { runNumber, totalRuns } = options;\n\n const parts = [`run ${runNumber}/${totalRuns}`];\n this.logLine(chalk.cyanBright(parts.join(\" • \")));\n }\n\n static conversation(options: ConversationOptions): void {\n const { messages } = options;\n\n this.closeActiveStream();\n\n if (!messages.length) {\n this.logLine(chalk.dim(\"(no messages)\"));\n return;\n }\n\n messages.forEach((message, index) => {\n if (index > 0) {\n this.logLine(\"\");\n }\n\n const roleLabel = this.colorRole(message.role);\n\n if (message.role === \"assistant\") {\n const summary = this.summarizeContent(\n message.content as MessageContent,\n );\n\n this.logMessageLines(roleLabel, summary.textLines);\n summary.toolCalls.forEach((toolCall) => {\n this.logToolCall(toolCall);\n });\n return;\n }\n\n const formatted = this.formatMessageContent(\n message.content as MessageContent,\n );\n const lines = formatted ? formatted.split(\"\\n\") : [];\n this.logMessageLines(roleLabel, lines);\n });\n }\n\n static toolSummary(options: ToolSummaryOptions) {\n const { expected, actual } = options;\n\n this.logLine(`Expected: [${expected.join(\", \") || \"—\"}]`);\n this.logLine(`Actual: [${actual.join(\", \") || \"—\"}]`);\n }\n\n static testRunResult(options: RunResultOptions): void {\n const { passed, durationMs, usage } = options;\n const status = passed ? chalk.green(\"PASS\") : chalk.red(\"FAIL\");\n this.logLine(`${status} (${this.formatDuration(durationMs)})`);\n if (usage) {\n const usageParts: string[] = [];\n\n if (typeof usage.inputTokens === \"number\") {\n usageParts.push(`input ${usage.inputTokens}`);\n }\n\n if (typeof usage.outputTokens === \"number\") {\n usageParts.push(`output ${usage.outputTokens}`);\n }\n\n if (typeof usage.totalTokens === \"number\") {\n usageParts.push(`total ${usage.totalTokens}`);\n }\n\n if (usageParts.length > 0) {\n this.logLine(chalk.gray(`Tokens • ${usageParts.join(\" • \")}`));\n }\n }\n this.logLine(\"\");\n this.logLine(\"\");\n }\n\n static info(message: string): void {\n this.logLine(chalk.blue(`ℹ ${message}`));\n }\n\n static warn(message: string): void {\n this.logLine(chalk.yellow(`⚠ ${message}`));\n }\n\n static success(message: string): void {\n this.logLine(chalk.green(`✓ ${message}`));\n }\n\n static error(message: string): void {\n this.logLine(\"\");\n this.logLine(chalk.red(`✕ Error: ${message}`));\n }\n\n static errorWithExit(message: string): void {\n this.logLine(\"\");\n this.logLine(chalk.red(`✕ Error: ${message}`));\n process.exit(1);\n }\n\n static progress(current: number, total: number, testName: string): void {\n const progress = `[${current}/${total}]`;\n this.logLine(chalk.gray(`${progress} ${testName}...`));\n }\n\n static testStarting(testName: string): void {\n this.logLine(chalk.gray(` Running ${testName}...`));\n }\n\n static testError(testName: string, error: string): void {\n this.logLine(chalk.red(` ✕ ${testName} failed: ${error}`));\n }\n\n static connectionError(serverName: string, error: string): void {\n this.logLine(chalk.red(` ✕ Failed to connect to ${serverName}: ${error}`));\n }\n\n static apiKeyError(provider: string, error: string): void {\n this.logLine(chalk.red(` ✕ API key error for ${provider}: ${error}`));\n }\n\n static modelCreationError(\n provider: string,\n modelId: string,\n error: string,\n ): void {\n this.logLine(\n chalk.red(\n ` ✕ Failed to create ${provider} model \"${modelId}\": ${error}`,\n ),\n );\n }\n\n private static formatMessageContent(content: MessageContent): string {\n if (content === null || content === undefined) {\n return this.truncate(\"(empty)\");\n }\n\n if (typeof content === \"string\") {\n return this.truncate(content);\n }\n\n if (Array.isArray(content)) {\n const pieces = content\n .map((part) => this.formatMessageContent(part as MessageContent))\n .filter(Boolean);\n return this.truncate(pieces.join(\"\\n\"));\n }\n\n if (typeof content === \"object\") {\n const typedContent = content as Record<string, unknown> & {\n type?: string;\n };\n\n if (typeof typedContent.type === \"string\") {\n const type = typedContent.type;\n\n if (type === \"text\" && typeof typedContent.text === \"string\") {\n return this.truncate(typedContent.text);\n }\n\n if (type === \"tool-call\") {\n const toolName = typedContent.toolName ?? typedContent.name ?? \"tool\";\n const args =\n typedContent.args ?? typedContent.input ?? typedContent.parameters;\n const details = args ? ` args=${this.stringify(args)}` : \"\";\n return this.truncate(`${toolName}${details}`);\n }\n\n if (type === \"tool-result\") {\n const result =\n typedContent.result ?? typedContent.output ?? typedContent.data;\n return this.truncate(this.stringify(result));\n }\n\n if (type === \"reasoning\" && typeof typedContent.text === \"string\") {\n return this.truncate(typedContent.text);\n }\n }\n\n if (typeof typedContent.text === \"string\") {\n return this.truncate(typedContent.text);\n }\n\n return this.truncate(this.stringify(typedContent));\n }\n\n return this.truncate(String(content));\n }\n\n private static summarizeContent(content: MessageContent): {\n textLines: string[];\n toolCalls: ToolCallSummary[];\n } {\n const textLines: string[] = [];\n const toolCalls: ToolCallSummary[] = [];\n\n const visit = (value: MessageContent): void => {\n if (value === null || value === undefined) {\n return;\n }\n\n if (typeof value === \"string\") {\n textLines.push(...this.splitAndTrim(this.truncate(value)));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item) => visit(item as MessageContent));\n return;\n }\n\n if (typeof value === \"object\") {\n const typedValue = value as Record<string, unknown> & {\n type?: string;\n };\n\n if (typedValue.type === \"tool-call\") {\n const toolName =\n (typedValue.toolName as string) ||\n (typedValue.name as string) ||\n \"tool\";\n const args =\n typedValue.args ?? typedValue.input ?? typedValue.parameters;\n toolCalls.push({\n toolName,\n args: args ? this.truncate(this.stringify(args)) : undefined,\n });\n return;\n }\n\n if (typedValue.type === \"text\" && typeof typedValue.text === \"string\") {\n textLines.push(...this.splitAndTrim(this.truncate(typedValue.text)));\n return;\n }\n\n if (\n typedValue.type === \"reasoning\" &&\n typeof typedValue.text === \"string\"\n ) {\n textLines.push(...this.splitAndTrim(this.truncate(typedValue.text)));\n return;\n }\n\n if (\n typedValue.type === \"tool-result\" ||\n typedValue.type === \"tool-error\"\n ) {\n const label =\n typedValue.type === \"tool-error\" ? \"Tool error\" : \"Tool result\";\n textLines.push(\n `${label}: ${this.truncate(this.stringify(typedValue))}`,\n );\n return;\n }\n\n if (typeof typedValue.text === \"string\") {\n textLines.push(...this.splitAndTrim(this.truncate(typedValue.text)));\n return;\n }\n\n textLines.push(this.truncate(this.stringify(typedValue)));\n return;\n }\n\n textLines.push(this.truncate(String(value)));\n };\n\n visit(content);\n\n const normalizedTextLines = textLines.length\n ? textLines\n : toolCalls.length\n ? []\n : [this.truncate(\"(no content)\")];\n\n return {\n textLines: normalizedTextLines,\n toolCalls,\n };\n }\n\n private static splitAndTrim(text: string): string[] {\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n }\n\n private static logMessageLines(roleLabel: string, lines: string[]): void {\n if (!lines.length) {\n this.logLine(`${roleLabel}:`);\n return;\n }\n\n this.logLine(`${roleLabel}: ${lines[0]}`);\n for (let i = 1; i < lines.length; i++) {\n this.logLine(lines[i] ?? \"\");\n }\n }\n\n private static logToolCall(toolCall: ToolCallSummary): void {\n const header = chalk.whiteBright(`[tool-call] ${toolCall.toolName}`);\n this.logLine(header);\n const jsonArgs = toolCall.args ? JSON.parse(toolCall.args) : null;\n if (toolCall.args) {\n this.logLine(chalk.gray(this.truncate(toolCall.args)));\n }\n }\n\n static beginStreamingMessage(role: ModelMessage[\"role\"]): void {\n this.startStream(role);\n }\n\n static appendStreamingText(text: string): void {\n if (!text) {\n return;\n }\n this.appendToStream(text);\n }\n\n static finishStreamingMessage(): void {\n this.closeActiveStream();\n }\n\n static streamToolCall(toolName: string, args: unknown): void {\n const serializedArgs =\n args === undefined ? undefined : this.truncate(this.stringify(args));\n this.closeActiveStream();\n this.logToolCall({ toolName, args: serializedArgs });\n }\n\n static streamToolResult(toolName: string, output: unknown): void {\n this.closeActiveStream();\n const header = chalk.whiteBright(`[tool-result] ${toolName}`);\n this.logLine(header);\n if (output !== undefined) {\n this.logLine(chalk.gray(this.truncate(this.stringify(output))));\n }\n }\n\n static streamToolError(toolName: string, error: unknown): void {\n this.closeActiveStream();\n const header = chalk.whiteBright(`[tool-error] ${toolName}`);\n this.logLine(header);\n this.logLine(\n chalk.red(this.truncate(this.stringify(error ?? \"Unknown error\"))),\n );\n }\n\n private static renderBox(\n lines: string[],\n options: {\n borderColor: (text: string) => string;\n statusColor: (text: string) => string;\n },\n ): void {\n if (!lines.length) {\n return;\n }\n\n const { borderColor, statusColor } = options;\n const statusIndex = lines.findIndex((line) => line.startsWith(\"Status:\"));\n const width = lines.reduce((max, line) => Math.max(max, line.length), 0);\n const horizontal = borderColor(`+${\"-\".repeat(width + 2)}+`);\n this.logLine(horizontal);\n\n lines.forEach((line, index) => {\n const padded = line.padEnd(width, \" \");\n const isStatusLine = index === statusIndex;\n const colouredContent = isStatusLine\n ? statusColor(padded)\n : chalk.white(padded);\n this.logLine(\n `${borderColor(\"| \")}${colouredContent}${borderColor(\" |\")}`,\n );\n });\n\n this.logLine(horizontal);\n }\n\n private static stringify(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n try {\n return JSON.stringify(value, null, 2);\n } catch (error) {\n return String(value);\n }\n }\n\n private static truncate(text: string): string {\n const trimmed = text.trim();\n if (trimmed.length <= MAX_CONTENT_LENGTH) {\n return trimmed;\n }\n return `${trimmed.slice(0, MAX_CONTENT_LENGTH - 3).trimEnd()}...`;\n }\n\n private static formatDuration(durationMs: number): string {\n if (!Number.isFinite(durationMs) || durationMs < 0) {\n return \"?\";\n }\n\n if (durationMs < 1000) {\n return `${durationMs.toFixed(0)}ms`;\n }\n\n const seconds = durationMs / 1000;\n if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = (seconds % 60).toFixed(0).padStart(2, \"0\");\n return `${minutes}m${remainingSeconds}s`;\n }\n\n private static colorRole(role: ModelMessage[\"role\"]): string {\n switch (role) {\n case \"user\":\n return chalk.bold.whiteBright(\"user\");\n case \"assistant\":\n return chalk.bold.whiteBright(\"assistant\");\n case \"tool\":\n return chalk.bold.whiteBright(\"tool\");\n case \"system\":\n return chalk.bold.whiteBright(\"system\");\n default:\n return chalk.cyan(role);\n }\n }\n}\n","import { ModelMessage } from \"ai\";\nimport { ConvexHttpClient } from \"convex/browser\";\n\nimport { dbClient } from \"../db\";\nimport type { TestCase } from \"../utils/validators\";\nimport { Logger } from \"../utils/logger\";\n\nexport type UsageTotals = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\nexport type SuiteConfig = {\n tests: TestCase[];\n environment: { servers: string[] };\n};\n\ntype DbPayload = Record<string, unknown>;\n\ntype DbClientInstance = ReturnType<typeof dbClient> | ConvexHttpClient;\n\ntype PrecreatedSuite = {\n suiteId: string;\n testCases: Array<{\n testCaseId: string;\n iterations: Array<{\n iterationId: string;\n iterationNumber: number;\n }>;\n }>;\n};\n\nexport type RunRecorder = {\n enabled: boolean;\n ensureSuite(): Promise<void>;\n recordTestCase(test: TestCase, index: number): Promise<string | undefined>;\n startIteration(args: {\n testCaseId?: string;\n iterationNumber: number;\n startedAt: number;\n }): Promise<string | undefined>;\n finishIteration(args: {\n iterationId?: string;\n passed: boolean;\n toolsCalled: string[];\n usage: UsageTotals;\n messages: ModelMessage[];\n }): Promise<void>;\n};\n\nconst createDisabledRecorder = (): RunRecorder => ({\n enabled: false,\n async ensureSuite() {\n return;\n },\n async recordTestCase() {\n return undefined;\n },\n async startIteration() {\n return undefined;\n },\n async finishIteration() {\n return;\n },\n});\n\nexport const createRunRecorder = (\n apiKey: string | undefined,\n config: SuiteConfig,\n): RunRecorder => {\n if (!apiKey) {\n Logger.warn(\"No API key provided - RunRecorder will be disabled\");\n return createDisabledRecorder();\n }\n\n const client: DbClientInstance = dbClient();\n let precreated: PrecreatedSuite | undefined;\n\n const runDbAction = async <T>(\n action: string,\n payload: DbPayload,\n ): Promise<T | undefined> => {\n try {\n const result = await (client as any).action(action, payload);\n return result;\n } catch (error) {\n Logger.error(`[RunRecorder] ${action} failed: ${error}`);\n return undefined;\n }\n };\n\n const ensurePrecreated = async () => {\n if (precreated) {\n return precreated;\n }\n\n const result = await runDbAction<PrecreatedSuite>(\n \"evals:precreateEvalSuiteWithApiKey\",\n {\n apiKey,\n config,\n tests: config.tests,\n },\n );\n\n if (!result) {\n Logger.error(\"[RunRecorder] Failed to create suite\");\n }\n\n precreated = result;\n return precreated;\n };\n\n return {\n enabled: true,\n async ensureSuite() {\n await ensurePrecreated();\n },\n async recordTestCase(test, index) {\n const current = await ensurePrecreated();\n if (!current) {\n return undefined;\n }\n\n const zeroBasedIndex = index > 0 ? index - 1 : index;\n return (\n current.testCases[zeroBasedIndex]?.testCaseId ??\n current.testCases[index]?.testCaseId\n );\n },\n async startIteration({ testCaseId, iterationNumber, startedAt }) {\n if (!testCaseId) {\n return undefined;\n }\n\n const current = await ensurePrecreated();\n if (!current) {\n return undefined;\n }\n\n const testEntry = current.testCases.find(\n (entry) => entry.testCaseId === testCaseId,\n );\n const iteration = testEntry?.iterations.find(\n (item) => item.iterationNumber === iterationNumber,\n );\n\n if (!iteration) {\n return undefined;\n }\n\n if (startedAt !== undefined) {\n await runDbAction(\"evals:updateEvalTestIterationResultWithApiKey\", {\n apiKey,\n testId: iteration.iterationId,\n status: \"running\",\n result: \"pending\",\n startedAt,\n });\n }\n\n return iteration.iterationId;\n },\n async finishIteration({\n iterationId,\n passed,\n toolsCalled,\n usage,\n messages,\n }) {\n if (!iterationId) {\n return;\n }\n console.log(\n \"finishIteration\",\n iterationId,\n passed,\n toolsCalled,\n usage,\n messages,\n );\n await runDbAction(\"evals:updateEvalTestIterationResultWithApiKey\", {\n apiKey,\n testId: iterationId,\n status: \"completed\",\n result: passed ? \"passed\" : \"failed\",\n actualToolCalls: toolsCalled,\n tokensUsed: usage.totalTokens ?? 0,\n blob: undefined,\n blobContent: { messages },\n });\n },\n };\n};\n\nexport const createRunRecorderWithAuth = (\n convexClient: ConvexHttpClient,\n config: SuiteConfig,\n): RunRecorder => {\n let precreated: PrecreatedSuite | undefined;\n\n const runAction = async <T>(\n action: string,\n payload: DbPayload,\n ): Promise<T | undefined> => {\n try {\n const result = await convexClient.action(action as any, payload);\n return result as T;\n } catch (error) {\n Logger.error(`[RunRecorder:Auth] ${action} failed: ${error}`);\n return undefined;\n }\n };\n\n const runMutation = async <T>(\n mutation: string,\n payload: DbPayload,\n ): Promise<T | undefined> => {\n try {\n const result = await convexClient.mutation(mutation as any, payload);\n return result as T;\n } catch (error) {\n Logger.error(`[RunRecorder:Auth] ${mutation} failed: ${error}`);\n return undefined;\n }\n };\n\n const ensurePrecreated = async () => {\n if (precreated) {\n return precreated;\n }\n\n const result = await runMutation<PrecreatedSuite>(\n \"evals:precreateEvalSuiteWithAuth\",\n {\n config,\n tests: config.tests,\n },\n );\n\n if (!result) {\n Logger.error(\"[RunRecorder:Auth] Failed to create suite\");\n }\n\n precreated = result;\n return precreated;\n };\n\n return {\n enabled: true,\n async ensureSuite() {\n await ensurePrecreated();\n },\n async recordTestCase(test, index) {\n const current = await ensurePrecreated();\n if (!current) {\n return undefined;\n }\n\n const zeroBasedIndex = index > 0 ? index - 1 : index;\n const testCaseId =\n current.testCases[zeroBasedIndex]?.testCaseId ??\n current.testCases[index]?.testCaseId;\n\n return testCaseId;\n },\n async startIteration({ testCaseId, iterationNumber, startedAt }) {\n if (!testCaseId) {\n return undefined;\n }\n\n const current = await ensurePrecreated();\n if (!current) {\n return undefined;\n }\n\n const testEntry = current.testCases.find(\n (entry) => entry.testCaseId === testCaseId,\n );\n const iteration = testEntry?.iterations.find(\n (item) => item.iterationNumber === iterationNumber,\n );\n\n if (!iteration) {\n return undefined;\n }\n\n if (startedAt !== undefined) {\n await runAction(\"evals:updateEvalTestIterationResultWithAuth\", {\n testId: iteration.iterationId,\n status: \"running\",\n result: \"pending\",\n startedAt,\n });\n }\n\n return iteration.iterationId;\n },\n async finishIteration({\n iterationId,\n passed,\n toolsCalled,\n usage,\n messages,\n }) {\n if (!iterationId) {\n return;\n }\n\n await runAction(\"evals:updateEvalTestIterationResultWithAuth\", {\n testId: iterationId,\n status: \"completed\",\n result: passed ? \"passed\" : \"failed\",\n actualToolCalls: toolsCalled,\n tokensUsed: usage.totalTokens ?? 0,\n blob: undefined,\n blobContent: { messages },\n });\n },\n };\n};\n","import { z } from \"zod\";\nimport type {\n LogHandler,\n MastraMCPServerDefinition,\n MCPClientOptions,\n} from \"@mastra/mcp\";\nimport { SSEClientTransportOptions } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { ClientCapabilities } from \"@modelcontextprotocol/sdk/types.js\";\nimport { convertMastraToolsToVercelTools } from \"../../../shared/tools\";\nimport { Logger } from \"./logger\";\n\nexport const AdvancedConfigSchema = z\n .object({\n system: z.string().optional(),\n temperature: z.number().optional(),\n toolChoice: z.string().optional(),\n })\n .passthrough(); // Allow additional fields\n\nexport const TestCaseSchema = z.object({\n title: z.string(),\n query: z.string(),\n runs: z.number().int(),\n model: z.string(),\n provider: z.string(),\n expectedToolCalls: z.array(z.string()),\n judgeRequirement: z.string().optional(),\n advancedConfig: AdvancedConfigSchema.optional(),\n});\n\nexport type TestCase = z.infer<typeof TestCaseSchema>;\n\nexport function validateTestCase(value: unknown): TestCase[] | undefined {\n try {\n const result = z.array(TestCaseSchema).parse(value);\n return result;\n } catch (error) {\n if (error instanceof z.ZodError) {\n Logger.errorWithExit(\n `Your tests.json file is incorrectly configured: ${error.message}`,\n );\n }\n Logger.errorWithExit(\n `Your tests.json file is incorrectly configured: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nconst BaseServerOptionsSchema = z.object({\n logger: z.custom<LogHandler>().optional(),\n timeout: z.number().optional(),\n capabilities: z.custom<ClientCapabilities>().optional(),\n enableServerLogs: z.boolean().optional(),\n});\n\nconst StdioServerDefinitionSchema = BaseServerOptionsSchema.extend({\n command: z.string(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n}).strict();\n\nconst HttpServerDefinitionSchema = BaseServerOptionsSchema.extend({\n // Accept either a URL object or a string URL, but we'll normalize to string\n url: z.union([z.string().url(), z.instanceof(URL)]),\n requestInit: z\n .custom<StreamableHTTPClientTransportOptions[\"requestInit\"]>()\n .optional(),\n eventSourceInit: z\n .custom<SSEClientTransportOptions[\"eventSourceInit\"]>()\n .optional(),\n authProvider: z\n .custom<StreamableHTTPClientTransportOptions[\"authProvider\"]>()\n .optional(),\n reconnectionOptions: z\n .custom<StreamableHTTPClientTransportOptions[\"reconnectionOptions\"]>()\n .optional(),\n sessionId: z\n .custom<StreamableHTTPClientTransportOptions[\"sessionId\"]>()\n .optional(),\n}).strict();\n\nexport const MCPClientOptionsSchema = z.custom<MCPClientOptions>();\nexport const MastraMCPServerDefinitionSchema = z.union([\n StdioServerDefinitionSchema,\n HttpServerDefinitionSchema,\n]);\n\nexport function validateAndNormalizeMCPClientConfiguration(\n value: unknown,\n): MCPClientOptions | undefined {\n try {\n const envParsed = MCPClientOptionsSchema.parse(value);\n\n const normalizedServers: Record<string, MastraMCPServerDefinition> = {};\n\n for (const [name, server] of Object.entries(envParsed.servers)) {\n try {\n if (server && typeof server === \"object\" && \"url\" in server) {\n MastraMCPServerDefinitionSchema.parse(server);\n server.enableServerLogs = false;\n const urlValue = (server as any).url;\n const normalizedUrl =\n typeof urlValue === \"string\"\n ? new URL(urlValue)\n : (urlValue as URL);\n const normalizedServer = {\n ...(server as Record<string, any>),\n url: normalizedUrl,\n } as Record<string, any>;\n normalizedServers[name] =\n normalizedServer as MastraMCPServerDefinition;\n } else {\n MastraMCPServerDefinitionSchema.parse(server);\n server.enableServerLogs = false;\n normalizedServers[name] = server;\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n Logger.errorWithExit(\n `Invalid server configuration for '${name}': ${error.message}`,\n );\n }\n Logger.errorWithExit(\n `Invalid server configuration for '${name}': ${error}`,\n );\n }\n }\n\n return {\n ...envParsed,\n servers: normalizedServers,\n };\n } catch (error) {\n Logger.errorWithExit(\n `Your environment.json file is incorrectly configured: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport { convertMastraToolsToVercelTools };\n\nexport const LlmsConfigSchema = z\n .object({\n anthropic: z.string().optional(),\n openai: z.string().optional(),\n openrouter: z.string().optional(),\n })\n .passthrough(); // Allow additional LLM providers\n\nexport type LlmsConfig = z.infer<typeof LlmsConfigSchema>;\n\nexport function validateLlms(value: unknown): LlmsConfig | undefined {\n try {\n const result = LlmsConfigSchema.parse(value);\n if (\n !isValidLlmApiKey(result.anthropic) &&\n !isValidLlmApiKey(result.openai) &&\n !isValidLlmApiKey(result.openrouter)\n ) {\n Logger.errorWithExit(\n \"You must provide at least one valid LLM API key in your env\",\n );\n }\n return result;\n } catch (error) {\n if (error instanceof z.ZodError) {\n Logger.errorWithExit(`Invalid LLMs configuration: ${error.message}`);\n }\n Logger.errorWithExit(\n error instanceof Error ? error.message : String(error),\n );\n }\n}\n\nconst isValidLlmApiKey = (key: string | undefined) => {\n // Accept backend execution marker for MCPJam-provided models\n if (key === \"BACKEND_EXECUTION\") {\n return true;\n }\n if (key && key.startsWith(\"sk-\")) {\n return true;\n }\n return false;\n};\n","import { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { LlmsConfig } from \"./validators\";\nimport { LanguageModel, ToolSet, TypedToolCall } from \"ai\";\nimport { Logger } from \"./logger\";\n\nexport const createLlmModel = (\n provider: string,\n model: string,\n llmsConfig: LlmsConfig,\n): LanguageModel | undefined => {\n if (!llmsConfig[provider]) {\n Logger.errorWithExit(`LLM API key not found for provider: ${provider}`);\n }\n switch (provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey: llmsConfig.anthropic })(model);\n case \"openai\":\n return createOpenAI({ apiKey: llmsConfig.openai })(model);\n case \"openrouter\":\n return createOpenRouter({ apiKey: llmsConfig.openrouter })(model);\n default:\n Logger.errorWithExit(`Unsupported provider: ${provider}`);\n }\n};\n\nexport const extractToolNamesAsArray = (\n toolCalls: TypedToolCall<ToolSet>[],\n) => {\n return toolCalls.map((toolCall) => toolCall.toolName);\n};\n","export type EvaluationResult = {\n expectedToolCalls: string[];\n toolsCalled: string[];\n missing: string[];\n unexpected: string[];\n passed: boolean;\n};\n\nexport const evaluateResults = (\n expectedToolCalls: string[],\n toolsCalled: string[],\n) => {\n return {\n expectedToolCalls,\n toolsCalled,\n missing: expectedToolCalls.filter((tool) => !toolsCalled.includes(tool)),\n unexpected: toolsCalled.filter((tool) => !expectedToolCalls.includes(tool)),\n passed: expectedToolCalls.every((tool) => toolsCalled.includes(tool)),\n };\n};\n","import { randomUUID } from \"crypto\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\n\nconst CONFIG_DIR = join(homedir(), \".mcpjam\");\nconst USER_ID_FILE = join(CONFIG_DIR, \"user-id.json\");\n\ninterface UserConfig {\n userId: string;\n createdAt: string;\n}\n\n/**\n * Gets or creates a unique user ID stored locally\n * @returns A persistent unique identifier for this user\n */\nexport function getUserId(): string {\n try {\n // Ensure config directory exists\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n\n // Check if user ID file exists\n if (existsSync(USER_ID_FILE)) {\n const configData = readFileSync(USER_ID_FILE, \"utf8\");\n const config: UserConfig = JSON.parse(configData);\n\n // Validate that we have a valid userId\n if (config.userId && typeof config.userId === \"string\") {\n return config.userId;\n }\n }\n\n // Generate new user ID\n const newUserId = randomUUID();\n const newConfig: UserConfig = {\n userId: newUserId,\n createdAt: new Date().toISOString(),\n };\n\n // Save to file\n writeFileSync(USER_ID_FILE, JSON.stringify(newConfig, null, 2));\n\n return newUserId;\n } catch (error) {\n // Fallback to session-based UUID if file operations fail\n console.warn(\"Failed to persist user ID, using session-based ID:\", error);\n return randomUUID();\n }\n}\n","import { PostHog } from \"posthog-node\";\n\nexport const hogClient = new PostHog(\n \"phc_dTOPniyUNU2kD8Jx8yHMXSqiZHM8I91uWopTMX6EBE9\",\n { host: \"https://us.i.posthog.com\" },\n);\n","import { MastraMCPServerDefinition, MCPClientOptions } from \"@mastra/mcp\";\nimport { MCPJamClientManager } from \"../services/mcpjam-client-manager\";\nimport {\n LlmsConfig,\n LlmsConfigSchema,\n} from \"../../evals-cli/src/utils/validators\";\nimport { isMCPJamProvidedModel } from \"../../shared/types\";\n\n/**\n * Transforms server IDs from MCPJamClientManager to MCPClientOptions format\n * required by runEvals\n */\nexport function transformServerConfigsToEnvironment(\n serverIds: string[],\n clientManager: MCPJamClientManager,\n): MCPClientOptions {\n const connectedServers = clientManager.getConnectedServers();\n const servers: Record<string, MastraMCPServerDefinition> = {};\n\n for (const serverId of serverIds) {\n const serverData = connectedServers[serverId];\n\n if (!serverData) {\n throw new Error(`Server '${serverId}' not found`);\n }\n\n if (serverData.status !== \"connected\") {\n throw new Error(\n `Server '${serverId}' is not connected (status: ${serverData.status})`,\n );\n }\n\n if (!serverData.config) {\n throw new Error(`Server '${serverId}' has no configuration`);\n }\n\n servers[serverId] = serverData.config;\n }\n\n if (Object.keys(servers).length === 0) {\n throw new Error(\"No valid servers provided\");\n }\n\n return {\n servers,\n };\n}\n\n/**\n * Transforms LLM configuration from UI format to LlmsConfig format\n */\nexport function transformLLMConfigToLlmsConfig(llmConfig: {\n provider: string;\n apiKey: string;\n}): LlmsConfig {\n const llms: Record<string, string> = {};\n\n // MCPJam-provided models use backend execution, so we use a special marker\n // that will pass validation but won't be used (backend has the actual key)\n if (isMCPJamProvidedModel(llmConfig.provider as any)) {\n llms.openrouter = \"BACKEND_EXECUTION\";\n } else {\n // Map provider names to expected format\n const providerKey = llmConfig.provider.toLowerCase();\n llms[providerKey] = llmConfig.apiKey;\n }\n\n // Validate the result\n const validated = LlmsConfigSchema.safeParse(llms);\n if (!validated.success) {\n throw new Error(`Invalid LLM configuration: ${validated.error.message}`);\n }\n\n return validated.data;\n}\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","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"],"mappings":"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","names":["Sentry","Hono","readFileSync","existsSync","join","Hono","Hono","Hono","mcpJamClientManager","Hono","Hono","resolve","mcp","tool","Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","zodToJsonSchema","options","fallbackConfig","tools","tool","zodToJsonSchema","Hono","tool","messages","TextEncoder","resolve","response","Hono","Hono","zodToJsonSchema","Hono","mcp","tools","tool","zodToJsonSchema","resources","prompts","Hono","Hono","v","proto","init","Hono","z","streamText","arr","value","v","__publicField","logger","__publicField","__publicField","resolve","createWebSocketStream","err","os","resolve","dir","arr","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","code","Receiver","Sender","v","URL","WebSocket","key","protocol","WebSocketServer","server","version","code","process","version","styles","chalk","styles","version","z","z","server","z","createOpenAI","createAnthropic","createLlmModel","createAnthropic","createOpenAI","tool","randomUUID","tools","tool","streamText","createLlmModel","servers","Hono","z","Hono","z","zodToJsonSchema","tools","resources","prompts","Hono","proto","Hono","MCPClient","MCPClient","init","MCPClient","servers","tool","prompts","client","toolsets","flattenedTools","resolve","__dirname","servers","Hono","join","__dirname","existsSync","v","readFileSync"]}
|