@mcpjam/inspector 1.0.19 → 1.0.20
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 +2 -1
- package/dist/client/assets/index-BzedM9rr.css +1 -0
- package/dist/client/assets/index-CqSEe2h2.js +1891 -0
- package/dist/client/index.html +2 -2
- package/dist/client/openrouter_logo.png +0 -0
- package/dist/server/index.js +5 -2
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/index-Bf9F3wwu.js +0 -1886
- package/dist/client/assets/index-DkqfjygH.css +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","../../sdk/src/mcp-client-manager/index.ts","../../sdk/src/mcp-client-manager/tool-converters.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/routes/mcp/servers.ts","../../server/services/rpc-log-bus.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/http-tool-calls.ts","../../shared/backend-conversation.ts","../../server/routes/mcp/oauth.ts","../../server/routes/mcp/export.ts","../../server/routes/mcp/interceptor.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/vendor/long.ts","../../node_modules/convex/src/vendor/jwt-decode/index.ts","../../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/src/utils/logger.ts","../../evals-cli/src/db/tests.ts","../../evals-cli/src/utils/validators.ts","../../shared/tools.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/services/eval-agent.ts","../../server/routes/mcp/http-adapters.ts","../../server/services/mcp-http-bridge.ts","../../server/services/interceptor-store.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\";\nimport { MCPClientManager } from \"@/sdk\";\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 { rpcLogBus } from \"./services/rpc-log-bus\";\nimport { interceptorStore } from \"./services/interceptor-store\";\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 and wire RPC logging to SSE bus\nconst mcpClientManager = new MCPClientManager(\n {},\n {\n rpcLogger: ({ direction, message, serverId }) => {\n rpcLogBus.publish({\n serverId,\n direction,\n timestamp: new Date().toISOString(),\n message,\n });\n },\n },\n);\n// Middleware to inject client manager into context\napp.use(\"*\", async (c, next) => {\n c.mcpClientManager = mcpClientManager;\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 = process.env.ENVIRONMENT === \"dev\" ? \"localhost\" : \"127.0.0.1\";\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 { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { ClientOptions } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport type { SSEClientTransportOptions } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport {\n getDefaultEnvironment,\n StdioClientTransport,\n} from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { DEFAULT_REQUEST_TIMEOUT_MSEC } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { TransportSendOptions } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n CallToolResultSchema,\n ElicitRequestSchema,\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n ElicitRequest,\n ElicitResult,\n JSONRPCMessage,\n MessageExtraInfo,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n convertMCPToolsToVercelTools,\n type ConvertedToolSet,\n type ToolSchemaOverrides,\n} from \"./tool-converters.js\";\nimport type { ToolCallOptions, ToolSet } from \"ai\";\ntype ClientCapabilityOptions = NonNullable<ClientOptions[\"capabilities\"]>;\n\ntype BaseServerConfig = {\n capabilities?: ClientCapabilityOptions;\n timeout?: number;\n version?: string;\n onError?: (error: unknown) => void;\n // Enable simple console logging of JSON-RPC traffic for this server\n logJsonRpc?: boolean;\n // Custom logger for JSON-RPC traffic; overrides logJsonRpc when provided\n rpcLogger?: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void;\n};\n\ntype StdioServerConfig = BaseServerConfig & {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n\n url?: never;\n requestInit?: never;\n eventSourceInit?: never;\n authProvider?: never;\n reconnectionOptions?: never;\n sessionId?: never;\n preferSSE?: never;\n};\n\ntype HttpServerConfig = BaseServerConfig & {\n url: URL;\n requestInit?: StreamableHTTPClientTransportOptions[\"requestInit\"];\n eventSourceInit?: SSEClientTransportOptions[\"eventSourceInit\"];\n authProvider?: StreamableHTTPClientTransportOptions[\"authProvider\"];\n reconnectionOptions?: StreamableHTTPClientTransportOptions[\"reconnectionOptions\"];\n sessionId?: StreamableHTTPClientTransportOptions[\"sessionId\"];\n preferSSE?: boolean;\n\n command?: never;\n args?: never;\n env?: never;\n};\n\nexport type MCPServerConfig = StdioServerConfig | HttpServerConfig;\nexport type MCPClientManagerConfig = Record<string, MCPServerConfig>;\n\ntype NotificationSchema = Parameters<Client[\"setNotificationHandler\"]>[0];\ntype NotificationHandler = Parameters<Client[\"setNotificationHandler\"]>[1];\n\ninterface ManagedClientState {\n config: MCPServerConfig;\n timeout: number;\n client?: Client;\n transport?: Transport;\n promise?: Promise<Client>;\n}\n\n// Pending state is tracked inside ManagedClientState.promise\n\ntype ClientRequestOptions = RequestOptions;\ntype CallToolOptions = RequestOptions;\n\ntype ListResourcesParams = Parameters<Client[\"listResources\"]>[0];\ntype ListResourceTemplatesParams = Parameters<\n Client[\"listResourceTemplates\"]\n>[0];\ntype ReadResourceParams = Parameters<Client[\"readResource\"]>[0];\ntype SubscribeResourceParams = Parameters<Client[\"subscribeResource\"]>[0];\ntype UnsubscribeResourceParams = Parameters<Client[\"unsubscribeResource\"]>[0];\ntype ListPromptsParams = Parameters<Client[\"listPrompts\"]>[0];\ntype GetPromptParams = Parameters<Client[\"getPrompt\"]>[0];\ntype ListToolsResult = Awaited<ReturnType<Client[\"listTools\"]>>;\n\nexport type MCPConnectionStatus = \"connected\" | \"connecting\" | \"disconnected\";\ntype ServerSummary = {\n id: string;\n status: MCPConnectionStatus;\n config?: MCPServerConfig;\n};\n\nexport type ExecuteToolArguments = Record<string, unknown>;\nexport type ElicitationHandler = (\n params: ElicitRequest[\"params\"],\n) => Promise<ElicitResult> | ElicitResult;\n\nexport class MCPClientManager {\n private readonly clientStates = new Map<string, ManagedClientState>();\n private readonly notificationHandlers = new Map<\n string,\n Map<NotificationSchema, Set<NotificationHandler>>\n >();\n private readonly elicitationHandlers = new Map<string, ElicitationHandler>();\n private readonly toolsMetadataCache = new Map<string, Map<string, any>>();\n private readonly defaultClientVersion: string;\n private readonly defaultClientName: string | undefined;\n private readonly defaultCapabilities: ClientCapabilityOptions;\n private readonly defaultTimeout: number;\n private defaultLogJsonRpc: boolean = false;\n\n private defaultRpcLogger?: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void;\n private elicitationCallback?: (request: {\n requestId: string;\n message: string;\n schema: unknown;\n }) => Promise<ElicitResult> | ElicitResult;\n private readonly pendingElicitations = new Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n >();\n\n constructor(\n servers: MCPClientManagerConfig = {},\n options: {\n defaultClientName?: string;\n defaultClientVersion?: string;\n defaultCapabilities?: ClientCapabilityOptions;\n defaultTimeout?: number;\n defaultLogJsonRpc?: boolean;\n rpcLogger?: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void;\n } = {},\n ) {\n this.defaultClientVersion = options.defaultClientVersion ?? \"1.0.0\";\n this.defaultClientName = options.defaultClientName ?? undefined;\n this.defaultCapabilities = { ...(options.defaultCapabilities ?? {}) };\n this.defaultTimeout =\n options.defaultTimeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC;\n this.defaultLogJsonRpc = options.defaultLogJsonRpc ?? false;\n this.defaultRpcLogger = options.rpcLogger;\n\n for (const [id, config] of Object.entries(servers)) {\n void this.connectToServer(id, config);\n }\n }\n\n listServers(): string[] {\n return Array.from(this.clientStates.keys());\n }\n\n hasServer(serverId: string): boolean {\n return this.clientStates.has(serverId);\n }\n\n getServerSummaries(): ServerSummary[] {\n return Array.from(this.clientStates.entries()).map(([serverId, state]) => ({\n id: serverId,\n status: this.getConnectionStatusByAttemptingPing(serverId),\n config: state.config,\n }));\n }\n\n getConnectionStatusByAttemptingPing(serverId: string): MCPConnectionStatus {\n const state = this.clientStates.get(serverId);\n if (state?.promise) {\n return \"connecting\";\n }\n const client = state?.client;\n if (!client) {\n return \"disconnected\";\n }\n try {\n client.ping();\n return \"connected\";\n } catch (error) {\n return \"disconnected\";\n }\n }\n\n getServerConfig(serverId: string): MCPServerConfig | undefined {\n return this.clientStates.get(serverId)?.config;\n }\n\n async connectToServer(\n serverId: string,\n config: MCPServerConfig,\n ): Promise<Client> {\n const timeout = this.getTimeout(config);\n const existingState = this.clientStates.get(serverId);\n if (existingState?.client) {\n throw new Error(`MCP server \"${serverId}\" is already connected.`);\n }\n\n const state: ManagedClientState = existingState ?? {\n config,\n timeout,\n };\n // Update config/timeout on every call\n state.config = config;\n state.timeout = timeout;\n // If connection is in-flight, reuse the promise\n if (state.promise) {\n this.clientStates.set(serverId, state);\n return state.promise;\n }\n\n const connectionPromise = (async () => {\n const client = new Client(\n {\n name: this.defaultClientName ? `${this.defaultClientName}` : serverId,\n version: config.version ?? this.defaultClientVersion,\n },\n {\n capabilities: this.buildCapabilities(config),\n },\n );\n\n this.applyNotificationHandlers(serverId, client);\n this.applyElicitationHandler(serverId, client);\n\n if (config.onError) {\n client.onerror = (error) => {\n config.onError?.(error);\n };\n }\n\n client.onclose = () => {\n this.resetState(serverId);\n };\n\n let transport: Transport;\n if (this.isStdioConfig(config)) {\n transport = await this.connectViaStdio(\n serverId,\n client,\n config,\n timeout,\n );\n } else {\n transport = await this.connectViaHttp(\n serverId,\n client,\n config,\n timeout,\n );\n }\n\n state.client = client;\n state.transport = transport;\n // clear pending\n state.promise = undefined;\n this.clientStates.set(serverId, state);\n\n return client;\n })().catch((error) => {\n this.resetState(serverId);\n throw error;\n });\n\n state.promise = connectionPromise;\n this.clientStates.set(serverId, state);\n return connectionPromise;\n }\n\n async disconnectServer(serverId: string): Promise<void> {\n const connectionStatus = this.getConnectionStatusByAttemptingPing(serverId);\n if (connectionStatus !== \"connected\") {\n return;\n }\n const client = this.getClientById(serverId);\n try {\n await client.close();\n } finally {\n if (client.transport) {\n await this.safeCloseTransport(client.transport);\n }\n this.resetState(serverId);\n }\n }\n\n removeServer(serverId: string): void {\n this.resetState(serverId);\n this.notificationHandlers.delete(serverId);\n this.elicitationHandlers.delete(serverId);\n }\n\n async disconnectAllServers(): Promise<void> {\n const serverIds = this.listServers();\n await Promise.all(\n serverIds.map((serverId) => this.disconnectServer(serverId)),\n );\n\n for (const serverId of serverIds) {\n this.resetState(serverId);\n this.notificationHandlers.delete(serverId);\n this.elicitationHandlers.delete(serverId);\n }\n }\n\n async listTools(\n serverId: string,\n params?: Parameters<Client[\"listTools\"]>[0],\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n try {\n const result = await client.listTools(\n params,\n this.withTimeout(serverId, options),\n );\n\n const metadataMap = new Map<string, any>();\n for (const tool of result.tools) {\n if (tool._meta) {\n metadataMap.set(tool.name, tool._meta);\n }\n }\n this.toolsMetadataCache.set(serverId, metadataMap);\n\n return result;\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"tools/list\")) {\n this.toolsMetadataCache.set(serverId, new Map());\n return { tools: [] } as Awaited<ReturnType<Client[\"listTools\"]>>;\n }\n throw error;\n }\n }\n\n async getTools(serverIds?: string[]): Promise<ListToolsResult> {\n const targetServerIds =\n serverIds && serverIds.length > 0 ? serverIds : this.listServers();\n\n const toolLists = await Promise.all(\n targetServerIds.map(async (serverId) => {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n const result = await client.listTools(\n undefined,\n this.withTimeout(serverId),\n );\n\n const metadataMap = new Map<string, any>();\n for (const tool of result.tools) {\n if (tool._meta) {\n metadataMap.set(tool.name, tool._meta);\n }\n }\n this.toolsMetadataCache.set(serverId, metadataMap);\n\n return result.tools;\n }),\n );\n return { tools: toolLists.flat() } as ListToolsResult;\n }\n\n getAllToolsMetadata(serverId: string): Record<string, Record<string, any>> {\n const metadataMap = this.toolsMetadataCache.get(serverId);\n return metadataMap ? Object.fromEntries(metadataMap) : {};\n }\n\n pingServer(serverId: string, options?: RequestOptions) {\n const client = this.getClientById(serverId);\n try {\n client.ping(options);\n } catch (error) {\n throw new Error(\n `Failed to ping MCP server \"${serverId}\": ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n async getToolsForAiSdk(\n serverIds?: string[] | string,\n options: { schemas?: ToolSchemaOverrides | \"automatic\" } = {},\n ): Promise<ToolSet> {\n const ids = Array.isArray(serverIds)\n ? serverIds\n : serverIds\n ? [serverIds]\n : this.listServers();\n\n const loadForServer = async (id: string): Promise<ToolSet> => {\n await this.ensureConnected(id);\n const listToolsResult = await this.listTools(id);\n return convertMCPToolsToVercelTools(listToolsResult, {\n schemas: options.schemas,\n callTool: async ({ name, args, options: callOptions }) => {\n const requestOptions = callOptions?.abortSignal\n ? { signal: callOptions.abortSignal }\n : undefined;\n const result = await this.executeTool(\n id,\n name,\n (args ?? {}) as ExecuteToolArguments,\n requestOptions,\n );\n return CallToolResultSchema.parse(result);\n },\n });\n };\n\n const perServerTools = await Promise.all(\n ids.map(async (id) => {\n try {\n const tools = await loadForServer(id);\n // Attach server id metadata to each tool object for downstream extraction\n for (const [name, tool] of Object.entries(tools)) {\n (tool as any)._serverId = id;\n }\n return tools;\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"tools/list\")) {\n return {} as ToolSet;\n }\n throw error;\n }\n }),\n );\n\n // Flatten into a single ToolSet (last-in wins for name collisions)\n const flattened: ToolSet = {};\n for (const toolset of perServerTools) {\n for (const [name, tool] of Object.entries(toolset)) {\n flattened[name] = tool;\n }\n }\n\n return flattened;\n }\n\n async executeTool(\n serverId: string,\n toolName: string,\n args: ExecuteToolArguments = {},\n options?: CallToolOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.callTool(\n {\n name: toolName,\n arguments: args,\n },\n CallToolResultSchema,\n this.withTimeout(serverId, options),\n );\n }\n\n async listResources(\n serverId: string,\n params?: ListResourcesParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n try {\n return await client.listResources(\n params,\n this.withTimeout(serverId, options),\n );\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"resources/list\")) {\n return {\n resources: [],\n } as Awaited<ReturnType<Client[\"listResources\"]>>;\n }\n throw error;\n }\n }\n\n async readResource(\n serverId: string,\n params: ReadResourceParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.readResource(params, this.withTimeout(serverId, options));\n }\n\n async subscribeResource(\n serverId: string,\n params: SubscribeResourceParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.subscribeResource(\n params,\n this.withTimeout(serverId, options),\n );\n }\n\n async unsubscribeResource(\n serverId: string,\n params: UnsubscribeResourceParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.unsubscribeResource(\n params,\n this.withTimeout(serverId, options),\n );\n }\n\n async listResourceTemplates(\n serverId: string,\n params?: ListResourceTemplatesParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.listResourceTemplates(\n params,\n this.withTimeout(serverId, options),\n );\n }\n\n async listPrompts(\n serverId: string,\n params?: ListPromptsParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n try {\n return await client.listPrompts(\n params,\n this.withTimeout(serverId, options),\n );\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"prompts/list\")) {\n return {\n prompts: [],\n } as Awaited<ReturnType<Client[\"listPrompts\"]>>;\n }\n throw error;\n }\n }\n\n async getPrompt(\n serverId: string,\n params: GetPromptParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.getPrompt(params, this.withTimeout(serverId, options));\n }\n\n getSessionIdByServer(serverId: string): string | undefined {\n const state = this.clientStates.get(serverId);\n if (!state?.transport) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.transport instanceof StreamableHTTPClientTransport) {\n return state.transport.sessionId;\n }\n throw new Error(\n `Server \"${serverId}\" must be Streamable HTTP to get the session ID.`,\n );\n }\n\n addNotificationHandler(\n serverId: string,\n schema: NotificationSchema,\n handler: NotificationHandler,\n ): void {\n const serverHandlers = this.notificationHandlers.get(serverId) ?? new Map();\n const handlersForSchema =\n serverHandlers.get(schema) ?? new Set<NotificationHandler>();\n handlersForSchema.add(handler);\n serverHandlers.set(schema, handlersForSchema);\n this.notificationHandlers.set(serverId, serverHandlers);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n client.setNotificationHandler(\n schema,\n this.createNotificationDispatcher(serverId, schema),\n );\n }\n }\n\n onResourceListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceListChangedNotificationSchema,\n handler,\n );\n }\n\n onResourceUpdated(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceUpdatedNotificationSchema,\n handler,\n );\n }\n\n onPromptListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n PromptListChangedNotificationSchema,\n handler,\n );\n }\n\n getClient(serverId: string): Client | undefined {\n return this.clientStates.get(serverId)?.client;\n }\n\n setElicitationHandler(serverId: string, handler: ElicitationHandler): void {\n if (!this.clientStates.has(serverId)) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n\n this.elicitationHandlers.set(serverId, handler);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n this.applyElicitationHandler(serverId, client);\n }\n }\n\n clearElicitationHandler(serverId: string): void {\n this.elicitationHandlers.delete(serverId);\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n client.removeRequestHandler(\"elicitation/create\");\n }\n }\n\n // Global elicitation callback API (no serverId required)\n setElicitationCallback(\n callback: (request: {\n requestId: string;\n message: string;\n schema: unknown;\n }) => Promise<ElicitResult> | ElicitResult,\n ): void {\n this.elicitationCallback = callback;\n // Apply to all connected clients that don't have a server-specific handler\n for (const [serverId, state] of this.clientStates.entries()) {\n const client = state.client;\n if (!client) continue;\n if (this.elicitationHandlers.has(serverId)) {\n // Respect server-specific handler\n this.applyElicitationHandler(serverId, client);\n } else {\n this.applyElicitationHandler(serverId, client);\n }\n }\n }\n\n clearElicitationCallback(): void {\n this.elicitationCallback = undefined;\n // Reconfigure clients: keep server-specific handlers, otherwise remove\n for (const [serverId, state] of this.clientStates.entries()) {\n const client = state.client;\n if (!client) continue;\n if (this.elicitationHandlers.has(serverId)) {\n this.applyElicitationHandler(serverId, client);\n } else {\n client.removeRequestHandler(\"elicitation/create\");\n }\n }\n }\n\n // Expose the pending elicitation map so callers can add resolvers\n getPendingElicitations(): Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n // Helper to resolve a pending elicitation from outside\n respondToElicitation(requestId: string, response: ElicitResult): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) return false;\n try {\n pending.resolve(response);\n return true;\n } finally {\n this.pendingElicitations.delete(requestId);\n }\n }\n\n private async connectViaStdio(\n serverId: string,\n client: Client,\n config: StdioServerConfig,\n timeout: number,\n ): Promise<Transport> {\n const underlying = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...getDefaultEnvironment(), ...(config.env ?? {}) },\n });\n const wrapped = this.wrapTransportForLogging(serverId, config, underlying);\n await client.connect(wrapped, { timeout });\n return underlying;\n }\n\n private async connectViaHttp(\n serverId: string,\n client: Client,\n config: HttpServerConfig,\n timeout: number,\n ): Promise<Transport> {\n const preferSSE = config.preferSSE ?? config.url.pathname.endsWith(\"/sse\");\n let streamableError: unknown;\n\n if (!preferSSE) {\n const streamableTransport = new StreamableHTTPClientTransport(\n config.url,\n {\n requestInit: config.requestInit,\n reconnectionOptions: config.reconnectionOptions,\n authProvider: config.authProvider,\n sessionId: config.sessionId,\n },\n );\n\n try {\n const wrapped = this.wrapTransportForLogging(\n serverId,\n config,\n streamableTransport,\n );\n await client.connect(wrapped, {\n timeout: Math.min(timeout, 3000),\n });\n return streamableTransport;\n } catch (error) {\n streamableError = error;\n await this.safeCloseTransport(streamableTransport);\n }\n }\n\n const sseTransport = new SSEClientTransport(config.url, {\n requestInit: config.requestInit,\n eventSourceInit: config.eventSourceInit,\n authProvider: config.authProvider,\n });\n\n try {\n const wrapped = this.wrapTransportForLogging(\n serverId,\n config,\n sseTransport,\n );\n await client.connect(wrapped, { timeout });\n return sseTransport;\n } catch (error) {\n await this.safeCloseTransport(sseTransport);\n const streamableMessage = streamableError\n ? ` Streamable HTTP error: ${this.formatError(streamableError)}.`\n : \"\";\n throw new Error(\n `Failed to connect to MCP server \"${serverId}\" using HTTP transports.${streamableMessage} SSE error: ${this.formatError(error)}.`,\n );\n }\n }\n\n private async safeCloseTransport(transport: Transport): Promise<void> {\n try {\n await transport.close();\n } catch {\n // Ignore close errors during cleanup.\n }\n }\n\n private applyNotificationHandlers(serverId: string, client: Client): void {\n const serverHandlers = this.notificationHandlers.get(serverId);\n if (!serverHandlers) {\n return;\n }\n\n for (const [schema] of serverHandlers) {\n client.setNotificationHandler(\n schema,\n this.createNotificationDispatcher(serverId, schema),\n );\n }\n }\n\n private createNotificationDispatcher(\n serverId: string,\n schema: NotificationSchema,\n ): NotificationHandler {\n return (notification) => {\n const serverHandlers = this.notificationHandlers.get(serverId);\n const handlersForSchema = serverHandlers?.get(schema);\n if (!handlersForSchema || handlersForSchema.size === 0) {\n return;\n }\n for (const handler of handlersForSchema) {\n try {\n handler(notification);\n } catch {\n // Swallow individual handler errors to avoid breaking other listeners.\n }\n }\n };\n }\n\n private applyElicitationHandler(serverId: string, client: Client): void {\n const serverSpecific = this.elicitationHandlers.get(serverId);\n if (serverSpecific) {\n client.setRequestHandler(ElicitRequestSchema, async (request) =>\n serverSpecific(request.params),\n );\n return;\n }\n\n if (this.elicitationCallback) {\n client.setRequestHandler(ElicitRequestSchema, async (request) => {\n const reqId = `elicit_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2, 9)}`;\n return await this.elicitationCallback!({\n requestId: reqId,\n message: (request.params as any)?.message,\n schema:\n (request.params as any)?.requestedSchema ??\n (request.params as any)?.schema,\n });\n });\n return;\n }\n }\n\n private async ensureConnected(serverId: string): Promise<void> {\n const state = this.clientStates.get(serverId);\n if (state?.client) {\n return;\n }\n\n if (!state) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.promise) {\n await state.promise;\n return;\n }\n await this.connectToServer(serverId, state.config);\n }\n\n private resetState(serverId: string): void {\n this.clientStates.delete(serverId);\n this.toolsMetadataCache.delete(serverId);\n }\n\n private resolveConnectionStatus(\n state: ManagedClientState | undefined,\n ): MCPConnectionStatus {\n if (!state) {\n return \"disconnected\";\n }\n if (state.client) {\n return \"connected\";\n }\n if (state.promise) {\n return \"connecting\";\n }\n return \"disconnected\";\n }\n\n private withTimeout(\n serverId: string,\n options?: RequestOptions,\n ): RequestOptions {\n const state = this.clientStates.get(serverId);\n const timeout =\n state?.timeout ??\n (state ? this.getTimeout(state.config) : this.defaultTimeout);\n\n if (!options) {\n return { timeout };\n }\n\n if (options.timeout === undefined) {\n return { ...options, timeout };\n }\n\n return options;\n }\n\n private buildCapabilities(config: MCPServerConfig): ClientCapabilityOptions {\n const capabilities: ClientCapabilityOptions = {\n ...this.defaultCapabilities,\n ...(config.capabilities ?? {}),\n };\n\n if (!capabilities.elicitation) {\n capabilities.elicitation = {};\n }\n\n return capabilities;\n }\n\n private formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n\n // Returns a transport that logs JSON-RPC traffic if enabled for this server\n private wrapTransportForLogging(\n serverId: string,\n config: MCPServerConfig,\n transport: Transport,\n ): Transport {\n const logger = this.resolveRpcLogger(serverId, config);\n if (!logger) return transport;\n const log: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void = logger;\n\n // Wrapper that proxies to the underlying transport while emitting logs\n const self = this;\n class LoggingTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n constructor(private readonly inner: Transport) {\n this.inner.onmessage = (\n message: JSONRPCMessage,\n extra?: MessageExtraInfo,\n ) => {\n try {\n log({ direction: \"receive\", message, serverId });\n } catch {\n // ignore logger errors\n }\n this.onmessage?.(message, extra);\n };\n this.inner.onclose = () => {\n this.onclose?.();\n };\n this.inner.onerror = (error: Error) => {\n this.onerror?.(error);\n };\n }\n async start(): Promise<void> {\n if (typeof (this.inner as any).start === \"function\") {\n await (this.inner as any).start();\n }\n }\n async send(\n message: JSONRPCMessage,\n options?: TransportSendOptions,\n ): Promise<void> {\n try {\n log({ direction: \"send\", message, serverId });\n } catch {\n // ignore logger errors\n }\n await this.inner.send(message as any, options as any);\n }\n async close(): Promise<void> {\n await this.inner.close();\n }\n get sessionId(): string | undefined {\n return (this.inner as any).sessionId;\n }\n setProtocolVersion?(version: string): void {\n if (typeof this.inner.setProtocolVersion === \"function\") {\n this.inner.setProtocolVersion(version);\n }\n }\n }\n\n return new LoggingTransport(transport);\n }\n\n private resolveRpcLogger(\n serverId: string,\n config: MCPServerConfig,\n ):\n | ((event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void)\n | undefined {\n if (config.rpcLogger) return config.rpcLogger;\n if (config.logJsonRpc || this.defaultLogJsonRpc) {\n return ({ direction, message, serverId: id }) => {\n let printable: string;\n try {\n printable =\n typeof message === \"string\" ? message : JSON.stringify(message);\n } catch {\n printable = String(message);\n }\n // eslint-disable-next-line no-console\n console.debug(`[MCP:${id}] ${direction.toUpperCase()} ${printable}`);\n };\n }\n if (this.defaultRpcLogger) return this.defaultRpcLogger;\n return undefined;\n }\n\n private isMethodUnavailableError(error: unknown, method: string): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n const methodTokens = new Set<string>();\n const pushToken = (token: string) => {\n if (token) {\n methodTokens.add(token.toLowerCase());\n }\n };\n\n pushToken(method);\n for (const part of method.split(/[\\/:._-]/)) {\n pushToken(part);\n }\n const indicators = [\n \"method not found\",\n \"not implemented\",\n \"unsupported\",\n \"does not support\",\n \"unimplemented\",\n ];\n const indicatorMatch = indicators.some((indicator) =>\n message.includes(indicator),\n );\n if (!indicatorMatch) {\n return false;\n }\n\n if (Array.from(methodTokens).some((token) => message.includes(token))) {\n return true;\n }\n\n return true;\n }\n\n private getTimeout(config: MCPServerConfig): number {\n return config.timeout ?? this.defaultTimeout;\n }\n\n private isStdioConfig(config: MCPServerConfig): config is StdioServerConfig {\n return \"command\" in config;\n }\n\n private getClientById(serverId: string): Client {\n const state = this.clientStates.get(serverId);\n if (!state?.client) {\n throw new Error(`MCP server \"${serverId}\" is not connected.`);\n }\n return state.client;\n }\n}\n\nexport type MCPPromptListResult = Awaited<\n ReturnType<MCPClientManager[\"listPrompts\"]>\n>;\nexport type MCPPrompt = MCPPromptListResult[\"prompts\"][number];\nexport type MCPGetPromptResult = Awaited<\n ReturnType<MCPClientManager[\"getPrompt\"]>\n>;\nexport type MCPResourceListResult = Awaited<\n ReturnType<MCPClientManager[\"listResources\"]>\n>;\nexport type MCPResource = MCPResourceListResult[\"resources\"][number];\nexport type MCPReadResourceResult = Awaited<\n ReturnType<MCPClientManager[\"readResource\"]>\n>;\nexport type MCPServerSummary = ServerSummary;\nexport type MCPConvertedToolSet<\n SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> = ConvertedToolSet<SCHEMAS>;\nexport type MCPToolSchemaOverrides = ToolSchemaOverrides;\n","import type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\nimport {\n CallToolResult,\n CallToolResultSchema,\n ListToolsResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n dynamicTool,\n jsonSchema,\n tool as defineTool,\n type Tool,\n type ToolCallOptions,\n ToolSet,\n} from \"ai\";\nimport type { FlexibleSchema } from \"@ai-sdk/provider-utils\";\n\nconst ensureJsonSchemaObject = (schema: unknown): JSONSchema7 => {\n if (schema && typeof schema === \"object\") {\n const record = schema as Record<string, unknown>;\n const base: JSONSchema7 = record.jsonSchema\n ? ensureJsonSchemaObject(record.jsonSchema)\n : (record as JSONSchema7);\n\n // Many MCP tools omit the top-level type; Anthropic requires an object schema.\n if (!(\"type\" in base) || base.type === undefined) {\n base.type = \"object\";\n }\n if (base.type === \"object\") {\n base.properties = (base.properties ?? {}) as Record<\n string,\n JSONSchema7Definition\n >;\n if (base.additionalProperties === undefined) {\n base.additionalProperties = false;\n }\n }\n\n return base;\n }\n\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } satisfies JSONSchema7;\n};\n\ntype CallToolExecutor = (params: {\n name: string;\n args: unknown;\n options: ToolCallOptions;\n}) => Promise<CallToolResult>;\n\nexport type ToolSchemaOverrides = Record<\n string,\n { inputSchema: FlexibleSchema<unknown> }\n>;\n\nexport type ConvertedToolSet<\n SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> = SCHEMAS extends ToolSchemaOverrides\n ? { [K in keyof SCHEMAS]: Tool }\n : Record<string, Tool>;\n\ntype ConvertOptions<TOOL_SCHEMAS extends ToolSchemaOverrides | \"automatic\"> = {\n schemas?: TOOL_SCHEMAS;\n callTool: CallToolExecutor;\n};\n\nexport async function convertMCPToolsToVercelTools(\n listToolsResult: ListToolsResult,\n {\n schemas = \"automatic\",\n callTool,\n }: ConvertOptions<ToolSchemaOverrides | \"automatic\">,\n): Promise<ToolSet> {\n const tools: ToolSet = {};\n\n for (const toolDescription of listToolsResult.tools) {\n const { name, description, inputSchema } = toolDescription;\n\n const execute = async (args: unknown, options: ToolCallOptions) => {\n options?.abortSignal?.throwIfAborted?.();\n const result = await callTool({ name, args, options });\n return CallToolResultSchema.parse(result);\n };\n\n let vercelTool: Tool;\n if (schemas === \"automatic\") {\n const normalizedInputSchema = ensureJsonSchemaObject(inputSchema);\n vercelTool = dynamicTool({\n description,\n inputSchema: jsonSchema({\n type: \"object\",\n properties: normalizedInputSchema.properties ?? {},\n additionalProperties:\n (normalizedInputSchema as any).additionalProperties ?? false,\n }),\n execute,\n });\n } else {\n const overrides = schemas;\n if (!(name in overrides)) {\n // If overrides are provided, only include tools explicitly listed\n continue;\n }\n vercelTool = defineTool({\n description,\n inputSchema: overrides[name].inputSchema,\n execute,\n });\n }\n\n tools[name] = vercelTool;\n }\n\n return tools;\n}\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 if (serverConfig.url) {\n if (typeof serverConfig.url === \"string\") {\n serverConfig.url = new URL(serverConfig.url);\n } else if (\n typeof serverConfig.url === \"object\" &&\n serverConfig.url.href\n ) {\n serverConfig.url = new URL(serverConfig.url.href);\n }\n }\n\n const mcpClientManager = c.mcpClientManager;\n try {\n await mcpClientManager.connectToServer(serverId, serverConfig);\n return c.json({\n success: true,\n status: \"connected\",\n });\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `Connection failed for server ${serverId}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\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 type { MCPServerConfig } from \"@/sdk\";\nimport \"../../types/hono\"; // Type extensions\nimport { rpcLogBus, type RpcLogEvent } from \"../../services/rpc-log-bus\";\n\nconst servers = new Hono();\n\n// List all connected servers with their status\nservers.get(\"/\", async (c) => {\n try {\n const mcpClientManager = c.mcpClientManager;\n const serverList = mcpClientManager\n .getServerSummaries()\n .map(({ id, status, config }) => ({\n id,\n name: id,\n status,\n config,\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\nservers.get(\"/status/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpClientManager = c.mcpClientManager;\n const status =\n mcpClientManager.getConnectionStatusByAttemptingPing(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 mcpClientManager = c.mcpClientManager;\n\n try {\n const client = mcpClientManager.getClient(serverId);\n if (client) {\n await mcpClientManager.disconnectServer(serverId);\n }\n } catch (error) {\n // Ignore disconnect errors for already disconnected servers\n console.debug(\n `Failed to disconnect MCP server ${serverId} during removal`,\n error,\n );\n }\n\n mcpClientManager.removeServer(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()) as {\n serverId?: string;\n serverConfig?: MCPServerConfig;\n };\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 mcpClientManager = c.mcpClientManager;\n\n const normalizedConfig: MCPServerConfig = { ...serverConfig };\n if (\n \"url\" in normalizedConfig &&\n normalizedConfig.url !== undefined &&\n normalizedConfig.url !== null\n ) {\n const urlValue = normalizedConfig.url as unknown;\n if (typeof urlValue === \"string\") {\n normalizedConfig.url = new URL(urlValue);\n } else if (urlValue instanceof URL) {\n // already normalized\n } else if (\n typeof urlValue === \"object\" &&\n urlValue !== null &&\n \"href\" in (urlValue as Record<string, unknown>) &&\n typeof (urlValue as { href?: unknown }).href === \"string\"\n ) {\n normalizedConfig.url = new URL((urlValue as { href: string }).href);\n }\n }\n\n await mcpClientManager.disconnectServer(serverId);\n await mcpClientManager.connectToServer(serverId, normalizedConfig);\n\n const status =\n mcpClientManager.getConnectionStatusByAttemptingPing(serverId);\n const message =\n status === \"connected\"\n ? `Reconnected to server: ${serverId}`\n : `Server ${serverId} reconnected with status '${status}'`;\n const success = status === \"connected\";\n\n return c.json({\n success,\n serverId,\n status,\n message,\n ...(success ? {} : { error: message }),\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\n// Stream JSON-RPC messages over SSE for all servers.\nservers.get(\"/rpc/stream\", async (c) => {\n const serverIds = c.mcpClientManager.listServers();\n const url = new URL(c.req.url);\n const replay = parseInt(url.searchParams.get(\"replay\") || \"0\", 10);\n\n const encoder = new TextEncoder();\n const stream = new ReadableStream({\n start(controller) {\n const send = (data: unknown) => {\n try {\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {}\n };\n\n // Replay recent messages for all known servers\n try {\n const recent = rpcLogBus.getBuffer(\n serverIds,\n isNaN(replay) ? 0 : replay,\n );\n for (const evt of recent) {\n send({ type: \"rpc\", ...evt });\n }\n } catch {}\n\n // Subscribe to live events for all known servers\n const unsubscribe = rpcLogBus.subscribe(serverIds, (evt: RpcLogEvent) => {\n send({ type: \"rpc\", ...evt });\n });\n\n // Keepalive comments\n const keepalive = setInterval(() => {\n try {\n controller.enqueue(encoder.encode(`: keepalive ${Date.now()}\\n\\n`));\n } catch {}\n }, 15000);\n\n // Cleanup on client disconnect\n c.req.raw.signal.addEventListener(\"abort\", () => {\n try {\n clearInterval(keepalive);\n unsubscribe();\n } catch {}\n try {\n controller.close();\n } catch {}\n });\n },\n });\n\n return new Response(stream, {\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-Expose-Headers\": \"*\",\n },\n });\n});\n\nexport default servers;\n","import { EventEmitter } from \"events\";\n\nexport type RpcLogEvent = {\n serverId: string;\n direction: \"send\" | \"receive\";\n timestamp: string; // ISO\n message: unknown;\n};\n\nclass RpcLogBus {\n private readonly emitter = new EventEmitter();\n private readonly bufferByServer = new Map<string, RpcLogEvent[]>();\n\n publish(event: RpcLogEvent): void {\n const buffer = this.bufferByServer.get(event.serverId) ?? [];\n buffer.push(event);\n this.bufferByServer.set(event.serverId, buffer);\n this.emitter.emit(\"event\", event);\n }\n\n subscribe(\n serverIds: string[],\n listener: (event: RpcLogEvent) => void,\n ): () => void {\n const filter = new Set(serverIds);\n const handler = (event: RpcLogEvent) => {\n if (filter.size === 0 || filter.has(event.serverId)) listener(event);\n };\n this.emitter.on(\"event\", handler);\n return () => this.emitter.off(\"event\", handler);\n }\n\n getBuffer(serverIds: string[], limit: number): RpcLogEvent[] {\n const filter = new Set(serverIds);\n const all: RpcLogEvent[] = [];\n for (const [serverId, buf] of this.bufferByServer.entries()) {\n if (filter.size > 0 && !filter.has(serverId)) continue;\n all.push(...buf);\n }\n // If limit is 0, return empty array (no replay)\n if (limit === 0) return [];\n // If limit is not finite or negative, return all\n if (!Number.isFinite(limit) || limit < 0) return all;\n return all.slice(Math.max(0, all.length - limit));\n }\n}\n\nexport const rpcLogBus = new RpcLogBus();\n","import { Hono } from \"hono\";\nimport type {\n ElicitRequest,\n ElicitResult,\n ListToolsResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport \"../../types/hono\"; // Type extensions\n\nconst tools = new Hono();\n\ntype ElicitationPayload = {\n executionId: string;\n requestId: string;\n request: ElicitRequest[\"params\"];\n issuedAt: string;\n serverId: string;\n};\n\ntype ExecutionContext = {\n id: string;\n serverId: string;\n toolName: string;\n execPromise: Promise<ListToolsResult>;\n queue: ElicitationPayload[];\n waiter?: (payload: ElicitationPayload) => void;\n};\n\nlet activeExecution: ExecutionContext | null = null;\n\nconst pendingResponses = new Map<\n string,\n {\n serverId: string;\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n>();\n\nfunction makeExecutionId() {\n return `exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction makeRequestId() {\n return `req_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction takeNextRequest(\n context: ExecutionContext,\n): Promise<ElicitationPayload> {\n if (context.queue.length > 0) {\n return Promise.resolve(context.queue.shift()!);\n }\n return new Promise((resolve) => {\n context.waiter = resolve;\n });\n}\n\nfunction enqueueRequest(\n context: ExecutionContext,\n payload: ElicitationPayload,\n) {\n if (context.waiter) {\n const resolve = context.waiter;\n context.waiter = undefined;\n resolve(payload);\n return;\n }\n context.queue.push(payload);\n}\n\nfunction resetExecution(context: ExecutionContext | null, clear: () => void) {\n if (!context) return;\n clear();\n if (activeExecution === context) {\n activeExecution = null;\n }\n if (context.queue.length > 0) {\n context.queue.length = 0;\n }\n context.waiter = undefined;\n for (const [requestId, pending] of Array.from(pendingResponses.entries())) {\n if (pending.serverId !== context.serverId) continue;\n pendingResponses.delete(requestId);\n pending.reject(new Error(\"Execution finished\"));\n }\n}\n\nfunction serializeMcpError(error: unknown) {\n const anyErr = error as any;\n const base = {\n name: anyErr?.name ?? \"Error\",\n message: anyErr?.message ?? String(error),\n code: anyErr?.code ?? anyErr?.error?.code,\n data: anyErr?.data ?? anyErr?.error?.data,\n } as Record<string, unknown>;\n const cause = anyErr?.cause;\n if (cause && typeof cause === \"object\") {\n base.cause = {\n name: (cause as any)?.name,\n message: (cause as any)?.message,\n code: (cause as any)?.code,\n data: (cause as any)?.data,\n };\n }\n if (process.env.NODE_ENV === \"development\" && anyErr?.stack) {\n base.stack = anyErr.stack;\n }\n return base;\n}\n\nfunction jsonError(c: any, error: unknown, fallbackStatus = 500) {\n const details = serializeMcpError(error);\n const status =\n typeof (error as any)?.status === \"number\"\n ? (error as any).status\n : fallbackStatus;\n return c.json(\n { error: details.message as string, mcpError: details },\n status,\n );\n}\n\ntools.post(\"/list\", async (c) => {\n try {\n const { serverId } = (await c.req.json()) as { serverId?: string };\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n const result = (await c.mcpClientManager.listTools(\n serverId,\n )) as ListToolsResult;\n\n // Get cached metadata map for O(1) frontend lookups\n const toolsMetadata = c.mcpClientManager.getAllToolsMetadata(serverId);\n\n return c.json({ ...result, toolsMetadata });\n } catch (error) {\n return jsonError(c, error, 500);\n }\n});\n\ntools.post(\"/execute\", async (c) => {\n if (activeExecution) {\n return c.json({ error: \"Another execution is already in progress\" }, 409);\n }\n\n const {\n serverId,\n toolName,\n parameters = {},\n } = (await c.req.json()) as {\n serverId?: string;\n toolName?: string;\n parameters?: Record<string, unknown>;\n };\n\n if (!serverId) return c.json({ error: \"serverId is required\" }, 400);\n if (!toolName) return c.json({ error: \"toolName is required\" }, 400);\n\n const manager = c.mcpClientManager;\n const client = manager.getClient(serverId);\n if (!client) {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n\n const executionId = makeExecutionId();\n\n const context: ExecutionContext = {\n id: executionId,\n serverId,\n toolName,\n execPromise: manager.executeTool(\n serverId,\n toolName,\n parameters,\n ) as Promise<ListToolsResult>,\n queue: [],\n };\n\n activeExecution = context;\n\n manager.setElicitationHandler(serverId, async (params) => {\n const payload: ElicitationPayload = {\n executionId,\n requestId: makeRequestId(),\n request: params,\n issuedAt: new Date().toISOString(),\n serverId,\n };\n\n enqueueRequest(context, payload);\n\n return new Promise<ElicitResult>((resolve, reject) => {\n pendingResponses.set(payload.requestId, {\n serverId,\n resolve: (value) => {\n pendingResponses.delete(payload.requestId);\n resolve(value);\n },\n reject: (err) => {\n pendingResponses.delete(payload.requestId);\n reject(err);\n },\n });\n });\n });\n\n try {\n const next = await Promise.race([\n context.execPromise.then((result) => ({ kind: \"done\" as const, result })),\n takeNextRequest(context).then((payload) => ({\n kind: \"elicitation\" as const,\n payload,\n })),\n ]);\n\n if (next.kind === \"done\") {\n resetExecution(context, () => manager.clearElicitationHandler(serverId));\n return c.json({ status: \"completed\", result: next.result });\n }\n\n return c.json(\n {\n status: \"elicitation_required\",\n executionId,\n requestId: next.payload.requestId,\n request: next.payload.request,\n timestamp: next.payload.issuedAt,\n },\n 202,\n );\n } catch (error) {\n resetExecution(context, () => manager.clearElicitationHandler(serverId));\n return jsonError(c, error, 500);\n }\n});\n\ntools.post(\"/respond\", async (c) => {\n const context = activeExecution;\n if (!context) {\n return c.json({ error: \"No active execution\" }, 404);\n }\n\n const { requestId, response } = (await c.req.json()) as {\n requestId?: string;\n response?: ElicitResult;\n };\n\n if (!requestId) {\n return c.json({ error: \"requestId is required\" }, 400);\n }\n\n const pending = pendingResponses.get(requestId);\n if (!pending) {\n return c.json({ error: \"No pending elicitation for requestId\" }, 404);\n }\n\n pending.resolve(response as ElicitResult);\n\n try {\n const next = await Promise.race([\n context.execPromise.then((result) => ({ kind: \"done\" as const, result })),\n takeNextRequest(context).then((payload) => ({\n kind: \"elicitation\" as const,\n payload,\n })),\n ]);\n\n if (next.kind === \"done\") {\n resetExecution(context, () =>\n c.mcpClientManager.clearElicitationHandler(context.serverId),\n );\n return c.json({ status: \"completed\", result: next.result });\n }\n\n return c.json(\n {\n status: \"elicitation_required\",\n executionId: context.id,\n requestId: next.payload.requestId,\n request: next.payload.request,\n timestamp: next.payload.issuedAt,\n },\n 202,\n );\n } catch (error) {\n resetExecution(context, () =>\n c.mcpClientManager.clearElicitationHandler(context.serverId),\n );\n return jsonError(c, error, 500);\n }\n});\n\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// In-memory storage for widget data (TTL: 1 hour)\ninterface WidgetData {\n serverId: string;\n uri: string;\n toolInput: Record<string, any>;\n toolOutput: any;\n toolResponseMetadata?: Record<string, any> | null;\n toolId: string;\n timestamp: number;\n}\n\nconst widgetDataStore = new Map<string, WidgetData>();\n\n// Cleanup expired widget data every 5 minutes\nsetInterval(\n () => {\n const now = Date.now();\n const ONE_HOUR = 60 * 60 * 1000;\n for (const [toolId, data] of widgetDataStore.entries()) {\n if (now - data.timestamp > ONE_HOUR) {\n widgetDataStore.delete(toolId);\n }\n }\n },\n 5 * 60 * 1000,\n).unref();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverId } = (await c.req.json()) as { serverId?: string };\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n const mcpClientManager = c.mcpClientManager;\n const { resources } = await mcpClientManager.listResources(serverId);\n return c.json({ resources });\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()) as {\n serverId?: string;\n uri?: string;\n };\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.mcpClientManager;\n\n const content = await mcpClientManager.readResource(serverId, {\n uri,\n });\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\n// Store widget data using toolId as key\nresources.post(\"/widget/store\", async (c) => {\n try {\n const body = await c.req.json();\n const {\n serverId,\n uri,\n toolInput,\n toolOutput,\n toolResponseMetadata,\n toolId,\n } = body;\n\n if (!serverId || !uri || !toolId) {\n return c.json({ success: false, error: \"Missing required fields\" }, 400);\n }\n\n // Store widget data using toolId as key\n widgetDataStore.set(toolId, {\n serverId,\n uri,\n toolInput,\n toolOutput,\n toolResponseMetadata: toolResponseMetadata ?? null,\n toolId,\n timestamp: Date.now(),\n });\n\n return c.json({ success: true });\n } catch (error) {\n console.error(\"Error storing widget data:\", 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// Simpler widget endpoint for React Router compatibility\n// Container page that changes URL to \"/\" before loading widget\nresources.get(\"/widget/:toolId\", async (c) => {\n const toolId = c.req.param(\"toolId\");\n\n // Check if data exists in storage\n const widgetData = widgetDataStore.get(toolId);\n if (!widgetData) {\n return c.html(\n \"<html><body>Error: Widget data not found or expired</body></html>\",\n 404,\n );\n }\n\n // Return a container page that will fetch and load the actual widget\n return c.html(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Loading Widget...</title>\n </head>\n <body>\n <script>\n (async function() {\n // Change URL to \"/\" BEFORE loading widget (for React Router)\n history.replaceState(null, '', '/');\n\n // Fetch the actual widget HTML using toolId\n const response = await fetch('/api/mcp/resources/widget-content/${toolId}');\n const html = await response.text();\n\n // Replace entire document with widget HTML\n document.open();\n document.write(html);\n document.close();\n })();\n </script>\n </body>\n </html>\n `);\n});\n\n// Actual widget content endpoint\nresources.get(\"/widget-content/:toolId\", async (c) => {\n try {\n const toolId = c.req.param(\"toolId\");\n\n // Retrieve widget data from storage\n const widgetData = widgetDataStore.get(toolId);\n if (!widgetData) {\n return c.html(\n \"<html><body>Error: Widget data not found or expired</body></html>\",\n 404,\n );\n }\n\n const { serverId, uri, toolInput, toolOutput, toolResponseMetadata } =\n widgetData;\n\n const mcpClientManager = c.mcpClientManager;\n const availableServers = mcpClientManager\n .listServers()\n .filter((id) => Boolean(mcpClientManager.getClient(id)));\n\n let actualServerId = serverId;\n if (!availableServers.includes(serverId)) {\n const match = availableServers.find(\n (name) => name.toLowerCase() === serverId.toLowerCase(),\n );\n if (match) {\n actualServerId = match;\n } else {\n return c.html(\n `<html><body>\n <h3>Error: Server not connected</h3>\n <p>Requested server: ${serverId}</p>\n <p>Available servers: ${availableServers.join(\", \")}</p>\n </body></html>`,\n 404,\n );\n }\n }\n\n const content = await mcpClientManager.readResource(actualServerId, {\n uri,\n });\n\n let htmlContent = \"\";\n const contentsArray = Array.isArray(content?.contents)\n ? content.contents\n : [];\n\n const firstContent = contentsArray[0];\n if (firstContent) {\n if (typeof (firstContent as { text?: unknown }).text === \"string\") {\n htmlContent = (firstContent as { text: string }).text;\n } else if (\n typeof (firstContent as { blob?: unknown }).blob === \"string\"\n ) {\n htmlContent = (firstContent as { blob: string }).blob;\n }\n }\n\n if (!htmlContent && content && typeof content === \"object\") {\n const recordContent = content as Record<string, unknown>;\n if (typeof recordContent.text === \"string\") {\n htmlContent = recordContent.text;\n } else if (typeof recordContent.blob === \"string\") {\n htmlContent = recordContent.blob;\n }\n }\n\n if (!htmlContent) {\n return c.html(\n \"<html><body>Error: No HTML content found</body></html>\",\n 404,\n );\n }\n\n const widgetStateKey = `openai-widget-state:${toolId}`;\n\n const apiScript = `\n <script>\n (function() {\n 'use strict';\n\n const openaiAPI = {\n toolInput: ${JSON.stringify(toolInput)},\n toolOutput: ${JSON.stringify(toolOutput)},\n toolResponseMetadata: ${JSON.stringify(toolResponseMetadata ?? null)},\n displayMode: 'inline',\n maxHeight: 600,\n theme: 'dark',\n locale: 'en-US',\n safeArea: { insets: { top: 0, bottom: 0, left: 0, right: 0 } },\n userAgent: {},\n widgetState: null,\n\n async setWidgetState(state) {\n this.widgetState = state;\n try {\n localStorage.setItem(${JSON.stringify(widgetStateKey)}, JSON.stringify(state));\n } catch (err) {\n console.error('[OpenAI Widget] Failed to save widget state:', err);\n }\n window.parent.postMessage({\n type: 'openai:setWidgetState',\n toolId: ${JSON.stringify(toolId)},\n state\n }, '*');\n },\n\n async callTool(toolName, params = {}) {\n return new Promise((resolve, reject) => {\n const requestId = \\`tool_\\${Date.now()}_\\${Math.random()}\\`;\n const handler = (event) => {\n if (event.data.type === 'openai:callTool:response' &&\n event.data.requestId === requestId) {\n window.removeEventListener('message', handler);\n if (event.data.error) {\n reject(new Error(event.data.error));\n } else {\n resolve(event.data.result);\n }\n }\n };\n window.addEventListener('message', handler);\n window.parent.postMessage({\n type: 'openai:callTool',\n requestId,\n toolName,\n params\n }, '*');\n setTimeout(() => {\n window.removeEventListener('message', handler);\n reject(new Error('Tool call timeout'));\n }, 30000);\n });\n },\n\n async sendFollowupTurn(message) {\n const payload = typeof message === 'string'\n ? { prompt: message }\n : message;\n window.parent.postMessage({\n type: 'openai:sendFollowup',\n message: payload.prompt || payload\n }, '*');\n },\n\n async requestDisplayMode(options = {}) {\n const mode = options.mode || 'inline';\n this.displayMode = mode;\n window.parent.postMessage({\n type: 'openai:requestDisplayMode',\n mode\n }, '*');\n return { mode };\n },\n\n async sendFollowUpMessage(args) {\n const prompt = typeof args === 'string' ? args : (args?.prompt || '');\n return this.sendFollowupTurn(prompt);\n },\n\n async openExternal(options) {\n const href = typeof options === 'string' ? options : options?.href;\n if (!href) {\n throw new Error('href is required for openExternal');\n }\n window.parent.postMessage({\n type: 'openai:openExternal',\n href\n }, '*');\n // Also open in new tab as fallback\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n Object.defineProperty(window, 'openai', {\n value: openaiAPI,\n writable: false,\n configurable: false,\n enumerable: true\n });\n\n Object.defineProperty(window, 'webplus', {\n value: openaiAPI,\n writable: false,\n configurable: false,\n enumerable: true\n });\n\n setTimeout(() => {\n try {\n const globalsEvent = new CustomEvent('webplus:set_globals', {\n detail: {\n globals: {\n displayMode: openaiAPI.displayMode,\n maxHeight: openaiAPI.maxHeight,\n theme: openaiAPI.theme,\n locale: openaiAPI.locale,\n safeArea: openaiAPI.safeArea,\n userAgent: openaiAPI.userAgent\n }\n }\n });\n window.dispatchEvent(globalsEvent);\n } catch (err) {}\n }, 0);\n\n setTimeout(() => {\n try {\n const stored = localStorage.getItem(${JSON.stringify(widgetStateKey)});\n if (stored && window.openai) {\n window.openai.widgetState = JSON.parse(stored);\n }\n } catch (err) {}\n }, 0);\n })();\n </script>\n `;\n\n let modifiedHtml;\n if (htmlContent.includes(\"<html>\") && htmlContent.includes(\"<head>\")) {\n modifiedHtml = htmlContent.replace(\n \"<head>\",\n `<head><base href=\"/\">${apiScript}`,\n );\n } else {\n modifiedHtml = `<!DOCTYPE html>\n<html>\n<head>\n <base href=\"/\">\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n ${apiScript}\n</head>\n<body>\n ${htmlContent}\n</body>\n</html>`;\n }\n\n const trustedCdns = [\n \"https://persistent.oaistatic.com\",\n \"https://*.oaistatic.com\",\n \"https://unpkg.com\",\n \"https://cdn.jsdelivr.net\",\n \"https://cdnjs.cloudflare.com\",\n \"https://cdn.skypack.dev\",\n ].join(\" \");\n\n c.header(\n \"Content-Security-Policy\",\n [\n \"default-src 'self'\",\n `script-src 'self' 'unsafe-inline' 'unsafe-eval' ${trustedCdns}`,\n \"worker-src 'self' blob:\",\n \"child-src 'self' blob:\",\n `style-src 'self' 'unsafe-inline' ${trustedCdns}`,\n \"img-src 'self' data: https: blob:\",\n \"media-src 'self' data: https: blob:\",\n `font-src 'self' data: ${trustedCdns}`,\n \"connect-src 'self' https: wss: ws:\",\n \"frame-ancestors 'self'\",\n ].join(\"; \"),\n );\n c.header(\"X-Frame-Options\", \"SAMEORIGIN\");\n c.header(\"X-Content-Type-Options\", \"nosniff\");\n\n // Disable caching for widget content (always fetch fresh HTML from MCP server)\n c.header(\"Cache-Control\", \"no-cache, no-store, must-revalidate\");\n c.header(\"Pragma\", \"no-cache\");\n c.header(\"Expires\", \"0\");\n\n return c.html(modifiedHtml);\n } catch (error) {\n return c.html(\n `<html><body>Error: ${error instanceof Error ? error.message : \"Unknown error\"}</body></html>`,\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()) as { serverId?: string };\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n const mcpClientManager = c.mcpClientManager;\n const { prompts } = await mcpClientManager.listPrompts(serverId);\n return c.json({ prompts });\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()) as {\n serverId?: string;\n name?: string;\n args?: Record<string, unknown>;\n };\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 mcpClientManager = c.mcpClientManager;\n\n const promptArguments = args\n ? Object.fromEntries(\n Object.entries(args).map(([key, value]) => [key, String(value)]),\n )\n : undefined;\n\n const content = await mcpClientManager.getPrompt(serverId, {\n name,\n arguments: promptArguments,\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 type { ModelMessage, ToolSet } from \"ai\";\nimport { executeToolCallsFromMessages } from \"@/shared/http-tool-calls\";\nimport {\n BackendToolCallEvent,\n BackendToolResultEvent,\n runBackendConversation,\n} from \"@/shared/backend-conversation\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport { MCPClientManager } from \"@/sdk\";\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: string | null;\n stepIndex: number;\n // Map tool call ID to tool name for serverId lookup\n toolCallIdToName: Map<string, string>;\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 litellmBaseUrl?: 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 // Generate unique ID with timestamp and random suffix\n const currentToolCallId = `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n const toolName = call.name || call.toolName;\n\n // Store tool name for serverId lookup later\n streamingContext.toolCallIdToName.set(currentToolCallId, toolName);\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: 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 : `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\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 || 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: ToolSet,\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n provider: ModelProvider,\n toolsWithServerId: Record<string, any>, // Tools with _serverId metadata attached\n temperature?: number,\n systemPrompt?: string,\n) => {\n // Helper to extract serverId from tool metadata (same pattern as http-tool-calls.ts)\n const extractServerId = (toolName: string): string | undefined => {\n const tool = toolsWithServerId[toolName];\n return tool?._serverId;\n };\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 let hadError = false;\n while (steps < MAX_AGENT_STEPS) {\n let accumulatedText = \"\";\n const iterationToolCalls: any[] = [];\n const iterationToolResults: any[] = [];\n\n let streamResult;\n let hadStreamError = false;\n let streamErrorMessage = \"\";\n let response: any = null;\n\n // Helper to extract clean error message from AI SDK error structures\n const extractErrorMessage = (error: any): string => {\n if (error.error && typeof error.error === \"object\") {\n const apiError = error.error as any;\n if (apiError.data?.error?.message) return apiError.data.error.message;\n if (apiError.responseBody) {\n try {\n const parsed = JSON.parse(apiError.responseBody);\n if (parsed.error?.message) return parsed.error.message;\n } catch {}\n }\n if (apiError.message) return apiError.message;\n }\n if (error.error instanceof Error) return error.error.message;\n return String(error.error || error.message || \"Unknown error occurred\");\n };\n\n streamResult = 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 onError: (error) => {\n hadStreamError = true;\n streamErrorMessage = extractErrorMessage(error);\n },\n onChunk: async (chunk) => {\n try {\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 // Generate unique ID with timestamp and random suffix\n const currentToolCallId = `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\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\n // Store tool name for serverId lookup later\n streamingContext.toolCallIdToName.set(currentToolCallId, name);\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 ??\n `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Look up serverId from tool metadata\n const toolName =\n streamingContext.toolCallIdToName.get(currentToolCallId);\n const serverId = toolName ? extractServerId(toolName) : undefined;\n\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 serverId,\n },\n },\n );\n break;\n }\n default:\n break;\n }\n } catch (chunkError) {\n hadStreamError = true;\n streamErrorMessage =\n chunkError instanceof Error\n ? chunkError.message\n : \"Error processing chunk\";\n }\n },\n });\n\n try {\n await streamResult.consumeStream();\n\n // If onError was triggered, throw the extracted error message\n if (hadStreamError) {\n throw new Error(streamErrorMessage);\n }\n\n response = await streamResult.response;\n\n // Check for any additional error states in the response\n if (response.error) {\n throw response.error;\n }\n\n if (response.experimental_providerMetadata?.openai?.error) {\n throw new Error(\n response.experimental_providerMetadata.openai.error.message ||\n \"OpenAI API error\",\n );\n }\n } catch (error) {\n // Use the already-extracted error message, or extract a new one\n const errorMessage = streamErrorMessage || extractErrorMessage(error);\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"error\",\n error: errorMessage,\n });\n\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n \"[DONE]\",\n );\n\n hadError = true;\n steps++;\n break;\n }\n\n // If streamResult is undefined (due to error), exit the loop\n if (!streamResult || hadError) {\n steps++;\n break;\n }\n\n handleAgentStepFinish(\n streamingContext,\n accumulatedText,\n iterationToolCalls,\n iterationToolResults,\n false,\n );\n\n // Use the response we already fetched in the try block\n const responseMessages = (response?.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 : `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const value = (m as any).content;\n\n // Look up serverId from tool metadata\n const toolName =\n streamingContext.toolCallIdToName.get(currentToolCallId);\n const serverId = toolName ? extractServerId(toolName) : undefined;\n\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 serverId,\n },\n });\n }\n }\n }\n\n steps++;\n\n // Get finish reason from the response we already fetched\n const finishReason = response?.finishReason || \"stop\";\n const shouldContinue =\n finishReason === \"tool-calls\" ||\n (accumulatedText.length === 0 && iterationToolResults.length > 0);\n\n if (!shouldContinue) break;\n }\n\n // Only send completion events if no error occurred\n if (!hadError) {\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};\n\nconst sendMessagesToBackend = async (\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n mcpClientManager: MCPClientManager,\n baseUrl: string,\n modelId: 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 selectedServerIds =\n Array.isArray(selectedServers) && selectedServers.length > 0\n ? selectedServers\n : mcpClientManager.listServers();\n\n const flattenedTools = await mcpClientManager.getToolsForAiSdk(\n selectedServerIds.length > 0 ? selectedServerIds : undefined,\n );\n\n const toolsetsByServer: Record<string, ToolSet> = {};\n const toolDefs: any[] = [];\n\n for (const [name, tool] of Object.entries(flattenedTools)) {\n if (!tool) continue;\n\n const serverId =\n (tool as any)._serverId ??\n (selectedServerIds.length === 1 ? selectedServerIds[0] : \"__unknown\");\n\n if (!toolsetsByServer[serverId]) {\n toolsetsByServer[serverId] = {} as ToolSet;\n }\n toolsetsByServer[serverId][name] = tool;\n\n const schema = (tool as any).inputSchema;\n let serializedSchema: Record<string, unknown> | undefined;\n\n if (schema) {\n if (\n typeof schema === \"object\" &&\n schema !== null &&\n \"jsonSchema\" in (schema as Record<string, unknown>)\n ) {\n serializedSchema = (schema as any).jsonSchema as Record<\n string,\n unknown\n >;\n } else {\n try {\n serializedSchema = zodToJsonSchema(schema) as Record<string, unknown>;\n } catch (err) {\n console.warn(\n `[mcp/chat] Failed to convert input schema for tool ${name}:`,\n err,\n );\n }\n }\n }\n\n toolDefs.push({\n name,\n description: (tool as any).description,\n inputSchema: serializedSchema ?? {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n });\n }\n\n if (!baseUrl) {\n throw new Error(\"CONVEX_HTTP_URL is not set\");\n }\n\n const emitToolCall = (call: BackendToolCallEvent) => {\n // Generate unique ID with timestamp and random suffix\n const currentToolCallId = `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n\n // Store tool name for serverId lookup later\n streamingContext.toolCallIdToName.set(currentToolCallId, call.name);\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name,\n parameters: call.params as Record<string, unknown>,\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 : `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\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 as string | undefined,\n timestamp: new Date().toISOString(),\n serverId: result.serverId, // Propagate serverId\n },\n });\n };\n\n await runBackendConversation({\n maxSteps: MAX_AGENT_STEPS,\n messageHistory,\n modelId,\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 toolsets: toolsetsByServer 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 || 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\n\nchat.post(\"/\", async (c) => {\n const mcpClientManager = c.mcpClientManager;\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 litellmBaseUrl: _litellm_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 model?.id &&\n isMCPJamProvidedModel(model.id) &&\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 toolCallIdToName: new Map(),\n };\n\n mcpClientManager.setElicitationCallback(async (request) => {\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 model!.id,\n authHeader,\n requestData.selectedServers,\n );\n } else {\n // Use existing streaming path with tools\n // Get toolsets with server mapping (reusing pattern from sendMessagesToBackend)\n const toolsets = await mcpClientManager.getToolsForAiSdk(\n requestData.selectedServers,\n );\n\n const llmModel = createLlmModel(\n model as ModelDefinition,\n apiKey || \"\",\n _ollama_unused,\n _litellm_unused,\n );\n await createStreamingResponse(\n llmModel,\n toolsets as ToolSet,\n messages,\n streamingContext,\n provider,\n toolsets,\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 | \"x-ai\"\n | \"litellm\"\n | \"mistral\"\n | \"moonshotai\"\n | \"z-ai\";\n\nconst MCPJAM_PROVIDED_MODEL_IDS: string[] = [\n \"meta-llama/llama-3.3-70b-instruct\",\n \"openai/gpt-oss-120b\",\n \"x-ai/grok-4-fast\",\n \"openai/gpt-5-nano\",\n \"anthropic/claude-sonnet-4.5\",\n \"anthropic/claude-haiku-4.5\",\n \"openai/gpt-5-codex\",\n \"openai/gpt-5\",\n \"openai/gpt-5-mini\",\n \"google/gemini-2.5-flash-preview-09-2025\",\n \"moonshotai/kimi-k2-0905\",\n \"google/gemini-2.5-flash\",\n \"z-ai/glm-4.6\",\n];\n\nexport const isMCPJamProvidedModel = (modelId: string): boolean => {\n return MCPJAM_PROVIDED_MODEL_IDS.includes(modelId);\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_5_MINI = \"gpt-5-mini\",\n GPT_5_NANO = \"gpt-5-nano\",\n GPT_5_MAIN = \"openai/gpt-5\",\n GPT_5_PRO = \"gpt-5-pro\",\n GPT_5_CODEX = \"gpt-5-codex\",\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 // Mistral models\n MISTRAL_LARGE_LATEST = \"mistral-large-latest\",\n MISTRAL_SMALL_LATEST = \"mistral-small-latest\",\n CODESTRAL_LATEST = \"codestral-latest\",\n MINISTRAL_8B_LATEST = \"ministral-8b-latest\",\n MINISTRAL_3B_LATEST = \"ministral-3b-latest\",\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_5, name: \"GPT-5\", provider: \"openai\" },\n { id: Model.GPT_5_MINI, name: \"GPT-5 Mini\", provider: \"openai\" },\n { id: Model.GPT_5_NANO, name: \"GPT-5 Nano\", provider: \"openai\" },\n { id: Model.GPT_5_CHAT_LATEST, name: \"GPT-5 Chat\", provider: \"openai\" },\n { id: Model.GPT_5_PRO, name: \"GPT-5 Pro\", provider: \"openai\" },\n { id: Model.GPT_5_CODEX, name: \"GPT-5 Codex\", provider: \"openai\" },\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 id: \"openai/gpt-oss-120b\",\n name: \"GPT-OSS 120B (Free)\",\n provider: \"openai\",\n },\n {\n id: \"x-ai/grok-4-fast\",\n name: \"Grok 4 Fast (Free)\",\n provider: \"x-ai\",\n },\n {\n id: \"openai/gpt-5-nano\",\n name: \"GPT-5 Nano (Free)\",\n provider: \"openai\",\n },\n {\n id: \"anthropic/claude-sonnet-4.5\",\n name: \"Claude Sonnet 4.5 (Free)\",\n provider: \"anthropic\",\n },\n {\n id: \"anthropic/claude-haiku-4.5\",\n name: \"Claude Haiku 4.5 (Free)\",\n provider: \"anthropic\",\n },\n {\n id: \"openai/gpt-5-codex\",\n name: \"GPT-5 Codex (Free)\",\n provider: \"openai\",\n },\n {\n id: \"openai/gpt-5\",\n name: \"GPT-5 (Free)\",\n provider: \"openai\",\n },\n {\n id: \"openai/gpt-5-mini\",\n name: \"GPT-5 Mini (Free)\",\n provider: \"openai\",\n },\n {\n id: \"google/gemini-2.5-flash-preview-09-2025\",\n name: \"Gemini 2.5 Flash Preview (Free)\",\n provider: \"google\",\n },\n {\n id: \"moonshotai/kimi-k2-0905\",\n name: \"Kimi K2 (Free)\",\n provider: \"moonshotai\",\n },\n {\n id: \"google/gemini-2.5-flash\",\n name: \"Gemini 2.5 Flash (Free)\",\n provider: \"google\",\n },\n {\n id: \"z-ai/glm-4.6\",\n name: \"GLM 4.6 (Free)\",\n provider: \"z-ai\",\n },\n // Mistral models\n {\n id: Model.MISTRAL_LARGE_LATEST,\n name: \"Mistral Large\",\n provider: \"mistral\",\n },\n {\n id: Model.MISTRAL_SMALL_LATEST,\n name: \"Mistral Small\",\n provider: \"mistral\",\n },\n {\n id: Model.CODESTRAL_LATEST,\n name: \"Codestral\",\n provider: \"mistral\",\n },\n {\n id: Model.MINISTRAL_8B_LATEST,\n name: \"Ministral 8B\",\n provider: \"mistral\",\n },\n {\n id: Model.MINISTRAL_3B_LATEST,\n name: \"Ministral 3B\",\n provider: \"mistral\",\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 interface ParsedMessageContent {\n reasoning?: string;\n content: string;\n}\n\n/**\n * Parses LLM reasoning tags and extracts both reasoning and final content\n * Example: <|channel|>analysis<|message|>reasoning here<|end|><|start|>assistant<|channel|>final<|message|>response here\n */\nexport function parseReasoningTags(text: string): ParsedMessageContent {\n const reasoningMatch = text.match(\n /<\\|channel\\|>analysis<\\|message\\|>(.*?)(?:<\\|end\\|>|<\\|start\\|>)/s,\n );\n const finalMatch = text.match(/<\\|channel\\|>final<\\|message\\|>(.*?)$/s);\n\n // If we found structured content with tags\n if (reasoningMatch || finalMatch) {\n return {\n reasoning: reasoningMatch ? reasoningMatch[1].trim() : undefined,\n content: finalMatch\n ? finalMatch[1].trim()\n : text.replace(/<\\|[^|]+\\|>/g, \"\").trim(),\n };\n }\n\n // No tags found, return original content\n return {\n content: text,\n };\n}\n\nexport function sanitizeText(text: string): string {\n // Basic trimming\n let value = text.trim();\n\n // Auto-close unbalanced fenced code blocks to avoid broken Markdown rendering\n // Count occurrences of triple backticks. If odd, append closing fence.\n // This is safe because it only affects display, not the raw content storage.\n try {\n const fenceRegex = /```/g;\n const matches = value.match(fenceRegex);\n const count = matches ? matches.length : 0;\n if (count % 2 === 1) {\n // Add a newline before closing to ensure proper block termination\n value = value.endsWith(\"\\n\") ? value + \"```\" : value + \"\\n```\";\n }\n } catch {\n // If anything goes wrong, fall back to original trimmed text\n }\n\n return value;\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 case \"mistral\":\n return 0.7; // Mistral'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 { createMistral } from \"@ai-sdk/mistral\";\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 litellmBaseUrl?: 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 case \"mistral\":\n return createMistral({ apiKey })(modelDefinition.id);\n case \"litellm\": {\n // LiteLLM uses OpenAI-compatible endpoints (standard chat completions API)\n const baseURL = litellmBaseUrl || \"http://localhost:4000\";\n const openai = createOpenAI({\n apiKey: apiKey || \"dummy-key\", // LiteLLM may not require API key depending on setup\n baseURL,\n });\n // IMPORTANT: Use .chat() to use Chat Completions API instead of Responses API\n return openai.chat(modelDefinition.id);\n }\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n","import { ModelMessage } from \"@ai-sdk/provider-utils\";\nimport { LanguageModelV2ToolResultOutput } from \"@ai-sdk/provider-v5\";\nimport type { MCPClientManager } from \"@/sdk\";\n\ntype ToolsMap = Record<string, any>;\ntype Toolsets = Record<string, ToolsMap>;\n\n/**\n * Flatten toolsets and attach serverId metadata to each tool\n * This preserves the server origin for each tool to enable correct routing\n */\nfunction flattenToolsetsWithServerId(toolsets: Toolsets): ToolsMap {\n const flattened: ToolsMap = {};\n for (const [serverId, serverTools] of Object.entries(toolsets || {})) {\n if (serverTools && typeof serverTools === \"object\") {\n for (const [toolName, tool] of Object.entries(serverTools)) {\n // Attach serverId metadata to each tool\n flattened[toolName] = {\n ...tool,\n _serverId: serverId,\n };\n }\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\ntype ExecuteToolCallOptions =\n | { tools: ToolsMap }\n | { toolsets: Toolsets }\n | { clientManager: MCPClientManager; serverIds?: string[] };\n\nexport async function executeToolCallsFromMessages(\n messages: ModelMessage[],\n options: ExecuteToolCallOptions,\n): Promise<void> {\n // Build tools with serverId metadata\n let tools: ToolsMap = {};\n\n if (\"clientManager\" in options) {\n const flattened = await options.clientManager.getToolsForAiSdk(\n options.serverIds,\n );\n tools = flattened as ToolsMap;\n } else if (\"toolsets\" in options) {\n const toolsets = options.toolsets as Toolsets;\n tools = flattenToolsetsWithServerId(toolsets);\n } else {\n tools = options.tools as ToolsMap;\n }\n\n const index = buildIndexWithAliases(tools);\n\n const extractServerId = (toolName: string): string | undefined => {\n const tool = index[toolName];\n return tool?._serverId;\n };\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(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 // Extract serverId from tool name\n const serverId = extractServerId(toolName);\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 // Preserve full result including _meta for OpenAI Apps SDK\n result: result,\n // Add serverId for OpenAI component resolution\n serverId,\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 model?: 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 serverId?: string; // Server that executed the tool\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 modelId?: string;\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 model: options.modelId,\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 // Preserve the full result field if it exists (contains _meta for OpenAI Apps SDK)\n // Otherwise fall back to extracting output value\n const fullResult = item.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 // Use full result if available, otherwise extract value from output\n result: fullResult ?? extractToolResultValue(rawOutput),\n error: item.error,\n // Preserve serverId if present\n serverId: item.serverId,\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 \"../../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()) as { serverId?: string };\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n\n const mcp = c.mcpClientManager;\n\n let toolsResult: Awaited<ReturnType<typeof mcp.listTools>>;\n let resourcesResult: Awaited<ReturnType<typeof mcp.listResources>>;\n let promptsResult: Awaited<ReturnType<typeof mcp.listPrompts>>;\n\n try {\n [toolsResult, resourcesResult, promptsResult] = await Promise.all([\n mcp.listTools(serverId),\n mcp.listResources(serverId),\n mcp.listPrompts(serverId),\n ]);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"not connected\") ||\n message.includes(\"Unknown MCP server\")\n ) {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n throw error;\n }\n\n const tools = toolsResult.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n }));\n\n const resources = resourcesResult.resources.map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n description: resource.description,\n mimeType: resource.mimeType,\n }));\n\n const prompts = promptsResult.prompts.map((prompt) => ({\n name: prompt.name,\n description: prompt.description,\n arguments: prompt.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)\n// interceptor.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\n// interceptor.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\n// interceptor.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)\n// interceptor.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\n// interceptor.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\n// interceptor.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\n// interceptor.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\n// interceptor.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// async 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\n// interceptor.all(\"/:id/proxy\", handleProxy);\n// interceptor.all(\"/:id/proxy/*\", handleProxy);\n\nexport default interceptor;\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 {\n generateTestCases,\n type DiscoveredTool,\n} from \"../../services/eval-agent\";\nimport type { MCPClientManager } from \"@/sdk\";\nimport \"../../types/hono\";\n\nfunction resolveServerIdsOrThrow(\n requestedIds: string[],\n clientManager: MCPClientManager,\n): string[] {\n const available = clientManager.listServers();\n const resolved: string[] = [];\n\n for (const requestedId of requestedIds) {\n const match =\n available.find((id) => id === requestedId) ??\n available.find((id) => id.toLowerCase() === requestedId.toLowerCase());\n\n if (!match) {\n throw new Error(`Server '${requestedId}' not found`);\n }\n\n if (!resolved.includes(match)) {\n resolved.push(match);\n }\n }\n\n return resolved;\n}\n\nasync function collectToolsForServers(\n clientManager: MCPClientManager,\n serverIds: string[],\n): Promise<DiscoveredTool[]> {\n const perServerTools = await Promise.all(\n serverIds.map(async (serverId) => {\n if (\n clientManager.getConnectionStatusByAttemptingPing(serverId) !==\n \"connected\"\n ) {\n return [] as DiscoveredTool[];\n }\n\n try {\n const { tools } = await clientManager.listTools(serverId);\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: (tool as { outputSchema?: unknown }).outputSchema,\n serverId,\n }));\n } catch (error) {\n console.warn(\n `[evals] Failed to list tools for server ${serverId}:`,\n error,\n );\n return [] as DiscoveredTool[];\n }\n }),\n );\n\n return perServerTools.flat();\n}\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.mcpClientManager;\n const resolvedServerIds = resolveServerIdsOrThrow(serverIds, clientManager);\n\n const environment = transformServerConfigsToEnvironment(\n resolvedServerIds,\n clientManager,\n );\n const modelId = tests.length > 0 ? tests[0].model : undefined;\n const llms = transformLLMConfigToLlmsConfig(llmConfig, modelId);\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 const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(\"[Error running evals:\", errorMessage);\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\nconst GenerateTestsRequestSchema = z.object({\n serverIds: z.array(z.string()).min(1, \"At least one server must be selected\"),\n convexAuthToken: z.string(),\n});\n\ntype GenerateTestsRequest = z.infer<typeof GenerateTestsRequestSchema>;\n\nevals.post(\"/generate-tests\", async (c) => {\n try {\n const body = await c.req.json();\n\n const validationResult = GenerateTestsRequestSchema.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 { serverIds, convexAuthToken } =\n validationResult.data as GenerateTestsRequest;\n\n const clientManager = c.mcpClientManager;\n const resolvedServerIds = resolveServerIdsOrThrow(serverIds, clientManager);\n\n const filteredTools = await collectToolsForServers(\n clientManager,\n resolvedServerIds,\n );\n\n if (filteredTools.length === 0) {\n return c.json(\n {\n error: \"No tools found for selected servers\",\n },\n 400,\n );\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 // Generate test cases using the agent\n const testCases = await generateTestCases(\n filteredTools,\n convexHttpUrl,\n convexAuthToken,\n );\n\n return c.json({\n success: true,\n tests: testCases,\n });\n } catch (error) {\n console.error(\"Error in /evals/generate-tests:\", 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 type BackendConversationOptions,\n type BackendFetchPayload,\n type BackendFetchResponse,\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 toolsets = await mcpClient.getToolsets();\n const availableTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(availableTools, serverTools);\n });\n const vercelTools = convertMastraToolsToVercelTools(\n availableTools,\n ) as any as ToolMap;\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 as any)?.description,\n inputSchema: (tool as any)?.inputSchema,\n })) as unknown as BackendConversationOptions[\"toolDefinitions\"];\n\n try {\n await runBackendConversation({\n maxSteps: MAX_STEPS,\n messageHistory,\n modelId: test.model,\n toolDefinitions: toolDefs,\n fetchBackend: async (\n payload: BackendFetchPayload,\n ): Promise<BackendFetchResponse | null> => {\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()) as BackendFetchResponse;\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 let streamResult;\n try {\n 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 } catch (error: any) {\n // Handle API errors gracefully - log and exit this iteration\n const errorMessage = error?.message || String(error);\n Logger.error(errorMessage);\n\n // Exit this iteration early with failure\n const evaluation = evaluateResults(test.expectedToolCalls, []);\n await recorder.finishIteration({\n iterationId,\n passed: false,\n toolsCalled: [],\n usage: {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n },\n messages: messageHistory,\n });\n\n return evaluation;\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(model);\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.28.0\";\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 interface JwtDecodeOptions {\n header?: boolean;\n}\n\nexport interface JwtHeader {\n typ?: string;\n alg?: string;\n kid?: string;\n}\n\nexport interface JwtPayload {\n iss?: string;\n sub?: string;\n aud?: string[] | string;\n exp?: number;\n nbf?: number;\n iat?: number;\n jti?: string;\n}\n\nexport class InvalidTokenError extends Error {}\n\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\n\nfunction b64DecodeUnicode(str: string) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (_m, p) => {\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }),\n );\n}\n\nfunction base64UrlDecode(str: string) {\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\n try {\n return b64DecodeUnicode(output);\n } catch {\n return atob(output);\n }\n}\n\nexport function jwtDecode<T = JwtHeader>(\n token: string,\n options: JwtDecodeOptions & { header: true },\n): T;\nexport function jwtDecode<T = JwtPayload>(\n token: string,\n options?: JwtDecodeOptions,\n): T;\nexport function jwtDecode<T = JwtHeader | JwtPayload>(\n token: string,\n options?: JwtDecodeOptions,\n): T {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n\n options ||= {};\n\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(\n `Invalid token specified: missing part #${pos + 1}`,\n );\n }\n\n let decoded: string;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n\n try {\n return JSON.parse(decoded) as T;\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n}\n","import { Logger } from \"../logging.js\";\nimport { LocalSyncState } from \"./local_state.js\";\nimport { AuthError, IdentityVersion, Transition } from \"./protocol.js\";\nimport { jwtDecode } from \"../../vendor/jwt-decode/index.js\";\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 * Get the current JWT auth token and decoded claims.\n */\n getAuth(): { token: string; decoded: Record<string, any> } | undefined {\n if (this.disabled) return;\n return this.client.getCurrentAuthClaims();\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","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 { 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\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 return [\n name,\n convertMastraToolToVercelTool(name, mastraTool, {\n originalName: name,\n }),\n ];\n }),\n );\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 { MCPClientOptions } from \"@mastra/mcp\";\nimport { MCPClientManager, MCPServerConfig } from \"@/sdk\";\nimport {\n LlmsConfig,\n LlmsConfigSchema,\n} from \"../../evals-cli/src/utils/validators\";\nimport { isMCPJamProvidedModel } from \"../../shared/types\";\n\n/**\n * Transforms server IDs from MCPClientManager to MCPClientOptions format\n * required by runEvals\n */\nexport function transformServerConfigsToEnvironment(\n serverIds: string[],\n clientManager: MCPClientManager,\n): MCPClientOptions {\n const servers: Record<string, MCPServerConfig> = {};\n\n for (const serverId of serverIds) {\n const config = clientManager.getServerConfig(serverId);\n if (!config) {\n throw new Error(`Server '${serverId}' not found`);\n }\n\n const status = clientManager.getConnectionStatusByAttemptingPing(serverId);\n if (status !== \"connected\") {\n throw new Error(\n `Server '${serverId}' is not connected (status: ${status})`,\n );\n }\n\n servers[serverId] = 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\nexport function transformLLMConfigToLlmsConfig(\n llmConfig: {\n provider: string;\n apiKey: string;\n },\n modelId?: string,\n): LlmsConfig {\n const llms: Record<string, string> = {};\n const isMCPJamModel = modelId && isMCPJamProvidedModel(modelId);\n\n if (isMCPJamModel) {\n llms.openrouter = \"BACKEND_EXECUTION\";\n } else {\n const providerKey = llmConfig.provider.toLowerCase();\n llms[providerKey] = llmConfig.apiKey;\n }\n\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 type { ModelMessage } from \"ai\";\n\nexport interface DiscoveredTool {\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n serverId: string;\n}\n\nexport interface GenerateTestsRequest {\n serverIds: string[];\n tools: DiscoveredTool[];\n}\n\nexport interface GeneratedTestCase {\n title: string;\n query: string;\n runs: number;\n expectedToolCalls: string[];\n judgeRequirement?: string;\n}\n\nconst AGENT_SYSTEM_PROMPT = `You are an AI agent specialized in creating realistic test cases for MCP (Model Context Protocol) servers.\n\n**About MCP:**\nThe Model Context Protocol enables AI assistants to securely access external data and tools. MCP servers expose tools, resources, and prompts that AI models can use to accomplish user tasks. Your test cases should reflect real-world usage patterns where users ask an AI assistant to perform tasks, and the assistant uses MCP tools to fulfill those requests.\n\n**Your Task:**\nGenerate 6 test cases with varying complexity levels that mimic how real users would interact with an AI assistant using these MCP tools.\n\n**Test Case Distribution:**\n- **2 EASY tests** (single tool): Simple, straightforward tasks using one tool\n- **2 MEDIUM tests** (2+ tools): Multi-step workflows requiring 2-3 tools in sequence or parallel\n- **2 HARD tests** (3+ tools): Complex scenarios requiring 3+ tools, conditional logic, or cross-server operations\n\n**Guidelines:**\n1. **Realistic User Queries**: Write queries as if a real user is talking to an AI assistant (e.g., \"Help me find all tasks due this week\" not \"Call the list_tasks tool\")\n2. **Natural Workflows**: Chain tools together in logical sequences that solve real problems\n3. **Cross-Server Tests**: If multiple servers are available, create tests that use tools from different servers together\n4. **Specific Details**: Include concrete examples (dates, names, values) to make tests actionable\n5. **Judge Requirements**: Clearly define what success looks like for each test\n6. **Test Titles**: Write clear, descriptive titles WITHOUT difficulty prefixes (e.g., \"Read project configuration\" not \"EASY: Read project configuration\")\n\n**Output Format (CRITICAL):**\nRespond with ONLY a valid JSON array. No explanations, no markdown code blocks, just the raw JSON array.\n\nExample:\n[\n {\n \"title\": \"Read project configuration\",\n \"query\": \"Show me the contents of config.json in the current project\",\n \"runs\": 1,\n \"expectedToolCalls\": [\"read_file\"],\n \"judgeRequirement\": \"Successfully reads and returns the file contents\"\n },\n {\n \"title\": \"Find and analyze recent tasks\",\n \"query\": \"Find all tasks created this week and summarize their status\",\n \"runs\": 1,\n \"expectedToolCalls\": [\"list_tasks\", \"get_task_details\"],\n \"judgeRequirement\": \"First lists tasks filtered by date, then retrieves details for each task found\"\n },\n {\n \"title\": \"Cross-server project setup\",\n \"query\": \"Create a new project folder, initialize a git repository, and create a task to track the project setup\",\n \"runs\": 1,\n \"expectedToolCalls\": [\"create_directory\", \"git_init\", \"create_task\"],\n \"judgeRequirement\": \"Successfully creates directory, initializes git, and creates a tracking task with appropriate details\"\n }\n]`;\n\n/**\n * Generates test cases using the backend LLM\n */\nexport async function generateTestCases(\n tools: DiscoveredTool[],\n convexHttpUrl: string,\n convexAuthToken: string,\n): Promise<GeneratedTestCase[]> {\n // Group tools by server\n const serverGroups = tools.reduce(\n (acc, tool) => {\n if (!acc[tool.serverId]) {\n acc[tool.serverId] = [];\n }\n acc[tool.serverId].push(tool);\n return acc;\n },\n {} as Record<string, DiscoveredTool[]>,\n );\n\n const serverCount = Object.keys(serverGroups).length;\n const totalTools = tools.length;\n\n // Build context about available tools grouped by server\n const toolsContext = Object.entries(serverGroups)\n .map(([serverId, serverTools]) => {\n const toolsList = serverTools\n .map((tool) => {\n return ` - ${tool.name}: ${tool.description || \"No description\"}\n Input: ${JSON.stringify(tool.inputSchema)}`;\n })\n .join(\"\\n\");\n\n return `**Server: ${serverId}** (${serverTools.length} tools)\n${toolsList}`;\n })\n .join(\"\\n\\n\");\n\n const crossServerGuidance =\n serverCount > 1\n ? `\\n**IMPORTANT**: You have ${serverCount} servers available. Create at least 2 test cases that use tools from MULTIPLE servers to test cross-server workflows.`\n : \"\";\n\n const userPrompt = `Generate 6 test cases for the following MCP server tools:\n\n${toolsContext}\n\n**Available Resources:**\n- ${serverCount} MCP server(s)\n- ${totalTools} total tools${crossServerGuidance}\n\n**Remember:**\n1. Create exactly 6 tests: 2 EASY (1 tool), 2 MEDIUM (2-3 tools), 2 HARD (3+ tools)\n2. Write realistic user queries that sound natural\n3. Use specific examples (dates, filenames, values)\n4. Chain tools in logical sequences\n5. Respond with ONLY a JSON array - no other text or markdown`;\n\n const messageHistory: ModelMessage[] = [\n { role: \"system\", content: AGENT_SYSTEM_PROMPT },\n { role: \"user\", content: userPrompt },\n ];\n\n // Call the backend LLM API\n const response = await fetch(`${convexHttpUrl}/streaming`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${convexAuthToken}`,\n },\n body: JSON.stringify({\n model: \"meta-llama/llama-3.3-70b-instruct\",\n tools: [],\n messages: JSON.stringify(messageHistory),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to generate test cases: ${errorText}`);\n }\n\n const data = await response.json();\n\n if (!data.ok || !Array.isArray(data.messages)) {\n throw new Error(\"Invalid response from backend LLM\");\n }\n\n // Extract the assistant's response\n let assistantResponse = \"\";\n for (const msg of data.messages) {\n if (msg.role === \"assistant\") {\n const content = msg.content;\n if (typeof content === \"string\") {\n assistantResponse += content;\n } else if (Array.isArray(content)) {\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n assistantResponse += item.text;\n }\n }\n }\n }\n }\n\n // Parse JSON response\n try {\n // Try to extract JSON from markdown code blocks if present\n const jsonMatch = assistantResponse.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const jsonText = jsonMatch ? jsonMatch[1].trim() : assistantResponse.trim();\n\n const testCases = JSON.parse(jsonText);\n\n if (!Array.isArray(testCases)) {\n throw new Error(\"Response is not an array\");\n }\n\n // Validate structure\n const validatedTests: GeneratedTestCase[] = testCases.map((tc: any) => ({\n title: tc.title || \"Untitled Test\",\n query: tc.query || \"\",\n runs: typeof tc.runs === \"number\" ? tc.runs : 1,\n expectedToolCalls: Array.isArray(tc.expectedToolCalls)\n ? tc.expectedToolCalls\n : [],\n judgeRequirement: tc.judgeRequirement,\n }));\n\n return validatedTests;\n } catch (parseError) {\n console.error(\"Failed to parse LLM response:\", assistantResponse);\n throw new Error(\n `Failed to parse test cases from LLM response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n );\n }\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.mcpClientManager;\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.mcpClientManager,\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 { MCPClientManager } from \"@/sdk\";\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: MCPClientManager,\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 list = await clientManager.listTools(serverId);\n const tools = (list?.tools ?? []).map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: toJsonSchemaMaybe(tool.inputSchema),\n outputSchema: toJsonSchemaMaybe(\n tool.outputSchema ?? tool.resultSchema,\n ),\n }));\n return respond({ result: { tools } });\n }\n case \"tools/call\": {\n try {\n let targetServerId = serverId;\n let toolName = params?.name as string | undefined;\n if (toolName?.includes(\":\")) {\n const [prefix, actualName] = toolName.split(\":\", 2);\n if (actualName) {\n if (clientManager.hasServer(prefix)) {\n targetServerId = prefix;\n }\n toolName = actualName;\n }\n }\n if (!toolName) {\n throw new Error(\"Tool name is required\");\n }\n const exec = await clientManager.executeTool(\n targetServerId,\n toolName,\n (params?.arguments ?? {}) as Record<string, unknown>,\n );\n if (mode === \"manager\") {\n return respond({ result: exec });\n }\n // adapter mode returns raw call-tool result for compatibility\n return respond({ result: exec });\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 list = await clientManager.listResources(serverId);\n const resources = (list?.resources ?? []).map((r: any) => ({\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 resource = await clientManager.readResource(serverId, {\n uri: params?.uri,\n });\n if (mode === \"manager\") {\n const firstContent = (resource as any)?.contents?.[0];\n const text =\n typeof firstContent?.text === \"string\"\n ? firstContent.text\n : typeof (resource as any) === \"string\"\n ? (resource as any)\n : JSON.stringify(resource, null, 2);\n const result = {\n contents: [\n {\n uri: params?.uri,\n mimeType:\n firstContent?.mimeType ||\n (typeof text === \"string\" ? \"text/plain\" : undefined),\n text,\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: resource });\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 list = await clientManager.listPrompts(serverId);\n const prompts = (list?.prompts ?? []).map((p: any) => ({\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 prompt = await clientManager.getPrompt(serverId, {\n name: params?.name,\n arguments: params?.arguments,\n });\n if (mode === \"manager\") {\n const result = {\n description:\n (prompt as any)?.description || `Prompt: ${params?.name}`,\n messages: (prompt as any)?.messages ?? [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: JSON.stringify(prompt, null, 2),\n },\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: prompt });\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 { 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"],"mappings":";AAAA,YAAY,YAAY;;;ACAxB,IAAM,mBAAmB;AAAA,EACvB,aAAa,QAAQ,IAAI,aAAa,eAAe,SAAS;AAAA,EAC9D,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,yBAAyB;AAAA,IACvB;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACF;AACF;AAEO,IAAM,uBAAuB;AAAA,EAClC,GAAG;AAAA,EACH,KAAK;AACP;AACO,IAAM,qBAAqB;AAAA,EAChC,GAAG;AAAA,EACH,KAAK;AACP;AACO,IAAM,qBAAqB;AAAA,EAChC,GAAG;AAAA,EACH,KAAK;AAAA,EACL,0BAA0B;AAAA;AAAA,EAC1B,0BAA0B;AAAA;AAC5B;;;ADjBO,YAAK,kBAAkB;;;AEN9B,YAAYA,aAAY;AAExB,SAAS,aAAa;AACtB,OAAO,YAAY;AACnB,OAAO,aAAa;AACpB,SAAS,QAAAC,cAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,gBAAAC,eAAc,cAAAC,mBAAkB;AACzC,SAAS,QAAAC,OAAM,SAAS,eAAe;AACvC,SAAS,qBAAqB;;;ACb9B,SAAS,cAAc;AAEvB,SAAS,0BAA0B;AAEnC;EACE;EACA;OACK;AACP,SAAS,qCAAqC;AAE9C,SAAS,oCAAoC;AAI7C;EACE,wBAAAC;EACA;EACA;EACA;EACA;OACK;ACnBP;EAEE;OAEK;AACP;EACE;EACA;EACA,QAAQ;OAIH;;;;;;ADbP,IAAA,6BAAA,CAAA;AAAA,SAAA,4BAAA;EAAA,kBAAA,MAAA;AAAA,CAAA;ACgBA,IAAM,yBAAyB,CAAC,WAAiC;AAhBjE,MAAAC;AAiBE,MAAI,UAAU,OAAO,WAAW,UAAU;AACxC,UAAM,SAAS;AACf,UAAM,OAAoB,OAAO,aAC7B,uBAAuB,OAAO,UAAU,IACvC;AAGL,QAAI,EAAE,UAAU,SAAS,KAAK,SAAS,QAAW;AAChD,WAAK,OAAO;IACd;AACA,QAAI,KAAK,SAAS,UAAU;AAC1B,WAAK,cAAcA,MAAA,KAAK,eAAL,OAAAA,MAAmB,CAAC;AAIvC,UAAI,KAAK,yBAAyB,QAAW;AAC3C,aAAK,uBAAuB;MAC9B;IACF;AAEA,WAAO;EACT;AAEA,SAAO;IACL,MAAM;IACN,YAAY,CAAC;IACb,sBAAsB;EACxB;AACF;AAwBA,eAAsB,6BACpB,iBACA;EACE,UAAU;EACV;AACF,GACkB;AA3EpB,MAAAA,KAAAC;AA4EE,QAAMC,SAAiB,CAAC;AAExB,aAAW,mBAAmB,gBAAgB,OAAO;AACnD,UAAM,EAAE,MAAM,aAAa,YAAY,IAAI;AAE3C,UAAM,UAAU,OAAO,MAAe,YAA6B;AAjFvE,UAAAF,MAAAC;AAkFM,OAAAA,QAAAD,OAAA,WAAA,OAAA,SAAA,QAAS,gBAAT,OAAA,SAAAA,KAAsB,mBAAtB,OAAA,SAAAC,KAAA,KAAAD,IAAAA;AACA,YAAM,SAAS,MAAM,SAAS,EAAE,MAAM,MAAM,QAAQ,CAAC;AACrD,aAAO,qBAAqB,MAAM,MAAM;IAC1C;AAEA,QAAI;AACJ,QAAI,YAAY,aAAa;AAC3B,YAAM,wBAAwB,uBAAuB,WAAW;AAChE,mBAAa,YAAY;QACvB;QACA,aAAa,WAAW;UACtB,MAAM;UACN,aAAYA,MAAA,sBAAsB,eAAtB,OAAAA,MAAoC,CAAC;UACjD,uBACGC,MAAA,sBAA8B,yBAA9B,OAAAA,MAAsD;QAC3D,CAAC;QACD;MACF,CAAC;IACH,OAAO;AACL,YAAM,YAAY;AAClB,UAAI,EAAE,QAAQ,YAAY;AAExB;MACF;AACA,mBAAa,WAAW;QACtB;QACA,aAAa,UAAU,IAAI,EAAE;QAC7B;MACF,CAAC;IACH;AAEA,IAAAC,OAAM,IAAI,IAAI;EAChB;AAEA,SAAOA;AACT;ADGO,IAAM,mBAAN,MAAuB;EAgC5B,YACEC,WAAkC,CAAC,GACnC,UAWI,CAAC,GACL;AA7CF,SAAiB,eAAe,oBAAI,IAAgC;AACpE,SAAiB,uBAAuB,oBAAI,IAG1C;AACF,SAAiB,sBAAsB,oBAAI,IAAgC;AAC3E,SAAiB,qBAAqB,oBAAI,IAA8B;AAKxE,SAAQ,oBAA6B;AAYrC,SAAiB,sBAAsB,oBAAI,IAMzC;AAtJJ,QAAAH,KAAAC,KAAA,IAAA,IAAA;AAuKI,SAAK,wBAAuBD,MAAA,QAAQ,yBAAR,OAAAA,MAAgC;AAC5D,SAAK,qBAAoBC,MAAA,QAAQ,sBAAR,OAAAA,MAA6B;AACtD,SAAK,sBAAsB,EAAE,IAAI,KAAA,QAAQ,wBAAR,OAAA,KAA+B,CAAC,EAAG;AACpE,SAAK,kBACH,KAAA,QAAQ,mBAAR,OAAA,KAA0B;AAC5B,SAAK,qBAAoB,KAAA,QAAQ,sBAAR,OAAA,KAA6B;AACtD,SAAK,mBAAmB,QAAQ;AAEhC,eAAW,CAAC,IAAI,MAAM,KAAK,OAAO,QAAQE,QAAO,GAAG;AAClD,WAAK,KAAK,gBAAgB,IAAI,MAAM;IACtC;EACF;EAEA,cAAwB;AACtB,WAAO,MAAM,KAAK,KAAK,aAAa,KAAK,CAAC;EAC5C;EAEA,UAAU,UAA2B;AACnC,WAAO,KAAK,aAAa,IAAI,QAAQ;EACvC;EAEA,qBAAsC;AACpC,WAAO,MAAM,KAAK,KAAK,aAAa,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO;MACzE,IAAI;MACJ,QAAQ,KAAK,oCAAoC,QAAQ;MACzD,QAAQ,MAAM;IAChB,EAAE;EACJ;EAEA,oCAAoC,UAAuC;AACzE,UAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ;AAC5C,QAAI,SAAA,OAAA,SAAA,MAAO,SAAS;AAClB,aAAO;IACT;AACA,UAAM,SAAS,SAAA,OAAA,SAAA,MAAO;AACtB,QAAI,CAAC,QAAQ;AACX,aAAO;IACT;AACA,QAAI;AACF,aAAO,KAAK;AACZ,aAAO;IACT,SAAS,OAAO;AACd,aAAO;IACT;EACF;EAEA,gBAAgB,UAA+C;AArNjE,QAAAH;AAsNI,YAAOA,MAAA,KAAK,aAAa,IAAI,QAAQ,MAA9B,OAAA,SAAAA,IAAiC;EAC1C;EAEA,MAAM,gBACJ,UACA,QACiB;AACjB,UAAM,UAAU,KAAK,WAAW,MAAM;AACtC,UAAM,gBAAgB,KAAK,aAAa,IAAI,QAAQ;AACpD,QAAI,iBAAA,OAAA,SAAA,cAAe,QAAQ;AACzB,YAAM,IAAI,MAAM,eAAe,QAAQ,yBAAyB;IAClE;AAEA,UAAM,QAA4B,iBAAA,OAAA,gBAAiB;MACjD;MACA;IACF;AAEA,UAAM,SAAS;AACf,UAAM,UAAU;AAEhB,QAAI,MAAM,SAAS;AACjB,WAAK,aAAa,IAAI,UAAU,KAAK;AACrC,aAAO,MAAM;IACf;AAEA,UAAM,qBAAqB,YAAY;AAhP3C,UAAAA;AAiPM,YAAM,SAAS,IAAI;QACjB;UACE,MAAM,KAAK,oBAAoB,GAAG,KAAK,iBAAiB,KAAK;UAC7D,UAASA,MAAA,OAAO,YAAP,OAAAA,MAAkB,KAAK;QAClC;QACA;UACE,cAAc,KAAK,kBAAkB,MAAM;QAC7C;MACF;AAEA,WAAK,0BAA0B,UAAU,MAAM;AAC/C,WAAK,wBAAwB,UAAU,MAAM;AAE7C,UAAI,OAAO,SAAS;AAClB,eAAO,UAAU,CAAC,UAAU;AA/PpC,cAAAA;AAgQU,WAAAA,OAAA,OAAO,YAAP,OAAA,SAAAA,KAAA,KAAA,QAAiB,KAAA;QACnB;MACF;AAEA,aAAO,UAAU,MAAM;AACrB,aAAK,WAAW,QAAQ;MAC1B;AAEA,UAAI;AACJ,UAAI,KAAK,cAAc,MAAM,GAAG;AAC9B,oBAAY,MAAM,KAAK;UACrB;UACA;UACA;UACA;QACF;MACF,OAAO;AACL,oBAAY,MAAM,KAAK;UACrB;UACA;UACA;UACA;QACF;MACF;AAEA,YAAM,SAAS;AACf,YAAM,YAAY;AAElB,YAAM,UAAU;AAChB,WAAK,aAAa,IAAI,UAAU,KAAK;AAErC,aAAO;IACT,GAAG,EAAE,MAAM,CAAC,UAAU;AACpB,WAAK,WAAW,QAAQ;AACxB,YAAM;IACR,CAAC;AAED,UAAM,UAAU;AAChB,SAAK,aAAa,IAAI,UAAU,KAAK;AACrC,WAAO;EACT;EAEA,MAAM,iBAAiB,UAAiC;AACtD,UAAM,mBAAmB,KAAK,oCAAoC,QAAQ;AAC1E,QAAI,qBAAqB,aAAa;AACpC;IACF;AACA,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,QAAI;AACF,YAAM,OAAO,MAAM;IACrB,UAAA;AACE,UAAI,OAAO,WAAW;AACpB,cAAM,KAAK,mBAAmB,OAAO,SAAS;MAChD;AACA,WAAK,WAAW,QAAQ;IAC1B;EACF;EAEA,aAAa,UAAwB;AACnC,SAAK,WAAW,QAAQ;AACxB,SAAK,qBAAqB,OAAO,QAAQ;AACzC,SAAK,oBAAoB,OAAO,QAAQ;EAC1C;EAEA,MAAM,uBAAsC;AAC1C,UAAM,YAAY,KAAK,YAAY;AACnC,UAAM,QAAQ;MACZ,UAAU,IAAI,CAAC,aAAa,KAAK,iBAAiB,QAAQ,CAAC;IAC7D;AAEA,eAAW,YAAY,WAAW;AAChC,WAAK,WAAW,QAAQ;AACxB,WAAK,qBAAqB,OAAO,QAAQ;AACzC,WAAK,oBAAoB,OAAO,QAAQ;IAC1C;EACF;EAEA,MAAM,UACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,QAAI;AACF,YAAM,SAAS,MAAM,OAAO;QAC1B;QACA,KAAK,YAAY,UAAU,OAAO;MACpC;AAEA,YAAM,cAAc,oBAAI,IAAiB;AACzC,iBAAWI,SAAQ,OAAO,OAAO;AAC/B,YAAIA,MAAK,OAAO;AACd,sBAAY,IAAIA,MAAK,MAAMA,MAAK,KAAK;QACvC;MACF;AACA,WAAK,mBAAmB,IAAI,UAAU,WAAW;AAEjD,aAAO;IACT,SAAS,OAAO;AACd,UAAI,KAAK,yBAAyB,OAAO,YAAY,GAAG;AACtD,aAAK,mBAAmB,IAAI,UAAU,oBAAI,IAAI,CAAC;AAC/C,eAAO,EAAE,OAAO,CAAC,EAAE;MACrB;AACA,YAAM;IACR;EACF;EAEA,MAAM,SAAS,WAAgD;AAC7D,UAAM,kBACJ,aAAa,UAAU,SAAS,IAAI,YAAY,KAAK,YAAY;AAEnE,UAAM,YAAY,MAAM,QAAQ;MAC9B,gBAAgB,IAAI,OAAO,aAAa;AACtC,cAAM,KAAK,gBAAgB,QAAQ;AACnC,cAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,cAAM,SAAS,MAAM,OAAO;UAC1B;UACA,KAAK,YAAY,QAAQ;QAC3B;AAEA,cAAM,cAAc,oBAAI,IAAiB;AACzC,mBAAWA,SAAQ,OAAO,OAAO;AAC/B,cAAIA,MAAK,OAAO;AACd,wBAAY,IAAIA,MAAK,MAAMA,MAAK,KAAK;UACvC;QACF;AACA,aAAK,mBAAmB,IAAI,UAAU,WAAW;AAEjD,eAAO,OAAO;MAChB,CAAC;IACH;AACA,WAAO,EAAE,OAAO,UAAU,KAAK,EAAE;EACnC;EAEA,oBAAoB,UAAuD;AACzE,UAAM,cAAc,KAAK,mBAAmB,IAAI,QAAQ;AACxD,WAAO,cAAc,OAAO,YAAY,WAAW,IAAI,CAAC;EAC1D;EAEA,WAAW,UAAkB,SAA0B;AACrD,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,QAAI;AACF,aAAO,KAAK,OAAO;IACrB,SAAS,OAAO;AACd,YAAM,IAAI;QACR,8BAA8B,QAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,eAAe;MACtG;IACF;EACF;EAEA,MAAM,iBACJ,WACA,UAA2D,CAAC,GAC1C;AAClB,UAAM,MAAM,MAAM,QAAQ,SAAS,IAC/B,YACA,YACE,CAAC,SAAS,IACV,KAAK,YAAY;AAEvB,UAAM,gBAAgB,OAAO,OAAiC;AAC5D,YAAM,KAAK,gBAAgB,EAAE;AAC7B,YAAM,kBAAkB,MAAM,KAAK,UAAU,EAAE;AAC/C,aAAO,6BAA6B,iBAAiB;QACnD,SAAS,QAAQ;QACjB,UAAU,OAAO,EAAE,MAAM,MAAM,SAAS,YAAY,MAAM;AACxD,gBAAM,kBAAiB,eAAA,OAAA,SAAA,YAAa,eAChC,EAAE,QAAQ,YAAY,YAAY,IAClC;AACJ,gBAAM,SAAS,MAAM,KAAK;YACxB;YACA;YACC,QAAA,OAAA,OAAQ,CAAC;YACV;UACF;AACA,iBAAOL,sBAAqB,MAAM,MAAM;QAC1C;MACF,CAAC;IACH;AAEA,UAAM,iBAAiB,MAAM,QAAQ;MACnC,IAAI,IAAI,OAAO,OAAO;AACpB,YAAI;AACF,gBAAMG,SAAQ,MAAM,cAAc,EAAE;AAEpC,qBAAW,CAAC,MAAME,KAAI,KAAK,OAAO,QAAQF,MAAK,GAAG;AAC/C,YAAAE,MAAa,YAAY;UAC5B;AACA,iBAAOF;QACT,SAAS,OAAO;AACd,cAAI,KAAK,yBAAyB,OAAO,YAAY,GAAG;AACtD,mBAAO,CAAC;UACV;AACA,gBAAM;QACR;MACF,CAAC;IACH;AAGA,UAAM,YAAqB,CAAC;AAC5B,eAAW,WAAW,gBAAgB;AACpC,iBAAW,CAAC,MAAME,KAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,kBAAU,IAAI,IAAIA;MACpB;IACF;AAEA,WAAO;EACT;EAEA,MAAM,YACJ,UACA,UACA,OAA6B,CAAC,GAC9B,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,WAAO,OAAO;MACZ;QACE,MAAM;QACN,WAAW;MACb;MACAL;MACA,KAAK,YAAY,UAAU,OAAO;IACpC;EACF;EAEA,MAAM,cACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,QAAI;AACF,aAAO,MAAM,OAAO;QAClB;QACA,KAAK,YAAY,UAAU,OAAO;MACpC;IACF,SAAS,OAAO;AACd,UAAI,KAAK,yBAAyB,OAAO,gBAAgB,GAAG;AAC1D,eAAO;UACL,WAAW,CAAC;QACd;MACF;AACA,YAAM;IACR;EACF;EAEA,MAAM,aACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,WAAO,OAAO,aAAa,QAAQ,KAAK,YAAY,UAAU,OAAO,CAAC;EACxE;EAEA,MAAM,kBACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,WAAO,OAAO;MACZ;MACA,KAAK,YAAY,UAAU,OAAO;IACpC;EACF;EAEA,MAAM,oBACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,WAAO,OAAO;MACZ;MACA,KAAK,YAAY,UAAU,OAAO;IACpC;EACF;EAEA,MAAM,sBACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,WAAO,OAAO;MACZ;MACA,KAAK,YAAY,UAAU,OAAO;IACpC;EACF;EAEA,MAAM,YACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,QAAI;AACF,aAAO,MAAM,OAAO;QAClB;QACA,KAAK,YAAY,UAAU,OAAO;MACpC;IACF,SAAS,OAAO;AACd,UAAI,KAAK,yBAAyB,OAAO,cAAc,GAAG;AACxD,eAAO;UACL,SAAS,CAAC;QACZ;MACF;AACA,YAAM;IACR;EACF;EAEA,MAAM,UACJ,UACA,QACA,SACA;AACA,UAAM,KAAK,gBAAgB,QAAQ;AACnC,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,WAAO,OAAO,UAAU,QAAQ,KAAK,YAAY,UAAU,OAAO,CAAC;EACrE;EAEA,qBAAqB,UAAsC;AACzD,UAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ;AAC5C,QAAI,EAAC,SAAA,OAAA,SAAA,MAAO,YAAW;AACrB,YAAM,IAAI,MAAM,uBAAuB,QAAQ,IAAI;IACrD;AACA,QAAI,MAAM,qBAAqB,+BAA+B;AAC5D,aAAO,MAAM,UAAU;IACzB;AACA,UAAM,IAAI;MACR,WAAW,QAAQ;IACrB;EACF;EAEA,uBACE,UACA,QACA,SACM;AA5lBV,QAAAC,KAAAC,KAAA;AA6lBI,UAAM,kBAAiBD,MAAA,KAAK,qBAAqB,IAAI,QAAQ,MAAtC,OAAAA,MAA2C,oBAAI,IAAI;AAC1E,UAAM,qBACJC,MAAA,eAAe,IAAI,MAAM,MAAzB,OAAAA,MAA8B,oBAAI,IAAyB;AAC7D,sBAAkB,IAAI,OAAO;AAC7B,mBAAe,IAAI,QAAQ,iBAAiB;AAC5C,SAAK,qBAAqB,IAAI,UAAU,cAAc;AAEtD,UAAM,UAAS,KAAA,KAAK,aAAa,IAAI,QAAQ,MAA9B,OAAA,SAAA,GAAiC;AAChD,QAAI,QAAQ;AACV,aAAO;QACL;QACA,KAAK,6BAA6B,UAAU,MAAM;MACpD;IACF;EACF;EAEA,sBAAsB,UAAkB,SAAoC;AAC1E,SAAK;MACH;MACA;MACA;IACF;EACF;EAEA,kBAAkB,UAAkB,SAAoC;AACtE,SAAK;MACH;MACA;MACA;IACF;EACF;EAEA,oBAAoB,UAAkB,SAAoC;AACxE,SAAK;MACH;MACA;MACA;IACF;EACF;EAEA,UAAU,UAAsC;AAroBlD,QAAAD;AAsoBI,YAAOA,MAAA,KAAK,aAAa,IAAI,QAAQ,MAA9B,OAAA,SAAAA,IAAiC;EAC1C;EAEA,sBAAsB,UAAkB,SAAmC;AAzoB7E,QAAAA;AA0oBI,QAAI,CAAC,KAAK,aAAa,IAAI,QAAQ,GAAG;AACpC,YAAM,IAAI,MAAM,uBAAuB,QAAQ,IAAI;IACrD;AAEA,SAAK,oBAAoB,IAAI,UAAU,OAAO;AAE9C,UAAM,UAASA,MAAA,KAAK,aAAa,IAAI,QAAQ,MAA9B,OAAA,SAAAA,IAAiC;AAChD,QAAI,QAAQ;AACV,WAAK,wBAAwB,UAAU,MAAM;IAC/C;EACF;EAEA,wBAAwB,UAAwB;AAtpBlD,QAAAA;AAupBI,SAAK,oBAAoB,OAAO,QAAQ;AACxC,UAAM,UAASA,MAAA,KAAK,aAAa,IAAI,QAAQ,MAA9B,OAAA,SAAAA,IAAiC;AAChD,QAAI,QAAQ;AACV,aAAO,qBAAqB,oBAAoB;IAClD;EACF;;EAGA,uBACE,UAKM;AACN,SAAK,sBAAsB;AAE3B,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,aAAa,QAAQ,GAAG;AAC3D,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,OAAQ;AACb,UAAI,KAAK,oBAAoB,IAAI,QAAQ,GAAG;AAE1C,aAAK,wBAAwB,UAAU,MAAM;MAC/C,OAAO;AACL,aAAK,wBAAwB,UAAU,MAAM;MAC/C;IACF;EACF;EAEA,2BAAiC;AAC/B,SAAK,sBAAsB;AAE3B,eAAW,CAAC,UAAU,KAAK,KAAK,KAAK,aAAa,QAAQ,GAAG;AAC3D,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,OAAQ;AACb,UAAI,KAAK,oBAAoB,IAAI,QAAQ,GAAG;AAC1C,aAAK,wBAAwB,UAAU,MAAM;MAC/C,OAAO;AACL,eAAO,qBAAqB,oBAAoB;MAClD;IACF;EACF;;EAGA,yBAME;AACA,WAAO,KAAK;EACd;;EAGA,qBAAqB,WAAmB,UAAiC;AACvE,UAAM,UAAU,KAAK,oBAAoB,IAAI,SAAS;AACtD,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI;AACF,cAAQ,QAAQ,QAAQ;AACxB,aAAO;IACT,UAAA;AACE,WAAK,oBAAoB,OAAO,SAAS;IAC3C;EACF;EAEA,MAAc,gBACZ,UACA,QACA,QACA,SACoB;AA9tBxB,QAAAA;AA+tBI,UAAM,aAAa,IAAI,qBAAqB;MAC1C,SAAS,OAAO;MAChB,MAAM,OAAO;MACb,KAAK,EAAE,GAAG,sBAAsB,GAAG,IAAIA,MAAA,OAAO,QAAP,OAAAA,MAAc,CAAC,EAAG;IAC3D,CAAC;AACD,UAAM,UAAU,KAAK,wBAAwB,UAAU,QAAQ,UAAU;AACzE,UAAM,OAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC;AACzC,WAAO;EACT;EAEA,MAAc,eACZ,UACA,QACA,QACA,SACoB;AA9uBxB,QAAAA;AA+uBI,UAAM,aAAYA,MAAA,OAAO,cAAP,OAAAA,MAAoB,OAAO,IAAI,SAAS,SAAS,MAAM;AACzE,QAAI;AAEJ,QAAI,CAAC,WAAW;AACd,YAAM,sBAAsB,IAAI;QAC9B,OAAO;QACP;UACE,aAAa,OAAO;UACpB,qBAAqB,OAAO;UAC5B,cAAc,OAAO;UACrB,WAAW,OAAO;QACpB;MACF;AAEA,UAAI;AACF,cAAM,UAAU,KAAK;UACnB;UACA;UACA;QACF;AACA,cAAM,OAAO,QAAQ,SAAS;UAC5B,SAAS,KAAK,IAAI,SAAS,GAAI;QACjC,CAAC;AACD,eAAO;MACT,SAAS,OAAO;AACd,0BAAkB;AAClB,cAAM,KAAK,mBAAmB,mBAAmB;MACnD;IACF;AAEA,UAAM,eAAe,IAAI,mBAAmB,OAAO,KAAK;MACtD,aAAa,OAAO;MACpB,iBAAiB,OAAO;MACxB,cAAc,OAAO;IACvB,CAAC;AAED,QAAI;AACF,YAAM,UAAU,KAAK;QACnB;QACA;QACA;MACF;AACA,YAAM,OAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC;AACzC,aAAO;IACT,SAAS,OAAO;AACd,YAAM,KAAK,mBAAmB,YAAY;AAC1C,YAAM,oBAAoB,kBACtB,2BAA2B,KAAK,YAAY,eAAe,CAAC,MAC5D;AACJ,YAAM,IAAI;QACR,oCAAoC,QAAQ,2BAA2B,iBAAiB,eAAe,KAAK,YAAY,KAAK,CAAC;MAChI;IACF;EACF;EAEA,MAAc,mBAAmB,WAAqC;AACpE,QAAI;AACF,YAAM,UAAU,MAAM;IACxB,QAAQ;IAER;EACF;EAEQ,0BAA0B,UAAkB,QAAsB;AACxE,UAAM,iBAAiB,KAAK,qBAAqB,IAAI,QAAQ;AAC7D,QAAI,CAAC,gBAAgB;AACnB;IACF;AAEA,eAAW,CAAC,MAAM,KAAK,gBAAgB;AACrC,aAAO;QACL;QACA,KAAK,6BAA6B,UAAU,MAAM;MACpD;IACF;EACF;EAEQ,6BACN,UACA,QACqB;AACrB,WAAO,CAAC,iBAAiB;AACvB,YAAM,iBAAiB,KAAK,qBAAqB,IAAI,QAAQ;AAC7D,YAAM,oBAAoB,kBAAA,OAAA,SAAA,eAAgB,IAAI,MAAA;AAC9C,UAAI,CAAC,qBAAqB,kBAAkB,SAAS,GAAG;AACtD;MACF;AACA,iBAAW,WAAW,mBAAmB;AACvC,YAAI;AACF,kBAAQ,YAAY;QACtB,QAAQ;QAER;MACF;IACF;EACF;EAEQ,wBAAwB,UAAkB,QAAsB;AACtE,UAAM,iBAAiB,KAAK,oBAAoB,IAAI,QAAQ;AAC5D,QAAI,gBAAgB;AAClB,aAAO;QAAkB;QAAqB,OAAO,YACnD,eAAe,QAAQ,MAAM;MAC/B;AACA;IACF;AAEA,QAAI,KAAK,qBAAqB;AAC5B,aAAO,kBAAkB,qBAAqB,OAAO,YAAY;AA11BvE,YAAAA,KAAAC,KAAA,IAAA;AA21BQ,cAAM,QAAQ,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAC/C,SAAS,EAAE,EACX,MAAM,GAAG,CAAC,CAAC;AACd,eAAO,MAAM,KAAK,oBAAqB;UACrC,WAAW;UACX,UAAUD,MAAA,QAAQ,WAAR,OAAA,SAAAA,IAAwB;UAClC,SACG,MAAAC,MAAA,QAAQ,WAAR,OAAA,SAAAA,IAAwB,oBAAxB,OAAA,MACA,KAAA,QAAQ,WAAR,OAAA,SAAA,GAAwB;QAC7B,CAAC;MACH,CAAC;AACD;IACF;EACF;EAEA,MAAc,gBAAgB,UAAiC;AAC7D,UAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ;AAC5C,QAAI,SAAA,OAAA,SAAA,MAAO,QAAQ;AACjB;IACF;AAEA,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,uBAAuB,QAAQ,IAAI;IACrD;AACA,QAAI,MAAM,SAAS;AACjB,YAAM,MAAM;AACZ;IACF;AACA,UAAM,KAAK,gBAAgB,UAAU,MAAM,MAAM;EACnD;EAEQ,WAAW,UAAwB;AACzC,SAAK,aAAa,OAAO,QAAQ;AACjC,SAAK,mBAAmB,OAAO,QAAQ;EACzC;EAEQ,wBACN,OACqB;AACrB,QAAI,CAAC,OAAO;AACV,aAAO;IACT;AACA,QAAI,MAAM,QAAQ;AAChB,aAAO;IACT;AACA,QAAI,MAAM,SAAS;AACjB,aAAO;IACT;AACA,WAAO;EACT;EAEQ,YACN,UACA,SACgB;AAj5BpB,QAAAD;AAk5BI,UAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ;AAC5C,UAAM,WACJA,MAAA,SAAA,OAAA,SAAA,MAAO,YAAP,OAAAA,MACC,QAAQ,KAAK,WAAW,MAAM,MAAM,IAAI,KAAK;AAEhD,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,QAAQ;IACnB;AAEA,QAAI,QAAQ,YAAY,QAAW;AACjC,aAAO,EAAE,GAAG,SAAS,QAAQ;IAC/B;AAEA,WAAO;EACT;EAEQ,kBAAkB,QAAkD;AAl6B9E,QAAAA;AAm6BI,UAAM,eAAwC;MAC5C,GAAG,KAAK;MACR,IAAIA,MAAA,OAAO,iBAAP,OAAAA,MAAuB,CAAC;IAC9B;AAEA,QAAI,CAAC,aAAa,aAAa;AAC7B,mBAAa,cAAc,CAAC;IAC9B;AAEA,WAAO;EACT;EAEQ,YAAY,OAAwB;AAC1C,QAAI,iBAAiB,OAAO;AAC1B,aAAO,MAAM;IACf;AAEA,QAAI;AACF,aAAO,KAAK,UAAU,KAAK;IAC7B,QAAQ;AACN,aAAO,OAAO,KAAK;IACrB;EACF;;EAGQ,wBACN,UACA,QACA,WACW;AACX,UAAMK,UAAS,KAAK,iBAAiB,UAAU,MAAM;AACrD,QAAI,CAACA,QAAQ,QAAO;AACpB,UAAM,MAIOA;AAGb,UAAM,OAAO;IACb,MAAM,iBAAsC;MAI1C,YAA6B,OAAkB;AAAlB,aAAA,QAAA;AAC3B,aAAK,MAAM,YAAY,CACrB,SACA,UACG;AAn9Bb,cAAAL;AAo9BU,cAAI;AACF,gBAAI,EAAE,WAAW,WAAW,SAAS,SAAS,CAAC;UACjD,QAAQ;UAER;AACA,WAAAA,MAAA,KAAK,cAAL,OAAA,SAAAA,IAAA,KAAA,MAAiB,SAAS,KAAA;QAC5B;AACA,aAAK,MAAM,UAAU,MAAM;AA39BnC,cAAAA;AA49BU,WAAAA,MAAA,KAAK,YAAL,OAAA,SAAAA,IAAA,KAAA,IAAA;QACF;AACA,aAAK,MAAM,UAAU,CAAC,UAAiB;AA99B/C,cAAAA;AA+9BU,WAAAA,MAAA,KAAK,YAAL,OAAA,SAAAA,IAAA,KAAA,MAAe,KAAA;QACjB;MACF;MACA,MAAM,QAAuB;AAC3B,YAAI,OAAQ,KAAK,MAAc,UAAU,YAAY;AACnD,gBAAO,KAAK,MAAc,MAAM;QAClC;MACF;MACA,MAAM,KACJ,SACA,SACe;AACf,YAAI;AACF,cAAI,EAAE,WAAW,QAAQ,SAAS,SAAS,CAAC;QAC9C,QAAQ;QAER;AACA,cAAM,KAAK,MAAM,KAAK,SAAgB,OAAc;MACtD;MACA,MAAM,QAAuB;AAC3B,cAAM,KAAK,MAAM,MAAM;MACzB;MACA,IAAI,YAAgC;AAClC,eAAQ,KAAK,MAAc;MAC7B;MACA,mBAAoBM,UAAuB;AACzC,YAAI,OAAO,KAAK,MAAM,uBAAuB,YAAY;AACvD,eAAK,MAAM,mBAAmBA,QAAO;QACvC;MACF;IACF;AAEA,WAAO,IAAI,iBAAiB,SAAS;EACvC;EAEQ,iBACN,UACA,QAOY;AACZ,QAAI,OAAO,UAAW,QAAO,OAAO;AACpC,QAAI,OAAO,cAAc,KAAK,mBAAmB;AAC/C,aAAO,CAAC,EAAE,WAAW,SAAS,UAAU,GAAG,MAAM;AAC/C,YAAI;AACJ,YAAI;AACF,sBACE,OAAO,YAAY,WAAW,UAAU,KAAK,UAAU,OAAO;QAClE,QAAQ;AACN,sBAAY,OAAO,OAAO;QAC5B;AAEA,gBAAQ,MAAM,QAAQ,EAAE,KAAK,UAAU,YAAY,CAAC,IAAI,SAAS,EAAE;MACrE;IACF;AACA,QAAI,KAAK,iBAAkB,QAAO,KAAK;AACvC,WAAO;EACT;EAEQ,yBAAyB,OAAgB,QAAyB;AACxE,QAAI,EAAE,iBAAiB,QAAQ;AAC7B,aAAO;IACT;AACA,UAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,UAAM,eAAe,oBAAI,IAAY;AACrC,UAAM,YAAY,CAAC,UAAkB;AACnC,UAAI,OAAO;AACT,qBAAa,IAAI,MAAM,YAAY,CAAC;MACtC;IACF;AAEA,cAAU,MAAM;AAChB,eAAW,QAAQ,OAAO,MAAM,UAAU,GAAG;AAC3C,gBAAU,IAAI;IAChB;AACA,UAAM,aAAa;MACjB;MACA;MACA;MACA;MACA;IACF;AACA,UAAM,iBAAiB,WAAW;MAAK,CAAC,cACtC,QAAQ,SAAS,SAAS;IAC5B;AACA,QAAI,CAAC,gBAAgB;AACnB,aAAO;IACT;AAEA,QAAI,MAAM,KAAK,YAAY,EAAE,KAAK,CAAC,UAAU,QAAQ,SAAS,KAAK,CAAC,GAAG;AACrE,aAAO;IACT;AAEA,WAAO;EACT;EAEQ,WAAW,QAAiC;AAnkCtD,QAAAN;AAokCI,YAAOA,MAAA,OAAO,YAAP,OAAAA,MAAkB,KAAK;EAChC;EAEQ,cAAc,QAAsD;AAC1E,WAAO,aAAa;EACtB;EAEQ,cAAc,UAA0B;AAC9C,UAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ;AAC5C,QAAI,EAAC,SAAA,OAAA,SAAA,MAAO,SAAQ;AAClB,YAAM,IAAI,MAAM,eAAe,QAAQ,qBAAqB;IAC9D;AACA,WAAO,MAAM;EACf;AACF;;;AEllCA,SAAS,QAAAO,cAAY;;;ACArB,SAAS,YAAY;AAGrB,IAAM,UAAU,IAAI,KAAK;AAEzB,QAAQ,KAAK,KAAK,OAAO,MAAM;AAC7B,MAAI;AACF,UAAM,EAAE,cAAc,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AAEpD,QAAI,CAAC,cAAc;AACjB,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa,KAAK;AACpB,UAAI,OAAO,aAAa,QAAQ,UAAU;AACxC,qBAAa,MAAM,IAAI,IAAI,aAAa,GAAG;AAAA,MAC7C,WACE,OAAO,aAAa,QAAQ,YAC5B,aAAa,IAAI,MACjB;AACA,qBAAa,MAAM,IAAI,IAAI,aAAa,IAAI,IAAI;AAAA,MAClD;AAAA,IACF;AAEA,UAAMC,oBAAmB,EAAE;AAC3B,QAAI;AACF,YAAMA,kBAAiB,gBAAgB,UAAU,YAAY;AAC7D,aAAO,EAAE,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO,gCAAgC,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC5G,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACpD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;ACrEf,SAAS,QAAAC,aAAY;;;ACArB,SAAS,oBAAoB;AAS7B,IAAM,YAAN,MAAgB;AAAA,EACG,UAAU,IAAI,aAAa;AAAA,EAC3B,iBAAiB,oBAAI,IAA2B;AAAA,EAEjE,QAAQ,OAA0B;AAChC,UAAM,SAAS,KAAK,eAAe,IAAI,MAAM,QAAQ,KAAK,CAAC;AAC3D,WAAO,KAAK,KAAK;AACjB,SAAK,eAAe,IAAI,MAAM,UAAU,MAAM;AAC9C,SAAK,QAAQ,KAAK,SAAS,KAAK;AAAA,EAClC;AAAA,EAEA,UACE,WACA,UACY;AACZ,UAAM,SAAS,IAAI,IAAI,SAAS;AAChC,UAAM,UAAU,CAAC,UAAuB;AACtC,UAAI,OAAO,SAAS,KAAK,OAAO,IAAI,MAAM,QAAQ,EAAG,UAAS,KAAK;AAAA,IACrE;AACA,SAAK,QAAQ,GAAG,SAAS,OAAO;AAChC,WAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,OAAO;AAAA,EAChD;AAAA,EAEA,UAAU,WAAqB,OAA8B;AAC3D,UAAM,SAAS,IAAI,IAAI,SAAS;AAChC,UAAM,MAAqB,CAAC;AAC5B,eAAW,CAAC,UAAU,GAAG,KAAK,KAAK,eAAe,QAAQ,GAAG;AAC3D,UAAI,OAAO,OAAO,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAG;AAC9C,UAAI,KAAK,GAAG,GAAG;AAAA,IACjB;AAEA,QAAI,UAAU,EAAG,QAAO,CAAC;AAEzB,QAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,EAAG,QAAO;AACjD,WAAO,IAAI,MAAM,KAAK,IAAI,GAAG,IAAI,SAAS,KAAK,CAAC;AAAA,EAClD;AACF;AAEO,IAAM,YAAY,IAAI,UAAU;;;AD1CvC,IAAM,UAAU,IAAIC,MAAK;AAGzB,QAAQ,IAAI,KAAK,OAAO,MAAM;AAC5B,MAAI;AACF,UAAMC,oBAAmB,EAAE;AAC3B,UAAM,aAAaA,kBAChB,mBAAmB,EACnB,IAAI,CAAC,EAAE,IAAI,QAAQ,OAAO,OAAO;AAAA,MAChC;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,EAAE;AAEJ,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,KAAK;AAC7C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,QAAQ,IAAI,qBAAqB,OAAO,MAAM;AAC5C,MAAI;AACF,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAMA,oBAAmB,EAAE;AAC3B,UAAM,SACJA,kBAAiB,oCAAoC,QAAQ;AAE/D,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,OAAO,cAAc,OAAO,MAAM;AACxC,MAAI;AACF,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAMA,oBAAmB,EAAE;AAE3B,QAAI;AACF,YAAM,SAASA,kBAAiB,UAAU,QAAQ;AAClD,UAAI,QAAQ;AACV,cAAMA,kBAAiB,iBAAiB,QAAQ;AAAA,MAClD;AAAA,IACF,SAAS,OAAO;AAEd,cAAQ;AAAA,QACN,mCAAmC,QAAQ;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEA,IAAAA,kBAAiB,aAAa,QAAQ;AAEtC,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,SAAS,6BAA6B,QAAQ;AAAA,IAChD,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,KAAK,cAAc,OAAO,MAAM;AACtC,MAAI;AACF,UAAM,EAAE,UAAU,aAAa,IAAK,MAAM,EAAE,IAAI,KAAK;AAKrD,QAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAMA,oBAAmB,EAAE;AAE3B,UAAM,mBAAoC,EAAE,GAAG,aAAa;AAC5D,QACE,SAAS,oBACT,iBAAiB,QAAQ,UACzB,iBAAiB,QAAQ,MACzB;AACA,YAAM,WAAW,iBAAiB;AAClC,UAAI,OAAO,aAAa,UAAU;AAChC,yBAAiB,MAAM,IAAI,IAAI,QAAQ;AAAA,MACzC,WAAW,oBAAoB,KAAK;AAAA,MAEpC,WACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAW,YACX,OAAQ,SAAgC,SAAS,UACjD;AACA,yBAAiB,MAAM,IAAI,IAAK,SAA8B,IAAI;AAAA,MACpE;AAAA,IACF;AAEA,UAAMA,kBAAiB,iBAAiB,QAAQ;AAChD,UAAMA,kBAAiB,gBAAgB,UAAU,gBAAgB;AAEjE,UAAM,SACJA,kBAAiB,oCAAoC,QAAQ;AAC/D,UAAM,UACJ,WAAW,cACP,0BAA0B,QAAQ,KAClC,UAAU,QAAQ,6BAA6B,MAAM;AAC3D,UAAM,UAAU,WAAW;AAE3B,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,UAAU,CAAC,IAAI,EAAE,OAAO,QAAQ;AAAA,IACtC,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AACjD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,IAAI,eAAe,OAAO,MAAM;AACtC,QAAM,YAAY,EAAE,iBAAiB,YAAY;AACjD,QAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,QAAM,SAAS,SAAS,IAAI,aAAa,IAAI,QAAQ,KAAK,KAAK,EAAE;AAEjE,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,SAAS,IAAI,eAAe;AAAA,IAChC,MAAM,YAAY;AAChB,YAAM,OAAO,CAAC,SAAkB;AAC9B,YAAI;AACF,qBAAW;AAAA,YACT,QAAQ,OAAO,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA,CAAM;AAAA,UACpD;AAAA,QACF,QAAQ;AAAA,QAAC;AAAA,MACX;AAGA,UAAI;AACF,cAAM,SAAS,UAAU;AAAA,UACvB;AAAA,UACA,MAAM,MAAM,IAAI,IAAI;AAAA,QACtB;AACA,mBAAW,OAAO,QAAQ;AACxB,eAAK,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;AAAA,QAC9B;AAAA,MACF,QAAQ;AAAA,MAAC;AAGT,YAAM,cAAc,UAAU,UAAU,WAAW,CAAC,QAAqB;AACvE,aAAK,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;AAAA,MAC9B,CAAC;AAGD,YAAM,YAAY,YAAY,MAAM;AAClC,YAAI;AACF,qBAAW,QAAQ,QAAQ,OAAO,eAAe,KAAK,IAAI,CAAC;AAAA;AAAA,CAAM,CAAC;AAAA,QACpE,QAAQ;AAAA,QAAC;AAAA,MACX,GAAG,IAAK;AAGR,QAAE,IAAI,IAAI,OAAO,iBAAiB,SAAS,MAAM;AAC/C,YAAI;AACF,wBAAc,SAAS;AACvB,sBAAY;AAAA,QACd,QAAQ;AAAA,QAAC;AACT,YAAI;AACF,qBAAW,MAAM;AAAA,QACnB,QAAQ;AAAA,QAAC;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,IAAI,SAAS,QAAQ;AAAA,IAC1B,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,YAAY;AAAA,MACZ,+BAA+B;AAAA,MAC/B,iCAAiC;AAAA,IACnC;AAAA,EACF,CAAC;AACH,CAAC;AAED,IAAO,kBAAQ;;;AExOf,SAAS,QAAAC,aAAY;AAQrB,IAAM,QAAQ,IAAIC,MAAK;AAmBvB,IAAI,kBAA2C;AAE/C,IAAM,mBAAmB,oBAAI,IAO3B;AAEF,SAAS,kBAAkB;AACzB,SAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACrE;AAEA,SAAS,gBAAgB;AACvB,SAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACpE;AAEA,SAAS,gBACP,SAC6B;AAC7B,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,WAAO,QAAQ,QAAQ,QAAQ,MAAM,MAAM,CAAE;AAAA,EAC/C;AACA,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,YAAQ,SAASA;AAAA,EACnB,CAAC;AACH;AAEA,SAAS,eACP,SACA,SACA;AACA,MAAI,QAAQ,QAAQ;AAClB,UAAMA,WAAU,QAAQ;AACxB,YAAQ,SAAS;AACjB,IAAAA,SAAQ,OAAO;AACf;AAAA,EACF;AACA,UAAQ,MAAM,KAAK,OAAO;AAC5B;AAEA,SAAS,eAAe,SAAkC,OAAmB;AAC3E,MAAI,CAAC,QAAS;AACd,QAAM;AACN,MAAI,oBAAoB,SAAS;AAC/B,sBAAkB;AAAA,EACpB;AACA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,YAAQ,MAAM,SAAS;AAAA,EACzB;AACA,UAAQ,SAAS;AACjB,aAAW,CAAC,WAAW,OAAO,KAAK,MAAM,KAAK,iBAAiB,QAAQ,CAAC,GAAG;AACzE,QAAI,QAAQ,aAAa,QAAQ,SAAU;AAC3C,qBAAiB,OAAO,SAAS;AACjC,YAAQ,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,kBAAkB,OAAgB;AACzC,QAAM,SAAS;AACf,QAAM,OAAO;AAAA,IACX,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ,WAAW,OAAO,KAAK;AAAA,IACxC,MAAM,QAAQ,QAAQ,QAAQ,OAAO;AAAA,IACrC,MAAM,QAAQ,QAAQ,QAAQ,OAAO;AAAA,EACvC;AACA,QAAM,QAAQ,QAAQ;AACtB,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,SAAK,QAAQ;AAAA,MACX,MAAO,OAAe;AAAA,MACtB,SAAU,OAAe;AAAA,MACzB,MAAO,OAAe;AAAA,MACtB,MAAO,OAAe;AAAA,IACxB;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,aAAa,iBAAiB,QAAQ,OAAO;AAC3D,SAAK,QAAQ,OAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,UAAU,GAAQ,OAAgB,iBAAiB,KAAK;AAC/D,QAAM,UAAU,kBAAkB,KAAK;AACvC,QAAM,SACJ,OAAQ,OAAe,WAAW,WAC7B,MAAc,SACf;AACN,SAAO,EAAE;AAAA,IACP,EAAE,OAAO,QAAQ,SAAmB,UAAU,QAAQ;AAAA,IACtD;AAAA,EACF;AACF;AAEA,MAAM,KAAK,SAAS,OAAO,MAAM;AAC/B,MAAI;AACF,UAAM,EAAE,SAAS,IAAK,MAAM,EAAE,IAAI,KAAK;AACvC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtD;AACA,UAAM,SAAU,MAAM,EAAE,iBAAiB;AAAA,MACvC;AAAA,IACF;AAGA,UAAM,gBAAgB,EAAE,iBAAiB,oBAAoB,QAAQ;AAErE,WAAO,EAAE,KAAK,EAAE,GAAG,QAAQ,cAAc,CAAC;AAAA,EAC5C,SAAS,OAAO;AACd,WAAO,UAAU,GAAG,OAAO,GAAG;AAAA,EAChC;AACF,CAAC;AAED,MAAM,KAAK,YAAY,OAAO,MAAM;AAClC,MAAI,iBAAiB;AACnB,WAAO,EAAE,KAAK,EAAE,OAAO,2CAA2C,GAAG,GAAG;AAAA,EAC1E;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa,CAAC;AAAA,EAChB,IAAK,MAAM,EAAE,IAAI,KAAK;AAMtB,MAAI,CAAC,SAAU,QAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,MAAI,CAAC,SAAU,QAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAEnE,QAAM,UAAU,EAAE;AAClB,QAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,WAAW,QAAQ,qBAAqB,GAAG,GAAG;AAAA,EACvE;AAEA,QAAM,cAAc,gBAAgB;AAEpC,QAAM,UAA4B;AAAA,IAChC,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,aAAa,QAAQ;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO,CAAC;AAAA,EACV;AAEA,oBAAkB;AAElB,UAAQ,sBAAsB,UAAU,OAAO,WAAW;AACxD,UAAM,UAA8B;AAAA,MAClC;AAAA,MACA,WAAW,cAAc;AAAA,MACzB,SAAS;AAAA,MACT,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,MACjC;AAAA,IACF;AAEA,mBAAe,SAAS,OAAO;AAE/B,WAAO,IAAI,QAAsB,CAACA,UAAS,WAAW;AACpD,uBAAiB,IAAI,QAAQ,WAAW;AAAA,QACtC;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,2BAAiB,OAAO,QAAQ,SAAS;AACzC,UAAAA,SAAQ,KAAK;AAAA,QACf;AAAA,QACA,QAAQ,CAAC,QAAQ;AACf,2BAAiB,OAAO,QAAQ,SAAS;AACzC,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,MAAI;AACF,UAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,MAC9B,QAAQ,YAAY,KAAK,CAAC,YAAY,EAAE,MAAM,QAAiB,OAAO,EAAE;AAAA,MACxE,gBAAgB,OAAO,EAAE,KAAK,CAAC,aAAa;AAAA,QAC1C,MAAM;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ,CAAC;AAED,QAAI,KAAK,SAAS,QAAQ;AACxB,qBAAe,SAAS,MAAM,QAAQ,wBAAwB,QAAQ,CAAC;AACvE,aAAO,EAAE,KAAK,EAAE,QAAQ,aAAa,QAAQ,KAAK,OAAO,CAAC;AAAA,IAC5D;AAEA,WAAO,EAAE;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA,WAAW,KAAK,QAAQ;AAAA,QACxB,SAAS,KAAK,QAAQ;AAAA,QACtB,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,mBAAe,SAAS,MAAM,QAAQ,wBAAwB,QAAQ,CAAC;AACvE,WAAO,UAAU,GAAG,OAAO,GAAG;AAAA,EAChC;AACF,CAAC;AAED,MAAM,KAAK,YAAY,OAAO,MAAM;AAClC,QAAM,UAAU;AAChB,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,EACrD;AAEA,QAAM,EAAE,WAAW,SAAS,IAAK,MAAM,EAAE,IAAI,KAAK;AAKlD,MAAI,CAAC,WAAW;AACd,WAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,EACvD;AAEA,QAAM,UAAU,iBAAiB,IAAI,SAAS;AAC9C,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,KAAK,EAAE,OAAO,uCAAuC,GAAG,GAAG;AAAA,EACtE;AAEA,UAAQ,QAAQ,QAAwB;AAExC,MAAI;AACF,UAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,MAC9B,QAAQ,YAAY,KAAK,CAAC,YAAY,EAAE,MAAM,QAAiB,OAAO,EAAE;AAAA,MACxE,gBAAgB,OAAO,EAAE,KAAK,CAAC,aAAa;AAAA,QAC1C,MAAM;AAAA,QACN;AAAA,MACF,EAAE;AAAA,IACJ,CAAC;AAED,QAAI,KAAK,SAAS,QAAQ;AACxB;AAAA,QAAe;AAAA,QAAS,MACtB,EAAE,iBAAiB,wBAAwB,QAAQ,QAAQ;AAAA,MAC7D;AACA,aAAO,EAAE,KAAK,EAAE,QAAQ,aAAa,QAAQ,KAAK,OAAO,CAAC;AAAA,IAC5D;AAEA,WAAO,EAAE;AAAA,MACP;AAAA,QACE,QAAQ;AAAA,QACR,aAAa,QAAQ;AAAA,QACrB,WAAW,KAAK,QAAQ;AAAA,QACxB,SAAS,KAAK,QAAQ;AAAA,QACtB,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd;AAAA,MAAe;AAAA,MAAS,MACtB,EAAE,iBAAiB,wBAAwB,QAAQ,QAAQ;AAAA,IAC7D;AACA,WAAO,UAAU,GAAG,OAAO,GAAG;AAAA,EAChC;AACF,CAAC;AAED,MAAM,KAAK,KAAK,YAAY;AAC1B,SAAO,IAAI;AAAA,IACT,KAAK,UAAU;AAAA,MACb,OAAO;AAAA,IACT,CAAC;AAAA,IACD,EAAE,QAAQ,KAAK,SAAS,EAAE,gBAAgB,mBAAmB,EAAE;AAAA,EACjE;AACF,CAAC;AAED,IAAO,gBAAQ;;;AC9Sf,SAAS,QAAAC,aAAY;AAGrB,IAAM,YAAY,IAAIC,MAAK;AAa3B,IAAM,kBAAkB,oBAAI,IAAwB;AAGpD;AAAA,EACE,MAAM;AACJ,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW,KAAK,KAAK;AAC3B,eAAW,CAAC,QAAQ,IAAI,KAAK,gBAAgB,QAAQ,GAAG;AACtD,UAAI,MAAM,KAAK,YAAY,UAAU;AACnC,wBAAgB,OAAO,MAAM;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,KAAK;AACX,EAAE,MAAM;AAGR,UAAU,KAAK,SAAS,OAAO,MAAM;AACnC,MAAI;AACF,UAAM,EAAE,SAAS,IAAK,MAAM,EAAE,IAAI,KAAK;AAEvC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AACA,UAAMC,oBAAmB,EAAE;AAC3B,UAAM,EAAE,WAAAC,WAAU,IAAI,MAAMD,kBAAiB,cAAc,QAAQ;AACnE,WAAO,EAAE,KAAK,EAAE,WAAAC,WAAU,CAAC;AAAA,EAC7B,SAAS,OAAO;AACd,YAAQ,MAAM,6BAA6B,KAAK;AAChD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,UAAU,KAAK,SAAS,OAAO,MAAM;AACnC,MAAI;AACF,UAAM,EAAE,UAAU,IAAI,IAAK,MAAM,EAAE,IAAI,KAAK;AAK5C,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,QAAI,CAAC,KAAK;AACR,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAMD,oBAAmB,EAAE;AAE3B,UAAM,UAAU,MAAMA,kBAAiB,aAAa,UAAU;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,WAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,UAAU,KAAK,iBAAiB,OAAO,MAAM;AAC3C,MAAI;AACF,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,QAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ;AAChC,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,0BAA0B,GAAG,GAAG;AAAA,IACzE;AAGA,oBAAgB,IAAI,QAAQ;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,sBAAsB,wBAAwB;AAAA,MAC9C;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAED,WAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,EACjC,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AACjD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAID,UAAU,IAAI,mBAAmB,OAAO,MAAM;AAC5C,QAAM,SAAS,EAAE,IAAI,MAAM,QAAQ;AAGnC,QAAM,aAAa,gBAAgB,IAAI,MAAM;AAC7C,MAAI,CAAC,YAAY;AACf,WAAO,EAAE;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,SAAO,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4EAc4D,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAW/E;AACH,CAAC;AAGD,UAAU,IAAI,2BAA2B,OAAO,MAAM;AACpD,MAAI;AACF,UAAM,SAAS,EAAE,IAAI,MAAM,QAAQ;AAGnC,UAAM,aAAa,gBAAgB,IAAI,MAAM;AAC7C,QAAI,CAAC,YAAY;AACf,aAAO,EAAE;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,UAAU,KAAK,WAAW,YAAY,qBAAqB,IACjE;AAEF,UAAMA,oBAAmB,EAAE;AAC3B,UAAM,mBAAmBA,kBACtB,YAAY,EACZ,OAAO,CAAC,OAAO,QAAQA,kBAAiB,UAAU,EAAE,CAAC,CAAC;AAEzD,QAAI,iBAAiB;AACrB,QAAI,CAAC,iBAAiB,SAAS,QAAQ,GAAG;AACxC,YAAM,QAAQ,iBAAiB;AAAA,QAC7B,CAAC,SAAS,KAAK,YAAY,MAAM,SAAS,YAAY;AAAA,MACxD;AACA,UAAI,OAAO;AACT,yBAAiB;AAAA,MACnB,OAAO;AACL,eAAO,EAAE;AAAA,UACP;AAAA;AAAA,mCAEyB,QAAQ;AAAA,oCACP,iBAAiB,KAAK,IAAI,CAAC;AAAA;AAAA,UAErD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,MAAMA,kBAAiB,aAAa,gBAAgB;AAAA,MAClE;AAAA,IACF,CAAC;AAED,QAAI,cAAc;AAClB,UAAM,gBAAgB,MAAM,QAAQ,SAAS,QAAQ,IACjD,QAAQ,WACR,CAAC;AAEL,UAAM,eAAe,cAAc,CAAC;AACpC,QAAI,cAAc;AAChB,UAAI,OAAQ,aAAoC,SAAS,UAAU;AACjE,sBAAe,aAAkC;AAAA,MACnD,WACE,OAAQ,aAAoC,SAAS,UACrD;AACA,sBAAe,aAAkC;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,CAAC,eAAe,WAAW,OAAO,YAAY,UAAU;AAC1D,YAAM,gBAAgB;AACtB,UAAI,OAAO,cAAc,SAAS,UAAU;AAC1C,sBAAc,cAAc;AAAA,MAC9B,WAAW,OAAO,cAAc,SAAS,UAAU;AACjD,sBAAc,cAAc;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,aAAO,EAAE;AAAA,QACP;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,uBAAuB,MAAM;AAEpD,UAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAMG,KAAK,UAAU,SAAS,CAAC;AAAA,0BACxB,KAAK,UAAU,UAAU,CAAC;AAAA,oCAChB,KAAK,UAAU,wBAAwB,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAYzC,KAAK,UAAU,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAM3C,KAAK,UAAU,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oDA0GI,KAAK,UAAU,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAU9E,QAAI;AACJ,QAAI,YAAY,SAAS,QAAQ,KAAK,YAAY,SAAS,QAAQ,GAAG;AACpE,qBAAe,YAAY;AAAA,QACzB;AAAA,QACA,wBAAwB,SAAS;AAAA,MACnC;AAAA,IACF,OAAO;AACL,qBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMjB,SAAS;AAAA;AAAA;AAAA,IAGT,WAAW;AAAA;AAAA;AAAA,IAGX;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAEV,MAAE;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,mDAAmD,WAAW;AAAA,QAC9D;AAAA,QACA;AAAA,QACA,oCAAoC,WAAW;AAAA,QAC/C;AAAA,QACA;AAAA,QACA,yBAAyB,WAAW;AAAA,QACpC;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,MAAE,OAAO,mBAAmB,YAAY;AACxC,MAAE,OAAO,0BAA0B,SAAS;AAG5C,MAAE,OAAO,iBAAiB,qCAAqC;AAC/D,MAAE,OAAO,UAAU,UAAU;AAC7B,MAAE,OAAO,WAAW,GAAG;AAEvB,WAAO,EAAE,KAAK,YAAY;AAAA,EAC5B,SAAS,OAAO;AACd,WAAO,EAAE;AAAA,MACP,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,oBAAQ;;;AC/cf,SAAS,QAAAE,aAAY;AAGrB,IAAM,UAAU,IAAIC,MAAK;AAGzB,QAAQ,KAAK,SAAS,OAAO,MAAM;AACjC,MAAI;AACF,UAAM,EAAE,SAAS,IAAK,MAAM,EAAE,IAAI,KAAK;AAEvC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,UAAMC,oBAAmB,EAAE;AAC3B,UAAM,EAAE,SAAAC,SAAQ,IAAI,MAAMD,kBAAiB,YAAY,QAAQ;AAC/D,WAAO,EAAE,KAAK,EAAE,SAAAC,SAAQ,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,KAAK,QAAQ,OAAO,MAAM;AAChC,MAAI;AACF,UAAM,EAAE,UAAU,MAAM,KAAK,IAAK,MAAM,EAAE,IAAI,KAAK;AAMnD,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,QAAI,CAAC,MAAM;AACT,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAMD,oBAAmB,EAAE;AAE3B,UAAM,kBAAkB,OACpB,OAAO;AAAA,MACL,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,IACjE,IACA;AAEJ,UAAM,UAAU,MAAMA,kBAAiB,UAAU,UAAU;AAAA,MACzD;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAED,WAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,yBAAyB,KAAK;AAC5C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;AC9Ef,SAAS,QAAAE,aAAY;AACrB,SAAS,kBAAkB;;;AC+G3B,IAAM,4BAAsC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,wBAAwB,CAAC,YAA6B;AACjE,SAAO,0BAA0B,SAAS,OAAO;AACnD;AAUO,IAAK,QAAL,kBAAKC,WAAL;AACL,EAAAA,OAAA,qBAAkB;AAClB,EAAAA,OAAA,uBAAoB;AACpB,EAAAA,OAAA,8BAA2B;AAC3B,EAAAA,OAAA,8BAA2B;AAC3B,EAAAA,OAAA,6BAA0B;AAC1B,EAAAA,OAAA,aAAU;AACV,EAAAA,OAAA,kBAAe;AACf,EAAAA,OAAA,kBAAe;AACf,EAAAA,OAAA,YAAS;AACT,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,WAAQ;AACR,EAAAA,OAAA,WAAQ;AACR,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,eAAY;AACZ,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,uBAAoB;AAEpB,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,sBAAmB;AACnB,EAAAA,OAAA,2BAAwB;AACxB,EAAAA,OAAA,0BAAuB;AACvB,EAAAA,OAAA,oBAAiB;AACjB,EAAAA,OAAA,wBAAqB;AACrB,EAAAA,OAAA,sBAAmB;AACnB,EAAAA,OAAA,0BAAuB;AACvB,EAAAA,OAAA,yBAAsB;AACtB,EAAAA,OAAA,6BAA0B;AAE1B,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,gBAAa;AACb,EAAAA,OAAA,iBAAc;AACd,EAAAA,OAAA,mBAAgB;AAChB,EAAAA,OAAA,mBAAgB;AAEhB,EAAAA,OAAA,0BAAuB;AACvB,EAAAA,OAAA,0BAAuB;AACvB,EAAAA,OAAA,sBAAmB;AACnB,EAAAA,OAAA,yBAAsB;AACtB,EAAAA,OAAA,yBAAsB;AA/CZ,SAAAA;AAAA,GAAA;AAkDL,IAAM,mBAAsC;AAAA,EACjD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,EAAE,IAAI,qBAAa,MAAM,SAAS,UAAU,SAAS;AAAA,EACrD,EAAE,IAAI,+BAAkB,MAAM,cAAc,UAAU,SAAS;AAAA,EAC/D,EAAE,IAAI,+BAAkB,MAAM,cAAc,UAAU,SAAS;AAAA,EAC/D,EAAE,IAAI,MAAM,mBAAmB,MAAM,cAAc,UAAU,SAAS;AAAA,EACtE,EAAE,IAAI,6BAAiB,MAAM,aAAa,UAAU,SAAS;AAAA,EAC7D,EAAE,IAAI,iCAAmB,MAAM,eAAe,UAAU,SAAS;AAAA,EACjE,EAAE,IAAI,yBAAe,MAAM,WAAW,UAAU,SAAS;AAAA,EACzD,EAAE,IAAI,mCAAoB,MAAM,gBAAgB,UAAU,SAAS;AAAA,EACnE,EAAE,IAAI,mCAAoB,MAAM,gBAAgB,UAAU,SAAS;AAAA,EACnE,EAAE,IAAI,uBAAc,MAAM,UAAU,UAAU,SAAS;AAAA,EACvD,EAAE,IAAI,iCAAmB,MAAM,eAAe,UAAU,SAAS;AAAA,EACjE,EAAE,IAAI,qCAAqB,MAAM,iBAAiB,UAAU,WAAW;AAAA,EACvE;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACF;;;ADhWA,SAAS,eAAAC,oBAAmB;;;AER5B,SAA0B,YAAY;AACtC,SAAS,eAAe;AA6LjB,SAAS,gCAAgC,UAA0B;AACxE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AC1MA,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,gCAAgC;AACzC,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAEtB,IAAM,iBAAiB,CAC5B,iBACA,QACA,eACA,mBACG;AACH,MAAI,CAAC,iBAAiB,MAAM,CAAC,iBAAiB,UAAU;AACtD,UAAM,IAAI;AAAA,MACR,6BAA6B,KAAK,UAAU,eAAe,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,UAAQ,gBAAgB,UAAU;AAAA,IAChC,KAAK;AACH,aAAO,gBAAgB,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACpD,KAAK;AACH,aAAO,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACtD,KAAK;AACH,aAAO,yBAAyB,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IAChE,KAAK,UAAU;AACb,YAAM,MAAM,iBAAiB;AAC7B,YAAM,aAAa,YAAY,KAAK,GAAG,IACnC,MACA,GAAG,IAAI,QAAQ,QAAQ,EAAE,CAAC;AAC9B,aAAO,aAAa,EAAE,SAAS,WAAW,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACjE;AAAA,IACA,KAAK;AACH,aAAO,cAAc,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACrD,KAAK,WAAW;AAEd,YAAM,UAAU,kBAAkB;AAClC,YAAM,SAAS,aAAa;AAAA,QAC1B,QAAQ,UAAU;AAAA;AAAA,QAClB;AAAA,MACF,CAAC;AAED,aAAO,OAAO,KAAK,gBAAgB,EAAE;AAAA,IACvC;AAAA,IACA;AACE,YAAM,IAAI;AAAA,QACR,yBAAyB,gBAAgB,QAAQ,eAAe,gBAAgB,EAAE;AAAA,MACpF;AAAA,EACJ;AACF;;;AC1CA,SAAS,4BAA4B,UAA8B;AACjE,QAAM,YAAsB,CAAC;AAC7B,aAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,YAAY,CAAC,CAAC,GAAG;AACpE,QAAI,eAAe,OAAO,gBAAgB,UAAU;AAClD,iBAAW,CAAC,UAAUC,KAAI,KAAK,OAAO,QAAQ,WAAW,GAAG;AAE1D,kBAAU,QAAQ,IAAI;AAAA,UACpB,GAAGA;AAAA,UACH,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsBC,QAA2B;AACxD,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,UAAUD,KAAI,KAAK,OAAO,QAAaC,UAAS,CAAC,CAAC,GAAG;AAC/D,QAAI,CAACD,SAAQ,OAAOA,UAAS,YAAY,EAAE,aAAaA,OAAO;AAC/D,UAAM,MAAM,SAAS,QAAQ,GAAG;AAChC,UAAM,OACJ,MAAM,MAAM,MAAM,SAAS,SAAS,IAChC,SAAS,MAAM,MAAM,CAAC,IACtB;AACN,QAAI,EAAE,YAAY,OAAQ,OAAM,QAAQ,IAAIA;AAC5C,QAAI,EAAE,QAAQ,OAAQ,OAAM,IAAI,IAAIA;AAAA,EACtC;AACA,SAAO;AACT;AAEO,IAAM,yBAAyB,CAAC,aAAsC;AAC3E,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,IAAK;AACV,QAAI,IAAI,SAAS,eAAe,MAAM,QAAS,IAAY,OAAO,GAAG;AACnE,iBAAW,KAAM,IAAY,SAAS;AACpC,YAAI,GAAG,SAAS,YAAa,aAAY,IAAI,EAAE,UAAU;AAAA,MAC3D;AAAA,IACF,WAAW,IAAI,SAAS,UAAU,MAAM,QAAS,IAAY,OAAO,GAAG;AACrE,iBAAW,KAAM,IAAY,SAAS;AACpC,YAAI,GAAG,SAAS,cAAe,eAAc,IAAI,EAAE,UAAU;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACA,aAAW,MAAM,YAAa,KAAI,CAAC,cAAc,IAAI,EAAE,EAAG,QAAO;AACjE,SAAO;AACT;AAOA,eAAsB,6BACpB,UACA,SACe;AAEf,MAAIC,SAAkB,CAAC;AAEvB,MAAI,mBAAmB,SAAS;AAC9B,UAAM,YAAY,MAAM,QAAQ,cAAc;AAAA,MAC5C,QAAQ;AAAA,IACV;AACA,IAAAA,SAAQ;AAAA,EACV,WAAW,cAAc,SAAS;AAChC,UAAM,WAAW,QAAQ;AACzB,IAAAA,SAAQ,4BAA4B,QAAQ;AAAA,EAC9C,OAAO;AACL,IAAAA,SAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,QAAQ,sBAAsBA,MAAK;AAEzC,QAAM,kBAAkB,CAAC,aAAyC;AAChE,UAAMD,QAAO,MAAM,QAAQ;AAC3B,WAAOA,OAAM;AAAA,EACf;AAGA,QAAM,wBAAwB,oBAAI,IAAY;AAC9C,aAAW,OAAO,UAAU;AAC1B,QAAI,CAAC,OAAO,IAAI,SAAS,UAAU,CAAC,MAAM,QAAS,IAAY,OAAO;AACpE;AACF,eAAW,KAAM,IAAY,SAAS;AACpC,UAAI,GAAG,SAAS,cAAe,uBAAsB,IAAI,EAAE,UAAU;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,mBAAmC,CAAC;AAC1C,aAAW,OAAO,UAAU;AAC1B,QACE,CAAC,OACD,IAAI,SAAS,eACb,CAAC,MAAM,QAAS,IAAY,OAAO;AAEnC;AACF,eAAW,WAAY,IAAY,SAAS;AAC1C,UACE,SAAS,SAAS,eAClB,CAAC,sBAAsB,IAAI,QAAQ,UAAU,GAC7C;AACA,YAAI;AACF,gBAAM,WAAmB,QAAQ;AACjC,gBAAMA,QAAO,MAAM,QAAQ;AAC3B,cAAI,CAACA,MAAM,OAAM,IAAI,MAAM,SAAS,QAAQ,aAAa;AACzD,gBAAM,QAAQ,QAAQ,SAAS,CAAC;AAChC,gBAAM,SAAS,MAAMA,MAAK,QAAQ,KAAK;AAEvC,cAAI;AACJ,cAAI,UAAU,OAAO,WAAW,YAAa,OAAe,SAAS;AACnE,kBAAM,KAAW,OAAe;AAChC,gBACE,MACA,OAAO,OAAO,YACd,UAAU,MACV,OAAO,GAAG,SAAS,UACnB;AACA,uBAAS,EAAE,MAAM,QAAQ,OAAO,GAAG,KAAK;AAAA,YAC1C,WACE,MACA,OAAO,OAAO,YACd,UAAU,MACV,WAAW,IACX;AACA,uBAAS;AAAA,gBACP,MAAO,GAAG,QAAgB;AAAA,gBAC1B,OAAO,GAAG;AAAA,cACZ;AAAA,YACF,OAAO;AACL,uBAAS,EAAE,MAAM,QAAQ,OAAO,KAAK,UAAU,EAAE,EAAE;AAAA,YACrD;AAAA,UACF,OAAO;AACL,qBAAS,EAAE,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE;AAAA,UACjD;AAGA,gBAAM,WAAW,gBAAgB,QAAQ;AAEzC,gBAAM,oBAAkC;AAAA,YACtC,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY,QAAQ;AAAA,gBACpB;AAAA,gBACA;AAAA;AAAA,gBAEA;AAAA;AAAA,gBAEA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,2BAAiB,KAAK,iBAAiB;AAAA,QACzC,SAAS,OAAY;AACnB,gBAAM,cAA+C;AAAA,YACnD,MAAM;AAAA,YACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D;AACA,gBAAM,yBAAuC;AAAA,YAC3C,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY,QAAQ;AAAA,gBACpB,UAAU,QAAQ;AAAA,gBAClB,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AACA,2BAAiB,KAAK,sBAAsB;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,KAAK,GAAG,gBAAgB;AACnC;;;ACxIA,IAAM,yBAAyB,CAAC,QAAiB;AAC/C,MACE,OACA,OAAO,QAAQ,YACf,WAAY,KACZ;AACA,WAAQ,IAAgC;AAAA,EAC1C;AAEA,SAAO;AACT;AAEO,IAAM,yBAAyB,OACpC,YACuC;AACvC,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,OAAO;AAEX,SAAO,OAAO,QAAQ,UAAU;AAC9B,UAAM,UAA+B;AAAA,MACnC,OAAO,QAAQ;AAAA,MACf,UAAU,KAAK,UAAU,QAAQ,cAAc;AAAA,MAC/C,OAAO,QAAQ;AAAA,IACjB;AACA,UAAM,OAAO,MAAM,QAAQ,aAAa,OAAO;AAE/C,QAAI,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD;AAAA,IACF;AAEA,UAAM,qBAA6C,CAAC;AACpD,UAAM,uBAAiD,CAAC;AACxD,QAAI,gBAAgB;AAEpB,eAAW,OAAO,KAAK,UAAU;AAC/B,cAAQ,eAAe,KAAK,GAAG;AAE/B,YAAM,UAAW,IAAY;AAC7B,UAAK,IAAY,SAAS,eAAe,MAAM,QAAQ,OAAO,GAAG;AAC/D,mBAAW,QAAQ,SAAS;AAC1B,cAAI,MAAM,SAAS,UAAU,OAAO,KAAK,SAAS,UAAU;AAC1D,6BAAiB,KAAK;AACtB,sBAAU,kBAAkB,KAAK,IAAI;AAAA,UACvC,WAAW,MAAM,SAAS,aAAa;AACrC,kBAAM,OAAO,KAAK,YAAY,KAAK;AACnC,gBAAI,CAAC,MAAM;AACT;AAAA,YACF;AACA,kBAAM,SAAS,KAAK,SAAS,KAAK,cAAc,KAAK,QAAQ,CAAC;AAC9D,kBAAM,YAAkC,EAAE,MAAM,OAAO;AACvD,+BAAmB,KAAK,SAAS;AACjC,sBAAU,aAAa,SAAS;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,uBAAuB,QAAQ,cAAqB;AAEvE,QAAI,YAAY;AACd,YAAM,YAAY,QAAQ,eAAe;AACzC,YAAM,QAAQ,iBAAiB,QAAQ,cAAc;AACrD,YAAM,cAAc,QAAQ,eAAe,MAAM,SAAS;AAE1D,iBAAW,OAAO,aAAa;AAC7B,cAAM,UAAW,IAAY;AAC7B,YAAK,IAAY,SAAS,UAAU,MAAM,QAAQ,OAAO,GAAG;AAC1D,qBAAW,QAAQ,SAAS;AAC1B,gBAAI,MAAM,SAAS,eAAe;AAGhC,oBAAM,aAAa,KAAK;AACxB,oBAAM,YACJ,KAAK,UACL,KAAK,UACL,KAAK,SACL,KAAK,QACL,KAAK;AACP,oBAAM,cAAsC;AAAA,gBAC1C,UAAU,KAAK,YAAY,KAAK;AAAA;AAAA,gBAEhC,QAAQ,cAAc,uBAAuB,SAAS;AAAA,gBACtD,OAAO,KAAK;AAAA;AAAA,gBAEZ,UAAU,KAAK;AAAA,cACjB;AACA,mCAAqB,KAAK,WAAW;AACrC,wBAAU,eAAe,WAAW;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ;AAER,cAAU,iBAAiB;AAAA,MACzB;AAAA,MACA,MAAM;AAAA,MACN,WAAW;AAAA,MACX,aAAa;AAAA,IACf,CAAC;AAED,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,gBAAgB,QAAQ;AAAA,EAC1B;AACF;;;ALrJA,OAAO,qBAAqB;AAsC5B,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AACxB,IAAM,8BACJ;AAEF,IAAI;AACF,EAAC,QAAgB,kBAAkB,EAAE;AACvC,QAAQ;AAAC;AAET,IAAM,OAAO,IAAIE,MAAK;AAGtB,IAAM,eAAe,CACnB,YACA,SACA,UACG;AACH,QAAM,UAAU,UAAU,WAAW,WAAW,KAAK,UAAU,KAAK;AACpE,aAAW,QAAQ,QAAQ,OAAO,SAAS,OAAO;AAAA;AAAA,CAAM,CAAC;AAC3D;AAEA,IAAM,uBAAuB,CAAC,qBAAuC;AACnE,eAAa,iBAAiB,YAAY,iBAAiB,SAAS;AAAA,IAClE,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AACH;AAEA,IAAM,qBAAqB,OACzB,SACA,YACA,MACA,qBACwB;AACxB,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,cAAc;AAAA,MAC9C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,aAAa,EAAE,eAAe,WAAW,IAAI,CAAC;AAAA,MACpD;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,2BAAqB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAO;AAAA,IACT,QAAQ;AACN,2BAAqB,gBAAgB;AACrC,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,yBAAqB,gBAAgB;AACrC,WAAO;AAAA,EACT;AACF;AAEA,IAAM,wBAAwB,CAC5B,kBACA,MACA,WACA,aACA,iBAA0B,SACvB;AACH,MAAI;AACF,QAAI,gBAAgB;AAElB,UAAI,aAAa,MAAM,QAAQ,SAAS,GAAG;AACzC,mBAAW,QAAQ,WAAW;AAE5B,gBAAM,oBAAoB,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACrF,2BAAiB,wBAAwB;AACzC,gBAAM,WAAW,KAAK,QAAQ,KAAK;AAGnC,2BAAiB,iBAAiB,IAAI,mBAAmB,QAAQ;AAEjE,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,IAAI;AAAA,kBACJ,MAAM;AAAA,kBACN,YAAY,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,kBACzC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,kBAClC,QAAQ;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,eAAe,MAAM,QAAQ,WAAW,GAAG;AAC7C,mBAAW,UAAU,aAAa;AAChC,gBAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAEjE,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV,IAAI;AAAA,kBACJ,YAAY;AAAA,kBACZ,QAAQ,OAAO,UAAU;AAAA,kBACzB,OAAQ,OAAe;AAAA,kBACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,gBACpC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,qBAAiB,aAAa,iBAAiB,aAAa,KAAK;AACjE,QAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,mBAAa,iBAAiB,YAAY,iBAAiB,SAAS;AAAA,QAClE,MAAM;AAAA,QACN,MAAM,iBAAiB;AAAA,QACvB;AAAA,QACA,YAAY,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UAC5C,MAAM,EAAE,QAAQ,EAAE;AAAA,UAClB,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;AAAA,QACjC,EAAE;AAAA,QACF,cAAc,eAAe,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UAChD,QAAQ,EAAE;AAAA,UACV,OAAQ,EAAU;AAAA,QACpB,EAAE;AAAA,QACF,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AAAA,EAAC;AACX;AAEA,IAAM,0BAA0B,OAC9B,OACA,YACA,UACA,kBACA,UACA,mBACA,aACA,iBACG;AAEH,QAAM,kBAAkB,CAAC,aAAyC;AAChE,UAAMC,QAAO,kBAAkB,QAAQ;AACvC,WAAOA,OAAM;AAAA,EACf;AAEA,QAAM,kBAAkC,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM;AACjE,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,EAAE,MAAM,UAAU,SAAS,EAAE,QAAQ;AAAA,MAC9C,KAAK;AACH,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,MAC5C,KAAK;AACH,eAAO,EAAE,MAAM,aAAa,SAAS,EAAE,QAAQ;AAAA,MACjD;AACE,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,SAAO,QAAQ,iBAAiB;AAC9B,QAAI,kBAAkB;AACtB,UAAM,qBAA4B,CAAC;AACnC,UAAM,uBAA8B,CAAC;AAErC,QAAI;AACJ,QAAI,iBAAiB;AACrB,QAAI,qBAAqB;AACzB,QAAI,WAAgB;AAGpB,UAAM,sBAAsB,CAAC,UAAuB;AAClD,UAAI,MAAM,SAAS,OAAO,MAAM,UAAU,UAAU;AAClD,cAAM,WAAW,MAAM;AACvB,YAAI,SAAS,MAAM,OAAO,QAAS,QAAO,SAAS,KAAK,MAAM;AAC9D,YAAI,SAAS,cAAc;AACzB,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,SAAS,YAAY;AAC/C,gBAAI,OAAO,OAAO,QAAS,QAAO,OAAO,MAAM;AAAA,UACjD,QAAQ;AAAA,UAAC;AAAA,QACX;AACA,YAAI,SAAS,QAAS,QAAO,SAAS;AAAA,MACxC;AACA,UAAI,MAAM,iBAAiB,MAAO,QAAO,MAAM,MAAM;AACrD,aAAO,OAAO,MAAM,SAAS,MAAM,WAAW,wBAAwB;AAAA,IACxE;AAEA,mBAAe,WAAW;AAAA,MACxB;AAAA,MACA,QACE,gBAAgB;AAAA,MAClB,aAAa,eAAe,gCAAgC,QAAQ;AAAA,MACpE,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS,CAAC,UAAU;AAClB,yBAAiB;AACjB,6BAAqB,oBAAoB,KAAK;AAAA,MAChD;AAAA,MACA,SAAS,OAAO,UAAU;AACxB,YAAI;AACF,kBAAQ,MAAM,MAAM,MAAM;AAAA,YACxB,KAAK;AAAA,YACL,KAAK,mBAAmB;AACtB,oBAAM,OAAO,MAAM,MAAM;AACzB,kBAAI,MAAM;AACR,mCAAmB;AACnB;AAAA,kBACE,iBAAiB;AAAA,kBACjB,iBAAiB;AAAA,kBACjB;AAAA,oBACE,MAAM;AAAA,oBACN,SAAS;AAAA,kBACX;AAAA,gBACF;AAAA,cACF;AACA;AAAA,YACF;AAAA,YACA,KAAK,oBAAoB;AAEvB;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAEhB,oBAAM,oBAAoB,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACrF,+BAAiB,wBAAwB;AACzC,oBAAM,OACH,MAAM,MAAc,YAAa,MAAM,MAAc;AACxD,oBAAM,aACH,MAAM,MAAc,SACpB,MAAM,MAAc,cACpB,MAAM,MAAc,QACrB,CAAC;AAGH,+BAAiB,iBAAiB,IAAI,mBAAmB,IAAI;AAE7D,iCAAmB,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACpD;AAAA,gBACE,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,kBACE,MAAM;AAAA,kBACN,UAAU;AAAA,oBACR,IAAI;AAAA,oBACJ;AAAA,oBACA;AAAA,oBACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,oBAClC,QAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,cACF;AACA;AAAA,YACF;AAAA,YACA,KAAK,eAAe;AAClB,oBAAM,SACH,MAAM,MAAc,UACpB,MAAM,MAAc,UACpB,MAAM,MAAc;AACvB,oBAAM,oBACJ,iBAAiB,yBACjB,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAG7D,oBAAM,WACJ,iBAAiB,iBAAiB,IAAI,iBAAiB;AACzD,oBAAM,WAAW,WAAW,gBAAgB,QAAQ,IAAI;AAExD,mCAAqB,KAAK,EAAE,OAAO,CAAC;AACpC;AAAA,gBACE,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,kBACE,MAAM;AAAA,kBACN,YAAY;AAAA,oBACV,IAAI;AAAA,oBACJ,YAAY;AAAA,oBACZ;AAAA,oBACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,oBAClC;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA;AAAA,YACF;AAAA,YACA;AACE;AAAA,UACJ;AAAA,QACF,SAAS,YAAY;AACnB,2BAAiB;AACjB,+BACE,sBAAsB,QAClB,WAAW,UACX;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI;AACF,YAAM,aAAa,cAAc;AAGjC,UAAI,gBAAgB;AAClB,cAAM,IAAI,MAAM,kBAAkB;AAAA,MACpC;AAEA,iBAAW,MAAM,aAAa;AAG9B,UAAI,SAAS,OAAO;AAClB,cAAM,SAAS;AAAA,MACjB;AAEA,UAAI,SAAS,+BAA+B,QAAQ,OAAO;AACzD,cAAM,IAAI;AAAA,UACR,SAAS,8BAA8B,OAAO,MAAM,WAClD;AAAA,QACJ;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAEd,YAAM,eAAe,sBAAsB,oBAAoB,KAAK;AAEpE,mBAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,QACnE,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAED;AAAA,QACE,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB;AAAA,MACF;AAEA,iBAAW;AACX;AACA;AAAA,IACF;AAGA,QAAI,CAAC,gBAAgB,UAAU;AAC7B;AACA;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,mBAAoB,UAAU,YAAY,CAAC;AACjD,QAAI,iBAAiB,QAAQ;AAC3B,qBAAe,KAAK,GAAG,gBAAgB;AAIvC,iBAAW,KAAK,kBAAkB;AAChC,YAAK,EAAU,SAAS,QAAQ;AAC9B,gBAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACjE,gBAAM,QAAS,EAAU;AAGzB,gBAAM,WACJ,iBAAiB,iBAAiB,IAAI,iBAAiB;AACzD,gBAAM,WAAW,WAAW,gBAAgB,QAAQ,IAAI;AAExD,+BAAqB,KAAK,EAAE,QAAQ,MAAM,CAAC;AAC3C,uBAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,YACnE,MAAM;AAAA,YACN,YAAY;AAAA,cACV,IAAI;AAAA,cACJ,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,cAClC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA;AAGA,UAAM,eAAe,UAAU,gBAAgB;AAC/C,UAAM,iBACJ,iBAAiB,gBAChB,gBAAgB,WAAW,KAAK,qBAAqB,SAAS;AAEjE,QAAI,CAAC,eAAgB;AAAA,EACvB;AAGA,MAAI,CAAC,UAAU;AACb,iBAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,MACnE,MAAM;AAAA,IACR,CAAC;AAED;AAAA,MACE,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,wBAAwB,OAC5B,UACA,kBACAC,mBACA,SACA,SACA,YACA,oBACkB;AAElB,QAAM,kBAAkC,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM;AACjE,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,eAAO,EAAE,MAAM,UAAU,SAAS,EAAE,QAAQ;AAAA,MAC9C,KAAK;AACH,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,MAC5C,KAAK;AACH,eAAO,EAAE,MAAM,aAAa,SAAS,EAAE,QAAQ;AAAA,MACjD;AACE,eAAO,EAAE,MAAM,QAAQ,SAAS,EAAE,QAAQ;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,QAAM,oBACJ,MAAM,QAAQ,eAAe,KAAK,gBAAgB,SAAS,IACvD,kBACAA,kBAAiB,YAAY;AAEnC,QAAM,iBAAiB,MAAMA,kBAAiB;AAAA,IAC5C,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,EACrD;AAEA,QAAM,mBAA4C,CAAC;AACnD,QAAM,WAAkB,CAAC;AAEzB,aAAW,CAAC,MAAMD,KAAI,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,QAAI,CAACA,MAAM;AAEX,UAAM,WACHA,MAAa,cACb,kBAAkB,WAAW,IAAI,kBAAkB,CAAC,IAAI;AAE3D,QAAI,CAAC,iBAAiB,QAAQ,GAAG;AAC/B,uBAAiB,QAAQ,IAAI,CAAC;AAAA,IAChC;AACA,qBAAiB,QAAQ,EAAE,IAAI,IAAIA;AAEnC,UAAM,SAAUA,MAAa;AAC7B,QAAI;AAEJ,QAAI,QAAQ;AACV,UACE,OAAO,WAAW,YAClB,WAAW,QACX,gBAAiB,QACjB;AACA,2BAAoB,OAAe;AAAA,MAIrC,OAAO;AACL,YAAI;AACF,6BAAmB,gBAAgB,MAAM;AAAA,QAC3C,SAAS,KAAK;AACZ,kBAAQ;AAAA,YACN,sDAAsD,IAAI;AAAA,YAC1D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,aAAcA,MAAa;AAAA,MAC3B,aAAa,oBAAoB;AAAA,QAC/B,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,sBAAsB;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,eAAe,CAAC,SAA+B;AAEnD,UAAM,oBAAoB,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACrF,qBAAiB,wBAAwB;AAGzC,qBAAiB,iBAAiB,IAAI,mBAAmB,KAAK,IAAI;AAElE,iBAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,MACnE,MAAM;AAAA,MACN,UAAU;AAAA,QACR,IAAI;AAAA,QACJ,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,CAAC,WAAmC;AACzD,UAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACjE,iBAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,MACnE,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI;AAAA,QACJ,YAAY;AAAA,QACZ,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,QACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,UAAU,OAAO;AAAA;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,uBAAuB;AAAA,IAC3B,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,cAAc,OAAO,YAAY;AAC/B,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ,IAAI;AACvD,6BAAqB,gBAAgB;AACrC,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,kBAAkB,OAAOE,cAAa;AACpC,YAAM,6BAA6BA,WAAU;AAAA,QAC3C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,IACA,UAAU;AAAA,MACR,iBAAiB,CAAC,SAAS;AACzB,qBAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,UACnE,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,MACA,YAAY,CAAC,SAAS;AACpB,qBAAa,IAAI;AAAA,MACnB;AAAA,MACA,cAAc,CAAC,WAAW;AACxB,uBAAe,MAAM;AAAA,MACvB;AAAA,MACA,gBAAgB,CAAC,EAAE,MAAM,WAAW,YAAY,MAAM;AACpD;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,IAAI,CAAC,YAAY;AAAA,YAC3B,QAAQ,OAAO,UAAU;AAAA,YACzB,OAAO,OAAO;AAAA,UAChB,EAAE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,eAAa,iBAAiB,YAAY,iBAAiB,SAAU;AAAA,IACnE,MAAM;AAAA,EACR,CAAC;AACD;AAAA,IACE,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB;AAAA,EACF;AACF;AAIA,KAAK,KAAK,KAAK,OAAO,MAAM;AAC1B,QAAMD,oBAAmB,EAAE;AAC3B,MAAI;AACF,UAAM,cAA2B,MAAM,EAAE,IAAI,KAAK;AAClD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,QAAI,WAAW,wBAAwB;AACrC,UAAI,CAAC,WAAW;AACd,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAUA,kBAAiB;AAAA,QAC/B;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,IACjC;AAGA,QAAI,CAAC,UAAU;AACb,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,gBACJ,OAAO,MACP,sBAAsB,MAAM,EAAE,KAC9B,QAAQ,YAAY,qBAAqB;AAE3C,QAAI,CAAC,kBAAkB,CAAC,OAAO,MAAM,CAAC,SAAS;AAC7C,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,CAAC,QAAQ,IAAI,iBAAiB;AACjD,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,IAAIE,aAAY;AAChC,UAAM,aAAa,EAAE,IAAI,OAAO,eAAe,KAAK;AACpD,UAAM,iBAAiB,IAAI,eAAe;AAAA,MACxC,MAAM,MAAM,YAAY;AACtB,cAAM,mBAAqC;AAAA,UACzC;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ,uBAAuB;AAAA,UACvB,WAAW;AAAA,UACX,kBAAkB,oBAAI,IAAI;AAAA,QAC5B;AAEA,QAAAF,kBAAiB,uBAAuB,OAAO,YAAY;AACzD,gBAAM,qBAAqB;AAAA,YACzB,SAAS,QAAQ;AAAA,YACjB,iBAAiB,QAAQ;AAAA,UAC3B;AAGA,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D;AAAA,cACE,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,QAAQ;AAAA,gBACnB,SAAS,mBAAmB;AAAA,gBAC5B,QAAQ,mBAAmB;AAAA,gBAC3B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,cACpC;AAAA,YACF;AAAA,UACF;AAGA,iBAAO,IAAI,QAA6B,CAACG,UAAS,WAAW;AAE3D,kBAAM,UAAU,WAAW,MAAM;AAC/B,qBAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,YACzC,GAAG,mBAAmB;AAGtB,YAAAH,kBAAiB,uBAAuB,EAAE,IAAI,QAAQ,WAAW;AAAA,cAC/D,SAAS,CAACI,cAAkC;AAC1C,6BAAa,OAAO;AACpB,gBAAAD,SAAQC,SAAQ;AAAA,cAClB;AAAA,cACA,QAAQ,CAAC,UAAe;AACtB,6BAAa,OAAO;AACpB,uBAAO,KAAK;AAAA,cACd;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH,CAAC;AAED,YAAI;AACF,cAAI,eAAe;AACjB,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACAJ;AAAA,cACA,QAAQ,IAAI;AAAA,cACZ,MAAO;AAAA,cACP;AAAA,cACA,YAAY;AAAA,YACd;AAAA,UACF,OAAO;AAGL,kBAAM,WAAW,MAAMA,kBAAiB;AAAA,cACtC,YAAY;AAAA,YACd;AAEA,kBAAM,WAAW;AAAA,cACf;AAAA,cACA,UAAU;AAAA,cACV;AAAA,cACA;AAAA,YACF;AACA,kBAAM;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,uBAAa,YAAY,SAAS;AAAA,YAChC,MAAM;AAAA,YACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,UAClD,CAAC;AAAA,QACH,UAAE;AAEA,UAAAA,kBAAiB,yBAAyB;AAC1C,qBAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS,gBAAgB;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,iCAAiC,KAAK;AAEpD,QAAI;AACF,MAAAA,kBAAiB,yBAAyB;AAAA,IAC5C,SAAS,cAAc;AACrB,cAAQ,MAAM,oCAAoC,YAAY;AAAA,IAChE;AAEA,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,eAAQ;;;AM13Bf,SAAS,QAAAK,aAAY;AAGrB,IAAM,QAAQ,IAAIA,MAAK;AAMvB,MAAM,IAAI,aAAa,OAAO,MAAM;AAClC,MAAI;AACF,UAAM,MAAM,EAAE,IAAI,MAAM,KAAK;AAE7B,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,IACvD;AAGA,QAAI;AACJ,QAAI;AACF,oBAAc,IAAI,IAAI,GAAG;AACzB,UAAI,YAAY,aAAa,UAAU;AACrC,eAAO,EAAE,KAAK,EAAE,OAAO,8BAA8B,GAAG,GAAG;AAAA,MAC7D;AAAA,IACF,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,OAAO,qBAAqB,GAAG,GAAG;AAAA,IACpD;AAGA,UAAM,WAAW,MAAM,MAAM,YAAY,SAAS,GAAG;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,EAAE;AAAA,QACP;AAAA,UACE,OAAO,mCAAmC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QAClF;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,WAAY,MAAM,SAAS,KAAK;AAGtC,WAAO,EAAE,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,OACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,gBAAQ;;;AC9Df,SAAS,QAAAC,aAAY;AAGrB,IAAM,WAAW,IAAIC,MAAK;AAG1B,SAAS,KAAK,WAAW,OAAO,MAAM;AACpC,MAAI;AACF,UAAM,EAAE,SAAS,IAAK,MAAM,EAAE,IAAI,KAAK;AACvC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtD;AAEA,UAAMC,OAAM,EAAE;AAEd,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,QAAI;AACF,OAAC,aAAa,iBAAiB,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,QAChEA,KAAI,UAAU,QAAQ;AAAA,QACtBA,KAAI,cAAc,QAAQ;AAAA,QAC1BA,KAAI,YAAY,QAAQ;AAAA,MAC1B,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UACE,QAAQ,SAAS,eAAe,KAChC,QAAQ,SAAS,oBAAoB,GACrC;AACA,eAAO,EAAE,KAAK,EAAE,OAAO,WAAW,QAAQ,qBAAqB,GAAG,GAAG;AAAA,MACvE;AACA,YAAM;AAAA,IACR;AAEA,UAAMC,SAAQ,YAAY,MAAM,IAAI,CAACC,WAAU;AAAA,MAC7C,MAAMA,MAAK;AAAA,MACX,aAAaA,MAAK;AAAA,MAClB,aAAaA,MAAK;AAAA,MAClB,cAAcA,MAAK;AAAA,IACrB,EAAE;AAEF,UAAMC,aAAY,gBAAgB,UAAU,IAAI,CAAC,cAAc;AAAA,MAC7D,KAAK,SAAS;AAAA,MACd,MAAM,SAAS;AAAA,MACf,aAAa,SAAS;AAAA,MACtB,UAAU,SAAS;AAAA,IACrB,EAAE;AAEF,UAAMC,WAAU,cAAc,QAAQ,IAAI,CAAC,YAAY;AAAA,MACrD,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,WAAW,OAAO;AAAA,IACpB,EAAE;AAEF,WAAO,EAAE,KAAK;AAAA,MACZ;AAAA,MACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,OAAAH;AAAA,MACA,WAAAE;AAAA,MACA,SAAAC;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,EACnC;AACF,CAAC;AAED,IAAO,iBAAQ;;;ACrEf,SAAS,QAAAC,aAAY;AAGrB,IAAM,cAAc,IAAIA,MAAK;AAitB7B,IAAO,sBAAQ;;;ACptBf,SAAS,QAAAC,cAAY;AACrB,SAAS,KAAAC,UAAS;;;ACDlB,SAAS,iBAAmC;AAC5C,SAAS,cAAAC,mBAAiE;;;ACDnE,IAAM,UAAU;;;ACSvB,IAAI,SAAmB,CAAC;AACxB,IAAI,YAAsB,CAAC;AAC3B,IAAI,MAAM;AAEV,IAAI,OAAO;AACX,KAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,IAAI,KAAK,EAAE,GAAG;AAC/C,SAAO,CAAC,IAAI,KAAK,CAAC;AAClB,YAAU,KAAK,WAAW,CAAC,CAAC,IAAI;AAClC;AAHS;AAAO;AAOhB,UAAU,IAAI,WAAW,CAAC,CAAC,IAAI;AAC/B,UAAU,IAAI,WAAW,CAAC,CAAC,IAAI;AAE/B,SAAS,QAAQ,KAAa;AAC5B,MAAI,MAAM,IAAI;AAEd,MAAI,MAAM,IAAI,GAAG;AACf,UAAM,IAAI,MAAM,gDAAgD;EAClE;AAIA,MAAI,WAAW,IAAI,QAAQ,GAAG;AAC9B,MAAI,aAAa,GAAI,YAAW;AAEhC,MAAI,kBAAkB,aAAa,MAAM,IAAI,IAAK,WAAW;AAE7D,SAAO,CAAC,UAAU,eAAe;AACnC;AAWA,SAAS,YAAY,MAAc,UAAkB,iBAAyB;AAC5E,UAAS,WAAW,mBAAmB,IAAK,IAAI;AAClD;AAGO,SAAS,YAAY,KAAyB;AACnD,MAAI;AACJ,MAAI,OAAO,QAAQ,GAAG;AACtB,MAAI,WAAW,KAAK,CAAC;AACrB,MAAI,kBAAkB,KAAK,CAAC;AAE5B,MAAIC,OAAM,IAAI,IAAI,YAAY,KAAK,UAAU,eAAe,CAAC;AAE7D,MAAI,UAAU;AAGd,MAAI,MAAM,kBAAkB,IAAI,WAAW,IAAI;AAE/C,MAAI;AACJ,OAAK,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC3B,UACG,UAAU,IAAI,WAAW,CAAC,CAAC,KAAK,KAChC,UAAU,IAAI,WAAW,IAAI,CAAC,CAAC,KAAK,KACpC,UAAU,IAAI,WAAW,IAAI,CAAC,CAAC,KAAK,IACrC,UAAU,IAAI,WAAW,IAAI,CAAC,CAAC;AACjC,IAAAA,KAAI,SAAS,IAAK,OAAO,KAAM;AAC/B,IAAAA,KAAI,SAAS,IAAK,OAAO,IAAK;AAC9B,IAAAA,KAAI,SAAS,IAAI,MAAM;EACzB;AAEA,MAAI,oBAAoB,GAAG;AACzB,UACG,UAAU,IAAI,WAAW,CAAC,CAAC,KAAK,IAChC,UAAU,IAAI,WAAW,IAAI,CAAC,CAAC,KAAK;AACvC,IAAAA,KAAI,SAAS,IAAI,MAAM;EACzB;AAEA,MAAI,oBAAoB,GAAG;AACzB,UACG,UAAU,IAAI,WAAW,CAAC,CAAC,KAAK,KAChC,UAAU,IAAI,WAAW,IAAI,CAAC,CAAC,KAAK,IACpC,UAAU,IAAI,WAAW,IAAI,CAAC,CAAC,KAAK;AACvC,IAAAA,KAAI,SAAS,IAAK,OAAO,IAAK;AAC9B,IAAAA,KAAI,SAAS,IAAI,MAAM;EACzB;AAEA,SAAOA;AACT;AAEA,SAAS,gBAAgB,KAAa;AACpC,SACE,OAAQ,OAAO,KAAM,EAAI,IACzB,OAAQ,OAAO,KAAM,EAAI,IACzB,OAAQ,OAAO,IAAK,EAAI,IACxB,OAAO,MAAM,EAAI;AAErB;AAEA,SAAS,YAAY,OAAmB,OAAe,KAAa;AAClE,MAAI;AACJ,MAAI,SAAS,CAAC;AACd,WAAS,IAAI,OAAO,IAAI,KAAK,KAAK,GAAG;AACnC,WACI,MAAM,CAAC,KAAK,KAAM,aAClB,MAAM,IAAI,CAAC,KAAK,IAAK,UACtB,MAAM,IAAI,CAAC,IAAI;AAClB,WAAO,KAAK,gBAAgB,GAAG,CAAC;EAClC;AACA,SAAO,OAAO,KAAK,EAAE;AACvB;AAGO,SAAS,cAAc,OAA2B;AACvD,MAAI;AACJ,MAAI,MAAM,MAAM;AAChB,MAAI,aAAa,MAAM;AACvB,MAAI,QAAQ,CAAC;AACb,MAAI,iBAAiB;AAGrB,WAAS,IAAI,GAAG,OAAO,MAAM,YAAY,IAAI,MAAM,KAAK,gBAAgB;AACtE,UAAM;MACJ;QACE;QACA;QACA,IAAI,iBAAiB,OAAO,OAAO,IAAI;MACzC;IACF;EACF;AAGA,MAAI,eAAe,GAAG;AACpB,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,KAAK,OAAO,OAAO,CAAC,IAAI,OAAQ,OAAO,IAAK,EAAI,IAAI,IAAI;EAChE,WAAW,eAAe,GAAG;AAC3B,WAAO,MAAM,MAAM,CAAC,KAAK,KAAK,MAAM,MAAM,CAAC;AAC3C,UAAM;MACJ,OAAO,OAAO,EAAE,IACd,OAAQ,OAAO,IAAK,EAAI,IACxB,OAAQ,OAAO,IAAK,EAAI,IACxB;IACJ;EACF;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;;;ACrJO,SAAS,UACd,MACuB;AACvB,MAAI,SAAS,QAAW;AACtB,WAAO,CAAC;EACV;AACA,MAAI,CAAC,eAAe,IAAI,GAAG;AACzB,UAAM,IAAI;MACR,mEACE,IACF;IACF;EACF;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,eAAuB;AAG3D,MAAI,OAAO,kBAAkB,aAAa;AACxC,UAAM,IAAI;MACR;IACF;EACF;AACA,MAAI,OAAO,kBAAkB,UAAU;AACrC,UAAM,IAAI;MACR,qCAAqC,aAAoB;IAC3D;EACF;AACA,MACE,EAAE,cAAc,WAAW,OAAO,KAAK,cAAc,WAAW,QAAQ,IACxE;AACA,UAAM,IAAI;MACR,+EAA+E,aAAa;IAC9F;EACF;AAKA,MAAI;AACF,QAAI,IAAI,aAAa;EACvB,QAAQ;AACN,UAAM,IAAI;MACR,gCAAgC,aAAa;IAC/C;EACF;AAGA,MAAI,cAAc,SAAS,cAAc,GAAG;AAC1C,UAAM,IAAI;MACR,gCAAgC,aAAa;IAC/C;EACF;AACF;AAKO,SAAS,eAAe,OAAgB;AAC7C,QAAM,WAAW,OAAO,UAAU;AAClC,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,QAAM,WACJ,cAAc,QACd,cAAc,OAAO;;EAGrB,WAAW,aAAa,SAAS;AACnC,SAAO,YAAY;AACrB;;;ACjEA,IAAM,gBAAgB;AAEtB,IAAM,YAAY,OAAO,sBAAsB;AAC/C,IAAM,YAAY,OAAO,qBAAqB;AAC9C,IAAM,OAAO,OAAO,GAAG;AACvB,IAAM,QAAQ,OAAO,GAAG;AACxB,IAAM,cAAc,OAAO,KAAK;AAkEhC,SAAS,UAAU,GAAW;AAC5B,SAAO,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,KAAK,OAAO,GAAG,GAAG,EAAE;AAClE;AAEO,SAAS,mBAAmB,OAAuB;AAExD,MAAI,QAAQ,MAAM;AAChB,aAAS,YAAY;EACvB;AACA,MAAI,MAAM,MAAM,SAAS,EAAE;AAC3B,MAAI,IAAI,SAAS,MAAM,EAAG,OAAM,MAAM;AAEtC,QAAM,QAAQ,IAAI,WAAW,IAAI,YAAY,CAAC,CAAC;AAC/C,MAAI,IAAI;AACR,aAAW,WAAW,IAAI,MAAM,OAAO,EAAG,QAAQ,GAAG;AACnD,UAAM,IAAI,CAAC,SAAS,SAAS,EAAE,CAAC,GAAG,GAAG;AACtC,cAAU;EACZ;AACA,SAAc,cAAc,KAAK;AACnC;AAEO,SAAS,mBAAmB,SAAyB;AAC1D,QAAM,eAAsB,YAAY,OAAO;AAC/C,MAAI,aAAa,eAAe,GAAG;AACjC,UAAM,IAAI;MACR,YAAY,aAAa,UAAU;IACrC;EACF;AACA,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,aAAW,QAAQ,cAAc;AAC/B,aAAS,OAAO,IAAI,IAAI,eAAe;AACvC;EACF;AACA,MAAI,QAAQ,WAAW;AACrB,aAAS,YAAY;EACvB;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAuB;AAC1D,MAAI,QAAQ,aAAa,YAAY,OAAO;AAC1C,UAAM,IAAI;MACR,UAAU,KAAK;IACjB;EACF;AACA,QAAM,SAAS,IAAI,YAAY,CAAC;AAChC,MAAI,SAAS,MAAM,EAAE,YAAY,GAAG,OAAO,IAAI;AAC/C,SAAc,cAAc,IAAI,WAAW,MAAM,CAAC;AACpD;AAEO,SAAS,qBAAqB,SAAyB;AAC5D,QAAM,eAAsB,YAAY,OAAO;AAC/C,MAAI,aAAa,eAAe,GAAG;AACjC,UAAM,IAAI;MACR,YAAY,aAAa,UAAU;IACrC;EACF;AACA,QAAM,eAAe,IAAI,SAAS,aAAa,MAAM;AACrD,SAAO,aAAa,YAAY,GAAG,IAAI;AACzC;AAGO,IAAM,iBAAkB,SAAS,UAAkB,cACtD,uBACA;AACG,IAAM,iBAAkB,SAAS,UAAkB,cACtD,uBACA;AAEJ,IAAM,qBAAqB;AAE3B,SAAS,oBAAoB,GAAW;AACtC,MAAI,EAAE,SAAS,oBAAoB;AACjC,UAAM,IAAI;MACR,cAAc,CAAC,sCAAsC,kBAAkB;IACzE;EACF;AACA,MAAI,EAAE,WAAW,GAAG,GAAG;AACrB,UAAM,IAAI,MAAM,cAAc,CAAC,wCAAwC;EACzE;AACA,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AACpC,UAAM,WAAW,EAAE,WAAW,CAAC;AAE/B,QAAI,WAAW,MAAM,YAAY,KAAK;AACpC,YAAM,IAAI;QACR,cAAc,CAAC,2BAA2B,EAAE,CAAC,CAAC;MAChD;IACF;EACF;AACF;AAcO,SAAS,aAAa,OAAyB;AACpD,MAAI,UAAU,MAAM;AAClB,WAAO;EACT;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO;EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAACC,WAAU,aAAaA,MAAK,CAAC;EACjD;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,sBAAsB,KAAY,EAAE;EACtD;AACA,QAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,MAAM,QAAQ,CAAC,EAAE,CAAC;AACxB,QAAI,QAAQ,UAAU;AACpB,UAAI,OAAO,MAAM,WAAW,UAAU;AACpC,cAAM,IAAI,MAAM,6BAA6B,KAAY,EAAE;MAC7D;AACA,aAAc,YAAY,MAAM,MAAM,EAAE;IAC1C;AACA,QAAI,QAAQ,YAAY;AACtB,UAAI,OAAO,MAAM,aAAa,UAAU;AACtC,cAAM,IAAI,MAAM,+BAA+B,KAAY,EAAE;MAC/D;AACA,aAAO,eAAe,MAAM,QAAQ;IACtC;AACA,QAAI,QAAQ,UAAU;AACpB,UAAI,OAAO,MAAM,WAAW,UAAU;AACpC,cAAM,IAAI,MAAM,6BAA6B,KAAY,EAAE;MAC7D;AACA,YAAM,aAAoB,YAAY,MAAM,MAAM;AAClD,UAAI,WAAW,eAAe,GAAG;AAC/B,cAAM,IAAI;UACR,YAAY,WAAW,UAAU;QACnC;MACF;AACA,YAAM,iBAAiB,IAAI,SAAS,WAAW,MAAM;AACrD,YAAM,QAAQ,eAAe,WAAW,GAAG,aAAa;AACxD,UAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAM,IAAI,MAAM,SAAS,KAAK,gCAAgC;MAChE;AACA,aAAO;IACT;AACA,QAAI,QAAQ,QAAQ;AAClB,YAAM,IAAI;QACR;MACF;IACF;AACA,QAAI,QAAQ,QAAQ;AAClB,YAAM,IAAI;QACR;MACF;IACF;EACF;AACA,QAAM,MAAgC,CAAC;AACvC,aAAW,CAAC,GAAGC,EAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,wBAAoB,CAAC;AACrB,QAAI,CAAC,IAAI,aAAaA,EAAC;EACzB;AACA,SAAO;AACT;AAEO,SAAS,uBAAuB,OAAY;AACjD,SAAO,KAAK,UAAU,OAAO,CAAC,MAAMD,WAAU;AAC5C,QAAIA,WAAU,QAAW;AAMvB,aAAO;IACT;AACA,QAAI,OAAOA,WAAU,UAAU;AAE7B,aAAO,GAAGA,OAAM,SAAS,CAAC;IAC5B;AACA,WAAOA;EACT,CAAC;AACH;AAEA,SAAS,qBACP,OACA,eACA,SACA,0BACW;AACX,MAAI,UAAU,QAAW;AACvB,UAAM,cACJ,WACA,qBAAqB,OAAO,uBAAuB;MACjD;IACF,CAAC;AACH,UAAM,IAAI;MACR,wCAAwC,WAAW;IACrD;EACF;AACA,MAAI,UAAU,MAAM;AAClB,WAAO;EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,QAAQ,aAAa,YAAY,OAAO;AAC1C,YAAM,IAAI;QACR,UAAU,KAAK;MACjB;IACF;AACA,WAAO,EAAE,UAAU,eAAe,KAAK,EAAE;EAC3C;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,UAAU,KAAK,GAAG;AACpB,YAAM,SAAS,IAAI,YAAY,CAAC;AAChC,UAAI,SAAS,MAAM,EAAE,WAAW,GAAG,OAAO,aAAa;AACvD,aAAO,EAAE,QAAe,cAAc,IAAI,WAAW,MAAM,CAAC,EAAE;IAChE,OAAO;AACL,aAAO;IACT;EACF;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO;EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;EACT;AACA,MAAI,iBAAiB,aAAa;AAChC,WAAO,EAAE,QAAe,cAAc,IAAI,WAAW,KAAK,CAAC,EAAE;EAC/D;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM;MAAI,CAACA,QAAO,MACvB,qBAAqBA,QAAO,eAAe,UAAU,IAAI,CAAC,KAAK,KAAK;IACtE;EACF;AACA,MAAI,iBAAiB,KAAK;AACxB,UAAM,IAAI;MACR,+BAA+B,SAAS,OAAO,CAAC,GAAG,KAAK,GAAG,aAAa;IAC1E;EACF;AACA,MAAI,iBAAiB,KAAK;AACxB,UAAM,IAAI;MACR,+BAA+B,SAAS,OAAO,CAAC,GAAG,KAAK,GAAG,aAAa;IAC1E;EACF;AAEA,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,UAAM,UAAU,OAAO,aAAa;AACpC,UAAM,WAAW,UAAU,GAAG,OAAO,MAAM;AAC3C,UAAM,IAAI;MACR,+BAA+B,SAAS,UAAU,OAAO,aAAa;IACxE;EACF;AAEA,QAAM,MAAoC,CAAC;AAC3C,QAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,UAAQ,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,MAAO,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK,CAAE;AACzE,aAAW,CAAC,GAAGC,EAAC,KAAK,SAAS;AAC5B,QAAIA,OAAM,QAAW;AACnB,0BAAoB,CAAC;AACrB,UAAI,CAAC,IAAI,qBAAqBA,IAAG,eAAe,UAAU,IAAI,CAAC,IAAI,KAAK;IAC1E,WAAW,0BAA0B;AACnC,0BAAoB,CAAC;AACrB,UAAI,CAAC,IAAI;QACPA;QACA;QACA,UAAU,IAAI,CAAC;MACjB;IACF;EACF;AACA,SAAO;AACT;AAEA,SAAS,+BACP,SACA,UACA,OACA,eACA;AACA,MAAI,SAAS;AACX,WAAO,GAAG,QAAQ,GAAG;MACnB;IACF,CAAC,oDAAoD,OAAO,uBAAuB;MACjF;IACF,CAAC;EACH,OAAO;AACL,WAAO,GAAG,QAAQ,GAAG;MACnB;IACF,CAAC;EACH;AACF;AAIA,SAAS,gCACP,OACA,eACA,SACW;AACX,MAAI,UAAU,QAAW;AACvB,WAAO,EAAE,YAAY,KAAK;EAC5B,OAAO;AACL,QAAI,kBAAkB,QAAW;AAE/B,YAAM,IAAI;QACR,uCAAuC;UACrC;QACF,CAAC;MACH;IACF;AACA,WAAO,qBAAqB,OAAO,eAAe,SAAS,KAAK;EAClE;AACF;AAcO,SAAS,aAAa,OAAyB;AACpD,SAAO,qBAAqB,OAAO,OAAO,IAAI,KAAK;AACrD;;;;;;ACjaA,IAAA;AAAA,IAAA;AAEA,IAAM,oBAAoB,OAAO,IAAI,aAAa;AAE3C,IAAM,cAAN,eAA+C,KAAA,OAGnD,KAAA,mBAHmD,IAAM;EAK1D,YAAY,MAAa;AACvB,UAAM,OAAO,SAAS,WAAW,OAAO,uBAAuB,IAAI,CAAC;AALtE,kBAAA,MAAA,QAAO,aAAA;AACP,kBAAA,MAAA,MAAA;AACA,kBAAA,MAAC,IAAqB,IAAA;AAIpB,SAAK,OAAO;EACd;AACF;;;AC6DA,IAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;AACnD,IAAM,SAAS,IAAI;AACnB,IAAM,SAAS,IAAI;;;;;;ACtEnB,IAAM,aAAa;AAInB,SAAS,kBAAkB,QAAiB;AAC1C,UAAQ,QAAQ;IACd,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;EACX;AACF;AAgBO,IAAM,gBAAN,MAAsC;EAO3C,YAAY,SAA+B;AAN3C,IAAAC,eAAA,MAAQ,iBAAA;AAIR,IAAAA,eAAA,MAAQ,UAAA;AAGN,SAAK,kBAAkB,CAAC;AACxB,SAAK,WAAW,QAAQ;EAC1B;EAEA,mBACE,MACY;AACZ,QAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AACnD,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAI,KAAK,gBAAgB,EAAE,MAAM,QAAW;AAC1C;MACF;AACA,WAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;IACjD;AACA,SAAK,gBAAgB,EAAE,IAAI;AAC3B,WAAO,MAAM;AACX,aAAO,KAAK,gBAAgB,EAAE;IAChC;EACF;EAEA,cAAc,MAAa;AACzB,QAAI,KAAK,UAAU;AACjB,iBAAW,QAAQ,OAAO,OAAO,KAAK,eAAe,GAAG;AACtD,aAAK,SAAS,IAAG,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,GAAG,IAAI;MACtD;IACF;EACF;EAEA,OAAO,MAAa;AAClB,eAAW,QAAQ,OAAO,OAAO,KAAK,eAAe,GAAG;AACtD,WAAK,QAAQ,GAAG,IAAI;IACtB;EACF;EAEA,QAAQ,MAAa;AACnB,eAAW,QAAQ,OAAO,OAAO,KAAK,eAAe,GAAG;AACtD,WAAK,QAAQ,GAAG,IAAI;IACtB;EACF;EAEA,SAAS,MAAa;AACpB,eAAW,QAAQ,OAAO,OAAO,KAAK,eAAe,GAAG;AACtD,WAAK,SAAS,GAAG,IAAI;IACvB;EACF;AACF;AAEO,SAAS,yBAAyB,SAE9B;AACT,QAAMC,UAAS,IAAI,cAAc,OAAO;AACxC,EAAAA,QAAO,mBAAmB,CAAC,UAAU,SAAS;AAC5C,YAAQ,OAAO;MACb,KAAK;AACH,gBAAQ,MAAM,GAAG,IAAI;AACrB;MACF,KAAK;AACH,gBAAQ,IAAI,GAAG,IAAI;AACnB;MACF,KAAK;AACH,gBAAQ,KAAK,GAAG,IAAI;AACpB;MACF,KAAK;AACH,gBAAQ,MAAM,GAAG,IAAI;AACrB;MACF,SAAS;AACP;AACA,gBAAQ,IAAI,GAAG,IAAI;MACrB;IACF;EACF,CAAC;AACD,SAAOA;AACT;AAEO,SAAS,sBAAsB,SAAuC;AAC3E,SAAO,IAAI,cAAc,OAAO;AAClC;AAEO,SAAS,eACdA,SACA,MACA,QACA,SACA,SACA;AACA,QAAM,SAAS,kBAAkB,MAAM;AAEvC,MAAI,OAAO,YAAY,UAAU;AAC/B,cAAU,eAAe,KAAK,UAAU,QAAQ,WAAW,MAAM,CAAC,CAAC;EACrE;AACA,MAAI,SAAS,QAAQ;AACnB,UAAM,QAAQ,QAAQ,MAAM,WAAW;AACvC,QAAI,UAAU,MAAM;AAClB,MAAAA,QAAO;QACL,WAAW,MAAM,IAAI,OAAO;MAC9B;AACA;IACF;AACA,UAAM,QAAQ,QAAQ,MAAM,GAAG,MAAM,CAAC,EAAE,SAAS,CAAC;AAClD,UAAM,OAAO,QAAQ,MAAM,MAAM,CAAC,EAAE,MAAM;AAE1C,IAAAA,QAAO,IAAI,aAAa,MAAM,IAAI,OAAO,OAAO,KAAK,KAAK,YAAY,IAAI;EAC5E,OAAO;AACL,IAAAA,QAAO,MAAM,WAAW,MAAM,IAAI,OAAO,MAAM,OAAO,EAAE;EAC1D;AACF;;;ACnJO,IAAM,eAAe,OAAO,IAAI,cAAc;;;ACD9C,IAAM,kBAAkB,OAAO,IAAI,iBAAiB;AASpD,SAAS,qBAAqB,WAA+B;AAClE,SAAO,UAAU,eAAe,KAAK;AACvC;AAEO,SAAS,iBAAiB,GAAoB;AACnD,SAAO,EAAE,WAAW,aAAa;AACnC;AAEO,SAAS,mBAAmB,mBAAwB;AAIzD,MAAI;AAGJ,MAAI,OAAO,sBAAsB,UAAU;AACzC,QAAI,iBAAiB,iBAAiB,GAAG;AACvC,wBAAkB,EAAE,gBAAgB,kBAAkB;IACxD,OAAO;AACL,wBAAkB,EAAE,MAAM,kBAAkB;IAC9C;EACF,WAGS,kBAAkB,YAAY,GAAG;AACxC,sBAAkB,EAAE,MAAM,kBAAkB,YAAY,EAAE;EAC5D,OAEK;AACH,UAAM,gBAAgB,qBAAqB,iBAAiB;AAC5D,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,GAAG,iBAAiB,6BAA6B;IACnE;AACA,sBAAkB,EAAE,WAAW,cAAc;EAC/C;AACA,SAAO;AACT;;;AC8BO,SAAS,gBACd,mBACQ;AACR,QAAM,UAAU,mBAAmB,iBAAiB;AAEpD,MAAI,QAAQ,SAAS,QAAW;AAC9B,QAAI,QAAQ,mBAAmB,QAAW;AACxC,YAAM,IAAI;QACR,0GAA0G,QAAQ,cAAc;MAClI;IACF,WAAW,QAAQ,cAAc,QAAW;AAC1C,YAAM,IAAI;QACR,6HAA6H,QAAQ,SAAS;MAChJ;IACF;AACA,UAAM,IAAI;MACR,0FAA0F,KAAK,UAAU,OAAO,CAAC;IACnH;EACF;AAGA,MAAI,OAAO,sBAAsB,SAAU,QAAO;AAKlD,QAAM,OAAQ,kBAA0B,YAAY;AACpD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,GAAG,iBAAwB,6BAA6B;EAC1E;AACA,SAAO;AACT;AAoCA,SAAS,UAAU,YAAsB,CAAC,GAAW;AACnD,QAAM,UAAgC;IACpC,IAAI,GAAG,MAAuB;AAC5B,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM,WAAW,CAAC,GAAG,WAAW,IAAI;AACpC,eAAO,UAAU,QAAQ;MAC3B,WAAW,SAAS,cAAc;AAChC,YAAI,UAAU,SAAS,GAAG;AACxB,gBAAM,QAAQ,CAAC,OAAO,GAAG,SAAS,EAAE,KAAK,GAAG;AAC5C,gBAAM,IAAI;YACR,oFAAoF,KAAK;UAC3F;QACF;AACA,cAAM,OAAO,UAAU,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAC5C,cAAM,aAAa,UAAU,UAAU,SAAS,CAAC;AACjD,YAAI,eAAe,WAAW;AAC5B,iBAAO;QACT,OAAO;AACL,iBAAO,OAAO,MAAM;QACtB;MACF,WAAW,SAAS,OAAO,aAAa;AACtC,eAAO;MACT,OAAO;AACL,eAAO;MACT;IACF;EACF;AAEA,SAAO,IAAI,MAAM,CAAC,GAAG,OAAO;AAC9B;AA6PO,IAAM,SAAiB,UAAU;;;;;;ACrNjC,IAAM,OAAN,MAAM,MAAK;EAShB,YAAY,KAAa,MAAc;AARvC,IAAAC,eAAA,MAAA,KAAA;AACA,IAAAA,eAAA,MAAA,MAAA;AACA,IAAAA,eAAA,MAAA,oBAAA;AAOE,SAAK,MAAM,MAAM;AACjB,SAAK,OAAO,OAAO;AACnB,SAAK,qBAAqB;EAC5B;EARA,OAAO,OAAO,KAAW;AACvB,YAAQ,OAAO,IAAI,wBAAwB;EAC7C;;EASA,OAAO,YAAY,OAAuB;AACxC,WAAO,IAAI;MACT,MAAM,CAAC,IACP,MAAM,CAAC,KAAK,IACZ,MAAM,CAAC,KAAK,KACZ,MAAM,CAAC,KAAK;MACZ,MAAM,CAAC,IACP,MAAM,CAAC,KAAK,IACZ,MAAM,CAAC,KAAK,KACZ,MAAM,CAAC,KAAK;IACd;EACF;;EAGA,YAAY;AACV,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,KAAK;AAChB,WAAO;MACL,KAAK;MACL,OAAO,IAAI;MACX,OAAO,KAAK;MACZ,OAAO;MACP,KAAK;MACL,OAAO,IAAI;MACX,OAAO,KAAK;MACZ,OAAO;IACT;EACF;EAEA,OAAO,WAAW,OAAe;AAC/B,QAAI,MAAM,KAAK,EAAG,QAAO;AACzB,QAAI,QAAQ,EAAG,QAAO;AACtB,QAAI,SAAS,eAAgB,QAAO;AACpC,WAAO,IAAI,MAAK,QAAQ,iBAAiB,GAAI,QAAQ,iBAAkB,CAAC;EAC1E;EAEA,WAAW;AACT,YACE,OAAO,KAAK,IAAI,IAAI,OAAO,cAAc,IACzC,OAAO,KAAK,GAAG,GACf,SAAS;EACb;EAEA,OAAO,OAAa;AAClB,QAAI,CAAC,MAAK,OAAO,KAAK,EAAG,SAAQ,MAAK,UAAU,KAAK;AACrD,QAAI,KAAK,SAAS,OAAO,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC9D,WAAO,KAAK,SAAS,MAAM,QAAQ,KAAK,QAAQ,MAAM;EACxD;EAEA,UAAU,OAAa;AACrB,WAAO,CAAC,KAAK,OAAO,KAAK;EAC3B;EAEA,KAAK,OAAa;AAChB,QAAI,CAAC,MAAK,OAAO,KAAK,EAAG,SAAQ,MAAK,UAAU,KAAK;AACrD,QAAI,KAAK,OAAO,KAAK,EAAG,QAAO;AAC/B,WAAO,MAAM,SAAS,IAAI,KAAK,SAAS,KACrC,MAAM,SAAS,KAAK,QAAQ,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAC1D,KACA;EACN;EAEA,gBAAgB,OAAa;AAC3B,WAAO,KAAK;;MAAqB;IAAK,KAAK;EAC7C;EAEA,OAAO,UAAU,KAAU;AACzB,QAAI,OAAO,QAAQ,SAAU,QAAO,MAAK,WAAW,GAAG;AAEvD,WAAO,IAAI,MAAK,IAAI,KAAK,IAAI,IAAI;EACnC;AACF;AAEA,IAAM,QAAQ,IAAI,KAAK,GAAG,CAAC;AAC3B,IAAM,iBAAiB,KAAK;AAC5B,IAAM,iBAAiB,iBAAiB;AACxC,IAAM,iBAAiB,iBAAiB;AACxC,IAAM,qBAAqB,IAAI,KAAK,aAAa,GAAG,aAAa,CAAC;;;AC9R3D,IAAM,oBAAN,cAAgC,MAAM;AAAC;AAE9C,kBAAkB,UAAU,OAAO;;;ACfnC,IAAM,wBAAwB,KAAK,KAAK,KAAK,KAAK;A;;;;;;;;;ACwB3C,IAAM,yBAAyB;AAGtC,IAAI,iBAAsD;AA0BnD,IAAM,mBAAN,MAAuB;;;;;;;;;;;;;;;;;;;EAkC5B,YACE,SACA,SAKA;AAxCF,IAAAC,eAAA,MAAiB,SAAA;AACjB,IAAAA,eAAA,MAAQ,MAAA;AACR,IAAAA,eAAA,MAAQ,WAAA;AACR,IAAAA,eAAA,MAAQ,kBAAA;AACR,IAAAA,eAAA,MAAQ,OAAA;AACR,IAAAA,eAAA,MAAQ,cAAA;AACR,IAAAA,eAAA,MAAQ,QAAA;AACR,IAAAA,eAAA,MAAQ,iBAKH,CAAC,CAAA;AACN,IAAAA,eAAA,MAAQ,qBAA6B,KAAA;AA4BnC,QAAI,OAAO,YAAY,WAAW;AAChC,YAAM,IAAI;QACR;MACF;IACF;AACA,UAAM,OAAO,WAAW,CAAC;AACzB,QAAI,KAAK,iCAAiC,MAAM;AAC9C,4BAAsB,OAAO;IAC/B;AACA,SAAK,SACH,SAAS,WAAW,QAChB,sBAAsB,EAAE,SAAS,MAAM,CAAC,IACxC,SAAS,WAAW,QAAQ,SAAS,SACnC,QAAQ,SACR,yBAAyB,EAAE,SAAS,MAAM,CAAC;AACnD,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,QAAI,SAAS,MAAM;AACjB,WAAK,QAAQ,QAAQ,IAAI;IAC3B;EACF;;;;;;;EAQA,aAAqB;AACnB,WAAO,GAAG,KAAK,OAAO;EACxB;;;;;;;EAQA,IAAI,MAAM;AACR,WAAO,KAAK;EACd;;;;;;;;EASA,QAAQ,OAAe;AACrB,SAAK,UAAU;AACf,SAAK,OAAO;EACd;;;;;;;EAQA,aAAa,OAAe,kBAA2C;AACrE,SAAK,UAAU;AACf,QAAI,qBAAqB,QAAW;AAElC,YAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,KAAK,UAAU,gBAAgB,CAAC;AACvE,YAAM,0BAA0B,KAAK,OAAO,cAAc,GAAG,KAAK,CAAC;AACnE,WAAK,YAAY,GAAG,KAAK,IAAI,uBAAuB;IACtD,OAAO;AACL,WAAK,YAAY;IACnB;EACF;;;;EAKA,YAAY;AACV,SAAK,OAAO;AACZ,SAAK,YAAY;EACnB;;;;;;EAOA,SAAS,OAAgB;AACvB,SAAK,QAAQ;EACf;;;;;;EAOA,gBAAgB,cAA4B;AAC1C,SAAK,eAAe;EACtB;;;;;;;;;;;;;;;;;;;;EAqBA,MAAM,gBACJ,UACG,MACiC;AACpC,UAAM,YAAY,UAAU,KAAK,CAAC,CAAC;AAEnC,UAAM,mBAAmB,KAAK,aAAa;AAC3C,WAAO,MAAM,KAAK,WAAW,OAAO,WAAW,EAAE,iBAAiB,CAAC;EACrE;EAEA,MAAc,eAAe;AAC3B,QAAI,KAAK,kBAAkB;AACzB,aAAO,KAAK;IACd;AACA,WAAQ,KAAK,mBAAmB,KAAK,kBAAkB;EACzD;EAEA,MAAc,oBAAoB;AAChC,UAAM,aAAa,kBAAkB;AAErC,UAAM,UAAkC;MACtC,gBAAgB;MAChB,iBAAiB,OAAO,OAAO;IACjC;AACA,UAAM,WAAW,MAAM,WAAW,GAAG,KAAK,OAAO,iBAAiB;MAChE,GAAG,KAAK;MACR,QAAQ;MACR;IACF,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,MAAM,SAAS,KAAK,CAAC;IACvC;AACA,UAAM,EAAE,GAAG,IAAK,MAAM,SAAS,KAAK;AACpC,WAAO;EACT;;;;;;;;;EAUA,MAAM,MACJ,UACG,MACiC;AACpC,UAAM,YAAY,UAAU,KAAK,CAAC,CAAC;AACnC,WAAO,MAAM,KAAK,WAAW,OAAO,WAAW,CAAC,CAAC;EACnD;EAEA,MAAc,WACZ,OACA,WACA,SACoC;AACpC,UAAM,OAAO,gBAAgB,KAAK;AAClC,UAAM,OAAO,CAAC,aAAa,SAAS,CAAC;AACrC,UAAM,UAAkC;MACtC,gBAAgB;MAChB,iBAAiB,OAAO,OAAO;IACjC;AACA,QAAI,KAAK,WAAW;AAClB,cAAQ,eAAe,IAAI,UAAU,KAAK,SAAS;IACrD,WAAW,KAAK,MAAM;AACpB,cAAQ,eAAe,IAAI,UAAU,KAAK,IAAI;IAChD;AACA,UAAM,aAAa,kBAAkB;AAErC,UAAM,YAAY,QAAQ,mBACtB,MAAM,QAAQ,mBACd;AAEJ,UAAM,OAAO,KAAK,UAAU;MAC1B,MAAM;MACN,QAAQ;MACR;MACA,GAAI,YAAY,EAAE,IAAI,UAAU,IAAI,CAAC;IACvC,CAAC;AACD,UAAM,WAAW,YACb,GAAG,KAAK,OAAO,qBACf,GAAG,KAAK,OAAO;AAEnB,UAAM,WAAW,MAAM,WAAW,UAAU;MAC1C,GAAG,KAAK;MACR;MACA,QAAQ;MACR;IACF,CAAC;AACD,QAAI,CAAC,SAAS,MAAM,SAAS,WAAW,wBAAwB;AAC9D,YAAM,IAAI,MAAM,MAAM,SAAS,KAAK,CAAC;IACvC;AACA,UAAM,WAAW,MAAM,SAAS,KAAK;AAErC,QAAI,KAAK,OAAO;AACd,iBAAW,QAAQ,SAAS,YAAY,CAAC,GAAG;AAC1C,uBAAe,KAAK,QAAQ,QAAQ,SAAS,MAAM,IAAI;MACzD;IACF;AACA,YAAQ,SAAS,QAAQ;MACvB,KAAK;AACH,eAAO,aAAa,SAAS,KAAK;MACpC,KAAK;AACH,YAAI,SAAS,cAAc,QAAW;AACpC,gBAAM;YACJ,SAAS;YACT,IAAI,YAAY,SAAS,YAAY;UACvC;QACF;AACA,cAAM,IAAI,MAAM,SAAS,YAAY;MACvC;AACE,cAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,QAAQ,CAAC,EAAE;IACnE;EACF;EAEA,MAAc,cACZ,UACA,cACuC;AACvC,UAAM,OAAO,gBAAgB,QAAQ;AACrC,UAAM,OAAO,KAAK,UAAU;MAC1B,MAAM;MACN,QAAQ;MACR,MAAM,CAAC,aAAa,YAAY,CAAC;IACnC,CAAC;AACD,UAAM,UAAkC;MACtC,gBAAgB;MAChB,iBAAiB,OAAO,OAAO;IACjC;AACA,QAAI,KAAK,WAAW;AAClB,cAAQ,eAAe,IAAI,UAAU,KAAK,SAAS;IACrD,WAAW,KAAK,MAAM;AACpB,cAAQ,eAAe,IAAI,UAAU,KAAK,IAAI;IAChD;AACA,UAAM,aAAa,kBAAkB;AACrC,UAAM,WAAW,MAAM,WAAW,GAAG,KAAK,OAAO,iBAAiB;MAChE,GAAG,KAAK;MACR;MACA,QAAQ;MACR;IACF,CAAC;AACD,QAAI,CAAC,SAAS,MAAM,SAAS,WAAW,wBAAwB;AAC9D,YAAM,IAAI,MAAM,MAAM,SAAS,KAAK,CAAC;IACvC;AACA,UAAM,WAAW,MAAM,SAAS,KAAK;AACrC,QAAI,KAAK,OAAO;AACd,iBAAW,QAAQ,SAAS,YAAY,CAAC,GAAG;AAC1C,uBAAe,KAAK,QAAQ,QAAQ,YAAY,MAAM,IAAI;MAC5D;IACF;AACA,YAAQ,SAAS,QAAQ;MACvB,KAAK;AACH,eAAO,aAAa,SAAS,KAAK;MACpC,KAAK;AACH,YAAI,SAAS,cAAc,QAAW;AACpC,gBAAM;YACJ,SAAS;YACT,IAAI,YAAY,SAAS,YAAY;UACvC;QACF;AACA,cAAM,IAAI,MAAM,SAAS,YAAY;MACvC;AACE,cAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,QAAQ,CAAC,EAAE;IACnE;EACF;EAEA,MAAc,uBAAuB;AACnC,QAAI,KAAK,mBAAmB;AAC1B;IACF;AAEA,SAAK,oBAAoB;AACzB,WAAO,KAAK,cAAc,SAAS,GAAG;AACpC,YAAM,EAAE,UAAU,MAAM,SAAAC,UAAS,OAAO,IAAI,KAAK,cAAc,MAAM;AACrE,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,cAAc,UAAU,IAAI;AACtD,QAAAA,SAAQ,MAAM;MAChB,SAAS,OAAO;AACd,eAAO,KAAK;MACd;IACF;AACA,SAAK,oBAAoB;EAC3B;EAEQ,gBACN,UACA,MACuC;AACvC,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,WAAK,cAAc,KAAK,EAAE,UAAU,MAAM,SAAAA,UAAS,OAAO,CAAC;AAC3D,WAAK,KAAK,qBAAqB;IACjC,CAAC;EACH;;;;;;;;;;EAWA,MAAM,SACJ,aACG,MACoC;AACvC,UAAM,CAAC,QAAQ,OAAO,IAAI;AAC1B,UAAM,eAAe,UAAU,MAAM;AACrC,UAAM,SAAS,CAAC,SAAS;AAEzB,QAAI,QAAQ;AACV,aAAO,MAAM,KAAK,gBAAgB,UAAU,YAAY;IAC1D,OAAO;AACL,aAAO,MAAM,KAAK,cAAc,UAAU,YAAY;IACxD;EACF;;;;;;;;;EAUA,MAAM,OACJ,WACG,MACkC;AACrC,UAAM,aAAa,UAAU,KAAK,CAAC,CAAC;AACpC,UAAM,OAAO,gBAAgB,MAAM;AACnC,UAAM,OAAO,KAAK,UAAU;MAC1B,MAAM;MACN,QAAQ;MACR,MAAM,CAAC,aAAa,UAAU,CAAC;IACjC,CAAC;AACD,UAAM,UAAkC;MACtC,gBAAgB;MAChB,iBAAiB,OAAO,OAAO;IACjC;AACA,QAAI,KAAK,WAAW;AAClB,cAAQ,eAAe,IAAI,UAAU,KAAK,SAAS;IACrD,WAAW,KAAK,MAAM;AACpB,cAAQ,eAAe,IAAI,UAAU,KAAK,IAAI;IAChD;AACA,UAAM,aAAa,kBAAkB;AACrC,UAAM,WAAW,MAAM,WAAW,GAAG,KAAK,OAAO,eAAe;MAC9D,GAAG,KAAK;MACR;MACA,QAAQ;MACR;IACF,CAAC;AACD,QAAI,CAAC,SAAS,MAAM,SAAS,WAAW,wBAAwB;AAC9D,YAAM,IAAI,MAAM,MAAM,SAAS,KAAK,CAAC;IACvC;AACA,UAAM,WAAW,MAAM,SAAS,KAAK;AACrC,QAAI,KAAK,OAAO;AACd,iBAAW,QAAQ,SAAS,YAAY,CAAC,GAAG;AAC1C,uBAAe,KAAK,QAAQ,QAAQ,UAAU,MAAM,IAAI;MAC1D;IACF;AACA,YAAQ,SAAS,QAAQ;MACvB,KAAK;AACH,eAAO,aAAa,SAAS,KAAK;MACpC,KAAK;AACH,YAAI,SAAS,cAAc,QAAW;AACpC,gBAAM;YACJ,SAAS;YACT,IAAI,YAAY,SAAS,YAAY;UACvC;QACF;AACA,cAAM,IAAI,MAAM,SAAS,YAAY;MACvC;AACE,cAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,QAAQ,CAAC,EAAE;IACnE;EACF;;;;;;;;;;;EAYA,MAAM,SAGJ,aACA,kBACG,MACuC;AAC1C,UAAM,eAAe,UAAU,KAAK,CAAC,CAAC;AACtC,UAAM,OACJ,OAAO,gBAAgB,WACnB,cACA,gBAAgB,WAAW;AACjC,UAAM,OAAO,KAAK,UAAU;MAC1B;MACA,MAAM;MACN,QAAQ;MACR,MAAM,aAAa,YAAY;IACjC,CAAC;AACD,UAAM,UAAkC;MACtC,gBAAgB;MAChB,iBAAiB,OAAO,OAAO;IACjC;AACA,QAAI,KAAK,WAAW;AAClB,cAAQ,eAAe,IAAI,UAAU,KAAK,SAAS;IACrD,WAAW,KAAK,MAAM;AACpB,cAAQ,eAAe,IAAI,UAAU,KAAK,IAAI;IAChD;AACA,UAAM,aAAa,kBAAkB;AACrC,UAAM,WAAW,MAAM,WAAW,GAAG,KAAK,OAAO,iBAAiB;MAChE,GAAG,KAAK;MACR;MACA,QAAQ;MACR;IACF,CAAC;AACD,QAAI,CAAC,SAAS,MAAM,SAAS,WAAW,wBAAwB;AAC9D,YAAM,IAAI,MAAM,MAAM,SAAS,KAAK,CAAC;IACvC;AACA,UAAM,WAAW,MAAM,SAAS,KAAK;AACrC,QAAI,KAAK,OAAO;AACd,iBAAW,QAAQ,SAAS,YAAY,CAAC,GAAG;AAC1C,uBAAe,KAAK,QAAQ,QAAQ,OAAO,MAAM,IAAI;MACvD;IACF;AACA,YAAQ,SAAS,QAAQ;MACvB,KAAK;AACH,eAAO,aAAa,SAAS,KAAK;MACpC,KAAK;AACH,YAAI,SAAS,cAAc,QAAW;AACpC,gBAAM;YACJ,SAAS;YACT,IAAI,YAAY,SAAS,YAAY;UACvC;QACF;AACA,cAAM,IAAI,MAAM,SAAS,YAAY;MACvC;AACE,cAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,QAAQ,CAAC,EAAE;IACnE;EACF;AACF;AAEA,SAAS,iBAAiB,WAAsB,OAA4B;AACzE,QAA2B,OAAO,aAAa,SAAS;AACzD,SAAO;AACT;;;ACziBA,IAAI;AAGG,SAAS,+BAA+B,IAAsB;AACnE,gCAA8B;AAChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzBA,IAAA,iBAAA,WAAA;EAAA,mHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AAQnC,aAAS,UAAU,QAAQ;AACzB,aAAO,KAAK,OAAO;IACrB;AAOA,aAAS,cAAc;AACrB,UAAI,CAAC,KAAK,aAAa,KAAK,eAAe,UAAU;AACnD,aAAK,QAAQ;MACf;IACF;AAQA,aAAS,cAAc,KAAK;AAC1B,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,QAAQ;AACb,UAAI,KAAK,cAAc,OAAO,MAAM,GAAG;AAErC,aAAK,KAAK,SAAS,GAAG;MACxB;IACF;AAUA,aAASC,uBAAsB,IAAI,SAAS;AAC1C,UAAI,qBAAqB;AAEzB,YAAM,SAAS,IAAI,OAAO;QACxB,GAAG;QACH,aAAa;QACb,WAAW;QACX,YAAY;QACZ,oBAAoB;MACtB,CAAC;AAED,SAAG,GAAG,WAAW,SAAS,QAAQ,KAAK,UAAU;AAC/C,cAAM,OACJ,CAAC,YAAY,OAAO,eAAe,aAAa,IAAI,SAAS,IAAI;AAEnE,YAAI,CAAC,OAAO,KAAK,IAAI,EAAG,IAAG,MAAM;MACnC,CAAC;AAED,SAAG,KAAK,SAAS,SAAS,MAAM,KAAK;AACnC,YAAI,OAAO,UAAW;AAWtB,6BAAqB;AACrB,eAAO,QAAQ,GAAG;MACpB,CAAC;AAED,SAAG,KAAK,SAAS,SAAS,QAAQ;AAChC,YAAI,OAAO,UAAW;AAEtB,eAAO,KAAK,IAAI;MAClB,CAAC;AAED,aAAO,WAAW,SAAU,KAAK,UAAU;AACzC,YAAI,GAAG,eAAe,GAAG,QAAQ;AAC/B,mBAAS,GAAG;AACZ,kBAAQ,SAAS,WAAW,MAAM;AAClC;QACF;AAEA,YAAI,SAAS;AAEb,WAAG,KAAK,SAAS,SAAS,MAAMC,MAAK;AACnC,mBAAS;AACT,mBAASA,IAAG;QACd,CAAC;AAED,WAAG,KAAK,SAAS,SAAS,QAAQ;AAChC,cAAI,CAAC,OAAQ,UAAS,GAAG;AACzB,kBAAQ,SAAS,WAAW,MAAM;QACpC,CAAC;AAED,YAAI,mBAAoB,IAAG,UAAU;MACvC;AAEA,aAAO,SAAS,SAAU,UAAU;AAClC,YAAI,GAAG,eAAe,GAAG,YAAY;AACnC,aAAG,KAAK,QAAQ,SAAS,OAAO;AAC9B,mBAAO,OAAO,QAAQ;UACxB,CAAC;AACD;QACF;AAMA,YAAI,GAAG,YAAY,KAAM;AAEzB,YAAI,GAAG,QAAQ,eAAe,UAAU;AACtC,mBAAS;AACT,cAAI,OAAO,eAAe,WAAY,QAAO,QAAQ;QACvD,OAAO;AACL,aAAG,QAAQ,KAAK,UAAU,SAAS,SAAS;AAI1C,qBAAS;UACX,CAAC;AACD,aAAG,MAAM;QACX;MACF;AAEA,aAAO,QAAQ,WAAY;AACzB,YAAI,GAAG,SAAU,IAAG,OAAO;MAC7B;AAEA,aAAO,SAAS,SAAU,OAAO,UAAU,UAAU;AACnD,YAAI,GAAG,eAAe,GAAG,YAAY;AACnC,aAAG,KAAK,QAAQ,SAAS,OAAO;AAC9B,mBAAO,OAAO,OAAO,UAAU,QAAQ;UACzC,CAAC;AACD;QACF;AAEA,WAAG,KAAK,OAAO,QAAQ;MACzB;AAEA,aAAO,GAAG,OAAO,WAAW;AAC5B,aAAO,GAAG,SAAS,aAAa;AAChC,aAAO;IACT;AAEA,WAAO,UAAUD;EAAA;AAAA,CAAA;AC9JjB,IAAA,oBAAA,WAAA;EAAA,sHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,eAAe,CAAC,cAAc,eAAe,WAAW;AAC9D,QAAM,UAAU,OAAO,SAAS;AAEhC,QAAI,QAAS,cAAa,KAAK,MAAM;AAErC,WAAO,UAAU;MACf;MACA,cAAc,OAAO,MAAM,CAAC;MAC5B,MAAM;MACN;MACA,sBAAsB,OAAO,wBAAwB;MACrD,WAAW,OAAO,WAAW;MAC7B,aAAa,OAAO,aAAa;MACjC,YAAY,OAAO,WAAW;MAC9B,MAAM,MAAM;MAAC;IACf;EAAA;AAAA,CAAA;ACjBA,IAAA,yBAAA,WAAA;EAAA,uGAAA,SAAA,QAAA;AAAA,QAAI,KAAK,UAAQ,IAAI;AACrB,QAAI,OAAO,UAAQ,MAAM;AACzB,QAAI,KAAK,UAAQ,IAAI;AAGrB,QAAI,iBAAiB,OAAO,wBAAwB,aAAa,0BAA0B;AAE3F,QAAI,OAAQ,QAAQ,UAAU,QAAQ,OAAO,aAAc,CAAC;AAC5D,QAAI,gBAAgB,CAAC,CAAC,QAAQ,IAAI;AAClC,QAAI,MAAM,QAAQ,SAAS;AAC3B,QAAI,UAAU,WAAW,IAAI,aAAc,OAAO,IAAI,gBAAgB;AAEtE,QAAI,OAAO,QAAQ,IAAI,mBAAmB,GAAG,KAAK;AAClD,QAAI,WAAW,QAAQ,IAAI,uBAAuB,GAAG,SAAS;AAC9D,QAAI,OAAO,QAAQ,IAAI,SAAS,SAAS,QAAQ,IAAI,SAAS;AAC9D,QAAI,OAAO,QAAQ,IAAI,gBAAgB,SAAS,UAAU,MAAM,KAAK,gBAAgB;AACrF,QAAI,MAAM,QAAQ,SAAS,MAAM,IAAI,MAAM,GAAG,EAAE,CAAC;AAEjD,WAAO,UAAU;AAEjB,aAAS,KAAM,KAAK;AAClB,aAAO,eAAe,KAAK,QAAQ,GAAG,CAAC;IACzC;AAEA,SAAK,UAAU,KAAK,OAAO,SAAU,KAAK;AACxC,YAAM,KAAK,QAAQ,OAAO,GAAG;AAE7B,UAAI;AACF,YAAI,OAAO,eAAe,KAAK,KAAK,KAAK,cAAc,CAAC,EAAE,KAAK,YAAY,EAAE,QAAQ,MAAM,GAAG;AAC9F,YAAI,QAAQ,IAAI,OAAO,WAAW,EAAG,OAAM,QAAQ,IAAI,OAAO,WAAW;MAC3E,SAAS,KAAK;MAAC;AAEf,UAAI,CAAC,eAAe;AAClB,YAAI,UAAU,SAAS,KAAK,KAAK,KAAK,eAAe,GAAG,UAAU;AAClE,YAAI,QAAS,QAAO;AAEpB,YAAI,QAAQ,SAAS,KAAK,KAAK,KAAK,aAAa,GAAG,UAAU;AAC9D,YAAI,MAAO,QAAO;MACpB;AAEA,UAAI,WAAWE,SAAQ,GAAG;AAC1B,UAAI,SAAU,QAAO;AAErB,UAAI,SAASA,SAAQ,KAAK,QAAQ,QAAQ,QAAQ,CAAC;AACnD,UAAI,OAAQ,QAAO;AAEnB,UAAI,SAAS;QACX,cAAc;QACd,UAAU;QACV,aAAa;QACb,SAAS;QACT,QAAQ;QACR,OAAO,UAAU,OAAO;QACxB,UAAU;QACV,UAAU,QAAQ,SAAS;QAC3B,QAAQ,SAAS,WAAW,cAAc,QAAQ,SAAS,WAAW;QACtE,OAAO,wBAAwB,aAAa,iBAAiB;;MAC/D,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,YAAM,IAAI,MAAM,mCAAmC,SAAS,wBAAwB,MAAM,IAAI;AAE9F,eAASA,SAASC,MAAK;AAErB,YAAI,SAAS,YAAY,KAAK,KAAKA,MAAK,WAAW,CAAC,EAAE,IAAI,UAAU;AACpE,YAAI,QAAQ,OAAO,OAAO,WAAW,UAAU,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;AAC3E,YAAI,CAAC,MAAO;AAGZ,YAAI,YAAY,KAAK,KAAKA,MAAK,aAAa,MAAM,IAAI;AACtD,YAAI,SAAS,YAAY,SAAS,EAAE,IAAI,SAAS;AACjD,YAAI,aAAa,OAAO,OAAO,UAAU,SAAS,GAAG,CAAC;AACtD,YAAI,SAAS,WAAW,KAAK,YAAY,OAAO,CAAC,EAAE,CAAC;AACpD,YAAI,OAAQ,QAAO,KAAK,KAAK,WAAW,OAAO,IAAI;MACrD;IACF;AAEA,aAAS,YAAa,KAAK;AACzB,UAAI;AACF,eAAO,GAAG,YAAY,GAAG;MAC3B,SAAS,KAAK;AACZ,eAAO,CAAC;MACV;IACF;AAEA,aAAS,SAAU,KAAK,QAAQ;AAC9B,UAAI,QAAQ,YAAY,GAAG,EAAE,OAAO,MAAM;AAC1C,aAAO,MAAM,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,CAAC,CAAC;IAC5C;AAEA,aAAS,WAAY,MAAM;AACzB,aAAO,UAAU,KAAK,IAAI;IAC5B;AAEA,aAAS,WAAY,MAAM;AAEzB,UAAIC,OAAM,KAAK,MAAM,GAAG;AACxB,UAAIA,KAAI,WAAW,EAAG;AAEtB,UAAIC,YAAWD,KAAI,CAAC;AACpB,UAAI,gBAAgBA,KAAI,CAAC,EAAE,MAAM,GAAG;AAEpC,UAAI,CAACC,UAAU;AACf,UAAI,CAAC,cAAc,OAAQ;AAC3B,UAAI,CAAC,cAAc,MAAM,OAAO,EAAG;AAEnC,aAAO,EAAE,MAAM,UAAAA,WAAU,cAAc;IACzC;AAEA,aAAS,WAAYA,WAAUC,OAAM;AACnC,aAAO,SAAU,OAAO;AACtB,YAAI,SAAS,KAAM,QAAO;AAC1B,YAAI,MAAM,aAAaD,UAAU,QAAO;AACxC,eAAO,MAAM,cAAc,SAASC,KAAI;MAC1C;IACF;AAEA,aAAS,cAAe,GAAG,GAAG;AAE5B,aAAO,EAAE,cAAc,SAAS,EAAE,cAAc;IAClD;AAEA,aAAS,UAAW,MAAM;AACxB,UAAIF,OAAM,KAAK,MAAM,GAAG;AACxB,UAAI,YAAYA,KAAI,IAAI;AACxB,UAAI,OAAO,EAAE,MAAY,aAAa,EAAE;AAExC,UAAI,cAAc,OAAQ;AAE1B,eAAS,IAAI,GAAG,IAAIA,KAAI,QAAQ,KAAK;AACnC,YAAI,MAAMA,KAAI,CAAC;AAEf,YAAI,QAAQ,UAAU,QAAQ,cAAc,QAAQ,eAAe;AACjE,eAAK,UAAU;QACjB,WAAW,QAAQ,QAAQ;AACzB,eAAK,OAAO;QACd,WAAW,IAAI,MAAM,GAAG,CAAC,MAAM,OAAO;AACpC,eAAK,MAAM,IAAI,MAAM,CAAC;QACxB,WAAW,IAAI,MAAM,GAAG,CAAC,MAAM,MAAM;AACnC,eAAK,KAAK,IAAI,MAAM,CAAC;QACvB,WAAW,IAAI,MAAM,GAAG,CAAC,MAAM,QAAQ;AACrC,eAAK,OAAO,IAAI,MAAM,CAAC;QACzB,WAAW,QAAQ,WAAW,QAAQ,QAAQ;AAC5C,eAAK,OAAO;QACd,OAAO;AACL;QACF;AAEA,aAAK;MACP;AAEA,aAAO;IACT;AAEA,aAAS,UAAWG,UAASC,MAAK;AAChC,aAAO,SAAU,MAAM;AACrB,YAAI,QAAQ,KAAM,QAAO;AACzB,YAAI,KAAK,WAAW,KAAK,YAAYD,YAAW,CAAC,gBAAgB,IAAI,EAAG,QAAO;AAC/E,YAAI,KAAK,OAAO,KAAK,QAAQC,QAAO,CAAC,KAAK,KAAM,QAAO;AACvD,YAAI,KAAK,MAAM,KAAK,OAAO,GAAI,QAAO;AACtC,YAAI,KAAK,QAAQ,KAAK,SAAS,KAAM,QAAO;AAC5C,YAAI,KAAK,QAAQ,KAAK,SAAS,KAAM,QAAO;AAE5C,eAAO;MACT;IACF;AAEA,aAAS,gBAAiB,MAAM;AAC9B,aAAO,KAAK,YAAY,UAAU,KAAK;IACzC;AAEA,aAAS,YAAaD,UAAS;AAE7B,aAAO,SAAU,GAAG,GAAG;AACrB,YAAI,EAAE,YAAY,EAAE,SAAS;AAC3B,iBAAO,EAAE,YAAYA,WAAU,KAAK;QACtC,WAAW,EAAE,QAAQ,EAAE,KAAK;AAC1B,iBAAO,EAAE,MAAM,KAAK;QACtB,WAAW,EAAE,gBAAgB,EAAE,aAAa;AAC1C,iBAAO,EAAE,cAAc,EAAE,cAAc,KAAK;QAC9C,OAAO;AACL,iBAAO;QACT;MACF;IACF;AAEA,aAAS,SAAU;AACjB,aAAO,CAAC,EAAE,QAAQ,YAAY,QAAQ,SAAS;IACjD;AAEA,aAAS,aAAc;AACrB,UAAI,QAAQ,YAAY,QAAQ,SAAS,SAAU,QAAO;AAC1D,UAAI,QAAQ,IAAI,qBAAsB,QAAO;AAC7C,aAAO,OAAO,WAAW,eAAe,OAAO,WAAW,OAAO,QAAQ,SAAS;IACpF;AAEA,aAAS,SAAUF,WAAU;AAC3B,aAAOA,cAAa,WAAW,GAAG,WAAW,qBAAqB;IACpE;AAIA,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,aAAa;AAClB,SAAK,aAAa;AAClB,SAAK,gBAAgB;EAAA;AAAA,CAAA;AC9MrB,IAAAI,0BAAA,WAAA;EAAA,8FAAA,SAAA,QAAA;AAAA,QAAM,iBAAiB,OAAO,wBAAwB,aAAa,0BAA0B;AAC7F,QAAI,OAAO,eAAe,UAAU,YAAY;AAC9C,aAAO,UAAU,eAAe,MAAM,KAAK,cAAc;IAC3D,OAAO;AACL,aAAO,UAAU,uBAAA;IACnB;EAAA;AAAA,CAAA;ACLA,IAAA,mBAAA,WAAA;EAAA,yFAAA,SAAA,QAAA;AAAA;AAYA,QAAM,OAAO,CAAC,QAAQC,OAAM,QAAQ,QAAQ,WAAW;AACrD,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,SAAS,CAAC,IAAI,OAAO,CAAC,IAAIA,MAAK,IAAI,CAAC;MAC7C;IACF;AASA,QAAM,SAAS,CAAC,QAAQA,UAAS;AAE/B,YAAM,SAAS,OAAO;AACtB,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,CAAC,KAAKA,MAAK,IAAI,CAAC;MACzB;IACF;AAEA,WAAO,UAAU,EAAE,MAAM,OAAO;EAAA;AAAA,CAAA;ACjChC,IAAA,qBAAA,WAAA;EAAA,sFAAA,SAAA,QAAA;AAAA;AAEA,QAAI;AACF,aAAO,UAAU,wBAAA,EAA0B,SAAS;IACtD,SAAS,GAAG;AACV,aAAO,UAAU,iBAAA;IACnB;EAAA;AAAA,CAAA;ACNA,IAAA,sBAAA,WAAA;EAAA,wHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,EAAE,aAAa,IAAI,kBAAA;AAEzB,QAAM,aAAa,OAAO,OAAO,OAAO;AAUxC,aAAS,OAAO,MAAM,aAAa;AACjC,UAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,UAAI,KAAK,WAAW,EAAG,QAAO,KAAK,CAAC;AAEpC,YAAM,SAAS,OAAO,YAAY,WAAW;AAC7C,UAAI,SAAS;AAEb,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,CAAC;AAClB,eAAO,IAAI,KAAK,MAAM;AACtB,kBAAU,IAAI;MAChB;AAEA,UAAI,SAAS,aAAa;AACxB,eAAO,IAAI,WAAW,OAAO,QAAQ,OAAO,YAAY,MAAM;MAChE;AAEA,aAAO;IACT;AAYA,aAAS,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AACnD,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,SAAS,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC;MAC7C;IACF;AASA,aAAS,QAAQ,QAAQ,MAAM;AAC7B,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAO,CAAC,KAAK,KAAK,IAAI,CAAC;MACzB;IACF;AASA,aAAS,cAAc,KAAK;AAC1B,UAAI,IAAI,WAAW,IAAI,OAAO,YAAY;AACxC,eAAO,IAAI;MACb;AAEA,aAAO,IAAI,OAAO,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,MAAM;IACrE;AAUA,aAAS,SAAS,MAAM;AACtB,eAAS,WAAW;AAEpB,UAAI,OAAO,SAAS,IAAI,EAAG,QAAO;AAElC,UAAI;AAEJ,UAAI,gBAAgB,aAAa;AAC/B,cAAM,IAAI,WAAW,IAAI;MAC3B,WAAW,YAAY,OAAO,IAAI,GAAG;AACnC,cAAM,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,UAAU;MACpE,OAAO;AACL,cAAM,OAAO,KAAK,IAAI;AACtB,iBAAS,WAAW;MACtB;AAEA,aAAO;IACT;AAEA,WAAO,UAAU;MACf;MACA,MAAM;MACN;MACA;MACA,QAAQ;IACV;AAGA,QAAI,CAAC,QAAQ,IAAI,mBAAmB;AAClC,UAAI;AACF,cAAM,aAAa,mBAAA;AAEnB,eAAO,QAAQ,OAAO,SAAU,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AACpE,cAAI,SAAS,GAAI,OAAM,QAAQ,MAAM,QAAQ,QAAQ,MAAM;cACtD,YAAW,KAAK,QAAQ,MAAM,QAAQ,QAAQ,MAAM;QAC3D;AAEA,eAAO,QAAQ,SAAS,SAAU,QAAQ,MAAM;AAC9C,cAAI,OAAO,SAAS,GAAI,SAAQ,QAAQ,IAAI;cACvC,YAAW,OAAO,QAAQ,IAAI;QACrC;MACF,SAAS,GAAG;MAEZ;IACF;EAAA;AAAA,CAAA;AClIA,IAAA,kBAAA,WAAA;EAAA,oHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,QAAQ,OAAO,OAAO;AAC5B,QAAM,OAAO,OAAO,MAAM;AAM1B,QAAM,UAAN,MAAc;;;;;;;MAOZ,YAAY,aAAa;AACvB,aAAK,KAAK,IAAI,MAAM;AAClB,eAAK;AACL,eAAK,IAAI,EAAE;QACb;AACA,aAAK,cAAc,eAAe;AAClC,aAAK,OAAO,CAAC;AACb,aAAK,UAAU;MACjB;;;;;;;MAQA,IAAI,KAAK;AACP,aAAK,KAAK,KAAK,GAAG;AAClB,aAAK,IAAI,EAAE;MACb;;;;;;MAOA,CAAC,IAAI,IAAI;AACP,YAAI,KAAK,YAAY,KAAK,YAAa;AAEvC,YAAI,KAAK,KAAK,QAAQ;AACpB,gBAAM,MAAM,KAAK,KAAK,MAAM;AAE5B,eAAK;AACL,cAAI,KAAK,KAAK,CAAC;QACjB;MACF;IACF;AAEA,WAAO,UAAU;EAAA;AAAA,CAAA;ACtDjB,IAAA,6BAAA,WAAA;EAAA,+HAAA,SAAA,QAAA;AAAA;AAEA,QAAM,OAAO,UAAQ,MAAM;AAE3B,QAAM,aAAa,oBAAA;AACnB,QAAM,UAAU,gBAAA;AAChB,QAAM,EAAE,YAAY,IAAI,kBAAA;AAExB,QAAM,aAAa,OAAO,OAAO,OAAO;AACxC,QAAM,UAAU,OAAO,KAAK,CAAC,GAAM,GAAM,KAAM,GAAI,CAAC;AACpD,QAAM,qBAAqB,OAAO,oBAAoB;AACtD,QAAM,eAAe,OAAO,cAAc;AAC1C,QAAM,YAAY,OAAO,UAAU;AACnC,QAAM,WAAW,OAAO,SAAS;AACjC,QAAM,SAAS,OAAO,OAAO;AAS7B,QAAI;AAKJ,QAAM,oBAAN,MAAwB;;;;;;;;;;;;;;;;;;;;;;;;;MAyBtB,YAAY,SAAS,UAAU,YAAY;AACzC,aAAK,cAAc,aAAa;AAChC,aAAK,WAAW,WAAW,CAAC;AAC5B,aAAK,aACH,KAAK,SAAS,cAAc,SAAY,KAAK,SAAS,YAAY;AACpE,aAAK,YAAY,CAAC,CAAC;AACnB,aAAK,WAAW;AAChB,aAAK,WAAW;AAEhB,aAAK,SAAS;AAEd,YAAI,CAAC,aAAa;AAChB,gBAAM,cACJ,KAAK,SAAS,qBAAqB,SAC/B,KAAK,SAAS,mBACd;AACN,wBAAc,IAAI,QAAQ,WAAW;QACvC;MACF;;;;MAKA,WAAW,gBAAgB;AACzB,eAAO;MACT;;;;;;;MAQA,QAAQ;AACN,cAAM,SAAS,CAAC;AAEhB,YAAI,KAAK,SAAS,yBAAyB;AACzC,iBAAO,6BAA6B;QACtC;AACA,YAAI,KAAK,SAAS,yBAAyB;AACzC,iBAAO,6BAA6B;QACtC;AACA,YAAI,KAAK,SAAS,qBAAqB;AACrC,iBAAO,yBAAyB,KAAK,SAAS;QAChD;AACA,YAAI,KAAK,SAAS,qBAAqB;AACrC,iBAAO,yBAAyB,KAAK,SAAS;QAChD,WAAW,KAAK,SAAS,uBAAuB,MAAM;AACpD,iBAAO,yBAAyB;QAClC;AAEA,eAAO;MACT;;;;;;;;MASA,OAAO,gBAAgB;AACrB,yBAAiB,KAAK,gBAAgB,cAAc;AAEpD,aAAK,SAAS,KAAK,YACf,KAAK,eAAe,cAAc,IAClC,KAAK,eAAe,cAAc;AAEtC,eAAO,KAAK;MACd;;;;;;MAOA,UAAU;AACR,YAAI,KAAK,UAAU;AACjB,eAAK,SAAS,MAAM;AACpB,eAAK,WAAW;QAClB;AAEA,YAAI,KAAK,UAAU;AACjB,gBAAM,WAAW,KAAK,SAAS,SAAS;AAExC,eAAK,SAAS,MAAM;AACpB,eAAK,WAAW;AAEhB,cAAI,UAAU;AACZ;cACE,IAAI;gBACF;cACF;YACF;UACF;QACF;MACF;;;;;;;;MASA,eAAe,QAAQ;AACrB,cAAM,OAAO,KAAK;AAClB,cAAM,WAAW,OAAO,KAAK,CAAC,WAAW;AACvC,cACG,KAAK,4BAA4B,SAChC,OAAO,8BACR,OAAO,2BACL,KAAK,wBAAwB,SAC3B,OAAO,KAAK,wBAAwB,YACnC,KAAK,sBAAsB,OAAO,2BACvC,OAAO,KAAK,wBAAwB,YACnC,CAAC,OAAO,wBACV;AACA,mBAAO;UACT;AAEA,iBAAO;QACT,CAAC;AAED,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,8CAA8C;QAChE;AAEA,YAAI,KAAK,yBAAyB;AAChC,mBAAS,6BAA6B;QACxC;AACA,YAAI,KAAK,yBAAyB;AAChC,mBAAS,6BAA6B;QACxC;AACA,YAAI,OAAO,KAAK,wBAAwB,UAAU;AAChD,mBAAS,yBAAyB,KAAK;QACzC;AACA,YAAI,OAAO,KAAK,wBAAwB,UAAU;AAChD,mBAAS,yBAAyB,KAAK;QACzC,WACE,SAAS,2BAA2B,QACpC,KAAK,wBAAwB,OAC7B;AACA,iBAAO,SAAS;QAClB;AAEA,eAAO;MACT;;;;;;;;MASA,eAAe,UAAU;AACvB,cAAM,SAAS,SAAS,CAAC;AAEzB,YACE,KAAK,SAAS,4BAA4B,SAC1C,OAAO,4BACP;AACA,gBAAM,IAAI,MAAM,mDAAmD;QACrE;AAEA,YAAI,CAAC,OAAO,wBAAwB;AAClC,cAAI,OAAO,KAAK,SAAS,wBAAwB,UAAU;AACzD,mBAAO,yBAAyB,KAAK,SAAS;UAChD;QACF,WACE,KAAK,SAAS,wBAAwB,SACrC,OAAO,KAAK,SAAS,wBAAwB,YAC5C,OAAO,yBAAyB,KAAK,SAAS,qBAChD;AACA,gBAAM,IAAI;YACR;UACF;QACF;AAEA,eAAO;MACT;;;;;;;;MASA,gBAAgB,gBAAgB;AAC9B,uBAAe,QAAQ,CAAC,WAAW;AACjC,iBAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACnC,gBAAI,QAAQ,OAAO,GAAG;AAEtB,gBAAI,MAAM,SAAS,GAAG;AACpB,oBAAM,IAAI,MAAM,cAAc,GAAG,iCAAiC;YACpE;AAEA,oBAAQ,MAAM,CAAC;AAEf,gBAAI,QAAQ,0BAA0B;AACpC,kBAAI,UAAU,MAAM;AAClB,sBAAM,MAAM,CAAC;AACb,oBAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,IAAI;AACjD,wBAAM,IAAI;oBACR,gCAAgC,GAAG,MAAM,KAAK;kBAChD;gBACF;AACA,wBAAQ;cACV,WAAW,CAAC,KAAK,WAAW;AAC1B,sBAAM,IAAI;kBACR,gCAAgC,GAAG,MAAM,KAAK;gBAChD;cACF;YACF,WAAW,QAAQ,0BAA0B;AAC3C,oBAAM,MAAM,CAAC;AACb,kBAAI,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,IAAI;AACjD,sBAAM,IAAI;kBACR,gCAAgC,GAAG,MAAM,KAAK;gBAChD;cACF;AACA,sBAAQ;YACV,WACE,QAAQ,gCACR,QAAQ,8BACR;AACA,kBAAI,UAAU,MAAM;AAClB,sBAAM,IAAI;kBACR,gCAAgC,GAAG,MAAM,KAAK;gBAChD;cACF;YACF,OAAO;AACL,oBAAM,IAAI,MAAM,sBAAsB,GAAG,GAAG;YAC9C;AAEA,mBAAO,GAAG,IAAI;UAChB,CAAC;QACH,CAAC;AAED,eAAO;MACT;;;;;;;;;MAUA,WAAW,MAAM,KAAK,UAAU;AAC9B,oBAAY,IAAI,CAAC,SAAS;AACxB,eAAK,YAAY,MAAM,KAAK,CAAC,KAAK,WAAW;AAC3C,iBAAK;AACL,qBAAS,KAAK,MAAM;UACtB,CAAC;QACH,CAAC;MACH;;;;;;;;;MAUA,SAAS,MAAM,KAAK,UAAU;AAC5B,oBAAY,IAAI,CAAC,SAAS;AACxB,eAAK,UAAU,MAAM,KAAK,CAAC,KAAK,WAAW;AACzC,iBAAK;AACL,qBAAS,KAAK,MAAM;UACtB,CAAC;QACH,CAAC;MACH;;;;;;;;;MAUA,YAAY,MAAM,KAAK,UAAU;AAC/B,cAAM,WAAW,KAAK,YAAY,WAAW;AAE7C,YAAI,CAAC,KAAK,UAAU;AAClB,gBAAM,MAAM,GAAG,QAAQ;AACvB,gBAAM,aACJ,OAAO,KAAK,OAAO,GAAG,MAAM,WACxB,KAAK,uBACL,KAAK,OAAO,GAAG;AAErB,eAAK,WAAW,KAAK,iBAAiB;YACpC,GAAG,KAAK,SAAS;YACjB;UACF,CAAC;AACD,eAAK,SAAS,kBAAkB,IAAI;AACpC,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAC3B,eAAK,SAAS,GAAG,SAAS,cAAc;AACxC,eAAK,SAAS,GAAG,QAAQ,aAAa;QACxC;AAEA,aAAK,SAAS,SAAS,IAAI;AAE3B,aAAK,SAAS,MAAM,IAAI;AACxB,YAAI,IAAK,MAAK,SAAS,MAAM,OAAO;AAEpC,aAAK,SAAS,MAAM,MAAM;AACxB,gBAAM,MAAM,KAAK,SAAS,MAAM;AAEhC,cAAI,KAAK;AACP,iBAAK,SAAS,MAAM;AACpB,iBAAK,WAAW;AAChB,qBAAS,GAAG;AACZ;UACF;AAEA,gBAAMC,QAAO,WAAW;YACtB,KAAK,SAAS,QAAQ;YACtB,KAAK,SAAS,YAAY;UAC5B;AAEA,cAAI,KAAK,SAAS,eAAe,YAAY;AAC3C,iBAAK,SAAS,MAAM;AACpB,iBAAK,WAAW;UAClB,OAAO;AACL,iBAAK,SAAS,YAAY,IAAI;AAC9B,iBAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,gBAAI,OAAO,KAAK,OAAO,GAAG,QAAQ,sBAAsB,GAAG;AACzD,mBAAK,SAAS,MAAM;YACtB;UACF;AAEA,mBAAS,MAAMA,KAAI;QACrB,CAAC;MACH;;;;;;;;;MAUA,UAAU,MAAM,KAAK,UAAU;AAC7B,cAAM,WAAW,KAAK,YAAY,WAAW;AAE7C,YAAI,CAAC,KAAK,UAAU;AAClB,gBAAM,MAAM,GAAG,QAAQ;AACvB,gBAAM,aACJ,OAAO,KAAK,OAAO,GAAG,MAAM,WACxB,KAAK,uBACL,KAAK,OAAO,GAAG;AAErB,eAAK,WAAW,KAAK,iBAAiB;YACpC,GAAG,KAAK,SAAS;YACjB;UACF,CAAC;AAED,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,eAAK,SAAS,GAAG,QAAQ,aAAa;QACxC;AAEA,aAAK,SAAS,SAAS,IAAI;AAE3B,aAAK,SAAS,MAAM,IAAI;AACxB,aAAK,SAAS,MAAM,KAAK,cAAc,MAAM;AAC3C,cAAI,CAAC,KAAK,UAAU;AAIlB;UACF;AAEA,cAAIA,QAAO,WAAW;YACpB,KAAK,SAAS,QAAQ;YACtB,KAAK,SAAS,YAAY;UAC5B;AAEA,cAAI,KAAK;AACPA,oBAAO,IAAI,WAAWA,MAAK,QAAQA,MAAK,YAAYA,MAAK,SAAS,CAAC;UACrE;AAMA,eAAK,SAAS,SAAS,IAAI;AAE3B,eAAK,SAAS,YAAY,IAAI;AAC9B,eAAK,SAAS,QAAQ,IAAI,CAAC;AAE3B,cAAI,OAAO,KAAK,OAAO,GAAG,QAAQ,sBAAsB,GAAG;AACzD,iBAAK,SAAS,MAAM;UACtB;AAEA,mBAAS,MAAMA,KAAI;QACrB,CAAC;MACH;IACF;AAEA,WAAO,UAAU;AAQjB,aAAS,cAAc,OAAO;AAC5B,WAAK,QAAQ,EAAE,KAAK,KAAK;AACzB,WAAK,YAAY,KAAK,MAAM;IAC9B;AAQA,aAAS,cAAc,OAAO;AAC5B,WAAK,YAAY,KAAK,MAAM;AAE5B,UACE,KAAK,kBAAkB,EAAE,cAAc,KACvC,KAAK,YAAY,KAAK,KAAK,kBAAkB,EAAE,aAC/C;AACA,aAAK,QAAQ,EAAE,KAAK,KAAK;AACzB;MACF;AAEA,WAAK,MAAM,IAAI,IAAI,WAAW,2BAA2B;AACzD,WAAK,MAAM,EAAE,OAAO;AACpB,WAAK,MAAM,EAAE,WAAW,IAAI;AAC5B,WAAK,eAAe,QAAQ,aAAa;AACzC,WAAK,MAAM;IACb;AAQA,aAAS,eAAe,KAAK;AAK3B,WAAK,kBAAkB,EAAE,WAAW;AACpC,UAAI,WAAW,IAAI;AACnB,WAAK,SAAS,EAAE,GAAG;IACrB;EAAA;AAAA,CAAA;ACjgBA,IAAAC,oBAAA,WAAA;EAAA,kGAAA,SAAA,QAAA;AAAA;AAWA,aAAS,YAAY,KAAK;AACxB,YAAM,MAAM,IAAI;AAChB,UAAI,IAAI;AAER,aAAO,IAAI,KAAK;AACd,aAAK,IAAI,CAAC,IAAI,SAAU,GAAM;AAC5B;QACF,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AACnC,cACE,IAAI,MAAM,QACT,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,CAAC,IAAI,SAAU,KACpB;AACA,mBAAO;UACT;AAEA,eAAK;QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AACnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACxB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;UAC3C,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU,KAC3C;AACA,mBAAO;UACT;AAEA,eAAK;QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AACnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACxB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;UAC3C,IAAI,CAAC,MAAM,OAAQ,IAAI,IAAI,CAAC,IAAI,OAAQ,IAAI,CAAC,IAAI,KACjD;AACA,mBAAO;UACT;AAEA,eAAK;QACP,OAAO;AACL,iBAAO;QACT;MACF;AAEA,aAAO;IACT;AAEA,WAAO,UAAU;EAAA;AAAA,CAAA;AC7DjB,IAAA,yBAAA,WAAA;EAAA,+FAAA,SAAA,QAAA;AAAA;AAEA,QAAI;AACF,aAAO,UAAU,wBAAA,EAA0B,SAAS;IACtD,SAAS,GAAG;AACV,aAAO,UAAU,kBAAA;IACnB;EAAA;AAAA,CAAA;ACNA,IAAA,qBAAA,WAAA;EAAA,uHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AAEnC,QAAM,EAAE,QAAQ,IAAI,kBAAA;AAcpB,QAAM,aAAa;MACjB;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;MAC7C;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;MAC7C;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;MAC7C;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;MAC7C;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;MAC7C;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;MAC7C;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;MAC7C;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;MAAG;;IAC/C;AASA,aAAS,kBAAkBC,OAAM;AAC/B,aACGA,SAAQ,OACPA,SAAQ,QACRA,UAAS,QACTA,UAAS,QACTA,UAAS,QACVA,SAAQ,OAAQA,SAAQ;IAE7B;AAWA,aAAS,aAAa,KAAK;AACzB,YAAM,MAAM,IAAI;AAChB,UAAI,IAAI;AAER,aAAO,IAAI,KAAK;AACd,aAAK,IAAI,CAAC,IAAI,SAAU,GAAG;AAEzB;QACF,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,MAAM,QACT,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,CAAC,IAAI,SAAU,KACpB;AACA,mBAAO;UACT;AAEA,eAAK;QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACvB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;UAC3C,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU,KAC5C;AACA,mBAAO;UACT;AAEA,eAAK;QACP,YAAY,IAAI,CAAC,IAAI,SAAU,KAAM;AAEnC,cACE,IAAI,KAAK,QACR,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,QACvB,IAAI,IAAI,CAAC,IAAI,SAAU,OACvB,IAAI,CAAC,MAAM,QAAS,IAAI,IAAI,CAAC,IAAI,SAAU;UAC3C,IAAI,CAAC,MAAM,OAAQ,IAAI,IAAI,CAAC,IAAI,OACjC,IAAI,CAAC,IAAI,KACT;AACA,mBAAO;UACT;AAEA,eAAK;QACP,OAAO;AACL,iBAAO;QACT;MACF;AAEA,aAAO;IACT;AASA,aAAS,OAAO,OAAO;AACrB,aACE,WACA,OAAO,UAAU,YACjB,OAAO,MAAM,gBAAgB,cAC7B,OAAO,MAAM,SAAS,YACtB,OAAO,MAAM,WAAW,eACvB,MAAM,OAAO,WAAW,MAAM,UAC7B,MAAM,OAAO,WAAW,MAAM;IAEpC;AAEA,WAAO,UAAU;MACf;MACA;MACA,aAAa;MACb;IACF;AAEA,QAAI,QAAQ;AACV,aAAO,QAAQ,cAAc,SAAU,KAAK;AAC1C,eAAO,IAAI,SAAS,KAAK,aAAa,GAAG,IAAI,OAAO,GAAG;MACzD;IACF,WAAuC,CAAC,QAAQ,IAAI,sBAAsB;AACxE,UAAI;AACF,cAAM,cAAc,uBAAA;AAEpB,eAAO,QAAQ,cAAc,SAAU,KAAK;AAC1C,iBAAO,IAAI,SAAS,KAAK,aAAa,GAAG,IAAI,YAAY,GAAG;QAC9D;MACF,SAAS,GAAG;MAEZ;IACF;EAAA;AAAA,CAAA;ACvJA,IAAA,mBAAA,WAAA;EAAA,qHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,EAAE,SAAS,IAAI,UAAQ,QAAQ;AAErC,QAAM,oBAAoB,2BAAA;AAC1B,QAAM;MACJ;MACA;MACA;MACA;IACF,IAAI,kBAAA;AACJ,QAAM,EAAE,QAAQ,eAAe,OAAO,IAAI,oBAAA;AAC1C,QAAM,EAAE,mBAAmB,YAAY,IAAI,mBAAA;AAE3C,QAAM,aAAa,OAAO,OAAO,OAAO;AAExC,QAAM,WAAW;AACjB,QAAM,wBAAwB;AAC9B,QAAM,wBAAwB;AAC9B,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,cAAc;AAOpB,QAAMC,YAAN,cAAuB,SAAS;;;;;;;;;;;;;;;;;MAiB9B,YAAY,UAAU,CAAC,GAAG;AACxB,cAAM;AAEN,aAAK,0BACH,QAAQ,2BAA2B,SAC/B,QAAQ,yBACR;AACN,aAAK,cAAc,QAAQ,cAAc,aAAa,CAAC;AACvD,aAAK,cAAc,QAAQ,cAAc,CAAC;AAC1C,aAAK,YAAY,CAAC,CAAC,QAAQ;AAC3B,aAAK,cAAc,QAAQ,aAAa;AACxC,aAAK,sBAAsB,CAAC,CAAC,QAAQ;AACrC,aAAK,UAAU,IAAI;AAEnB,aAAK,iBAAiB;AACtB,aAAK,WAAW,CAAC;AAEjB,aAAK,cAAc;AACnB,aAAK,iBAAiB;AACtB,aAAK,QAAQ;AACb,aAAK,cAAc;AACnB,aAAK,UAAU;AACf,aAAK,OAAO;AACZ,aAAK,UAAU;AAEf,aAAK,sBAAsB;AAC3B,aAAK,iBAAiB;AACtB,aAAK,aAAa,CAAC;AAEnB,aAAK,WAAW;AAChB,aAAK,QAAQ;AACb,aAAK,SAAS;MAChB;;;;;;;;;MAUA,OAAO,OAAO,UAAU,IAAI;AAC1B,YAAI,KAAK,YAAY,KAAQ,KAAK,UAAU,SAAU,QAAO,GAAG;AAEhE,aAAK,kBAAkB,MAAM;AAC7B,aAAK,SAAS,KAAK,KAAK;AACxB,aAAK,UAAU,EAAE;MACnB;;;;;;;;MASA,QAAQ,GAAG;AACT,aAAK,kBAAkB;AAEvB,YAAI,MAAM,KAAK,SAAS,CAAC,EAAE,OAAQ,QAAO,KAAK,SAAS,MAAM;AAE9D,YAAI,IAAI,KAAK,SAAS,CAAC,EAAE,QAAQ;AAC/B,gBAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,eAAK,SAAS,CAAC,IAAI,IAAI;YACrB,IAAI;YACJ,IAAI,aAAa;YACjB,IAAI,SAAS;UACf;AAEA,iBAAO,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,CAAC;QACrD;AAEA,cAAM,MAAM,OAAO,YAAY,CAAC;AAEhC,WAAG;AACD,gBAAM,MAAM,KAAK,SAAS,CAAC;AAC3B,gBAAM,SAAS,IAAI,SAAS;AAE5B,cAAI,KAAK,IAAI,QAAQ;AACnB,gBAAI,IAAI,KAAK,SAAS,MAAM,GAAG,MAAM;UACvC,OAAO;AACL,gBAAI,IAAI,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,CAAC,GAAG,MAAM;AAC7D,iBAAK,SAAS,CAAC,IAAI,IAAI;cACrB,IAAI;cACJ,IAAI,aAAa;cACjB,IAAI,SAAS;YACf;UACF;AAEA,eAAK,IAAI;QACX,SAAS,IAAI;AAEb,eAAO;MACT;;;;;;;MAQA,UAAU,IAAI;AACZ,aAAK,QAAQ;AAEb,WAAG;AACD,kBAAQ,KAAK,QAAQ;YACnB,KAAK;AACH,mBAAK,QAAQ,EAAE;AACf;YACF,KAAK;AACH,mBAAK,mBAAmB,EAAE;AAC1B;YACF,KAAK;AACH,mBAAK,mBAAmB,EAAE;AAC1B;YACF,KAAK;AACH,mBAAK,QAAQ;AACb;YACF,KAAK;AACH,mBAAK,QAAQ,EAAE;AACf;YACF,KAAK;YACL,KAAK;AACH,mBAAK,QAAQ;AACb;UACJ;QACF,SAAS,KAAK;AAEd,YAAI,CAAC,KAAK,SAAU,IAAG;MACzB;;;;;;;MAQA,QAAQ,IAAI;AACV,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;QACF;AAEA,cAAM,MAAM,KAAK,QAAQ,CAAC;AAE1B,aAAK,IAAI,CAAC,IAAI,QAAU,GAAM;AAC5B,gBAAM,QAAQ,KAAK;YACjB;YACA;YACA;YACA;YACA;UACF;AAEA,aAAG,KAAK;AACR;QACF;AAEA,cAAM,cAAc,IAAI,CAAC,IAAI,QAAU;AAEvC,YAAI,cAAc,CAAC,KAAK,YAAY,kBAAkB,aAAa,GAAG;AACpE,gBAAM,QAAQ,KAAK;YACjB;YACA;YACA;YACA;YACA;UACF;AAEA,aAAG,KAAK;AACR;QACF;AAEA,aAAK,QAAQ,IAAI,CAAC,IAAI,SAAU;AAChC,aAAK,UAAU,IAAI,CAAC,IAAI;AACxB,aAAK,iBAAiB,IAAI,CAAC,IAAI;AAE/B,YAAI,KAAK,YAAY,GAAM;AACzB,cAAI,YAAY;AACd,kBAAM,QAAQ,KAAK;cACjB;cACA;cACA;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;AAEA,cAAI,CAAC,KAAK,aAAa;AACrB,kBAAM,QAAQ,KAAK;cACjB;cACA;cACA;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;AAEA,eAAK,UAAU,KAAK;QACtB,WAAW,KAAK,YAAY,KAAQ,KAAK,YAAY,GAAM;AACzD,cAAI,KAAK,aAAa;AACpB,kBAAM,QAAQ,KAAK;cACjB;cACA,kBAAkB,KAAK,OAAO;cAC9B;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;AAEA,eAAK,cAAc;QACrB,WAAW,KAAK,UAAU,KAAQ,KAAK,UAAU,IAAM;AACrD,cAAI,CAAC,KAAK,MAAM;AACd,kBAAM,QAAQ,KAAK;cACjB;cACA;cACA;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;AAEA,cAAI,YAAY;AACd,kBAAM,QAAQ,KAAK;cACjB;cACA;cACA;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;AAEA,cACE,KAAK,iBAAiB,OACrB,KAAK,YAAY,KAAQ,KAAK,mBAAmB,GAClD;AACA,kBAAM,QAAQ,KAAK;cACjB;cACA,0BAA0B,KAAK,cAAc;cAC7C;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;QACF,OAAO;AACL,gBAAM,QAAQ,KAAK;YACjB;YACA,kBAAkB,KAAK,OAAO;YAC9B;YACA;YACA;UACF;AAEA,aAAG,KAAK;AACR;QACF;AAEA,YAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,YAAa,MAAK,cAAc,KAAK;AAC7D,aAAK,WAAW,IAAI,CAAC,IAAI,SAAU;AAEnC,YAAI,KAAK,WAAW;AAClB,cAAI,CAAC,KAAK,SAAS;AACjB,kBAAM,QAAQ,KAAK;cACjB;cACA;cACA;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;QACF,WAAW,KAAK,SAAS;AACvB,gBAAM,QAAQ,KAAK;YACjB;YACA;YACA;YACA;YACA;UACF;AAEA,aAAG,KAAK;AACR;QACF;AAEA,YAAI,KAAK,mBAAmB,IAAK,MAAK,SAAS;iBACtC,KAAK,mBAAmB,IAAK,MAAK,SAAS;YAC/C,MAAK,WAAW,EAAE;MACzB;;;;;;;MAQA,mBAAmB,IAAI;AACrB,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;QACF;AAEA,aAAK,iBAAiB,KAAK,QAAQ,CAAC,EAAE,aAAa,CAAC;AACpD,aAAK,WAAW,EAAE;MACpB;;;;;;;MAQA,mBAAmB,IAAI;AACrB,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;QACF;AAEA,cAAM,MAAM,KAAK,QAAQ,CAAC;AAC1B,cAAM,MAAM,IAAI,aAAa,CAAC;AAM9B,YAAI,MAAM,KAAK,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG;AAClC,gBAAM,QAAQ,KAAK;YACjB;YACA;YACA;YACA;YACA;UACF;AAEA,aAAG,KAAK;AACR;QACF;AAEA,aAAK,iBAAiB,MAAM,KAAK,IAAI,GAAG,EAAE,IAAI,IAAI,aAAa,CAAC;AAChE,aAAK,WAAW,EAAE;MACpB;;;;;;;MAQA,WAAW,IAAI;AACb,YAAI,KAAK,kBAAkB,KAAK,UAAU,GAAM;AAC9C,eAAK,uBAAuB,KAAK;AACjC,cAAI,KAAK,sBAAsB,KAAK,eAAe,KAAK,cAAc,GAAG;AACvE,kBAAM,QAAQ,KAAK;cACjB;cACA;cACA;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;QACF;AAEA,YAAI,KAAK,QAAS,MAAK,SAAS;YAC3B,MAAK,SAAS;MACrB;;;;;;MAOA,UAAU;AACR,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,QAAQ;AACb;QACF;AAEA,aAAK,QAAQ,KAAK,QAAQ,CAAC;AAC3B,aAAK,SAAS;MAChB;;;;;;;MAQA,QAAQ,IAAI;AACV,YAAI,OAAO;AAEX,YAAI,KAAK,gBAAgB;AACvB,cAAI,KAAK,iBAAiB,KAAK,gBAAgB;AAC7C,iBAAK,QAAQ;AACb;UACF;AAEA,iBAAO,KAAK,QAAQ,KAAK,cAAc;AAEvC,cACE,KAAK,YACJ,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,GACpE;AACA,mBAAO,MAAM,KAAK,KAAK;UACzB;QACF;AAEA,YAAI,KAAK,UAAU,GAAM;AACvB,eAAK,eAAe,MAAM,EAAE;AAC5B;QACF;AAEA,YAAI,KAAK,aAAa;AACpB,eAAK,SAAS;AACd,eAAK,WAAW,MAAM,EAAE;AACxB;QACF;AAEA,YAAI,KAAK,QAAQ;AAKf,eAAK,iBAAiB,KAAK;AAC3B,eAAK,WAAW,KAAK,IAAI;QAC3B;AAEA,aAAK,YAAY,EAAE;MACrB;;;;;;;;MASA,WAAW,MAAM,IAAI;AACnB,cAAM,oBAAoB,KAAK,YAAY,kBAAkB,aAAa;AAE1E,0BAAkB,WAAW,MAAM,KAAK,MAAM,CAAC,KAAK,QAAQ;AAC1D,cAAI,IAAK,QAAO,GAAG,GAAG;AAEtB,cAAI,IAAI,QAAQ;AACd,iBAAK,kBAAkB,IAAI;AAC3B,gBAAI,KAAK,iBAAiB,KAAK,eAAe,KAAK,cAAc,GAAG;AAClE,oBAAM,QAAQ,KAAK;gBACjB;gBACA;gBACA;gBACA;gBACA;cACF;AAEA,iBAAG,KAAK;AACR;YACF;AAEA,iBAAK,WAAW,KAAK,GAAG;UAC1B;AAEA,eAAK,YAAY,EAAE;AACnB,cAAI,KAAK,WAAW,SAAU,MAAK,UAAU,EAAE;QACjD,CAAC;MACH;;;;;;;MAQA,YAAY,IAAI;AACd,YAAI,CAAC,KAAK,MAAM;AACd,eAAK,SAAS;AACd;QACF;AAEA,cAAM,gBAAgB,KAAK;AAC3B,cAAM,YAAY,KAAK;AAEvB,aAAK,sBAAsB;AAC3B,aAAK,iBAAiB;AACtB,aAAK,cAAc;AACnB,aAAK,aAAa,CAAC;AAEnB,YAAI,KAAK,YAAY,GAAG;AACtB,cAAI;AAEJ,cAAI,KAAK,gBAAgB,cAAc;AACrC,mBAAO,OAAO,WAAW,aAAa;UACxC,WAAW,KAAK,gBAAgB,eAAe;AAC7C,mBAAO,cAAc,OAAO,WAAW,aAAa,CAAC;UACvD,WAAW,KAAK,gBAAgB,QAAQ;AACtC,mBAAO,IAAI,KAAK,SAAS;UAC3B,OAAO;AACL,mBAAO;UACT;AAEA,cAAI,KAAK,yBAAyB;AAChC,iBAAK,KAAK,WAAW,MAAM,IAAI;AAC/B,iBAAK,SAAS;UAChB,OAAO;AACL,iBAAK,SAAS;AACd,yBAAa,MAAM;AACjB,mBAAK,KAAK,WAAW,MAAM,IAAI;AAC/B,mBAAK,SAAS;AACd,mBAAK,UAAU,EAAE;YACnB,CAAC;UACH;QACF,OAAO;AACL,gBAAM,MAAM,OAAO,WAAW,aAAa;AAE3C,cAAI,CAAC,KAAK,uBAAuB,CAAC,YAAY,GAAG,GAAG;AAClD,kBAAM,QAAQ,KAAK;cACjB;cACA;cACA;cACA;cACA;YACF;AAEA,eAAG,KAAK;AACR;UACF;AAEA,cAAI,KAAK,WAAW,aAAa,KAAK,yBAAyB;AAC7D,iBAAK,KAAK,WAAW,KAAK,KAAK;AAC/B,iBAAK,SAAS;UAChB,OAAO;AACL,iBAAK,SAAS;AACd,yBAAa,MAAM;AACjB,mBAAK,KAAK,WAAW,KAAK,KAAK;AAC/B,mBAAK,SAAS;AACd,mBAAK,UAAU,EAAE;YACnB,CAAC;UACH;QACF;MACF;;;;;;;;MASA,eAAe,MAAM,IAAI;AACvB,YAAI,KAAK,YAAY,GAAM;AACzB,cAAI,KAAK,WAAW,GAAG;AACrB,iBAAK,QAAQ;AACb,iBAAK,KAAK,YAAY,MAAM,YAAY;AACxC,iBAAK,IAAI;UACX,OAAO;AACL,kBAAMD,QAAO,KAAK,aAAa,CAAC;AAEhC,gBAAI,CAAC,kBAAkBA,KAAI,GAAG;AAC5B,oBAAM,QAAQ,KAAK;gBACjB;gBACA,uBAAuBA,KAAI;gBAC3B;gBACA;gBACA;cACF;AAEA,iBAAG,KAAK;AACR;YACF;AAEA,kBAAM,MAAM,IAAI;cACd,KAAK;cACL,KAAK,aAAa;cAClB,KAAK,SAAS;YAChB;AAEA,gBAAI,CAAC,KAAK,uBAAuB,CAAC,YAAY,GAAG,GAAG;AAClD,oBAAM,QAAQ,KAAK;gBACjB;gBACA;gBACA;gBACA;gBACA;cACF;AAEA,iBAAG,KAAK;AACR;YACF;AAEA,iBAAK,QAAQ;AACb,iBAAK,KAAK,YAAYA,OAAM,GAAG;AAC/B,iBAAK,IAAI;UACX;AAEA,eAAK,SAAS;AACd;QACF;AAEA,YAAI,KAAK,yBAAyB;AAChC,eAAK,KAAK,KAAK,YAAY,IAAO,SAAS,QAAQ,IAAI;AACvD,eAAK,SAAS;QAChB,OAAO;AACL,eAAK,SAAS;AACd,uBAAa,MAAM;AACjB,iBAAK,KAAK,KAAK,YAAY,IAAO,SAAS,QAAQ,IAAI;AACvD,iBAAK,SAAS;AACd,iBAAK,UAAU,EAAE;UACnB,CAAC;QACH;MACF;;;;;;;;;;;;;MAcA,YAAY,WAAW,SAAS,QAAQ,YAAY,WAAW;AAC7D,aAAK,QAAQ;AACb,aAAK,WAAW;AAEhB,cAAM,MAAM,IAAI;UACd,SAAS,4BAA4B,OAAO,KAAK;QACnD;AAEA,cAAM,kBAAkB,KAAK,KAAK,WAAW;AAC7C,YAAI,OAAO;AACX,YAAI,WAAW,IAAI;AACnB,eAAO;MACT;IACF;AAEA,WAAO,UAAUC;EAAA;AAAA,CAAA;ACjsBjB,IAAA,iBAAA,WAAA;EAAA,mHAAA,SAAA,QAAA;AAAA;AAIA,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AACnC,QAAM,EAAE,eAAe,IAAI,UAAQ,QAAQ;AAE3C,QAAM,oBAAoB,2BAAA;AAC1B,QAAM,EAAE,cAAc,YAAY,KAAK,IAAI,kBAAA;AAC3C,QAAM,EAAE,QAAQ,kBAAkB,IAAI,mBAAA;AACtC,QAAM,EAAE,MAAM,WAAW,SAAS,IAAI,oBAAA;AAEtC,QAAM,cAAc,OAAO,aAAa;AACxC,QAAM,aAAa,OAAO,MAAM,CAAC;AACjC,QAAM,mBAAmB,IAAI;AAC7B,QAAI;AACJ,QAAI,oBAAoB;AAExB,QAAM,UAAU;AAChB,QAAM,YAAY;AAClB,QAAM,gBAAgB;AAKtB,QAAMC,UAAN,MAAM,QAAO;;;;;;;;;MASX,YAAY,QAAQ,YAAY,cAAc;AAC5C,aAAK,cAAc,cAAc,CAAC;AAElC,YAAI,cAAc;AAChB,eAAK,gBAAgB;AACrB,eAAK,cAAc,OAAO,MAAM,CAAC;QACnC;AAEA,aAAK,UAAU;AAEf,aAAK,iBAAiB;AACtB,aAAK,YAAY;AAEjB,aAAK,iBAAiB;AACtB,aAAK,SAAS,CAAC;AACf,aAAK,SAAS;AACd,aAAK,UAAU;AACf,aAAK,UAAU,IAAI;MACrB;;;;;;;;;;;;;;;;;;;;;;MAuBA,OAAO,MAAM,MAAM,SAAS;AAC1B,YAAI;AACJ,YAAI,QAAQ;AACZ,YAAI,SAAS;AACb,YAAI,cAAc;AAElB,YAAI,QAAQ,MAAM;AAChB,iBAAO,QAAQ,cAAc;AAE7B,cAAI,QAAQ,cAAc;AACxB,oBAAQ,aAAa,IAAI;UAC3B,OAAO;AACL,gBAAI,sBAAsB,kBAAkB;AAE1C,kBAAI,eAAe,QAAW;AAK5B,6BAAa,OAAO,MAAM,gBAAgB;cAC5C;AAEA,6BAAe,YAAY,GAAG,gBAAgB;AAC9C,kCAAoB;YACtB;AAEA,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;AACxC,iBAAK,CAAC,IAAI,WAAW,mBAAmB;UAC1C;AAEA,yBAAe,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO;AAC1D,mBAAS;QACX;AAEA,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,eACG,CAAC,QAAQ,QAAQ,gBAClB,QAAQ,WAAW,MAAM,QACzB;AACA,yBAAa,QAAQ,WAAW;UAClC,OAAO;AACL,mBAAO,OAAO,KAAK,IAAI;AACvB,yBAAa,KAAK;UACpB;QACF,OAAO;AACL,uBAAa,KAAK;AAClB,kBAAQ,QAAQ,QAAQ,QAAQ,YAAY,CAAC;QAC/C;AAEA,YAAI,gBAAgB;AAEpB,YAAI,cAAc,OAAO;AACvB,oBAAU;AACV,0BAAgB;QAClB,WAAW,aAAa,KAAK;AAC3B,oBAAU;AACV,0BAAgB;QAClB;AAEA,cAAM,SAAS,OAAO,YAAY,QAAQ,aAAa,SAAS,MAAM;AAEtE,eAAO,CAAC,IAAI,QAAQ,MAAM,QAAQ,SAAS,MAAO,QAAQ;AAC1D,YAAI,QAAQ,KAAM,QAAO,CAAC,KAAK;AAE/B,eAAO,CAAC,IAAI;AAEZ,YAAI,kBAAkB,KAAK;AACzB,iBAAO,cAAc,YAAY,CAAC;QACpC,WAAW,kBAAkB,KAAK;AAChC,iBAAO,CAAC,IAAI,OAAO,CAAC,IAAI;AACxB,iBAAO,YAAY,YAAY,GAAG,CAAC;QACrC;AAEA,YAAI,CAAC,QAAQ,KAAM,QAAO,CAAC,QAAQ,IAAI;AAEvC,eAAO,CAAC,KAAK;AACb,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAC3B,eAAO,SAAS,CAAC,IAAI,KAAK,CAAC;AAE3B,YAAI,YAAa,QAAO,CAAC,QAAQ,IAAI;AAErC,YAAI,OAAO;AACT,oBAAU,MAAM,MAAM,QAAQ,QAAQ,UAAU;AAChD,iBAAO,CAAC,MAAM;QAChB;AAEA,kBAAU,MAAM,MAAM,MAAM,GAAG,UAAU;AACzC,eAAO,CAAC,QAAQ,IAAI;MACtB;;;;;;;;;;MAWA,MAAMF,OAAM,MAAM,MAAM,IAAI;AAC1B,YAAI;AAEJ,YAAIA,UAAS,QAAW;AACtB,gBAAM;QACR,WAAW,OAAOA,UAAS,YAAY,CAAC,kBAAkBA,KAAI,GAAG;AAC/D,gBAAM,IAAI,UAAU,kDAAkD;QACxE,WAAW,SAAS,UAAa,CAAC,KAAK,QAAQ;AAC7C,gBAAM,OAAO,YAAY,CAAC;AAC1B,cAAI,cAAcA,OAAM,CAAC;QAC3B,OAAO;AACL,gBAAM,SAAS,OAAO,WAAW,IAAI;AAErC,cAAI,SAAS,KAAK;AAChB,kBAAM,IAAI,WAAW,gDAAgD;UACvE;AAEA,gBAAM,OAAO,YAAY,IAAI,MAAM;AACnC,cAAI,cAAcA,OAAM,CAAC;AAEzB,cAAI,OAAO,SAAS,UAAU;AAC5B,gBAAI,MAAM,MAAM,CAAC;UACnB,OAAO;AACL,gBAAI,IAAI,MAAM,CAAC;UACjB;QACF;AAEA,cAAM,UAAU;UACd,CAAC,WAAW,GAAG,IAAI;UACnB,KAAK;UACL,cAAc,KAAK;UACnB;UACA,YAAY,KAAK;UACjB,QAAQ;UACR,UAAU;UACV,MAAM;QACR;AAEA,YAAI,KAAK,WAAW,SAAS;AAC3B,eAAK,QAAQ,CAAC,KAAK,UAAU,KAAK,OAAO,SAAS,EAAE,CAAC;QACvD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,KAAK,OAAO,GAAG,EAAE;QAC/C;MACF;;;;;;;;;MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;QACtB;AAEA,YAAI,aAAa,KAAK;AACpB,gBAAM,IAAI,WAAW,kDAAkD;QACzE;AAEA,cAAM,UAAU;UACd,CAAC,WAAW,GAAG;UACf,KAAK;UACL,cAAc,KAAK;UACnB;UACA,YAAY,KAAK;UACjB,QAAQ;UACR;UACA,MAAM;QACR;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,OAAO,SAAS,EAAE,CAAC;UAC3D,OAAO;AACL,iBAAK,YAAY,MAAM,OAAO,SAAS,EAAE;UAC3C;QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC;QACxD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;QAChD;MACF;;;;;;;;;MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;QACtB;AAEA,YAAI,aAAa,KAAK;AACpB,gBAAM,IAAI,WAAW,kDAAkD;QACzE;AAEA,cAAM,UAAU;UACd,CAAC,WAAW,GAAG;UACf,KAAK;UACL,cAAc,KAAK;UACnB;UACA,YAAY,KAAK;UACjB,QAAQ;UACR;UACA,MAAM;QACR;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,OAAO,SAAS,EAAE,CAAC;UAC3D,OAAO;AACL,iBAAK,YAAY,MAAM,OAAO,SAAS,EAAE;UAC3C;QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC;QACxD,OAAO;AACL,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;QAChD;MACF;;;;;;;;;;;;;;;;;MAkBA,KAAK,MAAM,SAAS,IAAI;AACtB,cAAM,oBAAoB,KAAK,YAAY,kBAAkB,aAAa;AAC1E,YAAI,SAAS,QAAQ,SAAS,IAAI;AAClC,YAAI,OAAO,QAAQ;AAEnB,YAAI;AACJ,YAAI;AAEJ,YAAI,OAAO,SAAS,UAAU;AAC5B,uBAAa,OAAO,WAAW,IAAI;AACnC,qBAAW;QACb,WAAW,OAAO,IAAI,GAAG;AACvB,uBAAa,KAAK;AAClB,qBAAW;QACb,OAAO;AACL,iBAAO,SAAS,IAAI;AACpB,uBAAa,KAAK;AAClB,qBAAW,SAAS;QACtB;AAEA,YAAI,KAAK,gBAAgB;AACvB,eAAK,iBAAiB;AACtB,cACE,QACA,qBACA,kBAAkB,OAChB,kBAAkB,YACd,+BACA,4BACN,GACA;AACA,mBAAO,cAAc,kBAAkB;UACzC;AACA,eAAK,YAAY;QACnB,OAAO;AACL,iBAAO;AACP,mBAAS;QACX;AAEA,YAAI,QAAQ,IAAK,MAAK,iBAAiB;AAEvC,cAAM,OAAO;UACX,CAAC,WAAW,GAAG;UACf,KAAK,QAAQ;UACb,cAAc,KAAK;UACnB,MAAM,QAAQ;UACd,YAAY,KAAK;UACjB;UACA;UACA;QACF;AAEA,YAAI,OAAO,IAAI,GAAG;AAChB,cAAI,KAAK,WAAW,SAAS;AAC3B,iBAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,KAAK,WAAW,MAAM,EAAE,CAAC;UACjE,OAAO;AACL,iBAAK,YAAY,MAAM,KAAK,WAAW,MAAM,EAAE;UACjD;QACF,WAAW,KAAK,WAAW,SAAS;AAClC,eAAK,QAAQ,CAAC,KAAK,UAAU,MAAM,KAAK,WAAW,MAAM,EAAE,CAAC;QAC9D,OAAO;AACL,eAAK,SAAS,MAAM,KAAK,WAAW,MAAM,EAAE;QAC9C;MACF;;;;;;;;;;;;;;;;;;;;;;;;MAyBA,YAAY,MAAM,UAAU,SAAS,IAAI;AACvC,aAAK,kBAAkB,QAAQ,WAAW;AAC1C,aAAK,SAAS;AAEd,aACG,YAAY,EACZ,KAAK,CAAC,gBAAgB;AACrB,cAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAM,MAAM,IAAI;cACd;YACF;AAOA,oBAAQ,SAAS,eAAe,MAAM,KAAK,EAAE;AAC7C;UACF;AAEA,eAAK,kBAAkB,QAAQ,WAAW;AAC1C,gBAAM,OAAO,SAAS,WAAW;AAEjC,cAAI,CAAC,UAAU;AACb,iBAAK,SAAS;AACd,iBAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAC9C,iBAAK,QAAQ;UACf,OAAO;AACL,iBAAK,SAAS,MAAM,UAAU,SAAS,EAAE;UAC3C;QACF,CAAC,EACA,MAAM,CAAC,QAAQ;AAKd,kBAAQ,SAAS,SAAS,MAAM,KAAK,EAAE;QACzC,CAAC;MACL;;;;;;;;;;;;;;;;;;;;;;;;MAyBA,SAAS,MAAM,UAAU,SAAS,IAAI;AACpC,YAAI,CAAC,UAAU;AACb,eAAK,UAAU,QAAO,MAAM,MAAM,OAAO,GAAG,EAAE;AAC9C;QACF;AAEA,cAAM,oBAAoB,KAAK,YAAY,kBAAkB,aAAa;AAE1E,aAAK,kBAAkB,QAAQ,WAAW;AAC1C,aAAK,SAAS;AACd,0BAAkB,SAAS,MAAM,QAAQ,KAAK,CAAC,GAAG,QAAQ;AACxD,cAAI,KAAK,QAAQ,WAAW;AAC1B,kBAAM,MAAM,IAAI;cACd;YACF;AAEA,0BAAc,MAAM,KAAK,EAAE;AAC3B;UACF;AAEA,eAAK,kBAAkB,QAAQ,WAAW;AAC1C,eAAK,SAAS;AACd,kBAAQ,WAAW;AACnB,eAAK,UAAU,QAAO,MAAM,KAAK,OAAO,GAAG,EAAE;AAC7C,eAAK,QAAQ;QACf,CAAC;MACH;;;;;;MAOA,UAAU;AACR,eAAO,KAAK,WAAW,WAAW,KAAK,OAAO,QAAQ;AACpD,gBAAM,SAAS,KAAK,OAAO,MAAM;AAEjC,eAAK,kBAAkB,OAAO,CAAC,EAAE,WAAW;AAC5C,kBAAQ,MAAM,OAAO,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC;QAChD;MACF;;;;;;;MAQA,QAAQ,QAAQ;AACd,aAAK,kBAAkB,OAAO,CAAC,EAAE,WAAW;AAC5C,aAAK,OAAO,KAAK,MAAM;MACzB;;;;;;;;MASA,UAAU,MAAM,IAAI;AAClB,YAAI,KAAK,WAAW,GAAG;AACrB,eAAK,QAAQ,KAAK;AAClB,eAAK,QAAQ,MAAM,KAAK,CAAC,CAAC;AAC1B,eAAK,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE;AAC9B,eAAK,QAAQ,OAAO;QACtB,OAAO;AACL,eAAK,QAAQ,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC;MACF;IACF;AAEA,WAAO,UAAUE;AAUjB,aAAS,cAAc,QAAQ,KAAK,IAAI;AACtC,UAAI,OAAO,OAAO,WAAY,IAAG,GAAG;AAEpC,eAAS,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAC7C,cAAM,SAAS,OAAO,OAAO,CAAC;AAC9B,cAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AAEzC,YAAI,OAAO,aAAa,WAAY,UAAS,GAAG;MAClD;IACF;AAUA,aAAS,QAAQ,QAAQ,KAAK,IAAI;AAChC,oBAAc,QAAQ,KAAK,EAAE;AAC7B,aAAO,QAAQ,GAAG;IACpB;EAAA;AAAA,CAAA;ACzlBA,IAAA,uBAAA,WAAA;EAAA,yHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,EAAE,sBAAsB,UAAU,IAAI,kBAAA;AAE5C,QAAM,QAAQ,OAAO,OAAO;AAC5B,QAAM,QAAQ,OAAO,OAAO;AAC5B,QAAM,SAAS,OAAO,QAAQ;AAC9B,QAAM,WAAW,OAAO,UAAU;AAClC,QAAM,UAAU,OAAO,SAAS;AAChC,QAAM,UAAU,OAAO,SAAS;AAChC,QAAM,QAAQ,OAAO,OAAO;AAC5B,QAAM,YAAY,OAAO,WAAW;AAKpC,QAAM,QAAN,MAAY;;;;;;;MAOV,YAAY,MAAM;AAChB,aAAK,OAAO,IAAI;AAChB,aAAK,KAAK,IAAI;MAChB;;;;MAKA,IAAI,SAAS;AACX,eAAO,KAAK,OAAO;MACrB;;;;MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;MACnB;IACF;AAEA,WAAO,eAAe,MAAM,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AACrE,WAAO,eAAe,MAAM,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AAOnE,QAAM,aAAN,cAAyB,MAAM;;;;;;;;;;;;;;MAc7B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,KAAK,IAAI,QAAQ,SAAS,SAAY,IAAI,QAAQ;AACvD,aAAK,OAAO,IAAI,QAAQ,WAAW,SAAY,KAAK,QAAQ;AAC5D,aAAK,SAAS,IAAI,QAAQ,aAAa,SAAY,QAAQ,QAAQ;MACrE;;;;MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;MACnB;;;;MAKA,IAAI,SAAS;AACX,eAAO,KAAK,OAAO;MACrB;;;;MAKA,IAAI,WAAW;AACb,eAAO,KAAK,SAAS;MACvB;IACF;AAEA,WAAO,eAAe,WAAW,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AACxE,WAAO,eAAe,WAAW,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;AAC1E,WAAO,eAAe,WAAW,WAAW,YAAY,EAAE,YAAY,KAAK,CAAC;AAO5E,QAAM,aAAN,cAAyB,MAAM;;;;;;;;;;MAU7B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,MAAM,IAAI,QAAQ,UAAU,SAAY,OAAO,QAAQ;AAC5D,aAAK,QAAQ,IAAI,QAAQ,YAAY,SAAY,KAAK,QAAQ;MAChE;;;;MAKA,IAAI,QAAQ;AACV,eAAO,KAAK,MAAM;MACpB;;;;MAKA,IAAI,UAAU;AACZ,eAAO,KAAK,QAAQ;MACtB;IACF;AAEA,WAAO,eAAe,WAAW,WAAW,SAAS,EAAE,YAAY,KAAK,CAAC;AACzE,WAAO,eAAe,WAAW,WAAW,WAAW,EAAE,YAAY,KAAK,CAAC;AAO3E,QAAM,eAAN,cAA2B,MAAM;;;;;;;;;MAS/B,YAAY,MAAM,UAAU,CAAC,GAAG;AAC9B,cAAM,IAAI;AAEV,aAAK,KAAK,IAAI,QAAQ,SAAS,SAAY,OAAO,QAAQ;MAC5D;;;;MAKA,IAAI,OAAO;AACT,eAAO,KAAK,KAAK;MACnB;IACF;AAEA,WAAO,eAAe,aAAa,WAAW,QAAQ,EAAE,YAAY,KAAK,CAAC;AAQ1E,QAAM,cAAc;;;;;;;;;;;;;MAalB,iBAAiB,MAAM,SAAS,UAAU,CAAC,GAAG;AAC5C,mBAAW,YAAY,KAAK,UAAU,IAAI,GAAG;AAC3C,cACE,CAAC,QAAQ,oBAAoB,KAC7B,SAAS,SAAS,MAAM,WACxB,CAAC,SAAS,oBAAoB,GAC9B;AACA;UACF;QACF;AAEA,YAAI;AAEJ,YAAI,SAAS,WAAW;AACtB,oBAAU,SAAS,UAAU,MAAM,UAAU;AAC3C,kBAAM,QAAQ,IAAI,aAAa,WAAW;cACxC,MAAM,WAAW,OAAO,KAAK,SAAS;YACxC,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;UACnC;QACF,WAAW,SAAS,SAAS;AAC3B,oBAAU,SAAS,QAAQF,OAAM,SAAS;AACxC,kBAAM,QAAQ,IAAI,WAAW,SAAS;cACpC,MAAAA;cACA,QAAQ,QAAQ,SAAS;cACzB,UAAU,KAAK,uBAAuB,KAAK;YAC7C,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;UACnC;QACF,WAAW,SAAS,SAAS;AAC3B,oBAAU,SAAS,QAAQ,OAAO;AAChC,kBAAM,QAAQ,IAAI,WAAW,SAAS;cACpC;cACA,SAAS,MAAM;YACjB,CAAC;AAED,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;UACnC;QACF,WAAW,SAAS,QAAQ;AAC1B,oBAAU,SAAS,SAAS;AAC1B,kBAAM,QAAQ,IAAI,MAAM,MAAM;AAE9B,kBAAM,OAAO,IAAI;AACjB,yBAAa,SAAS,MAAM,KAAK;UACnC;QACF,OAAO;AACL;QACF;AAEA,gBAAQ,oBAAoB,IAAI,CAAC,CAAC,QAAQ,oBAAoB;AAC9D,gBAAQ,SAAS,IAAI;AAErB,YAAI,QAAQ,MAAM;AAChB,eAAK,KAAK,MAAM,OAAO;QACzB,OAAO;AACL,eAAK,GAAG,MAAM,OAAO;QACvB;MACF;;;;;;;;MASA,oBAAoB,MAAM,SAAS;AACjC,mBAAW,YAAY,KAAK,UAAU,IAAI,GAAG;AAC3C,cAAI,SAAS,SAAS,MAAM,WAAW,CAAC,SAAS,oBAAoB,GAAG;AACtE,iBAAK,eAAe,MAAM,QAAQ;AAClC;UACF;QACF;MACF;IACF;AAEA,WAAO,UAAU;MACf;MACA;MACA;MACA;MACA;IACF;AAUA,aAAS,aAAa,UAAU,SAAS,OAAO;AAC9C,UAAI,OAAO,aAAa,YAAY,SAAS,aAAa;AACxD,iBAAS,YAAY,KAAK,UAAU,KAAK;MAC3C,OAAO;AACL,iBAAS,KAAK,SAAS,KAAK;MAC9B;IACF;EAAA;AAAA,CAAA;ACnSA,IAAA,oBAAA,WAAA;EAAA,sHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,EAAE,WAAW,IAAI,mBAAA;AAYvB,aAAS,KAAK,MAAM,MAAM,MAAM;AAC9B,UAAI,KAAK,IAAI,MAAM,OAAW,MAAK,IAAI,IAAI,CAAC,IAAI;UAC3C,MAAK,IAAI,EAAE,KAAK,IAAI;IAC3B;AASA,aAAS,MAAM,QAAQ;AACrB,YAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,UAAI,SAAS,uBAAO,OAAO,IAAI;AAC/B,UAAI,eAAe;AACnB,UAAI,aAAa;AACjB,UAAI,WAAW;AACf,UAAI;AACJ,UAAI;AACJ,UAAI,QAAQ;AACZ,UAAIA,QAAO;AACX,UAAI,MAAM;AACV,UAAI,IAAI;AAER,aAAO,IAAI,OAAO,QAAQ,KAAK;AAC7B,QAAAA,QAAO,OAAO,WAAW,CAAC;AAE1B,YAAI,kBAAkB,QAAW;AAC/B,cAAI,QAAQ,MAAM,WAAWA,KAAI,MAAM,GAAG;AACxC,gBAAI,UAAU,GAAI,SAAQ;UAC5B,WACE,MAAM,MACLA,UAAS,MAAkBA,UAAS,IACrC;AACA,gBAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;UACxC,WAAWA,UAAS,MAAkBA,UAAS,IAAgB;AAC7D,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,kBAAM,OAAO,OAAO,MAAM,OAAO,GAAG;AACpC,gBAAIA,UAAS,IAAM;AACjB,mBAAK,QAAQ,MAAM,MAAM;AACzB,uBAAS,uBAAO,OAAO,IAAI;YAC7B,OAAO;AACL,8BAAgB;YAClB;AAEA,oBAAQ,MAAM;UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;UAC5D;QACF,WAAW,cAAc,QAAW;AAClC,cAAI,QAAQ,MAAM,WAAWA,KAAI,MAAM,GAAG;AACxC,gBAAI,UAAU,GAAI,SAAQ;UAC5B,WAAWA,UAAS,MAAQA,UAAS,GAAM;AACzC,gBAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;UACxC,WAAWA,UAAS,MAAQA,UAAS,IAAM;AACzC,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,iBAAK,QAAQ,OAAO,MAAM,OAAO,GAAG,GAAG,IAAI;AAC3C,gBAAIA,UAAS,IAAM;AACjB,mBAAK,QAAQ,eAAe,MAAM;AAClC,uBAAS,uBAAO,OAAO,IAAI;AAC3B,8BAAgB;YAClB;AAEA,oBAAQ,MAAM;UAChB,WAAWA,UAAS,MAAkB,UAAU,MAAM,QAAQ,IAAI;AAChE,wBAAY,OAAO,MAAM,OAAO,CAAC;AACjC,oBAAQ,MAAM;UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;UAC5D;QACF,OAAO;AAML,cAAI,YAAY;AACd,gBAAI,WAAWA,KAAI,MAAM,GAAG;AAC1B,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;YAC5D;AACA,gBAAI,UAAU,GAAI,SAAQ;qBACjB,CAAC,aAAc,gBAAe;AACvC,yBAAa;UACf,WAAW,UAAU;AACnB,gBAAI,WAAWA,KAAI,MAAM,GAAG;AAC1B,kBAAI,UAAU,GAAI,SAAQ;YAC5B,WAAWA,UAAS,MAAkB,UAAU,IAAI;AAClD,yBAAW;AACX,oBAAM;YACR,WAAWA,UAAS,IAAgB;AAClC,2BAAa;YACf,OAAO;AACL,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;YAC5D;UACF,WAAWA,UAAS,MAAQ,OAAO,WAAW,IAAI,CAAC,MAAM,IAAM;AAC7D,uBAAW;UACb,WAAW,QAAQ,MAAM,WAAWA,KAAI,MAAM,GAAG;AAC/C,gBAAI,UAAU,GAAI,SAAQ;UAC5B,WAAW,UAAU,OAAOA,UAAS,MAAQA,UAAS,IAAO;AAC3D,gBAAI,QAAQ,GAAI,OAAM;UACxB,WAAWA,UAAS,MAAQA,UAAS,IAAM;AACzC,gBAAI,UAAU,IAAI;AAChB,oBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;YAC5D;AAEA,gBAAI,QAAQ,GAAI,OAAM;AACtB,gBAAI,QAAQ,OAAO,MAAM,OAAO,GAAG;AACnC,gBAAI,cAAc;AAChB,sBAAQ,MAAM,QAAQ,OAAO,EAAE;AAC/B,6BAAe;YACjB;AACA,iBAAK,QAAQ,WAAW,KAAK;AAC7B,gBAAIA,UAAS,IAAM;AACjB,mBAAK,QAAQ,eAAe,MAAM;AAClC,uBAAS,uBAAO,OAAO,IAAI;AAC3B,8BAAgB;YAClB;AAEA,wBAAY;AACZ,oBAAQ,MAAM;UAChB,OAAO;AACL,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;UAC5D;QACF;MACF;AAEA,UAAI,UAAU,MAAM,YAAYA,UAAS,MAAQA,UAAS,GAAM;AAC9D,cAAM,IAAI,YAAY,yBAAyB;MACjD;AAEA,UAAI,QAAQ,GAAI,OAAM;AACtB,YAAM,QAAQ,OAAO,MAAM,OAAO,GAAG;AACrC,UAAI,kBAAkB,QAAW;AAC/B,aAAK,QAAQ,OAAO,MAAM;MAC5B,OAAO;AACL,YAAI,cAAc,QAAW;AAC3B,eAAK,QAAQ,OAAO,IAAI;QAC1B,WAAW,cAAc;AACvB,eAAK,QAAQ,WAAW,MAAM,QAAQ,OAAO,EAAE,CAAC;QAClD,OAAO;AACL,eAAK,QAAQ,WAAW,KAAK;QAC/B;AACA,aAAK,QAAQ,eAAe,MAAM;MACpC;AAEA,aAAO;IACT;AASA,aAAS,OAAO,YAAY;AAC1B,aAAO,OAAO,KAAK,UAAU,EAC1B,IAAI,CAAC,cAAc;AAClB,YAAI,iBAAiB,WAAW,SAAS;AACzC,YAAI,CAAC,MAAM,QAAQ,cAAc,EAAG,kBAAiB,CAAC,cAAc;AACpE,eAAO,eACJ,IAAI,CAAC,WAAW;AACf,iBAAO,CAAC,SAAS,EACd;YACC,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM;AAC7B,kBAAI,SAAS,OAAO,CAAC;AACrB,kBAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,UAAS,CAAC,MAAM;AAC5C,qBAAO,OACJ,IAAI,CAACG,OAAOA,OAAM,OAAO,IAAI,GAAG,CAAC,IAAIA,EAAC,EAAG,EACzC,KAAK,IAAI;YACd,CAAC;UACH,EACC,KAAK,IAAI;QACd,CAAC,EACA,KAAK,IAAI;MACd,CAAC,EACA,KAAK,IAAI;IACd;AAEA,WAAO,UAAU,EAAE,QAAQ,MAAM;EAAA;AAAA,CAAA;AC1MjC,IAAA,oBAAA,WAAA;EAAA,sHAAA,SAAA,QAAA;AAAA;AAIA,QAAMC,gBAAe,UAAQ,QAAQ;AACrC,QAAM,QAAQ,UAAQ,OAAO;AAC7B,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,MAAM,UAAQ,KAAK;AACzB,QAAM,MAAM,UAAQ,KAAK;AACzB,QAAM,EAAE,aAAa,WAAW,IAAI,UAAQ,QAAQ;AACpD,QAAM,EAAE,QAAQ,SAAS,IAAI,UAAQ,QAAQ;AAC7C,QAAM,EAAE,KAAAC,KAAI,IAAI,UAAQ,KAAK;AAE7B,QAAM,oBAAoB,2BAAA;AAC1B,QAAMJ,YAAW,iBAAA;AACjB,QAAMC,UAAS,eAAA;AACf,QAAM,EAAE,OAAO,IAAI,mBAAA;AAEnB,QAAM;MACJ;MACA;MACA;MACA;MACA;MACA;MACA;MACA;IACF,IAAI,kBAAA;AACJ,QAAM;MACJ,aAAa,EAAE,kBAAkB,oBAAoB;IACvD,IAAI,qBAAA;AACJ,QAAM,EAAE,QAAQ,MAAM,IAAI,kBAAA;AAC1B,QAAM,EAAE,SAAS,IAAI,oBAAA;AAErB,QAAM,eAAe,KAAK;AAC1B,QAAM,WAAW,OAAO,UAAU;AAClC,QAAM,mBAAmB,CAAC,GAAG,EAAE;AAC/B,QAAM,cAAc,CAAC,cAAc,QAAQ,WAAW,QAAQ;AAC9D,QAAM,mBAAmB;AAOzB,QAAMI,aAAN,MAAM,mBAAkBF,cAAa;;;;;;;;MAQnC,YAAY,SAAS,WAAW,SAAS;AACvC,cAAM;AAEN,aAAK,cAAc,aAAa,CAAC;AACjC,aAAK,aAAa;AAClB,aAAK,sBAAsB;AAC3B,aAAK,kBAAkB;AACvB,aAAK,gBAAgB;AACrB,aAAK,cAAc;AACnB,aAAK,gBAAgB;AACrB,aAAK,cAAc,CAAC;AACpB,aAAK,UAAU;AACf,aAAK,YAAY;AACjB,aAAK,cAAc,WAAU;AAC7B,aAAK,YAAY;AACjB,aAAK,UAAU;AACf,aAAK,UAAU;AAEf,YAAI,YAAY,MAAM;AACpB,eAAK,kBAAkB;AACvB,eAAK,YAAY;AACjB,eAAK,aAAa;AAElB,cAAI,cAAc,QAAW;AAC3B,wBAAY,CAAC;UACf,WAAW,CAAC,MAAM,QAAQ,SAAS,GAAG;AACpC,gBAAI,OAAO,cAAc,YAAY,cAAc,MAAM;AACvD,wBAAU;AACV,0BAAY,CAAC;YACf,OAAO;AACL,0BAAY,CAAC,SAAS;YACxB;UACF;AAEA,uBAAa,MAAM,SAAS,WAAW,OAAO;QAChD,OAAO;AACL,eAAK,YAAY,QAAQ;AACzB,eAAK,YAAY;QACnB;MACF;;;;;;;MAQA,IAAI,aAAa;AACf,eAAO,KAAK;MACd;MAEA,IAAI,WAAW,MAAM;AACnB,YAAI,CAAC,aAAa,SAAS,IAAI,EAAG;AAElC,aAAK,cAAc;AAKnB,YAAI,KAAK,UAAW,MAAK,UAAU,cAAc;MACnD;;;;MAKA,IAAI,iBAAiB;AACnB,YAAI,CAAC,KAAK,QAAS,QAAO,KAAK;AAE/B,eAAO,KAAK,QAAQ,eAAe,SAAS,KAAK,QAAQ;MAC3D;;;;MAKA,IAAI,aAAa;AACf,eAAO,OAAO,KAAK,KAAK,WAAW,EAAE,KAAK;MAC5C;;;;MAKA,IAAI,WAAW;AACb,eAAO,KAAK;MACd;;;;;MAMA,IAAI,UAAU;AACZ,eAAO;MACT;;;;;MAMA,IAAI,UAAU;AACZ,eAAO;MACT;;;;;MAMA,IAAI,SAAS;AACX,eAAO;MACT;;;;;MAMA,IAAI,YAAY;AACd,eAAO;MACT;;;;MAKA,IAAI,WAAW;AACb,eAAO,KAAK;MACd;;;;MAKA,IAAI,aAAa;AACf,eAAO,KAAK;MACd;;;;MAKA,IAAI,MAAM;AACR,eAAO,KAAK;MACd;;;;;;;;;;;;;;;;;MAkBA,UAAU,QAAQ,MAAM,SAAS;AAC/B,cAAM,WAAW,IAAIH,UAAS;UAC5B,wBAAwB,QAAQ;UAChC,YAAY,KAAK;UACjB,YAAY,KAAK;UACjB,UAAU,KAAK;UACf,YAAY,QAAQ;UACpB,oBAAoB,QAAQ;QAC9B,CAAC;AAED,cAAM,SAAS,IAAIC,QAAO,QAAQ,KAAK,aAAa,QAAQ,YAAY;AAExE,aAAK,YAAY;AACjB,aAAK,UAAU;AACf,aAAK,UAAU;AAEf,iBAAS,UAAU,IAAI;AACvB,eAAO,UAAU,IAAI;AACrB,eAAO,UAAU,IAAI;AAErB,iBAAS,GAAG,YAAY,kBAAkB;AAC1C,iBAAS,GAAG,SAAS,eAAe;AACpC,iBAAS,GAAG,SAAS,eAAe;AACpC,iBAAS,GAAG,WAAW,iBAAiB;AACxC,iBAAS,GAAG,QAAQ,cAAc;AAClC,iBAAS,GAAG,QAAQ,cAAc;AAElC,eAAO,UAAU;AAKjB,YAAI,OAAO,WAAY,QAAO,WAAW,CAAC;AAC1C,YAAI,OAAO,WAAY,QAAO,WAAW;AAEzC,YAAI,KAAK,SAAS,EAAG,QAAO,QAAQ,IAAI;AAExC,eAAO,GAAG,SAAS,aAAa;AAChC,eAAO,GAAG,QAAQ,YAAY;AAC9B,eAAO,GAAG,OAAO,WAAW;AAC5B,eAAO,GAAG,SAAS,aAAa;AAEhC,aAAK,cAAc,WAAU;AAC7B,aAAK,KAAK,MAAM;MAClB;;;;;;MAOA,YAAY;AACV,YAAI,CAAC,KAAK,SAAS;AACjB,eAAK,cAAc,WAAU;AAC7B,eAAK,KAAK,SAAS,KAAK,YAAY,KAAK,aAAa;AACtD;QACF;AAEA,YAAI,KAAK,YAAY,kBAAkB,aAAa,GAAG;AACrD,eAAK,YAAY,kBAAkB,aAAa,EAAE,QAAQ;QAC5D;AAEA,aAAK,UAAU,mBAAmB;AAClC,aAAK,cAAc,WAAU;AAC7B,aAAK,KAAK,SAAS,KAAK,YAAY,KAAK,aAAa;MACxD;;;;;;;;;;;;;;;;;;;;;MAsBA,MAAMF,OAAM,MAAM;AAChB,YAAI,KAAK,eAAe,WAAU,OAAQ;AAC1C,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,MAAM;AACZ,yBAAe,MAAM,KAAK,MAAM,GAAG;AACnC;QACF;AAEA,YAAI,KAAK,eAAe,WAAU,SAAS;AACzC,cACE,KAAK,oBACJ,KAAK,uBAAuB,KAAK,UAAU,eAAe,eAC3D;AACA,iBAAK,QAAQ,IAAI;UACnB;AAEA;QACF;AAEA,aAAK,cAAc,WAAU;AAC7B,aAAK,QAAQ,MAAMA,OAAM,MAAM,CAAC,KAAK,WAAW,CAAC,QAAQ;AAKvD,cAAI,IAAK;AAET,eAAK,kBAAkB;AAEvB,cACE,KAAK,uBACL,KAAK,UAAU,eAAe,cAC9B;AACA,iBAAK,QAAQ,IAAI;UACnB;QACF,CAAC;AAED,sBAAc,IAAI;MACpB;;;;;;MAOA,QAAQ;AACN,YACE,KAAK,eAAe,WAAU,cAC9B,KAAK,eAAe,WAAU,QAC9B;AACA;QACF;AAEA,aAAK,UAAU;AACf,aAAK,QAAQ,MAAM;MACrB;;;;;;;;;MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;QACpE;AAEA,YAAI,OAAO,SAAS,YAAY;AAC9B,eAAK;AACL,iBAAO,OAAO;QAChB,WAAW,OAAO,SAAS,YAAY;AACrC,eAAK;AACL,iBAAO;QACT;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;QACF;AAEA,YAAI,SAAS,OAAW,QAAO,CAAC,KAAK;AACrC,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;MAClD;;;;;;;;;MAUA,KAAK,MAAM,MAAM,IAAI;AACnB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;QACpE;AAEA,YAAI,OAAO,SAAS,YAAY;AAC9B,eAAK;AACL,iBAAO,OAAO;QAChB,WAAW,OAAO,SAAS,YAAY;AACrC,eAAK;AACL,iBAAO;QACT;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;QACF;AAEA,YAAI,SAAS,OAAW,QAAO,CAAC,KAAK;AACrC,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;MAClD;;;;;;MAOA,SAAS;AACP,YACE,KAAK,eAAe,WAAU,cAC9B,KAAK,eAAe,WAAU,QAC9B;AACA;QACF;AAEA,aAAK,UAAU;AACf,YAAI,CAAC,KAAK,UAAU,eAAe,UAAW,MAAK,QAAQ,OAAO;MACpE;;;;;;;;;;;;;;;;MAiBA,KAAK,MAAM,SAAS,IAAI;AACtB,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,IAAI,MAAM,kDAAkD;QACpE;AAEA,YAAI,OAAO,YAAY,YAAY;AACjC,eAAK;AACL,oBAAU,CAAC;QACb;AAEA,YAAI,OAAO,SAAS,SAAU,QAAO,KAAK,SAAS;AAEnD,YAAI,KAAK,eAAe,WAAU,MAAM;AACtC,yBAAe,MAAM,MAAM,EAAE;AAC7B;QACF;AAEA,cAAM,OAAO;UACX,QAAQ,OAAO,SAAS;UACxB,MAAM,CAAC,KAAK;UACZ,UAAU;UACV,KAAK;UACL,GAAG;QACL;AAEA,YAAI,CAAC,KAAK,YAAY,kBAAkB,aAAa,GAAG;AACtD,eAAK,WAAW;QAClB;AAEA,aAAK,QAAQ,KAAK,QAAQ,cAAc,MAAM,EAAE;MAClD;;;;;;MAOA,YAAY;AACV,YAAI,KAAK,eAAe,WAAU,OAAQ;AAC1C,YAAI,KAAK,eAAe,WAAU,YAAY;AAC5C,gBAAM,MAAM;AACZ,yBAAe,MAAM,KAAK,MAAM,GAAG;AACnC;QACF;AAEA,YAAI,KAAK,SAAS;AAChB,eAAK,cAAc,WAAU;AAC7B,eAAK,QAAQ,QAAQ;QACvB;MACF;IACF;AAMA,WAAO,eAAeM,YAAW,cAAc;MAC7C,YAAY;MACZ,OAAO,YAAY,QAAQ,YAAY;IACzC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,cAAc;MACvD,YAAY;MACZ,OAAO,YAAY,QAAQ,YAAY;IACzC,CAAC;AAMD,WAAO,eAAeA,YAAW,QAAQ;MACvC,YAAY;MACZ,OAAO,YAAY,QAAQ,MAAM;IACnC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,QAAQ;MACjD,YAAY;MACZ,OAAO,YAAY,QAAQ,MAAM;IACnC,CAAC;AAMD,WAAO,eAAeA,YAAW,WAAW;MAC1C,YAAY;MACZ,OAAO,YAAY,QAAQ,SAAS;IACtC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,WAAW;MACpD,YAAY;MACZ,OAAO,YAAY,QAAQ,SAAS;IACtC,CAAC;AAMD,WAAO,eAAeA,YAAW,UAAU;MACzC,YAAY;MACZ,OAAO,YAAY,QAAQ,QAAQ;IACrC,CAAC;AAMD,WAAO,eAAeA,WAAU,WAAW,UAAU;MACnD,YAAY;MACZ,OAAO,YAAY,QAAQ,QAAQ;IACrC,CAAC;AAED;MACE;MACA;MACA;MACA;MACA;MACA;MACA;IACF,EAAE,QAAQ,CAAC,aAAa;AACtB,aAAO,eAAeA,WAAU,WAAW,UAAU,EAAE,YAAY,KAAK,CAAC;IAC3E,CAAC;AAMD,KAAC,QAAQ,SAAS,SAAS,SAAS,EAAE,QAAQ,CAAC,WAAW;AACxD,aAAO,eAAeA,WAAU,WAAW,KAAK,MAAM,IAAI;QACxD,YAAY;QACZ,MAAM;AACJ,qBAAW,YAAY,KAAK,UAAU,MAAM,GAAG;AAC7C,gBAAI,SAAS,oBAAoB,EAAG,QAAO,SAAS,SAAS;UAC/D;AAEA,iBAAO;QACT;QACA,IAAI,SAAS;AACX,qBAAW,YAAY,KAAK,UAAU,MAAM,GAAG;AAC7C,gBAAI,SAAS,oBAAoB,GAAG;AAClC,mBAAK,eAAe,QAAQ,QAAQ;AACpC;YACF;UACF;AAEA,cAAI,OAAO,YAAY,WAAY;AAEnC,eAAK,iBAAiB,QAAQ,SAAS;YACrC,CAAC,oBAAoB,GAAG;UAC1B,CAAC;QACH;MACF,CAAC;IACH,CAAC;AAEDA,eAAU,UAAU,mBAAmB;AACvCA,eAAU,UAAU,sBAAsB;AAE1C,WAAO,UAAUA;AAoCjB,aAAS,aAAa,WAAW,SAAS,WAAW,SAAS;AAC5D,YAAM,OAAO;QACX,wBAAwB;QACxB,UAAU;QACV,iBAAiB,iBAAiB,CAAC;QACnC,YAAY,MAAM,OAAO;QACzB,oBAAoB;QACpB,mBAAmB;QACnB,iBAAiB;QACjB,cAAc;QACd,GAAG;QACH,YAAY;QACZ,UAAU;QACV,UAAU;QACV,SAAS;QACT,QAAQ;QACR,MAAM;QACN,MAAM;QACN,MAAM;MACR;AAEA,gBAAU,YAAY,KAAK;AAE3B,UAAI,CAAC,iBAAiB,SAAS,KAAK,eAAe,GAAG;AACpD,cAAM,IAAI;UACR,iCAAiC,KAAK,eAAe,yBAC3B,iBAAiB,KAAK,IAAI,CAAC;QACvD;MACF;AAEA,UAAI;AAEJ,UAAI,mBAAmBD,MAAK;AAC1B,oBAAY;MACd,OAAO;AACL,YAAI;AACF,sBAAY,IAAIA,KAAI,OAAO;QAC7B,SAAS,GAAG;AACV,gBAAM,IAAI,YAAY,gBAAgB,OAAO,EAAE;QACjD;MACF;AAEA,UAAI,UAAU,aAAa,SAAS;AAClC,kBAAU,WAAW;MACvB,WAAW,UAAU,aAAa,UAAU;AAC1C,kBAAU,WAAW;MACvB;AAEA,gBAAU,OAAO,UAAU;AAE3B,YAAM,WAAW,UAAU,aAAa;AACxC,YAAM,WAAW,UAAU,aAAa;AACxC,UAAI;AAEJ,UAAI,UAAU,aAAa,SAAS,CAAC,YAAY,CAAC,UAAU;AAC1D,4BACE;MAEJ,WAAW,YAAY,CAAC,UAAU,UAAU;AAC1C,4BAAoB;MACtB,WAAW,UAAU,MAAM;AACzB,4BAAoB;MACtB;AAEA,UAAI,mBAAmB;AACrB,cAAM,MAAM,IAAI,YAAY,iBAAiB;AAE7C,YAAI,UAAU,eAAe,GAAG;AAC9B,gBAAM;QACR,OAAO;AACL,4BAAkB,WAAW,GAAG;AAChC;QACF;MACF;AAEA,YAAM,cAAc,WAAW,MAAM;AACrC,YAAM,MAAM,YAAY,EAAE,EAAE,SAAS,QAAQ;AAC7C,YAAM,UAAU,WAAW,MAAM,UAAU,KAAK;AAChD,YAAM,cAAc,oBAAI,IAAI;AAC5B,UAAI;AAEJ,WAAK,mBACH,KAAK,qBAAqB,WAAW,aAAa;AACpD,WAAK,cAAc,KAAK,eAAe;AACvC,WAAK,OAAO,UAAU,QAAQ;AAC9B,WAAK,OAAO,UAAU,SAAS,WAAW,GAAG,IACzC,UAAU,SAAS,MAAM,GAAG,EAAE,IAC9B,UAAU;AACd,WAAK,UAAU;QACb,GAAG,KAAK;QACR,yBAAyB,KAAK;QAC9B,qBAAqB;QACrB,YAAY;QACZ,SAAS;MACX;AACA,WAAK,OAAO,UAAU,WAAW,UAAU;AAC3C,WAAK,UAAU,KAAK;AAEpB,UAAI,KAAK,mBAAmB;AAC1B,4BAAoB,IAAI;UACtB,KAAK,sBAAsB,OAAO,KAAK,oBAAoB,CAAC;UAC5D;UACA,KAAK;QACP;AACA,aAAK,QAAQ,0BAA0B,IAAI,OAAO;UAChD,CAAC,kBAAkB,aAAa,GAAG,kBAAkB,MAAM;QAC7D,CAAC;MACH;AACA,UAAI,UAAU,QAAQ;AACpB,mBAAW,YAAY,WAAW;AAChC,cACE,OAAO,aAAa,YACpB,CAAC,iBAAiB,KAAK,QAAQ,KAC/B,YAAY,IAAI,QAAQ,GACxB;AACA,kBAAM,IAAI;cACR;YACF;UACF;AAEA,sBAAY,IAAI,QAAQ;QAC1B;AAEA,aAAK,QAAQ,wBAAwB,IAAI,UAAU,KAAK,GAAG;MAC7D;AACA,UAAI,KAAK,QAAQ;AACf,YAAI,KAAK,kBAAkB,IAAI;AAC7B,eAAK,QAAQ,sBAAsB,IAAI,KAAK;QAC9C,OAAO;AACL,eAAK,QAAQ,SAAS,KAAK;QAC7B;MACF;AACA,UAAI,UAAU,YAAY,UAAU,UAAU;AAC5C,aAAK,OAAO,GAAG,UAAU,QAAQ,IAAI,UAAU,QAAQ;MACzD;AAEA,UAAI,UAAU;AACZ,cAAM,QAAQ,KAAK,KAAK,MAAM,GAAG;AAEjC,aAAK,aAAa,MAAM,CAAC;AACzB,aAAK,OAAO,MAAM,CAAC;MACrB;AAEA,UAAI;AAEJ,UAAI,KAAK,iBAAiB;AACxB,YAAI,UAAU,eAAe,GAAG;AAC9B,oBAAU,eAAe;AACzB,oBAAU,kBAAkB;AAC5B,oBAAU,4BAA4B,WAClC,KAAK,aACL,UAAU;AAEd,gBAAM,UAAU,WAAW,QAAQ;AAMnC,oBAAU,EAAE,GAAG,SAAS,SAAS,CAAC,EAAE;AAEpC,cAAI,SAAS;AACX,uBAAW,CAACE,MAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,sBAAQ,QAAQA,KAAI,YAAY,CAAC,IAAI;YACvC;UACF;QACF,WAAW,UAAU,cAAc,UAAU,MAAM,GAAG;AACpD,gBAAM,aAAa,WACf,UAAU,eACR,KAAK,eAAe,UAAU,4BAC9B,QACF,UAAU,eACR,QACA,UAAU,SAAS,UAAU;AAEnC,cAAI,CAAC,cAAe,UAAU,mBAAmB,CAAC,UAAW;AAK3D,mBAAO,KAAK,QAAQ;AACpB,mBAAO,KAAK,QAAQ;AAEpB,gBAAI,CAAC,WAAY,QAAO,KAAK,QAAQ;AAErC,iBAAK,OAAO;UACd;QACF;AAOA,YAAI,KAAK,QAAQ,CAAC,QAAQ,QAAQ,eAAe;AAC/C,kBAAQ,QAAQ,gBACd,WAAW,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ;QACvD;AAEA,cAAM,UAAU,OAAO,QAAQ,IAAI;AAEnC,YAAI,UAAU,YAAY;AAUxB,oBAAU,KAAK,YAAY,UAAU,KAAK,GAAG;QAC/C;MACF,OAAO;AACL,cAAM,UAAU,OAAO,QAAQ,IAAI;MACrC;AAEA,UAAI,KAAK,SAAS;AAChB,YAAI,GAAG,WAAW,MAAM;AACtB,yBAAe,WAAW,KAAK,iCAAiC;QAClE,CAAC;MACH;AAEA,UAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,YAAI,QAAQ,QAAQ,IAAI,QAAQ,EAAG;AAEnC,cAAM,UAAU,OAAO;AACvB,0BAAkB,WAAW,GAAG;MAClC,CAAC;AAED,UAAI,GAAG,YAAY,CAAC,QAAQ;AAC1B,cAAM,WAAW,IAAI,QAAQ;AAC7B,cAAM,aAAa,IAAI;AAEvB,YACE,YACA,KAAK,mBACL,cAAc,OACd,aAAa,KACb;AACA,cAAI,EAAE,UAAU,aAAa,KAAK,cAAc;AAC9C,2BAAe,WAAW,KAAK,4BAA4B;AAC3D;UACF;AAEA,cAAI,MAAM;AAEV,cAAI;AAEJ,cAAI;AACF,mBAAO,IAAIF,KAAI,UAAU,OAAO;UAClC,SAAS,GAAG;AACV,kBAAM,MAAM,IAAI,YAAY,gBAAgB,QAAQ,EAAE;AACtD,8BAAkB,WAAW,GAAG;AAChC;UACF;AAEA,uBAAa,WAAW,MAAM,WAAW,OAAO;QAClD,WAAW,CAAC,UAAU,KAAK,uBAAuB,KAAK,GAAG,GAAG;AAC3D;YACE;YACA;YACA,+BAA+B,IAAI,UAAU;UAC/C;QACF;MACF,CAAC;AAED,UAAI,GAAG,WAAW,CAAC,KAAK,QAAQ,SAAS;AACvC,kBAAU,KAAK,WAAW,GAAG;AAM7B,YAAI,UAAU,eAAeC,WAAU,WAAY;AAEnD,cAAM,UAAU,OAAO;AAEvB,cAAM,UAAU,IAAI,QAAQ;AAE5B,YAAI,YAAY,UAAa,QAAQ,YAAY,MAAM,aAAa;AAClE,yBAAe,WAAW,QAAQ,wBAAwB;AAC1D;QACF;AAEA,cAAM,SAAS,WAAW,MAAM,EAC7B,OAAO,MAAM,IAAI,EACjB,OAAO,QAAQ;AAElB,YAAI,IAAI,QAAQ,sBAAsB,MAAM,QAAQ;AAClD,yBAAe,WAAW,QAAQ,qCAAqC;AACvE;QACF;AAEA,cAAM,aAAa,IAAI,QAAQ,wBAAwB;AACvD,YAAI;AAEJ,YAAI,eAAe,QAAW;AAC5B,cAAI,CAAC,YAAY,MAAM;AACrB,wBAAY;UACd,WAAW,CAAC,YAAY,IAAI,UAAU,GAAG;AACvC,wBAAY;UACd;QACF,WAAW,YAAY,MAAM;AAC3B,sBAAY;QACd;AAEA,YAAI,WAAW;AACb,yBAAe,WAAW,QAAQ,SAAS;AAC3C;QACF;AAEA,YAAI,WAAY,WAAU,YAAY;AAEtC,cAAM,yBAAyB,IAAI,QAAQ,0BAA0B;AAErE,YAAI,2BAA2B,QAAW;AACxC,cAAI,CAAC,mBAAmB;AACtB,kBAAM,UACJ;AAEF,2BAAe,WAAW,QAAQ,OAAO;AACzC;UACF;AAEA,cAAI;AAEJ,cAAI;AACF,yBAAa,MAAM,sBAAsB;UAC3C,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;UACF;AAEA,gBAAM,iBAAiB,OAAO,KAAK,UAAU;AAE7C,cACE,eAAe,WAAW,KAC1B,eAAe,CAAC,MAAM,kBAAkB,eACxC;AACA,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;UACF;AAEA,cAAI;AACF,8BAAkB,OAAO,WAAW,kBAAkB,aAAa,CAAC;UACtE,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,2BAAe,WAAW,QAAQ,OAAO;AACzC;UACF;AAEA,oBAAU,YAAY,kBAAkB,aAAa,IACnD;QACJ;AAEA,kBAAU,UAAU,QAAQ,MAAM;UAChC,wBAAwB,KAAK;UAC7B,cAAc,KAAK;UACnB,YAAY,KAAK;UACjB,oBAAoB,KAAK;QAC3B,CAAC;MACH,CAAC;AAED,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,KAAK,SAAS;MACnC,OAAO;AACL,YAAI,IAAI;MACV;IACF;AASA,aAAS,kBAAkB,WAAW,KAAK;AACzC,gBAAU,cAAcA,WAAU;AAKlC,gBAAU,gBAAgB;AAC1B,gBAAU,KAAK,SAAS,GAAG;AAC3B,gBAAU,UAAU;IACtB;AASA,aAAS,WAAW,SAAS;AAC3B,cAAQ,OAAO,QAAQ;AACvB,aAAO,IAAI,QAAQ,OAAO;IAC5B;AASA,aAAS,WAAW,SAAS;AAC3B,cAAQ,OAAO;AAEf,UAAI,CAAC,QAAQ,cAAc,QAAQ,eAAe,IAAI;AACpD,gBAAQ,aAAa,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;MAC7D;AAEA,aAAO,IAAI,QAAQ,OAAO;IAC5B;AAWA,aAAS,eAAe,WAAW,QAAQ,SAAS;AAClD,gBAAU,cAAcA,WAAU;AAElC,YAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,YAAM,kBAAkB,KAAK,cAAc;AAE3C,UAAI,OAAO,WAAW;AACpB,eAAO,QAAQ,IAAI;AACnB,eAAO,MAAM;AAEb,YAAI,OAAO,UAAU,CAAC,OAAO,OAAO,WAAW;AAM7C,iBAAO,OAAO,QAAQ;QACxB;AAEA,gBAAQ,SAAS,mBAAmB,WAAW,GAAG;MACpD,OAAO;AACL,eAAO,QAAQ,GAAG;AAClB,eAAO,KAAK,SAAS,UAAU,KAAK,KAAK,WAAW,OAAO,CAAC;AAC5D,eAAO,KAAK,SAAS,UAAU,UAAU,KAAK,SAAS,CAAC;MAC1D;IACF;AAWA,aAAS,eAAe,WAAW,MAAM,IAAI;AAC3C,UAAI,MAAM;AACR,cAAM,SAAS,OAAO,IAAI,IAAI,KAAK,OAAO,SAAS,IAAI,EAAE;AAQzD,YAAI,UAAU,QAAS,WAAU,QAAQ,kBAAkB;YACtD,WAAU,mBAAmB;MACpC;AAEA,UAAI,IAAI;AACN,cAAM,MAAM,IAAI;UACd,qCAAqC,UAAU,UAAU,KACnD,YAAY,UAAU,UAAU,CAAC;QACzC;AACA,gBAAQ,SAAS,IAAI,GAAG;MAC1B;IACF;AASA,aAAS,mBAAmBN,OAAM,QAAQ;AACxC,YAAM,YAAY,KAAK,UAAU;AAEjC,gBAAU,sBAAsB;AAChC,gBAAU,gBAAgB;AAC1B,gBAAU,aAAaA;AAEvB,UAAI,UAAU,QAAQ,UAAU,MAAM,OAAW;AAEjD,gBAAU,QAAQ,eAAe,QAAQ,YAAY;AACrD,cAAQ,SAAS,QAAQ,UAAU,OAAO;AAE1C,UAAIA,UAAS,KAAM,WAAU,MAAM;UAC9B,WAAU,MAAMA,OAAM,MAAM;IACnC;AAOA,aAAS,kBAAkB;AACzB,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,CAAC,UAAU,SAAU,WAAU,QAAQ,OAAO;IACpD;AAQA,aAAS,gBAAgB,KAAK;AAC5B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,QAAQ,UAAU,MAAM,QAAW;AAC/C,kBAAU,QAAQ,eAAe,QAAQ,YAAY;AAMrD,gBAAQ,SAAS,QAAQ,UAAU,OAAO;AAE1C,kBAAU,MAAM,IAAI,WAAW,CAAC;MAClC;AAEA,UAAI,CAAC,UAAU,eAAe;AAC5B,kBAAU,gBAAgB;AAC1B,kBAAU,KAAK,SAAS,GAAG;MAC7B;IACF;AAOA,aAAS,mBAAmB;AAC1B,WAAK,UAAU,EAAE,UAAU;IAC7B;AASA,aAAS,kBAAkB,MAAM,UAAU;AACzC,WAAK,UAAU,EAAE,KAAK,WAAW,MAAM,QAAQ;IACjD;AAQA,aAAS,eAAe,MAAM;AAC5B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,UAAW,WAAU,KAAK,MAAM,CAAC,KAAK,WAAW,IAAI;AACnE,gBAAU,KAAK,QAAQ,IAAI;IAC7B;AAQA,aAAS,eAAe,MAAM;AAC5B,WAAK,UAAU,EAAE,KAAK,QAAQ,IAAI;IACpC;AAQA,aAAS,OAAO,QAAQ;AACtB,aAAO,OAAO;IAChB;AAQA,aAAS,cAAc,KAAK;AAC1B,YAAM,YAAY,KAAK,UAAU;AAEjC,UAAI,UAAU,eAAeM,WAAU,OAAQ;AAC/C,UAAI,UAAU,eAAeA,WAAU,MAAM;AAC3C,kBAAU,cAAcA,WAAU;AAClC,sBAAc,SAAS;MACzB;AAOA,WAAK,QAAQ,IAAI;AAEjB,UAAI,CAAC,UAAU,eAAe;AAC5B,kBAAU,gBAAgB;AAC1B,kBAAU,KAAK,SAAS,GAAG;MAC7B;IACF;AAQA,aAAS,cAAc,WAAW;AAChC,gBAAU,cAAc;QACtB,UAAU,QAAQ,QAAQ,KAAK,UAAU,OAAO;QAChD;MACF;IACF;AAOA,aAAS,gBAAgB;AACvB,YAAM,YAAY,KAAK,UAAU;AAEjC,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,eAAe,QAAQ,YAAY;AACxC,WAAK,eAAe,OAAO,WAAW;AAEtC,gBAAU,cAAcA,WAAU;AAElC,UAAI;AAWJ,UACE,CAAC,KAAK,eAAe,cACrB,CAAC,UAAU,uBACX,CAAC,UAAU,UAAU,eAAe,iBACnC,QAAQ,UAAU,QAAQ,KAAK,OAAO,MACvC;AACA,kBAAU,UAAU,MAAM,KAAK;MACjC;AAEA,gBAAU,UAAU,IAAI;AAExB,WAAK,UAAU,IAAI;AAEnB,mBAAa,UAAU,WAAW;AAElC,UACE,UAAU,UAAU,eAAe,YACnC,UAAU,UAAU,eAAe,cACnC;AACA,kBAAU,UAAU;MACtB,OAAO;AACL,kBAAU,UAAU,GAAG,SAAS,gBAAgB;AAChD,kBAAU,UAAU,GAAG,UAAU,gBAAgB;MACnD;IACF;AAQA,aAAS,aAAa,OAAO;AAC3B,UAAI,CAAC,KAAK,UAAU,EAAE,UAAU,MAAM,KAAK,GAAG;AAC5C,aAAK,MAAM;MACb;IACF;AAOA,aAAS,cAAc;AACrB,YAAM,YAAY,KAAK,UAAU;AAEjC,gBAAU,cAAcA,WAAU;AAClC,gBAAU,UAAU,IAAI;AACxB,WAAK,IAAI;IACX;AAOA,aAAS,gBAAgB;AACvB,YAAM,YAAY,KAAK,UAAU;AAEjC,WAAK,eAAe,SAAS,aAAa;AAC1C,WAAK,GAAG,SAAS,IAAI;AAErB,UAAI,WAAW;AACb,kBAAU,cAAcA,WAAU;AAClC,aAAK,QAAQ;MACf;IACF;EAAA;AAAA,CAAA;AC32CA,IAAA,sBAAA,WAAA;EAAA,wHAAA,SAAA,QAAA;AAAA;AAEA,QAAM,EAAE,WAAW,IAAI,mBAAA;AASvB,aAAS,MAAM,QAAQ;AACrB,YAAM,YAAY,oBAAI,IAAI;AAC1B,UAAI,QAAQ;AACZ,UAAI,MAAM;AACV,UAAI,IAAI;AAER,WAAK,GAAG,IAAI,OAAO,QAAQ,KAAK;AAC9B,cAAMN,QAAO,OAAO,WAAW,CAAC;AAEhC,YAAI,QAAQ,MAAM,WAAWA,KAAI,MAAM,GAAG;AACxC,cAAI,UAAU,GAAI,SAAQ;QAC5B,WACE,MAAM,MACLA,UAAS,MAAkBA,UAAS,IACrC;AACA,cAAI,QAAQ,MAAM,UAAU,GAAI,OAAM;QACxC,WAAWA,UAAS,IAAgB;AAClC,cAAI,UAAU,IAAI;AAChB,kBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;UAC5D;AAEA,cAAI,QAAQ,GAAI,OAAM;AAEtB,gBAAMQ,YAAW,OAAO,MAAM,OAAO,GAAG;AAExC,cAAI,UAAU,IAAIA,SAAQ,GAAG;AAC3B,kBAAM,IAAI,YAAY,QAAQA,SAAQ,6BAA6B;UACrE;AAEA,oBAAU,IAAIA,SAAQ;AACtB,kBAAQ,MAAM;QAChB,OAAO;AACL,gBAAM,IAAI,YAAY,iCAAiC,CAAC,EAAE;QAC5D;MACF;AAEA,UAAI,UAAU,MAAM,QAAQ,IAAI;AAC9B,cAAM,IAAI,YAAY,yBAAyB;MACjD;AAEA,YAAM,WAAW,OAAO,MAAM,OAAO,CAAC;AAEtC,UAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B,cAAM,IAAI,YAAY,QAAQ,QAAQ,6BAA6B;MACrE;AAEA,gBAAU,IAAI,QAAQ;AACtB,aAAO;IACT;AAEA,WAAO,UAAU,EAAE,MAAM;EAAA;AAAA,CAAA;AC7DzB,IAAA,2BAAA,WAAA;EAAA,6HAAA,SAAA,QAAA;AAAA;AAIA,QAAMJ,gBAAe,UAAQ,QAAQ;AACrC,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,EAAE,OAAO,IAAI,UAAQ,QAAQ;AACnC,QAAM,EAAE,WAAW,IAAI,UAAQ,QAAQ;AAEvC,QAAM,YAAY,kBAAA;AAClB,QAAM,oBAAoB,2BAAA;AAC1B,QAAM,cAAc,oBAAA;AACpB,QAAME,aAAY,kBAAA;AAClB,QAAM,EAAE,MAAM,WAAW,IAAI,kBAAA;AAE7B,QAAM,WAAW;AAEjB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,SAAS;AAOf,QAAMG,mBAAN,cAA8BL,cAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgCzC,YAAY,SAAS,UAAU;AAC7B,cAAM;AAEN,kBAAU;UACR,wBAAwB;UACxB,UAAU;UACV,YAAY,MAAM,OAAO;UACzB,oBAAoB;UACpB,mBAAmB;UACnB,iBAAiB;UACjB,gBAAgB;UAChB,cAAc;UACd,UAAU;UACV,SAAS;;UACT,QAAQ;UACR,MAAM;UACN,MAAM;UACN,MAAM;UACN,WAAAE;UACA,GAAG;QACL;AAEA,YACG,QAAQ,QAAQ,QAAQ,CAAC,QAAQ,UAAU,CAAC,QAAQ,YACpD,QAAQ,QAAQ,SAAS,QAAQ,UAAU,QAAQ,aACnD,QAAQ,UAAU,QAAQ,UAC3B;AACA,gBAAM,IAAI;YACR;UAEF;QACF;AAEA,YAAI,QAAQ,QAAQ,MAAM;AACxB,eAAK,UAAU,KAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,kBAAM,OAAO,KAAK,aAAa,GAAG;AAElC,gBAAI,UAAU,KAAK;cACjB,kBAAkB,KAAK;cACvB,gBAAgB;YAClB,CAAC;AACD,gBAAI,IAAI,IAAI;UACd,CAAC;AACD,eAAK,QAAQ;YACX,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR;UACF;QACF,WAAW,QAAQ,QAAQ;AACzB,eAAK,UAAU,QAAQ;QACzB;AAEA,YAAI,KAAK,SAAS;AAChB,gBAAM,iBAAiB,KAAK,KAAK,KAAK,MAAM,YAAY;AAExD,eAAK,mBAAmB,aAAa,KAAK,SAAS;YACjD,WAAW,KAAK,KAAK,KAAK,MAAM,WAAW;YAC3C,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO;YACnC,SAAS,CAAC,KAAK,QAAQ,SAAS;AAC9B,mBAAK,cAAc,KAAK,QAAQ,MAAM,cAAc;YACtD;UACF,CAAC;QACH;AAEA,YAAI,QAAQ,sBAAsB,KAAM,SAAQ,oBAAoB,CAAC;AACrE,YAAI,QAAQ,gBAAgB;AAC1B,eAAK,UAAU,oBAAI,IAAI;AACvB,eAAK,mBAAmB;QAC1B;AAEA,aAAK,UAAU;AACf,aAAK,SAAS;MAChB;;;;;;;;;;MAWA,UAAU;AACR,YAAI,KAAK,QAAQ,UAAU;AACzB,gBAAM,IAAI,MAAM,4CAA4C;QAC9D;AAEA,YAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,eAAO,KAAK,QAAQ,QAAQ;MAC9B;;;;;;;;MASA,MAAM,IAAI;AACR,YAAI,KAAK,WAAW,QAAQ;AAC1B,cAAI,IAAI;AACN,iBAAK,KAAK,SAAS,MAAM;AACvB,iBAAG,IAAI,MAAM,2BAA2B,CAAC;YAC3C,CAAC;UACH;AAEA,kBAAQ,SAAS,WAAW,IAAI;AAChC;QACF;AAEA,YAAI,GAAI,MAAK,KAAK,SAAS,EAAE;AAE7B,YAAI,KAAK,WAAW,QAAS;AAC7B,aAAK,SAAS;AAEd,YAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,QAAQ;AAChD,cAAI,KAAK,SAAS;AAChB,iBAAK,iBAAiB;AACtB,iBAAK,mBAAmB,KAAK,UAAU;UACzC;AAEA,cAAI,KAAK,SAAS;AAChB,gBAAI,CAAC,KAAK,QAAQ,MAAM;AACtB,sBAAQ,SAAS,WAAW,IAAI;YAClC,OAAO;AACL,mBAAK,mBAAmB;YAC1B;UACF,OAAO;AACL,oBAAQ,SAAS,WAAW,IAAI;UAClC;QACF,OAAO;AACL,gBAAMI,UAAS,KAAK;AAEpB,eAAK,iBAAiB;AACtB,eAAK,mBAAmB,KAAK,UAAU;AAMvC,UAAAA,QAAO,MAAM,MAAM;AACjB,sBAAU,IAAI;UAChB,CAAC;QACH;MACF;;;;;;;;MASA,aAAa,KAAK;AAChB,YAAI,KAAK,QAAQ,MAAM;AACrB,gBAAM,QAAQ,IAAI,IAAI,QAAQ,GAAG;AACjC,gBAAM,WAAW,UAAU,KAAK,IAAI,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI;AAE9D,cAAI,aAAa,KAAK,QAAQ,KAAM,QAAO;QAC7C;AAEA,eAAO;MACT;;;;;;;;;;MAWA,cAAc,KAAK,QAAQ,MAAM,IAAI;AACnC,eAAO,GAAG,SAAS,aAAa;AAEhC,cAAM,MAAM,IAAI,QAAQ,mBAAmB;AAC3C,cAAM,UAAU,IAAI,QAAQ;AAC5B,cAAMC,WAAU,CAAC,IAAI,QAAQ,uBAAuB;AAEpD,YAAI,IAAI,WAAW,OAAO;AACxB,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;QACF;AAEA,YAAI,YAAY,UAAa,QAAQ,YAAY,MAAM,aAAa;AAClE,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;QACF;AAEA,YAAI,QAAQ,UAAa,CAAC,SAAS,KAAK,GAAG,GAAG;AAC5C,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;QACF;AAEA,YAAIA,aAAY,KAAKA,aAAY,IAAI;AACnC,gBAAM,UAAU;AAChB,4CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;QACF;AAEA,YAAI,CAAC,KAAK,aAAa,GAAG,GAAG;AAC3B,yBAAe,QAAQ,GAAG;AAC1B;QACF;AAEA,cAAM,uBAAuB,IAAI,QAAQ,wBAAwB;AACjE,YAAI,YAAY,oBAAI,IAAI;AAExB,YAAI,yBAAyB,QAAW;AACtC,cAAI;AACF,wBAAY,YAAY,MAAM,oBAAoB;UACpD,SAAS,KAAK;AACZ,kBAAM,UAAU;AAChB,8CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;UACF;QACF;AAEA,cAAM,yBAAyB,IAAI,QAAQ,0BAA0B;AACrE,cAAM,aAAa,CAAC;AAEpB,YACE,KAAK,QAAQ,qBACb,2BAA2B,QAC3B;AACA,gBAAM,oBAAoB,IAAI;YAC5B,KAAK,QAAQ;YACb;YACA,KAAK,QAAQ;UACf;AAEA,cAAI;AACF,kBAAM,SAAS,UAAU,MAAM,sBAAsB;AAErD,gBAAI,OAAO,kBAAkB,aAAa,GAAG;AAC3C,gCAAkB,OAAO,OAAO,kBAAkB,aAAa,CAAC;AAChE,yBAAW,kBAAkB,aAAa,IAAI;YAChD;UACF,SAAS,KAAK;AACZ,kBAAM,UACJ;AACF,8CAAkC,MAAM,KAAK,QAAQ,KAAK,OAAO;AACjE;UACF;QACF;AAKA,YAAI,KAAK,QAAQ,cAAc;AAC7B,gBAAM,OAAO;YACX,QACE,IAAI,QAAQ,GAAGA,aAAY,IAAI,yBAAyB,QAAQ,EAAE;YACpE,QAAQ,CAAC,EAAE,IAAI,OAAO,cAAc,IAAI,OAAO;YAC/C;UACF;AAEA,cAAI,KAAK,QAAQ,aAAa,WAAW,GAAG;AAC1C,iBAAK,QAAQ,aAAa,MAAM,CAAC,UAAUX,OAAM,SAAS,YAAY;AACpE,kBAAI,CAAC,UAAU;AACb,uBAAO,eAAe,QAAQA,SAAQ,KAAK,SAAS,OAAO;cAC7D;AAEA,mBAAK;gBACH;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;cACF;YACF,CAAC;AACD;UACF;AAEA,cAAI,CAAC,KAAK,QAAQ,aAAa,IAAI,EAAG,QAAO,eAAe,QAAQ,GAAG;QACzE;AAEA,aAAK,gBAAgB,YAAY,KAAK,WAAW,KAAK,QAAQ,MAAM,EAAE;MACxE;;;;;;;;;;;;;;MAeA,gBAAgB,YAAY,KAAK,WAAW,KAAK,QAAQ,MAAM,IAAI;AAIjE,YAAI,CAAC,OAAO,YAAY,CAAC,OAAO,SAAU,QAAO,OAAO,QAAQ;AAEhE,YAAI,OAAO,UAAU,GAAG;AACtB,gBAAM,IAAI;YACR;UAEF;QACF;AAEA,YAAI,KAAK,SAAS,QAAS,QAAO,eAAe,QAAQ,GAAG;AAE5D,cAAM,SAAS,WAAW,MAAM,EAC7B,OAAO,MAAM,IAAI,EACjB,OAAO,QAAQ;AAElB,cAAM,UAAU;UACd;UACA;UACA;UACA,yBAAyB,MAAM;QACjC;AAEA,cAAM,KAAK,IAAI,KAAK,QAAQ,UAAU,MAAM,QAAW,KAAK,OAAO;AAEnE,YAAI,UAAU,MAAM;AAIlB,gBAAM,WAAW,KAAK,QAAQ,kBAC1B,KAAK,QAAQ,gBAAgB,WAAW,GAAG,IAC3C,UAAU,OAAO,EAAE,KAAK,EAAE;AAE9B,cAAI,UAAU;AACZ,oBAAQ,KAAK,2BAA2B,QAAQ,EAAE;AAClD,eAAG,YAAY;UACjB;QACF;AAEA,YAAI,WAAW,kBAAkB,aAAa,GAAG;AAC/C,gBAAM,SAAS,WAAW,kBAAkB,aAAa,EAAE;AAC3D,gBAAM,QAAQ,UAAU,OAAO;YAC7B,CAAC,kBAAkB,aAAa,GAAG,CAAC,MAAM;UAC5C,CAAC;AACD,kBAAQ,KAAK,6BAA6B,KAAK,EAAE;AACjD,aAAG,cAAc;QACnB;AAKA,aAAK,KAAK,WAAW,SAAS,GAAG;AAEjC,eAAO,MAAM,QAAQ,OAAO,MAAM,EAAE,KAAK,MAAM,CAAC;AAChD,eAAO,eAAe,SAAS,aAAa;AAE5C,WAAG,UAAU,QAAQ,MAAM;UACzB,wBAAwB,KAAK,QAAQ;UACrC,YAAY,KAAK,QAAQ;UACzB,oBAAoB,KAAK,QAAQ;QACnC,CAAC;AAED,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ,IAAI,EAAE;AACnB,aAAG,GAAG,SAAS,MAAM;AACnB,iBAAK,QAAQ,OAAO,EAAE;AAEtB,gBAAI,KAAK,oBAAoB,CAAC,KAAK,QAAQ,MAAM;AAC/C,sBAAQ,SAAS,WAAW,IAAI;YAClC;UACF,CAAC;QACH;AAEA,WAAG,IAAI,GAAG;MACZ;IACF;AAEA,WAAO,UAAUS;AAYjB,aAAS,aAAaC,SAAQ,KAAK;AACjC,iBAAW,SAAS,OAAO,KAAK,GAAG,EAAG,CAAAA,QAAO,GAAG,OAAO,IAAI,KAAK,CAAC;AAEjE,aAAO,SAAS,kBAAkB;AAChC,mBAAW,SAAS,OAAO,KAAK,GAAG,GAAG;AACpC,UAAAA,QAAO,eAAe,OAAO,IAAI,KAAK,CAAC;QACzC;MACF;IACF;AAQA,aAAS,UAAUA,SAAQ;AACzB,MAAAA,QAAO,SAAS;AAChB,MAAAA,QAAO,KAAK,OAAO;IACrB;AAOA,aAAS,gBAAgB;AACvB,WAAK,QAAQ;IACf;AAWA,aAAS,eAAe,QAAQV,OAAM,SAAS,SAAS;AAStD,gBAAU,WAAW,KAAK,aAAaA,KAAI;AAC3C,gBAAU;QACR,YAAY;QACZ,gBAAgB;QAChB,kBAAkB,OAAO,WAAW,OAAO;QAC3C,GAAG;MACL;AAEA,aAAO,KAAK,UAAU,OAAO,OAAO;AAEpC,aAAO;QACL,YAAYA,KAAI,IAAI,KAAK,aAAaA,KAAI,CAAC;IACzC,OAAO,KAAK,OAAO,EAChB,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,EAChC,KAAK,MAAM,IACd,aACA;MACJ;IACF;AAaA,aAAS,kCAAkCU,SAAQ,KAAK,QAAQV,OAAM,SAAS;AAC7E,UAAIU,QAAO,cAAc,eAAe,GAAG;AACzC,cAAM,MAAM,IAAI,MAAM,OAAO;AAC7B,cAAM,kBAAkB,KAAK,iCAAiC;AAE9D,QAAAA,QAAO,KAAK,iBAAiB,KAAK,QAAQ,GAAG;MAC/C,OAAO;AACL,uBAAe,QAAQV,OAAM,OAAO;MACtC;IACF;EAAA;AAAA,CAAA;AE3hBA,IAAA,gBAAkC,QAAA,eAAA,GAAA,CAAA;AAClC,IAAA,kBAAqB,QAAA,iBAAA,GAAA,CAAA;AACrB,IAAA,gBAAmB,QAAA,eAAA,GAAA,CAAA;AACnB,IAAA,mBAAsB,QAAA,kBAAA,GAAA,CAAA;AACtB,IAAA,0BAA4B,QAAA,yBAAA,GAAA,CAAA;AAG5B,IAAO,kBAAQ,iBAAAM;ADCf,IAAM,gBAAgB;AAEtB,+BAA+B,aAAa;;;AEV5C,OAAO,WAAW;AAwClB,IAAM,qBAAqB;AAEpB,IAAM,SAAN,MAAa;AAAA,EAClB,OAAe,eAEJ;AAAA,EAEX,OAAe,oBAA0B;AACvC,QAAI,KAAK,cAAc;AACrB,cAAQ,OAAO,MAAM,IAAI;AACzB,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAe,YAAY,MAAkC;AAC3D,SAAK,kBAAkB;AACvB,UAAM,SAAS,KAAK,UAAU,IAAI,IAAI;AACtC,YAAQ,OAAO,MAAM,MAAM;AAC3B,SAAK,eAAe,EAAE,KAAK;AAAA,EAC7B;AAAA,EAEA,OAAe,eAAe,MAAoB;AAChD,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,YAAY,WAAW;AAAA,IAC9B;AACA,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAAA,EAEA,OAAe,QAAQ,MAAoB;AACzC,SAAK,kBAAkB;AACvB,YAAQ,IAAI,IAAI;AAAA,EAClB;AAAA,EAEA,OAAe,aAAa,MAAoB;AAC9C,SAAK,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,EACvD;AAAA,EAEA,OAAO,WAAW,SAAuD;AACvE,UAAM,EAAE,WAAW,UAAU,IAAI;AACjC,SAAK;AAAA,MACH,MAAM,KAAK;AAAA,QACT,kBAAa,SAAS,QAAQ,cAAc,IAAI,KAAK,GAAG,KAAK,UAAU,YAAY,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,cAAc,SAIZ;AACP,UAAM,EAAE,YAAY,QAAQ,OAAO,IAAI;AACvC,UAAM,QAAQ,SAAS;AACvB,UAAM,UAAU,GAAG,MAAM,IAAI,KAAK,kBAAa,KAAK,eAAe,UAAU,CAAC;AAC9E,UAAM,SAAS,WAAW,IAAI,MAAM,MAAM,QAAG,IAAI,MAAM,IAAI,QAAG;AAC9D,SAAK,QAAQ,GAAG,MAAM,IAAI,OAAO,EAAE;AAAA,EACrC;AAAA,EAEA,OAAO,OAAOM,UAAuB;AACnC,SAAK,QAAQ,MAAM,KAAK,KAAK,cAAcA,QAAO,EAAE,CAAC;AACrD,SAAK,QAAQ,EAAE;AAAA,EACjB;AAAA,EAEA,OAAO,oBACL,aACA,WACA,aACA,WACM;AACN,SAAK,QAAQ,EAAE;AACf,SAAK,QAAQ,MAAM,KAAK,KAAK,eAAe,CAAC;AAE7C,UAAM,cAAc,gBAAgB,IAAI,WAAW;AACnD,UAAM,aAAa,YAAY,SAAS,IAAI,YAAY,KAAK,IAAI,IAAI;AACrE,SAAK;AAAA,MACH,gBAAgB,MAAM,MAAM,KAAK,WAAW,CAAC,IAAI,WAAW,KAAK,MAAM,KAAK,UAAU,CAAC;AAAA,IACzF;AAEA,UAAM,YAAY,cAAc,IAAI,SAAS;AAC7C,SAAK,QAAQ,SAAS,MAAM,MAAM,KAAK,SAAS,CAAC,UAAU,SAAS,EAAE;AAEtE,UAAM,YAAY,cAAc,IAAI,SAAS;AAC7C,SAAK,QAAQ,WAAW,MAAM,MAAM,KAAK,SAAS,CAAC,IAAI,SAAS,EAAE;AAElE,SAAK,QAAQ,EAAE;AAAA,EACjB;AAAA,EAEA,OAAO,kBACL,YACA,UACA,eACA,SACM;AACN,SAAK,QAAQ,MAAM,KAAK,KAAK,QAAQ,UAAU,KAAK,QAAQ,EAAE,CAAC;AAC/D,SAAK,QAAQ,MAAM,KAAK,SAAS,aAAa,IAAI,OAAO,EAAE,CAAC;AAC5D,SAAK,QAAQ,EAAE;AAAA,EACjB;AAAA,EAEA,OAAO,aAAa,SAAgC;AAClD,UAAM,EAAE,WAAW,UAAU,IAAI;AAEjC,UAAM,QAAQ,CAAC,OAAO,SAAS,IAAI,SAAS,EAAE;AAC9C,SAAK,QAAQ,MAAM,WAAW,MAAM,KAAK,UAAK,CAAC,CAAC;AAAA,EAClD;AAAA,EAEA,OAAO,aAAa,SAAoC;AACtD,UAAM,EAAE,SAAS,IAAI;AAErB,SAAK,kBAAkB;AAEvB,QAAI,CAAC,SAAS,QAAQ;AACpB,WAAK,QAAQ,MAAM,IAAI,eAAe,CAAC;AACvC;AAAA,IACF;AAEA,aAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,UAAI,QAAQ,GAAG;AACb,aAAK,QAAQ,EAAE;AAAA,MACjB;AAEA,YAAM,YAAY,KAAK,UAAU,QAAQ,IAAI;AAE7C,UAAI,QAAQ,SAAS,aAAa;AAChC,cAAM,UAAU,KAAK;AAAA,UACnB,QAAQ;AAAA,QACV;AAEA,aAAK,gBAAgB,WAAW,QAAQ,SAAS;AACjD,gBAAQ,UAAU,QAAQ,CAAC,aAAa;AACtC,eAAK,YAAY,QAAQ;AAAA,QAC3B,CAAC;AACD;AAAA,MACF;AAEA,YAAM,YAAY,KAAK;AAAA,QACrB,QAAQ;AAAA,MACV;AACA,YAAM,QAAQ,YAAY,UAAU,MAAM,IAAI,IAAI,CAAC;AACnD,WAAK,gBAAgB,WAAW,KAAK;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,YAAY,SAA6B;AAC9C,UAAM,EAAE,UAAU,OAAO,IAAI;AAE7B,SAAK,QAAQ,cAAc,SAAS,KAAK,IAAI,KAAK,QAAG,GAAG;AACxD,SAAK,QAAQ,cAAc,OAAO,KAAK,IAAI,KAAK,QAAG,GAAG;AAAA,EACxD;AAAA,EAEA,OAAO,cAAc,SAAiC;AACpD,UAAM,EAAE,QAAQ,YAAY,MAAM,IAAI;AACtC,UAAM,SAAS,SAAS,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,MAAM;AAC9D,SAAK,QAAQ,GAAG,MAAM,KAAK,KAAK,eAAe,UAAU,CAAC,GAAG;AAC7D,QAAI,OAAO;AACT,YAAM,aAAuB,CAAC;AAE9B,UAAI,OAAO,MAAM,gBAAgB,UAAU;AACzC,mBAAW,KAAK,SAAS,MAAM,WAAW,EAAE;AAAA,MAC9C;AAEA,UAAI,OAAO,MAAM,iBAAiB,UAAU;AAC1C,mBAAW,KAAK,UAAU,MAAM,YAAY,EAAE;AAAA,MAChD;AAEA,UAAI,OAAO,MAAM,gBAAgB,UAAU;AACzC,mBAAW,KAAK,SAAS,MAAM,WAAW,EAAE;AAAA,MAC9C;AAEA,UAAI,WAAW,SAAS,GAAG;AACzB,aAAK,QAAQ,MAAM,KAAK,iBAAY,WAAW,KAAK,UAAK,CAAC,EAAE,CAAC;AAAA,MAC/D;AAAA,IACF;AACA,SAAK,QAAQ,EAAE;AACf,SAAK,QAAQ,EAAE;AAAA,EACjB;AAAA,EAEA,OAAO,KAAK,SAAuB;AACjC,SAAK,QAAQ,MAAM,KAAK,UAAK,OAAO,EAAE,CAAC;AAAA,EACzC;AAAA,EAEA,OAAO,KAAK,SAAuB;AACjC,SAAK,QAAQ,MAAM,OAAO,UAAK,OAAO,EAAE,CAAC;AAAA,EAC3C;AAAA,EAEA,OAAO,QAAQ,SAAuB;AACpC,SAAK,QAAQ,MAAM,MAAM,UAAK,OAAO,EAAE,CAAC;AAAA,EAC1C;AAAA,EAEA,OAAO,MAAM,SAAuB;AAClC,SAAK,QAAQ,EAAE;AACf,SAAK,QAAQ,MAAM,IAAI,iBAAY,OAAO,EAAE,CAAC;AAAA,EAC/C;AAAA,EAEA,OAAO,cAAc,SAAuB;AAC1C,SAAK,QAAQ,EAAE;AACf,SAAK,QAAQ,MAAM,IAAI,iBAAY,OAAO,EAAE,CAAC;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO,SAAS,SAAiB,OAAe,UAAwB;AACtE,UAAM,WAAW,IAAI,OAAO,IAAI,KAAK;AACrC,SAAK,QAAQ,MAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,KAAK,CAAC;AAAA,EACvD;AAAA,EAEA,OAAO,aAAa,UAAwB;AAC1C,SAAK,QAAQ,MAAM,KAAK,aAAa,QAAQ,KAAK,CAAC;AAAA,EACrD;AAAA,EAEA,OAAO,UAAU,UAAkB,OAAqB;AACtD,SAAK,QAAQ,MAAM,IAAI,YAAO,QAAQ,YAAY,KAAK,EAAE,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAO,gBAAgB,YAAoB,OAAqB;AAC9D,SAAK,QAAQ,MAAM,IAAI,iCAA4B,UAAU,KAAK,KAAK,EAAE,CAAC;AAAA,EAC5E;AAAA,EAEA,OAAO,YAAY,UAAkB,OAAqB;AACxD,SAAK,QAAQ,MAAM,IAAI,8BAAyB,QAAQ,KAAK,KAAK,EAAE,CAAC;AAAA,EACvE;AAAA,EAEA,OAAO,mBACL,UACA,SACA,OACM;AACN,SAAK;AAAA,MACH,MAAM;AAAA,QACJ,6BAAwB,QAAQ,WAAW,OAAO,MAAM,KAAK;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,qBAAqB,SAAiC;AACnE,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC7C,aAAO,KAAK,SAAS,SAAS;AAAA,IAChC;AAEA,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,KAAK,SAAS,OAAO;AAAA,IAC9B;AAEA,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAM,SAAS,QACZ,IAAI,CAAC,SAAS,KAAK,qBAAqB,IAAsB,CAAC,EAC/D,OAAO,OAAO;AACjB,aAAO,KAAK,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA,IACxC;AAEA,QAAI,OAAO,YAAY,UAAU;AAC/B,YAAM,eAAe;AAIrB,UAAI,OAAO,aAAa,SAAS,UAAU;AACzC,cAAM,OAAO,aAAa;AAE1B,YAAI,SAAS,UAAU,OAAO,aAAa,SAAS,UAAU;AAC5D,iBAAO,KAAK,SAAS,aAAa,IAAI;AAAA,QACxC;AAEA,YAAI,SAAS,aAAa;AACxB,gBAAM,WAAW,aAAa,YAAY,aAAa,QAAQ;AAC/D,gBAAM,OACJ,aAAa,QAAQ,aAAa,SAAS,aAAa;AAC1D,gBAAM,UAAU,OAAO,SAAS,KAAK,UAAU,IAAI,CAAC,KAAK;AACzD,iBAAO,KAAK,SAAS,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAA,QAC9C;AAEA,YAAI,SAAS,eAAe;AAC1B,gBAAM,SACJ,aAAa,UAAU,aAAa,UAAU,aAAa;AAC7D,iBAAO,KAAK,SAAS,KAAK,UAAU,MAAM,CAAC;AAAA,QAC7C;AAEA,YAAI,SAAS,eAAe,OAAO,aAAa,SAAS,UAAU;AACjE,iBAAO,KAAK,SAAS,aAAa,IAAI;AAAA,QACxC;AAAA,MACF;AAEA,UAAI,OAAO,aAAa,SAAS,UAAU;AACzC,eAAO,KAAK,SAAS,aAAa,IAAI;AAAA,MACxC;AAEA,aAAO,KAAK,SAAS,KAAK,UAAU,YAAY,CAAC;AAAA,IACnD;AAEA,WAAO,KAAK,SAAS,OAAO,OAAO,CAAC;AAAA,EACtC;AAAA,EAEA,OAAe,iBAAiB,SAG9B;AACA,UAAM,YAAsB,CAAC;AAC7B,UAAM,YAA+B,CAAC;AAEtC,UAAM,QAAQ,CAAC,UAAgC;AAC7C,UAAI,UAAU,QAAQ,UAAU,QAAW;AACzC;AAAA,MACF;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,kBAAU,KAAK,GAAG,KAAK,aAAa,KAAK,SAAS,KAAK,CAAC,CAAC;AACzD;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,QAAQ,CAAC,SAAS,MAAM,IAAsB,CAAC;AACrD;AAAA,MACF;AAEA,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,aAAa;AAInB,YAAI,WAAW,SAAS,aAAa;AACnC,gBAAM,WACH,WAAW,YACX,WAAW,QACZ;AACF,gBAAM,OACJ,WAAW,QAAQ,WAAW,SAAS,WAAW;AACpD,oBAAU,KAAK;AAAA,YACb;AAAA,YACA,MAAM,OAAO,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC,IAAI;AAAA,UACrD,CAAC;AACD;AAAA,QACF;AAEA,YAAI,WAAW,SAAS,UAAU,OAAO,WAAW,SAAS,UAAU;AACrE,oBAAU,KAAK,GAAG,KAAK,aAAa,KAAK,SAAS,WAAW,IAAI,CAAC,CAAC;AACnE;AAAA,QACF;AAEA,YACE,WAAW,SAAS,eACpB,OAAO,WAAW,SAAS,UAC3B;AACA,oBAAU,KAAK,GAAG,KAAK,aAAa,KAAK,SAAS,WAAW,IAAI,CAAC,CAAC;AACnE;AAAA,QACF;AAEA,YACE,WAAW,SAAS,iBACpB,WAAW,SAAS,cACpB;AACA,gBAAM,QACJ,WAAW,SAAS,eAAe,eAAe;AACpD,oBAAU;AAAA,YACR,GAAG,KAAK,KAAK,KAAK,SAAS,KAAK,UAAU,UAAU,CAAC,CAAC;AAAA,UACxD;AACA;AAAA,QACF;AAEA,YAAI,OAAO,WAAW,SAAS,UAAU;AACvC,oBAAU,KAAK,GAAG,KAAK,aAAa,KAAK,SAAS,WAAW,IAAI,CAAC,CAAC;AACnE;AAAA,QACF;AAEA,kBAAU,KAAK,KAAK,SAAS,KAAK,UAAU,UAAU,CAAC,CAAC;AACxD;AAAA,MACF;AAEA,gBAAU,KAAK,KAAK,SAAS,OAAO,KAAK,CAAC,CAAC;AAAA,IAC7C;AAEA,UAAM,OAAO;AAEb,UAAM,sBAAsB,UAAU,SAClC,YACA,UAAU,SACR,CAAC,IACD,CAAC,KAAK,SAAS,cAAc,CAAC;AAEpC,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAe,aAAa,MAAwB;AAClD,WAAO,KACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,EACrC;AAAA,EAEA,OAAe,gBAAgB,WAAmB,OAAuB;AACvE,QAAI,CAAC,MAAM,QAAQ;AACjB,WAAK,QAAQ,GAAG,SAAS,GAAG;AAC5B;AAAA,IACF;AAEA,SAAK,QAAQ,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,EAAE;AACxC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,WAAK,QAAQ,MAAM,CAAC,KAAK,EAAE;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,OAAe,YAAY,UAAiC;AAC1D,UAAM,SAAS,MAAM,YAAY,eAAe,SAAS,QAAQ,EAAE;AACnE,SAAK,QAAQ,MAAM;AACnB,UAAM,WAAW,SAAS,OAAO,KAAK,MAAM,SAAS,IAAI,IAAI;AAC7D,QAAI,SAAS,MAAM;AACjB,WAAK,QAAQ,MAAM,KAAK,KAAK,SAAS,SAAS,IAAI,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,OAAO,sBAAsB,MAAkC;AAC7D,SAAK,YAAY,IAAI;AAAA,EACvB;AAAA,EAEA,OAAO,oBAAoB,MAAoB;AAC7C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,SAAK,eAAe,IAAI;AAAA,EAC1B;AAAA,EAEA,OAAO,yBAA+B;AACpC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,OAAO,eAAe,UAAkB,MAAqB;AAC3D,UAAM,iBACJ,SAAS,SAAY,SAAY,KAAK,SAAS,KAAK,UAAU,IAAI,CAAC;AACrE,SAAK,kBAAkB;AACvB,SAAK,YAAY,EAAE,UAAU,MAAM,eAAe,CAAC;AAAA,EACrD;AAAA,EAEA,OAAO,iBAAiB,UAAkB,QAAuB;AAC/D,SAAK,kBAAkB;AACvB,UAAM,SAAS,MAAM,YAAY,iBAAiB,QAAQ,EAAE;AAC5D,SAAK,QAAQ,MAAM;AACnB,QAAI,WAAW,QAAW;AACxB,WAAK,QAAQ,MAAM,KAAK,KAAK,SAAS,KAAK,UAAU,MAAM,CAAC,CAAC,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,OAAO,gBAAgB,UAAkB,OAAsB;AAC7D,SAAK,kBAAkB;AACvB,UAAM,SAAS,MAAM,YAAY,gBAAgB,QAAQ,EAAE;AAC3D,SAAK,QAAQ,MAAM;AACnB,SAAK;AAAA,MACH,MAAM,IAAI,KAAK,SAAS,KAAK,UAAU,SAAS,eAAe,CAAC,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,OAAe,UACb,OACA,SAIM;AACN,QAAI,CAAC,MAAM,QAAQ;AACjB;AAAA,IACF;AAEA,UAAM,EAAE,aAAa,YAAY,IAAI;AACrC,UAAM,cAAc,MAAM,UAAU,CAAC,SAAS,KAAK,WAAW,SAAS,CAAC;AACxE,UAAM,QAAQ,MAAM,OAAO,CAAC,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,MAAM,GAAG,CAAC;AACvE,UAAM,aAAa,YAAY,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC,GAAG;AAC3D,SAAK,QAAQ,UAAU;AAEvB,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,SAAS,KAAK,OAAO,OAAO,GAAG;AACrC,YAAM,eAAe,UAAU;AAC/B,YAAM,kBAAkB,eACpB,YAAY,MAAM,IAClB,MAAM,MAAM,MAAM;AACtB,WAAK;AAAA,QACH,GAAG,YAAY,IAAI,CAAC,GAAG,eAAe,GAAG,YAAY,IAAI,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,SAAK,QAAQ,UAAU;AAAA,EACzB;AAAA,EAEA,OAAe,UAAU,OAAwB;AAC/C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI;AACF,aAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,IACtC,SAAS,OAAO;AACd,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAe,SAAS,MAAsB;AAC5C,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,QAAQ,UAAU,oBAAoB;AACxC,aAAO;AAAA,IACT;AACA,WAAO,GAAG,QAAQ,MAAM,GAAG,qBAAqB,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,OAAe,eAAe,YAA4B;AACxD,QAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,GAAG;AAClD,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,KAAM;AACrB,aAAO,GAAG,WAAW,QAAQ,CAAC,CAAC;AAAA,IACjC;AAEA,UAAM,UAAU,aAAa;AAC7B,QAAI,UAAU,IAAI;AAChB,aAAO,GAAG,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAC9B;AAEA,UAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,UAAM,oBAAoB,UAAU,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClE,WAAO,GAAG,OAAO,IAAI,gBAAgB;AAAA,EACvC;AAAA,EAEA,OAAe,UAAU,MAAoC;AAC3D,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,MAAM,KAAK,YAAY,MAAM;AAAA,MACtC,KAAK;AACH,eAAO,MAAM,KAAK,YAAY,WAAW;AAAA,MAC3C,KAAK;AACH,eAAO,MAAM,KAAK,YAAY,MAAM;AAAA,MACtC,KAAK;AACH,eAAO,MAAM,KAAK,YAAY,QAAQ;AAAA,MACxC;AACE,eAAO,MAAM,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AACF;;;ACzXO,IAAM,4BAA4B,CACvC,cACA,WACgB;AAChB,MAAI;AAEJ,QAAM,YAAY,OAChB,QACA,YAC2B;AAC3B,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,OAAO,QAAe,OAAO;AAC/D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,MAAM,sBAAsB,MAAM,YAAY,KAAK,EAAE;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAc,OAClB,UACA,YAC2B;AAC3B,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,SAAS,UAAiB,OAAO;AACnE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,MAAM,sBAAsB,QAAQ,YAAY,KAAK,EAAE;AAC9D,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,mBAAmB,YAAY;AACnC,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,QACE;AAAA,QACA,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ;AACX,aAAO,MAAM,2CAA2C;AAAA,IAC1D;AAEA,iBAAa;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,cAAc;AAClB,YAAM,iBAAiB;AAAA,IACzB;AAAA,IACA,MAAM,eAAe,MAAM,OAAO;AAChC,YAAM,UAAU,MAAM,iBAAiB;AACvC,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,MACT;AAEA,YAAM,iBAAiB,QAAQ,IAAI,QAAQ,IAAI;AAC/C,YAAM,aACJ,QAAQ,UAAU,cAAc,GAAG,cACnC,QAAQ,UAAU,KAAK,GAAG;AAE5B,aAAO;AAAA,IACT;AAAA,IACA,MAAM,eAAe,EAAE,YAAY,iBAAiB,UAAU,GAAG;AAC/D,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,MAAM,iBAAiB;AACvC,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,QAAQ,UAAU;AAAA,QAClC,CAAC,UAAU,MAAM,eAAe;AAAA,MAClC;AACA,YAAM,YAAY,WAAW,WAAW;AAAA,QACtC,CAAC,SAAS,KAAK,oBAAoB;AAAA,MACrC;AAEA,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,MACT;AAEA,UAAI,cAAc,QAAW;AAC3B,cAAM,UAAU,+CAA+C;AAAA,UAC7D,QAAQ,UAAU;AAAA,UAClB,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAO,UAAU;AAAA,IACnB;AAAA,IACA,MAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AACD,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,YAAM,UAAU,+CAA+C;AAAA,QAC7D,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,SAAS,WAAW;AAAA,QAC5B,iBAAiB;AAAA,QACjB,YAAY,MAAM,eAAe;AAAA,QACjC,MAAM;AAAA,QACN,aAAa,EAAE,SAAS;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACjUA,SAAS,KAAAC,UAAS;;;ACAlB,SAAS,SAAqB;AAC9B,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,YAA2D;AAiBpE,IAAM,sBAAsB,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAErD,IAAM,uCAAuC;AAAA,EAC3C;AAAA,EACA;AACF;AAEA,SAAS,6BAA6B,OAAgC;AACpE,SACE,iBAAiB,SACjB,qCAAqC;AAAA,IAAK,CAAC,YACzC,MAAM,QAAQ,SAAS,OAAO;AAAA,EAChC;AAEJ;AAEA,SAAS,YAAY,OAAqC;AACxD,SAAO;AAAA,IACL,SAAS,OAAO,UAAU,YAAY,eAAgB;AAAA,EACxD;AACF;AAEA,SAAS,0BAA0B,QAA6B;AAC9D,QAAM,aAAc,QAAgB,MAAM;AAC1C,SAAO,eAAe,YAAY,eAAe;AACnD;AAEA,SAAS,uBAAuB,QAA6B;AAC3D,QAAM,eACJ,EAMA;AAEF,MAAI,OAAO,iBAAiB,YAAY;AACtC,QAAI;AACF,mBAAa,MAAM;AACnB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,6BAA6B,KAAK,GAAG;AACvC,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI;AACF,IAAAA,iBAAgB,MAAM;AACtB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,6BAA6B,KAAK,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,kBAAkB,QAA6B;AACtD,MAAI,CAAC,YAAY,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,0BAA0B,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,uBAAuB,MAAM,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAyC;AACnE,MAAI,CAAC,YAAY,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,0BAA0B,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,uBAAuB,MAAM,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,8BACd,UACA,YACA,SACY;AACZ,QAAM,cAAc,kBAAkB,WAAW,WAAW;AAC5D,QAAM,eAAe,mBAAmB,WAAW,YAAY;AAC/D,QAAM,cAAc,SAAS,gBAAgB;AAE7C,QAAM,mBAMF;AAAA,IACF,MAAM;AAAA,IACN,aAAa,WAAW;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,cAAc;AAChB,qBAAiB,eAAe;AAAA,EAClC;AAEA,MAAI,OAAO,WAAW,YAAY,YAAY;AAC5C,qBAAiB,UAAU,OAAO,OAAOC,aAAY;AACnD,YAAM,gBAAuC,EAAE,SAAS,MAAM;AAE9D,UAAIA,UAAS;AACX,sBAAc,iBAAiBA;AAAA,MACjC;AAEA,YAAM,SAAS,MAAM,WAAW,UAAU,eAAeA,QAAO;AAEhE,UAAI,cAAc;AAChB,cAAM,SAAS,aAAa,UAAU,MAAM;AAE5C,YAAI,CAAC,OAAO,SAAS;AACnB,gBAAM,IAAI;AAAA,YACR,gBAAgB,WAAW,8BAA8B,OAAO,MAAM,OAAO;AAAA,UAC/E;AAAA,QACF;AAEA,eAAO,OAAO;AAAA,MAChB;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACF,WAAO,KAAK,gBAAgB;AAAA,EAC9B,SAAS,OAAO;AACd,QAAI,CAAC,6BAA6B,KAAK,GAAG;AACxC,YAAM;AAAA,IACR;AAEA,QAAI,iBAAiB,cAAc;AACjC,YAAM;AAAA,QACJ,cAAc;AAAA,QACd,GAAG;AAAA,MACL,IAAI;AAEJ,UAAI;AACF,eAAO,KAAK,yBAAyB;AAAA,MACvC,SAAS,0BAA0B;AACjC,YAAI,CAAC,6BAA6B,wBAAwB,GAAG;AAC3D,gBAAM;AAAA,QACR;AAEA,cAAMC,kBAAiB;AAAA,UACrB,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAEA,eAAO,KAAKA,eAAc;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,MACH,aAAa;AAAA,IACf;AAEA,WAAO,KAAK,cAAc;AAAA,EAC5B;AACF;AAEO,SAAS,gCACd,aAC4B;AAC5B,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,MAAM,UAAU,MAAM;AACtD,aAAO;AAAA,QACL;AAAA,QACA,8BAA8B,MAAM,YAAY;AAAA,UAC9C,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AD3MO,IAAM,uBAAuBC,GACjC,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAClC,CAAC,EACA,YAAY;AAER,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACrC,OAAOA,GAAE,OAAO;AAAA,EAChB,OAAOA,GAAE,OAAO;AAAA,EAChB,MAAMA,GAAE,OAAO,EAAE,IAAI;AAAA,EACrB,OAAOA,GAAE,OAAO;AAAA,EAChB,UAAUA,GAAE,OAAO;AAAA,EACnB,mBAAmBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EACrC,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACtC,gBAAgB,qBAAqB,SAAS;AAChD,CAAC;AAIM,SAAS,iBAAiB,OAAwC;AACvE,MAAI;AACF,UAAM,SAASA,GAAE,MAAM,cAAc,EAAE,MAAM,KAAK;AAClD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiBA,GAAE,UAAU;AAC/B,aAAO;AAAA,QACL,mDAAmD,MAAM,OAAO;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,MACL,mDAAmD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3G;AAAA,EACF;AACF;AAEA,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EACvC,QAAQA,GAAE,OAAmB,EAAE,SAAS;AAAA,EACxC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,cAAcA,GAAE,OAA2B,EAAE,SAAS;AAAA,EACtD,kBAAkBA,GAAE,QAAQ,EAAE,SAAS;AACzC,CAAC;AAED,IAAM,8BAA8B,wBAAwB,OAAO;AAAA,EACjE,SAASA,GAAE,OAAO;AAAA,EAClB,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,KAAKA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AACjD,CAAC,EAAE,OAAO;AAEV,IAAM,6BAA6B,wBAAwB,OAAO;AAAA;AAAA,EAEhE,KAAKA,GAAE,MAAM,CAACA,GAAE,OAAO,EAAE,IAAI,GAAGA,GAAE,WAAW,GAAG,CAAC,CAAC;AAAA,EAClD,aAAaA,GACV,OAA4D,EAC5D,SAAS;AAAA,EACZ,iBAAiBA,GACd,OAAqD,EACrD,SAAS;AAAA,EACZ,cAAcA,GACX,OAA6D,EAC7D,SAAS;AAAA,EACZ,qBAAqBA,GAClB,OAAoE,EACpE,SAAS;AAAA,EACZ,WAAWA,GACR,OAA0D,EAC1D,SAAS;AACd,CAAC,EAAE,OAAO;AAEH,IAAM,yBAAyBA,GAAE,OAAyB;AAC1D,IAAM,kCAAkCA,GAAE,MAAM;AAAA,EACrD;AAAA,EACA;AACF,CAAC;AAEM,SAAS,2CACd,OAC8B;AAC9B,MAAI;AACF,UAAM,YAAY,uBAAuB,MAAM,KAAK;AAEpD,UAAM,oBAA+D,CAAC;AAEtE,eAAW,CAAC,MAAMC,OAAM,KAAK,OAAO,QAAQ,UAAU,OAAO,GAAG;AAC9D,UAAI;AACF,YAAIA,WAAU,OAAOA,YAAW,YAAY,SAASA,SAAQ;AAC3D,0CAAgC,MAAMA,OAAM;AAC5C,UAAAA,QAAO,mBAAmB;AAC1B,gBAAM,WAAYA,QAAe;AACjC,gBAAM,gBACJ,OAAO,aAAa,WAChB,IAAI,IAAI,QAAQ,IACf;AACP,gBAAM,mBAAmB;AAAA,YACvB,GAAIA;AAAA,YACJ,KAAK;AAAA,UACP;AACA,4BAAkB,IAAI,IACpB;AAAA,QACJ,OAAO;AACL,0CAAgC,MAAMA,OAAM;AAC5C,UAAAA,QAAO,mBAAmB;AAC1B,4BAAkB,IAAI,IAAIA;AAAA,QAC5B;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiBD,GAAE,UAAU;AAC/B,iBAAO;AAAA,YACL,qCAAqC,IAAI,MAAM,MAAM,OAAO;AAAA,UAC9D;AAAA,QACF;AACA,eAAO;AAAA,UACL,qCAAqC,IAAI,MAAM,KAAK;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,yDAAyD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACjH;AAAA,EACF;AACF;AAIO,IAAM,mBAAmBE,GAC7B,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAClC,CAAC,EACA,YAAY;AAIR,SAAS,aAAa,OAAwC;AACnE,MAAI;AACF,UAAM,SAAS,iBAAiB,MAAM,KAAK;AAC3C,QACE,CAAC,iBAAiB,OAAO,SAAS,KAClC,CAAC,iBAAiB,OAAO,MAAM,KAC/B,CAAC,iBAAiB,OAAO,UAAU,GACnC;AACA,aAAO;AAAA,QACL;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiBA,GAAE,UAAU;AAC/B,aAAO,cAAc,+BAA+B,MAAM,OAAO,EAAE;AAAA,IACrE;AACA,WAAO;AAAA,MACL,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACvD;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,CAAC,QAA4B;AAEpD,MAAI,QAAQ,qBAAqB;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,IAAI,WAAW,KAAK,GAAG;AAChC,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AExLA,SAAS,wBAAwB;AACjC,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,mBAAAC,wBAAuB;AAKzB,IAAMC,kBAAiB,CAC5B,UACA,OACA,eAC8B;AAC9B,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,WAAO,cAAc,uCAAuC,QAAQ,EAAE;AAAA,EACxE;AACA,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAOC,iBAAgB,EAAE,QAAQ,WAAW,UAAU,CAAC,EAAE,KAAK;AAAA,IAChE,KAAK;AACH,aAAOC,cAAa,EAAE,QAAQ,WAAW,OAAO,CAAC,EAAE,KAAK;AAAA,IAC1D,KAAK;AACH,aAAO,iBAAiB,EAAE,QAAQ,WAAW,WAAW,CAAC,EAAE,KAAK;AAAA,IAClE;AACE,aAAO,cAAc,yBAAyB,QAAQ,EAAE;AAAA,EAC5D;AACF;AAEO,IAAM,0BAA0B,CACrC,cACG;AACH,SAAO,UAAU,IAAI,CAAC,aAAa,SAAS,QAAQ;AACtD;;;ACvBO,IAAM,kBAAkB,CAC7B,mBACA,gBACG;AACH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,kBAAkB,OAAO,CAACC,UAAS,CAAC,YAAY,SAASA,KAAI,CAAC;AAAA,IACvE,YAAY,YAAY,OAAO,CAACA,UAAS,CAAC,kBAAkB,SAASA,KAAI,CAAC;AAAA,IAC1E,QAAQ,kBAAkB,MAAM,CAACA,UAAS,YAAY,SAASA,KAAI,CAAC;AAAA,EACtE;AACF;;;ACnBA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,cAAc,eAAe,YAAY,iBAAiB;AAEnE,IAAM,aAAa,KAAK,QAAQ,GAAG,SAAS;AAC5C,IAAM,eAAe,KAAK,YAAY,cAAc;AAW7C,SAAS,YAAoB;AAClC,MAAI;AAEF,QAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,gBAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AAGA,QAAI,WAAW,YAAY,GAAG;AAC5B,YAAM,aAAa,aAAa,cAAc,MAAM;AACpD,YAAM,SAAqB,KAAK,MAAM,UAAU;AAGhD,UAAI,OAAO,UAAU,OAAO,OAAO,WAAW,UAAU;AACtD,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,YAAY,WAAW;AAC7B,UAAM,YAAwB;AAAA,MAC5B,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAGA,kBAAc,cAAc,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAE9D,WAAO;AAAA,EACT,SAAS,OAAO;AAEd,YAAQ,KAAK,sDAAsD,KAAK;AACxE,WAAO,WAAW;AAAA,EACpB;AACF;;;ACnDA,SAAS,eAAe;AAEjB,IAAM,YAAY,IAAI;AAAA,EAC3B;AAAA,EACA,EAAE,MAAM,2BAA2B;AACrC;;;A5C8BA,IAAM,YAAY;AAKlB,IAAM,uBAAuB,CAC3B,SACA,cACuB;AACvB,MAAI,OAAO,cAAc,YAAY,OAAO,MAAM,SAAS,GAAG;AAC5D,WAAO;AAAA,EACT;AAEA,UAAQ,WAAW,KAAK;AAC1B;AAUA,IAAM,eAAe,OACnB,gBACA,kBACA,kBACG;AACH,QAAM,YAAY,IAAI,UAAU,gBAAgB;AAChD,QAAM,WAAW,MAAM,UAAU,YAAY;AAC7C,QAAM,iBAAsC,CAAC;AAC7C,SAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,gBAAqB;AACpD,WAAO,OAAO,gBAAgB,WAAW;AAAA,EAC3C,CAAC;AACD,QAAM,cAAc;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,KAAK,iBAAiB,OAAO;AAExD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAO,KAAK,cAAc,EAAE;AAAA,IAC5B;AAAA,IACA,eAAe;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAiBA,IAAM,yBAAyB,OAAO;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA+D;AAC7D,QAAM,EAAE,gBAAgB,MAAM,IAAI;AAClC,QAAM,EAAE,OAAO,IAAI,kBAAkB,CAAC;AAEtC,SAAO,aAAa;AAAA,IAClB,WAAW,WAAW;AAAA,IACtB;AAAA,IACA,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,IACZ,aAAa,gBAAgB;AAAA,EAC/B,CAAC;AAED,MAAI,QAAQ;AACV,WAAO,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,UAAU,SAAS,OAAO,CAAC,EAAE,CAAC;AAAA,EACzE;AAEA,QAAM,cAA4B;AAAA,IAChC,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,SAAO,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;AAE/C,QAAM,iBAAiC,CAAC,WAAW;AACnD,QAAM,cAAwB,CAAC;AAE/B,QAAM,eAAe,KAAK,IAAI;AAC9B,QAAM,cAAc,MAAM,SAAS,eAAe;AAAA,IAChD;AAAA,IACA,iBAAiB,WAAW;AAAA,IAC5B,WAAW;AAAA,EACb,CAAC;AAGD,QAAM,WAAW,OAAO,QAAQA,MAAK,EAAE,IAAI,CAAC,CAAC,MAAMC,KAAI,OAAO;AAAA,IAC5D;AAAA,IACA,aAAcA,OAAc;AAAA,IAC5B,aAAcA,OAAc;AAAA,EAC9B,EAAE;AAEF,MAAI;AACF,UAAM,uBAAuB;AAAA,MAC3B,UAAU;AAAA,MACV;AAAA,MACA,SAAS,KAAK;AAAA,MACd,iBAAiB;AAAA,MACjB,cAAc,OACZ,YACyC;AACzC,YAAI;AACF,gBAAM,MAAM,MAAM,MAAM,GAAG,SAAS,cAAc;AAAA,YAChD,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,cAChB,GAAI,YAAY,EAAE,eAAe,UAAU,SAAS,GAAG,IAAI,CAAC;AAAA,YAC9D;AAAA,YACA,MAAM,KAAK,UAAU,OAAO;AAAA,UAC9B,CAAC;AAED,cAAI,CAAC,IAAI,IAAI;AACX,oBAAQ,MAAM,2BAA2B,IAAI,UAAU,EAAE;AACzD,mBAAO;AAAA,UACT;AAEA,gBAAM,OAAQ,MAAM,IAAI,KAAK;AAE7B,cAAI,CAAC,MAAM,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9C,oBAAQ,MAAM,+BAA+B;AAC7C,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,UAChF;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,kBAAkB,OAAO,aAAa;AACpC,cAAM,6BAA6B,UAAU;AAAA,UAC3C,OAAOD;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,UAAU;AAAA,QACR,iBAAiB,CAAC,SAAS;AACzB,iBAAO,aAAa;AAAA,YAClB,UAAU,CAAC,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,QACA,YAAY,CAAC,SAA+B;AAC1C,sBAAY,KAAK,KAAK,IAAI;AAC1B,gBAAM,aACJ,KAAK,UAAU,OAAO,KAAK,WAAW,WACjC,KAAK,SACN,CAAC;AACP,iBAAO,eAAe,KAAK,MAAM,UAAU;AAAA,QAC7C;AAAA,QACA,cAAc,CAAC,WAAmC;AAChD,iBAAO,iBAAiB,OAAO,YAAY,IAAI,OAAO,MAAM;AAAA,QAC9D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO;AAAA,MACL,4BACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,gBAAgB,KAAK,mBAAmB,WAAW;AAEtE,QAAM,QAAqB;AAAA,IACzB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAEA,QAAM,SAAS,gBAAgB;AAAA,IAC7B;AAAA,IACA,QAAQ,WAAW;AAAA,IACnB;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,SAAO,YAAY;AAAA,IACjB,UAAU,WAAW;AAAA,IACrB,QAAQ,WAAW;AAAA,IACnB,SAAS,WAAW;AAAA,IACpB,YAAY,WAAW;AAAA,IACvB,QAAQ,WAAW;AAAA,EACrB,CAAC;AAED,SAAO,cAAc;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;AAEA,IAAM,eAAe,OAAO;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAAA;AAAA,EACA;AAAA,EACA;AACF,MAAqD;AACnD,QAAM,EAAE,UAAU,OAAO,gBAAgB,MAAM,IAAI;AACnD,QAAM,EAAE,QAAQ,aAAa,WAAW,IAAI,kBAAkB,CAAC;AAE/D,SAAO,aAAa;AAAA,IAClB,WAAW,WAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,QAAQ;AACV,WAAO,aAAa,EAAE,UAAU,CAAC,EAAE,MAAM,UAAU,SAAS,OAAO,CAAC,EAAE,CAAC;AAAA,EACzE;AAEA,QAAM,cAA4B;AAAA,IAChC,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAEA,SAAO,aAAa,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;AAE/C,QAAM,iBAAiC,CAAC,WAAW;AACnD,QAAM,cAAwB,CAAC;AAC/B,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,YAAY;AAEhB,QAAM,eAAe,KAAK,IAAI;AAC9B,QAAM,cAAc,MAAM,SAAS,eAAe;AAAA,IAChD;AAAA,IACA,iBAAiB,WAAW;AAAA,IAC5B,WAAW;AAAA,EACb,CAAC;AAED,SAAO,YAAY,WAAW;AAC5B,QAAI,qBAAqB;AAEzB,QAAI;AACJ,QAAI;AACF,qBAAe,MAAME,YAAW;AAAA,QAC9B,OAAOC,gBAAe,UAAU,OAAO,IAAI;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,OAAAH;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,SAAS,OAAO,UAAU;AACxB,kBAAQ,MAAM,MAAM,MAAM;AAAA,YACxB,KAAK;AAAA,YACL,KAAK,mBAAmB;AACtB,kBAAI,CAAC,oBAAoB;AACvB,uBAAO,sBAAsB,WAAW;AACxC,qCAAqB;AAAA,cACvB;AACA,qBAAO,oBAAoB,MAAM,MAAM,IAAI;AAC3C;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAChB,kBAAI,oBAAoB;AACtB,uBAAO,uBAAuB;AAC9B,qCAAqB;AAAA,cACvB;AACA,qBAAO,eAAe,MAAM,MAAM,UAAU,MAAM,MAAM,KAAK;AAC7D;AAAA,YACF;AAAA,YACA,KAAK,eAAe;AAClB,qBAAO,iBAAiB,MAAM,MAAM,UAAU,MAAM,MAAM,MAAM;AAChE;AAAA,YACF;AAAA,YACA;AACE;AAAA,UACJ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAY;AAEnB,YAAM,eAAe,OAAO,WAAW,OAAO,KAAK;AACnD,aAAO,MAAM,YAAY;AAGzB,YAAMI,cAAa,gBAAgB,KAAK,mBAAmB,CAAC,CAAC;AAC7D,YAAM,SAAS,gBAAgB;AAAA,QAC7B;AAAA,QACA,QAAQ;AAAA,QACR,aAAa,CAAC;AAAA,QACd,OAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,aAAa;AAAA,QACf;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAED,aAAOA;AAAA,IACT;AAEA,UAAM,aAAa,cAAc;AAEjC,QAAI,oBAAoB;AACtB,aAAO,uBAAuB;AAC9B,2BAAqB;AAAA,IACvB;AAEA,UAAM,YAAY,MAAM,aAAa;AACrC,UAAM,kBAAkB,MAAM,aAAa;AAE3C,sBAAkB;AAAA,MAChB;AAAA,MACA,UAAU;AAAA,IACZ;AACA,uBAAmB;AAAA,MACjB;AAAA,MACA,UAAU;AAAA,IACZ;AAEA,UAAM,cAAc,UAAU,eAAe,gBAAgB;AAC7D,sBAAkB,qBAAqB,iBAAiB,WAAW;AAEnE,UAAM,mBAAmB;AAAA,MACvB,MAAM,aAAa;AAAA,IACrB;AACA,QAAI,iBAAiB,QAAQ;AAC3B,kBAAY,KAAK,GAAG,gBAAgB;AAAA,IACtC;AAEA,UAAM,oBAAqB,MAAM,aAAa,WAAW,YACvD,CAAC;AACH,QAAI,iBAAiB,QAAQ;AAC3B,qBAAe,KAAK,GAAG,gBAAgB;AAAA,IACzC;AAEA;AAEA,UAAM,eAAe,MAAM,aAAa;AACxC,QAAI,iBAAiB,cAAc;AACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,uBAAuB;AAE9B,QAAM,aAAa,gBAAgB,KAAK,mBAAmB,WAAW;AAEtE,QAAM,QAAqB;AAAA,IACzB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAEA,QAAM,SAAS,gBAAgB;AAAA,IAC7B;AAAA,IACA,QAAQ,WAAW;AAAA,IACnB;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,SAAO,YAAY;AAAA,IACjB,UAAU,WAAW;AAAA,IACrB,QAAQ,WAAW;AAAA,IACnB,SAAS,WAAW;AAAA,IACpB,YAAY,WAAW;AAAA,IACvB,QAAQ,WAAW;AAAA,EACrB,CAAC;AAED,SAAO,cAAc;AAAA,IACnB,QAAQ,WAAW;AAAA,IACnB,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,OACE,MAAM,gBAAgB,UACtB,MAAM,iBAAiB,UACvB,MAAM,gBAAgB,SAClB,QACA;AAAA,EACR,CAAC;AAED,SAAO;AACT;AAYA,IAAM,cAAc,OAAO;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAAJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAyB;AACvB,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI;AAElC,SAAO,kBAAkB,WAAW,KAAK,OAAO,UAAU,KAAK;AAE/D,MAAI,aAAa;AACjB,MAAI,aAAa;AAEjB,QAAM,aAAa,MAAM,SAAS,eAAe,MAAM,SAAS;AAEhE,WAAS,WAAW,GAAG,WAAW,MAAM,YAAY;AAElD,UAAM,cAAc,sBAAsB,KAAK;AAE/C,UAAM,aACJ,eAAe,aAAa,YACxB,MAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,OAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC,IACD,MAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,OAAAA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAEP,QAAI,WAAW,QAAQ;AACrB;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,YAAY,WAAW;AAClC;AAGA,eAAe,iBACb,gBACA,kBACA,eACA,UACA,gBACA,WACA,WACA;AACA,QAAM,EAAE,aAAa,aAAa,UAAU,IAAI,MAAM;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,oBAAoB,eAAe,MAAM,WAAW,YAAY,MAAM;AAAA,EACxE;AAEA,QAAM,SAAS,YAAY;AAE3B,MAAI,aAAa;AACjB,MAAI,aAAa;AAEjB,MAAI;AACF,aAAS,QAAQ,GAAG,QAAQ,eAAe,QAAQ,SAAS;AAC1D,YAAM,OAAO,eAAe,KAAK;AACjC,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AACA,aAAO;AAAA,QACL,iBAAiB,QAAQ,CAAC,IAAI,eAAe,MAAM,KAAK,KAAK,KAAK;AAAA,MACpE;AACA,YAAM,EAAE,YAAY,YAAY,YAAY,WAAW,IACrD,MAAM,YAAY;AAAA,QAChB;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACH,oBAAc;AACd,oBAAc;AAAA,IAChB;AAEA,cAAU,QAAQ;AAAA,MAChB,YAAY,UAAU;AAAA,MACtB,OAAO;AAAA,MACP,YAAY;AAAA,QACV,aAAa,QAAQ,IAAI;AAAA,MAC3B;AAAA,IACF,CAAC;AACD,WAAO,cAAc;AAAA,MACnB,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,UAAE;AAEA,UAAM,UAAU,WAAW;AAAA,EAC7B;AACF;AAqCO,IAAM,mBAAmB,OAC9B,OACA,aACA,MACA,cACA,WACA,cACG;AACH,QAAM,iBAAiB,KAAK,IAAI;AAChC,SAAO,KAAK,iDAAiD;AAG7D,QAAM,mBAAmB;AAAA,IACvB;AAAA,EACF;AACA,QAAM,iBAAiB,iBAAiB,KAAK;AAC7C,QAAM,gBAAgB,aAAa,IAAI;AAEvC,QAAM,cAAc,OAAO,KAAK,iBAAiB,OAAO;AAExD,QAAM,cAA2B;AAAA,IAC/B,OAAO;AAAA,IACP,aAAa,EAAE,SAAS,YAAY;AAAA,EACtC;AAEA,QAAM,WAAW,0BAA0B,cAAc,WAAW;AAEpE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;A6C/nBO,SAAS,oCACd,WACA,eACkB;AAClB,QAAMK,WAA2C,CAAC;AAElD,aAAW,YAAY,WAAW;AAChC,UAAM,SAAS,cAAc,gBAAgB,QAAQ;AACrD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,QAAQ,aAAa;AAAA,IAClD;AAEA,UAAM,SAAS,cAAc,oCAAoC,QAAQ;AACzE,QAAI,WAAW,aAAa;AAC1B,YAAM,IAAI;AAAA,QACR,WAAW,QAAQ,+BAA+B,MAAM;AAAA,MAC1D;AAAA,IACF;AAEA,IAAAA,SAAQ,QAAQ,IAAI;AAAA,EACtB;AAEA,MAAI,OAAO,KAAKA,QAAO,EAAE,WAAW,GAAG;AACrC,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,SAAAA;AAAA,EACF;AACF;AAEO,SAAS,+BACd,WAIA,SACY;AACZ,QAAM,OAA+B,CAAC;AACtC,QAAM,gBAAgB,WAAW,sBAAsB,OAAO;AAE9D,MAAI,eAAe;AACjB,SAAK,aAAa;AAAA,EACpB,OAAO;AACL,UAAM,cAAc,UAAU,SAAS,YAAY;AACnD,SAAK,WAAW,IAAI,UAAU;AAAA,EAChC;AAEA,QAAM,YAAY,iBAAiB,UAAU,IAAI;AACjD,MAAI,CAAC,UAAU,SAAS;AACtB,UAAM,IAAI,MAAM,8BAA8B,UAAU,MAAM,OAAO,EAAE;AAAA,EACzE;AAEA,SAAO,UAAU;AACnB;;;AC3CA,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoD5B,eAAsB,kBACpBC,QACA,eACA,iBAC8B;AAE9B,QAAM,eAAeA,OAAM;AAAA,IACzB,CAAC,KAAKC,UAAS;AACb,UAAI,CAAC,IAAIA,MAAK,QAAQ,GAAG;AACvB,YAAIA,MAAK,QAAQ,IAAI,CAAC;AAAA,MACxB;AACA,UAAIA,MAAK,QAAQ,EAAE,KAAKA,KAAI;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,OAAO,KAAK,YAAY,EAAE;AAC9C,QAAM,aAAaD,OAAM;AAGzB,QAAM,eAAe,OAAO,QAAQ,YAAY,EAC7C,IAAI,CAAC,CAAC,UAAU,WAAW,MAAM;AAChC,UAAM,YAAY,YACf,IAAI,CAACC,UAAS;AACb,aAAO,OAAOA,MAAK,IAAI,KAAKA,MAAK,eAAe,gBAAgB;AAAA,aAC7D,KAAK,UAAUA,MAAK,WAAW,CAAC;AAAA,IACrC,CAAC,EACA,KAAK,IAAI;AAEZ,WAAO,aAAa,QAAQ,OAAO,YAAY,MAAM;AAAA,EACzD,SAAS;AAAA,EACP,CAAC,EACA,KAAK,MAAM;AAEd,QAAM,sBACJ,cAAc,IACV;AAAA,0BAA6B,WAAW,0HACxC;AAEN,QAAM,aAAa;AAAA;AAAA,EAEnB,YAAY;AAAA;AAAA;AAAA,IAGV,WAAW;AAAA,IACX,UAAU,eAAe,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS9C,QAAM,iBAAiC;AAAA,IACrC,EAAE,MAAM,UAAU,SAAS,oBAAoB;AAAA,IAC/C,EAAE,MAAM,QAAQ,SAAS,WAAW;AAAA,EACtC;AAGA,QAAM,WAAW,MAAM,MAAM,GAAG,aAAa,cAAc;AAAA,IACzD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,eAAe;AAAA,IAC1C;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO;AAAA,MACP,OAAO,CAAC;AAAA,MACR,UAAU,KAAK,UAAU,cAAc;AAAA,IACzC,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,YAAY,MAAM,SAAS,KAAK;AACtC,UAAM,IAAI,MAAM,kCAAkC,SAAS,EAAE;AAAA,EAC/D;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,MAAI,CAAC,KAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAC7C,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAGA,MAAI,oBAAoB;AACxB,aAAW,OAAO,KAAK,UAAU;AAC/B,QAAI,IAAI,SAAS,aAAa;AAC5B,YAAM,UAAU,IAAI;AACpB,UAAI,OAAO,YAAY,UAAU;AAC/B,6BAAqB;AAAA,MACvB,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,mBAAW,QAAQ,SAAS;AAC1B,cAAI,KAAK,SAAS,UAAU,KAAK,MAAM;AACrC,iCAAqB,KAAK;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AAEF,UAAM,YAAY,kBAAkB,MAAM,8BAA8B;AACxE,UAAM,WAAW,YAAY,UAAU,CAAC,EAAE,KAAK,IAAI,kBAAkB,KAAK;AAE1E,UAAM,YAAY,KAAK,MAAM,QAAQ;AAErC,QAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAGA,UAAM,iBAAsC,UAAU,IAAI,CAAC,QAAa;AAAA,MACtE,OAAO,GAAG,SAAS;AAAA,MACnB,OAAO,GAAG,SAAS;AAAA,MACnB,MAAM,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO;AAAA,MAC9C,mBAAmB,MAAM,QAAQ,GAAG,iBAAiB,IACjD,GAAG,oBACH,CAAC;AAAA,MACL,kBAAkB,GAAG;AAAA,IACvB,EAAE;AAEF,WAAO;AAAA,EACT,SAAS,YAAY;AACnB,YAAQ,MAAM,iCAAiC,iBAAiB;AAChE,UAAM,IAAI;AAAA,MACR,iDAAiD,sBAAsB,QAAQ,WAAW,UAAU,eAAe;AAAA,IACrH;AAAA,EACF;AACF;;;A/ChMA,SAAS,wBACP,cACA,eACU;AACV,QAAM,YAAY,cAAc,YAAY;AAC5C,QAAM,WAAqB,CAAC;AAE5B,aAAW,eAAe,cAAc;AACtC,UAAM,QACJ,UAAU,KAAK,CAAC,OAAO,OAAO,WAAW,KACzC,UAAU,KAAK,CAAC,OAAO,GAAG,YAAY,MAAM,YAAY,YAAY,CAAC;AAEvE,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,WAAW,WAAW,aAAa;AAAA,IACrD;AAEA,QAAI,CAAC,SAAS,SAAS,KAAK,GAAG;AAC7B,eAAS,KAAK,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,uBACb,eACA,WAC2B;AAC3B,QAAM,iBAAiB,MAAM,QAAQ;AAAA,IACnC,UAAU,IAAI,OAAO,aAAa;AAChC,UACE,cAAc,oCAAoC,QAAQ,MAC1D,aACA;AACA,eAAO,CAAC;AAAA,MACV;AAEA,UAAI;AACF,cAAM,EAAE,OAAAC,OAAM,IAAI,MAAM,cAAc,UAAU,QAAQ;AACxD,eAAOA,OAAM,IAAI,CAACC,WAAU;AAAA,UAC1B,MAAMA,MAAK;AAAA,UACX,aAAaA,MAAK;AAAA,UAClB,aAAaA,MAAK;AAAA,UAClB,cAAeA,MAAoC;AAAA,UACnD;AAAA,QACF,EAAE;AAAA,MACJ,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,2CAA2C,QAAQ;AAAA,UACnD;AAAA,QACF;AACA,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,eAAe,KAAK;AAC7B;AAEA,IAAM,QAAQ,IAAIC,OAAK;AAEvB,IAAM,wBAAwBC,GAAE,OAAO;AAAA,EACrC,OAAOA,GAAE;AAAA,IACPA,GAAE,OAAO;AAAA,MACP,OAAOA,GAAE,OAAO;AAAA,MAChB,OAAOA,GAAE,OAAO;AAAA,MAChB,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MAChC,OAAOA,GAAE,OAAO;AAAA,MAChB,UAAUA,GAAE,OAAO;AAAA,MACnB,mBAAmBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MACrC,kBAAkBA,GAAE,OAAO,EAAE,SAAS;AAAA,MACtC,gBAAgBA,GACb,OAAO;AAAA,QACN,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,QACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAClC,CAAC,EACA,YAAY,EACZ,SAAS;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EACA,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,GAAG,sCAAsC;AAAA,EAC5E,WAAWA,GAAE,OAAO;AAAA,IAClB,UAAUA,GAAE,OAAO;AAAA,IACnB,QAAQA,GAAE,OAAO;AAAA,EACnB,CAAC;AAAA,EACD,iBAAiBA,GAAE,OAAO;AAC5B,CAAC;AAID,MAAM,KAAK,QAAQ,OAAO,MAAM;AAC9B,MAAI;AACF,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAE9B,UAAM,mBAAmB,sBAAsB,UAAU,IAAI;AAC7D,QAAI,CAAC,iBAAiB,SAAS;AAC7B,aAAO,EAAE;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,SAAS,iBAAiB,MAAM;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,WAAW,WAAW,gBAAgB,IACnD,iBAAiB;AAEnB,UAAM,gBAAgB,EAAE;AACxB,UAAM,oBAAoB,wBAAwB,WAAW,aAAa;AAE1E,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AACA,UAAM,UAAU,MAAM,SAAS,IAAI,MAAM,CAAC,EAAE,QAAQ;AACpD,UAAM,OAAO,+BAA+B,WAAW,OAAO;AAE9D,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAEA,UAAM,gBAAgB,QAAQ,IAAI;AAClC,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,UAAM,eAAe,IAAI,iBAAiB,SAAS;AACnD,iBAAa,QAAQ,eAAe;AAEpC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,MAAM,CAAC,UAAU;AACjB,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACvD,cAAQ,MAAM,yBAAyB,YAAY;AAAA,IACrD,CAAC;AAED,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,wBAAwB,KAAK;AAC3C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EAC1C,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,IAAI,GAAG,sCAAsC;AAAA,EAC5E,iBAAiBA,GAAE,OAAO;AAC5B,CAAC;AAID,MAAM,KAAK,mBAAmB,OAAO,MAAM;AACzC,MAAI;AACF,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAE9B,UAAM,mBAAmB,2BAA2B,UAAU,IAAI;AAClE,QAAI,CAAC,iBAAiB,SAAS;AAC7B,aAAO,EAAE;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,SAAS,iBAAiB,MAAM;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,EAAE,WAAW,gBAAgB,IACjC,iBAAiB;AAEnB,UAAM,gBAAgB,EAAE;AACxB,UAAM,oBAAoB,wBAAwB,WAAW,aAAa;AAE1E,UAAM,gBAAgB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,IACF;AAEA,QAAI,cAAc,WAAW,GAAG;AAC9B,aAAO,EAAE;AAAA,QACP;AAAA,UACE,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,QAAQ,IAAI;AAClC,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAGA,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,mCAAmC,KAAK;AACtD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,gBAAQ;;;AgDpPf,SAAS,QAAAC,cAAY;;;ACCrB,SAAS,KAAAC,UAAS;AAClB,SAAS,mBAAAC,wBAAuB;AAazB,SAAS,sBAAsB,UAAkB,MAAkB;AACxE,MAAI,SAAS,WAAW;AACtB,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,cAAc;AAAA,QACZ,OAAO,EAAE,aAAa,KAAK;AAAA,QAC3B,SAAS,CAAC;AAAA,QACV,WAAW,EAAE,aAAa,MAAM,WAAW,KAAK;AAAA,QAChD,SAAS,CAAC;AAAA,QACV,OAAO,EAAE,aAAa,KAAK;AAAA,MAC7B;AAAA,MACA,YAAY,EAAE,MAAM,UAAU,SAAS,gBAAgB;AAAA,IACzD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa,CAAC;AAAA,MACd,OAAO,EAAE,aAAa,KAAK;AAAA,IAC7B;AAAA,IACA,YAAY,EAAE,MAAM,UAAU,SAAS,eAAe;AAAA,EACxD;AACF;AAEA,SAAS,kBAAkB,QAAkB;AAC3C,MAAI;AACF,QAAI,UAAU,OAAO,WAAW,UAAU;AAExC,UACE,kBAAkBD,GAAE,WACnB,UAAU,UAAU,WAAW,QAChC;AACA,eAAOC,iBAAgB,MAAwB;AAAA,MACjD;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,eAAsB,cACpB,UACA,MACA,eACA,MACqB;AACrB,QAAM,KAAM,MAAM,MAAM;AACxB,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM,UAAU,CAAC;AAGhC,MAAI,CAAC,UAAU,OAAO,WAAW,gBAAgB,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,CAAC,aAAkB,EAAE,SAAS,OAAO,IAAI,GAAG,QAAQ;AAEpE,MAAI;AACF,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC/B,KAAK,cAAc;AACjB,cAAM,SAAS,sBAAsB,UAAU,IAAI;AACnD,eAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,MAC3B;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,OAAO,MAAM,cAAc,UAAU,QAAQ;AACnD,cAAMC,UAAS,MAAM,SAAS,CAAC,GAAG,IAAI,CAACC,WAAe;AAAA,UACpD,MAAMA,MAAK;AAAA,UACX,aAAaA,MAAK;AAAA,UAClB,aAAa,kBAAkBA,MAAK,WAAW;AAAA,UAC/C,cAAc;AAAA,YACZA,MAAK,gBAAgBA,MAAK;AAAA,UAC5B;AAAA,QACF,EAAE;AACF,eAAO,QAAQ,EAAE,QAAQ,EAAE,OAAAD,OAAM,EAAE,CAAC;AAAA,MACtC;AAAA,MACA,KAAK,cAAc;AACjB,YAAI;AACF,cAAI,iBAAiB;AACrB,cAAI,WAAW,QAAQ;AACvB,cAAI,UAAU,SAAS,GAAG,GAAG;AAC3B,kBAAM,CAAC,QAAQ,UAAU,IAAI,SAAS,MAAM,KAAK,CAAC;AAClD,gBAAI,YAAY;AACd,kBAAI,cAAc,UAAU,MAAM,GAAG;AACnC,iCAAiB;AAAA,cACnB;AACA,yBAAW;AAAA,YACb;AAAA,UACF;AACA,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI,MAAM,uBAAuB;AAAA,UACzC;AACA,gBAAM,OAAO,MAAM,cAAc;AAAA,YAC/B;AAAA,YACA;AAAA,YACC,QAAQ,aAAa,CAAC;AAAA,UACzB;AACA,cAAI,SAAS,WAAW;AACtB,mBAAO,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAAA,UACjC;AAEA,iBAAO,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAAA,QACjC,SAAS,GAAQ;AACf,cAAI,SAAS,WAAW;AACtB,kBAAM,SAAS;AAAA,cACb,SAAS;AAAA,gBACP,EAAE,MAAM,QAAQ,MAAM,UAAU,GAAG,WAAW,OAAO,CAAC,CAAC,GAAG;AAAA,cAC5D;AAAA,cACA,SAAS;AAAA,YACX;AACA,mBAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UAC3B;AACA,iBAAO,QAAQ;AAAA,YACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,UAC1D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,OAAO,MAAM,cAAc,cAAc,QAAQ;AACvD,cAAME,cAAa,MAAM,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UACzD,KAAK,EAAE;AAAA,UACP,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,UAAU,EAAE;AAAA,QACd,EAAE;AACF,eAAO,QAAQ,EAAE,QAAQ,EAAE,WAAAA,WAAU,EAAE,CAAC;AAAA,MAC1C;AAAA,MACA,KAAK,kBAAkB;AACrB,YAAI;AACF,gBAAM,WAAW,MAAM,cAAc,aAAa,UAAU;AAAA,YAC1D,KAAK,QAAQ;AAAA,UACf,CAAC;AACD,cAAI,SAAS,WAAW;AACtB,kBAAM,eAAgB,UAAkB,WAAW,CAAC;AACpD,kBAAM,OACJ,OAAO,cAAc,SAAS,WAC1B,aAAa,OACb,OAAQ,aAAqB,WAC1B,WACD,KAAK,UAAU,UAAU,MAAM,CAAC;AACxC,kBAAM,SAAS;AAAA,cACb,UAAU;AAAA,gBACR;AAAA,kBACE,KAAK,QAAQ;AAAA,kBACb,UACE,cAAc,aACb,OAAO,SAAS,WAAW,eAAe;AAAA,kBAC7C;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,mBAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UAC3B;AAEA,iBAAO,QAAQ,EAAE,QAAQ,SAAS,CAAC;AAAA,QACrC,SAAS,GAAQ;AACf,iBAAO,QAAQ;AAAA,YACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,UAC1D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAM,OAAO,MAAM,cAAc,YAAY,QAAQ;AACrD,cAAMC,YAAW,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UACrD,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,WAAW,EAAE;AAAA,QACf,EAAE;AACF,eAAO,QAAQ,EAAE,QAAQ,EAAE,SAAAA,SAAQ,EAAE,CAAC;AAAA,MACxC;AAAA,MACA,KAAK,eAAe;AAClB,YAAI;AACF,gBAAM,SAAS,MAAM,cAAc,UAAU,UAAU;AAAA,YACrD,MAAM,QAAQ;AAAA,YACd,WAAW,QAAQ;AAAA,UACrB,CAAC;AACD,cAAI,SAAS,WAAW;AACtB,kBAAM,SAAS;AAAA,cACb,aACG,QAAgB,eAAe,WAAW,QAAQ,IAAI;AAAA,cACzD,UAAW,QAAgB,YAAY;AAAA,gBACrC;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,oBACP,MAAM;AAAA,oBACN,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,kBACtC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,mBAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UAC3B;AAEA,iBAAO,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,QACnC,SAAS,GAAQ;AACf,iBAAO,QAAQ;AAAA,YACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,UAC1D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,KAAK,cAAc;AACjB,eAAO,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;AAAA,MAC1C;AAAA,MACA,KAAK,oBAAoB;AACvB,eAAO,QAAQ,EAAE,QAAQ,EAAE,SAAS,KAAK,EAAE,CAAC;AAAA,MAC9C;AAAA,MACA,SAAS;AACP,eAAO,QAAQ;AAAA,UACb,OAAO,EAAE,MAAM,QAAQ,SAAS,2BAA2B,MAAM,GAAG;AAAA,QACtE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,GAAQ;AACf,WAAO,QAAQ;AAAA,MACb,OAAO,EAAE,MAAM,OAAQ,SAAS,GAAG,WAAW,OAAO,CAAC,EAAE;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;;;ADpOA,IAAM,WAAiC,oBAAI,IAAI;AAC/C,IAAM,wBAA6C,oBAAI,IAAI;AAK3D,SAAS,kBAAkB,MAAkB,aAAqB;AAChE,QAAM,SAAS,IAAIC,OAAK;AAExB,SAAO;AAAA,IAAQ;AAAA,IAAc,CAAC,MAC5B,EAAE,KAAK,MAAM,KAAK;AAAA,MAChB,+BAA+B;AAAA,MAC/B,gCAAgC;AAAA,MAChC,gCACE;AAAA,MACF,iCAAiC;AAAA,MACjC,0BAA0B;AAAA,IAC5B,CAAC;AAAA,EACH;AAGA,SAAO;AAAA,IAAQ;AAAA,IAAgB,CAAC,MAC9B,EAAE,KAAK,MAAM,KAAK;AAAA,MAChB,+BAA+B;AAAA,MAC/B,gCAAgC;AAAA,MAChC,gCACE;AAAA,MACF,iCAAiC;AAAA,MACjC,0BAA0B;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,iBAAe,WAAW,GAAQ;AAChC,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAM,SAAS,EAAE,IAAI;AAGrB,QAAI,WAAW,QAAQ;AACrB,aAAO,EAAE,KAAK,MAAM,KAAK;AAAA,QACvB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,+BAA+B;AAAA,QAC/B,qBAAqB;AAAA,MACvB,CAAC;AAAA,IACH;AACA,QAAI,WAAW,OAAO;AACpB,YAAM,UAAU,IAAI,YAAY;AAChC,YAAM,cAAc,IAAI,IAAI,EAAE,IAAI,GAAG;AAErC,YAAM,eAAe,EAAE,IAAI,OAAO,wBAAwB;AAC1D,UAAI;AACJ,UAAI,gBAAgB,aAAa,KAAK,MAAM,IAAI;AAC9C,uBAAe,aAAa,KAAK;AAAA,MACnC,OAAO;AAGL,cAAM,UAAU,EAAE,IAAI,OAAO,mBAAmB;AAChD,cAAM,SAAS,EAAE,IAAI,OAAO,kBAAkB;AAC9C,cAAM,OAAO,UAAU,EAAE,IAAI,OAAO,MAAM;AAC1C,YAAI,QAAQ;AACZ,YAAI,CAAC,OAAO;AACV,gBAAM,eAAe,EAAE,IAAI,OAAO,QAAQ;AAC1C,cAAI,gBAAgB,WAAW,KAAK,YAAY,EAAG,SAAQ;AAAA,QAC7D;AACA,YAAI,CAAC,MAAO,SAAQ;AACpB,cAAM,SAAS,OAAO,GAAG,KAAK,MAAM,IAAI,KAAK,YAAY;AACzD,uBAAe,GAAG,MAAM,YAAY,WAAW,IAAI,QAAQ;AAAA,MAC7D;AACA,YAAM,YAAY,OAAO,WAAW;AACpC,UAAI;AACJ,YAAM,SAAS,IAAI,eAAe;AAAA,QAChC,MAAM,YAAY;AAChB,kBAAQ,IAAI,IAAI,WAAW,cAAc,EAAE,UAAU,UAAU,CAAC;AAChE,gBAAM,OAAO,CAAC,OAAe,SAAiB;AAC5C,uBAAW,QAAQ,QAAQ,OAAO,UAAU,KAAK;AAAA,CAAI,CAAC;AACtD,uBAAW,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAAA;AAAA,CAAM,CAAC;AAAA,UACxD;AACA,gBAAM,QAAQ,MAAM;AAClB,gBAAI;AACF,yBAAW,MAAM;AAAA,YACnB,QAAQ;AAAA,YAAC;AAAA,UACX;AAGA,mBAAS,IAAI,GAAG,QAAQ,IAAI,SAAS,IAAI,EAAE,MAAM,MAAM,CAAC;AACxD,gCAAsB,IAAI,UAAU,SAAS;AAC7C,kBAAQ,IAAI,IAAI,WAAW,wBAAwB;AAAA,YACjD,KAAK,GAAG,QAAQ,IAAI,SAAS;AAAA,UAC/B,CAAC;AAGD,eAAK,QAAQ,EAAE;AACf,gBAAM,MAAM,aAAa,SAAS,GAAG,IAAI,MAAM;AAC/C,gBAAM,MAAM,GAAG,YAAY,GAAG,GAAG,aAAa,SAAS;AACvD,kBAAQ,IAAI,IAAI,WAAW,cAAc;AAAA,YACvC;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAED,cAAI;AACF,iBAAK,YAAY,KAAK,UAAU,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;AAAA,UACvD,QAAQ;AAAA,UAAC;AACT,cAAI;AACF,iBAAK,YAAY,GAAG;AAAA,UACtB,QAAQ;AAAA,UAAC;AAGT,kBAAQ,YAAY,MAAM;AACxB,gBAAI;AACF,yBAAW;AAAA,gBACT,QAAQ,OAAO,eAAe,KAAK,IAAI,CAAC;AAAA;AAAA,CAAM;AAAA,cAChD;AAAA,YACF,QAAQ;AAAA,YAAC;AAAA,UACX,GAAG,IAAK;AAAA,QACV;AAAA,QACA,SAAS;AACP,cAAI;AACF,0BAAc,KAAK;AAAA,UACrB,QAAQ;AAAA,UAAC;AACT,kBAAQ,IAAI,IAAI,WAAW,eAAe,EAAE,UAAU,UAAU,CAAC;AACjE,mBAAS,OAAO,GAAG,QAAQ,IAAI,SAAS,EAAE;AAE1C,cAAI,sBAAsB,IAAI,QAAQ,MAAM,WAAW;AACrD,kCAAsB,OAAO,QAAQ;AAAA,UACvC;AAAA,QACF;AAAA,MACF,CAAC;AACD,aAAO,EAAE,KAAK,QAAe,KAAK;AAAA,QAChC,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,QACjC,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,QAAQ;AACrB,aAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,IACrD;AAGA,QAAI,OAAY;AAChB,QAAI;AACF,aAAO,MAAM,EAAE,IAAI,KAAK;AAAA,IAC1B,QAAQ;AAAA,IAAC;AAET,UAAM,gBAAgB,EAAE;AACxB,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAU;AAEb,aAAO,EAAE,KAAK,YAAY,KAAK,EAAE,+BAA+B,IAAI,CAAC;AAAA,IACvE;AACA,WAAO,EAAE,KAAK,KAAK,UAAU,QAAQ,GAAG,KAAK;AAAA,MAC3C,gBAAgB;AAAA,MAChB,+BAA+B;AAAA,MAC/B,iCAAiC;AAAA,IACnC,CAAC;AAAA,EACH;AAGA,SAAO,KAAK,uBAAuB,OAAO,MAAM;AAC9C,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,UAAM,YAAY,IAAI,aAAa,IAAI,WAAW,KAAK;AACvD,UAAM,MAAM,GAAG,QAAQ,IAAI,SAAS;AACpC,QAAI,OAAO,SAAS,IAAI,GAAG;AAC3B,QAAI,CAAC,MAAM;AACT,YAAM,aAAa,sBAAsB,IAAI,QAAQ;AACrD,UAAI,YAAY;AACd,eAAO,SAAS,IAAI,GAAG,QAAQ,IAAI,UAAU,EAAE;AAAA,MACjD;AAAA,IACF;AACA,YAAQ,IAAI,IAAI,WAAW,mBAAmB;AAAA,MAC5C;AAAA,MACA,UAAU,CAAC,CAAC;AAAA,MACZ,aAAa,EAAE,IAAI,OAAO,cAAc;AAAA,IAC1C,CAAC;AACD,QAAI,CAAC,MAAM;AACT,aAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,IACjD;AACA,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,EAAE,IAAI,KAAK;AAAA,IAC1B,QAAQ;AACN,UAAI;AACF,cAAM,MAAM,MAAM,EAAE,IAAI,KAAK;AAC7B,eAAO,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,MACjC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,KAAK,MAAM,MAAM;AACvB,UAAM,SAAS,MAAM;AACrB,UAAM,SAAS,MAAM,UAAU,CAAC;AAGhC,QAAI;AACF,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA,EAAE,IAAI,QAAQ,OAAO;AAAA,QACrB,EAAE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,iBAAiB;AACnB,YAAI;AACF,kBAAQ,IAAI,IAAI,WAAW,kBAAkB;AAAA,YAC3C;AAAA,YACA,IAAI,gBAAgB;AAAA,YACpB;AAAA,UACF,CAAC;AACD,eAAK,KAAK,WAAW,KAAK,UAAU,eAAe,CAAC;AAAA,QACtD,QAAQ;AAAA,QAAC;AAAA,MACX;AAEA,aAAO,EAAE,KAAK,YAAY,KAAK;AAAA,QAC7B,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,MACnC,CAAC;AAAA,IACH,SAAS,GAAQ;AACf,aAAO,EAAE,KAAK,SAAS,KAAK;AAAA,QAC1B,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,SAAO,IAAI,cAAc,UAAU;AACnC,SAAO,IAAI,gBAAgB,UAAU;AAErC,SAAO;AACT;AAGO,IAAM,cAAc,kBAAkB,WAAW,cAAc;AAC/D,IAAM,cAAc,kBAAkB,WAAW,cAAc;;;AhEjPtE,IAAM,MAAM,IAAIC,OAAK;AAGrB,IAAI,IAAI,WAAW,CAAC,MAAM;AACxB,SAAO,EAAE,KAAK;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AACH,CAAC;AAGD,IAAI,MAAM,SAAS,YAAI;AAGvB,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,cAAc,iBAAS;AAGjC,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,WAAW,cAAQ;AAG7B,IAAI,MAAM,gBAAgB,mBAAW;AAGrC,IAAI,MAAM,iBAAiB,WAAW;AACtC,IAAI,MAAM,iBAAiB,WAAW;AAEtC,IAAO,cAAQ;;;AkE1Df,SAAS,cAAAC,mBAAkB;AAyC3B,IAAM,mBAAN,MAAuB;AAAA,EACb,eAA8C,oBAAI,IAAI;AAAA,EACtD,eACN,oBAAI,IAAI;AAAA,EACF,WAAqC,oBAAI,IAAI;AAAA,EAErD,OACE,WACA,eACA,UACA;AAEA,UAAM,KAAKA,YAAW,EAAE,QAAQ,MAAM,EAAE;AACxC,UAAM,QAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,MAAM,CAAC;AAAA,MACP,aAAa,oBAAI,IAAI;AAAA,MACrB;AAAA,MACA,kBAAkB,oBAAI,IAAI;AAAA,MAC1B;AAAA,IACF;AACA,SAAK,aAAa,IAAI,IAAI,KAAK;AAC/B,QAAI,UAAU;AACZ,UAAI,CAAC,KAAK,SAAS,IAAI,QAAQ,EAAG,MAAK,SAAS,IAAI,UAAU,oBAAI,IAAI,CAAC;AACvE,WAAK,SAAS,IAAI,QAAQ,EAAG,IAAI,EAAE;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,IAAY;AACd,WAAO,KAAK,aAAa,IAAI,EAAE;AAAA,EACjC;AAAA,EAEA,KAAK,IAAY;AACf,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO;AAAA,MACL,IAAI,EAAE;AAAA,MACN,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,UAAU,EAAE,KAAK;AAAA,MACjB,iBAAiB,CAAC,CAAC,EAAE,eAAe;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,UAAU,IAAY;AACpB,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,OAAO,CAAC;AACV,SAAK,UAAU,GAAG,EAAE,MAAM,UAAU,CAAC;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,IAAY,KAAqB;AACzC,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,KAAK,KAAK,GAAG;AACf,SAAK,UAAU,GAAG,EAAE,MAAM,OAAO,IAAI,CAAC;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,IAAY;AACnB,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,WAAO,GAAG,QAAQ,CAAC;AAAA,EACrB;AAAA,EAEA,UAAU,IAAY,YAA2B;AAC/C,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,YAAY,IAAI,UAAU;AAC5B,WAAO,MAAM;AACX,QAAE,YAAY,OAAO,UAAU;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,mBAAmB,IAAY,WAAmB,KAAa;AAC7D,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AACf,MAAE,iBAAiB,IAAI,WAAW,GAAG;AACrC,SAAK,aAAa,IAAI,WAAW,EAAE,eAAe,IAAI,IAAI,CAAC;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,IAAY,WAAuC;AACpE,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,WAAO,GAAG,iBAAiB,IAAI,SAAS;AAAA,EAC1C;AAAA,EAEA,kBACE,WACoD;AACpD,WAAO,KAAK,aAAa,IAAI,SAAS;AAAA,EACxC;AAAA,EAEA,QAAQ,IAAqB;AAC3B,UAAM,IAAI,KAAK,aAAa,IAAI,EAAE;AAClC,QAAI,CAAC,EAAG,QAAO;AAEf,eAAW,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG;AAC3C,UAAI;AACF,YAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,MAC7B,QAAQ;AAAA,MAAC;AACT,UAAI;AACF,YAAI,MAAM;AAAA,MACZ,QAAQ;AAAA,MAAC;AAAA,IACX;AACA,MAAE,YAAY,MAAM;AAEpB,eAAW,OAAO,MAAM,KAAK,EAAE,iBAAiB,KAAK,CAAC,GAAG;AACvD,WAAK,aAAa,OAAO,GAAG;AAAA,IAC9B;AACA,SAAK,aAAa,OAAO,EAAE;AAC3B,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,UAA0B;AACxC,UAAM,MAAM,KAAK,SAAS,IAAI,QAAQ;AACtC,QAAI,CAAC,OAAO,IAAI,SAAS,EAAG,QAAO;AACnC,QAAI,QAAQ;AACZ,eAAW,MAAM,MAAM,KAAK,GAAG,GAAG;AAChC,UAAI,KAAK,QAAQ,EAAE,EAAG;AAAA,IACxB;AACA,SAAK,SAAS,OAAO,QAAQ;AAC7B,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,GAAqB,SAAc;AACnD,eAAW,OAAO,MAAM,KAAK,EAAE,WAAW,GAAG;AAC3C,UAAI;AACF,YAAI,KAAK,OAAO;AAAA,MAClB,QAAQ;AACN,YAAI;AACF,cAAI,MAAM;AAAA,QACZ,QAAQ;AAAA,QAAC;AACT,UAAE,YAAY,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,mBAAmB,IAAI,iBAAiB;;;ArEvKrD,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAMC,aAAY,QAAQ,UAAU;AAiBpC,SAAS,OAAO,SAAiB,OAAgB;AAC/C,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAC9D,QAAM,QAAQ,YAAY;AAE1B,UAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AACzC,MAAI,OAAO;AACT,UAAM,eAAe,KAAK,OAAO,QAAQ,MAAM,SAAS,KAAK,CAAC;AAC9D,YAAQ;AAAA,MACN,WACE,IAAI,OAAO,YAAY,IACvB,QACA,IAAI,OAAO,QAAQ,MAAM,SAAS,YAAY,IAC9C;AAAA,IACJ;AACA,YAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AAAA,EAC3C;AAEA,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,UAAU,QAAQ,KAAK,SAAS;AACtC,YAAQ,IAAI,YAAO,OAAO,IAAI,OAAO,OAAO,IAAI,SAAI;AAAA,EACtD,CAAC;AAED,UAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AAC3C;AASA,SAAS,sBAAsB;AAE7B,QAAM,aAAa,QAAQ,IAAI;AAC/B,MAAI,YAAY;AACd,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,UAAU;AACpC,cAAQ,IAAI,uBAAuB,MAAM;AACzC,UAAI,OAAO,cAAc,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS,GAAG;AAElE,cAAMC,WAAU,OAAO,QAAQ,OAAO,UAAU,EAAE;AAAA,UAChD,CAAC,CAAC,MAAM,YAAY,OAAsB;AAAA,YACxC;AAAA,YACA,MAAM,aAAa,QAAQ;AAAA;AAAA,YAC3B,SAAS,aAAa;AAAA,YACtB,MAAM,aAAa,QAAQ,CAAC;AAAA,YAC5B,KAAK,aAAa,OAAO,CAAC;AAAA,YAC1B,KAAK,aAAa;AAAA;AAAA,UACpB;AAAA,QACF;AACA,gBAAQ,IAAI,wBAAwBA,QAAO;AAG3C,cAAM,oBAAoB,QAAQ,IAAI;AACtC,gBAAQ;AAAA,UACN;AAAA,UACA,qBAAqB;AAAA,QACvB;AAEA,eAAO;AAAA,UACL,SAAAA;AAAA,UACA,mBAAmB,qBAAqB;AAAA,QAC1C;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AAAA,IACzD;AAAA,EACF;AAGA,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,IAAI;AAC/B,QAAM,OAAO,aAAa,KAAK,MAAM,UAAU,IAAI,CAAC;AAEpD,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA,MAAM;AAAA;AAAA,QACN,KAAK,CAAC;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAGA,IAAI;AACF,UAAQ;AACV,QAAQ;AAAC;AAET,IAAM,MAAM,IAAIC,OAAK,EAAE,QAAQ,CAAC,KAAK,MAAM;AACzC,UAAQ,MAAM,oBAAoB,GAAG;AAGrC,EAAO,yBAAiB,GAAG;AAG3B,MAAI,eAAe,eAAe;AAChC,WAAO,IAAI,YAAY;AAAA,EACzB;AAEA,SAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AACvD,CAAC;AAGD,IAAM,UACJ,QAAQ,IAAI,aAAa,eACrB,oBACA;AAMN,IAAI,UAAU;AACd,IACE,QAAQ,IAAI,iBAAiB,UAC7B,QAAQ,IAAI,yBACZ;AACA,YAAUC,MAAK,QAAQ,IAAI,yBAAyB,OAAO;AAC7D,OAAO;AACL,QAAM,cAAc,QAAQC,YAAW,MAAM,IAAI;AACjD,QAAM,iBAAiBD,MAAK,aAAa,OAAO;AAChD,MAAIE,YAAW,cAAc,GAAG;AAC9B,cAAU;AAAA,EACZ;AACF;AAEA,OAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAG/B,IAAI,CAAC,QAAQ,IAAI,iBAAiB;AAChC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAGA,IAAM,mBAAmB,IAAI;AAAA,EAC3B,CAAC;AAAA,EACD;AAAA,IACE,WAAW,CAAC,EAAE,WAAW,SAAS,SAAS,MAAM;AAC/C,gBAAU,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAI,IAAI,KAAK,OAAO,GAAG,SAAS;AAC9B,IAAE,mBAAmB;AACrB,QAAM,KAAK;AACb,CAAC;AAGD,IAAI,IAAI,KAAK,OAAO,CAAC;AAErB,IAAM,aAAa,QAAQ,IAAI,QAAQ;AACvC,IAAM,cAAc;AAAA,EAClB,oBAAoB,UAAU;AAAA,EAC9B;AAAA;AACF;AAEA,IAAI;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AACH;AAGA,IAAI,MAAM,YAAY,WAAS;AAK/B,IAAI,QAAQ,gBAAgB,CAAC,MAAM;AACjC,SAAO,EAAE,KAAK,MAAM,KAAK;AAAA,IACvB,+BAA+B;AAAA,IAC/B,gCAAgC;AAAA,IAChC,gCACE;AAAA,IACF,0BAA0B;AAAA,IAC1B,MAAM;AAAA,EACR,CAAC;AACH,CAAC;AAED,IAAI,KAAK,gBAAgB,OAAO,MAAM;AACpC,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,UAAM,YACJ,IAAI,aAAa,IAAI,WAAW,KAAK,IAAI,aAAa,IAAI,KAAK,KAAK;AACtE,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;AAAA,IACnD;AACA,UAAM,UAAU,iBAAiB,kBAAkB,SAAS;AAC5D,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;AAAA,IACnD;AACA,UAAM,QAAQ,iBAAiB,IAAI,QAAQ,aAAa;AACxD,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,IACvD;AAGA,QAAI,WAAW;AACf,QAAI;AACF,iBAAW,MAAM,EAAE,IAAI,KAAK;AAAA,IAC9B,QAAQ;AAAA,IAAC;AACT,UAAM,UAAU,IAAI,QAAQ;AAC5B,MAAE,IAAI,IAAI,QAAQ,QAAQ,CAACC,IAAG,MAAM;AAClC,YAAM,MAAM,EAAE,YAAY;AAC1B,UACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,SAAS,GAAG;AAEd;AACF,cAAQ,IAAI,GAAGA,EAAC;AAAA,IAClB,CAAC;AACD,QAAI,MAAM,eAAe;AACvB,iBAAW,CAAC,GAAGA,EAAC,KAAK,OAAO,QAAQ,MAAM,aAAa,GAAG;AACxD,cAAM,MAAM,EAAE,YAAY;AAC1B,YACE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,SAAS,GAAG;AAEd;AACF,YAAI,QAAQ,mBAAmB,QAAQ,IAAI,eAAe,EAAG;AAC7D,gBAAQ,IAAI,GAAGA,EAAC;AAAA,MAClB;AAAA,IACF;AAEA,QAAI;AACF,YAAM;AAAA,QACJ,IAAI,QAAQ,QAAQ,KAAK,EAAE,QAAQ,QAAQ,SAAS,MAAM,SAAS,CAAC;AAAA,MACtE;AAAA,IACF,QAAQ;AAAA,IAAC;AAET,WAAO,EAAE,KAAK,YAAY,KAAK;AAAA,MAC7B,+BAA+B;AAAA,MAC/B,iCAAiC;AAAA,IACnC,CAAC;AAAA,EACH,SAAS,GAAQ;AACf,WAAO,EAAE;AAAA,MACP,KAAK,UAAU,EAAE,OAAO,GAAG,WAAW,gBAAgB,CAAC;AAAA,MACvD;AAAA,MACA;AAAA,QACE,gBAAgB;AAAA,QAChB,+BAA+B;AAAA,QAC/B,iCAAiC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,IAAI,IAAI,WAAW,CAAC,MAAM;AACxB,SAAO,EAAE,KAAK,EAAE,QAAQ,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AACrE,CAAC;AAGD,IAAI,IAAI,uBAAuB,CAAC,MAAM;AACpC,QAAM,YAAY,oBAAoB;AACtC,SAAO,EAAE,KAAK,EAAE,QAAQ,UAAU,CAAC;AACrC,CAAC;AAGD,IAAI,QAAQ,IAAI,aAAa,cAAc;AAEzC,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACnD,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACnD,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACnD,MAAI,IAAI,WAAW,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACpD,MAAI,IAAI,UAAU,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AAGnD,MAAI,IAAI,MAAM,YAAY,EAAE,MAAM,gBAAgB,CAAC,CAAC;AAGpD,MAAI,IAAI,KAAK,OAAO,MAAM;AACxB,UAAM,OAAO,EAAE,IAAI;AAEnB,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,aAAO,EAAE,SAAS;AAAA,IACpB;AAEA,UAAM,YAAYH,MAAK,QAAQ,IAAI,GAAG,QAAQ,UAAU,YAAY;AACpE,QAAI,cAAcI,cAAa,WAAW,OAAO;AAGjD,UAAM,YAAY,oBAAoB;AACtC,QAAI,WAAW;AACb,YAAM,eAAe,mCAAmC,KAAK,UAAU,SAAS,CAAC;AACjF,oBAAc,YAAY,QAAQ,WAAW,GAAG,YAAY,SAAS;AAAA,IACvE;AAEA,WAAO,EAAE,KAAK,WAAW;AAAA,EAC3B,CAAC;AACH,OAAO;AAEL,MAAI,IAAI,KAAK,CAAC,MAAM;AAClB,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,oBAAoB,UAAU;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAGhD,IAAM,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,cAAc;AACnE,OAAO,UAAU,QAAQ,IAAI,IAAI,IAAI,8BAAuB;AAG5D,IAAM,SAAS,MAAM;AAAA,EACnB,OAAO,IAAI;AAAA,EACX;AAAA,EACA,UAAU;AAAA;AACZ,CAAC;AAGD,QAAQ,GAAG,UAAU,MAAM;AACzB,UAAQ,IAAI,yCAAkC;AAC9C,SAAO,MAAM;AACb,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,QAAQ,GAAG,WAAW,MAAM;AAC1B,UAAQ,IAAI,yCAAkC;AAC9C,SAAO,MAAM;AACb,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,IAAO,gBAAQ;","names":["Sentry","Hono","readFileSync","existsSync","join","CallToolResultSchema","_a","_b","tools","servers","tool","logger","version","Hono","mcpClientManager","Hono","Hono","mcpClientManager","Hono","Hono","resolve","Hono","Hono","mcpClientManager","resources","Hono","Hono","mcpClientManager","prompts","Hono","Model","TextEncoder","tool","tools","Hono","tool","mcpClientManager","messages","TextEncoder","resolve","response","Hono","Hono","Hono","mcp","tools","tool","resources","prompts","Hono","Hono","z","streamText","arr","value","v","__publicField","logger","__publicField","__publicField","resolve","createWebSocketStream","err","resolve","dir","arr","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","code","Receiver","Sender","v","EventEmitter","URL","WebSocket","key","protocol","WebSocketServer","server","version","version","z","zodToJsonSchema","options","fallbackConfig","z","server","z","createOpenAI","createAnthropic","createLlmModel","createAnthropic","createOpenAI","tool","tools","tool","streamText","createLlmModel","evaluation","servers","tools","tool","tools","tool","Hono","z","Hono","z","zodToJsonSchema","tools","tool","resources","prompts","Hono","Hono","randomUUID","__dirname","servers","Hono","join","__dirname","existsSync","v","readFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../../server/sentry.ts","../../shared/sentry-config.ts","../../server/index.ts","../../sdk/src/mcp-client-manager/index.ts","../../sdk/src/mcp-client-manager/tool-converters.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/routes/mcp/servers.ts","../../server/services/rpc-log-bus.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/http-tool-calls.ts","../../shared/backend-conversation.ts","../../server/routes/mcp/oauth.ts","../../server/routes/mcp/export.ts","../../server/routes/mcp/interceptor.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/vendor/long.ts","../../node_modules/convex/src/vendor/jwt-decode/index.ts","../../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/src/utils/logger.ts","../../evals-cli/src/db/tests.ts","../../evals-cli/src/utils/validators.ts","../../shared/tools.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/services/eval-agent.ts","../../server/routes/mcp/http-adapters.ts","../../server/services/mcp-http-bridge.ts","../../server/services/interceptor-store.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\";\nimport { MCPClientManager } from \"@/sdk\";\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 { rpcLogBus } from \"./services/rpc-log-bus\";\nimport { interceptorStore } from \"./services/interceptor-store\";\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 and wire RPC logging to SSE bus\nconst mcpClientManager = new MCPClientManager(\n {},\n {\n rpcLogger: ({ direction, message, serverId }) => {\n rpcLogBus.publish({\n serverId,\n direction,\n timestamp: new Date().toISOString(),\n message,\n });\n },\n },\n);\n// Middleware to inject client manager into context\napp.use(\"*\", async (c, next) => {\n c.mcpClientManager = mcpClientManager;\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 = process.env.ENVIRONMENT === \"dev\" ? \"localhost\" : \"127.0.0.1\";\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 { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { ClientOptions } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport type { SSEClientTransportOptions } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport {\n getDefaultEnvironment,\n StdioClientTransport,\n} from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { DEFAULT_REQUEST_TIMEOUT_MSEC } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { TransportSendOptions } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport {\n CallToolResultSchema,\n ElicitRequestSchema,\n ResourceListChangedNotificationSchema,\n ResourceUpdatedNotificationSchema,\n PromptListChangedNotificationSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n ElicitRequest,\n ElicitResult,\n JSONRPCMessage,\n MessageExtraInfo,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n convertMCPToolsToVercelTools,\n type ConvertedToolSet,\n type ToolSchemaOverrides,\n} from \"./tool-converters.js\";\nimport type { ToolCallOptions, ToolSet } from \"ai\";\ntype ClientCapabilityOptions = NonNullable<ClientOptions[\"capabilities\"]>;\n\ntype BaseServerConfig = {\n capabilities?: ClientCapabilityOptions;\n timeout?: number;\n version?: string;\n onError?: (error: unknown) => void;\n // Enable simple console logging of JSON-RPC traffic for this server\n logJsonRpc?: boolean;\n // Custom logger for JSON-RPC traffic; overrides logJsonRpc when provided\n rpcLogger?: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void;\n};\n\ntype StdioServerConfig = BaseServerConfig & {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n\n url?: never;\n requestInit?: never;\n eventSourceInit?: never;\n authProvider?: never;\n reconnectionOptions?: never;\n sessionId?: never;\n preferSSE?: never;\n};\n\ntype HttpServerConfig = BaseServerConfig & {\n url: URL;\n requestInit?: StreamableHTTPClientTransportOptions[\"requestInit\"];\n eventSourceInit?: SSEClientTransportOptions[\"eventSourceInit\"];\n authProvider?: StreamableHTTPClientTransportOptions[\"authProvider\"];\n reconnectionOptions?: StreamableHTTPClientTransportOptions[\"reconnectionOptions\"];\n sessionId?: StreamableHTTPClientTransportOptions[\"sessionId\"];\n preferSSE?: boolean;\n\n command?: never;\n args?: never;\n env?: never;\n};\n\nexport type MCPServerConfig = StdioServerConfig | HttpServerConfig;\nexport type MCPClientManagerConfig = Record<string, MCPServerConfig>;\n\ntype NotificationSchema = Parameters<Client[\"setNotificationHandler\"]>[0];\ntype NotificationHandler = Parameters<Client[\"setNotificationHandler\"]>[1];\n\ninterface ManagedClientState {\n config: MCPServerConfig;\n timeout: number;\n client?: Client;\n transport?: Transport;\n promise?: Promise<Client>;\n}\n\n// Pending state is tracked inside ManagedClientState.promise\n\ntype ClientRequestOptions = RequestOptions;\ntype CallToolOptions = RequestOptions;\n\ntype ListResourcesParams = Parameters<Client[\"listResources\"]>[0];\ntype ListResourceTemplatesParams = Parameters<\n Client[\"listResourceTemplates\"]\n>[0];\ntype ReadResourceParams = Parameters<Client[\"readResource\"]>[0];\ntype SubscribeResourceParams = Parameters<Client[\"subscribeResource\"]>[0];\ntype UnsubscribeResourceParams = Parameters<Client[\"unsubscribeResource\"]>[0];\ntype ListPromptsParams = Parameters<Client[\"listPrompts\"]>[0];\ntype GetPromptParams = Parameters<Client[\"getPrompt\"]>[0];\ntype ListToolsResult = Awaited<ReturnType<Client[\"listTools\"]>>;\n\nexport type MCPConnectionStatus = \"connected\" | \"connecting\" | \"disconnected\";\ntype ServerSummary = {\n id: string;\n status: MCPConnectionStatus;\n config?: MCPServerConfig;\n};\n\nexport type ExecuteToolArguments = Record<string, unknown>;\nexport type ElicitationHandler = (\n params: ElicitRequest[\"params\"],\n) => Promise<ElicitResult> | ElicitResult;\n\nexport class MCPClientManager {\n private readonly clientStates = new Map<string, ManagedClientState>();\n private readonly notificationHandlers = new Map<\n string,\n Map<NotificationSchema, Set<NotificationHandler>>\n >();\n private readonly elicitationHandlers = new Map<string, ElicitationHandler>();\n private readonly toolsMetadataCache = new Map<string, Map<string, any>>();\n private readonly defaultClientVersion: string;\n private readonly defaultClientName: string | undefined;\n private readonly defaultCapabilities: ClientCapabilityOptions;\n private readonly defaultTimeout: number;\n private defaultLogJsonRpc: boolean = false;\n\n private defaultRpcLogger?: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void;\n private elicitationCallback?: (request: {\n requestId: string;\n message: string;\n schema: unknown;\n }) => Promise<ElicitResult> | ElicitResult;\n private readonly pendingElicitations = new Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n >();\n\n constructor(\n servers: MCPClientManagerConfig = {},\n options: {\n defaultClientName?: string;\n defaultClientVersion?: string;\n defaultCapabilities?: ClientCapabilityOptions;\n defaultTimeout?: number;\n defaultLogJsonRpc?: boolean;\n rpcLogger?: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void;\n } = {},\n ) {\n this.defaultClientVersion = options.defaultClientVersion ?? \"1.0.0\";\n this.defaultClientName = options.defaultClientName ?? undefined;\n this.defaultCapabilities = { ...(options.defaultCapabilities ?? {}) };\n this.defaultTimeout =\n options.defaultTimeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC;\n this.defaultLogJsonRpc = options.defaultLogJsonRpc ?? false;\n this.defaultRpcLogger = options.rpcLogger;\n\n for (const [id, config] of Object.entries(servers)) {\n void this.connectToServer(id, config);\n }\n }\n\n listServers(): string[] {\n return Array.from(this.clientStates.keys());\n }\n\n hasServer(serverId: string): boolean {\n return this.clientStates.has(serverId);\n }\n\n getServerSummaries(): ServerSummary[] {\n return Array.from(this.clientStates.entries()).map(([serverId, state]) => ({\n id: serverId,\n status: this.getConnectionStatusByAttemptingPing(serverId),\n config: state.config,\n }));\n }\n\n getConnectionStatusByAttemptingPing(serverId: string): MCPConnectionStatus {\n const state = this.clientStates.get(serverId);\n if (state?.promise) {\n return \"connecting\";\n }\n const client = state?.client;\n if (!client) {\n return \"disconnected\";\n }\n try {\n client.ping();\n return \"connected\";\n } catch (error) {\n return \"disconnected\";\n }\n }\n\n getServerConfig(serverId: string): MCPServerConfig | undefined {\n return this.clientStates.get(serverId)?.config;\n }\n\n async connectToServer(\n serverId: string,\n config: MCPServerConfig,\n ): Promise<Client> {\n const timeout = this.getTimeout(config);\n const existingState = this.clientStates.get(serverId);\n if (existingState?.client) {\n throw new Error(`MCP server \"${serverId}\" is already connected.`);\n }\n\n const state: ManagedClientState = existingState ?? {\n config,\n timeout,\n };\n // Update config/timeout on every call\n state.config = config;\n state.timeout = timeout;\n // If connection is in-flight, reuse the promise\n if (state.promise) {\n this.clientStates.set(serverId, state);\n return state.promise;\n }\n\n const connectionPromise = (async () => {\n const client = new Client(\n {\n name: this.defaultClientName ? `${this.defaultClientName}` : serverId,\n version: config.version ?? this.defaultClientVersion,\n },\n {\n capabilities: this.buildCapabilities(config),\n },\n );\n\n this.applyNotificationHandlers(serverId, client);\n this.applyElicitationHandler(serverId, client);\n\n if (config.onError) {\n client.onerror = (error) => {\n config.onError?.(error);\n };\n }\n\n client.onclose = () => {\n this.resetState(serverId);\n };\n\n let transport: Transport;\n if (this.isStdioConfig(config)) {\n transport = await this.connectViaStdio(\n serverId,\n client,\n config,\n timeout,\n );\n } else {\n transport = await this.connectViaHttp(\n serverId,\n client,\n config,\n timeout,\n );\n }\n\n state.client = client;\n state.transport = transport;\n // clear pending\n state.promise = undefined;\n this.clientStates.set(serverId, state);\n\n return client;\n })().catch((error) => {\n this.resetState(serverId);\n throw error;\n });\n\n state.promise = connectionPromise;\n this.clientStates.set(serverId, state);\n return connectionPromise;\n }\n\n async disconnectServer(serverId: string): Promise<void> {\n const connectionStatus = this.getConnectionStatusByAttemptingPing(serverId);\n if (connectionStatus !== \"connected\") {\n return;\n }\n const client = this.getClientById(serverId);\n try {\n await client.close();\n } finally {\n if (client.transport) {\n await this.safeCloseTransport(client.transport);\n }\n this.resetState(serverId);\n }\n }\n\n removeServer(serverId: string): void {\n this.resetState(serverId);\n this.notificationHandlers.delete(serverId);\n this.elicitationHandlers.delete(serverId);\n }\n\n async disconnectAllServers(): Promise<void> {\n const serverIds = this.listServers();\n await Promise.all(\n serverIds.map((serverId) => this.disconnectServer(serverId)),\n );\n\n for (const serverId of serverIds) {\n this.resetState(serverId);\n this.notificationHandlers.delete(serverId);\n this.elicitationHandlers.delete(serverId);\n }\n }\n\n async listTools(\n serverId: string,\n params?: Parameters<Client[\"listTools\"]>[0],\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n try {\n const result = await client.listTools(\n params,\n this.withTimeout(serverId, options),\n );\n\n const metadataMap = new Map<string, any>();\n for (const tool of result.tools) {\n if (tool._meta) {\n metadataMap.set(tool.name, tool._meta);\n }\n }\n this.toolsMetadataCache.set(serverId, metadataMap);\n\n return result;\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"tools/list\")) {\n this.toolsMetadataCache.set(serverId, new Map());\n return { tools: [] } as Awaited<ReturnType<Client[\"listTools\"]>>;\n }\n throw error;\n }\n }\n\n async getTools(serverIds?: string[]): Promise<ListToolsResult> {\n const targetServerIds =\n serverIds && serverIds.length > 0 ? serverIds : this.listServers();\n\n const toolLists = await Promise.all(\n targetServerIds.map(async (serverId) => {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n const result = await client.listTools(\n undefined,\n this.withTimeout(serverId),\n );\n\n const metadataMap = new Map<string, any>();\n for (const tool of result.tools) {\n if (tool._meta) {\n metadataMap.set(tool.name, tool._meta);\n }\n }\n this.toolsMetadataCache.set(serverId, metadataMap);\n\n return result.tools;\n }),\n );\n return { tools: toolLists.flat() } as ListToolsResult;\n }\n\n getAllToolsMetadata(serverId: string): Record<string, Record<string, any>> {\n const metadataMap = this.toolsMetadataCache.get(serverId);\n return metadataMap ? Object.fromEntries(metadataMap) : {};\n }\n\n pingServer(serverId: string, options?: RequestOptions) {\n const client = this.getClientById(serverId);\n try {\n client.ping(options);\n } catch (error) {\n throw new Error(\n `Failed to ping MCP server \"${serverId}\": ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n async getToolsForAiSdk(\n serverIds?: string[] | string,\n options: { schemas?: ToolSchemaOverrides | \"automatic\" } = {},\n ): Promise<ToolSet> {\n const ids = Array.isArray(serverIds)\n ? serverIds\n : serverIds\n ? [serverIds]\n : this.listServers();\n\n const loadForServer = async (id: string): Promise<ToolSet> => {\n await this.ensureConnected(id);\n const listToolsResult = await this.listTools(id);\n return convertMCPToolsToVercelTools(listToolsResult, {\n schemas: options.schemas,\n callTool: async ({ name, args, options: callOptions }) => {\n const requestOptions = callOptions?.abortSignal\n ? { signal: callOptions.abortSignal }\n : undefined;\n const result = await this.executeTool(\n id,\n name,\n (args ?? {}) as ExecuteToolArguments,\n requestOptions,\n );\n return CallToolResultSchema.parse(result);\n },\n });\n };\n\n const perServerTools = await Promise.all(\n ids.map(async (id) => {\n try {\n const tools = await loadForServer(id);\n // Attach server id metadata to each tool object for downstream extraction\n for (const [name, tool] of Object.entries(tools)) {\n (tool as any)._serverId = id;\n }\n return tools;\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"tools/list\")) {\n return {} as ToolSet;\n }\n throw error;\n }\n }),\n );\n\n // Flatten into a single ToolSet (last-in wins for name collisions)\n const flattened: ToolSet = {};\n for (const toolset of perServerTools) {\n for (const [name, tool] of Object.entries(toolset)) {\n flattened[name] = tool;\n }\n }\n\n return flattened;\n }\n\n async executeTool(\n serverId: string,\n toolName: string,\n args: ExecuteToolArguments = {},\n options?: CallToolOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.callTool(\n {\n name: toolName,\n arguments: args,\n },\n CallToolResultSchema,\n this.withTimeout(serverId, options),\n );\n }\n\n async listResources(\n serverId: string,\n params?: ListResourcesParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n try {\n return await client.listResources(\n params,\n this.withTimeout(serverId, options),\n );\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"resources/list\")) {\n return {\n resources: [],\n } as Awaited<ReturnType<Client[\"listResources\"]>>;\n }\n throw error;\n }\n }\n\n async readResource(\n serverId: string,\n params: ReadResourceParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.readResource(params, this.withTimeout(serverId, options));\n }\n\n async subscribeResource(\n serverId: string,\n params: SubscribeResourceParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.subscribeResource(\n params,\n this.withTimeout(serverId, options),\n );\n }\n\n async unsubscribeResource(\n serverId: string,\n params: UnsubscribeResourceParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.unsubscribeResource(\n params,\n this.withTimeout(serverId, options),\n );\n }\n\n async listResourceTemplates(\n serverId: string,\n params?: ListResourceTemplatesParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.listResourceTemplates(\n params,\n this.withTimeout(serverId, options),\n );\n }\n\n async listPrompts(\n serverId: string,\n params?: ListPromptsParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n try {\n return await client.listPrompts(\n params,\n this.withTimeout(serverId, options),\n );\n } catch (error) {\n if (this.isMethodUnavailableError(error, \"prompts/list\")) {\n return {\n prompts: [],\n } as Awaited<ReturnType<Client[\"listPrompts\"]>>;\n }\n throw error;\n }\n }\n\n async getPrompt(\n serverId: string,\n params: GetPromptParams,\n options?: ClientRequestOptions,\n ) {\n await this.ensureConnected(serverId);\n const client = this.getClientById(serverId);\n return client.getPrompt(params, this.withTimeout(serverId, options));\n }\n\n getSessionIdByServer(serverId: string): string | undefined {\n const state = this.clientStates.get(serverId);\n if (!state?.transport) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.transport instanceof StreamableHTTPClientTransport) {\n return state.transport.sessionId;\n }\n throw new Error(\n `Server \"${serverId}\" must be Streamable HTTP to get the session ID.`,\n );\n }\n\n addNotificationHandler(\n serverId: string,\n schema: NotificationSchema,\n handler: NotificationHandler,\n ): void {\n const serverHandlers = this.notificationHandlers.get(serverId) ?? new Map();\n const handlersForSchema =\n serverHandlers.get(schema) ?? new Set<NotificationHandler>();\n handlersForSchema.add(handler);\n serverHandlers.set(schema, handlersForSchema);\n this.notificationHandlers.set(serverId, serverHandlers);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n client.setNotificationHandler(\n schema,\n this.createNotificationDispatcher(serverId, schema),\n );\n }\n }\n\n onResourceListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceListChangedNotificationSchema,\n handler,\n );\n }\n\n onResourceUpdated(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n ResourceUpdatedNotificationSchema,\n handler,\n );\n }\n\n onPromptListChanged(serverId: string, handler: NotificationHandler): void {\n this.addNotificationHandler(\n serverId,\n PromptListChangedNotificationSchema,\n handler,\n );\n }\n\n getClient(serverId: string): Client | undefined {\n return this.clientStates.get(serverId)?.client;\n }\n\n setElicitationHandler(serverId: string, handler: ElicitationHandler): void {\n if (!this.clientStates.has(serverId)) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n\n this.elicitationHandlers.set(serverId, handler);\n\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n this.applyElicitationHandler(serverId, client);\n }\n }\n\n clearElicitationHandler(serverId: string): void {\n this.elicitationHandlers.delete(serverId);\n const client = this.clientStates.get(serverId)?.client;\n if (client) {\n client.removeRequestHandler(\"elicitation/create\");\n }\n }\n\n // Global elicitation callback API (no serverId required)\n setElicitationCallback(\n callback: (request: {\n requestId: string;\n message: string;\n schema: unknown;\n }) => Promise<ElicitResult> | ElicitResult,\n ): void {\n this.elicitationCallback = callback;\n // Apply to all connected clients that don't have a server-specific handler\n for (const [serverId, state] of this.clientStates.entries()) {\n const client = state.client;\n if (!client) continue;\n if (this.elicitationHandlers.has(serverId)) {\n // Respect server-specific handler\n this.applyElicitationHandler(serverId, client);\n } else {\n this.applyElicitationHandler(serverId, client);\n }\n }\n }\n\n clearElicitationCallback(): void {\n this.elicitationCallback = undefined;\n // Reconfigure clients: keep server-specific handlers, otherwise remove\n for (const [serverId, state] of this.clientStates.entries()) {\n const client = state.client;\n if (!client) continue;\n if (this.elicitationHandlers.has(serverId)) {\n this.applyElicitationHandler(serverId, client);\n } else {\n client.removeRequestHandler(\"elicitation/create\");\n }\n }\n }\n\n // Expose the pending elicitation map so callers can add resolvers\n getPendingElicitations(): Map<\n string,\n {\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n // Helper to resolve a pending elicitation from outside\n respondToElicitation(requestId: string, response: ElicitResult): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) return false;\n try {\n pending.resolve(response);\n return true;\n } finally {\n this.pendingElicitations.delete(requestId);\n }\n }\n\n private async connectViaStdio(\n serverId: string,\n client: Client,\n config: StdioServerConfig,\n timeout: number,\n ): Promise<Transport> {\n const underlying = new StdioClientTransport({\n command: config.command,\n args: config.args,\n env: { ...getDefaultEnvironment(), ...(config.env ?? {}) },\n });\n const wrapped = this.wrapTransportForLogging(serverId, config, underlying);\n await client.connect(wrapped, { timeout });\n return underlying;\n }\n\n private async connectViaHttp(\n serverId: string,\n client: Client,\n config: HttpServerConfig,\n timeout: number,\n ): Promise<Transport> {\n const preferSSE = config.preferSSE ?? config.url.pathname.endsWith(\"/sse\");\n let streamableError: unknown;\n\n if (!preferSSE) {\n const streamableTransport = new StreamableHTTPClientTransport(\n config.url,\n {\n requestInit: config.requestInit,\n reconnectionOptions: config.reconnectionOptions,\n authProvider: config.authProvider,\n sessionId: config.sessionId,\n },\n );\n\n try {\n const wrapped = this.wrapTransportForLogging(\n serverId,\n config,\n streamableTransport,\n );\n await client.connect(wrapped, {\n timeout: Math.min(timeout, 3000),\n });\n return streamableTransport;\n } catch (error) {\n streamableError = error;\n await this.safeCloseTransport(streamableTransport);\n }\n }\n\n const sseTransport = new SSEClientTransport(config.url, {\n requestInit: config.requestInit,\n eventSourceInit: config.eventSourceInit,\n authProvider: config.authProvider,\n });\n\n try {\n const wrapped = this.wrapTransportForLogging(\n serverId,\n config,\n sseTransport,\n );\n await client.connect(wrapped, { timeout });\n return sseTransport;\n } catch (error) {\n await this.safeCloseTransport(sseTransport);\n const streamableMessage = streamableError\n ? ` Streamable HTTP error: ${this.formatError(streamableError)}.`\n : \"\";\n throw new Error(\n `Failed to connect to MCP server \"${serverId}\" using HTTP transports.${streamableMessage} SSE error: ${this.formatError(error)}.`,\n );\n }\n }\n\n private async safeCloseTransport(transport: Transport): Promise<void> {\n try {\n await transport.close();\n } catch {\n // Ignore close errors during cleanup.\n }\n }\n\n private applyNotificationHandlers(serverId: string, client: Client): void {\n const serverHandlers = this.notificationHandlers.get(serverId);\n if (!serverHandlers) {\n return;\n }\n\n for (const [schema] of serverHandlers) {\n client.setNotificationHandler(\n schema,\n this.createNotificationDispatcher(serverId, schema),\n );\n }\n }\n\n private createNotificationDispatcher(\n serverId: string,\n schema: NotificationSchema,\n ): NotificationHandler {\n return (notification) => {\n const serverHandlers = this.notificationHandlers.get(serverId);\n const handlersForSchema = serverHandlers?.get(schema);\n if (!handlersForSchema || handlersForSchema.size === 0) {\n return;\n }\n for (const handler of handlersForSchema) {\n try {\n handler(notification);\n } catch {\n // Swallow individual handler errors to avoid breaking other listeners.\n }\n }\n };\n }\n\n private applyElicitationHandler(serverId: string, client: Client): void {\n const serverSpecific = this.elicitationHandlers.get(serverId);\n if (serverSpecific) {\n client.setRequestHandler(ElicitRequestSchema, async (request) =>\n serverSpecific(request.params),\n );\n return;\n }\n\n if (this.elicitationCallback) {\n client.setRequestHandler(ElicitRequestSchema, async (request) => {\n const reqId = `elicit_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2, 9)}`;\n return await this.elicitationCallback!({\n requestId: reqId,\n message: (request.params as any)?.message,\n schema:\n (request.params as any)?.requestedSchema ??\n (request.params as any)?.schema,\n });\n });\n return;\n }\n }\n\n private async ensureConnected(serverId: string): Promise<void> {\n const state = this.clientStates.get(serverId);\n if (state?.client) {\n return;\n }\n\n if (!state) {\n throw new Error(`Unknown MCP server \"${serverId}\".`);\n }\n if (state.promise) {\n await state.promise;\n return;\n }\n await this.connectToServer(serverId, state.config);\n }\n\n private resetState(serverId: string): void {\n this.clientStates.delete(serverId);\n this.toolsMetadataCache.delete(serverId);\n }\n\n private resolveConnectionStatus(\n state: ManagedClientState | undefined,\n ): MCPConnectionStatus {\n if (!state) {\n return \"disconnected\";\n }\n if (state.client) {\n return \"connected\";\n }\n if (state.promise) {\n return \"connecting\";\n }\n return \"disconnected\";\n }\n\n private withTimeout(\n serverId: string,\n options?: RequestOptions,\n ): RequestOptions {\n const state = this.clientStates.get(serverId);\n const timeout =\n state?.timeout ??\n (state ? this.getTimeout(state.config) : this.defaultTimeout);\n\n if (!options) {\n return { timeout };\n }\n\n if (options.timeout === undefined) {\n return { ...options, timeout };\n }\n\n return options;\n }\n\n private buildCapabilities(config: MCPServerConfig): ClientCapabilityOptions {\n const capabilities: ClientCapabilityOptions = {\n ...this.defaultCapabilities,\n ...(config.capabilities ?? {}),\n };\n\n if (!capabilities.elicitation) {\n capabilities.elicitation = {};\n }\n\n return capabilities;\n }\n\n private formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n }\n\n // Returns a transport that logs JSON-RPC traffic if enabled for this server\n private wrapTransportForLogging(\n serverId: string,\n config: MCPServerConfig,\n transport: Transport,\n ): Transport {\n const logger = this.resolveRpcLogger(serverId, config);\n if (!logger) return transport;\n const log: (event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void = logger;\n\n // Wrapper that proxies to the underlying transport while emitting logs\n const self = this;\n class LoggingTransport implements Transport {\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage, extra?: MessageExtraInfo) => void;\n constructor(private readonly inner: Transport) {\n this.inner.onmessage = (\n message: JSONRPCMessage,\n extra?: MessageExtraInfo,\n ) => {\n try {\n log({ direction: \"receive\", message, serverId });\n } catch {\n // ignore logger errors\n }\n this.onmessage?.(message, extra);\n };\n this.inner.onclose = () => {\n this.onclose?.();\n };\n this.inner.onerror = (error: Error) => {\n this.onerror?.(error);\n };\n }\n async start(): Promise<void> {\n if (typeof (this.inner as any).start === \"function\") {\n await (this.inner as any).start();\n }\n }\n async send(\n message: JSONRPCMessage,\n options?: TransportSendOptions,\n ): Promise<void> {\n try {\n log({ direction: \"send\", message, serverId });\n } catch {\n // ignore logger errors\n }\n await this.inner.send(message as any, options as any);\n }\n async close(): Promise<void> {\n await this.inner.close();\n }\n get sessionId(): string | undefined {\n return (this.inner as any).sessionId;\n }\n setProtocolVersion?(version: string): void {\n if (typeof this.inner.setProtocolVersion === \"function\") {\n this.inner.setProtocolVersion(version);\n }\n }\n }\n\n return new LoggingTransport(transport);\n }\n\n private resolveRpcLogger(\n serverId: string,\n config: MCPServerConfig,\n ):\n | ((event: {\n direction: \"send\" | \"receive\";\n message: unknown;\n serverId: string;\n }) => void)\n | undefined {\n if (config.rpcLogger) return config.rpcLogger;\n if (config.logJsonRpc || this.defaultLogJsonRpc) {\n return ({ direction, message, serverId: id }) => {\n let printable: string;\n try {\n printable =\n typeof message === \"string\" ? message : JSON.stringify(message);\n } catch {\n printable = String(message);\n }\n // eslint-disable-next-line no-console\n console.debug(`[MCP:${id}] ${direction.toUpperCase()} ${printable}`);\n };\n }\n if (this.defaultRpcLogger) return this.defaultRpcLogger;\n return undefined;\n }\n\n private isMethodUnavailableError(error: unknown, method: string): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n const methodTokens = new Set<string>();\n const pushToken = (token: string) => {\n if (token) {\n methodTokens.add(token.toLowerCase());\n }\n };\n\n pushToken(method);\n for (const part of method.split(/[\\/:._-]/)) {\n pushToken(part);\n }\n const indicators = [\n \"method not found\",\n \"not implemented\",\n \"unsupported\",\n \"does not support\",\n \"unimplemented\",\n ];\n const indicatorMatch = indicators.some((indicator) =>\n message.includes(indicator),\n );\n if (!indicatorMatch) {\n return false;\n }\n\n if (Array.from(methodTokens).some((token) => message.includes(token))) {\n return true;\n }\n\n return true;\n }\n\n private getTimeout(config: MCPServerConfig): number {\n return config.timeout ?? this.defaultTimeout;\n }\n\n private isStdioConfig(config: MCPServerConfig): config is StdioServerConfig {\n return \"command\" in config;\n }\n\n private getClientById(serverId: string): Client {\n const state = this.clientStates.get(serverId);\n if (!state?.client) {\n throw new Error(`MCP server \"${serverId}\" is not connected.`);\n }\n return state.client;\n }\n}\n\nexport type MCPPromptListResult = Awaited<\n ReturnType<MCPClientManager[\"listPrompts\"]>\n>;\nexport type MCPPrompt = MCPPromptListResult[\"prompts\"][number];\nexport type MCPGetPromptResult = Awaited<\n ReturnType<MCPClientManager[\"getPrompt\"]>\n>;\nexport type MCPResourceListResult = Awaited<\n ReturnType<MCPClientManager[\"listResources\"]>\n>;\nexport type MCPResource = MCPResourceListResult[\"resources\"][number];\nexport type MCPReadResourceResult = Awaited<\n ReturnType<MCPClientManager[\"readResource\"]>\n>;\nexport type MCPServerSummary = ServerSummary;\nexport type MCPConvertedToolSet<\n SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> = ConvertedToolSet<SCHEMAS>;\nexport type MCPToolSchemaOverrides = ToolSchemaOverrides;\n","import type { JSONSchema7, JSONSchema7Definition } from \"json-schema\";\nimport {\n CallToolResult,\n CallToolResultSchema,\n ListToolsResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport {\n dynamicTool,\n jsonSchema,\n tool as defineTool,\n type Tool,\n type ToolCallOptions,\n ToolSet,\n} from \"ai\";\nimport type { FlexibleSchema } from \"@ai-sdk/provider-utils\";\n\nconst ensureJsonSchemaObject = (schema: unknown): JSONSchema7 => {\n if (schema && typeof schema === \"object\") {\n const record = schema as Record<string, unknown>;\n const base: JSONSchema7 = record.jsonSchema\n ? ensureJsonSchemaObject(record.jsonSchema)\n : (record as JSONSchema7);\n\n // Many MCP tools omit the top-level type; Anthropic requires an object schema.\n if (!(\"type\" in base) || base.type === undefined) {\n base.type = \"object\";\n }\n if (base.type === \"object\") {\n base.properties = (base.properties ?? {}) as Record<\n string,\n JSONSchema7Definition\n >;\n if (base.additionalProperties === undefined) {\n base.additionalProperties = false;\n }\n }\n\n return base;\n }\n\n return {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n } satisfies JSONSchema7;\n};\n\ntype CallToolExecutor = (params: {\n name: string;\n args: unknown;\n options: ToolCallOptions;\n}) => Promise<CallToolResult>;\n\nexport type ToolSchemaOverrides = Record<\n string,\n { inputSchema: FlexibleSchema<unknown> }\n>;\n\nexport type ConvertedToolSet<\n SCHEMAS extends ToolSchemaOverrides | \"automatic\",\n> = SCHEMAS extends ToolSchemaOverrides\n ? { [K in keyof SCHEMAS]: Tool }\n : Record<string, Tool>;\n\ntype ConvertOptions<TOOL_SCHEMAS extends ToolSchemaOverrides | \"automatic\"> = {\n schemas?: TOOL_SCHEMAS;\n callTool: CallToolExecutor;\n};\n\nexport async function convertMCPToolsToVercelTools(\n listToolsResult: ListToolsResult,\n {\n schemas = \"automatic\",\n callTool,\n }: ConvertOptions<ToolSchemaOverrides | \"automatic\">,\n): Promise<ToolSet> {\n const tools: ToolSet = {};\n\n for (const toolDescription of listToolsResult.tools) {\n const { name, description, inputSchema } = toolDescription;\n\n const execute = async (args: unknown, options: ToolCallOptions) => {\n options?.abortSignal?.throwIfAborted?.();\n const result = await callTool({ name, args, options });\n return CallToolResultSchema.parse(result);\n };\n\n let vercelTool: Tool;\n if (schemas === \"automatic\") {\n const normalizedInputSchema = ensureJsonSchemaObject(inputSchema);\n vercelTool = dynamicTool({\n description,\n inputSchema: jsonSchema({\n type: \"object\",\n properties: normalizedInputSchema.properties ?? {},\n additionalProperties:\n (normalizedInputSchema as any).additionalProperties ?? false,\n }),\n execute,\n });\n } else {\n const overrides = schemas;\n if (!(name in overrides)) {\n // If overrides are provided, only include tools explicitly listed\n continue;\n }\n vercelTool = defineTool({\n description,\n inputSchema: overrides[name].inputSchema,\n execute,\n });\n }\n\n tools[name] = vercelTool;\n }\n\n return tools;\n}\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 if (serverConfig.url) {\n if (typeof serverConfig.url === \"string\") {\n serverConfig.url = new URL(serverConfig.url);\n } else if (\n typeof serverConfig.url === \"object\" &&\n serverConfig.url.href\n ) {\n serverConfig.url = new URL(serverConfig.url.href);\n }\n }\n\n const mcpClientManager = c.mcpClientManager;\n try {\n await mcpClientManager.connectToServer(serverId, serverConfig);\n return c.json({\n success: true,\n status: \"connected\",\n });\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `Connection failed for server ${serverId}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\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 type { MCPServerConfig } from \"@/sdk\";\nimport \"../../types/hono\"; // Type extensions\nimport { rpcLogBus, type RpcLogEvent } from \"../../services/rpc-log-bus\";\n\nconst servers = new Hono();\n\n// List all connected servers with their status\nservers.get(\"/\", async (c) => {\n try {\n const mcpClientManager = c.mcpClientManager;\n const serverList = mcpClientManager\n .getServerSummaries()\n .map(({ id, status, config }) => ({\n id,\n name: id,\n status,\n config,\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\nservers.get(\"/status/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpClientManager = c.mcpClientManager;\n const status =\n mcpClientManager.getConnectionStatusByAttemptingPing(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 mcpClientManager = c.mcpClientManager;\n\n try {\n const client = mcpClientManager.getClient(serverId);\n if (client) {\n await mcpClientManager.disconnectServer(serverId);\n }\n } catch (error) {\n // Ignore disconnect errors for already disconnected servers\n console.debug(\n `Failed to disconnect MCP server ${serverId} during removal`,\n error,\n );\n }\n\n mcpClientManager.removeServer(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()) as {\n serverId?: string;\n serverConfig?: MCPServerConfig;\n };\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 mcpClientManager = c.mcpClientManager;\n\n const normalizedConfig: MCPServerConfig = { ...serverConfig };\n if (\n \"url\" in normalizedConfig &&\n normalizedConfig.url !== undefined &&\n normalizedConfig.url !== null\n ) {\n const urlValue = normalizedConfig.url as unknown;\n if (typeof urlValue === \"string\") {\n normalizedConfig.url = new URL(urlValue);\n } else if (urlValue instanceof URL) {\n // already normalized\n } else if (\n typeof urlValue === \"object\" &&\n urlValue !== null &&\n \"href\" in (urlValue as Record<string, unknown>) &&\n typeof (urlValue as { href?: unknown }).href === \"string\"\n ) {\n normalizedConfig.url = new URL((urlValue as { href: string }).href);\n }\n }\n\n await mcpClientManager.disconnectServer(serverId);\n await mcpClientManager.connectToServer(serverId, normalizedConfig);\n\n const status =\n mcpClientManager.getConnectionStatusByAttemptingPing(serverId);\n const message =\n status === \"connected\"\n ? `Reconnected to server: ${serverId}`\n : `Server ${serverId} reconnected with status '${status}'`;\n const success = status === \"connected\";\n\n return c.json({\n success,\n serverId,\n status,\n message,\n ...(success ? {} : { error: message }),\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\n// Stream JSON-RPC messages over SSE for all servers.\nservers.get(\"/rpc/stream\", async (c) => {\n const serverIds = c.mcpClientManager.listServers();\n const url = new URL(c.req.url);\n const replay = parseInt(url.searchParams.get(\"replay\") || \"0\", 10);\n\n const encoder = new TextEncoder();\n const stream = new ReadableStream({\n start(controller) {\n const send = (data: unknown) => {\n try {\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {}\n };\n\n // Replay recent messages for all known servers\n try {\n const recent = rpcLogBus.getBuffer(\n serverIds,\n isNaN(replay) ? 0 : replay,\n );\n for (const evt of recent) {\n send({ type: \"rpc\", ...evt });\n }\n } catch {}\n\n // Subscribe to live events for all known servers\n const unsubscribe = rpcLogBus.subscribe(serverIds, (evt: RpcLogEvent) => {\n send({ type: \"rpc\", ...evt });\n });\n\n // Keepalive comments\n const keepalive = setInterval(() => {\n try {\n controller.enqueue(encoder.encode(`: keepalive ${Date.now()}\\n\\n`));\n } catch {}\n }, 15000);\n\n // Cleanup on client disconnect\n c.req.raw.signal.addEventListener(\"abort\", () => {\n try {\n clearInterval(keepalive);\n unsubscribe();\n } catch {}\n try {\n controller.close();\n } catch {}\n });\n },\n });\n\n return new Response(stream, {\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-Expose-Headers\": \"*\",\n },\n });\n});\n\nexport default servers;\n","import { EventEmitter } from \"events\";\n\nexport type RpcLogEvent = {\n serverId: string;\n direction: \"send\" | \"receive\";\n timestamp: string; // ISO\n message: unknown;\n};\n\nclass RpcLogBus {\n private readonly emitter = new EventEmitter();\n private readonly bufferByServer = new Map<string, RpcLogEvent[]>();\n\n publish(event: RpcLogEvent): void {\n const buffer = this.bufferByServer.get(event.serverId) ?? [];\n buffer.push(event);\n this.bufferByServer.set(event.serverId, buffer);\n this.emitter.emit(\"event\", event);\n }\n\n subscribe(\n serverIds: string[],\n listener: (event: RpcLogEvent) => void,\n ): () => void {\n const filter = new Set(serverIds);\n const handler = (event: RpcLogEvent) => {\n if (filter.size === 0 || filter.has(event.serverId)) listener(event);\n };\n this.emitter.on(\"event\", handler);\n return () => this.emitter.off(\"event\", handler);\n }\n\n getBuffer(serverIds: string[], limit: number): RpcLogEvent[] {\n const filter = new Set(serverIds);\n const all: RpcLogEvent[] = [];\n for (const [serverId, buf] of this.bufferByServer.entries()) {\n if (filter.size > 0 && !filter.has(serverId)) continue;\n all.push(...buf);\n }\n // If limit is 0, return empty array (no replay)\n if (limit === 0) return [];\n // If limit is not finite or negative, return all\n if (!Number.isFinite(limit) || limit < 0) return all;\n return all.slice(Math.max(0, all.length - limit));\n }\n}\n\nexport const rpcLogBus = new RpcLogBus();\n","import { Hono } from \"hono\";\nimport type {\n ElicitRequest,\n ElicitResult,\n ListToolsResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport \"../../types/hono\"; // Type extensions\n\nconst tools = new Hono();\n\ntype ElicitationPayload = {\n executionId: string;\n requestId: string;\n request: ElicitRequest[\"params\"];\n issuedAt: string;\n serverId: string;\n};\n\ntype ExecutionContext = {\n id: string;\n serverId: string;\n toolName: string;\n execPromise: Promise<ListToolsResult>;\n queue: ElicitationPayload[];\n waiter?: (payload: ElicitationPayload) => void;\n};\n\nlet activeExecution: ExecutionContext | null = null;\n\nconst pendingResponses = new Map<\n string,\n {\n serverId: string;\n resolve: (value: ElicitResult) => void;\n reject: (error: unknown) => void;\n }\n>();\n\nfunction makeExecutionId() {\n return `exec_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction makeRequestId() {\n return `req_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction takeNextRequest(\n context: ExecutionContext,\n): Promise<ElicitationPayload> {\n if (context.queue.length > 0) {\n return Promise.resolve(context.queue.shift()!);\n }\n return new Promise((resolve) => {\n context.waiter = resolve;\n });\n}\n\nfunction enqueueRequest(\n context: ExecutionContext,\n payload: ElicitationPayload,\n) {\n if (context.waiter) {\n const resolve = context.waiter;\n context.waiter = undefined;\n resolve(payload);\n return;\n }\n context.queue.push(payload);\n}\n\nfunction resetExecution(context: ExecutionContext | null, clear: () => void) {\n if (!context) return;\n clear();\n if (activeExecution === context) {\n activeExecution = null;\n }\n if (context.queue.length > 0) {\n context.queue.length = 0;\n }\n context.waiter = undefined;\n for (const [requestId, pending] of Array.from(pendingResponses.entries())) {\n if (pending.serverId !== context.serverId) continue;\n pendingResponses.delete(requestId);\n pending.reject(new Error(\"Execution finished\"));\n }\n}\n\nfunction serializeMcpError(error: unknown) {\n const anyErr = error as any;\n const base = {\n name: anyErr?.name ?? \"Error\",\n message: anyErr?.message ?? String(error),\n code: anyErr?.code ?? anyErr?.error?.code,\n data: anyErr?.data ?? anyErr?.error?.data,\n } as Record<string, unknown>;\n const cause = anyErr?.cause;\n if (cause && typeof cause === \"object\") {\n base.cause = {\n name: (cause as any)?.name,\n message: (cause as any)?.message,\n code: (cause as any)?.code,\n data: (cause as any)?.data,\n };\n }\n if (process.env.NODE_ENV === \"development\" && anyErr?.stack) {\n base.stack = anyErr.stack;\n }\n return base;\n}\n\nfunction jsonError(c: any, error: unknown, fallbackStatus = 500) {\n const details = serializeMcpError(error);\n const status =\n typeof (error as any)?.status === \"number\"\n ? (error as any).status\n : fallbackStatus;\n return c.json(\n { error: details.message as string, mcpError: details },\n status,\n );\n}\n\ntools.post(\"/list\", async (c) => {\n try {\n const { serverId } = (await c.req.json()) as { serverId?: string };\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n const result = (await c.mcpClientManager.listTools(\n serverId,\n )) as ListToolsResult;\n\n // Get cached metadata map for O(1) frontend lookups\n const toolsMetadata = c.mcpClientManager.getAllToolsMetadata(serverId);\n\n return c.json({ ...result, toolsMetadata });\n } catch (error) {\n return jsonError(c, error, 500);\n }\n});\n\ntools.post(\"/execute\", async (c) => {\n if (activeExecution) {\n return c.json({ error: \"Another execution is already in progress\" }, 409);\n }\n\n const {\n serverId,\n toolName,\n parameters = {},\n } = (await c.req.json()) as {\n serverId?: string;\n toolName?: string;\n parameters?: Record<string, unknown>;\n };\n\n if (!serverId) return c.json({ error: \"serverId is required\" }, 400);\n if (!toolName) return c.json({ error: \"toolName is required\" }, 400);\n\n const manager = c.mcpClientManager;\n const client = manager.getClient(serverId);\n if (!client) {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n\n const executionId = makeExecutionId();\n\n const context: ExecutionContext = {\n id: executionId,\n serverId,\n toolName,\n execPromise: manager.executeTool(\n serverId,\n toolName,\n parameters,\n ) as Promise<ListToolsResult>,\n queue: [],\n };\n\n activeExecution = context;\n\n manager.setElicitationHandler(serverId, async (params) => {\n const payload: ElicitationPayload = {\n executionId,\n requestId: makeRequestId(),\n request: params,\n issuedAt: new Date().toISOString(),\n serverId,\n };\n\n enqueueRequest(context, payload);\n\n return new Promise<ElicitResult>((resolve, reject) => {\n pendingResponses.set(payload.requestId, {\n serverId,\n resolve: (value) => {\n pendingResponses.delete(payload.requestId);\n resolve(value);\n },\n reject: (err) => {\n pendingResponses.delete(payload.requestId);\n reject(err);\n },\n });\n });\n });\n\n try {\n const next = await Promise.race([\n context.execPromise.then((result) => ({ kind: \"done\" as const, result })),\n takeNextRequest(context).then((payload) => ({\n kind: \"elicitation\" as const,\n payload,\n })),\n ]);\n\n if (next.kind === \"done\") {\n resetExecution(context, () => manager.clearElicitationHandler(serverId));\n return c.json({ status: \"completed\", result: next.result });\n }\n\n return c.json(\n {\n status: \"elicitation_required\",\n executionId,\n requestId: next.payload.requestId,\n request: next.payload.request,\n timestamp: next.payload.issuedAt,\n },\n 202,\n );\n } catch (error) {\n resetExecution(context, () => manager.clearElicitationHandler(serverId));\n return jsonError(c, error, 500);\n }\n});\n\ntools.post(\"/respond\", async (c) => {\n const context = activeExecution;\n if (!context) {\n return c.json({ error: \"No active execution\" }, 404);\n }\n\n const { requestId, response } = (await c.req.json()) as {\n requestId?: string;\n response?: ElicitResult;\n };\n\n if (!requestId) {\n return c.json({ error: \"requestId is required\" }, 400);\n }\n\n const pending = pendingResponses.get(requestId);\n if (!pending) {\n return c.json({ error: \"No pending elicitation for requestId\" }, 404);\n }\n\n pending.resolve(response as ElicitResult);\n\n try {\n const next = await Promise.race([\n context.execPromise.then((result) => ({ kind: \"done\" as const, result })),\n takeNextRequest(context).then((payload) => ({\n kind: \"elicitation\" as const,\n payload,\n })),\n ]);\n\n if (next.kind === \"done\") {\n resetExecution(context, () =>\n c.mcpClientManager.clearElicitationHandler(context.serverId),\n );\n return c.json({ status: \"completed\", result: next.result });\n }\n\n return c.json(\n {\n status: \"elicitation_required\",\n executionId: context.id,\n requestId: next.payload.requestId,\n request: next.payload.request,\n timestamp: next.payload.issuedAt,\n },\n 202,\n );\n } catch (error) {\n resetExecution(context, () =>\n c.mcpClientManager.clearElicitationHandler(context.serverId),\n );\n return jsonError(c, error, 500);\n }\n});\n\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// In-memory storage for widget data (TTL: 1 hour)\ninterface WidgetData {\n serverId: string;\n uri: string;\n toolInput: Record<string, any>;\n toolOutput: any;\n toolResponseMetadata?: Record<string, any> | null;\n toolId: string;\n timestamp: number;\n}\n\nconst widgetDataStore = new Map<string, WidgetData>();\n\n// Cleanup expired widget data every 5 minutes\nsetInterval(\n () => {\n const now = Date.now();\n const ONE_HOUR = 60 * 60 * 1000;\n for (const [toolId, data] of widgetDataStore.entries()) {\n if (now - data.timestamp > ONE_HOUR) {\n widgetDataStore.delete(toolId);\n }\n }\n },\n 5 * 60 * 1000,\n).unref();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverId } = (await c.req.json()) as { serverId?: string };\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n const mcpClientManager = c.mcpClientManager;\n const { resources } = await mcpClientManager.listResources(serverId);\n return c.json({ resources });\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()) as {\n serverId?: string;\n uri?: string;\n };\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.mcpClientManager;\n\n const content = await mcpClientManager.readResource(serverId, {\n uri,\n });\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\n// Store widget data using toolId as key\nresources.post(\"/widget/store\", async (c) => {\n try {\n const body = await c.req.json();\n const {\n serverId,\n uri,\n toolInput,\n toolOutput,\n toolResponseMetadata,\n toolId,\n } = body;\n\n if (!serverId || !uri || !toolId) {\n return c.json({ success: false, error: \"Missing required fields\" }, 400);\n }\n\n // Store widget data using toolId as key\n widgetDataStore.set(toolId, {\n serverId,\n uri,\n toolInput,\n toolOutput,\n toolResponseMetadata: toolResponseMetadata ?? null,\n toolId,\n timestamp: Date.now(),\n });\n\n return c.json({ success: true });\n } catch (error) {\n console.error(\"Error storing widget data:\", 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// Simpler widget endpoint for React Router compatibility\n// Container page that changes URL to \"/\" before loading widget\nresources.get(\"/widget/:toolId\", async (c) => {\n const toolId = c.req.param(\"toolId\");\n\n // Check if data exists in storage\n const widgetData = widgetDataStore.get(toolId);\n if (!widgetData) {\n return c.html(\n \"<html><body>Error: Widget data not found or expired</body></html>\",\n 404,\n );\n }\n\n // Return a container page that will fetch and load the actual widget\n return c.html(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Loading Widget...</title>\n </head>\n <body>\n <script>\n (async function() {\n // Change URL to \"/\" BEFORE loading widget (for React Router)\n history.replaceState(null, '', '/');\n\n // Fetch the actual widget HTML using toolId\n const response = await fetch('/api/mcp/resources/widget-content/${toolId}');\n const html = await response.text();\n\n // Replace entire document with widget HTML\n document.open();\n document.write(html);\n document.close();\n })();\n </script>\n </body>\n </html>\n `);\n});\n\n// Actual widget content endpoint\nresources.get(\"/widget-content/:toolId\", async (c) => {\n try {\n const toolId = c.req.param(\"toolId\");\n\n // Retrieve widget data from storage\n const widgetData = widgetDataStore.get(toolId);\n if (!widgetData) {\n return c.html(\n \"<html><body>Error: Widget data not found or expired</body></html>\",\n 404,\n );\n }\n\n const { serverId, uri, toolInput, toolOutput, toolResponseMetadata } =\n widgetData;\n\n const mcpClientManager = c.mcpClientManager;\n const availableServers = mcpClientManager\n .listServers()\n .filter((id) => Boolean(mcpClientManager.getClient(id)));\n\n let actualServerId = serverId;\n if (!availableServers.includes(serverId)) {\n const match = availableServers.find(\n (name) => name.toLowerCase() === serverId.toLowerCase(),\n );\n if (match) {\n actualServerId = match;\n } else {\n return c.html(\n `<html><body>\n <h3>Error: Server not connected</h3>\n <p>Requested server: ${serverId}</p>\n <p>Available servers: ${availableServers.join(\", \")}</p>\n </body></html>`,\n 404,\n );\n }\n }\n\n const content = await mcpClientManager.readResource(actualServerId, {\n uri,\n });\n\n let htmlContent = \"\";\n const contentsArray = Array.isArray(content?.contents)\n ? content.contents\n : [];\n\n const firstContent = contentsArray[0];\n if (firstContent) {\n if (typeof (firstContent as { text?: unknown }).text === \"string\") {\n htmlContent = (firstContent as { text: string }).text;\n } else if (\n typeof (firstContent as { blob?: unknown }).blob === \"string\"\n ) {\n htmlContent = (firstContent as { blob: string }).blob;\n }\n }\n\n if (!htmlContent && content && typeof content === \"object\") {\n const recordContent = content as Record<string, unknown>;\n if (typeof recordContent.text === \"string\") {\n htmlContent = recordContent.text;\n } else if (typeof recordContent.blob === \"string\") {\n htmlContent = recordContent.blob;\n }\n }\n\n if (!htmlContent) {\n return c.html(\n \"<html><body>Error: No HTML content found</body></html>\",\n 404,\n );\n }\n\n const widgetStateKey = `openai-widget-state:${toolId}`;\n\n const apiScript = `\n <script>\n (function() {\n 'use strict';\n\n const openaiAPI = {\n toolInput: ${JSON.stringify(toolInput)},\n toolOutput: ${JSON.stringify(toolOutput)},\n toolResponseMetadata: ${JSON.stringify(toolResponseMetadata ?? null)},\n displayMode: 'inline',\n maxHeight: 600,\n theme: 'dark',\n locale: 'en-US',\n safeArea: { insets: { top: 0, bottom: 0, left: 0, right: 0 } },\n userAgent: {},\n widgetState: null,\n\n async setWidgetState(state) {\n this.widgetState = state;\n try {\n localStorage.setItem(${JSON.stringify(widgetStateKey)}, JSON.stringify(state));\n } catch (err) {\n console.error('[OpenAI Widget] Failed to save widget state:', err);\n }\n window.parent.postMessage({\n type: 'openai:setWidgetState',\n toolId: ${JSON.stringify(toolId)},\n state\n }, '*');\n },\n\n async callTool(toolName, params = {}) {\n return new Promise((resolve, reject) => {\n const requestId = \\`tool_\\${Date.now()}_\\${Math.random()}\\`;\n const handler = (event) => {\n if (event.data.type === 'openai:callTool:response' &&\n event.data.requestId === requestId) {\n window.removeEventListener('message', handler);\n if (event.data.error) {\n reject(new Error(event.data.error));\n } else {\n resolve(event.data.result);\n }\n }\n };\n window.addEventListener('message', handler);\n window.parent.postMessage({\n type: 'openai:callTool',\n requestId,\n toolName,\n params\n }, '*');\n setTimeout(() => {\n window.removeEventListener('message', handler);\n reject(new Error('Tool call timeout'));\n }, 30000);\n });\n },\n\n async sendFollowupTurn(message) {\n const payload = typeof message === 'string'\n ? { prompt: message }\n : message;\n window.parent.postMessage({\n type: 'openai:sendFollowup',\n message: payload.prompt || payload\n }, '*');\n },\n\n async requestDisplayMode(options = {}) {\n const mode = options.mode || 'inline';\n this.displayMode = mode;\n window.parent.postMessage({\n type: 'openai:requestDisplayMode',\n mode\n }, '*');\n return { mode };\n },\n\n async sendFollowUpMessage(args) {\n const prompt = typeof args === 'string' ? args : (args?.prompt || '');\n return this.sendFollowupTurn(prompt);\n },\n\n async openExternal(options) {\n const href = typeof options === 'string' ? options : options?.href;\n if (!href) {\n throw new Error('href is required for openExternal');\n }\n window.parent.postMessage({\n type: 'openai:openExternal',\n href\n }, '*');\n // Also open in new tab as fallback\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n Object.defineProperty(window, 'openai', {\n value: openaiAPI,\n writable: false,\n configurable: false,\n enumerable: true\n });\n\n Object.defineProperty(window, 'webplus', {\n value: openaiAPI,\n writable: false,\n configurable: false,\n enumerable: true\n });\n\n setTimeout(() => {\n try {\n const globalsEvent = new CustomEvent('webplus:set_globals', {\n detail: {\n globals: {\n displayMode: openaiAPI.displayMode,\n maxHeight: openaiAPI.maxHeight,\n theme: openaiAPI.theme,\n locale: openaiAPI.locale,\n safeArea: openaiAPI.safeArea,\n userAgent: openaiAPI.userAgent\n }\n }\n });\n window.dispatchEvent(globalsEvent);\n } catch (err) {}\n }, 0);\n\n setTimeout(() => {\n try {\n const stored = localStorage.getItem(${JSON.stringify(widgetStateKey)});\n if (stored && window.openai) {\n window.openai.widgetState = JSON.parse(stored);\n }\n } catch (err) {}\n }, 0);\n })();\n </script>\n `;\n\n let modifiedHtml;\n if (htmlContent.includes(\"<html>\") && htmlContent.includes(\"<head>\")) {\n modifiedHtml = htmlContent.replace(\n \"<head>\",\n `<head><base href=\"/\">${apiScript}`,\n );\n } else {\n modifiedHtml = `<!DOCTYPE html>\n<html>\n<head>\n <base href=\"/\">\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n ${apiScript}\n</head>\n<body>\n ${htmlContent}\n</body>\n</html>`;\n }\n\n const trustedCdns = [\n \"https://persistent.oaistatic.com\",\n \"https://*.oaistatic.com\",\n \"https://unpkg.com\",\n \"https://cdn.jsdelivr.net\",\n \"https://cdnjs.cloudflare.com\",\n \"https://cdn.skypack.dev\",\n ].join(\" \");\n\n c.header(\n \"Content-Security-Policy\",\n [\n \"default-src 'self'\",\n `script-src 'self' 'unsafe-inline' 'unsafe-eval' ${trustedCdns}`,\n \"worker-src 'self' blob:\",\n \"child-src 'self' blob:\",\n `style-src 'self' 'unsafe-inline' ${trustedCdns}`,\n \"img-src 'self' data: https: blob:\",\n \"media-src 'self' data: https: blob:\",\n `font-src 'self' data: ${trustedCdns}`,\n \"connect-src 'self' https: wss: ws:\",\n \"frame-ancestors 'self'\",\n ].join(\"; \"),\n );\n c.header(\"X-Frame-Options\", \"SAMEORIGIN\");\n c.header(\"X-Content-Type-Options\", \"nosniff\");\n\n // Disable caching for widget content (always fetch fresh HTML from MCP server)\n c.header(\"Cache-Control\", \"no-cache, no-store, must-revalidate\");\n c.header(\"Pragma\", \"no-cache\");\n c.header(\"Expires\", \"0\");\n\n return c.html(modifiedHtml);\n } catch (error) {\n return c.html(\n `<html><body>Error: ${error instanceof Error ? error.message : \"Unknown error\"}</body></html>`,\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()) as { serverId?: string };\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n const mcpClientManager = c.mcpClientManager;\n const { prompts } = await mcpClientManager.listPrompts(serverId);\n return c.json({ prompts });\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()) as {\n serverId?: string;\n name?: string;\n args?: Record<string, unknown>;\n };\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 mcpClientManager = c.mcpClientManager;\n\n const promptArguments = args\n ? Object.fromEntries(\n Object.entries(args).map(([key, value]) => [key, String(value)]),\n )\n : undefined;\n\n const content = await mcpClientManager.getPrompt(serverId, {\n name,\n arguments: promptArguments,\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 type { ModelMessage, ToolSet } from \"ai\";\nimport { executeToolCallsFromMessages } from \"@/shared/http-tool-calls\";\nimport {\n BackendToolCallEvent,\n BackendToolResultEvent,\n runBackendConversation,\n} from \"@/shared/backend-conversation\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport { MCPClientManager } from \"@/sdk\";\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: string | null;\n stepIndex: number;\n // Map tool call ID to tool name for serverId lookup\n toolCallIdToName: Map<string, string>;\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 litellmBaseUrl?: 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 // Generate unique ID with timestamp and random suffix\n const currentToolCallId = `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n const toolName = call.name || call.toolName;\n\n // Store tool name for serverId lookup later\n streamingContext.toolCallIdToName.set(currentToolCallId, toolName);\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: 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 : `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\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 || 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: ToolSet,\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n provider: ModelProvider,\n toolsWithServerId: Record<string, any>, // Tools with _serverId metadata attached\n temperature?: number,\n systemPrompt?: string,\n) => {\n // Helper to extract serverId from tool metadata (same pattern as http-tool-calls.ts)\n const extractServerId = (toolName: string): string | undefined => {\n const tool = toolsWithServerId[toolName];\n return tool?._serverId;\n };\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 let hadError = false;\n while (steps < MAX_AGENT_STEPS) {\n let accumulatedText = \"\";\n const iterationToolCalls: any[] = [];\n const iterationToolResults: any[] = [];\n\n let streamResult;\n let hadStreamError = false;\n let streamErrorMessage = \"\";\n let response: any = null;\n\n // Helper to extract clean error message from AI SDK error structures\n const extractErrorMessage = (error: any): string => {\n if (error.error && typeof error.error === \"object\") {\n const apiError = error.error as any;\n if (apiError.data?.error?.message) return apiError.data.error.message;\n if (apiError.responseBody) {\n try {\n const parsed = JSON.parse(apiError.responseBody);\n if (parsed.error?.message) return parsed.error.message;\n } catch {}\n }\n if (apiError.message) return apiError.message;\n }\n if (error.error instanceof Error) return error.error.message;\n return String(error.error || error.message || \"Unknown error occurred\");\n };\n\n streamResult = 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 onError: (error) => {\n hadStreamError = true;\n streamErrorMessage = extractErrorMessage(error);\n },\n onChunk: async (chunk) => {\n try {\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 // Generate unique ID with timestamp and random suffix\n const currentToolCallId = `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\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\n // Store tool name for serverId lookup later\n streamingContext.toolCallIdToName.set(currentToolCallId, name);\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 ??\n `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Look up serverId from tool metadata\n const toolName =\n streamingContext.toolCallIdToName.get(currentToolCallId);\n const serverId = toolName ? extractServerId(toolName) : undefined;\n\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 serverId,\n },\n },\n );\n break;\n }\n default:\n break;\n }\n } catch (chunkError) {\n hadStreamError = true;\n streamErrorMessage =\n chunkError instanceof Error\n ? chunkError.message\n : \"Error processing chunk\";\n }\n },\n });\n\n try {\n await streamResult.consumeStream();\n\n // If onError was triggered, throw the extracted error message\n if (hadStreamError) {\n throw new Error(streamErrorMessage);\n }\n\n response = await streamResult.response;\n\n // Check for any additional error states in the response\n if (response.error) {\n throw response.error;\n }\n\n if (response.experimental_providerMetadata?.openai?.error) {\n throw new Error(\n response.experimental_providerMetadata.openai.error.message ||\n \"OpenAI API error\",\n );\n }\n } catch (error) {\n // Use the already-extracted error message, or extract a new one\n const errorMessage = streamErrorMessage || extractErrorMessage(error);\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"error\",\n error: errorMessage,\n });\n\n sendSseEvent(\n streamingContext.controller,\n streamingContext.encoder!,\n \"[DONE]\",\n );\n\n hadError = true;\n steps++;\n break;\n }\n\n // If streamResult is undefined (due to error), exit the loop\n if (!streamResult || hadError) {\n steps++;\n break;\n }\n\n handleAgentStepFinish(\n streamingContext,\n accumulatedText,\n iterationToolCalls,\n iterationToolResults,\n false,\n );\n\n // Use the response we already fetched in the try block\n const responseMessages = (response?.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 : `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const value = (m as any).content;\n\n // Look up serverId from tool metadata\n const toolName =\n streamingContext.toolCallIdToName.get(currentToolCallId);\n const serverId = toolName ? extractServerId(toolName) : undefined;\n\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 serverId,\n },\n });\n }\n }\n }\n\n steps++;\n\n // Get finish reason from the response we already fetched\n const finishReason = response?.finishReason || \"stop\";\n const shouldContinue =\n finishReason === \"tool-calls\" ||\n (accumulatedText.length === 0 && iterationToolResults.length > 0);\n\n if (!shouldContinue) break;\n }\n\n // Only send completion events if no error occurred\n if (!hadError) {\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};\n\nconst sendMessagesToBackend = async (\n messages: ChatMessage[],\n streamingContext: StreamingContext,\n mcpClientManager: MCPClientManager,\n baseUrl: string,\n modelId: 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 selectedServerIds =\n Array.isArray(selectedServers) && selectedServers.length > 0\n ? selectedServers\n : mcpClientManager.listServers();\n\n const flattenedTools = await mcpClientManager.getToolsForAiSdk(\n selectedServerIds.length > 0 ? selectedServerIds : undefined,\n );\n\n const toolsetsByServer: Record<string, ToolSet> = {};\n const toolDefs: any[] = [];\n\n for (const [name, tool] of Object.entries(flattenedTools)) {\n if (!tool) continue;\n\n const serverId =\n (tool as any)._serverId ??\n (selectedServerIds.length === 1 ? selectedServerIds[0] : \"__unknown\");\n\n if (!toolsetsByServer[serverId]) {\n toolsetsByServer[serverId] = {} as ToolSet;\n }\n toolsetsByServer[serverId][name] = tool;\n\n const schema = (tool as any).inputSchema;\n let serializedSchema: Record<string, unknown> | undefined;\n\n if (schema) {\n if (\n typeof schema === \"object\" &&\n schema !== null &&\n \"jsonSchema\" in (schema as Record<string, unknown>)\n ) {\n serializedSchema = (schema as any).jsonSchema as Record<\n string,\n unknown\n >;\n } else {\n try {\n serializedSchema = zodToJsonSchema(schema) as Record<string, unknown>;\n } catch (err) {\n console.warn(\n `[mcp/chat] Failed to convert input schema for tool ${name}:`,\n err,\n );\n }\n }\n }\n\n toolDefs.push({\n name,\n description: (tool as any).description,\n inputSchema: serializedSchema ?? {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n });\n }\n\n if (!baseUrl) {\n throw new Error(\"CONVEX_HTTP_URL is not set\");\n }\n\n const emitToolCall = (call: BackendToolCallEvent) => {\n // Generate unique ID with timestamp and random suffix\n const currentToolCallId = `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n\n // Store tool name for serverId lookup later\n streamingContext.toolCallIdToName.set(currentToolCallId, call.name);\n\n sendSseEvent(streamingContext.controller, streamingContext.encoder!, {\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name,\n parameters: call.params as Record<string, unknown>,\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 : `tc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\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 as string | undefined,\n timestamp: new Date().toISOString(),\n serverId: result.serverId, // Propagate serverId\n },\n });\n };\n\n await runBackendConversation({\n maxSteps: MAX_AGENT_STEPS,\n messageHistory,\n modelId,\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 toolsets: toolsetsByServer 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 || 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\n\nchat.post(\"/\", async (c) => {\n const mcpClientManager = c.mcpClientManager;\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 litellmBaseUrl: _litellm_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 model?.id &&\n isMCPJamProvidedModel(model.id) &&\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 toolCallIdToName: new Map(),\n };\n\n mcpClientManager.setElicitationCallback(async (request) => {\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 model!.id,\n authHeader,\n requestData.selectedServers,\n );\n } else {\n // Use existing streaming path with tools\n // Get toolsets with server mapping (reusing pattern from sendMessagesToBackend)\n const toolsets = await mcpClientManager.getToolsForAiSdk(\n requestData.selectedServers,\n );\n\n const llmModel = createLlmModel(\n model as ModelDefinition,\n apiKey || \"\",\n _ollama_unused,\n _litellm_unused,\n );\n await createStreamingResponse(\n llmModel,\n toolsets as ToolSet,\n messages,\n streamingContext,\n provider,\n toolsets,\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 | \"x-ai\"\n | \"litellm\"\n | \"mistral\"\n | \"moonshotai\"\n | \"openrouter\"\n | \"z-ai\";\n\nconst MCPJAM_PROVIDED_MODEL_IDS: string[] = [\n \"meta-llama/llama-3.3-70b-instruct\",\n \"openai/gpt-oss-120b\",\n \"x-ai/grok-4-fast\",\n \"openai/gpt-5-nano\",\n \"anthropic/claude-sonnet-4.5\",\n \"anthropic/claude-haiku-4.5\",\n \"openai/gpt-5-codex\",\n \"openai/gpt-5\",\n \"openai/gpt-5-mini\",\n \"google/gemini-2.5-flash-preview-09-2025\",\n \"moonshotai/kimi-k2-0905\",\n \"google/gemini-2.5-flash\",\n \"z-ai/glm-4.6\",\n];\n\nexport const isMCPJamProvidedModel = (modelId: string): boolean => {\n return MCPJAM_PROVIDED_MODEL_IDS.includes(modelId);\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_5_MINI = \"gpt-5-mini\",\n GPT_5_NANO = \"gpt-5-nano\",\n GPT_5_MAIN = \"openai/gpt-5\",\n GPT_5_PRO = \"gpt-5-pro\",\n GPT_5_CODEX = \"gpt-5-codex\",\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 // Mistral models\n MISTRAL_LARGE_LATEST = \"mistral-large-latest\",\n MISTRAL_SMALL_LATEST = \"mistral-small-latest\",\n CODESTRAL_LATEST = \"codestral-latest\",\n MINISTRAL_8B_LATEST = \"ministral-8b-latest\",\n MINISTRAL_3B_LATEST = \"ministral-3b-latest\",\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_5, name: \"GPT-5\", provider: \"openai\" },\n { id: Model.GPT_5_MINI, name: \"GPT-5 Mini\", provider: \"openai\" },\n { id: Model.GPT_5_NANO, name: \"GPT-5 Nano\", provider: \"openai\" },\n { id: Model.GPT_5_CHAT_LATEST, name: \"GPT-5 Chat\", provider: \"openai\" },\n { id: Model.GPT_5_PRO, name: \"GPT-5 Pro\", provider: \"openai\" },\n { id: Model.GPT_5_CODEX, name: \"GPT-5 Codex\", provider: \"openai\" },\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 id: \"openai/gpt-oss-120b\",\n name: \"GPT-OSS 120B (Free)\",\n provider: \"openai\",\n },\n {\n id: \"x-ai/grok-4-fast\",\n name: \"Grok 4 Fast (Free)\",\n provider: \"x-ai\",\n },\n {\n id: \"openai/gpt-5-nano\",\n name: \"GPT-5 Nano (Free)\",\n provider: \"openai\",\n },\n {\n id: \"anthropic/claude-sonnet-4.5\",\n name: \"Claude Sonnet 4.5 (Free)\",\n provider: \"anthropic\",\n },\n {\n id: \"anthropic/claude-haiku-4.5\",\n name: \"Claude Haiku 4.5 (Free)\",\n provider: \"anthropic\",\n },\n {\n id: \"openai/gpt-5-codex\",\n name: \"GPT-5 Codex (Free)\",\n provider: \"openai\",\n },\n {\n id: \"openai/gpt-5\",\n name: \"GPT-5 (Free)\",\n provider: \"openai\",\n },\n {\n id: \"openai/gpt-5-mini\",\n name: \"GPT-5 Mini (Free)\",\n provider: \"openai\",\n },\n {\n id: \"google/gemini-2.5-flash-preview-09-2025\",\n name: \"Gemini 2.5 Flash Preview (Free)\",\n provider: \"google\",\n },\n {\n id: \"moonshotai/kimi-k2-0905\",\n name: \"Kimi K2 (Free)\",\n provider: \"moonshotai\",\n },\n {\n id: \"google/gemini-2.5-flash\",\n name: \"Gemini 2.5 Flash (Free)\",\n provider: \"google\",\n },\n {\n id: \"z-ai/glm-4.6\",\n name: \"GLM 4.6 (Free)\",\n provider: \"z-ai\",\n },\n // Mistral models\n {\n id: Model.MISTRAL_LARGE_LATEST,\n name: \"Mistral Large\",\n provider: \"mistral\",\n },\n {\n id: Model.MISTRAL_SMALL_LATEST,\n name: \"Mistral Small\",\n provider: \"mistral\",\n },\n {\n id: Model.CODESTRAL_LATEST,\n name: \"Codestral\",\n provider: \"mistral\",\n },\n {\n id: Model.MINISTRAL_8B_LATEST,\n name: \"Ministral 8B\",\n provider: \"mistral\",\n },\n {\n id: Model.MINISTRAL_3B_LATEST,\n name: \"Ministral 3B\",\n provider: \"mistral\",\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 interface ParsedMessageContent {\n reasoning?: string;\n content: string;\n}\n\n/**\n * Parses LLM reasoning tags and extracts both reasoning and final content\n * Example: <|channel|>analysis<|message|>reasoning here<|end|><|start|>assistant<|channel|>final<|message|>response here\n */\nexport function parseReasoningTags(text: string): ParsedMessageContent {\n const reasoningMatch = text.match(\n /<\\|channel\\|>analysis<\\|message\\|>(.*?)(?:<\\|end\\|>|<\\|start\\|>)/s,\n );\n const finalMatch = text.match(/<\\|channel\\|>final<\\|message\\|>(.*?)$/s);\n\n // If we found structured content with tags\n if (reasoningMatch || finalMatch) {\n return {\n reasoning: reasoningMatch ? reasoningMatch[1].trim() : undefined,\n content: finalMatch\n ? finalMatch[1].trim()\n : text.replace(/<\\|[^|]+\\|>/g, \"\").trim(),\n };\n }\n\n // No tags found, return original content\n return {\n content: text,\n };\n}\n\nexport function sanitizeText(text: string): string {\n // Basic trimming\n let value = text.trim();\n\n // Auto-close unbalanced fenced code blocks to avoid broken Markdown rendering\n // Count occurrences of triple backticks. If odd, append closing fence.\n // This is safe because it only affects display, not the raw content storage.\n try {\n const fenceRegex = /```/g;\n const matches = value.match(fenceRegex);\n const count = matches ? matches.length : 0;\n if (count % 2 === 1) {\n // Add a newline before closing to ensure proper block termination\n value = value.endsWith(\"\\n\") ? value + \"```\" : value + \"\\n```\";\n }\n } catch {\n // If anything goes wrong, fall back to original trimmed text\n }\n\n return value;\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 case \"mistral\":\n return 0.7; // Mistral'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 { createMistral } from \"@ai-sdk/mistral\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\nimport { createOllama } from \"ollama-ai-provider-v2\";\n\nexport const createLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n litellmBaseUrl?: 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 case \"mistral\":\n return createMistral({ apiKey })(modelDefinition.id);\n case \"litellm\": {\n // LiteLLM uses OpenAI-compatible endpoints (standard chat completions API)\n const baseURL = litellmBaseUrl || \"http://localhost:4000\";\n const openai = createOpenAI({\n apiKey: apiKey || \"dummy-key\", // LiteLLM may not require API key depending on setup\n baseURL,\n });\n // IMPORTANT: Use .chat() to use Chat Completions API instead of Responses API\n return openai.chat(modelDefinition.id);\n }\n case \"openrouter\":\n return createOpenRouter({ apiKey })(modelDefinition.id);\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n","import { ModelMessage } from \"@ai-sdk/provider-utils\";\nimport { LanguageModelV2ToolResultOutput } from \"@ai-sdk/provider-v5\";\nimport type { MCPClientManager } from \"@/sdk\";\n\ntype ToolsMap = Record<string, any>;\ntype Toolsets = Record<string, ToolsMap>;\n\n/**\n * Flatten toolsets and attach serverId metadata to each tool\n * This preserves the server origin for each tool to enable correct routing\n */\nfunction flattenToolsetsWithServerId(toolsets: Toolsets): ToolsMap {\n const flattened: ToolsMap = {};\n for (const [serverId, serverTools] of Object.entries(toolsets || {})) {\n if (serverTools && typeof serverTools === \"object\") {\n for (const [toolName, tool] of Object.entries(serverTools)) {\n // Attach serverId metadata to each tool\n flattened[toolName] = {\n ...tool,\n _serverId: serverId,\n };\n }\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\ntype ExecuteToolCallOptions =\n | { tools: ToolsMap }\n | { toolsets: Toolsets }\n | { clientManager: MCPClientManager; serverIds?: string[] };\n\nexport async function executeToolCallsFromMessages(\n messages: ModelMessage[],\n options: ExecuteToolCallOptions,\n): Promise<void> {\n // Build tools with serverId metadata\n let tools: ToolsMap = {};\n\n if (\"clientManager\" in options) {\n const flattened = await options.clientManager.getToolsForAiSdk(\n options.serverIds,\n );\n tools = flattened as ToolsMap;\n } else if (\"toolsets\" in options) {\n const toolsets = options.toolsets as Toolsets;\n tools = flattenToolsetsWithServerId(toolsets);\n } else {\n tools = options.tools as ToolsMap;\n }\n\n const index = buildIndexWithAliases(tools);\n\n const extractServerId = (toolName: string): string | undefined => {\n const tool = index[toolName];\n return tool?._serverId;\n };\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(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 // Extract serverId from tool name\n const serverId = extractServerId(toolName);\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 // Preserve full result including _meta for OpenAI Apps SDK\n result: result,\n // Add serverId for OpenAI component resolution\n serverId,\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 model?: 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 serverId?: string; // Server that executed the tool\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 modelId?: string;\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 model: options.modelId,\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 // Preserve the full result field if it exists (contains _meta for OpenAI Apps SDK)\n // Otherwise fall back to extracting output value\n const fullResult = item.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 // Use full result if available, otherwise extract value from output\n result: fullResult ?? extractToolResultValue(rawOutput),\n error: item.error,\n // Preserve serverId if present\n serverId: item.serverId,\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 \"../../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()) as { serverId?: string };\n if (!serverId) {\n return c.json({ error: \"serverId is required\" }, 400);\n }\n\n const mcp = c.mcpClientManager;\n\n let toolsResult: Awaited<ReturnType<typeof mcp.listTools>>;\n let resourcesResult: Awaited<ReturnType<typeof mcp.listResources>>;\n let promptsResult: Awaited<ReturnType<typeof mcp.listPrompts>>;\n\n try {\n [toolsResult, resourcesResult, promptsResult] = await Promise.all([\n mcp.listTools(serverId),\n mcp.listResources(serverId),\n mcp.listPrompts(serverId),\n ]);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n message.includes(\"not connected\") ||\n message.includes(\"Unknown MCP server\")\n ) {\n return c.json({ error: `Server '${serverId}' is not connected` }, 400);\n }\n throw error;\n }\n\n const tools = toolsResult.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n }));\n\n const resources = resourcesResult.resources.map((resource) => ({\n uri: resource.uri,\n name: resource.name,\n description: resource.description,\n mimeType: resource.mimeType,\n }));\n\n const prompts = promptsResult.prompts.map((prompt) => ({\n name: prompt.name,\n description: prompt.description,\n arguments: prompt.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)\n// interceptor.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\n// interceptor.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\n// interceptor.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)\n// interceptor.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\n// interceptor.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\n// interceptor.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\n// interceptor.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\n// interceptor.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// async 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\n// interceptor.all(\"/:id/proxy\", handleProxy);\n// interceptor.all(\"/:id/proxy/*\", handleProxy);\n\nexport default interceptor;\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 {\n generateTestCases,\n type DiscoveredTool,\n} from \"../../services/eval-agent\";\nimport type { MCPClientManager } from \"@/sdk\";\nimport \"../../types/hono\";\n\nfunction resolveServerIdsOrThrow(\n requestedIds: string[],\n clientManager: MCPClientManager,\n): string[] {\n const available = clientManager.listServers();\n const resolved: string[] = [];\n\n for (const requestedId of requestedIds) {\n const match =\n available.find((id) => id === requestedId) ??\n available.find((id) => id.toLowerCase() === requestedId.toLowerCase());\n\n if (!match) {\n throw new Error(`Server '${requestedId}' not found`);\n }\n\n if (!resolved.includes(match)) {\n resolved.push(match);\n }\n }\n\n return resolved;\n}\n\nasync function collectToolsForServers(\n clientManager: MCPClientManager,\n serverIds: string[],\n): Promise<DiscoveredTool[]> {\n const perServerTools = await Promise.all(\n serverIds.map(async (serverId) => {\n if (\n clientManager.getConnectionStatusByAttemptingPing(serverId) !==\n \"connected\"\n ) {\n return [] as DiscoveredTool[];\n }\n\n try {\n const { tools } = await clientManager.listTools(serverId);\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: (tool as { outputSchema?: unknown }).outputSchema,\n serverId,\n }));\n } catch (error) {\n console.warn(\n `[evals] Failed to list tools for server ${serverId}:`,\n error,\n );\n return [] as DiscoveredTool[];\n }\n }),\n );\n\n return perServerTools.flat();\n}\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.mcpClientManager;\n const resolvedServerIds = resolveServerIdsOrThrow(serverIds, clientManager);\n\n const environment = transformServerConfigsToEnvironment(\n resolvedServerIds,\n clientManager,\n );\n const modelId = tests.length > 0 ? tests[0].model : undefined;\n const llms = transformLLMConfigToLlmsConfig(llmConfig, modelId);\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 const errorMessage =\n error instanceof Error ? error.message : String(error);\n console.error(\"[Error running evals:\", errorMessage);\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\nconst GenerateTestsRequestSchema = z.object({\n serverIds: z.array(z.string()).min(1, \"At least one server must be selected\"),\n convexAuthToken: z.string(),\n});\n\ntype GenerateTestsRequest = z.infer<typeof GenerateTestsRequestSchema>;\n\nevals.post(\"/generate-tests\", async (c) => {\n try {\n const body = await c.req.json();\n\n const validationResult = GenerateTestsRequestSchema.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 { serverIds, convexAuthToken } =\n validationResult.data as GenerateTestsRequest;\n\n const clientManager = c.mcpClientManager;\n const resolvedServerIds = resolveServerIdsOrThrow(serverIds, clientManager);\n\n const filteredTools = await collectToolsForServers(\n clientManager,\n resolvedServerIds,\n );\n\n if (filteredTools.length === 0) {\n return c.json(\n {\n error: \"No tools found for selected servers\",\n },\n 400,\n );\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 // Generate test cases using the agent\n const testCases = await generateTestCases(\n filteredTools,\n convexHttpUrl,\n convexAuthToken,\n );\n\n return c.json({\n success: true,\n tests: testCases,\n });\n } catch (error) {\n console.error(\"Error in /evals/generate-tests:\", 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 type BackendConversationOptions,\n type BackendFetchPayload,\n type BackendFetchResponse,\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 toolsets = await mcpClient.getToolsets();\n const availableTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(availableTools, serverTools);\n });\n const vercelTools = convertMastraToolsToVercelTools(\n availableTools,\n ) as any as ToolMap;\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 as any)?.description,\n inputSchema: (tool as any)?.inputSchema,\n })) as unknown as BackendConversationOptions[\"toolDefinitions\"];\n\n try {\n await runBackendConversation({\n maxSteps: MAX_STEPS,\n messageHistory,\n modelId: test.model,\n toolDefinitions: toolDefs,\n fetchBackend: async (\n payload: BackendFetchPayload,\n ): Promise<BackendFetchResponse | null> => {\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()) as BackendFetchResponse;\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 let streamResult;\n try {\n 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 } catch (error: any) {\n // Handle API errors gracefully - log and exit this iteration\n const errorMessage = error?.message || String(error);\n Logger.error(errorMessage);\n\n // Exit this iteration early with failure\n const evaluation = evaluateResults(test.expectedToolCalls, []);\n await recorder.finishIteration({\n iterationId,\n passed: false,\n toolsCalled: [],\n usage: {\n inputTokens: undefined,\n outputTokens: undefined,\n totalTokens: undefined,\n },\n messages: messageHistory,\n });\n\n return evaluation;\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(model);\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.28.0\";\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 interface JwtDecodeOptions {\n header?: boolean;\n}\n\nexport interface JwtHeader {\n typ?: string;\n alg?: string;\n kid?: string;\n}\n\nexport interface JwtPayload {\n iss?: string;\n sub?: string;\n aud?: string[] | string;\n exp?: number;\n nbf?: number;\n iat?: number;\n jti?: string;\n}\n\nexport class InvalidTokenError extends Error {}\n\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\n\nfunction b64DecodeUnicode(str: string) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (_m, p) => {\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }),\n );\n}\n\nfunction base64UrlDecode(str: string) {\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\n try {\n return b64DecodeUnicode(output);\n } catch {\n return atob(output);\n }\n}\n\nexport function jwtDecode<T = JwtHeader>(\n token: string,\n options: JwtDecodeOptions & { header: true },\n): T;\nexport function jwtDecode<T = JwtPayload>(\n token: string,\n options?: JwtDecodeOptions,\n): T;\nexport function jwtDecode<T = JwtHeader | JwtPayload>(\n token: string,\n options?: JwtDecodeOptions,\n): T {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n\n options ||= {};\n\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(\n `Invalid token specified: missing part #${pos + 1}`,\n );\n }\n\n let decoded: string;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n\n try {\n return JSON.parse(decoded) as T;\n } catch (e) {\n throw new InvalidTokenError(\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n}\n","import { Logger } from \"../logging.js\";\nimport { LocalSyncState } from \"./local_state.js\";\nimport { AuthError, IdentityVersion, Transition } from \"./protocol.js\";\nimport { jwtDecode } from \"../../vendor/jwt-decode/index.js\";\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 * Get the current JWT auth token and decoded claims.\n */\n getAuth(): { token: string; decoded: Record<string, any> } | undefined {\n if (this.disabled) return;\n return this.client.getCurrentAuthClaims();\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","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 { 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\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 return [\n name,\n convertMastraToolToVercelTool(name, mastraTool, {\n originalName: name,\n }),\n ];\n }),\n );\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 { MCPClientOptions } from \"@mastra/mcp\";\nimport { MCPClientManager, MCPServerConfig } from \"@/sdk\";\nimport {\n LlmsConfig,\n LlmsConfigSchema,\n} from \"../../evals-cli/src/utils/validators\";\nimport { isMCPJamProvidedModel } from \"../../shared/types\";\n\n/**\n * Transforms server IDs from MCPClientManager to MCPClientOptions format\n * required by runEvals\n */\nexport function transformServerConfigsToEnvironment(\n serverIds: string[],\n clientManager: MCPClientManager,\n): MCPClientOptions {\n const servers: Record<string, MCPServerConfig> = {};\n\n for (const serverId of serverIds) {\n const config = clientManager.getServerConfig(serverId);\n if (!config) {\n throw new Error(`Server '${serverId}' not found`);\n }\n\n const status = clientManager.getConnectionStatusByAttemptingPing(serverId);\n if (status !== \"connected\") {\n throw new Error(\n `Server '${serverId}' is not connected (status: ${status})`,\n );\n }\n\n servers[serverId] = 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\nexport function transformLLMConfigToLlmsConfig(\n llmConfig: {\n provider: string;\n apiKey: string;\n },\n modelId?: string,\n): LlmsConfig {\n const llms: Record<string, string> = {};\n const isMCPJamModel = modelId && isMCPJamProvidedModel(modelId);\n\n if (isMCPJamModel) {\n llms.openrouter = \"BACKEND_EXECUTION\";\n } else {\n const providerKey = llmConfig.provider.toLowerCase();\n llms[providerKey] = llmConfig.apiKey;\n }\n\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 type { ModelMessage } from \"ai\";\n\nexport interface DiscoveredTool {\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n serverId: string;\n}\n\nexport interface GenerateTestsRequest {\n serverIds: string[];\n tools: DiscoveredTool[];\n}\n\nexport interface GeneratedTestCase {\n title: string;\n query: string;\n runs: number;\n expectedToolCalls: string[];\n judgeRequirement?: string;\n}\n\nconst AGENT_SYSTEM_PROMPT = `You are an AI agent specialized in creating realistic test cases for MCP (Model Context Protocol) servers.\n\n**About MCP:**\nThe Model Context Protocol enables AI assistants to securely access external data and tools. MCP servers expose tools, resources, and prompts that AI models can use to accomplish user tasks. Your test cases should reflect real-world usage patterns where users ask an AI assistant to perform tasks, and the assistant uses MCP tools to fulfill those requests.\n\n**Your Task:**\nGenerate 6 test cases with varying complexity levels that mimic how real users would interact with an AI assistant using these MCP tools.\n\n**Test Case Distribution:**\n- **2 EASY tests** (single tool): Simple, straightforward tasks using one tool\n- **2 MEDIUM tests** (2+ tools): Multi-step workflows requiring 2-3 tools in sequence or parallel\n- **2 HARD tests** (3+ tools): Complex scenarios requiring 3+ tools, conditional logic, or cross-server operations\n\n**Guidelines:**\n1. **Realistic User Queries**: Write queries as if a real user is talking to an AI assistant (e.g., \"Help me find all tasks due this week\" not \"Call the list_tasks tool\")\n2. **Natural Workflows**: Chain tools together in logical sequences that solve real problems\n3. **Cross-Server Tests**: If multiple servers are available, create tests that use tools from different servers together\n4. **Specific Details**: Include concrete examples (dates, names, values) to make tests actionable\n5. **Judge Requirements**: Clearly define what success looks like for each test\n6. **Test Titles**: Write clear, descriptive titles WITHOUT difficulty prefixes (e.g., \"Read project configuration\" not \"EASY: Read project configuration\")\n\n**Output Format (CRITICAL):**\nRespond with ONLY a valid JSON array. No explanations, no markdown code blocks, just the raw JSON array.\n\nExample:\n[\n {\n \"title\": \"Read project configuration\",\n \"query\": \"Show me the contents of config.json in the current project\",\n \"runs\": 1,\n \"expectedToolCalls\": [\"read_file\"],\n \"judgeRequirement\": \"Successfully reads and returns the file contents\"\n },\n {\n \"title\": \"Find and analyze recent tasks\",\n \"query\": \"Find all tasks created this week and summarize their status\",\n \"runs\": 1,\n \"expectedToolCalls\": [\"list_tasks\", \"get_task_details\"],\n \"judgeRequirement\": \"First lists tasks filtered by date, then retrieves details for each task found\"\n },\n {\n \"title\": \"Cross-server project setup\",\n \"query\": \"Create a new project folder, initialize a git repository, and create a task to track the project setup\",\n \"runs\": 1,\n \"expectedToolCalls\": [\"create_directory\", \"git_init\", \"create_task\"],\n \"judgeRequirement\": \"Successfully creates directory, initializes git, and creates a tracking task with appropriate details\"\n }\n]`;\n\n/**\n * Generates test cases using the backend LLM\n */\nexport async function generateTestCases(\n tools: DiscoveredTool[],\n convexHttpUrl: string,\n convexAuthToken: string,\n): Promise<GeneratedTestCase[]> {\n // Group tools by server\n const serverGroups = tools.reduce(\n (acc, tool) => {\n if (!acc[tool.serverId]) {\n acc[tool.serverId] = [];\n }\n acc[tool.serverId].push(tool);\n return acc;\n },\n {} as Record<string, DiscoveredTool[]>,\n );\n\n const serverCount = Object.keys(serverGroups).length;\n const totalTools = tools.length;\n\n // Build context about available tools grouped by server\n const toolsContext = Object.entries(serverGroups)\n .map(([serverId, serverTools]) => {\n const toolsList = serverTools\n .map((tool) => {\n return ` - ${tool.name}: ${tool.description || \"No description\"}\n Input: ${JSON.stringify(tool.inputSchema)}`;\n })\n .join(\"\\n\");\n\n return `**Server: ${serverId}** (${serverTools.length} tools)\n${toolsList}`;\n })\n .join(\"\\n\\n\");\n\n const crossServerGuidance =\n serverCount > 1\n ? `\\n**IMPORTANT**: You have ${serverCount} servers available. Create at least 2 test cases that use tools from MULTIPLE servers to test cross-server workflows.`\n : \"\";\n\n const userPrompt = `Generate 6 test cases for the following MCP server tools:\n\n${toolsContext}\n\n**Available Resources:**\n- ${serverCount} MCP server(s)\n- ${totalTools} total tools${crossServerGuidance}\n\n**Remember:**\n1. Create exactly 6 tests: 2 EASY (1 tool), 2 MEDIUM (2-3 tools), 2 HARD (3+ tools)\n2. Write realistic user queries that sound natural\n3. Use specific examples (dates, filenames, values)\n4. Chain tools in logical sequences\n5. Respond with ONLY a JSON array - no other text or markdown`;\n\n const messageHistory: ModelMessage[] = [\n { role: \"system\", content: AGENT_SYSTEM_PROMPT },\n { role: \"user\", content: userPrompt },\n ];\n\n // Call the backend LLM API\n const response = await fetch(`${convexHttpUrl}/streaming`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${convexAuthToken}`,\n },\n body: JSON.stringify({\n model: \"meta-llama/llama-3.3-70b-instruct\",\n tools: [],\n messages: JSON.stringify(messageHistory),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Failed to generate test cases: ${errorText}`);\n }\n\n const data = await response.json();\n\n if (!data.ok || !Array.isArray(data.messages)) {\n throw new Error(\"Invalid response from backend LLM\");\n }\n\n // Extract the assistant's response\n let assistantResponse = \"\";\n for (const msg of data.messages) {\n if (msg.role === \"assistant\") {\n const content = msg.content;\n if (typeof content === \"string\") {\n assistantResponse += content;\n } else if (Array.isArray(content)) {\n for (const item of content) {\n if (item.type === \"text\" && item.text) {\n assistantResponse += item.text;\n }\n }\n }\n }\n }\n\n // Parse JSON response\n try {\n // Try to extract JSON from markdown code blocks if present\n const jsonMatch = assistantResponse.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n const jsonText = jsonMatch ? jsonMatch[1].trim() : assistantResponse.trim();\n\n const testCases = JSON.parse(jsonText);\n\n if (!Array.isArray(testCases)) {\n throw new Error(\"Response is not an array\");\n }\n\n // Validate structure\n const validatedTests: GeneratedTestCase[] = testCases.map((tc: any) => ({\n title: tc.title || \"Untitled Test\",\n query: tc.query || \"\",\n runs: typeof tc.runs === \"number\" ? tc.runs : 1,\n expectedToolCalls: Array.isArray(tc.expectedToolCalls)\n ? tc.expectedToolCalls\n : [],\n judgeRequirement: tc.judgeRequirement,\n }));\n\n return validatedTests;\n } catch (parseError) {\n console.error(\"Failed to parse LLM response:\", assistantResponse);\n throw new Error(\n `Failed to parse test cases from LLM response: ${parseError instanceof Error ? parseError.message : \"Unknown error\"}`,\n );\n }\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.mcpClientManager;\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.mcpClientManager,\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 { MCPClientManager } from \"@/sdk\";\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: MCPClientManager,\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 list = await clientManager.listTools(serverId);\n const tools = (list?.tools ?? []).map((tool: any) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: toJsonSchemaMaybe(tool.inputSchema),\n outputSchema: toJsonSchemaMaybe(\n tool.outputSchema ?? tool.resultSchema,\n ),\n }));\n return respond({ result: { tools } });\n }\n case \"tools/call\": {\n try {\n let targetServerId = serverId;\n let toolName = params?.name as string | undefined;\n if (toolName?.includes(\":\")) {\n const [prefix, actualName] = toolName.split(\":\", 2);\n if (actualName) {\n if (clientManager.hasServer(prefix)) {\n targetServerId = prefix;\n }\n toolName = actualName;\n }\n }\n if (!toolName) {\n throw new Error(\"Tool name is required\");\n }\n const exec = await clientManager.executeTool(\n targetServerId,\n toolName,\n (params?.arguments ?? {}) as Record<string, unknown>,\n );\n if (mode === \"manager\") {\n return respond({ result: exec });\n }\n // adapter mode returns raw call-tool result for compatibility\n return respond({ result: exec });\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 list = await clientManager.listResources(serverId);\n const resources = (list?.resources ?? []).map((r: any) => ({\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 resource = await clientManager.readResource(serverId, {\n uri: params?.uri,\n });\n if (mode === \"manager\") {\n const firstContent = (resource as any)?.contents?.[0];\n const text =\n typeof firstContent?.text === \"string\"\n ? firstContent.text\n : typeof (resource as any) === \"string\"\n ? (resource as any)\n : JSON.stringify(resource, null, 2);\n const result = {\n contents: [\n {\n uri: params?.uri,\n mimeType:\n firstContent?.mimeType ||\n (typeof text === \"string\" ? \"text/plain\" : undefined),\n text,\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: resource });\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 list = await clientManager.listPrompts(serverId);\n const prompts = (list?.prompts ?? []).map((p: any) => ({\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 prompt = await clientManager.getPrompt(serverId, {\n name: params?.name,\n arguments: params?.arguments,\n });\n if (mode === \"manager\") {\n const result = {\n description:\n (prompt as any)?.description || `Prompt: ${params?.name}`,\n messages: (prompt as any)?.messages ?? [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: JSON.stringify(prompt, null, 2),\n },\n },\n ],\n };\n return respond({ result });\n }\n // adapter mode returns raw content\n return respond({ result: prompt });\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 { 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"],"mappings":"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","names":["Sentry","Hono","readFileSync","existsSync","join","CallToolResultSchema","_a","_b","tools","servers","tool","logger","version","Hono","mcpClientManager","Hono","Hono","mcpClientManager","Hono","Hono","resolve","Hono","Hono","mcpClientManager","resources","Hono","Hono","mcpClientManager","prompts","Hono","Model","TextEncoder","tool","tools","Hono","tool","mcpClientManager","messages","TextEncoder","resolve","response","Hono","Hono","Hono","mcp","tools","tool","resources","prompts","Hono","Hono","z","streamText","arr","value","v","__publicField","logger","__publicField","__publicField","resolve","createWebSocketStream","err","resolve","dir","arr","platform","arch","runtime","abi","require_node_gyp_build","mask","data","require_fallback","code","Receiver","Sender","v","EventEmitter","URL","WebSocket","key","protocol","WebSocketServer","server","version","version","z","zodToJsonSchema","options","fallbackConfig","z","server","z","createOpenRouter","createOpenAI","createAnthropic","createLlmModel","createAnthropic","createOpenAI","createOpenRouter","tool","tools","tool","streamText","createLlmModel","evaluation","servers","tools","tool","tools","tool","Hono","z","Hono","z","zodToJsonSchema","tools","tool","resources","prompts","Hono","Hono","randomUUID","__dirname","servers","Hono","join","__dirname","existsSync","v","readFileSync"]}
|