@mastra/hono 1.5.1-alpha.1 → 1.5.1-alpha.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @mastra/hono
2
2
 
3
+ ## 1.5.1-alpha.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`65f255a`](https://github.com/mastra-ai/mastra/commit/65f255a38667beb6ceeadabfa9eb5059bfec8298), [`4a88c6e`](https://github.com/mastra-ai/mastra/commit/4a88c6e2bdce316f8d7551b4ec3449b0b06fc71c), [`87a17ef`](https://github.com/mastra-ai/mastra/commit/87a17efbd725aca6639febdc5e69e2abb3048689), [`e11ff30`](https://github.com/mastra-ai/mastra/commit/e11ff301408bf1731dca2fb7fbfcd8c819500a35), [`9d2c946`](https://github.com/mastra-ai/mastra/commit/9d2c946d0859e90ae4bcec5beeb1da7398d2ad1e), [`f1ec385`](https://github.com/mastra-ai/mastra/commit/f1ec385386f62b1a0847ec5353ae2bb169d1c3d9), [`e14986f`](https://github.com/mastra-ai/mastra/commit/e14986f6e5478d6384d04ff9a7f9a79a46a8b529), [`0be490f`](https://github.com/mastra-ai/mastra/commit/0be490fabb538c5a7de796ea0aff7d04a0bea1f3), [`0be490f`](https://github.com/mastra-ai/mastra/commit/0be490fabb538c5a7de796ea0aff7d04a0bea1f3), [`974f614`](https://github.com/mastra-ai/mastra/commit/974f614e083bd68278536f94453f7b320b86a3c7), [`31be1cf`](https://github.com/mastra-ai/mastra/commit/31be1cf5f2a7b5eef12f6123a40653b4d8115c16)]:
8
+ - @mastra/core@1.46.0-alpha.3
9
+ - @mastra/server@1.46.0-alpha.3
10
+
11
+ ## 1.5.1-alpha.2
12
+
13
+ ### Patch Changes
14
+
15
+ - Fix crash on every request when deployed with `@mastra/core` < 1.42.0. The fastify, hono, and koa server adapters called `this.mastra.getStudio()` non-optionally during RBAC pre-checks. On older core versions that method doesn't exist on the `Mastra` class, so every request threw `TypeError: this.mastra.getStudio is not a function` and returned a 500 — even for projects with no auth configured. The call site now uses optional chaining (`getStudio?.()`), matching the pattern already applied in `@mastra/server` (#18075), and the adapters gracefully fall back to server-only auth. ([#18319](https://github.com/mastra-ai/mastra/pull/18319))
16
+
17
+ - Updated dependencies [[`6a1428a`](https://github.com/mastra-ai/mastra/commit/6a1428a23133fc070fc6c1caa08d28f3ba4fe5ff), [`7f51548`](https://github.com/mastra-ai/mastra/commit/7f515481213780be7047cef00640b9d35f3d545c)]:
18
+ - @mastra/core@1.46.0-alpha.2
19
+ - @mastra/server@1.46.0-alpha.2
20
+
3
21
  ## 1.5.1-alpha.1
4
22
 
5
23
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -527,7 +527,7 @@ var MastraServer = class extends serverAdapter.MastraServer {
527
527
  // Standard Request object with headers/cookies
528
528
  };
529
529
  const requestContext = c.get("requestContext");
530
- const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;
530
+ const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;
531
531
  if (hasAuth) {
532
532
  const hasPermission = await loadHasPermission();
533
533
  if (hasPermission) {
@@ -625,7 +625,7 @@ var MastraServer = class extends serverAdapter.MastraServer {
625
625
  }
626
626
  }
627
627
  const requestContext = c.get("requestContext");
628
- const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;
628
+ const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;
629
629
  if (hasAuth) {
630
630
  const hasPermission = await loadHasPermission();
631
631
  if (hasPermission) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth-middleware.ts","../src/browser-stream/index.ts","../src/index.ts"],"names":["requestContext","RequestContext","coreAuthMiddleware","ViewerRegistry","handleInputMessage","MastraServerBase","stream","redactStreamChunk","serializeStreamChunk","normalizeQueryParams","toReqRes","toFetchResponse","bodyLimit","isZodError","checkRouteFGA"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, MiddlewareHandler } from 'hono';\n\nexport interface HonoAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: HonoAuthMiddlewareOptions): MiddlewareHandler {\n return async (c: Context, next) => {\n if (!requiresAuth) {\n return next();\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return next();\n }\n\n const requestContext = c.get('requestContext') ?? new RequestContext();\n c.set('requestContext', requestContext);\n c.set('mastra', c.get('mastra') ?? mastra);\n\n const path = c.req.path;\n const method = c.req.method;\n const customRouteAuthConfig = new Map<string, boolean>(c.get('customRouteAuthConfig') ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = c.req.header('Authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = c.req.query('apiKey') || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => c.req.header(name),\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: c.req.raw,\n token,\n buildAuthorizeContext: () => c,\n });\n\n if (result.action === 'next') {\n return next();\n }\n\n return c.json(result.body as any, result.status as any);\n };\n}\n","import type { createNodeWebSocket as CreateNodeWebSocket } from '@hono/node-ws';\nimport { handleInputMessage, ViewerRegistry } from '@mastra/server/browser-stream';\nimport type { BrowserStreamConfig, BrowserStreamResult } from '@mastra/server/browser-stream';\nimport type { Env, Hono, Schema } from 'hono';\n\n/**\n * Set up WebSocket-based browser stream endpoint for real-time screencast viewing.\n *\n * Creates a WebSocket route at `/browser/:agentId/stream` that:\n * - Accepts viewer connections\n * - Starts screencast when first viewer connects\n * - Broadcasts frames to all connected viewers\n * - Stops screencast when last viewer disconnects\n *\n * **Note**: Requires `ws` package to be installed. If not available, returns null\n * and logs a warning. Browser streaming will be disabled but everything else works.\n *\n * @param app - The Hono application instance\n * @param config - Configuration for browser stream\n * @returns Object containing injectWebSocket function and registry instance, or null if ws is not available\n *\n * @example\n * ```typescript\n * import { Hono } from 'hono';\n * import { serve } from '@hono/node-server';\n * import { setupBrowserStream } from '@mastra/hono';\n *\n * const app = new Hono();\n * const browserStream = await setupBrowserStream(app, {\n * getToolset: (agentId) => browserToolsets.get(agentId),\n * });\n *\n * const server = serve({ fetch: app.fetch, port: 4111 });\n * browserStream?.injectWebSocket(server);\n * ```\n */\nexport async function setupBrowserStream<E extends Env, S extends Schema, B extends string>(\n app: Hono<E, S, B>,\n config: BrowserStreamConfig,\n): Promise<BrowserStreamResult | null> {\n // Dynamic import to avoid bundling ws into non-Node environments (e.g. Cloudflare Workers).\n // The variable-based specifier prevents bundlers from resolving the module at build time.\n let createNodeWebSocket: typeof CreateNodeWebSocket;\n try {\n const mod = '@hono/node-ws';\n const honoNodeWs = await import(/* @vite-ignore */ /* webpackIgnore: true */ mod);\n createNodeWebSocket = honoNodeWs.createNodeWebSocket;\n } catch {\n // @hono/node-ws is not available (e.g. no ws package installed).\n // This is expected in non-Node environments — silently disable browser streaming.\n return null;\n }\n\n const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });\n const registry = new ViewerRegistry();\n\n // Normalize the API prefix so we can build paths like `${apiPrefix}/agents/...`\n // without producing `//agents/...` when the prefix is missing or has a single\n // trailing slash. Anything weirder than that (e.g. `'/api//'`) is a config\n // bug we don't try to silently fix.\n const rawPrefix = config.apiPrefix ?? '/api';\n const trimmed = rawPrefix.endsWith('/') ? rawPrefix.slice(0, -1) : rawPrefix;\n const apiPrefix = trimmed || '/api';\n\n app.get(\n '/browser/:agentId/stream',\n upgradeWebSocket(c => {\n const agentId = c.req.param('agentId')!;\n const threadId = c.req.query('threadId');\n // Use composite key for thread-scoped screencasts\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n return {\n onOpen(_event, ws) {\n // Send connected status immediately\n ws.send(JSON.stringify({ status: 'connected' }));\n\n // Add to registry (starts screencast if first viewer)\n // Fire-and-forget: screencast starts asynchronously\n // Pass agentId for toolset lookup, but viewerKey for registry scoping\n void registry.addViewer(viewerKey, ws, config.getToolset, agentId, threadId);\n },\n\n onMessage(event, _ws) {\n const data = typeof event.data === 'string' ? event.data : null;\n if (data) {\n void handleInputMessage(data, config.getToolset, agentId, threadId);\n }\n },\n\n onClose(_event, ws) {\n // Remove from registry (stops screencast if last viewer)\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n\n onError(event, ws) {\n console.error('[BrowserStream] WebSocket error:', event);\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n };\n }),\n );\n\n // Browser session probe endpoint - tells the client whether to open a WS.\n // Returns:\n // - screencastAvailable: true (this route only exists if setupBrowserStream succeeded)\n // - hasSession: whether the agent has an active browser session for the given thread\n app.get(`${apiPrefix}/agents/:agentId/browser/session`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const threadId = c.req.query('threadId');\n const toolset = await config.getToolset(agentId);\n\n if (!toolset) {\n return c.json({ hasSession: false, screencastAvailable: true });\n }\n\n const hasSession = threadId ? toolset.hasThreadSession(threadId) : false;\n return c.json({ hasSession, screencastAvailable: true });\n });\n\n // Close browser session endpoint\n app.post(`${apiPrefix}/agents/:agentId/browser/close`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const toolset = await config.getToolset(agentId);\n if (!toolset) {\n return c.json({ error: 'No browser session for this agent' }, 404);\n }\n\n try {\n // Parse threadId from request body\n let threadId: string | undefined;\n try {\n const body = await c.req.json();\n threadId = body?.threadId;\n } catch {\n // No body or invalid JSON - proceed without threadId\n }\n\n const scope = toolset.getScope();\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n // For thread scope with a threadId, close only that thread's session\n if (scope === 'thread' && threadId) {\n // Close the session in the registry (stops screencast for this thread)\n await registry.closeBrowserSession(viewerKey);\n\n // Close just this thread's browser session\n if ('closeThreadSession' in toolset && typeof toolset.closeThreadSession === 'function') {\n await toolset.closeThreadSession(threadId);\n }\n } else {\n // For shared scope or no threadId, close the entire browser\n await registry.closeBrowserSession(viewerKey);\n await toolset.close();\n }\n\n return c.json({ success: true });\n } catch (error) {\n console.error(`[BrowserStream] Error closing browser for ${agentId}:`, error);\n return c.json({ error: 'Failed to close browser' }, 500);\n }\n });\n\n return { injectWebSocket: injectWebSocket as (server: unknown) => void, registry };\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\n\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nimport type { Context, HonoRequest, MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { stream } from 'hono/streaming';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { HonoAuthMiddlewareOptions } from './auth-middleware';\n// Browser stream setup (Hono-specific WebSocket implementation)\nexport { setupBrowserStream } from './browser-stream';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/hono] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Hono app configuration\nexport type HonoVariables = {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n cachedBody?: unknown;\n};\n\nexport type HonoBindings = {};\n\n/**\n * Generic handler function type compatible across Hono versions.\n * Uses a minimal signature that all Hono middleware handlers satisfy.\n */\ntype HonoRouteHandler = (...args: any[]) => any;\n\n/**\n * Minimal interface representing what MastraServer needs from a Hono app.\n * This allows any Hono app instance to be passed without strict generic matching,\n * avoiding the version mismatch issues that occur with Hono's strict generic types.\n */\nexport interface HonoApp {\n use(path: string, ...handlers: HonoRouteHandler[]): unknown;\n get(path: string, ...handlers: HonoRouteHandler[]): unknown;\n post(path: string, ...handlers: HonoRouteHandler[]): unknown;\n put(path: string, ...handlers: HonoRouteHandler[]): unknown;\n delete(path: string, ...handlers: HonoRouteHandler[]): unknown;\n patch(path: string, ...handlers: HonoRouteHandler[]): unknown;\n all(path: string, ...handlers: HonoRouteHandler[]): unknown;\n}\n\nexport class MastraServer extends MastraServerBase<HonoApp, HonoRequest, Context> {\n createContextMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n // Patch req.json() to prevent \"Body is unusable\" errors when the body is read multiple times\n // e.g. by middleware and then by an agent.\n const originalJson = c.req.json.bind(c.req);\n let jsonPromise: Promise<any> | undefined;\n\n c.req.json = () => {\n if (!jsonPromise) {\n jsonPromise = originalJson().then(body => {\n // Cache in context if needed explicitly, though the promise memoization handles the reuse\n c.set('cachedBody', body);\n return body;\n });\n }\n return jsonPromise;\n };\n\n // Parse request context from request body and add to context\n\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (c.req.method === 'POST' || c.req.method === 'PUT') {\n const contentType = c.req.header('content-type');\n const contentLength = c.req.header('content-length');\n // Only parse if content-type is JSON and body is not empty\n if (contentType?.includes('application/json') && contentLength !== '0') {\n try {\n const body = (await c.req.raw.clone().json()) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (c.req.method === 'GET') {\n try {\n const encodedRequestContext = c.req.query('requestContext');\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => c.req.header(name),\n });\n\n // Add relevant contexts to hono context\n c.set('requestContext', requestContext);\n c.set('mastra', this.mastra);\n c.set('registeredTools', this.tools || {});\n c.set('taskStore', this.taskStore);\n c.set('abortSignal', c.req.raw.signal);\n c.set('customRouteAuthConfig', this.customRouteAuthConfig);\n\n return next();\n };\n }\n async stream(route: ServerRoute, res: Context, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.header('Content-Type', 'text/event-stream');\n res.header('Cache-Control', 'no-cache');\n res.header('Connection', 'keep-alive');\n res.header('X-Accel-Buffering', 'no');\n } else {\n res.header('Content-Type', 'text/plain');\n }\n res.header('Transfer-Encoding', 'chunked');\n\n return stream(\n res,\n async stream => {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n await stream.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n stream.onAbort(() => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n await stream.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n await stream.write(`data: ${serialized.json}\\n\\n`);\n } else {\n await stream.write(serialized.json + '\\x1E');\n }\n }\n }\n\n if (streamFormat === 'sse') {\n await stream.write('data: [DONE]\\n\\n');\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n await stream.close();\n }\n },\n async err => {\n this.mastra.getLogger()?.error('Stream error callback', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n },\n );\n }\n\n async getParams(route: ServerRoute, request: HonoRequest): Promise<ParsedRequestParams> {\n const urlParams = request.param();\n // Use queries() to get all values for repeated params (e.g., ?tags=a&tags=b -> { tags: ['a', 'b'] })\n const queryParams = normalizeQueryParams(request.queries());\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.header('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Clone the request to read the body text first\n // This allows us to check if there's actual content before parsing\n const clonedReq = request.raw.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n // There's actual content - try to parse it as JSON\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Track JSON parse error to return 400 Bad Request\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n // Empty body is ok - body remains undefined\n }\n }\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n */\n private async parseFormData(formData: FormData): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of formData.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Context, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.header(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return response.json(result as any, 200);\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n return fetchResponse;\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n const { req, res } = toReqRes(response.req.raw);\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(response.req.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n try {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n } catch {\n // Response stream already closed or destroyed - nothing more to do\n }\n });\n\n return await toFetchResponse(res);\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n return await server.startHonoSSE({\n url: new URL(response.req.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n context: response,\n });\n } catch {\n return response.json({ error: 'Error handling MCP SSE request' }, 500);\n }\n } else {\n return response.status(500);\n }\n }\n\n async registerRoute(\n app: HonoApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Build middleware array\n const middlewares: MiddlewareHandler[] = [];\n\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n middlewares.push(\n bodyLimit({\n maxSize,\n onError: this.bodyLimitOptions.onError as any,\n }),\n );\n }\n\n app[route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all'](\n `${prefix}${route.path}`,\n ...middlewares,\n async (c: Context) => {\n // Check route-level authentication/authorization\n const authResult = await this.checkRouteAuth(route, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authResult) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n c.header(key, value as string);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return c.json({ error: authResult.error }, authResult.status as any);\n }\n }\n\n const params = await this.getParams(route, c.req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed JSON)\n if (params.bodyParseError) {\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n },\n 400,\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: c.get('requestContext'),\n mastra: this.mastra,\n registeredTools: c.get('registeredTools'),\n taskStore: c.get('taskStore'),\n abortSignal: c.get('abortSignal'),\n routePrefix: prefix,\n request: c.req.raw, // Standard Request object with headers/cookies\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);\n\n if (permissionError) {\n return c.json(\n {\n error: permissionError.error,\n message: permissionError.message,\n },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, c.get('requestContext'), {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, c, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Check if it's an HTTPException or MastraError with a status code\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n const status = (error as any).status;\n let safeCause: { failingItems: unknown[] } | undefined;\n try {\n const raw = error instanceof Error ? error.cause : undefined;\n if (\n raw &&\n typeof raw === 'object' &&\n !Array.isArray(raw) &&\n 'failingItems' in raw &&\n Array.isArray((raw as any).failingItems)\n ) {\n safeCause = { failingItems: (raw as any).failingItems };\n }\n } catch {\n // serialization or access error — omit cause\n }\n return c.json(\n {\n error: error instanceof Error ? error.message : 'Unknown error',\n ...(safeCause ? { cause: safeCause } : {}),\n },\n status,\n );\n }\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, status);\n }\n }\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, 500);\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const routes = this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes ?? [];\n\n for (const route of routes) {\n const serverRoute: ServerRoute = {\n method: route.method as any,\n path: route.path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: route.requiresAuth,\n requiresPermission: route.requiresPermission,\n fga: route.fga,\n };\n\n const routeHandler: MiddlewareHandler = async (c: Context) => {\n // Per-route auth check (same pattern as registerRoute)\n const authError = await this.checkRouteAuth(serverRoute, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n c.header(key, value as string);\n }\n }\n if (authError.error) {\n return c.json({ error: authError.error }, authError.status as any);\n }\n }\n\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(\n serverRoute,\n userPermissions,\n hasPermission,\n requestContext,\n );\n if (permissionError) {\n return c.json(\n { error: permissionError.error, message: permissionError.message },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n let bodyParams: Record<string, unknown> = {};\n const contentType = c.req.header('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (await c.req.raw.clone().json()) as unknown;\n if (body && typeof body === 'object' && !Array.isArray(body)) {\n bodyParams = body as Record<string, unknown>;\n }\n } catch {\n bodyParams = {};\n }\n } else if (\n contentType?.includes('application/x-www-form-urlencoded') ||\n contentType?.includes('multipart/form-data')\n ) {\n try {\n bodyParams = Object.fromEntries(await c.req.raw.clone().formData());\n } catch {\n bodyParams = {};\n }\n }\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, c.get('requestContext'), {\n ...c.req.param(),\n ...Object.fromEntries(new URL(c.req.url).searchParams.entries()),\n ...bodyParams,\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n const reqHeaders: Record<string, string | string[] | undefined> = {};\n c.req.raw.headers.forEach((v, k) => {\n reqHeaders[k] = v;\n });\n const response = await this.handleCustomRouteRequest(\n c.req.url,\n c.req.method,\n reqHeaders,\n c.req.raw.body,\n c.get('requestContext'),\n c.req.raw.signal,\n );\n if (!response) {\n return c.json({ error: 'Not Found' }, 404);\n }\n return response;\n };\n\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n this.app[method](route.path, routeHandler);\n }\n }\n\n registerContextMiddleware(): void {\n this.app.use('*', this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use('*', async (c, next) => {\n if (!this.shouldLogRequest(c.req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = c.req.method;\n const path = c.req.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = c.res.status;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = c.req.query();\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(c.req.raw.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth-middleware.ts","../src/browser-stream/index.ts","../src/index.ts"],"names":["requestContext","RequestContext","coreAuthMiddleware","ViewerRegistry","handleInputMessage","MastraServerBase","stream","redactStreamChunk","serializeStreamChunk","normalizeQueryParams","toReqRes","toFetchResponse","bodyLimit","isZodError","checkRouteFGA"],"mappings":";;;;;;;;;;;AAUO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,YAAA,GAAe,MAAK,EAAiD;AAClH,EAAA,OAAO,OAAO,GAAY,IAAA,KAAS;AACjC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,EAAU,EAAG,IAAA;AACvC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAMA,mBAAiB,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA,IAAK,IAAIC,6BAAA,EAAe;AACrE,IAAA,CAAA,CAAE,GAAA,CAAI,kBAAkBD,gBAAc,CAAA;AACtC,IAAA,CAAA,CAAE,IAAI,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,QAAQ,KAAK,MAAM,CAAA;AAEzC,IAAA,MAAM,IAAA,GAAO,EAAE,GAAA,CAAI,IAAA;AACnB,IAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,IAAA,MAAM,qBAAA,GAAwB,IAAI,GAAA,CAAqB,CAAA,CAAE,IAAI,uBAAuB,CAAA,IAAK,EAAE,CAAA;AAC3F,IAAA,qBAAA,CAAsB,IAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,IAAI,IAAI,CAAA;AAEnD,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,eAAe,CAAA;AAC/C,IAAA,IAAI,QAAuB,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,GAAI,IAAA;AAC5E,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,IAAA;AAAA,IACnC;AAEA,IAAA,MAAM,MAAA,GAAS,MAAME,uBAAA,CAAmB;AAAA,MACtC,IAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,CAAA,IAAA,KAAQ,CAAA,CAAE,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,MACpC,MAAA;AAAA,MACA,UAAA;AAAA,MACA,qBAAA;AAAA,sBACAF,gBAAA;AAAA,MACA,UAAA,EAAY,EAAE,GAAA,CAAI,GAAA;AAAA,MAClB,KAAA;AAAA,MACA,uBAAuB,MAAM;AAAA,KAC9B,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC5B,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,EAAa,OAAO,MAAa,CAAA;AAAA,EACxD,CAAA;AACF;ACnBA,eAAsB,kBAAA,CACpB,KACA,MAAA,EACqC;AAGrC,EAAA,IAAI,mBAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,eAAA;AACZ,IAAA,MAAM,aAAa,MAAM;AAAA;AAAA;AAAA,MAAoD;AAAA,KAAA;AAC7E,IAAA,mBAAA,GAAsB,UAAA,CAAW,mBAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AAGN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,eAAA,EAAiB,gBAAA,KAAqB,mBAAA,CAAoB,EAAE,KAAK,CAAA;AACzE,EAAA,MAAM,QAAA,GAAW,IAAIG,4BAAA,EAAe;AAMpC,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,MAAA;AACtC,EAAA,MAAM,OAAA,GAAU,UAAU,QAAA,CAAS,GAAG,IAAI,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,SAAA;AACnE,EAAA,MAAM,YAAY,OAAA,IAAW,MAAA;AAE7B,EAAA,GAAA,CAAI,GAAA;AAAA,IACF,0BAAA;AAAA,IACA,iBAAiB,CAAA,CAAA,KAAK;AACpB,MAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AACrC,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AAEvC,MAAA,MAAM,YAAY,QAAA,GAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,OAAA;AAExD,MAAA,OAAO;AAAA,QACL,MAAA,CAAO,QAAQ,EAAA,EAAI;AAEjB,UAAA,EAAA,CAAG,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,WAAA,EAAa,CAAC,CAAA;AAK/C,UAAA,KAAK,SAAS,SAAA,CAAU,SAAA,EAAW,IAAI,MAAA,CAAO,UAAA,EAAY,SAAS,QAAQ,CAAA;AAAA,QAC7E,CAAA;AAAA,QAEA,SAAA,CAAU,OAAO,GAAA,EAAK;AACpB,UAAA,MAAM,OAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,IAAA;AAC3D,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,KAAKC,gCAAA,CAAmB,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,SAAS,QAAQ,CAAA;AAAA,UACpE;AAAA,QACF,CAAA;AAAA,QAEA,OAAA,CAAQ,QAAQ,EAAA,EAAI;AAGlB,UAAA,KAAK,QAAA,CAAS,YAAA,CAAa,SAAA,EAAW,EAAE,CAAA;AAAA,QAC1C,CAAA;AAAA,QAEA,OAAA,CAAQ,OAAO,EAAA,EAAI;AACjB,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAEvD,UAAA,KAAK,QAAA,CAAS,YAAA,CAAa,SAAA,EAAW,EAAE,CAAA;AAAA,QAC1C;AAAA,OACF;AAAA,IACF,CAAC;AAAA,GACH;AAMA,EAAA,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,gCAAA,CAAA,EAAoC,OAAM,CAAA,KAAK;AACjE,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAE/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,YAAY,KAAA,EAAO,mBAAA,EAAqB,MAAM,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,UAAA,GAAa,QAAA,GAAW,OAAA,CAAQ,gBAAA,CAAiB,QAAQ,CAAA,GAAI,KAAA;AACnE,IAAA,OAAO,EAAE,IAAA,CAAK,EAAE,UAAA,EAAY,mBAAA,EAAqB,MAAM,CAAA;AAAA,EACzD,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,8BAAA,CAAA,EAAkC,OAAM,CAAA,KAAK;AAChE,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,IAA0B,GAAG,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,mCAAA,IAAuC,GAAG,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,CAAA,CAAE,GAAA,CAAI,IAAA,EAAK;AAC9B,QAAA,QAAA,GAAW,IAAA,EAAM,QAAA;AAAA,MACnB,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAC/B,MAAA,MAAM,YAAY,QAAA,GAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,OAAA;AAGxD,MAAA,IAAI,KAAA,KAAU,YAAY,QAAA,EAAU;AAElC,QAAA,MAAM,QAAA,CAAS,oBAAoB,SAAS,CAAA;AAG5C,QAAA,IAAI,oBAAA,IAAwB,OAAA,IAAW,OAAO,OAAA,CAAQ,uBAAuB,UAAA,EAAY;AACvF,UAAA,MAAM,OAAA,CAAQ,mBAAmB,QAAQ,CAAA;AAAA,QAC3C;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,QAAA,CAAS,oBAAoB,SAAS,CAAA;AAC5C,QAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,MACtB;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0CAAA,EAA6C,OAAO,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC5E,MAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,yBAAA,IAA6B,GAAG,CAAA;AAAA,IACzD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,iBAA+D,QAAA,EAAS;AACnF;;;ACrJA,IAAI,qBAAA;AACJ,SAAS,iBAAA,GAA0D;AACjE,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,qBAAA,GAAwB,OAAO,sBAAsB,CAAA,CAClD,IAAA,CAAK,OAAK,CAAA,CAAE,aAAa,CAAA,CACzB,KAAA,CAAM,MAAM;AACX,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACL;AACA,EAAA,OAAO,qBAAA;AACT;AAoCO,IAAM,YAAA,GAAN,cAA2BC,0BAAA,CAAgD;AAAA,EAChF,uBAAA,GAA6C;AAC3C,IAAA,OAAO,OAAO,GAAG,IAAA,KAAS;AAGxB,MAAA,MAAM,eAAe,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,GAAG,CAAA;AAC1C,MAAA,IAAI,WAAA;AAEJ,MAAA,CAAA,CAAE,GAAA,CAAI,OAAO,MAAM;AACjB,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,WAAA,GAAc,YAAA,EAAa,CAAE,IAAA,CAAK,CAAA,IAAA,KAAQ;AAExC,YAAA,CAAA,CAAE,GAAA,CAAI,cAAc,IAAI,CAAA;AACxB,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AACA,QAAA,OAAO,WAAA;AAAA,MACT,CAAA;AAIA,MAAA,IAAI,kBAAA;AACJ,MAAA,IAAI,oBAAA;AAGJ,MAAA,IAAI,EAAE,GAAA,CAAI,MAAA,KAAW,UAAU,CAAA,CAAE,GAAA,CAAI,WAAW,KAAA,EAAO;AACrD,QAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA;AAC/C,QAAA,MAAM,aAAA,GAAgB,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,gBAAgB,CAAA;AAEnD,QAAA,IAAI,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,IAAK,kBAAkB,GAAA,EAAK;AACtE,UAAA,IAAI;AACF,YAAA,MAAM,OAAQ,MAAM,CAAA,CAAE,IAAI,GAAA,CAAI,KAAA,GAAQ,IAAA,EAAK;AAC3C,YAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,cAAA,kBAAA,GAAqB,IAAA,CAAK,cAAA;AAAA,YAC5B;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAC1B,QAAA,IAAI;AACF,UAAA,MAAM,qBAAA,GAAwB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,gBAAgB,CAAA;AAC1D,UAAA,IAAI,qBAAA,EAAuB;AAEzB,YAAA,IAAI;AACF,cAAA,oBAAA,GAAuB,IAAA,CAAK,MAAM,qBAAqB,CAAA;AAAA,YACzD,CAAA,CAAA,MAAQ;AAEN,cAAA,IAAI;AACF,gBAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,uBAAuB,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AAC1E,gBAAA,oBAAA,GAAuB,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,cACxC,CAAA,CAAA,MAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,iBAAiB,IAAA,CAAK,mBAAA,CAAoB,EAAE,oBAAA,EAAsB,oBAAoB,CAAA;AAC5F,MAAA,IAAA,CAAK,6BAAA,CAA8B;AAAA,QACjC,cAAA;AAAA,QACA,SAAA,EAAW,CAAA,IAAA,KAAQ,CAAA,CAAE,GAAA,CAAI,OAAO,IAAI;AAAA,OACrC,CAAA;AAGD,MAAA,CAAA,CAAE,GAAA,CAAI,kBAAkB,cAAc,CAAA;AACtC,MAAA,CAAA,CAAE,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAC3B,MAAA,CAAA,CAAE,GAAA,CAAI,iBAAA,EAAmB,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AACzC,MAAA,CAAA,CAAE,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,SAAS,CAAA;AACjC,MAAA,CAAA,CAAE,GAAA,CAAI,aAAA,EAAe,CAAA,CAAE,GAAA,CAAI,IAAI,MAAM,CAAA;AACrC,MAAA,CAAA,CAAE,GAAA,CAAI,uBAAA,EAAyB,IAAA,CAAK,qBAAqB,CAAA;AAEzD,MAAA,OAAO,IAAA,EAAK;AAAA,IACd,CAAA;AAAA,EACF;AAAA,EACA,MAAM,MAAA,CAAO,KAAA,EAAoB,GAAA,EAAc,MAAA,EAAsD;AACnG,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,IAAgB,QAAA;AAE3C,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,GAAA,CAAI,MAAA,CAAO,gBAAgB,mBAAmB,CAAA;AAC9C,MAAA,GAAA,CAAI,MAAA,CAAO,iBAAiB,UAAU,CAAA;AACtC,MAAA,GAAA,CAAI,MAAA,CAAO,cAAc,YAAY,CAAA;AACrC,MAAA,GAAA,CAAI,MAAA,CAAO,qBAAqB,IAAI,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,MAAA,CAAO,gBAAgB,YAAY,CAAA;AAAA,IACzC;AACA,IAAA,GAAA,CAAI,MAAA,CAAO,qBAAqB,SAAS,CAAA;AAEzC,IAAA,OAAOC,gBAAA;AAAA,MACL,GAAA;AAAA,MACA,OAAMA,OAAAA,KAAU;AACd,QAAA,IAAI,YAAA,KAAiB,KAAA,IAAS,KAAA,CAAM,iBAAA,EAAmB;AACrD,UAAA,MAAMA,OAAAA,CAAO,MAAM,iBAAiB,CAAA;AAAA,QACtC;AAEA,QAAA,MAAM,cAAA,GAAiB,MAAA,YAAkB,cAAA,GAAiB,MAAA,GAAS,MAAA,CAAO,UAAA;AAC1E,QAAA,MAAM,MAAA,GAAS,eAAe,SAAA,EAAU;AAExC,QAAAA,OAAAA,CAAO,QAAQ,MAAM;AACnB,UAAA,KAAK,MAAA,CAAO,OAAO,iBAAiB,CAAA;AAAA,QACtC,CAAC,CAAA;AAED,QAAA,IAAI;AACF,UAAA,OAAO,IAAA,EAAM;AACX,YAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,YAAA,IAAI,IAAA,EAAM;AAEV,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,IAAI,YAAA,KAAiB,SAAS,OAAO,KAAA,KAAU,YAAY,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAChF,gBAAA,MAAMA,OAAAA,CAAO,MAAM,KAAK,CAAA;AACxB,gBAAA;AAAA,cACF;AAGA,cAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,EAAe,MAAA,IAAU,IAAA;AACnD,cAAA,MAAM,WAAA,GAAc,YAAA,GAAeC,+BAAA,CAAkB,KAAK,CAAA,GAAI,KAAA;AAE9D,cAAA,MAAM,UAAA,GAAaC,mCAAqB,WAAW,CAAA;AACnD,cAAA,IAAI,CAAC,WAAW,EAAA,EAAI;AAClB,gBAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,4CAAA,EAA8C;AAAA,kBAC3E,MAAM,KAAA,CAAM,IAAA;AAAA,kBACZ,WAAY,WAAA,EAAmC,IAAA;AAAA,kBAC/C,KAAA,EAAO,WAAW,KAAA,CAAM;AAAA,iBACzB,CAAA;AACD,gBAAA;AAAA,cACF;AACA,cAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,gBAAA,MAAMF,OAAAA,CAAO,KAAA,CAAM,CAAA,MAAA,EAAS,UAAA,CAAW,IAAI;;AAAA,CAAM,CAAA;AAAA,cACnD,CAAA,MAAO;AACL,gBAAA,MAAMA,OAAAA,CAAO,KAAA,CAAM,UAAA,CAAW,IAAA,GAAO,GAAM,CAAA;AAAA,cAC7C;AAAA,YACF;AAAA,UACF;AAEA,UAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,YAAA,MAAMA,OAAAA,CAAO,MAAM,kBAAkB,CAAA;AAAA,UACvC;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,4BAAA,EAA8B;AAAA,YAC3D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,WAClF,CAAA;AAAA,QACH,CAAA,SAAE;AACA,UAAA,MAAMA,QAAO,KAAA,EAAM;AAAA,QACrB;AAAA,MACF,CAAA;AAAA,MACA,OAAM,GAAA,KAAO;AACX,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,uBAAA,EAAyB;AAAA,UACtD,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM,GAAI;AAAA,SAC5E,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,KAAA,EAAoB,OAAA,EAAoD;AACtF,IAAA,MAAM,SAAA,GAAY,QAAQ,KAAA,EAAM;AAEhC,IAAA,MAAM,WAAA,GAAcG,kCAAA,CAAqB,OAAA,CAAQ,OAAA,EAAS,CAAA;AAC1D,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,cAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AAC9G,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAA,IAAK,EAAA;AAEtD,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,qBAAqB,CAAA,EAAG;AAC/C,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,QAAA,EAAS;AACxC,UAAA,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAAA,QAC1C,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,qCAAA,EAAuC;AAAA,YACpE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,WAClF,CAAA;AAED,UAAA,IAAI,KAAA,YAAiB,SAAS,KAAA,CAAM,OAAA,CAAQ,aAAY,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1E,YAAA,MAAM,KAAA;AAAA,UACR;AACA,UAAA,cAAA,GAAiB;AAAA,YACf,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WACpD;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAGnD,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAM;AACpC,QAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,IAAA,EAAK;AAEtC,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAE1C,UAAA,IAAI;AACF,YAAA,IAAA,GAAO,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,UAC5B,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,2BAAA,EAA6B;AAAA,cAC1D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,aAClF,CAAA;AAED,YAAA,cAAA,GAAiB;AAAA,cACf,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,aACpD;AAAA,UACF;AAAA,QACF;AAAA,MAEF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,cAAA,EAAe;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,QAAA,EAAsD;AAChF,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,QAAA,CAAS,SAAQ,EAAG;AAC7C,MAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,QAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,WAAA,EAAY;AAC5C,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,MACvC,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AAEpC,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,QAChC,CAAA,CAAA,MAAQ;AACN,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,QAChB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAA,CAAa,KAAA,EAAoB,QAAA,EAAmB,QAAiB,MAAA,EAA+B;AACxG,IAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,IAAA,CAAK,MAAA,IAAU,EAAA;AAGhD,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,sBAAsB,MAAA,EAAQ;AACxE,MAAA,MAAM,iBAAkB,MAAA,CAAe,gBAAA;AACvC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AACzD,QAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,OAAQ,MAAA,CAAe,gBAAA;AAAA,IACzB;AAEA,IAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAQ;AACjC,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,MAAA,EAAe,GAAG,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,QAAA,EAAU;AAC1C,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,MAAwC,CAAA;AAAA,IAC9E,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,qBAAA,EAAuB;AACvD,MAAA,MAAM,aAAA,GAAgB,MAAA;AACtB,MAAA,OAAO,aAAA;AAAA,IACT,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,UAAA,EAAY;AAE5C,MAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,iBAAgB,GAAI,MAAA;AAC1D,MAAA,MAAM,EAAE,GAAA,EAAK,GAAA,KAAQC,oBAAA,CAAS,QAAA,CAAS,IAAI,GAAG,CAAA;AAG9C,MAAA,MAAM,UAAU,EAAE,GAAG,IAAA,CAAK,UAAA,EAAY,GAAG,eAAA,EAAgB;AAKzD,MAAA,MAAA,CACG,SAAA,CAAU;AAAA,QACT,GAAA,EAAK,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,GAAG,CAAA;AAAA,QAC7B,QAAA,EAAU,CAAA,EAAG,cAAc,CAAA,EAAG,QAAQ,CAAA,CAAA;AAAA,QACtC,GAAA;AAAA,QACA,GAAA;AAAA,QACA,SAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU;AAAA,OACtD,CAAA,CACA,KAAA,CAAM,CAAC,CAAA,KAAe;AACrB,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,2CAAA,EAA6C;AAAA,UAC1E,KAAA,EAAO,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,EAAS,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI;AAAA,SACtE,CAAA;AACD,QAAA,IAAI;AACF,UAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,YAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,YAAA,GAAA,CAAI,GAAA;AAAA,cACF,KAAK,SAAA,CAAU;AAAA,gBACb,OAAA,EAAS,KAAA;AAAA,gBACT,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,uBAAA,EAAwB;AAAA,gBACxD,EAAA,EAAI;AAAA,eACL;AAAA,aACH;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAC,CAAA;AAEH,MAAA,OAAO,MAAMC,4BAAgB,GAAG,CAAA;AAAA,IAClC,CAAA,MAAA,IAAW,KAAA,CAAM,YAAA,KAAiB,SAAA,EAAW;AAE3C,MAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAY,GAAI,MAAA;AAEzC,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,OAAO,YAAA,CAAa;AAAA,UAC/B,GAAA,EAAK,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,GAAG,CAAA;AAAA,UAC7B,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,EAAG,OAAO,CAAA,CAAA;AAAA,UACpC,WAAA,EAAa,CAAA,EAAG,cAAc,CAAA,EAAG,WAAW,CAAA,CAAA;AAAA,UAC5C,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,SAAS,IAAA,CAAK,EAAE,KAAA,EAAO,gCAAA,IAAoC,GAAG,CAAA;AAAA,MACvE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAO,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,GAAA,EACA,KAAA,EACA,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAyB,EAAC,EACjC;AAEf,IAAA,MAAM,MAAA,GAAS,WAAA,IAAe,IAAA,CAAK,MAAA,IAAU,EAAA;AAG7C,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,gBAAA,IAAoB,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAA;AAGlH,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,IAAe,IAAA,CAAK,gBAAA,EAAkB,OAAA;AAG5D,IAAA,MAAM,cAAmC,EAAC;AAE1C,IAAA,IAAI,oBAAA,IAAwB,OAAA,IAAW,IAAA,CAAK,gBAAA,EAAkB;AAC5D,MAAA,WAAA,CAAY,IAAA;AAAA,QACVC,mBAAA,CAAU;AAAA,UACR,OAAA;AAAA,UACA,OAAA,EAAS,KAAK,gBAAA,CAAiB;AAAA,SAChC;AAAA,OACH;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,WAAA,EAAoE,CAAA;AAAA,MACnF,CAAA,EAAG,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,MACtB,GAAG,WAAA;AAAA,MACH,OAAO,CAAA,KAAe;AAEpB,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO;AAAA,UAClD,IAAA,EAAM,EAAE,GAAA,CAAI,IAAA;AAAA,UACZ,MAAA,EAAQ,EAAE,GAAA,CAAI,MAAA;AAAA,UACd,SAAA,EAAW,CAAA,IAAA,KAAQ,CAAA,CAAE,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,UACpC,QAAA,EAAU,CAAA,IAAA,KAAQ,CAAA,CAAE,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,UAClC,cAAA,EAAgB,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA;AAAA,UACtC,OAAA,EAAS,EAAE,GAAA,CAAI,GAAA;AAAA,UACf,uBAAuB,MAAM;AAAA,SAC9B,CAAA;AAED,QAAA,IAAI,UAAA,EAAY;AAEd,UAAA,IAAI,WAAW,OAAA,EAAS;AACtB,YAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7D,cAAA,CAAA,CAAE,MAAA,CAAO,KAAK,KAAe,CAAA;AAAA,YAC/B;AAAA,UACF;AAGA,UAAA,IAAI,WAAW,KAAA,EAAO;AACpB,YAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,WAAW,KAAA,EAAM,EAAG,WAAW,MAAa,CAAA;AAAA,UACrE;AAAA,QACF;AAEA,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,EAAE,GAAG,CAAA;AAGhD,QAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,UAAA,OAAO,CAAA,CAAE,IAAA;AAAA,YACP;AAAA,cACE,KAAA,EAAO,sBAAA;AAAA,cACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,QAAQ,OAAA,EAAS,MAAA,CAAO,cAAA,CAAe,OAAA,EAAS;AAAA,aACpE;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAEA,QAAA,IAAI,OAAO,WAAA,EAAa;AACtB,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,cAAc,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,OAAO,WAAW,CAAA;AAAA,UAC5E,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,4BAAA,EAA8B;AAAA,cAC3D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,aAClF,CAAA;AACD,YAAA,IAAIC,wBAAA,CAAW,KAAK,CAAA,EAAG;AACrB,cAAA,MAAM,EAAE,QAAQ,IAAA,EAAK,GAAI,KAAK,sBAAA,CAAuB,KAAA,EAAO,OAAO,OAAO,CAAA;AAC1E,cAAA,OAAO,CAAA,CAAE,IAAA,CAAK,IAAA,EAAa,MAAa,CAAA;AAAA,YAC1C;AACA,YAAA,OAAO,CAAA,CAAE,IAAA;AAAA,cACP;AAAA,gBACE,KAAA,EAAO,0BAAA;AAAA,gBACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAiB;AAAA,eAClG;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,UACvD,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,oBAAA,EAAsB;AAAA,cACnD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,aAClF,CAAA;AACD,YAAA,IAAIA,wBAAA,CAAW,KAAK,CAAA,EAAG;AACrB,cAAA,MAAM,EAAE,QAAQ,IAAA,EAAK,GAAI,KAAK,sBAAA,CAAuB,KAAA,EAAO,OAAO,MAAM,CAAA;AACzE,cAAA,OAAO,CAAA,CAAE,IAAA,CAAK,IAAA,EAAa,MAAa,CAAA;AAAA,YAC1C;AACA,YAAA,OAAO,CAAA,CAAE,IAAA;AAAA,cACP;AAAA,gBACE,KAAA,EAAO,sBAAA;AAAA,gBACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAiB;AAAA,eAClG;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,YAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,OAAO,SAAS,CAAA;AAAA,UACvE,SAAS,KAAA,EAAO;AACd,YAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,2BAAA,EAA6B;AAAA,cAC1D,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAA,aAClF,CAAA;AACD,YAAA,IAAIA,wBAAA,CAAW,KAAK,CAAA,EAAG;AACrB,cAAA,MAAM,EAAE,QAAQ,IAAA,EAAK,GAAI,KAAK,sBAAA,CAAuB,KAAA,EAAO,OAAO,MAAM,CAAA;AACzE,cAAA,OAAO,CAAA,CAAE,IAAA,CAAK,IAAA,EAAa,MAAa,CAAA;AAAA,YAC1C;AACA,YAAA,OAAO,CAAA,CAAE,IAAA;AAAA,cACP;AAAA,gBACE,KAAA,EAAO,yBAAA;AAAA,gBACP,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAiB;AAAA,eAClG;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,aAAA,GAAgB;AAAA,UACpB,GAAG,MAAA,CAAO,SAAA;AAAA,UACV,GAAG,MAAA,CAAO,WAAA;AAAA,UACV,GAAI,OAAO,MAAA,CAAO,SAAS,QAAA,GAAW,MAAA,CAAO,OAAO,EAAC;AAAA,UACrD,cAAA,EAAgB,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA;AAAA,UACtC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,eAAA,EAAiB,CAAA,CAAE,GAAA,CAAI,iBAAiB,CAAA;AAAA,UACxC,SAAA,EAAW,CAAA,CAAE,GAAA,CAAI,WAAW,CAAA;AAAA,UAC5B,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,aAAa,CAAA;AAAA,UAChC,WAAA,EAAa,MAAA;AAAA,UACb,OAAA,EAAS,EAAE,GAAA,CAAI;AAAA;AAAA,SACjB;AAKA,QAAA,MAAM,cAAA,GAAiB,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA;AAE7C,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,SAAA,MAAe,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,IAAA;AAC5E,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AAC9C,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,GAAA,CAAI,yBAAyB,CAAA;AACpE,YAAA,MAAM,kBAAkB,IAAA,CAAK,oBAAA,CAAqB,KAAA,EAAO,eAAA,EAAiB,eAAe,cAAc,CAAA;AAEvG,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,OAAO,CAAA,CAAE,IAAA;AAAA,gBACP;AAAA,kBACE,OAAO,eAAA,CAAgB,KAAA;AAAA,kBACvB,SAAS,eAAA,CAAgB;AAAA,iBAC3B;AAAA,gBACA,eAAA,CAAgB;AAAA,eAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,QAAA,GAAW,MAAMC,2BAAA,CAAc,IAAA,CAAK,QAAQ,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA,EAAG;AAAA,UAChF,GAAG,MAAA,CAAO,SAAA;AAAA,UACV,GAAG,MAAA,CAAO,WAAA;AAAA,UACV,GAAI,OAAO,MAAA,CAAO,SAAS,QAAA,GAAW,MAAA,CAAO,OAAO;AAAC,SACtD,CAAA;AACD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,OAAA,EAAQ,EAAG,QAAA,CAAS,MAAa,CAAA;AAAA,QAC5F;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA;AAChD,UAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,CAAA,EAAG,QAAQ,MAAM,CAAA;AAAA,QACnD,SAAS,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,KAAA,CAAM,uBAAA,EAAyB;AAAA,YACtD,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI,KAAA;AAAA,YACjF,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,QAAQ,KAAA,CAAM;AAAA,WACf,CAAA;AAED,UAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AAEtC,YAAA,IAAI,YAAY,KAAA,EAAO;AACrB,cAAA,MAAM,SAAU,KAAA,CAAc,MAAA;AAC9B,cAAA,IAAI,SAAA;AACJ,cAAA,IAAI;AACF,gBAAA,MAAM,GAAA,GAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AACnD,gBAAA,IACE,GAAA,IACA,OAAO,GAAA,KAAQ,QAAA,IACf,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,IAClB,kBAAkB,GAAA,IAClB,KAAA,CAAM,OAAA,CAAS,GAAA,CAAY,YAAY,CAAA,EACvC;AACA,kBAAA,SAAA,GAAY,EAAE,YAAA,EAAe,GAAA,CAAY,YAAA,EAAa;AAAA,gBACxD;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAER;AACA,cAAA,OAAO,CAAA,CAAE,IAAA;AAAA,gBACP;AAAA,kBACE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,kBAChD,GAAI,SAAA,GAAY,EAAE,KAAA,EAAO,SAAA,KAAc;AAAC,iBAC1C;AAAA,gBACA;AAAA,eACF;AAAA,YACF;AAEA,YAAA,IAAI,SAAA,IAAa,KAAA,IAAS,KAAA,CAAM,OAAA,IAAW,OAAO,MAAM,OAAA,KAAY,QAAA,IAAY,QAAA,IAAY,KAAA,CAAM,OAAA,EAAS;AACzG,cAAA,MAAM,MAAA,GAAU,MAAM,OAAA,CAAgB,MAAA;AACtC,cAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAgB,EAAG,MAAM,CAAA;AAAA,YAC3F;AAAA,UACF;AACA,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAA,EAAgB,EAAG,GAAG,CAAA;AAAA,QACxF;AAAA,MACF;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,uBAAA,GAAyC;AAC7C,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,uBAAA,EAAwB,EAAI;AAE7C,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,IAAmB,IAAA,CAAK,OAAO,SAAA,EAAU,EAAG,aAAa,EAAC;AAE9E,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,WAAA,GAA2B;AAAA,QAC/B,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,YAAA,EAAc,MAAA;AAAA,QACd,SAAS,YAAY;AAAA,QAAC,CAAA;AAAA,QACtB,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,QAC1B,KAAK,KAAA,CAAM;AAAA,OACb;AAEA,MAAA,MAAM,YAAA,GAAkC,OAAO,CAAA,KAAe;AAE5D,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,cAAA,CAAe,WAAA,EAAa;AAAA,UACvD,IAAA,EAAM,EAAE,GAAA,CAAI,IAAA;AAAA,UACZ,MAAA,EAAQ,EAAE,GAAA,CAAI,MAAA;AAAA,UACd,SAAA,EAAW,CAAA,IAAA,KAAQ,CAAA,CAAE,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,UACpC,QAAA,EAAU,CAAA,IAAA,KAAQ,CAAA,CAAE,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,UAClC,cAAA,EAAgB,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA;AAAA,UACtC,OAAA,EAAS,EAAE,GAAA,CAAI,GAAA;AAAA,UACf,uBAAuB,MAAM;AAAA,SAC9B,CAAA;AAED,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAI,UAAU,OAAA,EAAS;AACrB,YAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,SAAA,CAAU,OAAO,CAAA,EAAG;AAC5D,cAAA,CAAA,CAAE,MAAA,CAAO,KAAK,KAAe,CAAA;AAAA,YAC/B;AAAA,UACF;AACA,UAAA,IAAI,UAAU,KAAA,EAAO;AACnB,YAAA,OAAO,CAAA,CAAE,KAAK,EAAE,KAAA,EAAO,UAAU,KAAA,EAAM,EAAG,UAAU,MAAa,CAAA;AAAA,UACnE;AAAA,QACF;AAEA,QAAA,MAAM,cAAA,GAAiB,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA;AAE7C,QAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,SAAA,MAAe,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,EAAG,IAAA;AAC5E,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,aAAA,GAAgB,MAAM,iBAAA,EAAkB;AAC9C,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,GAAA,CAAI,yBAAyB,CAAA;AACpE,YAAA,MAAM,kBAAkB,IAAA,CAAK,oBAAA;AAAA,cAC3B,WAAA;AAAA,cACA,eAAA;AAAA,cACA,aAAA;AAAA,cACA;AAAA,aACF;AACA,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,OAAO,CAAA,CAAE,IAAA;AAAA,gBACP,EAAE,KAAA,EAAO,eAAA,CAAgB,KAAA,EAAO,OAAA,EAAS,gBAAgB,OAAA,EAAQ;AAAA,gBACjE,eAAA,CAAgB;AAAA,eAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,aAAsC,EAAC;AAC3C,QAAA,MAAM,WAAA,GAAc,CAAA,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA;AAC/C,QAAA,IAAI,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC7C,UAAA,IAAI;AACF,YAAA,MAAM,OAAQ,MAAM,CAAA,CAAE,IAAI,GAAA,CAAI,KAAA,GAAQ,IAAA,EAAK;AAC3C,YAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,cAAA,UAAA,GAAa,IAAA;AAAA,YACf;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA,UAAA,GAAa,EAAC;AAAA,UAChB;AAAA,QACF,CAAA,MAAA,IACE,aAAa,QAAA,CAAS,mCAAmC,KACzD,WAAA,EAAa,QAAA,CAAS,qBAAqB,CAAA,EAC3C;AACA,UAAA,IAAI;AACF,YAAA,UAAA,GAAa,MAAA,CAAO,YAAY,MAAM,CAAA,CAAE,IAAI,GAAA,CAAI,KAAA,EAAM,CAAE,QAAA,EAAU,CAAA;AAAA,UACpE,CAAA,CAAA,MAAQ;AACN,YAAA,UAAA,GAAa,EAAC;AAAA,UAChB;AAAA,QACF;AACA,QAAA,MAAM,QAAA,GAAW,MAAMA,2BAAA,CAAc,IAAA,CAAK,QAAQ,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,gBAAgB,CAAA,EAAG;AAAA,UACtF,GAAG,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAAA,UACf,GAAG,MAAA,CAAO,WAAA,CAAY,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,YAAA,CAAa,OAAA,EAAS,CAAA;AAAA,UAC/D,GAAG;AAAA,SACJ,CAAA;AACD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,OAAA,EAAQ,EAAG,QAAA,CAAS,MAAa,CAAA;AAAA,QAC5F;AAEA,QAAA,MAAM,aAA4D,EAAC;AACnE,QAAA,CAAA,CAAE,IAAI,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM;AAClC,UAAA,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA;AAAA,QAClB,CAAC,CAAA;AACD,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,wBAAA;AAAA,UAC1B,EAAE,GAAA,CAAI,GAAA;AAAA,UACN,EAAE,GAAA,CAAI,MAAA;AAAA,UACN,UAAA;AAAA,UACA,CAAA,CAAE,IAAI,GAAA,CAAI,IAAA;AAAA,UACV,CAAA,CAAE,IAAI,gBAAgB,CAAA;AAAA,UACtB,CAAA,CAAE,IAAI,GAAA,CAAI;AAAA,SACZ;AACA,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAO,EAAE,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,IAAe,GAAG,CAAA;AAAA,QAC3C;AACA,QAAA,OAAO,QAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY;AACxC,MAAA,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,YAAY,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,yBAAA,GAAkC;AAChC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,yBAAyB,CAAA;AAAA,EAClD;AAAA,EAEA,sBAAA,GAA+B;AAAA,EAG/B;AAAA,EAEA,6BAAA,GAAsC;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,iBAAA,EAAmB,OAAA,EAAS;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,OAAO,GAAG,IAAA,KAAS;AACnC,MAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA,EAAG;AACtC,QAAA,OAAO,IAAA,EAAK;AAAA,MACd;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,MAAA,MAAM,IAAA,GAAO,EAAE,GAAA,CAAI,IAAA;AAEnB,MAAA,MAAM,IAAA,EAAK;AAEX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,EAAE,GAAA,CAAI,MAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,EAAmB,KAAA,IAAS,MAAA;AAE/C,MAAA,MAAM,OAAA,GAA+B;AAAA,QACnC,MAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,EAAU,GAAG,QAAQ,CAAA,EAAA;AAAA,OACvB;AAEA,MAAA,IAAI,IAAA,CAAK,mBAAmB,kBAAA,EAAoB;AAC9C,QAAA,OAAA,CAAQ,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,KAAA,EAAM;AAAA,MAC9B;AAEA,MAAA,IAAI,IAAA,CAAK,mBAAmB,cAAA,EAAgB;AAC1C,QAAA,MAAM,OAAA,GAAU,OAAO,WAAA,CAAY,CAAA,CAAE,IAAI,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA;AAC9D,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,aAAA,IAAiB,EAAC;AAC/D,QAAA,aAAA,CAAc,QAAQ,CAAA,CAAA,KAAK;AACzB,UAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAY;AAC1B,UAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,MAAA,EAAW;AAC9B,YAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,YAAA;AAAA,UACjB;AAAA,QACF,CAAC,CAAA;AACD,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,MACpB;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,CAAA,EAAM,OAAO,CAAA;AAAA,IACzE,CAAC,CAAA;AAAA,EACH;AACF","file":"index.cjs","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, MiddlewareHandler } from 'hono';\n\nexport interface HonoAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: HonoAuthMiddlewareOptions): MiddlewareHandler {\n return async (c: Context, next) => {\n if (!requiresAuth) {\n return next();\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return next();\n }\n\n const requestContext = c.get('requestContext') ?? new RequestContext();\n c.set('requestContext', requestContext);\n c.set('mastra', c.get('mastra') ?? mastra);\n\n const path = c.req.path;\n const method = c.req.method;\n const customRouteAuthConfig = new Map<string, boolean>(c.get('customRouteAuthConfig') ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = c.req.header('Authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = c.req.query('apiKey') || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => c.req.header(name),\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: c.req.raw,\n token,\n buildAuthorizeContext: () => c,\n });\n\n if (result.action === 'next') {\n return next();\n }\n\n return c.json(result.body as any, result.status as any);\n };\n}\n","import type { createNodeWebSocket as CreateNodeWebSocket } from '@hono/node-ws';\nimport { handleInputMessage, ViewerRegistry } from '@mastra/server/browser-stream';\nimport type { BrowserStreamConfig, BrowserStreamResult } from '@mastra/server/browser-stream';\nimport type { Env, Hono, Schema } from 'hono';\n\n/**\n * Set up WebSocket-based browser stream endpoint for real-time screencast viewing.\n *\n * Creates a WebSocket route at `/browser/:agentId/stream` that:\n * - Accepts viewer connections\n * - Starts screencast when first viewer connects\n * - Broadcasts frames to all connected viewers\n * - Stops screencast when last viewer disconnects\n *\n * **Note**: Requires `ws` package to be installed. If not available, returns null\n * and logs a warning. Browser streaming will be disabled but everything else works.\n *\n * @param app - The Hono application instance\n * @param config - Configuration for browser stream\n * @returns Object containing injectWebSocket function and registry instance, or null if ws is not available\n *\n * @example\n * ```typescript\n * import { Hono } from 'hono';\n * import { serve } from '@hono/node-server';\n * import { setupBrowserStream } from '@mastra/hono';\n *\n * const app = new Hono();\n * const browserStream = await setupBrowserStream(app, {\n * getToolset: (agentId) => browserToolsets.get(agentId),\n * });\n *\n * const server = serve({ fetch: app.fetch, port: 4111 });\n * browserStream?.injectWebSocket(server);\n * ```\n */\nexport async function setupBrowserStream<E extends Env, S extends Schema, B extends string>(\n app: Hono<E, S, B>,\n config: BrowserStreamConfig,\n): Promise<BrowserStreamResult | null> {\n // Dynamic import to avoid bundling ws into non-Node environments (e.g. Cloudflare Workers).\n // The variable-based specifier prevents bundlers from resolving the module at build time.\n let createNodeWebSocket: typeof CreateNodeWebSocket;\n try {\n const mod = '@hono/node-ws';\n const honoNodeWs = await import(/* @vite-ignore */ /* webpackIgnore: true */ mod);\n createNodeWebSocket = honoNodeWs.createNodeWebSocket;\n } catch {\n // @hono/node-ws is not available (e.g. no ws package installed).\n // This is expected in non-Node environments — silently disable browser streaming.\n return null;\n }\n\n const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });\n const registry = new ViewerRegistry();\n\n // Normalize the API prefix so we can build paths like `${apiPrefix}/agents/...`\n // without producing `//agents/...` when the prefix is missing or has a single\n // trailing slash. Anything weirder than that (e.g. `'/api//'`) is a config\n // bug we don't try to silently fix.\n const rawPrefix = config.apiPrefix ?? '/api';\n const trimmed = rawPrefix.endsWith('/') ? rawPrefix.slice(0, -1) : rawPrefix;\n const apiPrefix = trimmed || '/api';\n\n app.get(\n '/browser/:agentId/stream',\n upgradeWebSocket(c => {\n const agentId = c.req.param('agentId')!;\n const threadId = c.req.query('threadId');\n // Use composite key for thread-scoped screencasts\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n return {\n onOpen(_event, ws) {\n // Send connected status immediately\n ws.send(JSON.stringify({ status: 'connected' }));\n\n // Add to registry (starts screencast if first viewer)\n // Fire-and-forget: screencast starts asynchronously\n // Pass agentId for toolset lookup, but viewerKey for registry scoping\n void registry.addViewer(viewerKey, ws, config.getToolset, agentId, threadId);\n },\n\n onMessage(event, _ws) {\n const data = typeof event.data === 'string' ? event.data : null;\n if (data) {\n void handleInputMessage(data, config.getToolset, agentId, threadId);\n }\n },\n\n onClose(_event, ws) {\n // Remove from registry (stops screencast if last viewer)\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n\n onError(event, ws) {\n console.error('[BrowserStream] WebSocket error:', event);\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n };\n }),\n );\n\n // Browser session probe endpoint - tells the client whether to open a WS.\n // Returns:\n // - screencastAvailable: true (this route only exists if setupBrowserStream succeeded)\n // - hasSession: whether the agent has an active browser session for the given thread\n app.get(`${apiPrefix}/agents/:agentId/browser/session`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const threadId = c.req.query('threadId');\n const toolset = await config.getToolset(agentId);\n\n if (!toolset) {\n return c.json({ hasSession: false, screencastAvailable: true });\n }\n\n const hasSession = threadId ? toolset.hasThreadSession(threadId) : false;\n return c.json({ hasSession, screencastAvailable: true });\n });\n\n // Close browser session endpoint\n app.post(`${apiPrefix}/agents/:agentId/browser/close`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const toolset = await config.getToolset(agentId);\n if (!toolset) {\n return c.json({ error: 'No browser session for this agent' }, 404);\n }\n\n try {\n // Parse threadId from request body\n let threadId: string | undefined;\n try {\n const body = await c.req.json();\n threadId = body?.threadId;\n } catch {\n // No body or invalid JSON - proceed without threadId\n }\n\n const scope = toolset.getScope();\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n // For thread scope with a threadId, close only that thread's session\n if (scope === 'thread' && threadId) {\n // Close the session in the registry (stops screencast for this thread)\n await registry.closeBrowserSession(viewerKey);\n\n // Close just this thread's browser session\n if ('closeThreadSession' in toolset && typeof toolset.closeThreadSession === 'function') {\n await toolset.closeThreadSession(threadId);\n }\n } else {\n // For shared scope or no threadId, close the entire browser\n await registry.closeBrowserSession(viewerKey);\n await toolset.close();\n }\n\n return c.json({ success: true });\n } catch (error) {\n console.error(`[BrowserStream] Error closing browser for ${agentId}:`, error);\n return c.json({ error: 'Failed to close browser' }, 500);\n }\n });\n\n return { injectWebSocket: injectWebSocket as (server: unknown) => void, registry };\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\n\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nimport type { Context, HonoRequest, MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { stream } from 'hono/streaming';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { HonoAuthMiddlewareOptions } from './auth-middleware';\n// Browser stream setup (Hono-specific WebSocket implementation)\nexport { setupBrowserStream } from './browser-stream';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/hono] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Hono app configuration\nexport type HonoVariables = {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n cachedBody?: unknown;\n};\n\nexport type HonoBindings = {};\n\n/**\n * Generic handler function type compatible across Hono versions.\n * Uses a minimal signature that all Hono middleware handlers satisfy.\n */\ntype HonoRouteHandler = (...args: any[]) => any;\n\n/**\n * Minimal interface representing what MastraServer needs from a Hono app.\n * This allows any Hono app instance to be passed without strict generic matching,\n * avoiding the version mismatch issues that occur with Hono's strict generic types.\n */\nexport interface HonoApp {\n use(path: string, ...handlers: HonoRouteHandler[]): unknown;\n get(path: string, ...handlers: HonoRouteHandler[]): unknown;\n post(path: string, ...handlers: HonoRouteHandler[]): unknown;\n put(path: string, ...handlers: HonoRouteHandler[]): unknown;\n delete(path: string, ...handlers: HonoRouteHandler[]): unknown;\n patch(path: string, ...handlers: HonoRouteHandler[]): unknown;\n all(path: string, ...handlers: HonoRouteHandler[]): unknown;\n}\n\nexport class MastraServer extends MastraServerBase<HonoApp, HonoRequest, Context> {\n createContextMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n // Patch req.json() to prevent \"Body is unusable\" errors when the body is read multiple times\n // e.g. by middleware and then by an agent.\n const originalJson = c.req.json.bind(c.req);\n let jsonPromise: Promise<any> | undefined;\n\n c.req.json = () => {\n if (!jsonPromise) {\n jsonPromise = originalJson().then(body => {\n // Cache in context if needed explicitly, though the promise memoization handles the reuse\n c.set('cachedBody', body);\n return body;\n });\n }\n return jsonPromise;\n };\n\n // Parse request context from request body and add to context\n\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (c.req.method === 'POST' || c.req.method === 'PUT') {\n const contentType = c.req.header('content-type');\n const contentLength = c.req.header('content-length');\n // Only parse if content-type is JSON and body is not empty\n if (contentType?.includes('application/json') && contentLength !== '0') {\n try {\n const body = (await c.req.raw.clone().json()) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (c.req.method === 'GET') {\n try {\n const encodedRequestContext = c.req.query('requestContext');\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => c.req.header(name),\n });\n\n // Add relevant contexts to hono context\n c.set('requestContext', requestContext);\n c.set('mastra', this.mastra);\n c.set('registeredTools', this.tools || {});\n c.set('taskStore', this.taskStore);\n c.set('abortSignal', c.req.raw.signal);\n c.set('customRouteAuthConfig', this.customRouteAuthConfig);\n\n return next();\n };\n }\n async stream(route: ServerRoute, res: Context, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.header('Content-Type', 'text/event-stream');\n res.header('Cache-Control', 'no-cache');\n res.header('Connection', 'keep-alive');\n res.header('X-Accel-Buffering', 'no');\n } else {\n res.header('Content-Type', 'text/plain');\n }\n res.header('Transfer-Encoding', 'chunked');\n\n return stream(\n res,\n async stream => {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n await stream.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n stream.onAbort(() => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n await stream.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n await stream.write(`data: ${serialized.json}\\n\\n`);\n } else {\n await stream.write(serialized.json + '\\x1E');\n }\n }\n }\n\n if (streamFormat === 'sse') {\n await stream.write('data: [DONE]\\n\\n');\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n await stream.close();\n }\n },\n async err => {\n this.mastra.getLogger()?.error('Stream error callback', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n },\n );\n }\n\n async getParams(route: ServerRoute, request: HonoRequest): Promise<ParsedRequestParams> {\n const urlParams = request.param();\n // Use queries() to get all values for repeated params (e.g., ?tags=a&tags=b -> { tags: ['a', 'b'] })\n const queryParams = normalizeQueryParams(request.queries());\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.header('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Clone the request to read the body text first\n // This allows us to check if there's actual content before parsing\n const clonedReq = request.raw.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n // There's actual content - try to parse it as JSON\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Track JSON parse error to return 400 Bad Request\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n // Empty body is ok - body remains undefined\n }\n }\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n */\n private async parseFormData(formData: FormData): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of formData.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Context, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.header(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return response.json(result as any, 200);\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n return fetchResponse;\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n const { req, res } = toReqRes(response.req.raw);\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(response.req.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n try {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n } catch {\n // Response stream already closed or destroyed - nothing more to do\n }\n });\n\n return await toFetchResponse(res);\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n return await server.startHonoSSE({\n url: new URL(response.req.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n context: response,\n });\n } catch {\n return response.json({ error: 'Error handling MCP SSE request' }, 500);\n }\n } else {\n return response.status(500);\n }\n }\n\n async registerRoute(\n app: HonoApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Build middleware array\n const middlewares: MiddlewareHandler[] = [];\n\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n middlewares.push(\n bodyLimit({\n maxSize,\n onError: this.bodyLimitOptions.onError as any,\n }),\n );\n }\n\n app[route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all'](\n `${prefix}${route.path}`,\n ...middlewares,\n async (c: Context) => {\n // Check route-level authentication/authorization\n const authResult = await this.checkRouteAuth(route, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authResult) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n c.header(key, value as string);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return c.json({ error: authResult.error }, authResult.status as any);\n }\n }\n\n const params = await this.getParams(route, c.req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed JSON)\n if (params.bodyParseError) {\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n },\n 400,\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: c.get('requestContext'),\n mastra: this.mastra,\n registeredTools: c.get('registeredTools'),\n taskStore: c.get('taskStore'),\n abortSignal: c.get('abortSignal'),\n routePrefix: prefix,\n request: c.req.raw, // Standard Request object with headers/cookies\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);\n\n if (permissionError) {\n return c.json(\n {\n error: permissionError.error,\n message: permissionError.message,\n },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, c.get('requestContext'), {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, c, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Check if it's an HTTPException or MastraError with a status code\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n const status = (error as any).status;\n let safeCause: { failingItems: unknown[] } | undefined;\n try {\n const raw = error instanceof Error ? error.cause : undefined;\n if (\n raw &&\n typeof raw === 'object' &&\n !Array.isArray(raw) &&\n 'failingItems' in raw &&\n Array.isArray((raw as any).failingItems)\n ) {\n safeCause = { failingItems: (raw as any).failingItems };\n }\n } catch {\n // serialization or access error — omit cause\n }\n return c.json(\n {\n error: error instanceof Error ? error.message : 'Unknown error',\n ...(safeCause ? { cause: safeCause } : {}),\n },\n status,\n );\n }\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, status);\n }\n }\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, 500);\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const routes = this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes ?? [];\n\n for (const route of routes) {\n const serverRoute: ServerRoute = {\n method: route.method as any,\n path: route.path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: route.requiresAuth,\n requiresPermission: route.requiresPermission,\n fga: route.fga,\n };\n\n const routeHandler: MiddlewareHandler = async (c: Context) => {\n // Per-route auth check (same pattern as registerRoute)\n const authError = await this.checkRouteAuth(serverRoute, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n c.header(key, value as string);\n }\n }\n if (authError.error) {\n return c.json({ error: authError.error }, authError.status as any);\n }\n }\n\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(\n serverRoute,\n userPermissions,\n hasPermission,\n requestContext,\n );\n if (permissionError) {\n return c.json(\n { error: permissionError.error, message: permissionError.message },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n let bodyParams: Record<string, unknown> = {};\n const contentType = c.req.header('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (await c.req.raw.clone().json()) as unknown;\n if (body && typeof body === 'object' && !Array.isArray(body)) {\n bodyParams = body as Record<string, unknown>;\n }\n } catch {\n bodyParams = {};\n }\n } else if (\n contentType?.includes('application/x-www-form-urlencoded') ||\n contentType?.includes('multipart/form-data')\n ) {\n try {\n bodyParams = Object.fromEntries(await c.req.raw.clone().formData());\n } catch {\n bodyParams = {};\n }\n }\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, c.get('requestContext'), {\n ...c.req.param(),\n ...Object.fromEntries(new URL(c.req.url).searchParams.entries()),\n ...bodyParams,\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n const reqHeaders: Record<string, string | string[] | undefined> = {};\n c.req.raw.headers.forEach((v, k) => {\n reqHeaders[k] = v;\n });\n const response = await this.handleCustomRouteRequest(\n c.req.url,\n c.req.method,\n reqHeaders,\n c.req.raw.body,\n c.get('requestContext'),\n c.req.raw.signal,\n );\n if (!response) {\n return c.json({ error: 'Not Found' }, 404);\n }\n return response;\n };\n\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n this.app[method](route.path, routeHandler);\n }\n }\n\n registerContextMiddleware(): void {\n this.app.use('*', this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use('*', async (c, next) => {\n if (!this.shouldLogRequest(c.req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = c.req.method;\n const path = c.req.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = c.res.status;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = c.req.query();\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(c.req.raw.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -525,7 +525,7 @@ var MastraServer = class extends MastraServer$1 {
525
525
  // Standard Request object with headers/cookies
526
526
  };
527
527
  const requestContext = c.get("requestContext");
528
- const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;
528
+ const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;
529
529
  if (hasAuth) {
530
530
  const hasPermission = await loadHasPermission();
531
531
  if (hasPermission) {
@@ -623,7 +623,7 @@ var MastraServer = class extends MastraServer$1 {
623
623
  }
624
624
  }
625
625
  const requestContext = c.get("requestContext");
626
- const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;
626
+ const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;
627
627
  if (hasAuth) {
628
628
  const hasPermission = await loadHasPermission();
629
629
  if (hasPermission) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/auth-middleware.ts","../src/browser-stream/index.ts","../src/index.ts"],"names":["MastraServerBase","stream"],"mappings":"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","file":"index.js","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, MiddlewareHandler } from 'hono';\n\nexport interface HonoAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: HonoAuthMiddlewareOptions): MiddlewareHandler {\n return async (c: Context, next) => {\n if (!requiresAuth) {\n return next();\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return next();\n }\n\n const requestContext = c.get('requestContext') ?? new RequestContext();\n c.set('requestContext', requestContext);\n c.set('mastra', c.get('mastra') ?? mastra);\n\n const path = c.req.path;\n const method = c.req.method;\n const customRouteAuthConfig = new Map<string, boolean>(c.get('customRouteAuthConfig') ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = c.req.header('Authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = c.req.query('apiKey') || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => c.req.header(name),\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: c.req.raw,\n token,\n buildAuthorizeContext: () => c,\n });\n\n if (result.action === 'next') {\n return next();\n }\n\n return c.json(result.body as any, result.status as any);\n };\n}\n","import type { createNodeWebSocket as CreateNodeWebSocket } from '@hono/node-ws';\nimport { handleInputMessage, ViewerRegistry } from '@mastra/server/browser-stream';\nimport type { BrowserStreamConfig, BrowserStreamResult } from '@mastra/server/browser-stream';\nimport type { Env, Hono, Schema } from 'hono';\n\n/**\n * Set up WebSocket-based browser stream endpoint for real-time screencast viewing.\n *\n * Creates a WebSocket route at `/browser/:agentId/stream` that:\n * - Accepts viewer connections\n * - Starts screencast when first viewer connects\n * - Broadcasts frames to all connected viewers\n * - Stops screencast when last viewer disconnects\n *\n * **Note**: Requires `ws` package to be installed. If not available, returns null\n * and logs a warning. Browser streaming will be disabled but everything else works.\n *\n * @param app - The Hono application instance\n * @param config - Configuration for browser stream\n * @returns Object containing injectWebSocket function and registry instance, or null if ws is not available\n *\n * @example\n * ```typescript\n * import { Hono } from 'hono';\n * import { serve } from '@hono/node-server';\n * import { setupBrowserStream } from '@mastra/hono';\n *\n * const app = new Hono();\n * const browserStream = await setupBrowserStream(app, {\n * getToolset: (agentId) => browserToolsets.get(agentId),\n * });\n *\n * const server = serve({ fetch: app.fetch, port: 4111 });\n * browserStream?.injectWebSocket(server);\n * ```\n */\nexport async function setupBrowserStream<E extends Env, S extends Schema, B extends string>(\n app: Hono<E, S, B>,\n config: BrowserStreamConfig,\n): Promise<BrowserStreamResult | null> {\n // Dynamic import to avoid bundling ws into non-Node environments (e.g. Cloudflare Workers).\n // The variable-based specifier prevents bundlers from resolving the module at build time.\n let createNodeWebSocket: typeof CreateNodeWebSocket;\n try {\n const mod = '@hono/node-ws';\n const honoNodeWs = await import(/* @vite-ignore */ /* webpackIgnore: true */ mod);\n createNodeWebSocket = honoNodeWs.createNodeWebSocket;\n } catch {\n // @hono/node-ws is not available (e.g. no ws package installed).\n // This is expected in non-Node environments — silently disable browser streaming.\n return null;\n }\n\n const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });\n const registry = new ViewerRegistry();\n\n // Normalize the API prefix so we can build paths like `${apiPrefix}/agents/...`\n // without producing `//agents/...` when the prefix is missing or has a single\n // trailing slash. Anything weirder than that (e.g. `'/api//'`) is a config\n // bug we don't try to silently fix.\n const rawPrefix = config.apiPrefix ?? '/api';\n const trimmed = rawPrefix.endsWith('/') ? rawPrefix.slice(0, -1) : rawPrefix;\n const apiPrefix = trimmed || '/api';\n\n app.get(\n '/browser/:agentId/stream',\n upgradeWebSocket(c => {\n const agentId = c.req.param('agentId')!;\n const threadId = c.req.query('threadId');\n // Use composite key for thread-scoped screencasts\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n return {\n onOpen(_event, ws) {\n // Send connected status immediately\n ws.send(JSON.stringify({ status: 'connected' }));\n\n // Add to registry (starts screencast if first viewer)\n // Fire-and-forget: screencast starts asynchronously\n // Pass agentId for toolset lookup, but viewerKey for registry scoping\n void registry.addViewer(viewerKey, ws, config.getToolset, agentId, threadId);\n },\n\n onMessage(event, _ws) {\n const data = typeof event.data === 'string' ? event.data : null;\n if (data) {\n void handleInputMessage(data, config.getToolset, agentId, threadId);\n }\n },\n\n onClose(_event, ws) {\n // Remove from registry (stops screencast if last viewer)\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n\n onError(event, ws) {\n console.error('[BrowserStream] WebSocket error:', event);\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n };\n }),\n );\n\n // Browser session probe endpoint - tells the client whether to open a WS.\n // Returns:\n // - screencastAvailable: true (this route only exists if setupBrowserStream succeeded)\n // - hasSession: whether the agent has an active browser session for the given thread\n app.get(`${apiPrefix}/agents/:agentId/browser/session`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const threadId = c.req.query('threadId');\n const toolset = await config.getToolset(agentId);\n\n if (!toolset) {\n return c.json({ hasSession: false, screencastAvailable: true });\n }\n\n const hasSession = threadId ? toolset.hasThreadSession(threadId) : false;\n return c.json({ hasSession, screencastAvailable: true });\n });\n\n // Close browser session endpoint\n app.post(`${apiPrefix}/agents/:agentId/browser/close`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const toolset = await config.getToolset(agentId);\n if (!toolset) {\n return c.json({ error: 'No browser session for this agent' }, 404);\n }\n\n try {\n // Parse threadId from request body\n let threadId: string | undefined;\n try {\n const body = await c.req.json();\n threadId = body?.threadId;\n } catch {\n // No body or invalid JSON - proceed without threadId\n }\n\n const scope = toolset.getScope();\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n // For thread scope with a threadId, close only that thread's session\n if (scope === 'thread' && threadId) {\n // Close the session in the registry (stops screencast for this thread)\n await registry.closeBrowserSession(viewerKey);\n\n // Close just this thread's browser session\n if ('closeThreadSession' in toolset && typeof toolset.closeThreadSession === 'function') {\n await toolset.closeThreadSession(threadId);\n }\n } else {\n // For shared scope or no threadId, close the entire browser\n await registry.closeBrowserSession(viewerKey);\n await toolset.close();\n }\n\n return c.json({ success: true });\n } catch (error) {\n console.error(`[BrowserStream] Error closing browser for ${agentId}:`, error);\n return c.json({ error: 'Failed to close browser' }, 500);\n }\n });\n\n return { injectWebSocket: injectWebSocket as (server: unknown) => void, registry };\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\n\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nimport type { Context, HonoRequest, MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { stream } from 'hono/streaming';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { HonoAuthMiddlewareOptions } from './auth-middleware';\n// Browser stream setup (Hono-specific WebSocket implementation)\nexport { setupBrowserStream } from './browser-stream';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/hono] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Hono app configuration\nexport type HonoVariables = {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n cachedBody?: unknown;\n};\n\nexport type HonoBindings = {};\n\n/**\n * Generic handler function type compatible across Hono versions.\n * Uses a minimal signature that all Hono middleware handlers satisfy.\n */\ntype HonoRouteHandler = (...args: any[]) => any;\n\n/**\n * Minimal interface representing what MastraServer needs from a Hono app.\n * This allows any Hono app instance to be passed without strict generic matching,\n * avoiding the version mismatch issues that occur with Hono's strict generic types.\n */\nexport interface HonoApp {\n use(path: string, ...handlers: HonoRouteHandler[]): unknown;\n get(path: string, ...handlers: HonoRouteHandler[]): unknown;\n post(path: string, ...handlers: HonoRouteHandler[]): unknown;\n put(path: string, ...handlers: HonoRouteHandler[]): unknown;\n delete(path: string, ...handlers: HonoRouteHandler[]): unknown;\n patch(path: string, ...handlers: HonoRouteHandler[]): unknown;\n all(path: string, ...handlers: HonoRouteHandler[]): unknown;\n}\n\nexport class MastraServer extends MastraServerBase<HonoApp, HonoRequest, Context> {\n createContextMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n // Patch req.json() to prevent \"Body is unusable\" errors when the body is read multiple times\n // e.g. by middleware and then by an agent.\n const originalJson = c.req.json.bind(c.req);\n let jsonPromise: Promise<any> | undefined;\n\n c.req.json = () => {\n if (!jsonPromise) {\n jsonPromise = originalJson().then(body => {\n // Cache in context if needed explicitly, though the promise memoization handles the reuse\n c.set('cachedBody', body);\n return body;\n });\n }\n return jsonPromise;\n };\n\n // Parse request context from request body and add to context\n\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (c.req.method === 'POST' || c.req.method === 'PUT') {\n const contentType = c.req.header('content-type');\n const contentLength = c.req.header('content-length');\n // Only parse if content-type is JSON and body is not empty\n if (contentType?.includes('application/json') && contentLength !== '0') {\n try {\n const body = (await c.req.raw.clone().json()) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (c.req.method === 'GET') {\n try {\n const encodedRequestContext = c.req.query('requestContext');\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => c.req.header(name),\n });\n\n // Add relevant contexts to hono context\n c.set('requestContext', requestContext);\n c.set('mastra', this.mastra);\n c.set('registeredTools', this.tools || {});\n c.set('taskStore', this.taskStore);\n c.set('abortSignal', c.req.raw.signal);\n c.set('customRouteAuthConfig', this.customRouteAuthConfig);\n\n return next();\n };\n }\n async stream(route: ServerRoute, res: Context, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.header('Content-Type', 'text/event-stream');\n res.header('Cache-Control', 'no-cache');\n res.header('Connection', 'keep-alive');\n res.header('X-Accel-Buffering', 'no');\n } else {\n res.header('Content-Type', 'text/plain');\n }\n res.header('Transfer-Encoding', 'chunked');\n\n return stream(\n res,\n async stream => {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n await stream.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n stream.onAbort(() => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n await stream.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n await stream.write(`data: ${serialized.json}\\n\\n`);\n } else {\n await stream.write(serialized.json + '\\x1E');\n }\n }\n }\n\n if (streamFormat === 'sse') {\n await stream.write('data: [DONE]\\n\\n');\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n await stream.close();\n }\n },\n async err => {\n this.mastra.getLogger()?.error('Stream error callback', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n },\n );\n }\n\n async getParams(route: ServerRoute, request: HonoRequest): Promise<ParsedRequestParams> {\n const urlParams = request.param();\n // Use queries() to get all values for repeated params (e.g., ?tags=a&tags=b -> { tags: ['a', 'b'] })\n const queryParams = normalizeQueryParams(request.queries());\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.header('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Clone the request to read the body text first\n // This allows us to check if there's actual content before parsing\n const clonedReq = request.raw.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n // There's actual content - try to parse it as JSON\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Track JSON parse error to return 400 Bad Request\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n // Empty body is ok - body remains undefined\n }\n }\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n */\n private async parseFormData(formData: FormData): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of formData.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Context, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.header(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return response.json(result as any, 200);\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n return fetchResponse;\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n const { req, res } = toReqRes(response.req.raw);\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(response.req.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n try {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n } catch {\n // Response stream already closed or destroyed - nothing more to do\n }\n });\n\n return await toFetchResponse(res);\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n return await server.startHonoSSE({\n url: new URL(response.req.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n context: response,\n });\n } catch {\n return response.json({ error: 'Error handling MCP SSE request' }, 500);\n }\n } else {\n return response.status(500);\n }\n }\n\n async registerRoute(\n app: HonoApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Build middleware array\n const middlewares: MiddlewareHandler[] = [];\n\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n middlewares.push(\n bodyLimit({\n maxSize,\n onError: this.bodyLimitOptions.onError as any,\n }),\n );\n }\n\n app[route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all'](\n `${prefix}${route.path}`,\n ...middlewares,\n async (c: Context) => {\n // Check route-level authentication/authorization\n const authResult = await this.checkRouteAuth(route, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authResult) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n c.header(key, value as string);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return c.json({ error: authResult.error }, authResult.status as any);\n }\n }\n\n const params = await this.getParams(route, c.req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed JSON)\n if (params.bodyParseError) {\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n },\n 400,\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: c.get('requestContext'),\n mastra: this.mastra,\n registeredTools: c.get('registeredTools'),\n taskStore: c.get('taskStore'),\n abortSignal: c.get('abortSignal'),\n routePrefix: prefix,\n request: c.req.raw, // Standard Request object with headers/cookies\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);\n\n if (permissionError) {\n return c.json(\n {\n error: permissionError.error,\n message: permissionError.message,\n },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, c.get('requestContext'), {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, c, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Check if it's an HTTPException or MastraError with a status code\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n const status = (error as any).status;\n let safeCause: { failingItems: unknown[] } | undefined;\n try {\n const raw = error instanceof Error ? error.cause : undefined;\n if (\n raw &&\n typeof raw === 'object' &&\n !Array.isArray(raw) &&\n 'failingItems' in raw &&\n Array.isArray((raw as any).failingItems)\n ) {\n safeCause = { failingItems: (raw as any).failingItems };\n }\n } catch {\n // serialization or access error — omit cause\n }\n return c.json(\n {\n error: error instanceof Error ? error.message : 'Unknown error',\n ...(safeCause ? { cause: safeCause } : {}),\n },\n status,\n );\n }\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, status);\n }\n }\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, 500);\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const routes = this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes ?? [];\n\n for (const route of routes) {\n const serverRoute: ServerRoute = {\n method: route.method as any,\n path: route.path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: route.requiresAuth,\n requiresPermission: route.requiresPermission,\n fga: route.fga,\n };\n\n const routeHandler: MiddlewareHandler = async (c: Context) => {\n // Per-route auth check (same pattern as registerRoute)\n const authError = await this.checkRouteAuth(serverRoute, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n c.header(key, value as string);\n }\n }\n if (authError.error) {\n return c.json({ error: authError.error }, authError.status as any);\n }\n }\n\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(\n serverRoute,\n userPermissions,\n hasPermission,\n requestContext,\n );\n if (permissionError) {\n return c.json(\n { error: permissionError.error, message: permissionError.message },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n let bodyParams: Record<string, unknown> = {};\n const contentType = c.req.header('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (await c.req.raw.clone().json()) as unknown;\n if (body && typeof body === 'object' && !Array.isArray(body)) {\n bodyParams = body as Record<string, unknown>;\n }\n } catch {\n bodyParams = {};\n }\n } else if (\n contentType?.includes('application/x-www-form-urlencoded') ||\n contentType?.includes('multipart/form-data')\n ) {\n try {\n bodyParams = Object.fromEntries(await c.req.raw.clone().formData());\n } catch {\n bodyParams = {};\n }\n }\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, c.get('requestContext'), {\n ...c.req.param(),\n ...Object.fromEntries(new URL(c.req.url).searchParams.entries()),\n ...bodyParams,\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n const reqHeaders: Record<string, string | string[] | undefined> = {};\n c.req.raw.headers.forEach((v, k) => {\n reqHeaders[k] = v;\n });\n const response = await this.handleCustomRouteRequest(\n c.req.url,\n c.req.method,\n reqHeaders,\n c.req.raw.body,\n c.get('requestContext'),\n c.req.raw.signal,\n );\n if (!response) {\n return c.json({ error: 'Not Found' }, 404);\n }\n return response;\n };\n\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n this.app[method](route.path, routeHandler);\n }\n }\n\n registerContextMiddleware(): void {\n this.app.use('*', this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use('*', async (c, next) => {\n if (!this.shouldLogRequest(c.req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = c.req.method;\n const path = c.req.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = c.res.status;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = c.req.query();\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(c.req.raw.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/auth-middleware.ts","../src/browser-stream/index.ts","../src/index.ts"],"names":["MastraServerBase","stream"],"mappings":"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","file":"index.js","sourcesContent":["import type { Mastra } from '@mastra/core/mastra';\nimport { RequestContext } from '@mastra/core/request-context';\nimport { coreAuthMiddleware } from '@mastra/server/auth';\nimport type { Context, MiddlewareHandler } from 'hono';\n\nexport interface HonoAuthMiddlewareOptions {\n mastra: Mastra;\n requiresAuth?: boolean;\n}\n\nexport function createAuthMiddleware({ mastra, requiresAuth = true }: HonoAuthMiddlewareOptions): MiddlewareHandler {\n return async (c: Context, next) => {\n if (!requiresAuth) {\n return next();\n }\n\n const authConfig = mastra.getServer()?.auth;\n if (!authConfig) {\n return next();\n }\n\n const requestContext = c.get('requestContext') ?? new RequestContext();\n c.set('requestContext', requestContext);\n c.set('mastra', c.get('mastra') ?? mastra);\n\n const path = c.req.path;\n const method = c.req.method;\n const customRouteAuthConfig = new Map<string, boolean>(c.get('customRouteAuthConfig') ?? []);\n customRouteAuthConfig.set(`${method}:${path}`, true);\n\n const authHeader = c.req.header('Authorization');\n let token: string | null = authHeader ? authHeader.replace('Bearer ', '') : null;\n if (!token) {\n token = c.req.query('apiKey') || null;\n }\n\n const result = await coreAuthMiddleware({\n path,\n method,\n getHeader: name => c.req.header(name),\n mastra,\n authConfig,\n customRouteAuthConfig,\n requestContext,\n rawRequest: c.req.raw,\n token,\n buildAuthorizeContext: () => c,\n });\n\n if (result.action === 'next') {\n return next();\n }\n\n return c.json(result.body as any, result.status as any);\n };\n}\n","import type { createNodeWebSocket as CreateNodeWebSocket } from '@hono/node-ws';\nimport { handleInputMessage, ViewerRegistry } from '@mastra/server/browser-stream';\nimport type { BrowserStreamConfig, BrowserStreamResult } from '@mastra/server/browser-stream';\nimport type { Env, Hono, Schema } from 'hono';\n\n/**\n * Set up WebSocket-based browser stream endpoint for real-time screencast viewing.\n *\n * Creates a WebSocket route at `/browser/:agentId/stream` that:\n * - Accepts viewer connections\n * - Starts screencast when first viewer connects\n * - Broadcasts frames to all connected viewers\n * - Stops screencast when last viewer disconnects\n *\n * **Note**: Requires `ws` package to be installed. If not available, returns null\n * and logs a warning. Browser streaming will be disabled but everything else works.\n *\n * @param app - The Hono application instance\n * @param config - Configuration for browser stream\n * @returns Object containing injectWebSocket function and registry instance, or null if ws is not available\n *\n * @example\n * ```typescript\n * import { Hono } from 'hono';\n * import { serve } from '@hono/node-server';\n * import { setupBrowserStream } from '@mastra/hono';\n *\n * const app = new Hono();\n * const browserStream = await setupBrowserStream(app, {\n * getToolset: (agentId) => browserToolsets.get(agentId),\n * });\n *\n * const server = serve({ fetch: app.fetch, port: 4111 });\n * browserStream?.injectWebSocket(server);\n * ```\n */\nexport async function setupBrowserStream<E extends Env, S extends Schema, B extends string>(\n app: Hono<E, S, B>,\n config: BrowserStreamConfig,\n): Promise<BrowserStreamResult | null> {\n // Dynamic import to avoid bundling ws into non-Node environments (e.g. Cloudflare Workers).\n // The variable-based specifier prevents bundlers from resolving the module at build time.\n let createNodeWebSocket: typeof CreateNodeWebSocket;\n try {\n const mod = '@hono/node-ws';\n const honoNodeWs = await import(/* @vite-ignore */ /* webpackIgnore: true */ mod);\n createNodeWebSocket = honoNodeWs.createNodeWebSocket;\n } catch {\n // @hono/node-ws is not available (e.g. no ws package installed).\n // This is expected in non-Node environments — silently disable browser streaming.\n return null;\n }\n\n const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });\n const registry = new ViewerRegistry();\n\n // Normalize the API prefix so we can build paths like `${apiPrefix}/agents/...`\n // without producing `//agents/...` when the prefix is missing or has a single\n // trailing slash. Anything weirder than that (e.g. `'/api//'`) is a config\n // bug we don't try to silently fix.\n const rawPrefix = config.apiPrefix ?? '/api';\n const trimmed = rawPrefix.endsWith('/') ? rawPrefix.slice(0, -1) : rawPrefix;\n const apiPrefix = trimmed || '/api';\n\n app.get(\n '/browser/:agentId/stream',\n upgradeWebSocket(c => {\n const agentId = c.req.param('agentId')!;\n const threadId = c.req.query('threadId');\n // Use composite key for thread-scoped screencasts\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n return {\n onOpen(_event, ws) {\n // Send connected status immediately\n ws.send(JSON.stringify({ status: 'connected' }));\n\n // Add to registry (starts screencast if first viewer)\n // Fire-and-forget: screencast starts asynchronously\n // Pass agentId for toolset lookup, but viewerKey for registry scoping\n void registry.addViewer(viewerKey, ws, config.getToolset, agentId, threadId);\n },\n\n onMessage(event, _ws) {\n const data = typeof event.data === 'string' ? event.data : null;\n if (data) {\n void handleInputMessage(data, config.getToolset, agentId, threadId);\n }\n },\n\n onClose(_event, ws) {\n // Remove from registry (stops screencast if last viewer)\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n\n onError(event, ws) {\n console.error('[BrowserStream] WebSocket error:', event);\n // Fire-and-forget: cleanup is best-effort\n void registry.removeViewer(viewerKey, ws);\n },\n };\n }),\n );\n\n // Browser session probe endpoint - tells the client whether to open a WS.\n // Returns:\n // - screencastAvailable: true (this route only exists if setupBrowserStream succeeded)\n // - hasSession: whether the agent has an active browser session for the given thread\n app.get(`${apiPrefix}/agents/:agentId/browser/session`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const threadId = c.req.query('threadId');\n const toolset = await config.getToolset(agentId);\n\n if (!toolset) {\n return c.json({ hasSession: false, screencastAvailable: true });\n }\n\n const hasSession = threadId ? toolset.hasThreadSession(threadId) : false;\n return c.json({ hasSession, screencastAvailable: true });\n });\n\n // Close browser session endpoint\n app.post(`${apiPrefix}/agents/:agentId/browser/close`, async c => {\n const agentId = c.req.param('agentId');\n if (!agentId) {\n return c.json({ error: 'Agent ID is required' }, 400);\n }\n\n const toolset = await config.getToolset(agentId);\n if (!toolset) {\n return c.json({ error: 'No browser session for this agent' }, 404);\n }\n\n try {\n // Parse threadId from request body\n let threadId: string | undefined;\n try {\n const body = await c.req.json();\n threadId = body?.threadId;\n } catch {\n // No body or invalid JSON - proceed without threadId\n }\n\n const scope = toolset.getScope();\n const viewerKey = threadId ? `${agentId}:${threadId}` : agentId;\n\n // For thread scope with a threadId, close only that thread's session\n if (scope === 'thread' && threadId) {\n // Close the session in the registry (stops screencast for this thread)\n await registry.closeBrowserSession(viewerKey);\n\n // Close just this thread's browser session\n if ('closeThreadSession' in toolset && typeof toolset.closeThreadSession === 'function') {\n await toolset.closeThreadSession(threadId);\n }\n } else {\n // For shared scope or no threadId, close the entire browser\n await registry.closeBrowserSession(viewerKey);\n await toolset.close();\n }\n\n return c.json({ success: true });\n } catch (error) {\n console.error(`[BrowserStream] Error closing browser for ${agentId}:`, error);\n return c.json({ error: 'Failed to close browser' }, 500);\n }\n });\n\n return { injectWebSocket: injectWebSocket as (server: unknown) => void, registry };\n}\n","import type { ToolsInput } from '@mastra/core/agent';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { InMemoryTaskStore } from '@mastra/server/a2a/store';\n\nimport type { MCPHttpTransportResult, MCPSseTransportResult } from '@mastra/server/handlers/mcp';\nimport type { ParsedRequestParams, ServerRoute } from '@mastra/server/server-adapter';\nimport {\n MastraServer as MastraServerBase,\n checkRouteFGA,\n isZodError,\n normalizeQueryParams,\n redactStreamChunk,\n serializeStreamChunk,\n} from '@mastra/server/server-adapter';\nimport { toReqRes, toFetchResponse } from 'fetch-to-node';\nimport type { Context, HonoRequest, MiddlewareHandler } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { stream } from 'hono/streaming';\nexport { createAuthMiddleware } from './auth-middleware';\nexport type { HonoAuthMiddlewareOptions } from './auth-middleware';\n// Browser stream setup (Hono-specific WebSocket implementation)\nexport { setupBrowserStream } from './browser-stream';\n\ntype HasPermissionFn = (userPerms: string[], required: string) => boolean;\nlet _hasPermissionPromise: Promise<HasPermissionFn | undefined> | undefined;\nfunction loadHasPermission(): Promise<HasPermissionFn | undefined> {\n if (!_hasPermissionPromise) {\n _hasPermissionPromise = import('@mastra/core/auth/ee')\n .then(m => m.hasPermission)\n .catch(() => {\n console.error(\n '[@mastra/hono] Auth features require @mastra/core >= 1.6.0. Please upgrade: npm install @mastra/core@latest',\n );\n return undefined;\n });\n }\n return _hasPermissionPromise;\n}\n\n// Export type definitions for Hono app configuration\nexport type HonoVariables = {\n mastra: Mastra;\n requestContext: RequestContext;\n registeredTools: ToolsInput;\n abortSignal: AbortSignal;\n taskStore: InMemoryTaskStore;\n customRouteAuthConfig?: Map<string, boolean>;\n cachedBody?: unknown;\n};\n\nexport type HonoBindings = {};\n\n/**\n * Generic handler function type compatible across Hono versions.\n * Uses a minimal signature that all Hono middleware handlers satisfy.\n */\ntype HonoRouteHandler = (...args: any[]) => any;\n\n/**\n * Minimal interface representing what MastraServer needs from a Hono app.\n * This allows any Hono app instance to be passed without strict generic matching,\n * avoiding the version mismatch issues that occur with Hono's strict generic types.\n */\nexport interface HonoApp {\n use(path: string, ...handlers: HonoRouteHandler[]): unknown;\n get(path: string, ...handlers: HonoRouteHandler[]): unknown;\n post(path: string, ...handlers: HonoRouteHandler[]): unknown;\n put(path: string, ...handlers: HonoRouteHandler[]): unknown;\n delete(path: string, ...handlers: HonoRouteHandler[]): unknown;\n patch(path: string, ...handlers: HonoRouteHandler[]): unknown;\n all(path: string, ...handlers: HonoRouteHandler[]): unknown;\n}\n\nexport class MastraServer extends MastraServerBase<HonoApp, HonoRequest, Context> {\n createContextMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n // Patch req.json() to prevent \"Body is unusable\" errors when the body is read multiple times\n // e.g. by middleware and then by an agent.\n const originalJson = c.req.json.bind(c.req);\n let jsonPromise: Promise<any> | undefined;\n\n c.req.json = () => {\n if (!jsonPromise) {\n jsonPromise = originalJson().then(body => {\n // Cache in context if needed explicitly, though the promise memoization handles the reuse\n c.set('cachedBody', body);\n return body;\n });\n }\n return jsonPromise;\n };\n\n // Parse request context from request body and add to context\n\n let bodyRequestContext: Record<string, any> | undefined;\n let paramsRequestContext: Record<string, any> | undefined;\n\n // Parse request context from request body (POST/PUT)\n if (c.req.method === 'POST' || c.req.method === 'PUT') {\n const contentType = c.req.header('content-type');\n const contentLength = c.req.header('content-length');\n // Only parse if content-type is JSON and body is not empty\n if (contentType?.includes('application/json') && contentLength !== '0') {\n try {\n const body = (await c.req.raw.clone().json()) as { requestContext?: Record<string, any> };\n if (body.requestContext) {\n bodyRequestContext = body.requestContext;\n }\n } catch {\n // Body parsing failed, continue without body\n }\n }\n }\n\n // Parse request context from query params (GET)\n if (c.req.method === 'GET') {\n try {\n const encodedRequestContext = c.req.query('requestContext');\n if (encodedRequestContext) {\n // Try JSON first\n try {\n paramsRequestContext = JSON.parse(encodedRequestContext);\n } catch {\n // Fallback to base64(JSON)\n try {\n const json = Buffer.from(encodedRequestContext, 'base64').toString('utf-8');\n paramsRequestContext = JSON.parse(json);\n } catch {\n // ignore if still invalid\n }\n }\n }\n } catch {\n // ignore query parsing errors\n }\n }\n\n const requestContext = this.mergeRequestContext({ paramsRequestContext, bodyRequestContext });\n this.applyRequestMetadataToContext({\n requestContext,\n getHeader: name => c.req.header(name),\n });\n\n // Add relevant contexts to hono context\n c.set('requestContext', requestContext);\n c.set('mastra', this.mastra);\n c.set('registeredTools', this.tools || {});\n c.set('taskStore', this.taskStore);\n c.set('abortSignal', c.req.raw.signal);\n c.set('customRouteAuthConfig', this.customRouteAuthConfig);\n\n return next();\n };\n }\n async stream(route: ServerRoute, res: Context, result: { fullStream: ReadableStream }): Promise<any> {\n const streamFormat = route.streamFormat || 'stream';\n\n if (streamFormat === 'sse') {\n res.header('Content-Type', 'text/event-stream');\n res.header('Cache-Control', 'no-cache');\n res.header('Connection', 'keep-alive');\n res.header('X-Accel-Buffering', 'no');\n } else {\n res.header('Content-Type', 'text/plain');\n }\n res.header('Transfer-Encoding', 'chunked');\n\n return stream(\n res,\n async stream => {\n if (streamFormat === 'sse' && route.sseFlushOnConnect) {\n await stream.write(': connected\\n\\n');\n }\n\n const readableStream = result instanceof ReadableStream ? result : result.fullStream;\n const reader = readableStream.getReader();\n\n stream.onAbort(() => {\n void reader.cancel('request aborted');\n });\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n if (value) {\n if (streamFormat === 'sse' && typeof value === 'string' && value.startsWith(':')) {\n await stream.write(value);\n continue;\n }\n\n // Optionally redact sensitive data (system prompts, tool definitions, API keys) before sending to the client\n const shouldRedact = this.streamOptions?.redact ?? true;\n const outputValue = shouldRedact ? redactStreamChunk(value) : value;\n // A chunk that can't be serialized must not kill the stream — skip it and keep streaming\n const serialized = serializeStreamChunk(outputValue);\n if (!serialized.ok) {\n this.mastra.getLogger()?.error('Failed to serialize stream chunk, skipping', {\n path: route.path,\n chunkType: (outputValue as { type?: string })?.type,\n error: serialized.error.message,\n });\n continue;\n }\n if (streamFormat === 'sse') {\n await stream.write(`data: ${serialized.json}\\n\\n`);\n } else {\n await stream.write(serialized.json + '\\x1E');\n }\n }\n }\n\n if (streamFormat === 'sse') {\n await stream.write('data: [DONE]\\n\\n');\n }\n } catch (error) {\n this.mastra.getLogger()?.error('Error in stream processing', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n } finally {\n await stream.close();\n }\n },\n async err => {\n this.mastra.getLogger()?.error('Stream error callback', {\n error: err instanceof Error ? { message: err.message, stack: err.stack } : err,\n });\n },\n );\n }\n\n async getParams(route: ServerRoute, request: HonoRequest): Promise<ParsedRequestParams> {\n const urlParams = request.param();\n // Use queries() to get all values for repeated params (e.g., ?tags=a&tags=b -> { tags: ['a', 'b'] })\n const queryParams = normalizeQueryParams(request.queries());\n let body: unknown;\n let bodyParseError: { message: string } | undefined;\n\n if (route.method === 'POST' || route.method === 'PUT' || route.method === 'PATCH' || route.method === 'DELETE') {\n const contentType = request.header('content-type') || '';\n\n if (contentType.includes('multipart/form-data')) {\n try {\n const formData = await request.formData();\n body = await this.parseFormData(formData);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse multipart form data', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Re-throw size limit errors, let others fall through to validation\n if (error instanceof Error && error.message.toLowerCase().includes('size')) {\n throw error;\n }\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Failed to parse multipart form data',\n };\n }\n } else if (contentType.includes('application/json')) {\n // Clone the request to read the body text first\n // This allows us to check if there's actual content before parsing\n const clonedReq = request.raw.clone();\n const bodyText = await clonedReq.text();\n\n if (bodyText && bodyText.trim().length > 0) {\n // There's actual content - try to parse it as JSON\n try {\n body = JSON.parse(bodyText);\n } catch (error) {\n this.mastra.getLogger()?.error('Failed to parse JSON body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n // Track JSON parse error to return 400 Bad Request\n bodyParseError = {\n message: error instanceof Error ? error.message : 'Invalid JSON in request body',\n };\n }\n }\n // Empty body is ok - body remains undefined\n }\n }\n return { urlParams, queryParams, body, bodyParseError };\n }\n\n /**\n * Parse FormData into a plain object, converting File objects to Buffers.\n */\n private async parseFormData(formData: FormData): Promise<Record<string, unknown>> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of formData.entries()) {\n if (value instanceof File) {\n const arrayBuffer = await value.arrayBuffer();\n result[key] = Buffer.from(arrayBuffer);\n } else if (typeof value === 'string') {\n // Try to parse JSON strings (like 'options')\n try {\n result[key] = JSON.parse(value);\n } catch {\n result[key] = value;\n }\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n async sendResponse(route: ServerRoute, response: Context, result: unknown, prefix?: string): Promise<any> {\n const resolvedPrefix = prefix ?? this.prefix ?? '';\n\n // Apply refresh headers from transparent session refresh (e.g. Set-Cookie after token refresh)\n if (result && typeof result === 'object' && '__refreshHeaders' in result) {\n const refreshHeaders = (result as any).__refreshHeaders as Record<string, string>;\n for (const [key, value] of Object.entries(refreshHeaders)) {\n response.header(key, value);\n }\n delete (result as any).__refreshHeaders;\n }\n\n if (route.responseType === 'json') {\n return response.json(result as any, 200);\n } else if (route.responseType === 'stream') {\n return this.stream(route, response, result as { fullStream: ReadableStream });\n } else if (route.responseType === 'datastream-response') {\n const fetchResponse = result as globalThis.Response;\n return fetchResponse;\n } else if (route.responseType === 'mcp-http') {\n // MCP Streamable HTTP transport\n const { server, httpPath, mcpOptions: routeMcpOptions } = result as MCPHttpTransportResult;\n const { req, res } = toReqRes(response.req.raw);\n\n // Merge class-level mcpOptions with route-specific options (route takes precedence)\n const options = { ...this.mcpOptions, ...routeMcpOptions };\n\n // Do NOT await startHTTP — let it run in the background so SSE\n // notifications stream to the client as they are written.\n // toFetchResponse resolves when headers are sent, not when the body finishes.\n server\n .startHTTP({\n url: new URL(response.req.url),\n httpPath: `${resolvedPrefix}${httpPath}`,\n req,\n res,\n options: Object.keys(options).length > 0 ? options : undefined,\n })\n .catch((e: unknown) => {\n this.mastra.getLogger()?.error('[MCP HTTP] Error in background startHTTP:', {\n error: e instanceof Error ? { message: e.message, stack: e.stack } : e,\n });\n try {\n if (!res.headersSent) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n jsonrpc: '2.0',\n error: { code: -32603, message: 'Internal server error' },\n id: null,\n }),\n );\n }\n } catch {\n // Response stream already closed or destroyed - nothing more to do\n }\n });\n\n return await toFetchResponse(res);\n } else if (route.responseType === 'mcp-sse') {\n // MCP SSE transport\n const { server, ssePath, messagePath } = result as MCPSseTransportResult;\n\n try {\n return await server.startHonoSSE({\n url: new URL(response.req.url),\n ssePath: `${resolvedPrefix}${ssePath}`,\n messagePath: `${resolvedPrefix}${messagePath}`,\n context: response,\n });\n } catch {\n return response.json({ error: 'Error handling MCP SSE request' }, 500);\n }\n } else {\n return response.status(500);\n }\n }\n\n async registerRoute(\n app: HonoApp,\n route: ServerRoute,\n { prefix: prefixParam }: { prefix?: string } = {},\n ): Promise<void> {\n // Default prefix to this.prefix if not provided, or empty string\n const prefix = prefixParam ?? this.prefix ?? '';\n\n // Determine if body limits should be applied\n const shouldApplyBodyLimit = this.bodyLimitOptions && ['POST', 'PUT', 'PATCH'].includes(route.method.toUpperCase());\n\n // Get the body size limit for this route (route-specific or default)\n const maxSize = route.maxBodySize ?? this.bodyLimitOptions?.maxSize;\n\n // Build middleware array\n const middlewares: MiddlewareHandler[] = [];\n\n if (shouldApplyBodyLimit && maxSize && this.bodyLimitOptions) {\n middlewares.push(\n bodyLimit({\n maxSize,\n onError: this.bodyLimitOptions.onError as any,\n }),\n );\n }\n\n app[route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all'](\n `${prefix}${route.path}`,\n ...middlewares,\n async (c: Context) => {\n // Check route-level authentication/authorization\n const authResult = await this.checkRouteAuth(route, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authResult) {\n // Apply any refresh headers (e.g. Set-Cookie from transparent session refresh)\n if (authResult.headers) {\n for (const [key, value] of Object.entries(authResult.headers)) {\n c.header(key, value as string);\n }\n }\n\n // If this is an auth error (not just a success-with-headers), return error response\n if (authResult.error) {\n return c.json({ error: authResult.error }, authResult.status as any);\n }\n }\n\n const params = await this.getParams(route, c.req);\n\n // Return 400 Bad Request if body parsing failed (e.g., malformed JSON)\n if (params.bodyParseError) {\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'body', message: params.bodyParseError.message }],\n },\n 400,\n );\n }\n\n if (params.queryParams) {\n try {\n params.queryParams = await this.parseQueryParams(route, params.queryParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing query params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'query');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid query parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n if (params.body) {\n try {\n params.body = await this.parseBody(route, params.body);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing body', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'body');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid request body',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n // Parse path params through pathParamSchema for type coercion (e.g., z.coerce.number())\n if (params.urlParams) {\n try {\n params.urlParams = await this.parsePathParams(route, params.urlParams);\n } catch (error) {\n this.mastra.getLogger()?.error('Error parsing path params', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n });\n if (isZodError(error)) {\n const { status, body } = this.resolveValidationError(route, error, 'path');\n return c.json(body as any, status as any);\n }\n return c.json(\n {\n error: 'Invalid path parameters',\n issues: [{ field: 'unknown', message: error instanceof Error ? error.message : 'Unknown error' }],\n },\n 400,\n );\n }\n }\n\n const handlerParams = {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n requestContext: c.get('requestContext'),\n mastra: this.mastra,\n registeredTools: c.get('registeredTools'),\n taskStore: c.get('taskStore'),\n abortSignal: c.get('abortSignal'),\n routePrefix: prefix,\n request: c.req.raw, // Standard Request object with headers/cookies\n };\n\n // Check route permission requirement (EE feature)\n // Uses convention-based permission derivation: permissions are auto-derived\n // from route path/method unless explicitly set or route is public\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(route, userPermissions, hasPermission, requestContext);\n\n if (permissionError) {\n return c.json(\n {\n error: permissionError.error,\n message: permissionError.message,\n },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n const fgaError = await checkRouteFGA(this.mastra, route, c.get('requestContext'), {\n ...params.urlParams,\n ...params.queryParams,\n ...(typeof params.body === 'object' ? params.body : {}),\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n try {\n const result = await route.handler(handlerParams);\n return this.sendResponse(route, c, result, prefix);\n } catch (error) {\n this.mastra.getLogger()?.error('Error calling handler', {\n error: error instanceof Error ? { message: error.message, stack: error.stack } : error,\n path: route.path,\n method: route.method,\n });\n // Check if it's an HTTPException or MastraError with a status code\n if (error && typeof error === 'object') {\n // Check for direct status property (HTTPException)\n if ('status' in error) {\n const status = (error as any).status;\n let safeCause: { failingItems: unknown[] } | undefined;\n try {\n const raw = error instanceof Error ? error.cause : undefined;\n if (\n raw &&\n typeof raw === 'object' &&\n !Array.isArray(raw) &&\n 'failingItems' in raw &&\n Array.isArray((raw as any).failingItems)\n ) {\n safeCause = { failingItems: (raw as any).failingItems };\n }\n } catch {\n // serialization or access error — omit cause\n }\n return c.json(\n {\n error: error instanceof Error ? error.message : 'Unknown error',\n ...(safeCause ? { cause: safeCause } : {}),\n },\n status,\n );\n }\n // Check for MastraError with status in details\n if ('details' in error && error.details && typeof error.details === 'object' && 'status' in error.details) {\n const status = (error.details as any).status;\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, status);\n }\n }\n return c.json({ error: error instanceof Error ? error.message : 'Unknown error' }, 500);\n }\n },\n );\n }\n\n async registerCustomApiRoutes(): Promise<void> {\n if (!(await this.buildCustomRouteHandler())) return;\n\n const routes = this.customApiRoutes ?? this.mastra.getServer()?.apiRoutes ?? [];\n\n for (const route of routes) {\n const serverRoute: ServerRoute = {\n method: route.method as any,\n path: route.path,\n responseType: 'json',\n handler: async () => {},\n requiresAuth: route.requiresAuth,\n requiresPermission: route.requiresPermission,\n fga: route.fga,\n };\n\n const routeHandler: MiddlewareHandler = async (c: Context) => {\n // Per-route auth check (same pattern as registerRoute)\n const authError = await this.checkRouteAuth(serverRoute, {\n path: c.req.path,\n method: c.req.method,\n getHeader: name => c.req.header(name),\n getQuery: name => c.req.query(name),\n requestContext: c.get('requestContext'),\n request: c.req.raw,\n buildAuthorizeContext: () => c,\n });\n\n if (authError) {\n if (authError.headers) {\n for (const [key, value] of Object.entries(authError.headers)) {\n c.header(key, value as string);\n }\n }\n if (authError.error) {\n return c.json({ error: authError.error }, authError.status as any);\n }\n }\n\n const requestContext = c.get('requestContext');\n // Check if any auth is configured (studio or server) for RBAC\n const hasAuth = this.mastra.getStudio?.()?.auth || this.mastra.getServer()?.auth;\n if (hasAuth) {\n const hasPermission = await loadHasPermission();\n if (hasPermission) {\n const userPermissions = requestContext.get('mastra__userPermissions') as string[] | undefined;\n const permissionError = this.checkRoutePermission(\n serverRoute,\n userPermissions,\n hasPermission,\n requestContext,\n );\n if (permissionError) {\n return c.json(\n { error: permissionError.error, message: permissionError.message },\n permissionError.status as any,\n );\n }\n }\n }\n\n // Check FGA authorization (EE feature)\n let bodyParams: Record<string, unknown> = {};\n const contentType = c.req.header('content-type');\n if (contentType?.includes('application/json')) {\n try {\n const body = (await c.req.raw.clone().json()) as unknown;\n if (body && typeof body === 'object' && !Array.isArray(body)) {\n bodyParams = body as Record<string, unknown>;\n }\n } catch {\n bodyParams = {};\n }\n } else if (\n contentType?.includes('application/x-www-form-urlencoded') ||\n contentType?.includes('multipart/form-data')\n ) {\n try {\n bodyParams = Object.fromEntries(await c.req.raw.clone().formData());\n } catch {\n bodyParams = {};\n }\n }\n const fgaError = await checkRouteFGA(this.mastra, serverRoute, c.get('requestContext'), {\n ...c.req.param(),\n ...Object.fromEntries(new URL(c.req.url).searchParams.entries()),\n ...bodyParams,\n });\n if (fgaError) {\n return c.json({ error: fgaError.error, message: fgaError.message }, fgaError.status as any);\n }\n\n const reqHeaders: Record<string, string | string[] | undefined> = {};\n c.req.raw.headers.forEach((v, k) => {\n reqHeaders[k] = v;\n });\n const response = await this.handleCustomRouteRequest(\n c.req.url,\n c.req.method,\n reqHeaders,\n c.req.raw.body,\n c.get('requestContext'),\n c.req.raw.signal,\n );\n if (!response) {\n return c.json({ error: 'Not Found' }, 404);\n }\n return response;\n };\n\n const method = route.method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'all';\n this.app[method](route.path, routeHandler);\n }\n }\n\n registerContextMiddleware(): void {\n this.app.use('*', this.createContextMiddleware());\n }\n\n registerAuthMiddleware(): void {\n // Auth is handled per-route in registerRoute() and registerCustomApiRoutes()\n // No global middleware needed\n }\n\n registerHttpLoggingMiddleware(): void {\n if (!this.httpLoggingConfig?.enabled) {\n return;\n }\n\n this.app.use('*', async (c, next) => {\n if (!this.shouldLogRequest(c.req.path)) {\n return next();\n }\n\n const start = Date.now();\n const method = c.req.method;\n const path = c.req.path;\n\n await next();\n\n const duration = Date.now() - start;\n const status = c.res.status;\n const level = this.httpLoggingConfig?.level || 'info';\n\n const logData: Record<string, any> = {\n method,\n path,\n status,\n duration: `${duration}ms`,\n };\n\n if (this.httpLoggingConfig?.includeQueryParams) {\n logData.query = c.req.query();\n }\n\n if (this.httpLoggingConfig?.includeHeaders) {\n const headers = Object.fromEntries(c.req.raw.headers.entries());\n const redactHeaders = this.httpLoggingConfig.redactHeaders || [];\n redactHeaders.forEach(h => {\n const key = h.toLowerCase();\n if (headers[key] !== undefined) {\n headers[key] = '[REDACTED]';\n }\n });\n logData.headers = headers;\n }\n\n this.logger[level](`${method} ${path} ${status} ${duration}ms`, logData);\n });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/hono",
3
- "version": "1.5.1-alpha.1",
3
+ "version": "1.5.1-alpha.3",
4
4
  "description": "Mastra Hono adapter for the server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,7 +23,7 @@
23
23
  "@hono/node-ws": "^1.3.0",
24
24
  "fetch-to-node": "^2.1.0",
25
25
  "ws": "^8.20.0",
26
- "@mastra/server": "1.46.0-alpha.1"
26
+ "@mastra/server": "1.46.0-alpha.3"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@ai-sdk/openai": "^2.0.106",
@@ -37,14 +37,14 @@
37
37
  "typescript": "^6.0.3",
38
38
  "vitest": "4.1.8",
39
39
  "zod": "^4.4.3",
40
- "@internal/lint": "0.0.107",
40
+ "@internal/server-adapter-test-utils": "0.0.24",
41
41
  "@internal/storage-test-utils": "0.0.103",
42
+ "@internal/lint": "0.0.107",
42
43
  "@internal/types-builder": "0.0.82",
43
- "@internal/server-adapter-test-utils": "0.0.24",
44
- "@mastra/libsql": "1.14.0",
45
- "@mastra/core": "1.46.0-alpha.1",
46
- "@mastra/memory": "1.21.1-alpha.0",
47
- "@mastra/observability": "1.15.0"
44
+ "@mastra/core": "1.46.0-alpha.3",
45
+ "@mastra/libsql": "1.14.1-alpha.0",
46
+ "@mastra/memory": "1.21.1-alpha.1",
47
+ "@mastra/observability": "1.15.1-alpha.0"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@mastra/core": ">=1.34.0-0 <2.0.0-0",