@mastra/server 1.63.3-alpha.0 → 1.63.3-alpha.1

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,14 @@
1
1
  # @mastra/server
2
2
 
3
+ ## 1.63.3-alpha.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Fixed suspended tool responses timing out while the resumed agent run continues. The endpoint now acknowledges immediately, preventing spurious 504 responses and delayed response-body errors for long-running continuations. ([#22680](https://github.com/mastra-ai/mastra/pull/22680))
8
+
9
+ - Updated dependencies [[`a3606a0`](https://github.com/mastra-ai/mastra/commit/a3606a09f3deaeef17caf04b9c6a0d7cd6b80fe6), [`4095752`](https://github.com/mastra-ai/mastra/commit/40957529233d202446ebecab1f59c76e99910230), [`a3606a0`](https://github.com/mastra-ai/mastra/commit/a3606a09f3deaeef17caf04b9c6a0d7cd6b80fe6)]:
10
+ - @mastra/core@1.63.3-alpha.1
11
+
3
12
  ## 1.63.3-alpha.0
4
13
 
5
14
  ### Patch Changes
@@ -3,7 +3,7 @@ name: mastra-server
3
3
  description: Documentation for @mastra/server. Use when working with @mastra/server APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/server"
6
- version: "1.63.3-alpha.0"
6
+ version: "1.63.3-alpha.1"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -16,16 +16,16 @@ Read the individual reference documents for detailed explanations and code examp
16
16
 
17
17
  ### Docs
18
18
 
19
- - [A2A (Agent-to-Agent)](references/docs-connections-a2a.md) - Expose and call remote Mastra agents over the Agent-to-Agent protocol.
20
- - [Custom adapters](references/docs-server-custom-adapters.md) - Create a custom server adapter for frameworks other than Hono or Express.
21
- - [Custom API routes](references/docs-server-custom-api-routes.md) - Expose additional HTTP endpoints from your Mastra server.
22
- - [Middleware](references/docs-server-middleware.md) - Apply custom middleware functions to intercept requests.
19
+ - [A2A (Agent-to-Agent)](references/docs-connections-a2a.md) - Expose Mastra agents through the Agent-to-Agent protocol and consume remote A2A agents as subagents or call them directly with the client SDK.
20
+ - [Custom adapters](references/docs-server-custom-adapters.md) - Implement a custom Mastra server adapter for unsupported web frameworks by mapping routes, middleware, request parameters, responses, and streams.
21
+ - [Custom API routes](references/docs-server-custom-api-routes.md) - Add custom HTTP endpoints to a Mastra server with schema validation, middleware, authentication, OpenAPI documentation, and control over disconnect behavior.
22
+ - [Middleware](references/docs-server-middleware.md) - Add Mastra server middleware for authentication, authorization, CORS, request logging, route blocking, and request-specific context injection.
23
23
 
24
24
  ### Reference
25
25
 
26
- - [Reference: createRoute()](references/reference-server-create-route.md) - API reference for createRoute() function used to define type-safe routes with validation and OpenAPI generation.
27
- - [Reference: MastraServer](references/reference-server-mastra-server.md) - API reference for the MastraServer abstract class used to create server adapters.
28
- - [Reference: Server routes](references/reference-server-routes.md) - API reference for HTTP routes registered by Mastra server adapters.
26
+ - [Reference: createRoute()](references/reference-server-create-route.md) - Use createRoute() to define type-safe Mastra server routes with Zod validation for requests and responses, plus handler context and OpenAPI metadata.
27
+ - [Reference: MastraServer](references/reference-server-mastra-server.md) - The MastraServer abstract class is the base for all server adapters. Extend this class to create adapters for frameworks other than Hono or Express.
28
+ - [Reference: Server routes](references/reference-server-routes.md) - Server adapters register these routes when you call server.init(). All routes are prefixed with the prefix option if configured.
29
29
 
30
30
 
31
31
  Read [assets/SOURCE_MAP.json](assets/SOURCE_MAP.json) for source code references.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.63.3-alpha.0",
2
+ "version": "1.63.3-alpha.1",
3
3
  "package": "@mastra/server",
4
4
  "exports": {},
5
5
  "modules": {}
@@ -614,10 +614,16 @@ const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = require_route_builder.createRoute
614
614
  requiresPermission: "agent-controller:execute",
615
615
  handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, resumeData, requestContext }) => {
616
616
  try {
617
- await (await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext)).respondToToolSuspension({
618
- toolCallId,
619
- resumeData,
620
- requestContext
617
+ const session = await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext);
618
+ ackBackgroundSessionWork({
619
+ work: session.respondToToolSuspension({
620
+ toolCallId,
621
+ resumeData,
622
+ requestContext
623
+ }),
624
+ session,
625
+ mastra,
626
+ operation: "respondToToolSuspension"
621
627
  });
622
628
  return { ok: true };
623
629
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-controller.cjs","names":["HTTPException","z","createRoute","handleError"],"sources":["../../../src/server/handlers/agent-controller.ts"],"sourcesContent":["import type { Agent } from '@mastra/core/agent';\nimport type {\n AgentController,\n AgentControllerDisplayState,\n AgentControllerEvent,\n ErrorCarryingAgentControllerEvent,\n JsonReadyAgentControllerEvent,\n ReservedThreadMetadataKey,\n Session,\n TokenUsage,\n WireDisplayState,\n} from '@mastra/core/agent-controller';\nimport type { RequestContext } from '@mastra/core/request-context';\n// Type-only import: erased at runtime, so this cannot crash against an older\n// @mastra/core that lacks the `./agent-controller` subpath export. Controller\n// resolution at runtime goes through mastra.getAgentController?.(), never a\n// value import.\nimport { z } from 'zod/v4';\n\nimport { HTTPException } from '../http-exception';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\n/**\n * AgentController session routes.\n *\n * An AgentController registered on a Mastra instance (via\n * `new Mastra({ agentControllers })`) exposes its sessions over HTTP so\n * non-terminal clients — e.g. a browser-based MastraCode — can create sessions,\n * send messages, stream events, and drive run-control. Each route resolves its\n * target AgentController by id, then operates on a session bound to a\n * `resourceId` (get-or-create, so reconnects resume rather than fork the\n * conversation).\n */\n\n/**\n * Internal thread-metadata keys that `Session.loadMetadata()` reads back as\n * runtime bookkeeping (selected model/mode, observer/reflector config, token\n * usage). They share the flat thread `metadata` bag with user-provided session\n * scoping tags, so they must never be treated as tags here.\n *\n * Importing core's list as a value would exceed this package's peer-dependency\n * floor, so it is mirrored under `satisfies`: tsc rejects a missing or extra key.\n */\nconst RESERVED_THREAD_METADATA_KEYS = {\n currentModelId: true,\n currentModeId: true,\n observerModelId: true,\n reflectorModelId: true,\n observationThreshold: true,\n reflectionThreshold: true,\n tokenUsage: true,\n thinkingLevel: true,\n notifications: true,\n} satisfies Record<ReservedThreadMetadataKey, true>;\n\nfunction isReservedThreadMetadataKey(key: string): boolean {\n return Object.hasOwn(RESERVED_THREAD_METADATA_KEYS, key) || key.startsWith('modeModelId_');\n}\n\n/**\n * Resolves a controller by id via the canonical `mastra.getAgentController`\n * accessor, throwing a 404 if no controller is registered under that id.\n */\nfunction getAgentControllerOrThrow(\n mastra: {\n getAgentController?: (id: string) => AgentController<any> | undefined;\n },\n controllerId: string,\n): AgentController<any> {\n const controller = mastra.getAgentController?.(controllerId);\n if (!controller) {\n throw new HTTPException(404, { message: `agent controller \"${controllerId}\" not found` });\n }\n return controller;\n}\n\nasync function getSession(\n controller: AgentController<any>,\n resourceId: string,\n options?: { tags?: Record<string, string>; scope?: string; threadId?: string },\n requestContext?: RequestContext,\n): Promise<Session<any>> {\n await controller.init();\n const { tags, scope, threadId } = options ?? {};\n // Scoped sessions are independent sessions over the same resource (e.g. one\n // per git worktree), so qualify the stable session id with the scope to keep\n // their identities distinct as well. An exact thread binding doubles as the\n // stable session id when supplied.\n const id = threadId ?? (scope ? `${resourceId}::${scope}` : resourceId);\n return controller.createSession({ resourceId, id, ownerId: controller.id, tags, scope, threadId, requestContext });\n}\n\n/**\n * Acknowledges a session operation that keeps running after the response is\n * sent.\n *\n * The messages/steer/follow-up routes answer `{ ok: true }` as soon as the\n * message is handed to the session: the reply itself arrives on the session's\n * SSE stream, so the request must not block for the whole turn. Those session\n * methods can still reject — `sendMessage` deliberately rejects when signal\n * submission fails before a stream starts — and a bare `void promise` turns\n * that into an unhandled rejection, which terminates the process on Node's\n * default `--unhandled-rejections=throw`.\n *\n * Observing the promise keeps the immediate acknowledgement while logging the\n * failure and emitting an `error` event on the session, so a client streaming\n * the session is told the turn died instead of waiting for an `agent_end` that\n * will never come.\n */\nfunction ackBackgroundSessionWork({\n work,\n session,\n mastra,\n operation,\n}: {\n work: Promise<unknown>;\n session: Session<any>;\n mastra: { getLogger?: () => { error?: (message: string, context?: Record<string, unknown>) => void } | undefined };\n operation: string;\n}): void {\n void work.catch((error: unknown) => {\n const failure = error instanceof Error ? error : new Error(String(error));\n mastra.getLogger?.()?.error?.(`AgentController ${operation} failed after the request was acknowledged`, {\n operation,\n error: failure,\n });\n try {\n session.emit({ type: 'error', error: failure });\n } catch {\n // A session that can no longer accept events (e.g. torn down mid-flight)\n // must not turn a logged failure into a second unhandled rejection.\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Schemas\n// ---------------------------------------------------------------------------\n\nconst controllerIdPathParams = z.object({ controllerId: z.string() });\nconst sessionPathParams = z.object({ controllerId: z.string(), resourceId: z.string() });\n/**\n * Optional session scope (mirrors `AgentController.createSession`'s `scope`):\n * requests with the same resourceId but different scopes address independent\n * sessions (e.g. one per git worktree). Sent as a `sessionScope` query param\n * on session routes; named to avoid colliding with the model-switch `scope`.\n */\nconst sessionScopeQuerySchema = z.object({ sessionScope: z.string().optional() });\nconst sessionStateQuerySchema = sessionScopeQuerySchema.extend({ threadId: z.string().optional() });\n\nconst createSessionBodySchema = z.object({\n resourceId: z.string(),\n tags: z.record(z.string(), z.string()).optional(),\n threadId: z.string().optional(),\n sessionScope: z.string().optional(),\n});\n// Server-side attachment limits mirroring the web composer caps (10MB per\n// file, 20MB total), adjusted for base64 overhead (~4/3x).\nconst MAX_FILE_DATA_LENGTH = 14 * 1024 * 1024;\nconst MAX_TOTAL_FILE_DATA_LENGTH = 28 * 1024 * 1024;\n/**\n * Optional client-supplied request context, merged into the server-derived\n * request context by the adapter context middleware (reserved keys are\n * server-controlled). Declared on run-triggering body schemas so the OpenAPI\n * spec documents it.\n */\nconst bodyRequestContextSchema = z.record(z.string(), z.unknown()).optional();\n\nconst sendMessageBodySchema = z.object({\n message: z.string(),\n requestContext: bodyRequestContextSchema,\n // Optional attachments (e.g. pasted images). `data` is base64-encoded.\n files: z\n .array(\n z.object({\n data: z.string().max(MAX_FILE_DATA_LENGTH),\n mediaType: z.string(),\n filename: z.string().optional(),\n }),\n )\n .max(20)\n .refine(files => files.reduce((total, file) => total + file.data.length, 0) <= MAX_TOTAL_FILE_DATA_LENGTH, {\n message: 'Total attachment size exceeds limit',\n })\n .optional(),\n});\nconst steerBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\nconst toolApprovalBodySchema = z.object({\n toolCallId: z.string(),\n approved: z.boolean(),\n requestContext: bodyRequestContextSchema,\n});\nconst toolSuspensionBodySchema = z.object({\n toolCallId: z.string(),\n // Free-form resume payload. For ask_user this is a string (or string[] for\n // multi-select); for submit_plan it's `{ action, feedback? }`; for\n // request_access it's \"Yes\"/\"No\".\n resumeData: z.unknown(),\n requestContext: bodyRequestContextSchema,\n});\nconst switchModeBodySchema = z.object({ modeId: z.string() });\nconst switchModelBodySchema = z.object({\n modelId: z.string(),\n scope: z.enum(['global', 'thread']).optional(),\n modeId: z.string().optional(),\n});\nconst switchThreadBodySchema = z.object({ threadId: z.string() });\nconst createThreadBodySchema = z.object({ title: z.string().optional() });\nconst renameThreadBodySchema = z.object({ title: z.string() });\nconst threadPathParams = z.object({ controllerId: z.string(), resourceId: z.string(), threadId: z.string() });\nconst cloneThreadBodySchema = z.object({\n sourceThreadId: z.string().optional(),\n title: z.string().optional(),\n});\nconst listMessagesQuerySchema = z.object({ limit: z.coerce.number().optional(), sessionScope: z.string().optional() });\n/**\n * `tags` arrives as a JSON-encoded object in the query string (query params are\n * flat strings). It scopes the listing to threads whose metadata matches every\n * tag — e.g. `{ projectPath }` so git worktrees sharing a resourceId each see\n * only their own threads. Malformed JSON is treated as \"no filter\".\n */\nconst listThreadsQuerySchema = z.object({\n limit: z.coerce.number().optional(),\n sessionScope: z.string().optional(),\n tags: z\n .preprocess(value => {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n }, z.record(z.string(), z.string()).optional())\n .optional(),\n});\nconst followUpBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\n\nconst sendNotificationBodySchema = z.object({\n source: z.string(),\n kind: z.string(),\n summary: z.string(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n payload: z.unknown().optional(),\n sourceId: z.string().optional(),\n dedupeKey: z.string().optional(),\n coalesceKey: z.string().optional(),\n attributes: z.record(z.string(), z.unknown()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst listAgentControllersResponseSchema = z.object({\n agentControllers: z.array(z.object({ id: z.string() })),\n});\nconst createSessionResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n});\nconst ackResponseSchema = z.object({ ok: z.boolean() });\n/**\n * Status-line relevant slice of the session's observational-memory progress.\n * Mirrors the TUI status line: `msg pending/threshold ↓removal` (the active\n * message window before an observation fires) and `mem observed/reflection\n * ↓savings` (accumulated observations before a reflection fires).\n */\nconst omProgressSummarySchema = z.object({\n status: z.string(),\n pendingTokens: z.number(),\n threshold: z.number(),\n thresholdPercent: z.number(),\n observationTokens: z.number(),\n reflectionThreshold: z.number(),\n reflectionThresholdPercent: z.number(),\n /** Tokens the next observation will remove from the message window. */\n projectedMessageRemoval: z.number(),\n /** Tokens the next reflection is projected to save. */\n projectedReflectionSavings: z.number(),\n});\nconst tokenUsageSchema = z.object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n totalTokens: z.number(),\n reasoningTokens: z.number().optional(),\n cachedInputTokens: z.number().optional(),\n cacheCreationInputTokens: z.number().optional(),\n cacheCreationInputTokens5m: z.number().optional(),\n cacheCreationInputTokens1h: z.number().optional(),\n raw: z.unknown().optional(),\n}) satisfies z.ZodType<TokenUsage>;\nconst sessionSettingsSchema = z.object({\n yolo: z.boolean(),\n /** Session override only — absent when the session inherits a configured default. */\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh', 'max']).optional(),\n notifications: z.enum(['off', 'bell', 'system', 'both']),\n smartEditing: z.boolean(),\n});\nconst taskSnapshotSchema = z.object({\n id: z.string(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n});\ntype SessionTaskSnapshot = z.infer<typeof taskSnapshotSchema>;\nconst sessionStateResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n modeId: z.string(),\n modelId: z.string(),\n /** Whether the agent is currently executing a run (for initial UI hydration). */\n running: z.boolean().optional(),\n tasks: z.array(taskSnapshotSchema).optional(),\n omProgress: omProgressSummarySchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n settings: sessionSettingsSchema.optional(),\n});\nconst listModesResponseSchema = z.object({\n modes: z.array(z.object({ id: z.string(), name: z.string().optional() })),\n});\nconst listThreadsResponseSchema = z.object({\n threads: z.array(\n z.object({\n id: z.string(),\n title: z.string().optional(),\n updatedAt: z.string().optional(),\n /** The session scoping tags stamped on this thread (e.g. `{ projectPath }`). */\n tags: z.record(z.string(), z.string()).optional(),\n /** Whether a run is currently executing on this thread ('active') or not ('idle'). */\n state: z.enum(['active', 'idle']).optional(),\n }),\n ),\n});\nconst threadResponseSchema = z.object({\n id: z.string(),\n title: z.string().optional(),\n resourceId: z.string().optional(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n});\nconst messagePartSchema = z\n .object({\n type: z.string(),\n })\n .passthrough();\n// Mirrors the persisted `MastraMessageContentV2` shape (AI-SDK-v4 `UIMessage`-style):\n// `format: 2` plus a nested `parts` array, with optional companion fields preserved.\nconst messageContentV2Schema = z\n .object({\n format: z.literal(2),\n parts: z.array(messagePartSchema),\n })\n .passthrough();\nconst listMessagesResponseSchema = z.object({\n messages: z.array(\n z.object({\n id: z.string(),\n role: z.enum(['user', 'assistant', 'system', 'tool', 'signal']),\n content: messageContentV2Schema,\n createdAt: z.string().optional(),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n type: z.string().optional(),\n }),\n ),\n});\nconst listModelsResponseSchema = z.object({\n models: z.array(\n z.object({\n id: z.string(),\n provider: z.string(),\n modelName: z.string(),\n hasApiKey: z.boolean(),\n useCount: z.number(),\n }),\n ),\n});\nconst workspaceStatusResponseSchema = z.object({\n hasWorkspace: z.boolean(),\n isReady: z.boolean(),\n});\nconst omRecordResponseSchema = z.object({\n record: z.unknown().optional(),\n});\nconst permissionPolicyEnum = z.enum(['allow', 'ask', 'deny']);\nconst toolCategoryEnum = z.enum(['read', 'edit', 'execute', 'mcp', 'other']);\nconst permissionRulesResponseSchema = z.object({\n categories: z.record(z.string(), permissionPolicyEnum).optional(),\n tools: z.record(z.string(), permissionPolicyEnum).optional(),\n});\nconst setCategoryPermissionBodySchema = z.object({\n category: toolCategoryEnum,\n policy: permissionPolicyEnum,\n});\nconst setToolPermissionBodySchema = z.object({\n toolName: z.string(),\n policy: permissionPolicyEnum,\n});\n\n// ---------------------------------------------------------------------------\n// Routes\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLERS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller',\n responseType: 'json' as const,\n responseSchema: listAgentControllersResponseSchema,\n summary: 'List agent controllers',\n description: 'Lists the agent controllers hosted on this Mastra instance.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra }) => {\n try {\n const ids = new Set<string>();\n if (mastra.listAgentControllers) {\n for (const id of Object.keys(mastra.listAgentControllers())) ids.add(id);\n }\n return { agentControllers: Array.from(ids).map(id => ({ id })) };\n } catch (error) {\n return handleError(error, 'error listing agent controllers');\n }\n },\n});\n\nexport const CREATE_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n bodySchema: createSessionBodySchema,\n responseSchema: createSessionResponseSchema,\n summary: 'Create or resume a controller session',\n description:\n 'Creates a session for the given resourceId, or returns the existing one (get-or-create), so reconnects resume the conversation.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, tags, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { tags, scope: sessionScope, threadId }, requestContext);\n return {\n controllerId,\n resourceId,\n threadId: session.thread.getId() ?? undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller session');\n }\n },\n});\n\n/**\n * `display_state_changed` Maps JSON-serialize to `{}`. Snapshot the display state\n * before converting its Maps so queued wire events retain point-in-time state.\n */\nfunction toWireDisplayState(displayState: AgentControllerDisplayState): WireDisplayState {\n const snapshot = structuredClone(displayState);\n return {\n ...snapshot,\n activeTools: Object.fromEntries(snapshot.activeTools),\n toolInputBuffers: Object.fromEntries(snapshot.toolInputBuffers),\n pendingSuspensions: Object.fromEntries(snapshot.pendingSuspensions),\n activeSubagents: Object.fromEntries(snapshot.activeSubagents),\n modifiedFiles: Object.fromEntries(snapshot.modifiedFiles),\n };\n}\n\nfunction carriesError(event: AgentControllerEvent): event is ErrorCarryingAgentControllerEvent & { error: Error } {\n return 'error' in event && event.error instanceof Error;\n}\n\n/**\n * An `Error`'s `message`/`name` are non-enumerable, so flatten it before JSON\n * serialization. Streamed message events intentionally retain the controller's\n * live accumulated message; consumers requiring temporal isolation must copy or\n * serialize at their own ownership boundary.\n */\nfunction toWireEvent(event: AgentControllerEvent): JsonReadyAgentControllerEvent {\n if ('displayState' in event) {\n return { ...event, displayState: toWireDisplayState(event.displayState) };\n }\n if (carriesError(event)) {\n return { ...event, error: { name: event.error.name, message: event.error.message } };\n }\n return event;\n}\n\nexport const STREAM_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/stream',\n responseType: 'stream' as const,\n streamFormat: 'sse' as const,\n sseFlushOnConnect: true,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n summary: 'Stream controller session events',\n description: 'Subscribes to a session\\u2019s event bus and streams events to the client over SSE.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, abortSignal, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n\n let cleanedUp = false;\n let heartbeat: ReturnType<typeof setTimeout> | undefined;\n let unsubscribe: (() => void) | undefined;\n const clearHeartbeat = () => {\n if (heartbeat) {\n clearTimeout(heartbeat);\n heartbeat = undefined;\n }\n };\n const cleanup = (controller?: ReadableStreamDefaultController) => {\n if (cleanedUp) return;\n cleanedUp = true;\n clearHeartbeat();\n unsubscribe?.();\n if (controller) {\n try {\n controller.close();\n } catch {}\n }\n };\n\n // The stream yields raw event objects plus `:`-prefixed SSE comments\n // (heartbeats); the server adapter frames events and passes comments\n // through verbatim.\n return new ReadableStream<unknown>({\n start(controller) {\n const scheduleHeartbeat = () => {\n if (cleanedUp) return;\n clearHeartbeat();\n heartbeat = setTimeout(() => {\n heartbeat = undefined;\n if (cleanedUp) return;\n try {\n controller.enqueue(': heartbeat\\n\\n');\n } catch {\n cleanup();\n return;\n }\n scheduleHeartbeat();\n }, 25_000);\n };\n\n unsubscribe = session.subscribe(event => {\n if (cleanedUp) return;\n try {\n // Enqueue the raw event object. The server adapter is responsible\n // for SSE framing (`data: <json>\\n\\n`); enqueuing a pre-framed\n // string here would double-encode it.\n controller.enqueue(toWireEvent(event));\n scheduleHeartbeat();\n } catch {\n cleanup();\n }\n });\n\n const abortCleanup = () => cleanup(controller);\n abortSignal?.addEventListener('abort', abortCleanup, { once: true });\n scheduleHeartbeat();\n },\n cancel() {\n cleanup();\n },\n });\n } catch (error) {\n return handleError(error, 'error streaming controller session');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_MESSAGE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/messages',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendMessageBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Send a message to a controller session',\n description: 'Sends a user message to the session. The reply streams as events on the session\\u2019s SSE stream.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, files, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Forward the server middleware's requestContext so identity injected in\n // `server.middleware` reaches dynamic instructions and tools (same as the\n // plain agent message route).\n ackBackgroundSessionWork({\n work: session.sendMessage({ content: message, files, requestContext }),\n session,\n mastra,\n operation: 'sendMessage',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error sending controller message');\n }\n },\n});\n\nexport const ABORT_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/abort',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Abort a controller session run',\n description: 'Aborts the in-flight run for the session, if any.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n session.abort();\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error aborting controller session');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_APPROVAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-approval',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolApprovalBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a controller tool approval',\n description: 'Approves or declines a pending tool call surfaced by the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, approved, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Resolve the parked approval gate so the session's own run loop drives the\n // continuation and emits its events to subscribers (the open SSE stream).\n // Calling approveToolCall/declineToolCall directly would bypass the gate,\n // leaving the run loop hung and duplicating the resumed stream.\n // Pass toolCallId so a stale request cannot resolve a different pending gate.\n session.respondToToolApproval({ toolCallId, decision: approved ? 'approve' : 'decline', requestContext });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool approval');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-suspension',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolSuspensionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a suspended controller tool',\n description:\n 'Resumes a suspended interactive tool (ask_user, request_access, submit_plan) with the provided resume data.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, resumeData, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.respondToToolSuspension({ toolCallId, resumeData, requestContext });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool suspension');\n }\n },\n});\n\nexport const STEER_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/steer',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: steerBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Steer the in-flight run',\n description: 'Injects a message into the running turn (interjection) without starting a new run.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.steer({ content: message, requestContext }),\n session,\n mastra,\n operation: 'steer',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error steering controller session');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/mode',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModeBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session mode',\n description: 'Switches the active mode (e.g. build, plan) for the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.mode.switch({ modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller mode');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODEL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/model',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModelBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session model',\n description: 'Switches the model for the session, scoped to the thread by default.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modelId, scope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.model.switch({ modelId, scope, modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller model');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/thread',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session thread',\n description: 'Switches the session to an existing thread (rebinding its stream and state).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller thread');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionStateQuerySchema,\n responseSchema: sessionStateResponseSchema,\n summary: 'Get session state',\n description: 'Returns the current mode, model, thread, and durable tasks for initial UI hydration.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId: requestedThreadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const ds = session.displayState.get();\n const threadId = requestedThreadId ?? session.thread.getId() ?? undefined;\n const storage = mastra.getStorage();\n if (requestedThreadId) {\n const memory = await storage?.getStore('memory');\n const thread = await memory?.getThreadById({ threadId: requestedThreadId, resourceId });\n if (!thread) throw new HTTPException(404, { message: `thread \"${requestedThreadId}\" not found` });\n }\n const threadState = threadId ? await storage?.getStore('threadState') : undefined;\n const storedTasks = threadId ? await threadState?.getState<unknown>({ threadId, type: 'task' }) : undefined;\n const parsedTasks = taskSnapshotSchema.array().safeParse(storedTasks);\n const tasks: SessionTaskSnapshot[] = parsedTasks.success ? parsedTasks.data : [];\n const om = ds.omProgress;\n const reflectionSavings =\n om.buffered.reflection.inputObservationTokens - om.buffered.reflection.observationTokens;\n const st = session.state.get() as Record<string, unknown>;\n const oneOf = <T extends string>(value: unknown, allowed: readonly T[], fallback: T): T =>\n allowed.includes(value as T) ? (value as T) : fallback;\n const oneOfOptional = <T extends string>(value: unknown, allowed: readonly T[]): T | undefined =>\n allowed.includes(value as T) ? (value as T) : undefined;\n return {\n controllerId,\n resourceId,\n threadId,\n modeId: session.mode.get(),\n modelId: session.model.get(),\n running: ds.isRunning === true,\n tasks,\n omProgress: {\n status: om.status,\n pendingTokens: om.pendingTokens,\n threshold: om.threshold,\n thresholdPercent: om.thresholdPercent,\n observationTokens: om.observationTokens,\n reflectionThreshold: om.reflectionThreshold,\n reflectionThresholdPercent: om.reflectionThresholdPercent,\n projectedMessageRemoval: om.buffered.observations.projectedMessageRemoval,\n projectedReflectionSavings: reflectionSavings > 0 ? reflectionSavings : 0,\n },\n tokenUsage: ds.tokenUsage,\n settings: {\n yolo: st.yolo === true,\n // No session override → omit, so clients don't mistake an inherited\n // configured default (resolved at request time) for an explicit 'off'.\n thinkingLevel: oneOfOptional(st.thinkingLevel, ['off', 'low', 'medium', 'high', 'xhigh', 'max'] as const),\n notifications: oneOf(st.notifications, ['off', 'bell', 'system', 'both'] as const, 'off'),\n smartEditing: st.smartEditing !== false,\n },\n };\n } catch (error) {\n return handleError(error, 'error reading controller session state');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_MODES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/modes',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModesResponseSchema,\n summary: 'List controller modes',\n description: 'Lists the modes configured on the controller (e.g. build, plan).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return {\n modes: controller.listModes().map(mode => ({ id: mode.id, name: mode.name })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller modes');\n }\n },\n});\n\nconst listActiveRunsResponseSchema = z.object({\n runs: z.array(\n z.object({\n runId: z.string(),\n resourceId: z.string().optional(),\n threadId: z.string(),\n }),\n ),\n});\n\nexport const LIST_AGENT_CONTROLLER_ACTIVE_RUNS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/active-runs',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listActiveRunsResponseSchema,\n summary: 'List active controller runs',\n description:\n 'Lists the runs in flight on the controller across all resources, without creating or touching a session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return { runs: controller.listActiveThreadRuns() };\n } catch (error) {\n return handleError(error, 'error listing active controller runs');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREADS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: listThreadsQuerySchema,\n responseSchema: listThreadsResponseSchema,\n summary: 'List session threads',\n description:\n 'Lists the threads for the session\\u2019s resource, most-recently-updated first. Pass `limit` to return only the newest N (e.g. for a sidebar). Pass `tags` (a JSON-encoded object) to scope the list to threads matching every tag \\u2014 e.g. `{ projectPath }` so git worktrees sharing a resourceId each see only their own threads.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, limit, tags }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. `createSession` triggers workspace/sandbox initialization\n // (5–17s stall, cost per provisioned sandbox) as a side effect — reads\n // shouldn't pay that. Session creation happens on the write path.\n // `queryThreads` lazily initializes storage (not workspace) on its own.\n const threads = await controller.queryThreads({ resourceId });\n // A thread's metadata mixes the session scoping tags (stamped at creation,\n // e.g. `projectPath`) with internal session bookkeeping that\n // `Session.loadMetadata()` reads back (selected model/mode, observer/\n // reflector config, token usage). Return only the string-valued scoping\n // tags, skipping reserved internal keys so they never leak out as \"tags\"\n // or become matchable via the `tags` filter.\n const getTags = (t: { metadata?: unknown }): Record<string, string> => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (typeof value === 'string' && !isReservedThreadMetadataKey(key)) result[key] = value;\n }\n return result;\n };\n // A single resourceId can be shared across git worktrees of the same repo\n // (the id is derived from the git URL). When tags are supplied, scope to\n // threads whose metadata matches every tag and drop the rest, so worktree A\n // never shows worktree B's threads. Mirrors the controller's tag-aware\n // selection and the TUI's worktree-strict listing. Reserved internal keys\n // are ignored as filter tags so callers can't match on session bookkeeping.\n const tagEntries = tags ? Object.entries(tags).filter(([key]) => !isReservedThreadMetadataKey(key)) : [];\n const scoped =\n tagEntries.length > 0\n ? threads.filter(t => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n return tagEntries.every(([key, value]) => metadata[key] === value);\n })\n : threads;\n const toTime = (t: { updatedAt?: Date; createdAt?: Date }) => (t.updatedAt ?? t.createdAt)?.getTime() ?? 0;\n const sorted = [...scoped].sort((a, b) => toTime(b) - toTime(a));\n const max = Number(limit);\n const limited = Number.isFinite(max) && max > 0 ? sorted.slice(0, max) : sorted;\n // Thread run state comes from the controller-wide active-run registry,\n // which unions per-agent active thread runs across all backing agents.\n // Keyed by resourceId + threadId so it covers runs started by any session\n // on this resource — including sessions scoped to other git worktrees.\n // Using this controller-level accessor (rather than resolving an agent\n // via a Session) keeps the read path free of session/workspace\n // side-effects.\n const activeThreadIds = new Set(\n controller\n .listActiveThreadRuns()\n .filter(r => r.resourceId === resourceId)\n .map(r => r.threadId),\n );\n return {\n threads: limited.map(t => {\n const threadTags = getTags(t);\n return {\n id: t.id,\n title: t.title,\n tags: Object.keys(threadTags).length > 0 ? threadTags : undefined,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : undefined,\n state: activeThreadIds.has(t.id) ? ('active' as const) : ('idle' as const),\n };\n }),\n };\n } catch (error) {\n return handleError(error, 'error listing controller threads');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_NOTIFICATION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/notifications',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendNotificationBodySchema,\n responseSchema: z.object({\n accepted: z.boolean(),\n notificationId: z.string().optional(),\n decision: z.string().optional(),\n runId: z.string().optional(),\n }),\n summary: 'Send a notification signal to a session',\n description:\n 'Delivers a notification to the session\\u2019s current agent/thread. The agent\\u2019s delivery policy determines whether the notification wakes an idle thread, is summarised, or is persisted for later.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes,\n metadata,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const result = await session.sendNotificationSignal({\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes: attributes as Record<string, string | number | boolean | null | undefined> | undefined,\n metadata,\n });\n return {\n accepted: result.accepted !== undefined,\n notificationId: result.record?.id,\n decision: result.decision?.action,\n runId: result.runId,\n };\n } catch (error) {\n return handleError(error, 'error sending controller notification');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Thread lifecycle\n// ---------------------------------------------------------------------------\n\nexport const CREATE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: createThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Create a new thread',\n description: 'Creates a new thread in the session (unbinds the previous thread, binds the new one).',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.create({ title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller thread');\n }\n },\n});\n\nexport const DELETE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Delete a thread',\n description: 'Deletes a thread. If the deleted thread is the active one, the session is unbound.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.thread.delete({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error deleting controller thread');\n }\n },\n});\n\nexport const RENAME_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: renameThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Rename a thread',\n description: 'Renames the specified thread.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Ensure the thread is the active one (switch if not)\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n await session.thread.rename({ title });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error renaming controller thread');\n }\n },\n});\n\nexport const CLONE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/clone',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: cloneThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Clone a thread',\n description: 'Clones a thread (and its messages). The session binds to the new clone.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, sourceThreadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.clone({ sourceThreadId, title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error cloning controller thread');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREAD_MESSAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId/messages',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: listMessagesQuerySchema,\n responseSchema: listMessagesResponseSchema,\n summary: 'List thread messages',\n description: 'Lists messages for a specific thread. Returns most recent messages first.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, threadId, limit }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. Session creation would trigger workspace/sandbox\n // initialization as a side effect; reads should never pay that cost.\n // The query methods lazily initialize storage (not workspace) on their own.\n // The route is authorized for the URL's resourceId, but `threadId` is\n // otherwise unscoped. Verify the thread belongs to this resource so a\n // caller can't peek at another resource's messages by guessing an id\n // — matches the check `session.thread.listMessages` performed via\n // `session.thread.set` before we bypassed session construction.\n const thread = await controller.queryThreadById({ threadId });\n if (!thread || thread.resourceId !== resourceId) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const messages = await controller.queryThreadMessages({ threadId, limit });\n return {\n messages: messages.map(m => ({\n id: m.id,\n role: m.role,\n content: m.content as { format: 2; parts: Array<{ type: string; [key: string]: unknown }> },\n createdAt: m.createdAt instanceof Date ? m.createdAt.toISOString() : undefined,\n threadId: m.threadId,\n resourceId: m.resourceId,\n type: m.type,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller thread messages');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Follow-up\n// ---------------------------------------------------------------------------\n\nexport const FOLLOW_UP_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/follow-up',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: followUpBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Queue a follow-up message',\n description:\n 'Queues a follow-up message. If the session is idle it sends immediately; if a run is active it queues for after completion.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.followUp({ content: message, requestContext }),\n session,\n mastra,\n operation: 'followUp',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error queuing controller follow-up');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Models\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLER_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/models',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModelsResponseSchema,\n summary: 'List available models',\n description: 'Lists all models available on this controller (with auth status and use counts).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n const models = await controller.listAvailableModels();\n return {\n models: models.map(m => ({\n id: m.id,\n provider: m.provider,\n modelName: m.modelName,\n hasApiKey: m.hasApiKey,\n useCount: m.useCount,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller models');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Workspace status\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_WORKSPACE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/workspace',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: workspaceStatusResponseSchema,\n summary: 'Get workspace status',\n description: 'Returns whether the controller has a workspace configured and whether it is ready.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n return {\n hasWorkspace: controller.hasWorkspace(),\n isReady: controller.isWorkspaceReady(),\n };\n } catch (error) {\n return handleError(error, 'error reading controller workspace status');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Observational Memory\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_OM_RECORD_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/om',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: omRecordResponseSchema,\n summary: 'Get observational memory record',\n description: 'Returns the current observational memory record for the session\\u2019s thread/resource.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const record = await controller.getObservationalMemoryRecord(session);\n return { record: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller OM record');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Resource identity\n// ---------------------------------------------------------------------------\n\nexport const SET_AGENT_CONTROLLER_RESOURCE_ID_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resource',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: z.object({ newResourceId: z.string() }),\n responseSchema: ackResponseSchema,\n summary: 'Change the session resource ID',\n description: 'Updates the session\\u2019s resource identity (e.g. when a user logs in).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, newResourceId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await controller.setResourceId(session, { resourceId: newResourceId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller resource ID');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_RESOURCE_IDS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resources',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: z.object({ resourceIds: z.array(z.string()) }),\n summary: 'Get known resource IDs',\n description: 'Lists the resource IDs known to this session (from threads).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const resourceIds = await controller.getKnownResourceIds(session);\n return { resourceIds };\n } catch (error) {\n return handleError(error, 'error listing controller resource IDs');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Goals\n// ---------------------------------------------------------------------------\n\nconst setGoalBodySchema = z.object({\n objective: z.string(),\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n});\nconst updateGoalBodySchema = z.object({\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n status: z.enum(['active', 'paused', 'done']).optional(),\n});\nconst goalRecordSchema = z.object({\n id: z.string().optional(),\n objective: z.string(),\n status: z.enum(['active', 'paused', 'done']),\n runsUsed: z.number(),\n maxRuns: z.number().optional(),\n judgeModelId: z.string().optional(),\n startedAt: z.number(),\n updatedAt: z.number(),\n pausedReason: z.string().optional(),\n});\nconst goalResponseSchema = z.object({ goal: goalRecordSchema.optional() });\n\nfunction getAgentForSession(controller: AgentController<any>, session: Session<any>): Agent {\n return controller.getCurrentAgent(session);\n}\n\nexport const GET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: goalResponseSchema,\n summary: 'Get the current goal',\n description: 'Returns the active/paused/done goal objective for the session\\u2019s thread, if any.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) return { goal: undefined };\n const agent = getAgentForSession(controller, session);\n const record = await agent.getObjective({ threadId });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller goal');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Set a goal',\n description:\n 'Sets a new objective for the session\\u2019s thread. The agent\\u2019s in-loop goal judge evaluates progress after each turn.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n objective,\n judgeModelId,\n maxRuns,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.setObjective(objective, {\n threadId,\n resourceId: session.identity.getResourceId(),\n ...(judgeModelId ? { judgeModelId } : {}),\n ...(maxRuns != null ? { maxRuns } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error setting controller goal');\n }\n },\n});\n\nexport const UPDATE_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: updateGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Update goal options',\n description: 'Updates the judge model, max runs, or status of the active goal. No-op when no goal is set.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n judgeModelId,\n maxRuns,\n status,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.updateObjectiveOptions({\n threadId,\n ...(judgeModelId !== undefined ? { judgeModelId } : {}),\n ...(maxRuns !== undefined ? { maxRuns } : {}),\n ...(status !== undefined ? { status } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error updating controller goal');\n }\n },\n});\n\nexport const CLEAR_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Clear the goal',\n description: 'Removes the active goal from the session\\u2019s thread.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n await agent.clearObjective({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error clearing controller goal');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Permissions\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_PERMISSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: permissionRulesResponseSchema,\n summary: 'Get permission rules',\n description: 'Returns the current permission rules (per-category and per-tool policies) for the session.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const rules = session.permissions.getRules();\n return {\n categories: rules.categories as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n tools: rules.tools as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n };\n } catch (error) {\n return handleError(error, 'error getting controller permissions');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_CATEGORY_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/category',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setCategoryPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a tool category',\n description: 'Sets the approval policy (allow/ask/deny) for all tools in a category.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, category, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForCategory({ category, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller category permission');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_TOOL_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/tool',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setToolPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a specific tool',\n description:\n 'Sets the approval policy (allow/ask/deny) for a specific tool by name. Per-tool overrides take precedence over category policies.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolName, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForTool({ toolName, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller tool permission');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Session State\n// ---------------------------------------------------------------------------\n\nconst setSessionStateBodySchema = z.object({ state: z.record(z.string(), z.unknown()) });\n\nexport const SET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/state',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setSessionStateBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set session state',\n description:\n 'Merges the provided key-value pairs into the session state. Existing keys not in the payload are preserved.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, state, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.state.set(state as Record<string, unknown>);\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller session state');\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,MAAM,gCAAgC;CACpC,gBAAgB;CAChB,eAAe;CACf,iBAAiB;CACjB,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,YAAY;CACZ,eAAe;CACf,eAAe;AACjB;AAEA,SAAS,4BAA4B,KAAsB;CACzD,OAAO,OAAO,OAAO,+BAA+B,GAAG,KAAK,IAAI,WAAW,cAAc;AAC3F;;;;;AAMA,SAAS,0BACP,QAGA,cACsB;CACtB,MAAM,aAAa,OAAO,qBAAqB,YAAY;CAC3D,IAAI,CAAC,YACH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,qBAAqB,aAAa,aAAa,CAAC;CAE1F,OAAO;AACT;AAEA,eAAe,WACb,YACA,YACA,SACA,gBACuB;CACvB,MAAM,WAAW,KAAK;CACtB,MAAM,EAAE,MAAM,OAAO,aAAa,WAAW,CAAC;CAK9C,MAAM,KAAK,aAAa,QAAQ,GAAG,WAAW,IAAI,UAAU;CAC5D,OAAO,WAAW,cAAc;EAAE;EAAY;EAAI,SAAS,WAAW;EAAI;EAAM;EAAO;EAAU;CAAe,CAAC;AACnH;;;;;;;;;;;;;;;;;;AAmBA,SAAS,yBAAyB,EAChC,MACA,SACA,QACA,aAMO;CACP,KAAU,OAAO,UAAmB;EAClC,MAAM,UAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;EACxE,OAAO,YAAY,CAAC,EAAE,QAAQ,mBAAmB,UAAU,6CAA6C;GACtG;GACA,OAAO;EACT,CAAC;EACD,IAAI;GACF,QAAQ,KAAK;IAAE,MAAM;IAAS,OAAO;GAAQ,CAAC;EAChD,QAAQ,CAGR;CACF,CAAC;AACH;AAMA,MAAM,yBAAyBC,OAAAA,EAAE,OAAO,EAAE,cAAcA,OAAAA,EAAE,OAAO,EAAE,CAAC;AACpE,MAAM,oBAAoBA,OAAAA,EAAE,OAAO;CAAE,cAAcA,OAAAA,EAAE,OAAO;CAAG,YAAYA,OAAAA,EAAE,OAAO;AAAE,CAAC;;;;;;;AAOvF,MAAM,0BAA0BA,OAAAA,EAAE,OAAO,EAAE,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;AAChF,MAAM,0BAA0B,wBAAwB,OAAO,EAAE,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;AAElG,MAAM,0BAA0BA,OAAAA,EAAE,OAAO;CACvC,YAAYA,OAAAA,EAAE,OAAO;CACrB,MAAMA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CAChD,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AACpC,CAAC;AAGD,MAAM,uBAAuB,KAAK,OAAO;AACzC,MAAM,6BAA6B,KAAK,OAAO;;;;;;;AAO/C,MAAM,2BAA2BA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;AAE5E,MAAM,wBAAwBA,OAAAA,EAAE,OAAO;CACrC,SAASA,OAAAA,EAAE,OAAO;CAClB,gBAAgB;CAEhB,OAAOA,OAAAA,EACJ,MACCA,OAAAA,EAAE,OAAO;EACP,MAAMA,OAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,oBAAoB;EACzC,WAAWA,OAAAA,EAAE,OAAO;EACpB,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAChC,CAAC,CACH,CAAC,CACA,IAAI,EAAE,CAAC,CACP,QAAO,UAAS,MAAM,QAAQ,OAAO,SAAS,QAAQ,KAAK,KAAK,QAAQ,CAAC,KAAK,4BAA4B,EACzG,SAAS,sCACX,CAAC,CAAC,CACD,SAAS;AACd,CAAC;AACD,MAAM,kBAAkBA,OAAAA,EAAE,OAAO;CAAE,SAASA,OAAAA,EAAE,OAAO;CAAG,gBAAgB;AAAyB,CAAC;AAClG,MAAM,yBAAyBA,OAAAA,EAAE,OAAO;CACtC,YAAYA,OAAAA,EAAE,OAAO;CACrB,UAAUA,OAAAA,EAAE,QAAQ;CACpB,gBAAgB;AAClB,CAAC;AACD,MAAM,2BAA2BA,OAAAA,EAAE,OAAO;CACxC,YAAYA,OAAAA,EAAE,OAAO;CAIrB,YAAYA,OAAAA,EAAE,QAAQ;CACtB,gBAAgB;AAClB,CAAC;AACD,MAAM,uBAAuBA,OAAAA,EAAE,OAAO,EAAE,QAAQA,OAAAA,EAAE,OAAO,EAAE,CAAC;AAC5D,MAAM,wBAAwBA,OAAAA,EAAE,OAAO;CACrC,SAASA,OAAAA,EAAE,OAAO;CAClB,OAAOA,OAAAA,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC,CAAC,CAAC,SAAS;CAC7C,QAAQA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAC9B,CAAC;AACD,MAAM,yBAAyBA,OAAAA,EAAE,OAAO,EAAE,UAAUA,OAAAA,EAAE,OAAO,EAAE,CAAC;AAChE,MAAM,yBAAyBA,OAAAA,EAAE,OAAO,EAAE,OAAOA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;AACxE,MAAM,yBAAyBA,OAAAA,EAAE,OAAO,EAAE,OAAOA,OAAAA,EAAE,OAAO,EAAE,CAAC;AAC7D,MAAM,mBAAmBA,OAAAA,EAAE,OAAO;CAAE,cAAcA,OAAAA,EAAE,OAAO;CAAG,YAAYA,OAAAA,EAAE,OAAO;CAAG,UAAUA,OAAAA,EAAE,OAAO;AAAE,CAAC;AAC5G,MAAM,wBAAwBA,OAAAA,EAAE,OAAO;CACrC,gBAAgBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACpC,OAAOA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAC7B,CAAC;AACD,MAAM,0BAA0BA,OAAAA,EAAE,OAAO;CAAE,OAAOA,OAAAA,EAAE,OAAO,OAAO,CAAC,CAAC,SAAS;CAAG,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAAE,CAAC;;;;;;;AAOrH,MAAM,yBAAyBA,OAAAA,EAAE,OAAO;CACtC,OAAOA,OAAAA,EAAE,OAAO,OAAO,CAAC,CAAC,SAAS;CAClC,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,MAAMA,OAAAA,EACH,YAAW,UAAS;EACnB,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG,OAAO,KAAA;EAC5D,IAAI;GACF,OAAO,KAAK,MAAM,KAAK;EACzB,QAAQ;GACN;EACF;CACF,GAAGA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAC9C,SAAS;AACd,CAAC;AACD,MAAM,qBAAqBA,OAAAA,EAAE,OAAO;CAAE,SAASA,OAAAA,EAAE,OAAO;CAAG,gBAAgB;AAAyB,CAAC;AAErG,MAAM,6BAA6BA,OAAAA,EAAE,OAAO;CAC1C,QAAQA,OAAAA,EAAE,OAAO;CACjB,MAAMA,OAAAA,EAAE,OAAO;CACf,SAASA,OAAAA,EAAE,OAAO;CAClB,UAAUA,OAAAA,EAAE,KAAK;EAAC;EAAO;EAAU;EAAQ;CAAQ,CAAC,CAAC,CAAC,SAAS;CAC/D,SAASA,OAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS;CAC9B,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,WAAWA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,aAAaA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,YAAYA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CACvD,UAAUA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;AACvD,CAAC;AAED,MAAM,qCAAqCA,OAAAA,EAAE,OAAO,EAClD,kBAAkBA,OAAAA,EAAE,MAAMA,OAAAA,EAAE,OAAO,EAAE,IAAIA,OAAAA,EAAE,OAAO,EAAE,CAAC,CAAC,EACxD,CAAC;AACD,MAAM,8BAA8BA,OAAAA,EAAE,OAAO;CAC3C,cAAcA,OAAAA,EAAE,OAAO;CACvB,YAAYA,OAAAA,EAAE,OAAO;CACrB,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAChC,CAAC;AACD,MAAM,oBAAoBA,OAAAA,EAAE,OAAO,EAAE,IAAIA,OAAAA,EAAE,QAAQ,EAAE,CAAC;;;;;;;AAOtD,MAAM,0BAA0BA,OAAAA,EAAE,OAAO;CACvC,QAAQA,OAAAA,EAAE,OAAO;CACjB,eAAeA,OAAAA,EAAE,OAAO;CACxB,WAAWA,OAAAA,EAAE,OAAO;CACpB,kBAAkBA,OAAAA,EAAE,OAAO;CAC3B,mBAAmBA,OAAAA,EAAE,OAAO;CAC5B,qBAAqBA,OAAAA,EAAE,OAAO;CAC9B,4BAA4BA,OAAAA,EAAE,OAAO;;CAErC,yBAAyBA,OAAAA,EAAE,OAAO;;CAElC,4BAA4BA,OAAAA,EAAE,OAAO;AACvC,CAAC;AACD,MAAM,mBAAmBA,OAAAA,EAAE,OAAO;CAChC,cAAcA,OAAAA,EAAE,OAAO;CACvB,kBAAkBA,OAAAA,EAAE,OAAO;CAC3B,aAAaA,OAAAA,EAAE,OAAO;CACtB,iBAAiBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACrC,mBAAmBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACvC,0BAA0BA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9C,4BAA4BA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAChD,4BAA4BA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAChD,KAAKA,OAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS;AAC5B,CAAC;AACD,MAAM,wBAAwBA,OAAAA,EAAE,OAAO;CACrC,MAAMA,OAAAA,EAAE,QAAQ;;CAEhB,eAAeA,OAAAA,EAAE,KAAK;EAAC;EAAO;EAAO;EAAU;EAAQ;EAAS;CAAK,CAAC,CAAC,CAAC,SAAS;CACjF,eAAeA,OAAAA,EAAE,KAAK;EAAC;EAAO;EAAQ;EAAU;CAAM,CAAC;CACvD,cAAcA,OAAAA,EAAE,QAAQ;AAC1B,CAAC;AACD,MAAM,qBAAqBA,OAAAA,EAAE,OAAO;CAClC,IAAIA,OAAAA,EAAE,OAAO;CACb,SAASA,OAAAA,EAAE,OAAO;CAClB,QAAQA,OAAAA,EAAE,KAAK;EAAC;EAAW;EAAe;CAAW,CAAC;CACtD,YAAYA,OAAAA,EAAE,OAAO;AACvB,CAAC;AAED,MAAM,6BAA6BA,OAAAA,EAAE,OAAO;CAC1C,cAAcA,OAAAA,EAAE,OAAO;CACvB,YAAYA,OAAAA,EAAE,OAAO;CACrB,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,QAAQA,OAAAA,EAAE,OAAO;CACjB,SAASA,OAAAA,EAAE,OAAO;;CAElB,SAASA,OAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS;CAC9B,OAAOA,OAAAA,EAAE,MAAM,kBAAkB,CAAC,CAAC,SAAS;CAC5C,YAAY,wBAAwB,SAAS;CAC7C,YAAY,iBAAiB,SAAS;CACtC,UAAU,sBAAsB,SAAS;AAC3C,CAAC;AACD,MAAM,0BAA0BA,OAAAA,EAAE,OAAO,EACvC,OAAOA,OAAAA,EAAE,MAAMA,OAAAA,EAAE,OAAO;CAAE,IAAIA,OAAAA,EAAE,OAAO;CAAG,MAAMA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAAE,CAAC,CAAC,EAC1E,CAAC;AACD,MAAM,4BAA4BA,OAAAA,EAAE,OAAO,EACzC,SAASA,OAAAA,EAAE,MACTA,OAAAA,EAAE,OAAO;CACP,IAAIA,OAAAA,EAAE,OAAO;CACb,OAAOA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,WAAWA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE/B,MAAMA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;;CAEhD,OAAOA,OAAAA,EAAE,KAAK,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,SAAS;AAC7C,CAAC,CACH,EACF,CAAC;AACD,MAAM,uBAAuBA,OAAAA,EAAE,OAAO;CACpC,IAAIA,OAAAA,EAAE,OAAO;CACb,OAAOA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,YAAYA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAChC,WAAWA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,WAAWA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AACjC,CAAC;AACD,MAAM,oBAAoBA,OAAAA,EACvB,OAAO,EACN,MAAMA,OAAAA,EAAE,OAAO,EACjB,CAAC,CAAC,CACD,YAAY;AAGf,MAAM,yBAAyBA,OAAAA,EAC5B,OAAO;CACN,QAAQA,OAAAA,EAAE,QAAQ,CAAC;CACnB,OAAOA,OAAAA,EAAE,MAAM,iBAAiB;AAClC,CAAC,CAAC,CACD,YAAY;AACf,MAAM,6BAA6BA,OAAAA,EAAE,OAAO,EAC1C,UAAUA,OAAAA,EAAE,MACVA,OAAAA,EAAE,OAAO;CACP,IAAIA,OAAAA,EAAE,OAAO;CACb,MAAMA,OAAAA,EAAE,KAAK;EAAC;EAAQ;EAAa;EAAU;EAAQ;CAAQ,CAAC;CAC9D,SAAS;CACT,WAAWA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,YAAYA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAChC,MAAMA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAC5B,CAAC,CACH,EACF,CAAC;AACD,MAAM,2BAA2BA,OAAAA,EAAE,OAAO,EACxC,QAAQA,OAAAA,EAAE,MACRA,OAAAA,EAAE,OAAO;CACP,IAAIA,OAAAA,EAAE,OAAO;CACb,UAAUA,OAAAA,EAAE,OAAO;CACnB,WAAWA,OAAAA,EAAE,OAAO;CACpB,WAAWA,OAAAA,EAAE,QAAQ;CACrB,UAAUA,OAAAA,EAAE,OAAO;AACrB,CAAC,CACH,EACF,CAAC;AACD,MAAM,gCAAgCA,OAAAA,EAAE,OAAO;CAC7C,cAAcA,OAAAA,EAAE,QAAQ;CACxB,SAASA,OAAAA,EAAE,QAAQ;AACrB,CAAC;AACD,MAAM,yBAAyBA,OAAAA,EAAE,OAAO,EACtC,QAAQA,OAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS,EAC/B,CAAC;AACD,MAAM,uBAAuBA,OAAAA,EAAE,KAAK;CAAC;CAAS;CAAO;AAAM,CAAC;AAC5D,MAAM,mBAAmBA,OAAAA,EAAE,KAAK;CAAC;CAAQ;CAAQ;CAAW;CAAO;AAAO,CAAC;AAC3E,MAAM,gCAAgCA,OAAAA,EAAE,OAAO;CAC7C,YAAYA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAG,oBAAoB,CAAC,CAAC,SAAS;CAChE,OAAOA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAG,oBAAoB,CAAC,CAAC,SAAS;AAC7D,CAAC;AACD,MAAM,kCAAkCA,OAAAA,EAAE,OAAO;CAC/C,UAAU;CACV,QAAQ;AACV,CAAC;AACD,MAAM,8BAA8BA,OAAAA,EAAE,OAAO;CAC3C,UAAUA,OAAAA,EAAE,OAAO;CACnB,QAAQ;AACV,CAAC;AAMD,MAAa,+BAA+BC,sBAAAA,YAAY;CACtD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,aAAa;EAC7B,IAAI;GACF,MAAM,sBAAM,IAAI,IAAY;GAC5B,IAAI,OAAO,sBACT,KAAK,MAAM,MAAM,OAAO,KAAK,OAAO,qBAAqB,CAAC,GAAG,IAAI,IAAI,EAAE;GAEzE,OAAO,EAAE,kBAAkB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAI,QAAO,EAAE,GAAG,EAAE,EAAE;EACjE,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC;AAED,MAAa,wCAAwCD,sBAAAA,YAAY;CAC/D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,MAAM,UAAU,qBAAqB;EACrG,IAAI;GAGF,OAAO;IACL;IACA;IACA,WAAU,MAJU,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY;KAAE;KAAM,OAAO;KAAc;IAAS,GAAG,cAAc,EAAA,CAI5F,OAAO,MAAM,KAAK,KAAA;GACtC;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,mCAAmC;EAC/D;CACF;AACF,CAAC;;;;;AAMD,SAAS,mBAAmB,cAA6D;CACvF,MAAM,WAAW,gBAAgB,YAAY;CAC7C,OAAO;EACL,GAAG;EACH,aAAa,OAAO,YAAY,SAAS,WAAW;EACpD,kBAAkB,OAAO,YAAY,SAAS,gBAAgB;EAC9D,oBAAoB,OAAO,YAAY,SAAS,kBAAkB;EAClE,iBAAiB,OAAO,YAAY,SAAS,eAAe;EAC5D,eAAe,OAAO,YAAY,SAAS,aAAa;CAC1D;AACF;AAEA,SAAS,aAAa,OAA4F;CAChH,OAAO,WAAW,SAAS,MAAM,iBAAiB;AACpD;;;;;;;AAQA,SAAS,YAAY,OAA4D;CAC/E,IAAI,kBAAkB,OACpB,OAAO;EAAE,GAAG;EAAO,cAAc,mBAAmB,MAAM,YAAY;CAAE;CAE1E,IAAI,aAAa,KAAK,GACpB,OAAO;EAAE,GAAG;EAAO,OAAO;GAAE,MAAM,MAAM,MAAM;GAAM,SAAS,MAAM,MAAM;EAAQ;CAAE;CAErF,OAAO;AACT;AAEA,MAAa,wCAAwCD,sBAAAA,YAAY;CAC/D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,cAAc;CACd,mBAAmB;CACnB,iBAAiB;CACjB,kBAAkB;CAClB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,WAAW;CACrC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,aAAa,qBAAqB;EAClG,IAAI;GAEF,MAAM,UAAU,MAAM,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAEhG,IAAI,YAAY;GAChB,IAAI;GACJ,IAAI;GACJ,MAAM,uBAAuB;IAC3B,IAAI,WAAW;KACb,aAAa,SAAS;KACtB,YAAY,KAAA;IACd;GACF;GACA,MAAM,WAAW,eAAiD;IAChE,IAAI,WAAW;IACf,YAAY;IACZ,eAAe;IACf,cAAc;IACd,IAAI,YACF,IAAI;KACF,WAAW,MAAM;IACnB,QAAQ,CAAC;GAEb;GAKA,OAAO,IAAI,eAAwB;IACjC,MAAM,YAAY;KAChB,MAAM,0BAA0B;MAC9B,IAAI,WAAW;MACf,eAAe;MACf,YAAY,iBAAiB;OAC3B,YAAY,KAAA;OACZ,IAAI,WAAW;OACf,IAAI;QACF,WAAW,QAAQ,iBAAiB;OACtC,QAAQ;QACN,QAAQ;QACR;OACF;OACA,kBAAkB;MACpB,GAAG,IAAM;KACX;KAEA,cAAc,QAAQ,WAAU,UAAS;MACvC,IAAI,WAAW;MACf,IAAI;OAIF,WAAW,QAAQ,YAAY,KAAK,CAAC;OACrC,kBAAkB;MACpB,QAAQ;OACN,QAAQ;MACV;KACF,CAAC;KAED,MAAM,qBAAqB,QAAQ,UAAU;KAC7C,aAAa,iBAAiB,SAAS,cAAc,EAAE,MAAM,KAAK,CAAC;KACnE,kBAAkB;IACpB;IACA,SAAS;KACP,QAAQ;IACV;GACF,CAAC;EACH,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,oCAAoC;EAChE;CACF;AACF,CAAC;AAED,MAAa,sCAAsCD,sBAAAA,YAAY;CAC7D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,WAAW;CACrC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,SAAS,OAAO,qBAAqB;EACrG,IAAI;GAEF,MAAM,UAAU,MAAM,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAIhG,yBAAyB;IACvB,MAAM,QAAQ,YAAY;KAAE,SAAS;KAAS;KAAO;IAAe,CAAC;IACrE;IACA;IACA,WAAW;GACb,CAAC;GACD,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,kCAAkC;EAC9D;CACF;AACF,CAAC;AAED,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,qBAAqB;EACrF,IAAI;GAGF,CAAA,MADsB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CACxF,MAAM;GACd,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,mCAAmC;EAC/D;CACF;AACF,CAAC;AAED,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,YAAY,UAAU,qBAAqB;EAC3G,IAAI;GAQF,CAAA,MANsB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAMxF,sBAAsB;IAAE;IAAY,UAAU,WAAW,YAAY;IAAW;GAAe,CAAC;GACxG,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,8CAA8C;EAC1E;CACF;AACF,CAAC;AAED,MAAa,yCAAyCD,sBAAAA,YAAY;CAChE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,YAAY,YAAY,qBAAqB;EAC7G,IAAI;GAGF,OAAM,MADgB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAClF,wBAAwB;IAAE;IAAY;IAAY;GAAe,CAAC;GAChF,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,gDAAgD;EAC5E;CACF;AACF,CAAC;AAED,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,SAAS,qBAAqB;EAC9F,IAAI;GAEF,MAAM,UAAU,MAAM,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,yBAAyB;IACvB,MAAM,QAAQ,MAAM;KAAE,SAAS;KAAS;IAAe,CAAC;IACxD;IACA;IACA,WAAW;GACb,CAAC;GACD,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,mCAAmC;EAC/D;CACF;AACF,CAAC;AAED,MAAa,qCAAqCD,sBAAAA,YAAY;CAC5D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,QAAQ,qBAAqB;EAC7F,IAAI;GAGF,OAAM,MADgB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAClF,KAAK,OAAO,EAAE,OAAO,CAAC;GACpC,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC;AAED,MAAa,sCAAsCD,sBAAAA,YAAY;CAC7D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,SAAS,OAAO,QAAQ,qBAAqB;EAC7G,IAAI;GAGF,OAAM,MADgB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAClF,MAAM,OAAO;IAAE;IAAS;IAAO;GAAO,CAAC;GACrD,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,kCAAkC;EAC9D;CACF;AACF,CAAC;AAED,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,UAAU,qBAAqB;EAC/F,IAAI;GAEF,MAAM,UAAU,MAAM,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,IAAI,QAAQ,OAAO,MAAM,MAAM,UAC7B,MAAM,QAAQ,OAAO,OAAO,EAAE,SAAS,CAAC;GAE1C,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,mCAAmC;EAC/D;CACF;AACF,CAAC;AAED,MAAa,2CAA2CD,sBAAAA,YAAY;CAClE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,UAAU,mBAAmB,qBAAqB;EAClH,IAAI;GAEF,MAAM,UAAU,MAAM,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,MAAM,KAAK,QAAQ,aAAa,IAAI;GACpC,MAAM,WAAW,qBAAqB,QAAQ,OAAO,MAAM,KAAK,KAAA;GAChE,MAAM,UAAU,OAAO,WAAW;GAClC,IAAI,mBAGE;QAAA,CAAC,OADgB,MADA,SAAS,SAAS,QAAQ,EAAA,EAClB,cAAc;KAAE,UAAU;KAAmB;IAAW,CAAC,GACzE,MAAM,IAAIF,uBAAAA,cAAc,KAAK,EAAE,SAAS,WAAW,kBAAkB,aAAa,CAAC;GAAA;GAElG,MAAM,cAAc,WAAW,MAAM,SAAS,SAAS,aAAa,IAAI,KAAA;GACxE,MAAM,cAAc,WAAW,MAAM,aAAa,SAAkB;IAAE;IAAU,MAAM;GAAO,CAAC,IAAI,KAAA;GAClG,MAAM,cAAc,mBAAmB,MAAM,CAAC,CAAC,UAAU,WAAW;GACpE,MAAM,QAA+B,YAAY,UAAU,YAAY,OAAO,CAAC;GAC/E,MAAM,KAAK,GAAG;GACd,MAAM,oBACJ,GAAG,SAAS,WAAW,yBAAyB,GAAG,SAAS,WAAW;GACzE,MAAM,KAAK,QAAQ,MAAM,IAAI;GAC7B,MAAM,SAA2B,OAAgB,SAAuB,aACtE,QAAQ,SAAS,KAAU,IAAK,QAAc;GAChD,MAAM,iBAAmC,OAAgB,YACvD,QAAQ,SAAS,KAAU,IAAK,QAAc,KAAA;GAChD,OAAO;IACL;IACA;IACA;IACA,QAAQ,QAAQ,KAAK,IAAI;IACzB,SAAS,QAAQ,MAAM,IAAI;IAC3B,SAAS,GAAG,cAAc;IAC1B;IACA,YAAY;KACV,QAAQ,GAAG;KACX,eAAe,GAAG;KAClB,WAAW,GAAG;KACd,kBAAkB,GAAG;KACrB,mBAAmB,GAAG;KACtB,qBAAqB,GAAG;KACxB,4BAA4B,GAAG;KAC/B,yBAAyB,GAAG,SAAS,aAAa;KAClD,4BAA4B,oBAAoB,IAAI,oBAAoB;IAC1E;IACA,YAAY,GAAG;IACf,UAAU;KACR,MAAM,GAAG,SAAS;KAGlB,eAAe,cAAc,GAAG,eAAe;MAAC;MAAO;MAAO;MAAU;MAAQ;MAAS;KAAK,CAAU;KACxG,eAAe,MAAM,GAAG,eAAe;MAAC;MAAO;MAAQ;MAAU;KAAM,GAAY,KAAK;KACxF,cAAc,GAAG,iBAAiB;IACpC;GACF;EACF,SAAS,OAAO;GACd,OAAOG,8BAAAA,YAAY,OAAO,wCAAwC;EACpE;CACF;AACF,CAAC;AAED,MAAa,oCAAoCD,sBAAAA,YAAY;CAC3D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,mBAAmB;EAC3C,IAAI;GAEF,OAAO,EACL,OAFiB,0BAA0B,QAAQ,YAEnC,CAAC,CAAC,UAAU,CAAC,CAAC,KAAI,UAAS;IAAE,IAAI,KAAK;IAAI,MAAM,KAAK;GAAK,EAAE,EAC9E;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,gCAAgC;EAC5D;CACF;AACF,CAAC;AAED,MAAM,+BAA+BF,OAAAA,EAAE,OAAO,EAC5C,MAAMA,OAAAA,EAAE,MACNA,OAAAA,EAAE,OAAO;CACP,OAAOA,OAAAA,EAAE,OAAO;CAChB,YAAYA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAChC,UAAUA,OAAAA,EAAE,OAAO;AACrB,CAAC,CACH,EACF,CAAC;AAED,MAAa,0CAA0CC,sBAAAA,YAAY;CACjE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,mBAAmB;EAC3C,IAAI;GAEF,OAAO,EAAE,MADU,0BAA0B,QAAQ,YAC7B,CAAC,CAAC,qBAAqB,EAAE;EACnD,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,sCAAsC;EAClE;CACF;AACF,CAAC;AAED,MAAa,sCAAsCD,sBAAAA,YAAY;CAC7D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,OAAO,WAAW;EACpE,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GAMjE,MAAM,UAAU,MAAM,WAAW,aAAa,EAAE,WAAW,CAAC;GAO5D,MAAM,WAAW,MAAsD;IACrE,MAAM,WAAY,EAAE,YAAoD,CAAC;IACzE,MAAM,SAAiC,CAAC;IACxC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,GAChD,IAAI,OAAO,UAAU,YAAY,CAAC,4BAA4B,GAAG,GAAG,OAAO,OAAO;IAEpF,OAAO;GACT;GAOA,MAAM,aAAa,OAAO,OAAO,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,4BAA4B,GAAG,CAAC,IAAI,CAAC;GACvG,MAAM,SACJ,WAAW,SAAS,IAChB,QAAQ,QAAO,MAAK;IAClB,MAAM,WAAY,EAAE,YAAoD,CAAC;IACzE,OAAO,WAAW,OAAO,CAAC,KAAK,WAAW,SAAS,SAAS,KAAK;GACnE,CAAC,IACD;GACN,MAAM,UAAU,OAA+C,EAAE,aAAa,EAAE,UAAA,EAAY,QAAQ,KAAK;GACzG,MAAM,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;GAC/D,MAAM,MAAM,OAAO,KAAK;GACxB,MAAM,UAAU,OAAO,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,MAAM,GAAG,GAAG,IAAI;GAQzE,MAAM,kBAAkB,IAAI,IAC1B,WACG,qBAAqB,CAAC,CACtB,QAAO,MAAK,EAAE,eAAe,UAAU,CAAC,CACxC,KAAI,MAAK,EAAE,QAAQ,CACxB;GACA,OAAO,EACL,SAAS,QAAQ,KAAI,MAAK;IACxB,MAAM,aAAa,QAAQ,CAAC;IAC5B,OAAO;KACL,IAAI,EAAE;KACN,OAAO,EAAE;KACT,MAAM,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,IAAI,aAAa,KAAA;KACxD,WAAW,EAAE,qBAAqB,OAAO,EAAE,UAAU,YAAY,IAAI,KAAA;KACrE,OAAO,gBAAgB,IAAI,EAAE,EAAE,IAAK,WAAsB;IAC5D;GACF,CAAC,EACH;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,kCAAkC;EAC9D;CACF;AACF,CAAC;AAED,MAAa,2CAA2CD,sBAAAA,YAAY;CAClE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgBD,OAAAA,EAAE,OAAO;EACvB,UAAUA,OAAAA,EAAE,QAAQ;EACpB,gBAAgBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EACpC,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EAC9B,OAAOA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,CAAC;CACD,SAAS;CACT,aACE;CACF,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EACd,QACA,cACA,YACA,cACA,QACA,MACA,SACA,UACA,SACA,UACA,WACA,aACA,YACA,UACA,qBACI;EACJ,IAAI;GAGF,MAAM,SAAS,OAAM,MADC,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CACnE,uBAAuB;IAClD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACY;IACZ;GACF,CAAC;GACD,OAAO;IACL,UAAU,OAAO,aAAa,KAAA;IAC9B,gBAAgB,OAAO,QAAQ;IAC/B,UAAU,OAAO,UAAU;IAC3B,OAAO,OAAO;GAChB;EACF,SAAS,OAAO;GACd,OAAOE,8BAAAA,YAAY,OAAO,uCAAuC;EACnE;CACF;AACF,CAAC;AAMD,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,SAAS;CACnC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,OAAO,qBAAqB;EAC5F,IAAI;GAGF,MAAM,SAAS,OAAM,MADC,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CACnE,OAAO,OAAO,EAAE,MAAM,CAAC;GACpD,OAAO;IACL,IAAI,OAAO;IACX,OAAO,OAAO;IACd,YAAY,OAAO;IACnB,WAAW,OAAO,qBAAqB,OAAO,OAAO,UAAU,YAAY,IAAI,KAAA;IAC/E,WAAW,OAAO,qBAAqB,OAAO,OAAO,UAAU,YAAY,IAAI,KAAA;GACjF;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,kCAAkC;EAC9D;CACF;AACF,CAAC;AAED,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,SAAS;CACnC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,UAAU,qBAAqB;EAC/F,IAAI;GAGF,OAAM,MADgB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAClF,OAAO,OAAO,EAAE,SAAS,CAAC;GACxC,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,kCAAkC;EAC9D;CACF;AACF,CAAC;AAED,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,SAAS;CACnC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,UAAU,OAAO,qBAAqB;EACtG,IAAI;GAEF,MAAM,UAAU,MAAM,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAEhG,IAAI,QAAQ,OAAO,MAAM,MAAM,UAC7B,MAAM,QAAQ,OAAO,OAAO,EAAE,SAAS,CAAC;GAE1C,MAAM,QAAQ,OAAO,OAAO,EAAE,MAAM,CAAC;GACrC,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,kCAAkC;EAC9D;CACF;AACF,CAAC;AAED,MAAa,sCAAsCD,sBAAAA,YAAY;CAC7D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,SAAS;CACnC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,gBAAgB,OAAO,qBAAqB;EAC5G,IAAI;GAGF,MAAM,SAAS,OAAM,MADC,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CACnE,OAAO,MAAM;IAAE;IAAgB;GAAM,CAAC;GACnE,OAAO;IACL,IAAI,OAAO;IACX,OAAO,OAAO;IACd,YAAY,OAAO;IACnB,WAAW,OAAO,qBAAqB,OAAO,OAAO,UAAU,YAAY,IAAI,KAAA;IAC/E,WAAW,OAAO,qBAAqB,OAAO,OAAO,UAAU,YAAY,IAAI,KAAA;GACjF;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC;AAED,MAAa,8CAA8CD,sBAAAA,YAAY;CACrE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,SAAS;CACnC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,UAAU,YAAY;EACxE,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GAUjE,MAAM,SAAS,MAAM,WAAW,gBAAgB,EAAE,SAAS,CAAC;GAC5D,IAAI,CAAC,UAAU,OAAO,eAAe,YACnC,MAAM,IAAI,MAAM,qBAAqB,UAAU;GAGjD,OAAO,EACL,WAAU,MAFW,WAAW,oBAAoB;IAAE;IAAU;GAAM,CAAC,EAAA,CAEpD,KAAI,OAAM;IAC3B,IAAI,EAAE;IACN,MAAM,EAAE;IACR,SAAS,EAAE;IACX,WAAW,EAAE,qBAAqB,OAAO,EAAE,UAAU,YAAY,IAAI,KAAA;IACrE,UAAU,EAAE;IACZ,YAAY,EAAE;IACd,MAAM,EAAE;GACV,EAAE,EACJ;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,0CAA0C;EACtE;CACF;AACF,CAAC;AAMD,MAAa,2CAA2CD,sBAAAA,YAAY;CAClE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,SAAS,qBAAqB;EAC9F,IAAI;GAEF,MAAM,UAAU,MAAM,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,yBAAyB;IACvB,MAAM,QAAQ,SAAS;KAAE,SAAS;KAAS;IAAe,CAAC;IAC3D;IACA;IACA,WAAW;GACb,CAAC;GACD,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,oCAAoC;EAChE;CACF;AACF,CAAC;AAMD,MAAa,qCAAqCD,sBAAAA,YAAY;CAC5D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,mBAAmB;EAC3C,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,WAAW,KAAK;GAEtB,OAAO,EACL,SAAQ,MAFW,WAAW,oBAAoB,EAAA,CAEnC,KAAI,OAAM;IACvB,IAAI,EAAE;IACN,UAAU,EAAE;IACZ,WAAW,EAAE;IACb,WAAW,EAAE;IACb,UAAU,EAAE;GACd,EAAE,EACJ;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC;AAMD,MAAa,8CAA8CD,sBAAAA,YAAY;CACrE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,mBAAmB;EAC3C,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,WAAW,KAAK;GACtB,OAAO;IACL,cAAc,WAAW,aAAa;IACtC,SAAS,WAAW,iBAAiB;GACvC;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,2CAA2C;EACvE;CACF;AACF,CAAC;AAMD,MAAa,uCAAuCD,sBAAAA,YAAY;CAC9D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,qBAAqB;EACrF,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,UAAU,MAAM,WAAW,YAAY,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAEhG,OAAO,EAAE,QAAQ,MADI,WAAW,6BAA6B,OAAO,KACzC,KAAA,EAAU;EACvC,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,oCAAoC;EAChE;CACF;AACF,CAAC;AAMD,MAAa,yCAAyCD,sBAAAA,YAAY;CAChE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAYD,OAAAA,EAAE,OAAO,EAAE,eAAeA,OAAAA,EAAE,OAAO,EAAE,CAAC;CAClD,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,eAAe,qBAAqB;EACpG,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,UAAU,MAAM,WAAW,YAAY,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,MAAM,WAAW,cAAc,SAAS,EAAE,YAAY,cAAc,CAAC;GACrE,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOE,8BAAAA,YAAY,OAAO,sCAAsC;EAClE;CACF;AACF,CAAC;AAED,MAAa,0CAA0CD,sBAAAA,YAAY;CACjE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgBD,OAAAA,EAAE,OAAO,EAAE,aAAaA,OAAAA,EAAE,MAAMA,OAAAA,EAAE,OAAO,CAAC,EAAE,CAAC;CAC7D,SAAS;CACT,aAAa;CACb,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,qBAAqB;EACrF,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,UAAU,MAAM,WAAW,YAAY,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAEhG,OAAO,EAAE,aAAA,MADiB,WAAW,oBAAoB,OAAO,EAC3C;EACvB,SAAS,OAAO;GACd,OAAOE,8BAAAA,YAAY,OAAO,uCAAuC;EACnE;CACF;AACF,CAAC;AAMD,MAAM,oBAAoBF,OAAAA,EAAE,OAAO;CACjC,WAAWA,OAAAA,EAAE,OAAO;CACpB,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,SAASA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAC/B,CAAC;AACD,MAAM,uBAAuBA,OAAAA,EAAE,OAAO;CACpC,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,SAASA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,QAAQA,OAAAA,EAAE,KAAK;EAAC;EAAU;EAAU;CAAM,CAAC,CAAC,CAAC,SAAS;AACxD,CAAC;AACD,MAAM,mBAAmBA,OAAAA,EAAE,OAAO;CAChC,IAAIA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACxB,WAAWA,OAAAA,EAAE,OAAO;CACpB,QAAQA,OAAAA,EAAE,KAAK;EAAC;EAAU;EAAU;CAAM,CAAC;CAC3C,UAAUA,OAAAA,EAAE,OAAO;CACnB,SAASA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,WAAWA,OAAAA,EAAE,OAAO;CACpB,WAAWA,OAAAA,EAAE,OAAO;CACpB,cAAcA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AACpC,CAAC;AACD,MAAM,qBAAqBA,OAAAA,EAAE,OAAO,EAAE,MAAM,iBAAiB,SAAS,EAAE,CAAC;AAEzE,SAAS,mBAAmB,YAAkC,SAA8B;CAC1F,OAAO,WAAW,gBAAgB,OAAO;AAC3C;AAEA,MAAa,kCAAkCC,sBAAAA,YAAY;CACzD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,OAAO;CACjC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,qBAAqB;EACrF,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,UAAU,MAAM,WAAW,YAAY,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,MAAM,WAAW,QAAQ,OAAO,MAAM;GACtC,IAAI,CAAC,UAAU,OAAO,EAAE,MAAM,KAAA,EAAU;GAGxC,OAAO,EAAE,MAAM,MAFD,mBAAmB,YAAY,OACpB,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,KAC3B,KAAA,EAAU;EACrC,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,+BAA+B;EAC3D;CACF;AACF,CAAC;AAED,MAAa,kCAAkCD,sBAAAA,YAAY;CACzD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,mBAAmB,OAAO;CACjC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EACd,QACA,cACA,YACA,cACA,WACA,cACA,SACA,qBACI;EACJ,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,UAAU,MAAM,WAAW,YAAY,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,MAAM,WAAW,QAAQ,OAAO,MAAM;GACtC,IAAI,CAAC,UAAU,MAAM,IAAIF,uBAAAA,cAAc,KAAK,EAAE,SAAS,+BAA+B,CAAC;GAQvF,OAAO,EAAE,MAAM,MAPD,mBAAmB,YAAY,OACpB,CAAC,CAAC,aAAa,WAAW;IACjD;IACA,YAAY,QAAQ,SAAS,cAAc;IAC3C,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;IACvC,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;GACvC,CAAC,KACwB,KAAA,EAAU;EACrC,SAAS,OAAO;GACd,OAAOG,8BAAAA,YAAY,OAAO,+BAA+B;EAC3D;CACF;AACF,CAAC;AAED,MAAa,qCAAqCD,sBAAAA,YAAY;CAC5D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,OAAO;CACjC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EACd,QACA,cACA,YACA,cACA,cACA,SACA,QACA,qBACI;EACJ,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,UAAU,MAAM,WAAW,YAAY,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,MAAM,WAAW,QAAQ,OAAO,MAAM;GACtC,IAAI,CAAC,UAAU,MAAM,IAAIF,uBAAAA,cAAc,KAAK,EAAE,SAAS,+BAA+B,CAAC;GAQvF,OAAO,EAAE,MAAM,MAPD,mBAAmB,YAAY,OACpB,CAAC,CAAC,uBAAuB;IAChD;IACA,GAAI,iBAAiB,KAAA,IAAY,EAAE,aAAa,IAAI,CAAC;IACrD,GAAI,YAAY,KAAA,IAAY,EAAE,QAAQ,IAAI,CAAC;IAC3C,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;GAC3C,CAAC,KACwB,KAAA,EAAU;EACrC,SAAS,OAAO;GACd,OAAOG,8BAAAA,YAAY,OAAO,gCAAgC;EAC5D;CACF;AACF,CAAC;AAED,MAAa,oCAAoCD,sBAAAA,YAAY;CAC3D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,OAAO;CACjC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,qBAAqB;EACrF,IAAI;GACF,MAAM,aAAa,0BAA0B,QAAQ,YAAY;GACjE,MAAM,UAAU,MAAM,WAAW,YAAY,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc;GAChG,MAAM,WAAW,QAAQ,OAAO,MAAM;GACtC,IAAI,CAAC,UAAU,MAAM,IAAIF,uBAAAA,cAAc,KAAK,EAAE,SAAS,+BAA+B,CAAC;GAEvF,MADc,mBAAmB,YAAY,OACnC,CAAC,CAAC,eAAe,EAAE,SAAS,CAAC;GACvC,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOG,8BAAAA,YAAY,OAAO,gCAAgC;EAC5D;CACF;AACF,CAAC;AAMD,MAAa,yCAAyCD,sBAAAA,YAAY;CAChE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,aAAa;CACvC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,qBAAqB;EACrF,IAAI;GAGF,MAAM,SAAQ,MADQ,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAC1E,YAAY,SAAS;GAC3C,OAAO;IACL,YAAY,MAAM;IAClB,OAAO,MAAM;GACf;EACF,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,sCAAsC;EAClE;CACF;AACF,CAAC;AAED,MAAa,iDAAiDD,sBAAAA,YAAY;CACxE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,mBAAmB,aAAa;CACvC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,UAAU,QAAQ,qBAAqB;EACvG,IAAI;GAGF,OAAM,MADgB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAClF,YAAY,eAAe;IAAE;IAAU;GAAO,CAAC;GAC7D,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,8CAA8C;EAC1E;CACF;AACF,CAAC;AAED,MAAa,6CAA6CD,sBAAAA,YAAY;CACpE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,mBAAmB,aAAa;CACvC,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,UAAU,QAAQ,qBAAqB;EACvG,IAAI;GAGF,OAAM,MADgB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAClF,YAAY,WAAW;IAAE;IAAU;GAAO,CAAC;GACzD,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,0CAA0C;EACtE;CACF;AACF,CAAC;AAMD,MAAM,4BAA4BF,OAAAA,EAAE,OAAO,EAAE,OAAOA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,QAAQ,CAAC,EAAE,CAAC;AAEvF,MAAa,2CAA2CC,sBAAAA,YAAY;CAClE,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,kBAAkB;CAClB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aACE;CACF,MAAM,CAAC,iBAAiB;CACxB,cAAc;CACd,oBAAoB;CACpB,SAAS,OAAO,EAAE,QAAQ,cAAc,YAAY,cAAc,OAAO,qBAAqB;EAC5F,IAAI;GAGF,OAAM,MADgB,WADH,0BAA0B,QAAQ,YACX,GAAG,YAAY,EAAE,OAAO,aAAa,GAAG,cAAc,EAAA,CAClF,MAAM,IAAI,KAAgC;GACxD,OAAO,EAAE,IAAI,KAAK;EACpB,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,wCAAwC;EACpE;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"agent-controller.cjs","names":["HTTPException","z","createRoute","handleError"],"sources":["../../../src/server/handlers/agent-controller.ts"],"sourcesContent":["import type { Agent } from '@mastra/core/agent';\nimport type {\n AgentController,\n AgentControllerDisplayState,\n AgentControllerEvent,\n ErrorCarryingAgentControllerEvent,\n JsonReadyAgentControllerEvent,\n ReservedThreadMetadataKey,\n Session,\n TokenUsage,\n WireDisplayState,\n} from '@mastra/core/agent-controller';\nimport type { RequestContext } from '@mastra/core/request-context';\n// Type-only import: erased at runtime, so this cannot crash against an older\n// @mastra/core that lacks the `./agent-controller` subpath export. Controller\n// resolution at runtime goes through mastra.getAgentController?.(), never a\n// value import.\nimport { z } from 'zod/v4';\n\nimport { HTTPException } from '../http-exception';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\n/**\n * AgentController session routes.\n *\n * An AgentController registered on a Mastra instance (via\n * `new Mastra({ agentControllers })`) exposes its sessions over HTTP so\n * non-terminal clients — e.g. a browser-based MastraCode — can create sessions,\n * send messages, stream events, and drive run-control. Each route resolves its\n * target AgentController by id, then operates on a session bound to a\n * `resourceId` (get-or-create, so reconnects resume rather than fork the\n * conversation).\n */\n\n/**\n * Internal thread-metadata keys that `Session.loadMetadata()` reads back as\n * runtime bookkeeping (selected model/mode, observer/reflector config, token\n * usage). They share the flat thread `metadata` bag with user-provided session\n * scoping tags, so they must never be treated as tags here.\n *\n * Importing core's list as a value would exceed this package's peer-dependency\n * floor, so it is mirrored under `satisfies`: tsc rejects a missing or extra key.\n */\nconst RESERVED_THREAD_METADATA_KEYS = {\n currentModelId: true,\n currentModeId: true,\n observerModelId: true,\n reflectorModelId: true,\n observationThreshold: true,\n reflectionThreshold: true,\n tokenUsage: true,\n thinkingLevel: true,\n notifications: true,\n} satisfies Record<ReservedThreadMetadataKey, true>;\n\nfunction isReservedThreadMetadataKey(key: string): boolean {\n return Object.hasOwn(RESERVED_THREAD_METADATA_KEYS, key) || key.startsWith('modeModelId_');\n}\n\n/**\n * Resolves a controller by id via the canonical `mastra.getAgentController`\n * accessor, throwing a 404 if no controller is registered under that id.\n */\nfunction getAgentControllerOrThrow(\n mastra: {\n getAgentController?: (id: string) => AgentController<any> | undefined;\n },\n controllerId: string,\n): AgentController<any> {\n const controller = mastra.getAgentController?.(controllerId);\n if (!controller) {\n throw new HTTPException(404, { message: `agent controller \"${controllerId}\" not found` });\n }\n return controller;\n}\n\nasync function getSession(\n controller: AgentController<any>,\n resourceId: string,\n options?: { tags?: Record<string, string>; scope?: string; threadId?: string },\n requestContext?: RequestContext,\n): Promise<Session<any>> {\n await controller.init();\n const { tags, scope, threadId } = options ?? {};\n // Scoped sessions are independent sessions over the same resource (e.g. one\n // per git worktree), so qualify the stable session id with the scope to keep\n // their identities distinct as well. An exact thread binding doubles as the\n // stable session id when supplied.\n const id = threadId ?? (scope ? `${resourceId}::${scope}` : resourceId);\n return controller.createSession({ resourceId, id, ownerId: controller.id, tags, scope, threadId, requestContext });\n}\n\n/**\n * Acknowledges a session operation that keeps running after the response is\n * sent.\n *\n * The messages/steer/follow-up routes answer `{ ok: true }` as soon as the\n * message is handed to the session: the reply itself arrives on the session's\n * SSE stream, so the request must not block for the whole turn. Those session\n * methods can still reject — `sendMessage` deliberately rejects when signal\n * submission fails before a stream starts — and a bare `void promise` turns\n * that into an unhandled rejection, which terminates the process on Node's\n * default `--unhandled-rejections=throw`.\n *\n * Observing the promise keeps the immediate acknowledgement while logging the\n * failure and emitting an `error` event on the session, so a client streaming\n * the session is told the turn died instead of waiting for an `agent_end` that\n * will never come.\n */\nfunction ackBackgroundSessionWork({\n work,\n session,\n mastra,\n operation,\n}: {\n work: Promise<unknown>;\n session: Session<any>;\n mastra: { getLogger?: () => { error?: (message: string, context?: Record<string, unknown>) => void } | undefined };\n operation: string;\n}): void {\n void work.catch((error: unknown) => {\n const failure = error instanceof Error ? error : new Error(String(error));\n mastra.getLogger?.()?.error?.(`AgentController ${operation} failed after the request was acknowledged`, {\n operation,\n error: failure,\n });\n try {\n session.emit({ type: 'error', error: failure });\n } catch {\n // A session that can no longer accept events (e.g. torn down mid-flight)\n // must not turn a logged failure into a second unhandled rejection.\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Schemas\n// ---------------------------------------------------------------------------\n\nconst controllerIdPathParams = z.object({ controllerId: z.string() });\nconst sessionPathParams = z.object({ controllerId: z.string(), resourceId: z.string() });\n/**\n * Optional session scope (mirrors `AgentController.createSession`'s `scope`):\n * requests with the same resourceId but different scopes address independent\n * sessions (e.g. one per git worktree). Sent as a `sessionScope` query param\n * on session routes; named to avoid colliding with the model-switch `scope`.\n */\nconst sessionScopeQuerySchema = z.object({ sessionScope: z.string().optional() });\nconst sessionStateQuerySchema = sessionScopeQuerySchema.extend({ threadId: z.string().optional() });\n\nconst createSessionBodySchema = z.object({\n resourceId: z.string(),\n tags: z.record(z.string(), z.string()).optional(),\n threadId: z.string().optional(),\n sessionScope: z.string().optional(),\n});\n// Server-side attachment limits mirroring the web composer caps (10MB per\n// file, 20MB total), adjusted for base64 overhead (~4/3x).\nconst MAX_FILE_DATA_LENGTH = 14 * 1024 * 1024;\nconst MAX_TOTAL_FILE_DATA_LENGTH = 28 * 1024 * 1024;\n/**\n * Optional client-supplied request context, merged into the server-derived\n * request context by the adapter context middleware (reserved keys are\n * server-controlled). Declared on run-triggering body schemas so the OpenAPI\n * spec documents it.\n */\nconst bodyRequestContextSchema = z.record(z.string(), z.unknown()).optional();\n\nconst sendMessageBodySchema = z.object({\n message: z.string(),\n requestContext: bodyRequestContextSchema,\n // Optional attachments (e.g. pasted images). `data` is base64-encoded.\n files: z\n .array(\n z.object({\n data: z.string().max(MAX_FILE_DATA_LENGTH),\n mediaType: z.string(),\n filename: z.string().optional(),\n }),\n )\n .max(20)\n .refine(files => files.reduce((total, file) => total + file.data.length, 0) <= MAX_TOTAL_FILE_DATA_LENGTH, {\n message: 'Total attachment size exceeds limit',\n })\n .optional(),\n});\nconst steerBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\nconst toolApprovalBodySchema = z.object({\n toolCallId: z.string(),\n approved: z.boolean(),\n requestContext: bodyRequestContextSchema,\n});\nconst toolSuspensionBodySchema = z.object({\n toolCallId: z.string(),\n // Free-form resume payload. For ask_user this is a string (or string[] for\n // multi-select); for submit_plan it's `{ action, feedback? }`; for\n // request_access it's \"Yes\"/\"No\".\n resumeData: z.unknown(),\n requestContext: bodyRequestContextSchema,\n});\nconst switchModeBodySchema = z.object({ modeId: z.string() });\nconst switchModelBodySchema = z.object({\n modelId: z.string(),\n scope: z.enum(['global', 'thread']).optional(),\n modeId: z.string().optional(),\n});\nconst switchThreadBodySchema = z.object({ threadId: z.string() });\nconst createThreadBodySchema = z.object({ title: z.string().optional() });\nconst renameThreadBodySchema = z.object({ title: z.string() });\nconst threadPathParams = z.object({ controllerId: z.string(), resourceId: z.string(), threadId: z.string() });\nconst cloneThreadBodySchema = z.object({\n sourceThreadId: z.string().optional(),\n title: z.string().optional(),\n});\nconst listMessagesQuerySchema = z.object({ limit: z.coerce.number().optional(), sessionScope: z.string().optional() });\n/**\n * `tags` arrives as a JSON-encoded object in the query string (query params are\n * flat strings). It scopes the listing to threads whose metadata matches every\n * tag — e.g. `{ projectPath }` so git worktrees sharing a resourceId each see\n * only their own threads. Malformed JSON is treated as \"no filter\".\n */\nconst listThreadsQuerySchema = z.object({\n limit: z.coerce.number().optional(),\n sessionScope: z.string().optional(),\n tags: z\n .preprocess(value => {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n }, z.record(z.string(), z.string()).optional())\n .optional(),\n});\nconst followUpBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\n\nconst sendNotificationBodySchema = z.object({\n source: z.string(),\n kind: z.string(),\n summary: z.string(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n payload: z.unknown().optional(),\n sourceId: z.string().optional(),\n dedupeKey: z.string().optional(),\n coalesceKey: z.string().optional(),\n attributes: z.record(z.string(), z.unknown()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst listAgentControllersResponseSchema = z.object({\n agentControllers: z.array(z.object({ id: z.string() })),\n});\nconst createSessionResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n});\nconst ackResponseSchema = z.object({ ok: z.boolean() });\n/**\n * Status-line relevant slice of the session's observational-memory progress.\n * Mirrors the TUI status line: `msg pending/threshold ↓removal` (the active\n * message window before an observation fires) and `mem observed/reflection\n * ↓savings` (accumulated observations before a reflection fires).\n */\nconst omProgressSummarySchema = z.object({\n status: z.string(),\n pendingTokens: z.number(),\n threshold: z.number(),\n thresholdPercent: z.number(),\n observationTokens: z.number(),\n reflectionThreshold: z.number(),\n reflectionThresholdPercent: z.number(),\n /** Tokens the next observation will remove from the message window. */\n projectedMessageRemoval: z.number(),\n /** Tokens the next reflection is projected to save. */\n projectedReflectionSavings: z.number(),\n});\nconst tokenUsageSchema = z.object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n totalTokens: z.number(),\n reasoningTokens: z.number().optional(),\n cachedInputTokens: z.number().optional(),\n cacheCreationInputTokens: z.number().optional(),\n cacheCreationInputTokens5m: z.number().optional(),\n cacheCreationInputTokens1h: z.number().optional(),\n raw: z.unknown().optional(),\n}) satisfies z.ZodType<TokenUsage>;\nconst sessionSettingsSchema = z.object({\n yolo: z.boolean(),\n /** Session override only — absent when the session inherits a configured default. */\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh', 'max']).optional(),\n notifications: z.enum(['off', 'bell', 'system', 'both']),\n smartEditing: z.boolean(),\n});\nconst taskSnapshotSchema = z.object({\n id: z.string(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n});\ntype SessionTaskSnapshot = z.infer<typeof taskSnapshotSchema>;\nconst sessionStateResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n modeId: z.string(),\n modelId: z.string(),\n /** Whether the agent is currently executing a run (for initial UI hydration). */\n running: z.boolean().optional(),\n tasks: z.array(taskSnapshotSchema).optional(),\n omProgress: omProgressSummarySchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n settings: sessionSettingsSchema.optional(),\n});\nconst listModesResponseSchema = z.object({\n modes: z.array(z.object({ id: z.string(), name: z.string().optional() })),\n});\nconst listThreadsResponseSchema = z.object({\n threads: z.array(\n z.object({\n id: z.string(),\n title: z.string().optional(),\n updatedAt: z.string().optional(),\n /** The session scoping tags stamped on this thread (e.g. `{ projectPath }`). */\n tags: z.record(z.string(), z.string()).optional(),\n /** Whether a run is currently executing on this thread ('active') or not ('idle'). */\n state: z.enum(['active', 'idle']).optional(),\n }),\n ),\n});\nconst threadResponseSchema = z.object({\n id: z.string(),\n title: z.string().optional(),\n resourceId: z.string().optional(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n});\nconst messagePartSchema = z\n .object({\n type: z.string(),\n })\n .passthrough();\n// Mirrors the persisted `MastraMessageContentV2` shape (AI-SDK-v4 `UIMessage`-style):\n// `format: 2` plus a nested `parts` array, with optional companion fields preserved.\nconst messageContentV2Schema = z\n .object({\n format: z.literal(2),\n parts: z.array(messagePartSchema),\n })\n .passthrough();\nconst listMessagesResponseSchema = z.object({\n messages: z.array(\n z.object({\n id: z.string(),\n role: z.enum(['user', 'assistant', 'system', 'tool', 'signal']),\n content: messageContentV2Schema,\n createdAt: z.string().optional(),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n type: z.string().optional(),\n }),\n ),\n});\nconst listModelsResponseSchema = z.object({\n models: z.array(\n z.object({\n id: z.string(),\n provider: z.string(),\n modelName: z.string(),\n hasApiKey: z.boolean(),\n useCount: z.number(),\n }),\n ),\n});\nconst workspaceStatusResponseSchema = z.object({\n hasWorkspace: z.boolean(),\n isReady: z.boolean(),\n});\nconst omRecordResponseSchema = z.object({\n record: z.unknown().optional(),\n});\nconst permissionPolicyEnum = z.enum(['allow', 'ask', 'deny']);\nconst toolCategoryEnum = z.enum(['read', 'edit', 'execute', 'mcp', 'other']);\nconst permissionRulesResponseSchema = z.object({\n categories: z.record(z.string(), permissionPolicyEnum).optional(),\n tools: z.record(z.string(), permissionPolicyEnum).optional(),\n});\nconst setCategoryPermissionBodySchema = z.object({\n category: toolCategoryEnum,\n policy: permissionPolicyEnum,\n});\nconst setToolPermissionBodySchema = z.object({\n toolName: z.string(),\n policy: permissionPolicyEnum,\n});\n\n// ---------------------------------------------------------------------------\n// Routes\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLERS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller',\n responseType: 'json' as const,\n responseSchema: listAgentControllersResponseSchema,\n summary: 'List agent controllers',\n description: 'Lists the agent controllers hosted on this Mastra instance.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra }) => {\n try {\n const ids = new Set<string>();\n if (mastra.listAgentControllers) {\n for (const id of Object.keys(mastra.listAgentControllers())) ids.add(id);\n }\n return { agentControllers: Array.from(ids).map(id => ({ id })) };\n } catch (error) {\n return handleError(error, 'error listing agent controllers');\n }\n },\n});\n\nexport const CREATE_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n bodySchema: createSessionBodySchema,\n responseSchema: createSessionResponseSchema,\n summary: 'Create or resume a controller session',\n description:\n 'Creates a session for the given resourceId, or returns the existing one (get-or-create), so reconnects resume the conversation.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, tags, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { tags, scope: sessionScope, threadId }, requestContext);\n return {\n controllerId,\n resourceId,\n threadId: session.thread.getId() ?? undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller session');\n }\n },\n});\n\n/**\n * `display_state_changed` Maps JSON-serialize to `{}`. Snapshot the display state\n * before converting its Maps so queued wire events retain point-in-time state.\n */\nfunction toWireDisplayState(displayState: AgentControllerDisplayState): WireDisplayState {\n const snapshot = structuredClone(displayState);\n return {\n ...snapshot,\n activeTools: Object.fromEntries(snapshot.activeTools),\n toolInputBuffers: Object.fromEntries(snapshot.toolInputBuffers),\n pendingSuspensions: Object.fromEntries(snapshot.pendingSuspensions),\n activeSubagents: Object.fromEntries(snapshot.activeSubagents),\n modifiedFiles: Object.fromEntries(snapshot.modifiedFiles),\n };\n}\n\nfunction carriesError(event: AgentControllerEvent): event is ErrorCarryingAgentControllerEvent & { error: Error } {\n return 'error' in event && event.error instanceof Error;\n}\n\n/**\n * An `Error`'s `message`/`name` are non-enumerable, so flatten it before JSON\n * serialization. Streamed message events intentionally retain the controller's\n * live accumulated message; consumers requiring temporal isolation must copy or\n * serialize at their own ownership boundary.\n */\nfunction toWireEvent(event: AgentControllerEvent): JsonReadyAgentControllerEvent {\n if ('displayState' in event) {\n return { ...event, displayState: toWireDisplayState(event.displayState) };\n }\n if (carriesError(event)) {\n return { ...event, error: { name: event.error.name, message: event.error.message } };\n }\n return event;\n}\n\nexport const STREAM_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/stream',\n responseType: 'stream' as const,\n streamFormat: 'sse' as const,\n sseFlushOnConnect: true,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n summary: 'Stream controller session events',\n description: 'Subscribes to a session\\u2019s event bus and streams events to the client over SSE.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, abortSignal, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n\n let cleanedUp = false;\n let heartbeat: ReturnType<typeof setTimeout> | undefined;\n let unsubscribe: (() => void) | undefined;\n const clearHeartbeat = () => {\n if (heartbeat) {\n clearTimeout(heartbeat);\n heartbeat = undefined;\n }\n };\n const cleanup = (controller?: ReadableStreamDefaultController) => {\n if (cleanedUp) return;\n cleanedUp = true;\n clearHeartbeat();\n unsubscribe?.();\n if (controller) {\n try {\n controller.close();\n } catch {}\n }\n };\n\n // The stream yields raw event objects plus `:`-prefixed SSE comments\n // (heartbeats); the server adapter frames events and passes comments\n // through verbatim.\n return new ReadableStream<unknown>({\n start(controller) {\n const scheduleHeartbeat = () => {\n if (cleanedUp) return;\n clearHeartbeat();\n heartbeat = setTimeout(() => {\n heartbeat = undefined;\n if (cleanedUp) return;\n try {\n controller.enqueue(': heartbeat\\n\\n');\n } catch {\n cleanup();\n return;\n }\n scheduleHeartbeat();\n }, 25_000);\n };\n\n unsubscribe = session.subscribe(event => {\n if (cleanedUp) return;\n try {\n // Enqueue the raw event object. The server adapter is responsible\n // for SSE framing (`data: <json>\\n\\n`); enqueuing a pre-framed\n // string here would double-encode it.\n controller.enqueue(toWireEvent(event));\n scheduleHeartbeat();\n } catch {\n cleanup();\n }\n });\n\n const abortCleanup = () => cleanup(controller);\n abortSignal?.addEventListener('abort', abortCleanup, { once: true });\n scheduleHeartbeat();\n },\n cancel() {\n cleanup();\n },\n });\n } catch (error) {\n return handleError(error, 'error streaming controller session');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_MESSAGE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/messages',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendMessageBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Send a message to a controller session',\n description: 'Sends a user message to the session. The reply streams as events on the session\\u2019s SSE stream.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, files, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Forward the server middleware's requestContext so identity injected in\n // `server.middleware` reaches dynamic instructions and tools (same as the\n // plain agent message route).\n ackBackgroundSessionWork({\n work: session.sendMessage({ content: message, files, requestContext }),\n session,\n mastra,\n operation: 'sendMessage',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error sending controller message');\n }\n },\n});\n\nexport const ABORT_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/abort',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Abort a controller session run',\n description: 'Aborts the in-flight run for the session, if any.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n session.abort();\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error aborting controller session');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_APPROVAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-approval',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolApprovalBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a controller tool approval',\n description: 'Approves or declines a pending tool call surfaced by the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, approved, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Resolve the parked approval gate so the session's own run loop drives the\n // continuation and emits its events to subscribers (the open SSE stream).\n // Calling approveToolCall/declineToolCall directly would bypass the gate,\n // leaving the run loop hung and duplicating the resumed stream.\n // Pass toolCallId so a stale request cannot resolve a different pending gate.\n session.respondToToolApproval({ toolCallId, decision: approved ? 'approve' : 'decline', requestContext });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool approval');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-suspension',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolSuspensionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a suspended controller tool',\n description:\n 'Resumes a suspended interactive tool (ask_user, request_access, submit_plan) with the provided resume data.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, resumeData, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // A resumed tool drives the run to its next terminal or suspension boundary.\n // Awaiting it holds this request open until the continuation finishes, which\n // can trip the request timeout and leave CORS mutating an already-sent response.\n ackBackgroundSessionWork({\n work: session.respondToToolSuspension({ toolCallId, resumeData, requestContext }),\n session,\n mastra,\n operation: 'respondToToolSuspension',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool suspension');\n }\n },\n});\n\nexport const STEER_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/steer',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: steerBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Steer the in-flight run',\n description: 'Injects a message into the running turn (interjection) without starting a new run.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.steer({ content: message, requestContext }),\n session,\n mastra,\n operation: 'steer',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error steering controller session');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/mode',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModeBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session mode',\n description: 'Switches the active mode (e.g. build, plan) for the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.mode.switch({ modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller mode');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODEL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/model',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModelBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session model',\n description: 'Switches the model for the session, scoped to the thread by default.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modelId, scope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.model.switch({ modelId, scope, modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller model');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/thread',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session thread',\n description: 'Switches the session to an existing thread (rebinding its stream and state).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller thread');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionStateQuerySchema,\n responseSchema: sessionStateResponseSchema,\n summary: 'Get session state',\n description: 'Returns the current mode, model, thread, and durable tasks for initial UI hydration.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId: requestedThreadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const ds = session.displayState.get();\n const threadId = requestedThreadId ?? session.thread.getId() ?? undefined;\n const storage = mastra.getStorage();\n if (requestedThreadId) {\n const memory = await storage?.getStore('memory');\n const thread = await memory?.getThreadById({ threadId: requestedThreadId, resourceId });\n if (!thread) throw new HTTPException(404, { message: `thread \"${requestedThreadId}\" not found` });\n }\n const threadState = threadId ? await storage?.getStore('threadState') : undefined;\n const storedTasks = threadId ? await threadState?.getState<unknown>({ threadId, type: 'task' }) : undefined;\n const parsedTasks = taskSnapshotSchema.array().safeParse(storedTasks);\n const tasks: SessionTaskSnapshot[] = parsedTasks.success ? parsedTasks.data : [];\n const om = ds.omProgress;\n const reflectionSavings =\n om.buffered.reflection.inputObservationTokens - om.buffered.reflection.observationTokens;\n const st = session.state.get() as Record<string, unknown>;\n const oneOf = <T extends string>(value: unknown, allowed: readonly T[], fallback: T): T =>\n allowed.includes(value as T) ? (value as T) : fallback;\n const oneOfOptional = <T extends string>(value: unknown, allowed: readonly T[]): T | undefined =>\n allowed.includes(value as T) ? (value as T) : undefined;\n return {\n controllerId,\n resourceId,\n threadId,\n modeId: session.mode.get(),\n modelId: session.model.get(),\n running: ds.isRunning === true,\n tasks,\n omProgress: {\n status: om.status,\n pendingTokens: om.pendingTokens,\n threshold: om.threshold,\n thresholdPercent: om.thresholdPercent,\n observationTokens: om.observationTokens,\n reflectionThreshold: om.reflectionThreshold,\n reflectionThresholdPercent: om.reflectionThresholdPercent,\n projectedMessageRemoval: om.buffered.observations.projectedMessageRemoval,\n projectedReflectionSavings: reflectionSavings > 0 ? reflectionSavings : 0,\n },\n tokenUsage: ds.tokenUsage,\n settings: {\n yolo: st.yolo === true,\n // No session override → omit, so clients don't mistake an inherited\n // configured default (resolved at request time) for an explicit 'off'.\n thinkingLevel: oneOfOptional(st.thinkingLevel, ['off', 'low', 'medium', 'high', 'xhigh', 'max'] as const),\n notifications: oneOf(st.notifications, ['off', 'bell', 'system', 'both'] as const, 'off'),\n smartEditing: st.smartEditing !== false,\n },\n };\n } catch (error) {\n return handleError(error, 'error reading controller session state');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_MODES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/modes',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModesResponseSchema,\n summary: 'List controller modes',\n description: 'Lists the modes configured on the controller (e.g. build, plan).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return {\n modes: controller.listModes().map(mode => ({ id: mode.id, name: mode.name })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller modes');\n }\n },\n});\n\nconst listActiveRunsResponseSchema = z.object({\n runs: z.array(\n z.object({\n runId: z.string(),\n resourceId: z.string().optional(),\n threadId: z.string(),\n }),\n ),\n});\n\nexport const LIST_AGENT_CONTROLLER_ACTIVE_RUNS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/active-runs',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listActiveRunsResponseSchema,\n summary: 'List active controller runs',\n description:\n 'Lists the runs in flight on the controller across all resources, without creating or touching a session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return { runs: controller.listActiveThreadRuns() };\n } catch (error) {\n return handleError(error, 'error listing active controller runs');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREADS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: listThreadsQuerySchema,\n responseSchema: listThreadsResponseSchema,\n summary: 'List session threads',\n description:\n 'Lists the threads for the session\\u2019s resource, most-recently-updated first. Pass `limit` to return only the newest N (e.g. for a sidebar). Pass `tags` (a JSON-encoded object) to scope the list to threads matching every tag \\u2014 e.g. `{ projectPath }` so git worktrees sharing a resourceId each see only their own threads.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, limit, tags }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. `createSession` triggers workspace/sandbox initialization\n // (5–17s stall, cost per provisioned sandbox) as a side effect — reads\n // shouldn't pay that. Session creation happens on the write path.\n // `queryThreads` lazily initializes storage (not workspace) on its own.\n const threads = await controller.queryThreads({ resourceId });\n // A thread's metadata mixes the session scoping tags (stamped at creation,\n // e.g. `projectPath`) with internal session bookkeeping that\n // `Session.loadMetadata()` reads back (selected model/mode, observer/\n // reflector config, token usage). Return only the string-valued scoping\n // tags, skipping reserved internal keys so they never leak out as \"tags\"\n // or become matchable via the `tags` filter.\n const getTags = (t: { metadata?: unknown }): Record<string, string> => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (typeof value === 'string' && !isReservedThreadMetadataKey(key)) result[key] = value;\n }\n return result;\n };\n // A single resourceId can be shared across git worktrees of the same repo\n // (the id is derived from the git URL). When tags are supplied, scope to\n // threads whose metadata matches every tag and drop the rest, so worktree A\n // never shows worktree B's threads. Mirrors the controller's tag-aware\n // selection and the TUI's worktree-strict listing. Reserved internal keys\n // are ignored as filter tags so callers can't match on session bookkeeping.\n const tagEntries = tags ? Object.entries(tags).filter(([key]) => !isReservedThreadMetadataKey(key)) : [];\n const scoped =\n tagEntries.length > 0\n ? threads.filter(t => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n return tagEntries.every(([key, value]) => metadata[key] === value);\n })\n : threads;\n const toTime = (t: { updatedAt?: Date; createdAt?: Date }) => (t.updatedAt ?? t.createdAt)?.getTime() ?? 0;\n const sorted = [...scoped].sort((a, b) => toTime(b) - toTime(a));\n const max = Number(limit);\n const limited = Number.isFinite(max) && max > 0 ? sorted.slice(0, max) : sorted;\n // Thread run state comes from the controller-wide active-run registry,\n // which unions per-agent active thread runs across all backing agents.\n // Keyed by resourceId + threadId so it covers runs started by any session\n // on this resource — including sessions scoped to other git worktrees.\n // Using this controller-level accessor (rather than resolving an agent\n // via a Session) keeps the read path free of session/workspace\n // side-effects.\n const activeThreadIds = new Set(\n controller\n .listActiveThreadRuns()\n .filter(r => r.resourceId === resourceId)\n .map(r => r.threadId),\n );\n return {\n threads: limited.map(t => {\n const threadTags = getTags(t);\n return {\n id: t.id,\n title: t.title,\n tags: Object.keys(threadTags).length > 0 ? threadTags : undefined,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : undefined,\n state: activeThreadIds.has(t.id) ? ('active' as const) : ('idle' as const),\n };\n }),\n };\n } catch (error) {\n return handleError(error, 'error listing controller threads');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_NOTIFICATION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/notifications',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendNotificationBodySchema,\n responseSchema: z.object({\n accepted: z.boolean(),\n notificationId: z.string().optional(),\n decision: z.string().optional(),\n runId: z.string().optional(),\n }),\n summary: 'Send a notification signal to a session',\n description:\n 'Delivers a notification to the session\\u2019s current agent/thread. The agent\\u2019s delivery policy determines whether the notification wakes an idle thread, is summarised, or is persisted for later.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes,\n metadata,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const result = await session.sendNotificationSignal({\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes: attributes as Record<string, string | number | boolean | null | undefined> | undefined,\n metadata,\n });\n return {\n accepted: result.accepted !== undefined,\n notificationId: result.record?.id,\n decision: result.decision?.action,\n runId: result.runId,\n };\n } catch (error) {\n return handleError(error, 'error sending controller notification');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Thread lifecycle\n// ---------------------------------------------------------------------------\n\nexport const CREATE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: createThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Create a new thread',\n description: 'Creates a new thread in the session (unbinds the previous thread, binds the new one).',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.create({ title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller thread');\n }\n },\n});\n\nexport const DELETE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Delete a thread',\n description: 'Deletes a thread. If the deleted thread is the active one, the session is unbound.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.thread.delete({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error deleting controller thread');\n }\n },\n});\n\nexport const RENAME_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: renameThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Rename a thread',\n description: 'Renames the specified thread.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Ensure the thread is the active one (switch if not)\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n await session.thread.rename({ title });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error renaming controller thread');\n }\n },\n});\n\nexport const CLONE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/clone',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: cloneThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Clone a thread',\n description: 'Clones a thread (and its messages). The session binds to the new clone.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, sourceThreadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.clone({ sourceThreadId, title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error cloning controller thread');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREAD_MESSAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId/messages',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: listMessagesQuerySchema,\n responseSchema: listMessagesResponseSchema,\n summary: 'List thread messages',\n description: 'Lists messages for a specific thread. Returns most recent messages first.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, threadId, limit }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. Session creation would trigger workspace/sandbox\n // initialization as a side effect; reads should never pay that cost.\n // The query methods lazily initialize storage (not workspace) on their own.\n // The route is authorized for the URL's resourceId, but `threadId` is\n // otherwise unscoped. Verify the thread belongs to this resource so a\n // caller can't peek at another resource's messages by guessing an id\n // — matches the check `session.thread.listMessages` performed via\n // `session.thread.set` before we bypassed session construction.\n const thread = await controller.queryThreadById({ threadId });\n if (!thread || thread.resourceId !== resourceId) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const messages = await controller.queryThreadMessages({ threadId, limit });\n return {\n messages: messages.map(m => ({\n id: m.id,\n role: m.role,\n content: m.content as { format: 2; parts: Array<{ type: string; [key: string]: unknown }> },\n createdAt: m.createdAt instanceof Date ? m.createdAt.toISOString() : undefined,\n threadId: m.threadId,\n resourceId: m.resourceId,\n type: m.type,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller thread messages');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Follow-up\n// ---------------------------------------------------------------------------\n\nexport const FOLLOW_UP_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/follow-up',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: followUpBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Queue a follow-up message',\n description:\n 'Queues a follow-up message. If the session is idle it sends immediately; if a run is active it queues for after completion.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.followUp({ content: message, requestContext }),\n session,\n mastra,\n operation: 'followUp',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error queuing controller follow-up');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Models\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLER_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/models',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModelsResponseSchema,\n summary: 'List available models',\n description: 'Lists all models available on this controller (with auth status and use counts).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n const models = await controller.listAvailableModels();\n return {\n models: models.map(m => ({\n id: m.id,\n provider: m.provider,\n modelName: m.modelName,\n hasApiKey: m.hasApiKey,\n useCount: m.useCount,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller models');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Workspace status\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_WORKSPACE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/workspace',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: workspaceStatusResponseSchema,\n summary: 'Get workspace status',\n description: 'Returns whether the controller has a workspace configured and whether it is ready.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n return {\n hasWorkspace: controller.hasWorkspace(),\n isReady: controller.isWorkspaceReady(),\n };\n } catch (error) {\n return handleError(error, 'error reading controller workspace status');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Observational Memory\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_OM_RECORD_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/om',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: omRecordResponseSchema,\n summary: 'Get observational memory record',\n description: 'Returns the current observational memory record for the session\\u2019s thread/resource.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const record = await controller.getObservationalMemoryRecord(session);\n return { record: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller OM record');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Resource identity\n// ---------------------------------------------------------------------------\n\nexport const SET_AGENT_CONTROLLER_RESOURCE_ID_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resource',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: z.object({ newResourceId: z.string() }),\n responseSchema: ackResponseSchema,\n summary: 'Change the session resource ID',\n description: 'Updates the session\\u2019s resource identity (e.g. when a user logs in).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, newResourceId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await controller.setResourceId(session, { resourceId: newResourceId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller resource ID');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_RESOURCE_IDS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resources',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: z.object({ resourceIds: z.array(z.string()) }),\n summary: 'Get known resource IDs',\n description: 'Lists the resource IDs known to this session (from threads).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const resourceIds = await controller.getKnownResourceIds(session);\n return { resourceIds };\n } catch (error) {\n return handleError(error, 'error listing controller resource IDs');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Goals\n// ---------------------------------------------------------------------------\n\nconst setGoalBodySchema = z.object({\n objective: z.string(),\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n});\nconst updateGoalBodySchema = z.object({\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n status: z.enum(['active', 'paused', 'done']).optional(),\n});\nconst goalRecordSchema = z.object({\n id: z.string().optional(),\n objective: z.string(),\n status: z.enum(['active', 'paused', 'done']),\n runsUsed: z.number(),\n maxRuns: z.number().optional(),\n judgeModelId: z.string().optional(),\n startedAt: z.number(),\n updatedAt: z.number(),\n pausedReason: z.string().optional(),\n});\nconst goalResponseSchema = z.object({ goal: goalRecordSchema.optional() });\n\nfunction getAgentForSession(controller: AgentController<any>, session: Session<any>): Agent {\n return controller.getCurrentAgent(session);\n}\n\nexport const GET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: goalResponseSchema,\n summary: 'Get the current goal',\n description: 'Returns the active/paused/done goal objective for the session\\u2019s thread, if any.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) return { goal: undefined };\n const agent = getAgentForSession(controller, session);\n const record = await agent.getObjective({ threadId });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller goal');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Set a goal',\n description:\n 'Sets a new objective for the session\\u2019s thread. The agent\\u2019s in-loop goal judge evaluates progress after each turn.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n objective,\n judgeModelId,\n maxRuns,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.setObjective(objective, {\n threadId,\n resourceId: session.identity.getResourceId(),\n ...(judgeModelId ? { judgeModelId } : {}),\n ...(maxRuns != null ? { maxRuns } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error setting controller goal');\n }\n },\n});\n\nexport const UPDATE_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: updateGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Update goal options',\n description: 'Updates the judge model, max runs, or status of the active goal. No-op when no goal is set.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n judgeModelId,\n maxRuns,\n status,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.updateObjectiveOptions({\n threadId,\n ...(judgeModelId !== undefined ? { judgeModelId } : {}),\n ...(maxRuns !== undefined ? { maxRuns } : {}),\n ...(status !== undefined ? { status } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error updating controller goal');\n }\n },\n});\n\nexport const CLEAR_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Clear the goal',\n description: 'Removes the active goal from the session\\u2019s thread.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n await agent.clearObjective({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error clearing controller goal');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Permissions\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_PERMISSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: permissionRulesResponseSchema,\n summary: 'Get permission rules',\n description: 'Returns the current permission rules (per-category and per-tool policies) for the session.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const rules = session.permissions.getRules();\n return {\n categories: rules.categories as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n tools: rules.tools as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n };\n } catch (error) {\n return handleError(error, 'error getting controller permissions');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_CATEGORY_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/category',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setCategoryPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a tool category',\n description: 'Sets the approval policy (allow/ask/deny) for all tools in a category.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, category, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForCategory({ category, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller category permission');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_TOOL_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/tool',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setToolPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a specific tool',\n description:\n 'Sets the approval policy (allow/ask/deny) for a specific tool by name. Per-tool overrides take precedence over category policies.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolName, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForTool({ toolName, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller tool permission');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Session State\n// ---------------------------------------------------------------------------\n\nconst setSessionStateBodySchema = z.object({ state: z.record(z.string(), z.unknown()) });\n\nexport const SET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/state',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setSessionStateBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set session state',\n description:\n 'Merges the provided key-value pairs into the session state. Existing keys not in the payload are preserved.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, state, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.state.set(state as Record<string, unknown>);\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller session state');\n }\n },\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-controller.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/agent-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-controller.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/agent-controller.ts"],"names":[],"mappings":"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"}
@@ -612,10 +612,16 @@ const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = createRoute({
612
612
  requiresPermission: "agent-controller:execute",
613
613
  handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, resumeData, requestContext }) => {
614
614
  try {
615
- await (await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext)).respondToToolSuspension({
616
- toolCallId,
617
- resumeData,
618
- requestContext
615
+ const session = await getSession(getAgentControllerOrThrow(mastra, controllerId), resourceId, { scope: sessionScope }, requestContext);
616
+ ackBackgroundSessionWork({
617
+ work: session.respondToToolSuspension({
618
+ toolCallId,
619
+ resumeData,
620
+ requestContext
621
+ }),
622
+ session,
623
+ mastra,
624
+ operation: "respondToToolSuspension"
619
625
  });
620
626
  return { ok: true };
621
627
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-controller.js","names":[],"sources":["../../../src/server/handlers/agent-controller.ts"],"sourcesContent":["import type { Agent } from '@mastra/core/agent';\nimport type {\n AgentController,\n AgentControllerDisplayState,\n AgentControllerEvent,\n ErrorCarryingAgentControllerEvent,\n JsonReadyAgentControllerEvent,\n ReservedThreadMetadataKey,\n Session,\n TokenUsage,\n WireDisplayState,\n} from '@mastra/core/agent-controller';\nimport type { RequestContext } from '@mastra/core/request-context';\n// Type-only import: erased at runtime, so this cannot crash against an older\n// @mastra/core that lacks the `./agent-controller` subpath export. Controller\n// resolution at runtime goes through mastra.getAgentController?.(), never a\n// value import.\nimport { z } from 'zod/v4';\n\nimport { HTTPException } from '../http-exception';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\n/**\n * AgentController session routes.\n *\n * An AgentController registered on a Mastra instance (via\n * `new Mastra({ agentControllers })`) exposes its sessions over HTTP so\n * non-terminal clients — e.g. a browser-based MastraCode — can create sessions,\n * send messages, stream events, and drive run-control. Each route resolves its\n * target AgentController by id, then operates on a session bound to a\n * `resourceId` (get-or-create, so reconnects resume rather than fork the\n * conversation).\n */\n\n/**\n * Internal thread-metadata keys that `Session.loadMetadata()` reads back as\n * runtime bookkeeping (selected model/mode, observer/reflector config, token\n * usage). They share the flat thread `metadata` bag with user-provided session\n * scoping tags, so they must never be treated as tags here.\n *\n * Importing core's list as a value would exceed this package's peer-dependency\n * floor, so it is mirrored under `satisfies`: tsc rejects a missing or extra key.\n */\nconst RESERVED_THREAD_METADATA_KEYS = {\n currentModelId: true,\n currentModeId: true,\n observerModelId: true,\n reflectorModelId: true,\n observationThreshold: true,\n reflectionThreshold: true,\n tokenUsage: true,\n thinkingLevel: true,\n notifications: true,\n} satisfies Record<ReservedThreadMetadataKey, true>;\n\nfunction isReservedThreadMetadataKey(key: string): boolean {\n return Object.hasOwn(RESERVED_THREAD_METADATA_KEYS, key) || key.startsWith('modeModelId_');\n}\n\n/**\n * Resolves a controller by id via the canonical `mastra.getAgentController`\n * accessor, throwing a 404 if no controller is registered under that id.\n */\nfunction getAgentControllerOrThrow(\n mastra: {\n getAgentController?: (id: string) => AgentController<any> | undefined;\n },\n controllerId: string,\n): AgentController<any> {\n const controller = mastra.getAgentController?.(controllerId);\n if (!controller) {\n throw new HTTPException(404, { message: `agent controller \"${controllerId}\" not found` });\n }\n return controller;\n}\n\nasync function getSession(\n controller: AgentController<any>,\n resourceId: string,\n options?: { tags?: Record<string, string>; scope?: string; threadId?: string },\n requestContext?: RequestContext,\n): Promise<Session<any>> {\n await controller.init();\n const { tags, scope, threadId } = options ?? {};\n // Scoped sessions are independent sessions over the same resource (e.g. one\n // per git worktree), so qualify the stable session id with the scope to keep\n // their identities distinct as well. An exact thread binding doubles as the\n // stable session id when supplied.\n const id = threadId ?? (scope ? `${resourceId}::${scope}` : resourceId);\n return controller.createSession({ resourceId, id, ownerId: controller.id, tags, scope, threadId, requestContext });\n}\n\n/**\n * Acknowledges a session operation that keeps running after the response is\n * sent.\n *\n * The messages/steer/follow-up routes answer `{ ok: true }` as soon as the\n * message is handed to the session: the reply itself arrives on the session's\n * SSE stream, so the request must not block for the whole turn. Those session\n * methods can still reject — `sendMessage` deliberately rejects when signal\n * submission fails before a stream starts — and a bare `void promise` turns\n * that into an unhandled rejection, which terminates the process on Node's\n * default `--unhandled-rejections=throw`.\n *\n * Observing the promise keeps the immediate acknowledgement while logging the\n * failure and emitting an `error` event on the session, so a client streaming\n * the session is told the turn died instead of waiting for an `agent_end` that\n * will never come.\n */\nfunction ackBackgroundSessionWork({\n work,\n session,\n mastra,\n operation,\n}: {\n work: Promise<unknown>;\n session: Session<any>;\n mastra: { getLogger?: () => { error?: (message: string, context?: Record<string, unknown>) => void } | undefined };\n operation: string;\n}): void {\n void work.catch((error: unknown) => {\n const failure = error instanceof Error ? error : new Error(String(error));\n mastra.getLogger?.()?.error?.(`AgentController ${operation} failed after the request was acknowledged`, {\n operation,\n error: failure,\n });\n try {\n session.emit({ type: 'error', error: failure });\n } catch {\n // A session that can no longer accept events (e.g. torn down mid-flight)\n // must not turn a logged failure into a second unhandled rejection.\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Schemas\n// ---------------------------------------------------------------------------\n\nconst controllerIdPathParams = z.object({ controllerId: z.string() });\nconst sessionPathParams = z.object({ controllerId: z.string(), resourceId: z.string() });\n/**\n * Optional session scope (mirrors `AgentController.createSession`'s `scope`):\n * requests with the same resourceId but different scopes address independent\n * sessions (e.g. one per git worktree). Sent as a `sessionScope` query param\n * on session routes; named to avoid colliding with the model-switch `scope`.\n */\nconst sessionScopeQuerySchema = z.object({ sessionScope: z.string().optional() });\nconst sessionStateQuerySchema = sessionScopeQuerySchema.extend({ threadId: z.string().optional() });\n\nconst createSessionBodySchema = z.object({\n resourceId: z.string(),\n tags: z.record(z.string(), z.string()).optional(),\n threadId: z.string().optional(),\n sessionScope: z.string().optional(),\n});\n// Server-side attachment limits mirroring the web composer caps (10MB per\n// file, 20MB total), adjusted for base64 overhead (~4/3x).\nconst MAX_FILE_DATA_LENGTH = 14 * 1024 * 1024;\nconst MAX_TOTAL_FILE_DATA_LENGTH = 28 * 1024 * 1024;\n/**\n * Optional client-supplied request context, merged into the server-derived\n * request context by the adapter context middleware (reserved keys are\n * server-controlled). Declared on run-triggering body schemas so the OpenAPI\n * spec documents it.\n */\nconst bodyRequestContextSchema = z.record(z.string(), z.unknown()).optional();\n\nconst sendMessageBodySchema = z.object({\n message: z.string(),\n requestContext: bodyRequestContextSchema,\n // Optional attachments (e.g. pasted images). `data` is base64-encoded.\n files: z\n .array(\n z.object({\n data: z.string().max(MAX_FILE_DATA_LENGTH),\n mediaType: z.string(),\n filename: z.string().optional(),\n }),\n )\n .max(20)\n .refine(files => files.reduce((total, file) => total + file.data.length, 0) <= MAX_TOTAL_FILE_DATA_LENGTH, {\n message: 'Total attachment size exceeds limit',\n })\n .optional(),\n});\nconst steerBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\nconst toolApprovalBodySchema = z.object({\n toolCallId: z.string(),\n approved: z.boolean(),\n requestContext: bodyRequestContextSchema,\n});\nconst toolSuspensionBodySchema = z.object({\n toolCallId: z.string(),\n // Free-form resume payload. For ask_user this is a string (or string[] for\n // multi-select); for submit_plan it's `{ action, feedback? }`; for\n // request_access it's \"Yes\"/\"No\".\n resumeData: z.unknown(),\n requestContext: bodyRequestContextSchema,\n});\nconst switchModeBodySchema = z.object({ modeId: z.string() });\nconst switchModelBodySchema = z.object({\n modelId: z.string(),\n scope: z.enum(['global', 'thread']).optional(),\n modeId: z.string().optional(),\n});\nconst switchThreadBodySchema = z.object({ threadId: z.string() });\nconst createThreadBodySchema = z.object({ title: z.string().optional() });\nconst renameThreadBodySchema = z.object({ title: z.string() });\nconst threadPathParams = z.object({ controllerId: z.string(), resourceId: z.string(), threadId: z.string() });\nconst cloneThreadBodySchema = z.object({\n sourceThreadId: z.string().optional(),\n title: z.string().optional(),\n});\nconst listMessagesQuerySchema = z.object({ limit: z.coerce.number().optional(), sessionScope: z.string().optional() });\n/**\n * `tags` arrives as a JSON-encoded object in the query string (query params are\n * flat strings). It scopes the listing to threads whose metadata matches every\n * tag — e.g. `{ projectPath }` so git worktrees sharing a resourceId each see\n * only their own threads. Malformed JSON is treated as \"no filter\".\n */\nconst listThreadsQuerySchema = z.object({\n limit: z.coerce.number().optional(),\n sessionScope: z.string().optional(),\n tags: z\n .preprocess(value => {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n }, z.record(z.string(), z.string()).optional())\n .optional(),\n});\nconst followUpBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\n\nconst sendNotificationBodySchema = z.object({\n source: z.string(),\n kind: z.string(),\n summary: z.string(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n payload: z.unknown().optional(),\n sourceId: z.string().optional(),\n dedupeKey: z.string().optional(),\n coalesceKey: z.string().optional(),\n attributes: z.record(z.string(), z.unknown()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst listAgentControllersResponseSchema = z.object({\n agentControllers: z.array(z.object({ id: z.string() })),\n});\nconst createSessionResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n});\nconst ackResponseSchema = z.object({ ok: z.boolean() });\n/**\n * Status-line relevant slice of the session's observational-memory progress.\n * Mirrors the TUI status line: `msg pending/threshold ↓removal` (the active\n * message window before an observation fires) and `mem observed/reflection\n * ↓savings` (accumulated observations before a reflection fires).\n */\nconst omProgressSummarySchema = z.object({\n status: z.string(),\n pendingTokens: z.number(),\n threshold: z.number(),\n thresholdPercent: z.number(),\n observationTokens: z.number(),\n reflectionThreshold: z.number(),\n reflectionThresholdPercent: z.number(),\n /** Tokens the next observation will remove from the message window. */\n projectedMessageRemoval: z.number(),\n /** Tokens the next reflection is projected to save. */\n projectedReflectionSavings: z.number(),\n});\nconst tokenUsageSchema = z.object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n totalTokens: z.number(),\n reasoningTokens: z.number().optional(),\n cachedInputTokens: z.number().optional(),\n cacheCreationInputTokens: z.number().optional(),\n cacheCreationInputTokens5m: z.number().optional(),\n cacheCreationInputTokens1h: z.number().optional(),\n raw: z.unknown().optional(),\n}) satisfies z.ZodType<TokenUsage>;\nconst sessionSettingsSchema = z.object({\n yolo: z.boolean(),\n /** Session override only — absent when the session inherits a configured default. */\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh', 'max']).optional(),\n notifications: z.enum(['off', 'bell', 'system', 'both']),\n smartEditing: z.boolean(),\n});\nconst taskSnapshotSchema = z.object({\n id: z.string(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n});\ntype SessionTaskSnapshot = z.infer<typeof taskSnapshotSchema>;\nconst sessionStateResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n modeId: z.string(),\n modelId: z.string(),\n /** Whether the agent is currently executing a run (for initial UI hydration). */\n running: z.boolean().optional(),\n tasks: z.array(taskSnapshotSchema).optional(),\n omProgress: omProgressSummarySchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n settings: sessionSettingsSchema.optional(),\n});\nconst listModesResponseSchema = z.object({\n modes: z.array(z.object({ id: z.string(), name: z.string().optional() })),\n});\nconst listThreadsResponseSchema = z.object({\n threads: z.array(\n z.object({\n id: z.string(),\n title: z.string().optional(),\n updatedAt: z.string().optional(),\n /** The session scoping tags stamped on this thread (e.g. `{ projectPath }`). */\n tags: z.record(z.string(), z.string()).optional(),\n /** Whether a run is currently executing on this thread ('active') or not ('idle'). */\n state: z.enum(['active', 'idle']).optional(),\n }),\n ),\n});\nconst threadResponseSchema = z.object({\n id: z.string(),\n title: z.string().optional(),\n resourceId: z.string().optional(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n});\nconst messagePartSchema = z\n .object({\n type: z.string(),\n })\n .passthrough();\n// Mirrors the persisted `MastraMessageContentV2` shape (AI-SDK-v4 `UIMessage`-style):\n// `format: 2` plus a nested `parts` array, with optional companion fields preserved.\nconst messageContentV2Schema = z\n .object({\n format: z.literal(2),\n parts: z.array(messagePartSchema),\n })\n .passthrough();\nconst listMessagesResponseSchema = z.object({\n messages: z.array(\n z.object({\n id: z.string(),\n role: z.enum(['user', 'assistant', 'system', 'tool', 'signal']),\n content: messageContentV2Schema,\n createdAt: z.string().optional(),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n type: z.string().optional(),\n }),\n ),\n});\nconst listModelsResponseSchema = z.object({\n models: z.array(\n z.object({\n id: z.string(),\n provider: z.string(),\n modelName: z.string(),\n hasApiKey: z.boolean(),\n useCount: z.number(),\n }),\n ),\n});\nconst workspaceStatusResponseSchema = z.object({\n hasWorkspace: z.boolean(),\n isReady: z.boolean(),\n});\nconst omRecordResponseSchema = z.object({\n record: z.unknown().optional(),\n});\nconst permissionPolicyEnum = z.enum(['allow', 'ask', 'deny']);\nconst toolCategoryEnum = z.enum(['read', 'edit', 'execute', 'mcp', 'other']);\nconst permissionRulesResponseSchema = z.object({\n categories: z.record(z.string(), permissionPolicyEnum).optional(),\n tools: z.record(z.string(), permissionPolicyEnum).optional(),\n});\nconst setCategoryPermissionBodySchema = z.object({\n category: toolCategoryEnum,\n policy: permissionPolicyEnum,\n});\nconst setToolPermissionBodySchema = z.object({\n toolName: z.string(),\n policy: permissionPolicyEnum,\n});\n\n// ---------------------------------------------------------------------------\n// Routes\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLERS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller',\n responseType: 'json' as const,\n responseSchema: listAgentControllersResponseSchema,\n summary: 'List agent controllers',\n description: 'Lists the agent controllers hosted on this Mastra instance.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra }) => {\n try {\n const ids = new Set<string>();\n if (mastra.listAgentControllers) {\n for (const id of Object.keys(mastra.listAgentControllers())) ids.add(id);\n }\n return { agentControllers: Array.from(ids).map(id => ({ id })) };\n } catch (error) {\n return handleError(error, 'error listing agent controllers');\n }\n },\n});\n\nexport const CREATE_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n bodySchema: createSessionBodySchema,\n responseSchema: createSessionResponseSchema,\n summary: 'Create or resume a controller session',\n description:\n 'Creates a session for the given resourceId, or returns the existing one (get-or-create), so reconnects resume the conversation.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, tags, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { tags, scope: sessionScope, threadId }, requestContext);\n return {\n controllerId,\n resourceId,\n threadId: session.thread.getId() ?? undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller session');\n }\n },\n});\n\n/**\n * `display_state_changed` Maps JSON-serialize to `{}`. Snapshot the display state\n * before converting its Maps so queued wire events retain point-in-time state.\n */\nfunction toWireDisplayState(displayState: AgentControllerDisplayState): WireDisplayState {\n const snapshot = structuredClone(displayState);\n return {\n ...snapshot,\n activeTools: Object.fromEntries(snapshot.activeTools),\n toolInputBuffers: Object.fromEntries(snapshot.toolInputBuffers),\n pendingSuspensions: Object.fromEntries(snapshot.pendingSuspensions),\n activeSubagents: Object.fromEntries(snapshot.activeSubagents),\n modifiedFiles: Object.fromEntries(snapshot.modifiedFiles),\n };\n}\n\nfunction carriesError(event: AgentControllerEvent): event is ErrorCarryingAgentControllerEvent & { error: Error } {\n return 'error' in event && event.error instanceof Error;\n}\n\n/**\n * An `Error`'s `message`/`name` are non-enumerable, so flatten it before JSON\n * serialization. Streamed message events intentionally retain the controller's\n * live accumulated message; consumers requiring temporal isolation must copy or\n * serialize at their own ownership boundary.\n */\nfunction toWireEvent(event: AgentControllerEvent): JsonReadyAgentControllerEvent {\n if ('displayState' in event) {\n return { ...event, displayState: toWireDisplayState(event.displayState) };\n }\n if (carriesError(event)) {\n return { ...event, error: { name: event.error.name, message: event.error.message } };\n }\n return event;\n}\n\nexport const STREAM_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/stream',\n responseType: 'stream' as const,\n streamFormat: 'sse' as const,\n sseFlushOnConnect: true,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n summary: 'Stream controller session events',\n description: 'Subscribes to a session\\u2019s event bus and streams events to the client over SSE.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, abortSignal, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n\n let cleanedUp = false;\n let heartbeat: ReturnType<typeof setTimeout> | undefined;\n let unsubscribe: (() => void) | undefined;\n const clearHeartbeat = () => {\n if (heartbeat) {\n clearTimeout(heartbeat);\n heartbeat = undefined;\n }\n };\n const cleanup = (controller?: ReadableStreamDefaultController) => {\n if (cleanedUp) return;\n cleanedUp = true;\n clearHeartbeat();\n unsubscribe?.();\n if (controller) {\n try {\n controller.close();\n } catch {}\n }\n };\n\n // The stream yields raw event objects plus `:`-prefixed SSE comments\n // (heartbeats); the server adapter frames events and passes comments\n // through verbatim.\n return new ReadableStream<unknown>({\n start(controller) {\n const scheduleHeartbeat = () => {\n if (cleanedUp) return;\n clearHeartbeat();\n heartbeat = setTimeout(() => {\n heartbeat = undefined;\n if (cleanedUp) return;\n try {\n controller.enqueue(': heartbeat\\n\\n');\n } catch {\n cleanup();\n return;\n }\n scheduleHeartbeat();\n }, 25_000);\n };\n\n unsubscribe = session.subscribe(event => {\n if (cleanedUp) return;\n try {\n // Enqueue the raw event object. The server adapter is responsible\n // for SSE framing (`data: <json>\\n\\n`); enqueuing a pre-framed\n // string here would double-encode it.\n controller.enqueue(toWireEvent(event));\n scheduleHeartbeat();\n } catch {\n cleanup();\n }\n });\n\n const abortCleanup = () => cleanup(controller);\n abortSignal?.addEventListener('abort', abortCleanup, { once: true });\n scheduleHeartbeat();\n },\n cancel() {\n cleanup();\n },\n });\n } catch (error) {\n return handleError(error, 'error streaming controller session');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_MESSAGE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/messages',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendMessageBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Send a message to a controller session',\n description: 'Sends a user message to the session. The reply streams as events on the session\\u2019s SSE stream.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, files, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Forward the server middleware's requestContext so identity injected in\n // `server.middleware` reaches dynamic instructions and tools (same as the\n // plain agent message route).\n ackBackgroundSessionWork({\n work: session.sendMessage({ content: message, files, requestContext }),\n session,\n mastra,\n operation: 'sendMessage',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error sending controller message');\n }\n },\n});\n\nexport const ABORT_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/abort',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Abort a controller session run',\n description: 'Aborts the in-flight run for the session, if any.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n session.abort();\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error aborting controller session');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_APPROVAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-approval',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolApprovalBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a controller tool approval',\n description: 'Approves or declines a pending tool call surfaced by the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, approved, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Resolve the parked approval gate so the session's own run loop drives the\n // continuation and emits its events to subscribers (the open SSE stream).\n // Calling approveToolCall/declineToolCall directly would bypass the gate,\n // leaving the run loop hung and duplicating the resumed stream.\n // Pass toolCallId so a stale request cannot resolve a different pending gate.\n session.respondToToolApproval({ toolCallId, decision: approved ? 'approve' : 'decline', requestContext });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool approval');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-suspension',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolSuspensionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a suspended controller tool',\n description:\n 'Resumes a suspended interactive tool (ask_user, request_access, submit_plan) with the provided resume data.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, resumeData, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.respondToToolSuspension({ toolCallId, resumeData, requestContext });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool suspension');\n }\n },\n});\n\nexport const STEER_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/steer',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: steerBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Steer the in-flight run',\n description: 'Injects a message into the running turn (interjection) without starting a new run.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.steer({ content: message, requestContext }),\n session,\n mastra,\n operation: 'steer',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error steering controller session');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/mode',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModeBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session mode',\n description: 'Switches the active mode (e.g. build, plan) for the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.mode.switch({ modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller mode');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODEL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/model',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModelBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session model',\n description: 'Switches the model for the session, scoped to the thread by default.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modelId, scope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.model.switch({ modelId, scope, modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller model');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/thread',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session thread',\n description: 'Switches the session to an existing thread (rebinding its stream and state).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller thread');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionStateQuerySchema,\n responseSchema: sessionStateResponseSchema,\n summary: 'Get session state',\n description: 'Returns the current mode, model, thread, and durable tasks for initial UI hydration.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId: requestedThreadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const ds = session.displayState.get();\n const threadId = requestedThreadId ?? session.thread.getId() ?? undefined;\n const storage = mastra.getStorage();\n if (requestedThreadId) {\n const memory = await storage?.getStore('memory');\n const thread = await memory?.getThreadById({ threadId: requestedThreadId, resourceId });\n if (!thread) throw new HTTPException(404, { message: `thread \"${requestedThreadId}\" not found` });\n }\n const threadState = threadId ? await storage?.getStore('threadState') : undefined;\n const storedTasks = threadId ? await threadState?.getState<unknown>({ threadId, type: 'task' }) : undefined;\n const parsedTasks = taskSnapshotSchema.array().safeParse(storedTasks);\n const tasks: SessionTaskSnapshot[] = parsedTasks.success ? parsedTasks.data : [];\n const om = ds.omProgress;\n const reflectionSavings =\n om.buffered.reflection.inputObservationTokens - om.buffered.reflection.observationTokens;\n const st = session.state.get() as Record<string, unknown>;\n const oneOf = <T extends string>(value: unknown, allowed: readonly T[], fallback: T): T =>\n allowed.includes(value as T) ? (value as T) : fallback;\n const oneOfOptional = <T extends string>(value: unknown, allowed: readonly T[]): T | undefined =>\n allowed.includes(value as T) ? (value as T) : undefined;\n return {\n controllerId,\n resourceId,\n threadId,\n modeId: session.mode.get(),\n modelId: session.model.get(),\n running: ds.isRunning === true,\n tasks,\n omProgress: {\n status: om.status,\n pendingTokens: om.pendingTokens,\n threshold: om.threshold,\n thresholdPercent: om.thresholdPercent,\n observationTokens: om.observationTokens,\n reflectionThreshold: om.reflectionThreshold,\n reflectionThresholdPercent: om.reflectionThresholdPercent,\n projectedMessageRemoval: om.buffered.observations.projectedMessageRemoval,\n projectedReflectionSavings: reflectionSavings > 0 ? reflectionSavings : 0,\n },\n tokenUsage: ds.tokenUsage,\n settings: {\n yolo: st.yolo === true,\n // No session override → omit, so clients don't mistake an inherited\n // configured default (resolved at request time) for an explicit 'off'.\n thinkingLevel: oneOfOptional(st.thinkingLevel, ['off', 'low', 'medium', 'high', 'xhigh', 'max'] as const),\n notifications: oneOf(st.notifications, ['off', 'bell', 'system', 'both'] as const, 'off'),\n smartEditing: st.smartEditing !== false,\n },\n };\n } catch (error) {\n return handleError(error, 'error reading controller session state');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_MODES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/modes',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModesResponseSchema,\n summary: 'List controller modes',\n description: 'Lists the modes configured on the controller (e.g. build, plan).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return {\n modes: controller.listModes().map(mode => ({ id: mode.id, name: mode.name })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller modes');\n }\n },\n});\n\nconst listActiveRunsResponseSchema = z.object({\n runs: z.array(\n z.object({\n runId: z.string(),\n resourceId: z.string().optional(),\n threadId: z.string(),\n }),\n ),\n});\n\nexport const LIST_AGENT_CONTROLLER_ACTIVE_RUNS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/active-runs',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listActiveRunsResponseSchema,\n summary: 'List active controller runs',\n description:\n 'Lists the runs in flight on the controller across all resources, without creating or touching a session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return { runs: controller.listActiveThreadRuns() };\n } catch (error) {\n return handleError(error, 'error listing active controller runs');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREADS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: listThreadsQuerySchema,\n responseSchema: listThreadsResponseSchema,\n summary: 'List session threads',\n description:\n 'Lists the threads for the session\\u2019s resource, most-recently-updated first. Pass `limit` to return only the newest N (e.g. for a sidebar). Pass `tags` (a JSON-encoded object) to scope the list to threads matching every tag \\u2014 e.g. `{ projectPath }` so git worktrees sharing a resourceId each see only their own threads.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, limit, tags }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. `createSession` triggers workspace/sandbox initialization\n // (5–17s stall, cost per provisioned sandbox) as a side effect — reads\n // shouldn't pay that. Session creation happens on the write path.\n // `queryThreads` lazily initializes storage (not workspace) on its own.\n const threads = await controller.queryThreads({ resourceId });\n // A thread's metadata mixes the session scoping tags (stamped at creation,\n // e.g. `projectPath`) with internal session bookkeeping that\n // `Session.loadMetadata()` reads back (selected model/mode, observer/\n // reflector config, token usage). Return only the string-valued scoping\n // tags, skipping reserved internal keys so they never leak out as \"tags\"\n // or become matchable via the `tags` filter.\n const getTags = (t: { metadata?: unknown }): Record<string, string> => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (typeof value === 'string' && !isReservedThreadMetadataKey(key)) result[key] = value;\n }\n return result;\n };\n // A single resourceId can be shared across git worktrees of the same repo\n // (the id is derived from the git URL). When tags are supplied, scope to\n // threads whose metadata matches every tag and drop the rest, so worktree A\n // never shows worktree B's threads. Mirrors the controller's tag-aware\n // selection and the TUI's worktree-strict listing. Reserved internal keys\n // are ignored as filter tags so callers can't match on session bookkeeping.\n const tagEntries = tags ? Object.entries(tags).filter(([key]) => !isReservedThreadMetadataKey(key)) : [];\n const scoped =\n tagEntries.length > 0\n ? threads.filter(t => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n return tagEntries.every(([key, value]) => metadata[key] === value);\n })\n : threads;\n const toTime = (t: { updatedAt?: Date; createdAt?: Date }) => (t.updatedAt ?? t.createdAt)?.getTime() ?? 0;\n const sorted = [...scoped].sort((a, b) => toTime(b) - toTime(a));\n const max = Number(limit);\n const limited = Number.isFinite(max) && max > 0 ? sorted.slice(0, max) : sorted;\n // Thread run state comes from the controller-wide active-run registry,\n // which unions per-agent active thread runs across all backing agents.\n // Keyed by resourceId + threadId so it covers runs started by any session\n // on this resource — including sessions scoped to other git worktrees.\n // Using this controller-level accessor (rather than resolving an agent\n // via a Session) keeps the read path free of session/workspace\n // side-effects.\n const activeThreadIds = new Set(\n controller\n .listActiveThreadRuns()\n .filter(r => r.resourceId === resourceId)\n .map(r => r.threadId),\n );\n return {\n threads: limited.map(t => {\n const threadTags = getTags(t);\n return {\n id: t.id,\n title: t.title,\n tags: Object.keys(threadTags).length > 0 ? threadTags : undefined,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : undefined,\n state: activeThreadIds.has(t.id) ? ('active' as const) : ('idle' as const),\n };\n }),\n };\n } catch (error) {\n return handleError(error, 'error listing controller threads');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_NOTIFICATION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/notifications',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendNotificationBodySchema,\n responseSchema: z.object({\n accepted: z.boolean(),\n notificationId: z.string().optional(),\n decision: z.string().optional(),\n runId: z.string().optional(),\n }),\n summary: 'Send a notification signal to a session',\n description:\n 'Delivers a notification to the session\\u2019s current agent/thread. The agent\\u2019s delivery policy determines whether the notification wakes an idle thread, is summarised, or is persisted for later.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes,\n metadata,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const result = await session.sendNotificationSignal({\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes: attributes as Record<string, string | number | boolean | null | undefined> | undefined,\n metadata,\n });\n return {\n accepted: result.accepted !== undefined,\n notificationId: result.record?.id,\n decision: result.decision?.action,\n runId: result.runId,\n };\n } catch (error) {\n return handleError(error, 'error sending controller notification');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Thread lifecycle\n// ---------------------------------------------------------------------------\n\nexport const CREATE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: createThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Create a new thread',\n description: 'Creates a new thread in the session (unbinds the previous thread, binds the new one).',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.create({ title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller thread');\n }\n },\n});\n\nexport const DELETE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Delete a thread',\n description: 'Deletes a thread. If the deleted thread is the active one, the session is unbound.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.thread.delete({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error deleting controller thread');\n }\n },\n});\n\nexport const RENAME_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: renameThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Rename a thread',\n description: 'Renames the specified thread.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Ensure the thread is the active one (switch if not)\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n await session.thread.rename({ title });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error renaming controller thread');\n }\n },\n});\n\nexport const CLONE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/clone',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: cloneThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Clone a thread',\n description: 'Clones a thread (and its messages). The session binds to the new clone.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, sourceThreadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.clone({ sourceThreadId, title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error cloning controller thread');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREAD_MESSAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId/messages',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: listMessagesQuerySchema,\n responseSchema: listMessagesResponseSchema,\n summary: 'List thread messages',\n description: 'Lists messages for a specific thread. Returns most recent messages first.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, threadId, limit }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. Session creation would trigger workspace/sandbox\n // initialization as a side effect; reads should never pay that cost.\n // The query methods lazily initialize storage (not workspace) on their own.\n // The route is authorized for the URL's resourceId, but `threadId` is\n // otherwise unscoped. Verify the thread belongs to this resource so a\n // caller can't peek at another resource's messages by guessing an id\n // — matches the check `session.thread.listMessages` performed via\n // `session.thread.set` before we bypassed session construction.\n const thread = await controller.queryThreadById({ threadId });\n if (!thread || thread.resourceId !== resourceId) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const messages = await controller.queryThreadMessages({ threadId, limit });\n return {\n messages: messages.map(m => ({\n id: m.id,\n role: m.role,\n content: m.content as { format: 2; parts: Array<{ type: string; [key: string]: unknown }> },\n createdAt: m.createdAt instanceof Date ? m.createdAt.toISOString() : undefined,\n threadId: m.threadId,\n resourceId: m.resourceId,\n type: m.type,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller thread messages');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Follow-up\n// ---------------------------------------------------------------------------\n\nexport const FOLLOW_UP_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/follow-up',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: followUpBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Queue a follow-up message',\n description:\n 'Queues a follow-up message. If the session is idle it sends immediately; if a run is active it queues for after completion.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.followUp({ content: message, requestContext }),\n session,\n mastra,\n operation: 'followUp',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error queuing controller follow-up');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Models\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLER_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/models',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModelsResponseSchema,\n summary: 'List available models',\n description: 'Lists all models available on this controller (with auth status and use counts).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n const models = await controller.listAvailableModels();\n return {\n models: models.map(m => ({\n id: m.id,\n provider: m.provider,\n modelName: m.modelName,\n hasApiKey: m.hasApiKey,\n useCount: m.useCount,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller models');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Workspace status\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_WORKSPACE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/workspace',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: workspaceStatusResponseSchema,\n summary: 'Get workspace status',\n description: 'Returns whether the controller has a workspace configured and whether it is ready.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n return {\n hasWorkspace: controller.hasWorkspace(),\n isReady: controller.isWorkspaceReady(),\n };\n } catch (error) {\n return handleError(error, 'error reading controller workspace status');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Observational Memory\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_OM_RECORD_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/om',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: omRecordResponseSchema,\n summary: 'Get observational memory record',\n description: 'Returns the current observational memory record for the session\\u2019s thread/resource.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const record = await controller.getObservationalMemoryRecord(session);\n return { record: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller OM record');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Resource identity\n// ---------------------------------------------------------------------------\n\nexport const SET_AGENT_CONTROLLER_RESOURCE_ID_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resource',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: z.object({ newResourceId: z.string() }),\n responseSchema: ackResponseSchema,\n summary: 'Change the session resource ID',\n description: 'Updates the session\\u2019s resource identity (e.g. when a user logs in).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, newResourceId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await controller.setResourceId(session, { resourceId: newResourceId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller resource ID');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_RESOURCE_IDS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resources',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: z.object({ resourceIds: z.array(z.string()) }),\n summary: 'Get known resource IDs',\n description: 'Lists the resource IDs known to this session (from threads).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const resourceIds = await controller.getKnownResourceIds(session);\n return { resourceIds };\n } catch (error) {\n return handleError(error, 'error listing controller resource IDs');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Goals\n// ---------------------------------------------------------------------------\n\nconst setGoalBodySchema = z.object({\n objective: z.string(),\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n});\nconst updateGoalBodySchema = z.object({\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n status: z.enum(['active', 'paused', 'done']).optional(),\n});\nconst goalRecordSchema = z.object({\n id: z.string().optional(),\n objective: z.string(),\n status: z.enum(['active', 'paused', 'done']),\n runsUsed: z.number(),\n maxRuns: z.number().optional(),\n judgeModelId: z.string().optional(),\n startedAt: z.number(),\n updatedAt: z.number(),\n pausedReason: z.string().optional(),\n});\nconst goalResponseSchema = z.object({ goal: goalRecordSchema.optional() });\n\nfunction getAgentForSession(controller: AgentController<any>, session: Session<any>): Agent {\n return controller.getCurrentAgent(session);\n}\n\nexport const GET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: goalResponseSchema,\n summary: 'Get the current goal',\n description: 'Returns the active/paused/done goal objective for the session\\u2019s thread, if any.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) return { goal: undefined };\n const agent = getAgentForSession(controller, session);\n const record = await agent.getObjective({ threadId });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller goal');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Set a goal',\n description:\n 'Sets a new objective for the session\\u2019s thread. The agent\\u2019s in-loop goal judge evaluates progress after each turn.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n objective,\n judgeModelId,\n maxRuns,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.setObjective(objective, {\n threadId,\n resourceId: session.identity.getResourceId(),\n ...(judgeModelId ? { judgeModelId } : {}),\n ...(maxRuns != null ? { maxRuns } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error setting controller goal');\n }\n },\n});\n\nexport const UPDATE_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: updateGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Update goal options',\n description: 'Updates the judge model, max runs, or status of the active goal. No-op when no goal is set.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n judgeModelId,\n maxRuns,\n status,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.updateObjectiveOptions({\n threadId,\n ...(judgeModelId !== undefined ? { judgeModelId } : {}),\n ...(maxRuns !== undefined ? { maxRuns } : {}),\n ...(status !== undefined ? { status } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error updating controller goal');\n }\n },\n});\n\nexport const CLEAR_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Clear the goal',\n description: 'Removes the active goal from the session\\u2019s thread.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n await agent.clearObjective({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error clearing controller goal');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Permissions\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_PERMISSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: permissionRulesResponseSchema,\n summary: 'Get permission rules',\n description: 'Returns the current permission rules (per-category and per-tool policies) for the session.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const rules = session.permissions.getRules();\n return {\n categories: rules.categories as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n tools: rules.tools as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n };\n } catch (error) {\n return handleError(error, 'error getting controller permissions');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_CATEGORY_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/category',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setCategoryPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a tool category',\n description: 'Sets the approval policy (allow/ask/deny) for all tools in a category.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, category, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForCategory({ category, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller category permission');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_TOOL_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/tool',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setToolPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a specific tool',\n description:\n 'Sets the approval policy (allow/ask/deny) for a specific tool by name. Per-tool overrides take precedence over category policies.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolName, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForTool({ toolName, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller tool permission');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Session State\n// ---------------------------------------------------------------------------\n\nconst setSessionStateBodySchema = z.object({ state: z.record(z.string(), z.unknown()) });\n\nexport const SET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/state',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setSessionStateBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set session state',\n description:\n 'Merges the provided key-value pairs into the session state. Existing keys not in the payload are preserved.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, state, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.state.set(state as Record<string, unknown>);\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller session state');\n }\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-controller.js","names":[],"sources":["../../../src/server/handlers/agent-controller.ts"],"sourcesContent":["import type { Agent } from '@mastra/core/agent';\nimport type {\n AgentController,\n AgentControllerDisplayState,\n AgentControllerEvent,\n ErrorCarryingAgentControllerEvent,\n JsonReadyAgentControllerEvent,\n ReservedThreadMetadataKey,\n Session,\n TokenUsage,\n WireDisplayState,\n} from '@mastra/core/agent-controller';\nimport type { RequestContext } from '@mastra/core/request-context';\n// Type-only import: erased at runtime, so this cannot crash against an older\n// @mastra/core that lacks the `./agent-controller` subpath export. Controller\n// resolution at runtime goes through mastra.getAgentController?.(), never a\n// value import.\nimport { z } from 'zod/v4';\n\nimport { HTTPException } from '../http-exception';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { handleError } from './error';\n\n/**\n * AgentController session routes.\n *\n * An AgentController registered on a Mastra instance (via\n * `new Mastra({ agentControllers })`) exposes its sessions over HTTP so\n * non-terminal clients — e.g. a browser-based MastraCode — can create sessions,\n * send messages, stream events, and drive run-control. Each route resolves its\n * target AgentController by id, then operates on a session bound to a\n * `resourceId` (get-or-create, so reconnects resume rather than fork the\n * conversation).\n */\n\n/**\n * Internal thread-metadata keys that `Session.loadMetadata()` reads back as\n * runtime bookkeeping (selected model/mode, observer/reflector config, token\n * usage). They share the flat thread `metadata` bag with user-provided session\n * scoping tags, so they must never be treated as tags here.\n *\n * Importing core's list as a value would exceed this package's peer-dependency\n * floor, so it is mirrored under `satisfies`: tsc rejects a missing or extra key.\n */\nconst RESERVED_THREAD_METADATA_KEYS = {\n currentModelId: true,\n currentModeId: true,\n observerModelId: true,\n reflectorModelId: true,\n observationThreshold: true,\n reflectionThreshold: true,\n tokenUsage: true,\n thinkingLevel: true,\n notifications: true,\n} satisfies Record<ReservedThreadMetadataKey, true>;\n\nfunction isReservedThreadMetadataKey(key: string): boolean {\n return Object.hasOwn(RESERVED_THREAD_METADATA_KEYS, key) || key.startsWith('modeModelId_');\n}\n\n/**\n * Resolves a controller by id via the canonical `mastra.getAgentController`\n * accessor, throwing a 404 if no controller is registered under that id.\n */\nfunction getAgentControllerOrThrow(\n mastra: {\n getAgentController?: (id: string) => AgentController<any> | undefined;\n },\n controllerId: string,\n): AgentController<any> {\n const controller = mastra.getAgentController?.(controllerId);\n if (!controller) {\n throw new HTTPException(404, { message: `agent controller \"${controllerId}\" not found` });\n }\n return controller;\n}\n\nasync function getSession(\n controller: AgentController<any>,\n resourceId: string,\n options?: { tags?: Record<string, string>; scope?: string; threadId?: string },\n requestContext?: RequestContext,\n): Promise<Session<any>> {\n await controller.init();\n const { tags, scope, threadId } = options ?? {};\n // Scoped sessions are independent sessions over the same resource (e.g. one\n // per git worktree), so qualify the stable session id with the scope to keep\n // their identities distinct as well. An exact thread binding doubles as the\n // stable session id when supplied.\n const id = threadId ?? (scope ? `${resourceId}::${scope}` : resourceId);\n return controller.createSession({ resourceId, id, ownerId: controller.id, tags, scope, threadId, requestContext });\n}\n\n/**\n * Acknowledges a session operation that keeps running after the response is\n * sent.\n *\n * The messages/steer/follow-up routes answer `{ ok: true }` as soon as the\n * message is handed to the session: the reply itself arrives on the session's\n * SSE stream, so the request must not block for the whole turn. Those session\n * methods can still reject — `sendMessage` deliberately rejects when signal\n * submission fails before a stream starts — and a bare `void promise` turns\n * that into an unhandled rejection, which terminates the process on Node's\n * default `--unhandled-rejections=throw`.\n *\n * Observing the promise keeps the immediate acknowledgement while logging the\n * failure and emitting an `error` event on the session, so a client streaming\n * the session is told the turn died instead of waiting for an `agent_end` that\n * will never come.\n */\nfunction ackBackgroundSessionWork({\n work,\n session,\n mastra,\n operation,\n}: {\n work: Promise<unknown>;\n session: Session<any>;\n mastra: { getLogger?: () => { error?: (message: string, context?: Record<string, unknown>) => void } | undefined };\n operation: string;\n}): void {\n void work.catch((error: unknown) => {\n const failure = error instanceof Error ? error : new Error(String(error));\n mastra.getLogger?.()?.error?.(`AgentController ${operation} failed after the request was acknowledged`, {\n operation,\n error: failure,\n });\n try {\n session.emit({ type: 'error', error: failure });\n } catch {\n // A session that can no longer accept events (e.g. torn down mid-flight)\n // must not turn a logged failure into a second unhandled rejection.\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Schemas\n// ---------------------------------------------------------------------------\n\nconst controllerIdPathParams = z.object({ controllerId: z.string() });\nconst sessionPathParams = z.object({ controllerId: z.string(), resourceId: z.string() });\n/**\n * Optional session scope (mirrors `AgentController.createSession`'s `scope`):\n * requests with the same resourceId but different scopes address independent\n * sessions (e.g. one per git worktree). Sent as a `sessionScope` query param\n * on session routes; named to avoid colliding with the model-switch `scope`.\n */\nconst sessionScopeQuerySchema = z.object({ sessionScope: z.string().optional() });\nconst sessionStateQuerySchema = sessionScopeQuerySchema.extend({ threadId: z.string().optional() });\n\nconst createSessionBodySchema = z.object({\n resourceId: z.string(),\n tags: z.record(z.string(), z.string()).optional(),\n threadId: z.string().optional(),\n sessionScope: z.string().optional(),\n});\n// Server-side attachment limits mirroring the web composer caps (10MB per\n// file, 20MB total), adjusted for base64 overhead (~4/3x).\nconst MAX_FILE_DATA_LENGTH = 14 * 1024 * 1024;\nconst MAX_TOTAL_FILE_DATA_LENGTH = 28 * 1024 * 1024;\n/**\n * Optional client-supplied request context, merged into the server-derived\n * request context by the adapter context middleware (reserved keys are\n * server-controlled). Declared on run-triggering body schemas so the OpenAPI\n * spec documents it.\n */\nconst bodyRequestContextSchema = z.record(z.string(), z.unknown()).optional();\n\nconst sendMessageBodySchema = z.object({\n message: z.string(),\n requestContext: bodyRequestContextSchema,\n // Optional attachments (e.g. pasted images). `data` is base64-encoded.\n files: z\n .array(\n z.object({\n data: z.string().max(MAX_FILE_DATA_LENGTH),\n mediaType: z.string(),\n filename: z.string().optional(),\n }),\n )\n .max(20)\n .refine(files => files.reduce((total, file) => total + file.data.length, 0) <= MAX_TOTAL_FILE_DATA_LENGTH, {\n message: 'Total attachment size exceeds limit',\n })\n .optional(),\n});\nconst steerBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\nconst toolApprovalBodySchema = z.object({\n toolCallId: z.string(),\n approved: z.boolean(),\n requestContext: bodyRequestContextSchema,\n});\nconst toolSuspensionBodySchema = z.object({\n toolCallId: z.string(),\n // Free-form resume payload. For ask_user this is a string (or string[] for\n // multi-select); for submit_plan it's `{ action, feedback? }`; for\n // request_access it's \"Yes\"/\"No\".\n resumeData: z.unknown(),\n requestContext: bodyRequestContextSchema,\n});\nconst switchModeBodySchema = z.object({ modeId: z.string() });\nconst switchModelBodySchema = z.object({\n modelId: z.string(),\n scope: z.enum(['global', 'thread']).optional(),\n modeId: z.string().optional(),\n});\nconst switchThreadBodySchema = z.object({ threadId: z.string() });\nconst createThreadBodySchema = z.object({ title: z.string().optional() });\nconst renameThreadBodySchema = z.object({ title: z.string() });\nconst threadPathParams = z.object({ controllerId: z.string(), resourceId: z.string(), threadId: z.string() });\nconst cloneThreadBodySchema = z.object({\n sourceThreadId: z.string().optional(),\n title: z.string().optional(),\n});\nconst listMessagesQuerySchema = z.object({ limit: z.coerce.number().optional(), sessionScope: z.string().optional() });\n/**\n * `tags` arrives as a JSON-encoded object in the query string (query params are\n * flat strings). It scopes the listing to threads whose metadata matches every\n * tag — e.g. `{ projectPath }` so git worktrees sharing a resourceId each see\n * only their own threads. Malformed JSON is treated as \"no filter\".\n */\nconst listThreadsQuerySchema = z.object({\n limit: z.coerce.number().optional(),\n sessionScope: z.string().optional(),\n tags: z\n .preprocess(value => {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n }, z.record(z.string(), z.string()).optional())\n .optional(),\n});\nconst followUpBodySchema = z.object({ message: z.string(), requestContext: bodyRequestContextSchema });\n\nconst sendNotificationBodySchema = z.object({\n source: z.string(),\n kind: z.string(),\n summary: z.string(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n payload: z.unknown().optional(),\n sourceId: z.string().optional(),\n dedupeKey: z.string().optional(),\n coalesceKey: z.string().optional(),\n attributes: z.record(z.string(), z.unknown()).optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst listAgentControllersResponseSchema = z.object({\n agentControllers: z.array(z.object({ id: z.string() })),\n});\nconst createSessionResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n});\nconst ackResponseSchema = z.object({ ok: z.boolean() });\n/**\n * Status-line relevant slice of the session's observational-memory progress.\n * Mirrors the TUI status line: `msg pending/threshold ↓removal` (the active\n * message window before an observation fires) and `mem observed/reflection\n * ↓savings` (accumulated observations before a reflection fires).\n */\nconst omProgressSummarySchema = z.object({\n status: z.string(),\n pendingTokens: z.number(),\n threshold: z.number(),\n thresholdPercent: z.number(),\n observationTokens: z.number(),\n reflectionThreshold: z.number(),\n reflectionThresholdPercent: z.number(),\n /** Tokens the next observation will remove from the message window. */\n projectedMessageRemoval: z.number(),\n /** Tokens the next reflection is projected to save. */\n projectedReflectionSavings: z.number(),\n});\nconst tokenUsageSchema = z.object({\n promptTokens: z.number(),\n completionTokens: z.number(),\n totalTokens: z.number(),\n reasoningTokens: z.number().optional(),\n cachedInputTokens: z.number().optional(),\n cacheCreationInputTokens: z.number().optional(),\n cacheCreationInputTokens5m: z.number().optional(),\n cacheCreationInputTokens1h: z.number().optional(),\n raw: z.unknown().optional(),\n}) satisfies z.ZodType<TokenUsage>;\nconst sessionSettingsSchema = z.object({\n yolo: z.boolean(),\n /** Session override only — absent when the session inherits a configured default. */\n thinkingLevel: z.enum(['off', 'low', 'medium', 'high', 'xhigh', 'max']).optional(),\n notifications: z.enum(['off', 'bell', 'system', 'both']),\n smartEditing: z.boolean(),\n});\nconst taskSnapshotSchema = z.object({\n id: z.string(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n});\ntype SessionTaskSnapshot = z.infer<typeof taskSnapshotSchema>;\nconst sessionStateResponseSchema = z.object({\n controllerId: z.string(),\n resourceId: z.string(),\n threadId: z.string().optional(),\n modeId: z.string(),\n modelId: z.string(),\n /** Whether the agent is currently executing a run (for initial UI hydration). */\n running: z.boolean().optional(),\n tasks: z.array(taskSnapshotSchema).optional(),\n omProgress: omProgressSummarySchema.optional(),\n tokenUsage: tokenUsageSchema.optional(),\n settings: sessionSettingsSchema.optional(),\n});\nconst listModesResponseSchema = z.object({\n modes: z.array(z.object({ id: z.string(), name: z.string().optional() })),\n});\nconst listThreadsResponseSchema = z.object({\n threads: z.array(\n z.object({\n id: z.string(),\n title: z.string().optional(),\n updatedAt: z.string().optional(),\n /** The session scoping tags stamped on this thread (e.g. `{ projectPath }`). */\n tags: z.record(z.string(), z.string()).optional(),\n /** Whether a run is currently executing on this thread ('active') or not ('idle'). */\n state: z.enum(['active', 'idle']).optional(),\n }),\n ),\n});\nconst threadResponseSchema = z.object({\n id: z.string(),\n title: z.string().optional(),\n resourceId: z.string().optional(),\n createdAt: z.string().optional(),\n updatedAt: z.string().optional(),\n});\nconst messagePartSchema = z\n .object({\n type: z.string(),\n })\n .passthrough();\n// Mirrors the persisted `MastraMessageContentV2` shape (AI-SDK-v4 `UIMessage`-style):\n// `format: 2` plus a nested `parts` array, with optional companion fields preserved.\nconst messageContentV2Schema = z\n .object({\n format: z.literal(2),\n parts: z.array(messagePartSchema),\n })\n .passthrough();\nconst listMessagesResponseSchema = z.object({\n messages: z.array(\n z.object({\n id: z.string(),\n role: z.enum(['user', 'assistant', 'system', 'tool', 'signal']),\n content: messageContentV2Schema,\n createdAt: z.string().optional(),\n threadId: z.string().optional(),\n resourceId: z.string().optional(),\n type: z.string().optional(),\n }),\n ),\n});\nconst listModelsResponseSchema = z.object({\n models: z.array(\n z.object({\n id: z.string(),\n provider: z.string(),\n modelName: z.string(),\n hasApiKey: z.boolean(),\n useCount: z.number(),\n }),\n ),\n});\nconst workspaceStatusResponseSchema = z.object({\n hasWorkspace: z.boolean(),\n isReady: z.boolean(),\n});\nconst omRecordResponseSchema = z.object({\n record: z.unknown().optional(),\n});\nconst permissionPolicyEnum = z.enum(['allow', 'ask', 'deny']);\nconst toolCategoryEnum = z.enum(['read', 'edit', 'execute', 'mcp', 'other']);\nconst permissionRulesResponseSchema = z.object({\n categories: z.record(z.string(), permissionPolicyEnum).optional(),\n tools: z.record(z.string(), permissionPolicyEnum).optional(),\n});\nconst setCategoryPermissionBodySchema = z.object({\n category: toolCategoryEnum,\n policy: permissionPolicyEnum,\n});\nconst setToolPermissionBodySchema = z.object({\n toolName: z.string(),\n policy: permissionPolicyEnum,\n});\n\n// ---------------------------------------------------------------------------\n// Routes\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLERS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller',\n responseType: 'json' as const,\n responseSchema: listAgentControllersResponseSchema,\n summary: 'List agent controllers',\n description: 'Lists the agent controllers hosted on this Mastra instance.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra }) => {\n try {\n const ids = new Set<string>();\n if (mastra.listAgentControllers) {\n for (const id of Object.keys(mastra.listAgentControllers())) ids.add(id);\n }\n return { agentControllers: Array.from(ids).map(id => ({ id })) };\n } catch (error) {\n return handleError(error, 'error listing agent controllers');\n }\n },\n});\n\nexport const CREATE_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n bodySchema: createSessionBodySchema,\n responseSchema: createSessionResponseSchema,\n summary: 'Create or resume a controller session',\n description:\n 'Creates a session for the given resourceId, or returns the existing one (get-or-create), so reconnects resume the conversation.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, tags, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { tags, scope: sessionScope, threadId }, requestContext);\n return {\n controllerId,\n resourceId,\n threadId: session.thread.getId() ?? undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller session');\n }\n },\n});\n\n/**\n * `display_state_changed` Maps JSON-serialize to `{}`. Snapshot the display state\n * before converting its Maps so queued wire events retain point-in-time state.\n */\nfunction toWireDisplayState(displayState: AgentControllerDisplayState): WireDisplayState {\n const snapshot = structuredClone(displayState);\n return {\n ...snapshot,\n activeTools: Object.fromEntries(snapshot.activeTools),\n toolInputBuffers: Object.fromEntries(snapshot.toolInputBuffers),\n pendingSuspensions: Object.fromEntries(snapshot.pendingSuspensions),\n activeSubagents: Object.fromEntries(snapshot.activeSubagents),\n modifiedFiles: Object.fromEntries(snapshot.modifiedFiles),\n };\n}\n\nfunction carriesError(event: AgentControllerEvent): event is ErrorCarryingAgentControllerEvent & { error: Error } {\n return 'error' in event && event.error instanceof Error;\n}\n\n/**\n * An `Error`'s `message`/`name` are non-enumerable, so flatten it before JSON\n * serialization. Streamed message events intentionally retain the controller's\n * live accumulated message; consumers requiring temporal isolation must copy or\n * serialize at their own ownership boundary.\n */\nfunction toWireEvent(event: AgentControllerEvent): JsonReadyAgentControllerEvent {\n if ('displayState' in event) {\n return { ...event, displayState: toWireDisplayState(event.displayState) };\n }\n if (carriesError(event)) {\n return { ...event, error: { name: event.error.name, message: event.error.message } };\n }\n return event;\n}\n\nexport const STREAM_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/stream',\n responseType: 'stream' as const,\n streamFormat: 'sse' as const,\n sseFlushOnConnect: true,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n summary: 'Stream controller session events',\n description: 'Subscribes to a session\\u2019s event bus and streams events to the client over SSE.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, abortSignal, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n\n let cleanedUp = false;\n let heartbeat: ReturnType<typeof setTimeout> | undefined;\n let unsubscribe: (() => void) | undefined;\n const clearHeartbeat = () => {\n if (heartbeat) {\n clearTimeout(heartbeat);\n heartbeat = undefined;\n }\n };\n const cleanup = (controller?: ReadableStreamDefaultController) => {\n if (cleanedUp) return;\n cleanedUp = true;\n clearHeartbeat();\n unsubscribe?.();\n if (controller) {\n try {\n controller.close();\n } catch {}\n }\n };\n\n // The stream yields raw event objects plus `:`-prefixed SSE comments\n // (heartbeats); the server adapter frames events and passes comments\n // through verbatim.\n return new ReadableStream<unknown>({\n start(controller) {\n const scheduleHeartbeat = () => {\n if (cleanedUp) return;\n clearHeartbeat();\n heartbeat = setTimeout(() => {\n heartbeat = undefined;\n if (cleanedUp) return;\n try {\n controller.enqueue(': heartbeat\\n\\n');\n } catch {\n cleanup();\n return;\n }\n scheduleHeartbeat();\n }, 25_000);\n };\n\n unsubscribe = session.subscribe(event => {\n if (cleanedUp) return;\n try {\n // Enqueue the raw event object. The server adapter is responsible\n // for SSE framing (`data: <json>\\n\\n`); enqueuing a pre-framed\n // string here would double-encode it.\n controller.enqueue(toWireEvent(event));\n scheduleHeartbeat();\n } catch {\n cleanup();\n }\n });\n\n const abortCleanup = () => cleanup(controller);\n abortSignal?.addEventListener('abort', abortCleanup, { once: true });\n scheduleHeartbeat();\n },\n cancel() {\n cleanup();\n },\n });\n } catch (error) {\n return handleError(error, 'error streaming controller session');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_MESSAGE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/messages',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendMessageBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Send a message to a controller session',\n description: 'Sends a user message to the session. The reply streams as events on the session\\u2019s SSE stream.',\n tags: ['AgentController', 'Streaming'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, files, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Forward the server middleware's requestContext so identity injected in\n // `server.middleware` reaches dynamic instructions and tools (same as the\n // plain agent message route).\n ackBackgroundSessionWork({\n work: session.sendMessage({ content: message, files, requestContext }),\n session,\n mastra,\n operation: 'sendMessage',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error sending controller message');\n }\n },\n});\n\nexport const ABORT_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/abort',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Abort a controller session run',\n description: 'Aborts the in-flight run for the session, if any.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n session.abort();\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error aborting controller session');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_APPROVAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-approval',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolApprovalBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a controller tool approval',\n description: 'Approves or declines a pending tool call surfaced by the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, approved, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Resolve the parked approval gate so the session's own run loop drives the\n // continuation and emits its events to subscribers (the open SSE stream).\n // Calling approveToolCall/declineToolCall directly would bypass the gate,\n // leaving the run loop hung and duplicating the resumed stream.\n // Pass toolCallId so a stale request cannot resolve a different pending gate.\n session.respondToToolApproval({ toolCallId, decision: approved ? 'approve' : 'decline', requestContext });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool approval');\n }\n },\n});\n\nexport const AGENT_CONTROLLER_TOOL_SUSPENSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/tool-suspension',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: toolSuspensionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Respond to a suspended controller tool',\n description:\n 'Resumes a suspended interactive tool (ask_user, request_access, submit_plan) with the provided resume data.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolCallId, resumeData, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // A resumed tool drives the run to its next terminal or suspension boundary.\n // Awaiting it holds this request open until the continuation finishes, which\n // can trip the request timeout and leave CORS mutating an already-sent response.\n ackBackgroundSessionWork({\n work: session.respondToToolSuspension({ toolCallId, resumeData, requestContext }),\n session,\n mastra,\n operation: 'respondToToolSuspension',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error responding to controller tool suspension');\n }\n },\n});\n\nexport const STEER_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/steer',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: steerBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Steer the in-flight run',\n description: 'Injects a message into the running turn (interjection) without starting a new run.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.steer({ content: message, requestContext }),\n session,\n mastra,\n operation: 'steer',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error steering controller session');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODE_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/mode',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModeBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session mode',\n description: 'Switches the active mode (e.g. build, plan) for the session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.mode.switch({ modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller mode');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_MODEL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/model',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchModelBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session model',\n description: 'Switches the model for the session, scoped to the thread by default.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, modelId, scope, modeId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.model.switch({ modelId, scope, modeId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller model');\n }\n },\n});\n\nexport const SWITCH_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/thread',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: switchThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Switch the session thread',\n description: 'Switches the session to an existing thread (rebinding its stream and state).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error switching controller thread');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionStateQuerySchema,\n responseSchema: sessionStateResponseSchema,\n summary: 'Get session state',\n description: 'Returns the current mode, model, thread, and durable tasks for initial UI hydration.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId: requestedThreadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const ds = session.displayState.get();\n const threadId = requestedThreadId ?? session.thread.getId() ?? undefined;\n const storage = mastra.getStorage();\n if (requestedThreadId) {\n const memory = await storage?.getStore('memory');\n const thread = await memory?.getThreadById({ threadId: requestedThreadId, resourceId });\n if (!thread) throw new HTTPException(404, { message: `thread \"${requestedThreadId}\" not found` });\n }\n const threadState = threadId ? await storage?.getStore('threadState') : undefined;\n const storedTasks = threadId ? await threadState?.getState<unknown>({ threadId, type: 'task' }) : undefined;\n const parsedTasks = taskSnapshotSchema.array().safeParse(storedTasks);\n const tasks: SessionTaskSnapshot[] = parsedTasks.success ? parsedTasks.data : [];\n const om = ds.omProgress;\n const reflectionSavings =\n om.buffered.reflection.inputObservationTokens - om.buffered.reflection.observationTokens;\n const st = session.state.get() as Record<string, unknown>;\n const oneOf = <T extends string>(value: unknown, allowed: readonly T[], fallback: T): T =>\n allowed.includes(value as T) ? (value as T) : fallback;\n const oneOfOptional = <T extends string>(value: unknown, allowed: readonly T[]): T | undefined =>\n allowed.includes(value as T) ? (value as T) : undefined;\n return {\n controllerId,\n resourceId,\n threadId,\n modeId: session.mode.get(),\n modelId: session.model.get(),\n running: ds.isRunning === true,\n tasks,\n omProgress: {\n status: om.status,\n pendingTokens: om.pendingTokens,\n threshold: om.threshold,\n thresholdPercent: om.thresholdPercent,\n observationTokens: om.observationTokens,\n reflectionThreshold: om.reflectionThreshold,\n reflectionThresholdPercent: om.reflectionThresholdPercent,\n projectedMessageRemoval: om.buffered.observations.projectedMessageRemoval,\n projectedReflectionSavings: reflectionSavings > 0 ? reflectionSavings : 0,\n },\n tokenUsage: ds.tokenUsage,\n settings: {\n yolo: st.yolo === true,\n // No session override → omit, so clients don't mistake an inherited\n // configured default (resolved at request time) for an explicit 'off'.\n thinkingLevel: oneOfOptional(st.thinkingLevel, ['off', 'low', 'medium', 'high', 'xhigh', 'max'] as const),\n notifications: oneOf(st.notifications, ['off', 'bell', 'system', 'both'] as const, 'off'),\n smartEditing: st.smartEditing !== false,\n },\n };\n } catch (error) {\n return handleError(error, 'error reading controller session state');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_MODES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/modes',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModesResponseSchema,\n summary: 'List controller modes',\n description: 'Lists the modes configured on the controller (e.g. build, plan).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return {\n modes: controller.listModes().map(mode => ({ id: mode.id, name: mode.name })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller modes');\n }\n },\n});\n\nconst listActiveRunsResponseSchema = z.object({\n runs: z.array(\n z.object({\n runId: z.string(),\n resourceId: z.string().optional(),\n threadId: z.string(),\n }),\n ),\n});\n\nexport const LIST_AGENT_CONTROLLER_ACTIVE_RUNS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/active-runs',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listActiveRunsResponseSchema,\n summary: 'List active controller runs',\n description:\n 'Lists the runs in flight on the controller across all resources, without creating or touching a session.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n return { runs: controller.listActiveThreadRuns() };\n } catch (error) {\n return handleError(error, 'error listing active controller runs');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREADS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: listThreadsQuerySchema,\n responseSchema: listThreadsResponseSchema,\n summary: 'List session threads',\n description:\n 'Lists the threads for the session\\u2019s resource, most-recently-updated first. Pass `limit` to return only the newest N (e.g. for a sidebar). Pass `tags` (a JSON-encoded object) to scope the list to threads matching every tag \\u2014 e.g. `{ projectPath }` so git worktrees sharing a resourceId each see only their own threads.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, limit, tags }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. `createSession` triggers workspace/sandbox initialization\n // (5–17s stall, cost per provisioned sandbox) as a side effect — reads\n // shouldn't pay that. Session creation happens on the write path.\n // `queryThreads` lazily initializes storage (not workspace) on its own.\n const threads = await controller.queryThreads({ resourceId });\n // A thread's metadata mixes the session scoping tags (stamped at creation,\n // e.g. `projectPath`) with internal session bookkeeping that\n // `Session.loadMetadata()` reads back (selected model/mode, observer/\n // reflector config, token usage). Return only the string-valued scoping\n // tags, skipping reserved internal keys so they never leak out as \"tags\"\n // or become matchable via the `tags` filter.\n const getTags = (t: { metadata?: unknown }): Record<string, string> => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(metadata)) {\n if (typeof value === 'string' && !isReservedThreadMetadataKey(key)) result[key] = value;\n }\n return result;\n };\n // A single resourceId can be shared across git worktrees of the same repo\n // (the id is derived from the git URL). When tags are supplied, scope to\n // threads whose metadata matches every tag and drop the rest, so worktree A\n // never shows worktree B's threads. Mirrors the controller's tag-aware\n // selection and the TUI's worktree-strict listing. Reserved internal keys\n // are ignored as filter tags so callers can't match on session bookkeeping.\n const tagEntries = tags ? Object.entries(tags).filter(([key]) => !isReservedThreadMetadataKey(key)) : [];\n const scoped =\n tagEntries.length > 0\n ? threads.filter(t => {\n const metadata = (t.metadata as Record<string, unknown> | undefined) ?? {};\n return tagEntries.every(([key, value]) => metadata[key] === value);\n })\n : threads;\n const toTime = (t: { updatedAt?: Date; createdAt?: Date }) => (t.updatedAt ?? t.createdAt)?.getTime() ?? 0;\n const sorted = [...scoped].sort((a, b) => toTime(b) - toTime(a));\n const max = Number(limit);\n const limited = Number.isFinite(max) && max > 0 ? sorted.slice(0, max) : sorted;\n // Thread run state comes from the controller-wide active-run registry,\n // which unions per-agent active thread runs across all backing agents.\n // Keyed by resourceId + threadId so it covers runs started by any session\n // on this resource — including sessions scoped to other git worktrees.\n // Using this controller-level accessor (rather than resolving an agent\n // via a Session) keeps the read path free of session/workspace\n // side-effects.\n const activeThreadIds = new Set(\n controller\n .listActiveThreadRuns()\n .filter(r => r.resourceId === resourceId)\n .map(r => r.threadId),\n );\n return {\n threads: limited.map(t => {\n const threadTags = getTags(t);\n return {\n id: t.id,\n title: t.title,\n tags: Object.keys(threadTags).length > 0 ? threadTags : undefined,\n updatedAt: t.updatedAt instanceof Date ? t.updatedAt.toISOString() : undefined,\n state: activeThreadIds.has(t.id) ? ('active' as const) : ('idle' as const),\n };\n }),\n };\n } catch (error) {\n return handleError(error, 'error listing controller threads');\n }\n },\n});\n\nexport const SEND_AGENT_CONTROLLER_NOTIFICATION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/notifications',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: sendNotificationBodySchema,\n responseSchema: z.object({\n accepted: z.boolean(),\n notificationId: z.string().optional(),\n decision: z.string().optional(),\n runId: z.string().optional(),\n }),\n summary: 'Send a notification signal to a session',\n description:\n 'Delivers a notification to the session\\u2019s current agent/thread. The agent\\u2019s delivery policy determines whether the notification wakes an idle thread, is summarised, or is persisted for later.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes,\n metadata,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const result = await session.sendNotificationSignal({\n source,\n kind,\n summary,\n priority,\n payload,\n sourceId,\n dedupeKey,\n coalesceKey,\n attributes: attributes as Record<string, string | number | boolean | null | undefined> | undefined,\n metadata,\n });\n return {\n accepted: result.accepted !== undefined,\n notificationId: result.record?.id,\n decision: result.decision?.action,\n runId: result.runId,\n };\n } catch (error) {\n return handleError(error, 'error sending controller notification');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Thread lifecycle\n// ---------------------------------------------------------------------------\n\nexport const CREATE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: createThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Create a new thread',\n description: 'Creates a new thread in the session (unbinds the previous thread, binds the new one).',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.create({ title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error creating controller thread');\n }\n },\n});\n\nexport const DELETE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Delete a thread',\n description: 'Deletes a thread. If the deleted thread is the active one, the session is unbound.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.thread.delete({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error deleting controller thread');\n }\n },\n});\n\nexport const RENAME_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: renameThreadBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Rename a thread',\n description: 'Renames the specified thread.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, threadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n // Ensure the thread is the active one (switch if not)\n if (session.thread.getId() !== threadId) {\n await session.thread.switch({ threadId });\n }\n await session.thread.rename({ title });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error renaming controller thread');\n }\n },\n});\n\nexport const CLONE_AGENT_CONTROLLER_THREAD_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/clone',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: cloneThreadBodySchema,\n responseSchema: threadResponseSchema,\n summary: 'Clone a thread',\n description: 'Clones a thread (and its messages). The session binds to the new clone.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, sourceThreadId, title, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const thread = await session.thread.clone({ sourceThreadId, title });\n return {\n id: thread.id,\n title: thread.title,\n resourceId: thread.resourceId,\n createdAt: thread.createdAt instanceof Date ? thread.createdAt.toISOString() : undefined,\n updatedAt: thread.updatedAt instanceof Date ? thread.updatedAt.toISOString() : undefined,\n };\n } catch (error) {\n return handleError(error, 'error cloning controller thread');\n }\n },\n});\n\nexport const LIST_AGENT_CONTROLLER_THREAD_MESSAGES_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/threads/:threadId/messages',\n responseType: 'json' as const,\n pathParamSchema: threadPathParams,\n queryParamSchema: listMessagesQuerySchema,\n responseSchema: listMessagesResponseSchema,\n summary: 'List thread messages',\n description: 'Lists messages for a specific thread. Returns most recent messages first.',\n tags: ['AgentController', 'Threads'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, threadId, limit }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n // Read-only route: query storage directly instead of constructing a\n // Session. Session creation would trigger workspace/sandbox\n // initialization as a side effect; reads should never pay that cost.\n // The query methods lazily initialize storage (not workspace) on their own.\n // The route is authorized for the URL's resourceId, but `threadId` is\n // otherwise unscoped. Verify the thread belongs to this resource so a\n // caller can't peek at another resource's messages by guessing an id\n // — matches the check `session.thread.listMessages` performed via\n // `session.thread.set` before we bypassed session construction.\n const thread = await controller.queryThreadById({ threadId });\n if (!thread || thread.resourceId !== resourceId) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const messages = await controller.queryThreadMessages({ threadId, limit });\n return {\n messages: messages.map(m => ({\n id: m.id,\n role: m.role,\n content: m.content as { format: 2; parts: Array<{ type: string; [key: string]: unknown }> },\n createdAt: m.createdAt instanceof Date ? m.createdAt.toISOString() : undefined,\n threadId: m.threadId,\n resourceId: m.resourceId,\n type: m.type,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller thread messages');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Follow-up\n// ---------------------------------------------------------------------------\n\nexport const FOLLOW_UP_AGENT_CONTROLLER_SESSION_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/follow-up',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: followUpBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Queue a follow-up message',\n description:\n 'Queues a follow-up message. If the session is idle it sends immediately; if a run is active it queues for after completion.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, message, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n ackBackgroundSessionWork({\n work: session.followUp({ content: message, requestContext }),\n session,\n mastra,\n operation: 'followUp',\n });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error queuing controller follow-up');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Models\n// ---------------------------------------------------------------------------\n\nexport const LIST_AGENT_CONTROLLER_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/models',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: listModelsResponseSchema,\n summary: 'List available models',\n description: 'Lists all models available on this controller (with auth status and use counts).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n const models = await controller.listAvailableModels();\n return {\n models: models.map(m => ({\n id: m.id,\n provider: m.provider,\n modelName: m.modelName,\n hasApiKey: m.hasApiKey,\n useCount: m.useCount,\n })),\n };\n } catch (error) {\n return handleError(error, 'error listing controller models');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Workspace status\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_WORKSPACE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/workspace',\n responseType: 'json' as const,\n pathParamSchema: controllerIdPathParams,\n responseSchema: workspaceStatusResponseSchema,\n summary: 'Get workspace status',\n description: 'Returns whether the controller has a workspace configured and whether it is ready.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n await controller.init();\n return {\n hasWorkspace: controller.hasWorkspace(),\n isReady: controller.isWorkspaceReady(),\n };\n } catch (error) {\n return handleError(error, 'error reading controller workspace status');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Observational Memory\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_OM_RECORD_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/om',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: omRecordResponseSchema,\n summary: 'Get observational memory record',\n description: 'Returns the current observational memory record for the session\\u2019s thread/resource.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const record = await controller.getObservationalMemoryRecord(session);\n return { record: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller OM record');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Resource identity\n// ---------------------------------------------------------------------------\n\nexport const SET_AGENT_CONTROLLER_RESOURCE_ID_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resource',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: z.object({ newResourceId: z.string() }),\n responseSchema: ackResponseSchema,\n summary: 'Change the session resource ID',\n description: 'Updates the session\\u2019s resource identity (e.g. when a user logs in).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, newResourceId, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await controller.setResourceId(session, { resourceId: newResourceId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller resource ID');\n }\n },\n});\n\nexport const GET_AGENT_CONTROLLER_RESOURCE_IDS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/resources',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: z.object({ resourceIds: z.array(z.string()) }),\n summary: 'Get known resource IDs',\n description: 'Lists the resource IDs known to this session (from threads).',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const resourceIds = await controller.getKnownResourceIds(session);\n return { resourceIds };\n } catch (error) {\n return handleError(error, 'error listing controller resource IDs');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Goals\n// ---------------------------------------------------------------------------\n\nconst setGoalBodySchema = z.object({\n objective: z.string(),\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n});\nconst updateGoalBodySchema = z.object({\n judgeModelId: z.string().optional(),\n maxRuns: z.number().optional(),\n status: z.enum(['active', 'paused', 'done']).optional(),\n});\nconst goalRecordSchema = z.object({\n id: z.string().optional(),\n objective: z.string(),\n status: z.enum(['active', 'paused', 'done']),\n runsUsed: z.number(),\n maxRuns: z.number().optional(),\n judgeModelId: z.string().optional(),\n startedAt: z.number(),\n updatedAt: z.number(),\n pausedReason: z.string().optional(),\n});\nconst goalResponseSchema = z.object({ goal: goalRecordSchema.optional() });\n\nfunction getAgentForSession(controller: AgentController<any>, session: Session<any>): Agent {\n return controller.getCurrentAgent(session);\n}\n\nexport const GET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: goalResponseSchema,\n summary: 'Get the current goal',\n description: 'Returns the active/paused/done goal objective for the session\\u2019s thread, if any.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) return { goal: undefined };\n const agent = getAgentForSession(controller, session);\n const record = await agent.getObjective({ threadId });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error reading controller goal');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'POST',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Set a goal',\n description:\n 'Sets a new objective for the session\\u2019s thread. The agent\\u2019s in-loop goal judge evaluates progress after each turn.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n objective,\n judgeModelId,\n maxRuns,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.setObjective(objective, {\n threadId,\n resourceId: session.identity.getResourceId(),\n ...(judgeModelId ? { judgeModelId } : {}),\n ...(maxRuns != null ? { maxRuns } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error setting controller goal');\n }\n },\n});\n\nexport const UPDATE_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: updateGoalBodySchema,\n responseSchema: goalResponseSchema,\n summary: 'Update goal options',\n description: 'Updates the judge model, max runs, or status of the active goal. No-op when no goal is set.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({\n mastra,\n controllerId,\n resourceId,\n sessionScope,\n judgeModelId,\n maxRuns,\n status,\n requestContext,\n }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n const record = await agent.updateObjectiveOptions({\n threadId,\n ...(judgeModelId !== undefined ? { judgeModelId } : {}),\n ...(maxRuns !== undefined ? { maxRuns } : {}),\n ...(status !== undefined ? { status } : {}),\n });\n return { goal: record ?? undefined };\n } catch (error) {\n return handleError(error, 'error updating controller goal');\n }\n },\n});\n\nexport const CLEAR_AGENT_CONTROLLER_GOAL_ROUTE = createRoute({\n method: 'DELETE',\n path: '/agent-controller/:controllerId/sessions/:resourceId/goal',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: ackResponseSchema,\n summary: 'Clear the goal',\n description: 'Removes the active goal from the session\\u2019s thread.',\n tags: ['AgentController', 'Goals'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const threadId = session.thread.getId();\n if (!threadId) throw new HTTPException(400, { message: 'session has no active thread' });\n const agent = getAgentForSession(controller, session);\n await agent.clearObjective({ threadId });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error clearing controller goal');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Permissions\n// ---------------------------------------------------------------------------\n\nexport const GET_AGENT_CONTROLLER_PERMISSIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n responseSchema: permissionRulesResponseSchema,\n summary: 'Get permission rules',\n description: 'Returns the current permission rules (per-category and per-tool policies) for the session.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:read',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n const rules = session.permissions.getRules();\n return {\n categories: rules.categories as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n tools: rules.tools as Record<string, 'allow' | 'ask' | 'deny'> | undefined,\n };\n } catch (error) {\n return handleError(error, 'error getting controller permissions');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_CATEGORY_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/category',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setCategoryPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a tool category',\n description: 'Sets the approval policy (allow/ask/deny) for all tools in a category.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, category, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForCategory({ category, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller category permission');\n }\n },\n});\n\nexport const SET_AGENT_CONTROLLER_TOOL_PERMISSION_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/permissions/tool',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setToolPermissionBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set permission for a specific tool',\n description:\n 'Sets the approval policy (allow/ask/deny) for a specific tool by name. Per-tool overrides take precedence over category policies.',\n tags: ['AgentController', 'Permissions'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, toolName, policy, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.permissions.setForTool({ toolName, policy });\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller tool permission');\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Session State\n// ---------------------------------------------------------------------------\n\nconst setSessionStateBodySchema = z.object({ state: z.record(z.string(), z.unknown()) });\n\nexport const SET_AGENT_CONTROLLER_SESSION_STATE_ROUTE = createRoute({\n method: 'PUT',\n path: '/agent-controller/:controllerId/sessions/:resourceId/state',\n responseType: 'json' as const,\n pathParamSchema: sessionPathParams,\n queryParamSchema: sessionScopeQuerySchema,\n bodySchema: setSessionStateBodySchema,\n responseSchema: ackResponseSchema,\n summary: 'Set session state',\n description:\n 'Merges the provided key-value pairs into the session state. Existing keys not in the payload are preserved.',\n tags: ['AgentController'],\n requiresAuth: true,\n requiresPermission: 'agent-controller:execute',\n handler: async ({ mastra, controllerId, resourceId, sessionScope, state, requestContext }) => {\n try {\n const controller = getAgentControllerOrThrow(mastra, controllerId);\n const session = await getSession(controller, resourceId, { scope: sessionScope }, requestContext);\n await session.state.set(state as Record<string, unknown>);\n return { ok: true };\n } catch (error) {\n return handleError(error, 'error setting controller session state');\n }\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/server",
3
- "version": "1.63.3-alpha.0",
3
+ "version": "1.63.3-alpha.1",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "files": [
@@ -118,13 +118,13 @@
118
118
  "zod": "^4.4.3",
119
119
  "zod-to-ts": "^2.1.0",
120
120
  "@internal/core": "0.1.2",
121
- "@internal/lint": "0.0.129",
122
121
  "@internal/storage-test-utils": "0.0.125",
123
122
  "@internal/test-utils": "0.0.65",
123
+ "@internal/lint": "0.0.129",
124
124
  "@internal/types-builder": "0.0.104",
125
- "@internal/voice": "0.0.27",
126
125
  "@mastra/agent-builder": "1.1.15",
127
- "@mastra/core": "1.63.3-alpha.0",
126
+ "@internal/voice": "0.0.27",
127
+ "@mastra/core": "1.63.3-alpha.1",
128
128
  "@mastra/schema-compat": "1.3.7"
129
129
  },
130
130
  "homepage": "https://mastra.ai",