@mastra/server 1.72.0-alpha.0 → 1.72.0-alpha.2

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.
Files changed (89) hide show
  1. package/dist/{a2a-CwxSk6H0.cjs → a2a-CAQVpVxH.cjs} +23 -3
  2. package/dist/a2a-CAQVpVxH.cjs.map +1 -0
  3. package/dist/{a2a-DQOqoU_q.js → a2a-D2BffGsK.js} +23 -3
  4. package/dist/a2a-D2BffGsK.js.map +1 -0
  5. package/dist/{agent-builder-BGTZux5y.js → agent-builder-BlD120ac.js} +2 -2
  6. package/dist/{agent-builder-BGTZux5y.js.map → agent-builder-BlD120ac.js.map} +1 -1
  7. package/dist/{agent-builder-D-LAj4SD.cjs → agent-builder-CvwtAD7k.cjs} +2 -2
  8. package/dist/{agent-builder-D-LAj4SD.cjs.map → agent-builder-CvwtAD7k.cjs.map} +1 -1
  9. package/dist/{api-schema-manifest-DJiUahwo.js → api-schema-manifest-B2qMxAnr.js} +2 -2
  10. package/dist/{api-schema-manifest-DJiUahwo.js.map → api-schema-manifest-B2qMxAnr.js.map} +1 -1
  11. package/dist/{api-schema-manifest-Maxewnw7.cjs → api-schema-manifest-gLtuKcZT.cjs} +2 -2
  12. package/dist/{api-schema-manifest-Maxewnw7.cjs.map → api-schema-manifest-gLtuKcZT.cjs.map} +1 -1
  13. package/dist/{channels-DMw4LEA-.cjs → channels-DJkXEpTr.cjs} +18 -7
  14. package/dist/channels-DJkXEpTr.cjs.map +1 -0
  15. package/dist/{channels-xqChW6Vw.js → channels-DzaCNtXe.js} +18 -7
  16. package/dist/channels-DzaCNtXe.js.map +1 -0
  17. package/dist/docs/SKILL.md +1 -1
  18. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  19. package/dist/{editor-builder-BrkDnCEd.js → editor-builder-DJMAKDR5.js} +3 -2
  20. package/dist/editor-builder-DJMAKDR5.js.map +1 -0
  21. package/dist/{editor-builder-DIpISGSI.cjs → editor-builder-DrDs-t9i.cjs} +3 -2
  22. package/dist/editor-builder-DrDs-t9i.cjs.map +1 -0
  23. package/dist/route-builder-2yrD15TL.cjs.map +1 -1
  24. package/dist/route-builder-lBil8Cvo.js.map +1 -1
  25. package/dist/{routes-D6sAEgtj.js → routes-CNwYNwrs.js} +4 -4
  26. package/dist/{routes-D6sAEgtj.js.map → routes-CNwYNwrs.js.map} +1 -1
  27. package/dist/{routes-C9CmwhbC.cjs → routes-DEdytSu5.cjs} +4 -4
  28. package/dist/{routes-C9CmwhbC.cjs.map → routes-DEdytSu5.cjs.map} +1 -1
  29. package/dist/schema-e0VHpMt0-BS9KHnuT.cjs.map +1 -1
  30. package/dist/schema-e0VHpMt0-CvPvLS06.js.map +1 -1
  31. package/dist/server/handlers/a2a.cjs +1 -1
  32. package/dist/server/handlers/a2a.d.ts.map +1 -1
  33. package/dist/server/handlers/a2a.js +1 -1
  34. package/dist/server/handlers/agent-builder.cjs +2 -2
  35. package/dist/server/handlers/agent-builder.d.ts +4 -2
  36. package/dist/server/handlers/agent-builder.d.ts.map +1 -1
  37. package/dist/server/handlers/agent-builder.js +2 -2
  38. package/dist/server/handlers/channels.cjs +1 -1
  39. package/dist/server/handlers/channels.d.ts.map +1 -1
  40. package/dist/server/handlers/channels.js +1 -1
  41. package/dist/server/handlers/editor-builder.cjs +1 -1
  42. package/dist/server/handlers/editor-builder.d.ts.map +1 -1
  43. package/dist/server/handlers/editor-builder.js +1 -1
  44. package/dist/server/handlers/favorites-enrichment.cjs +1 -1
  45. package/dist/server/handlers/favorites-enrichment.js +1 -1
  46. package/dist/server/handlers/stored-agent-favorites.cjs +1 -1
  47. package/dist/server/handlers/stored-agent-favorites.js +1 -1
  48. package/dist/server/handlers/stored-agents.cjs +6 -3
  49. package/dist/server/handlers/stored-agents.cjs.map +1 -1
  50. package/dist/server/handlers/stored-agents.d.ts.map +1 -1
  51. package/dist/server/handlers/stored-agents.js +6 -3
  52. package/dist/server/handlers/stored-agents.js.map +1 -1
  53. package/dist/server/handlers/stored-skill-favorites.cjs +1 -1
  54. package/dist/server/handlers/stored-skill-favorites.js +1 -1
  55. package/dist/server/handlers/stored-skills.cjs +1 -1
  56. package/dist/server/handlers/stored-skills.js +1 -1
  57. package/dist/server/handlers/system.cjs +1 -1
  58. package/dist/server/handlers/system.js +1 -1
  59. package/dist/server/handlers/workflows.cjs +28 -4
  60. package/dist/server/handlers/workflows.cjs.map +1 -1
  61. package/dist/server/handlers/workflows.d.ts +5 -2
  62. package/dist/server/handlers/workflows.d.ts.map +1 -1
  63. package/dist/server/handlers/workflows.js +28 -4
  64. package/dist/server/handlers/workflows.js.map +1 -1
  65. package/dist/server/handlers.cjs +1 -1
  66. package/dist/server/handlers.js +1 -1
  67. package/dist/server/schemas/index.cjs +2 -2
  68. package/dist/server/schemas/index.js +2 -2
  69. package/dist/server/schemas/workflows.d.ts +2 -1
  70. package/dist/server/schemas/workflows.d.ts.map +1 -1
  71. package/dist/server/server-adapter/index.cjs +1 -1
  72. package/dist/server/server-adapter/index.js +1 -1
  73. package/dist/server/server-adapter/routes/agent-builder.d.ts +4 -2
  74. package/dist/server/server-adapter/routes/agent-builder.d.ts.map +1 -1
  75. package/dist/server/server-adapter/routes/workflows.d.ts +4 -2
  76. package/dist/server/server-adapter/routes/workflows.d.ts.map +1 -1
  77. package/dist/{workflows-CvJ4c4_p.js → workflows-BEdLrZQZ.js} +3 -2
  78. package/dist/workflows-BEdLrZQZ.js.map +1 -0
  79. package/dist/{workflows-Cv6MGw9d.cjs → workflows-BdoErlkd.cjs} +3 -2
  80. package/dist/workflows-BdoErlkd.cjs.map +1 -0
  81. package/package.json +7 -7
  82. package/dist/a2a-CwxSk6H0.cjs.map +0 -1
  83. package/dist/a2a-DQOqoU_q.js.map +0 -1
  84. package/dist/channels-DMw4LEA-.cjs.map +0 -1
  85. package/dist/channels-xqChW6Vw.js.map +0 -1
  86. package/dist/editor-builder-BrkDnCEd.js.map +0 -1
  87. package/dist/editor-builder-DIpISGSI.cjs.map +0 -1
  88. package/dist/workflows-Cv6MGw9d.cjs.map +0 -1
  89. package/dist/workflows-CvJ4c4_p.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"a2a-DQOqoU_q.js","names":["crypto","AgentCardCodec","defaultLookup","httpsRequest","httpRequest"],"sources":["../../../../../../setup-pnpm/node_modules/.bin/store/v11/links/@/canonicalize/1.0.8/8d710dcf19a48d178b2fc853e16c59951fde29eb27b6037da6c3f4dbb968b03d/node_modules/canonicalize/lib/canonicalize.js","../src/server/a2a/agent-card-signing.ts","../src/server/a2a/agent-card-v1.ts","../src/server/a2a/protocol.ts","../src/server/a2a/push-notification-sender.ts","../src/server/a2a/push-notification-store.ts","../src/server/a2a/task-state.ts","../src/server/a2a/tasks.ts","../src/server/handlers/a2a.ts"],"sourcesContent":["/* jshint esversion: 6 */\n/* jslint node: true */\n'use strict';\n\nmodule.exports = function serialize (object) {\n if (object === null || typeof object !== 'object' || object.toJSON != null) {\n return JSON.stringify(object);\n }\n\n if (Array.isArray(object)) {\n return '[' + object.reduce((t, cv, ci) => {\n const comma = ci === 0 ? '' : ',';\n const value = cv === undefined || typeof cv === 'symbol' ? null : cv;\n return t + comma + serialize(value);\n }, '') + ']';\n }\n\n return '{' + Object.keys(object).sort().reduce((t, cv, ci) => {\n if (object[cv] === undefined ||\n typeof object[cv] === 'symbol') {\n return t;\n }\n const comma = t.length === 0 ? '' : ',';\n return t + comma + serialize(cv) + ':' + serialize(object[cv]);\n }, '') + '}';\n};\n","import * as crypto from 'node:crypto';\nimport type { AgentCardSignature } from '@mastra/core/a2a';\nimport type { A2AAgentCardSigningConfig } from '@mastra/core/server';\nimport canonicalize from 'canonicalize';\n\nconst SUPPORTED_JWS_ALGORITHMS = new Set<string>([\n 'ES256',\n 'ES384',\n 'ES512',\n 'RS256',\n 'RS384',\n 'RS512',\n 'PS256',\n 'PS384',\n 'PS512',\n]);\n\nfunction stripAgentCardSignatures<T extends { signatures?: AgentCardSignature[] }>(agentCard: T): T {\n const unsignedCard = structuredClone(agentCard);\n delete unsignedCard.signatures;\n return unsignedCard;\n}\n\nfunction importSigningKey(signing: A2AAgentCardSigningConfig) {\n const { privateKey } = signing;\n\n if (typeof privateKey === 'string') {\n return crypto.createPrivateKey(privateKey);\n }\n\n return crypto.createPrivateKey({\n key: privateKey,\n format: 'jwk',\n });\n}\n\nfunction getProtectedHeader(signing: A2AAgentCardSigningConfig): Record<string, unknown> {\n const { alg, ...rest } = signing.protectedHeader;\n\n if (!SUPPORTED_JWS_ALGORITHMS.has(alg)) {\n throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${alg}`);\n }\n\n return {\n ...rest,\n alg,\n };\n}\n\ntype SignatureOptions = Pick<crypto.SignKeyObjectInput, 'dsaEncoding' | 'padding' | 'saltLength'>;\n\nfunction getSignatureOptions(algorithm: string): SignatureOptions {\n if (algorithm.startsWith('ES')) {\n return { dsaEncoding: 'ieee-p1363' as const };\n }\n\n if (algorithm.startsWith('PS')) {\n return {\n padding: crypto.constants.RSA_PKCS1_PSS_PADDING,\n saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST,\n };\n }\n\n return {};\n}\n\nfunction getDigestAlgorithm(algorithm: string): string {\n if (algorithm.endsWith('256')) return 'sha256';\n if (algorithm.endsWith('384')) return 'sha384';\n if (algorithm.endsWith('512')) return 'sha512';\n throw new Error(`Unsupported JWS algorithm for A2A Agent Card signing: ${algorithm}`);\n}\n\nexport async function signAgentCard<T extends { signatures?: AgentCardSignature[] }>({\n agentCard,\n signing,\n}: {\n agentCard: T;\n signing: A2AAgentCardSigningConfig;\n}): Promise<T & { signatures: AgentCardSignature[] }> {\n const canonicalPayload = canonicalize(stripAgentCardSignatures(agentCard));\n\n if (!canonicalPayload) {\n throw new Error('Failed to canonicalize A2A Agent Card for signing');\n }\n\n const key = importSigningKey(signing);\n const protectedHeader = getProtectedHeader(signing);\n const encodedHeader = Buffer.from(JSON.stringify(protectedHeader), 'utf8').toString('base64url');\n const encodedPayload = Buffer.from(canonicalPayload, 'utf8').toString('base64url');\n const signingInput = `${encodedHeader}.${encodedPayload}`;\n const signatureBuffer = crypto.sign(\n getDigestAlgorithm(String(protectedHeader.alg)),\n Buffer.from(signingInput, 'utf8'),\n {\n key,\n ...getSignatureOptions(String(protectedHeader.alg)),\n },\n );\n const signatureValue = signatureBuffer.toString('base64url');\n\n if (!encodedHeader || !signatureValue) {\n throw new Error('Failed to create compact JWS for A2A Agent Card');\n }\n\n const signature: AgentCardSignature = {\n protected: encodedHeader,\n signature: signatureValue,\n header: signing.header,\n };\n\n return {\n ...agentCard,\n signatures: [...(agentCard.signatures ?? []), signature],\n };\n}\n","import type { AgentCard } from '@mastra/core/a2a';\nimport { AgentCard as AgentCardCodec } from '@mastra/core/a2a/v1';\nimport type { z } from 'zod/v4';\nimport { agentCardV1ResponseSchema } from '../schemas/a2a';\n\nexport type AgentCardV1 = z.infer<typeof agentCardV1ResponseSchema>;\n\nexport function createV1AgentCard(legacyCard: AgentCard): AgentCardV1 {\n const card = AgentCardCodec.fromJSON({\n name: legacyCard.name,\n description: legacyCard.description,\n provider: legacyCard.provider,\n version: legacyCard.version,\n supportedInterfaces: ['0.3', '1.0'].map(protocolVersion => ({\n url: legacyCard.url,\n protocolBinding: 'JSONRPC',\n protocolVersion,\n })),\n capabilities: {\n streaming: legacyCard.capabilities.streaming,\n pushNotifications: legacyCard.capabilities.pushNotifications,\n extensions: legacyCard.capabilities.extensions,\n extendedAgentCard: legacyCard.supportsAuthenticatedExtendedCard,\n },\n defaultInputModes: legacyCard.defaultInputModes,\n defaultOutputModes: legacyCard.defaultOutputModes,\n skills: legacyCard.skills,\n });\n\n // The codec omits protobuf defaults. Sign this final wire representation, not the SDK object.\n return agentCardV1ResponseSchema.parse(AgentCardCodec.toJSON(card));\n}\n","import { MastraA2AError } from '@mastra/core/a2a';\n\nimport type { JSONRPCError, JSONRPCResponse, Message, Part } from '@mastra/core/a2a';\nimport type { CoreMessage } from '@mastra/core/llm';\nimport type { IMastraLogger } from '@mastra/core/logger';\n\nexport function normalizeError(\n error: any,\n reqId: number | string | null,\n taskId?: string,\n logger?: IMastraLogger,\n): JSONRPCResponse<null, unknown> {\n let a2aError: MastraA2AError;\n if (error instanceof MastraA2AError) {\n a2aError = error;\n } else if (error instanceof Error) {\n // Generic JS error\n a2aError = MastraA2AError.internalError(error.message, { stack: error.stack });\n } else {\n // Unknown error type\n a2aError = MastraA2AError.internalError('An unknown error occurred.', error);\n }\n\n // Ensure Task ID context is present if possible\n if (taskId && !a2aError.taskId) {\n a2aError.taskId = taskId;\n }\n\n logger?.error(`Error processing request (Task: ${a2aError.taskId ?? 'N/A'}, ReqID: ${reqId ?? 'N/A'}):`, a2aError);\n\n return createErrorResponse(reqId, a2aError.toJSONRPCError());\n}\n\nexport function createErrorResponse(\n id: number | string | null,\n error: JSONRPCError<unknown>,\n): JSONRPCResponse<null, unknown> {\n // For errors, ID should be the same as request ID, or null if that couldn't be determined\n return {\n jsonrpc: '2.0',\n id: id, // Can be null if request ID was invalid/missing\n error: error,\n };\n}\n\nexport function createSuccessResponse<T>(id: number | string | null, result: T): JSONRPCResponse<T> {\n if (id === null) {\n // This shouldn't happen for methods that expect a response, but safeguard\n throw MastraA2AError.internalError('Cannot create success response for null ID.');\n }\n\n return {\n jsonrpc: '2.0',\n id: id,\n result: result,\n };\n}\n\nexport function convertToCoreMessage(message: Message): CoreMessage {\n return {\n role: message.role === 'user' ? 'user' : 'assistant',\n content: message.parts.map(msg => convertToCoreMessagePart(msg)),\n };\n}\n\nfunction convertToCoreMessagePart(part: Part) {\n switch (part.kind) {\n case 'text':\n return {\n type: 'text',\n text: part.text,\n } as const;\n case 'file':\n return {\n type: 'file',\n data: 'uri' in part.file ? new URL(part.file.uri) : part.file.bytes,\n mimeType: part.file.mimeType!,\n } as const;\n case 'data':\n throw new Error('Data parts are not supported in core messages');\n }\n}\n","import { lookup as defaultLookup } from 'node:dns/promises';\nimport { request as httpRequest } from 'node:http';\nimport { request as httpsRequest } from 'node:https';\nimport { isIP } from 'node:net';\nimport type { Task } from '@mastra/core/a2a';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type { InMemoryPushNotificationStore } from './push-notification-store';\n\nexport const DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER = 'X-A2A-Notification-Token';\n\nfunction isDisallowedHostname(hostname: string) {\n const normalized = hostname.toLowerCase();\n\n return (\n normalized === 'localhost' ||\n normalized.endsWith('.localhost') ||\n normalized.endsWith('.local') ||\n normalized.endsWith('.internal') ||\n !normalized.includes('.')\n );\n}\n\nfunction isDisallowedIpv4(address: string) {\n const [first = -1, second = -1] = address.split('.').map(Number);\n\n return (\n first === 10 ||\n first === 127 ||\n (first === 169 && second === 254) ||\n (first === 172 && second >= 16 && second <= 31) ||\n (first === 192 && second === 168)\n );\n}\n\nfunction isDisallowedIpv6(address: string) {\n const normalized = address.toLowerCase();\n\n return (\n normalized === '::1' ||\n normalized.startsWith('fe8') ||\n normalized.startsWith('fe9') ||\n normalized.startsWith('fea') ||\n normalized.startsWith('feb') ||\n normalized.startsWith('fc') ||\n normalized.startsWith('fd')\n );\n}\n\nfunction isDisallowedIpAddress(address: string) {\n const version = isIP(address);\n if (version === 4) {\n return isDisallowedIpv4(address);\n }\n\n if (version === 6) {\n return isDisallowedIpv6(address);\n }\n\n return false;\n}\n\nexport class DefaultPushNotificationSender {\n constructor(\n private readonly pushNotificationStore: InMemoryPushNotificationStore,\n private readonly options: {\n timeout?: number;\n tokenHeaderName?: string;\n fetch?: typeof fetch;\n lookup?: typeof defaultLookup;\n allowedHosts?: string[];\n } = {},\n ) {}\n\n getStore() {\n return this.pushNotificationStore;\n }\n\n private async resolveValidatedDestination(rawUrl: string) {\n const url = new URL(rawUrl);\n\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error(`Push notification URL must use http or https: ${url.protocol}`);\n }\n\n const hostname = url.hostname.toLowerCase();\n if (this.options.allowedHosts && !this.options.allowedHosts.includes(hostname)) {\n throw new Error(`Push notification host is not allowed: ${hostname}`);\n }\n\n if (isDisallowedHostname(hostname)) {\n throw new Error(`Push notification URL must not target local or internal hosts: ${hostname}`);\n }\n\n if (isDisallowedIpAddress(hostname)) {\n throw new Error(`Push notification URL must not target local or private IPs: ${hostname}`);\n }\n\n const resolvedAddresses =\n isIP(hostname) === 0\n ? await (this.options.lookup ?? defaultLookup)(hostname, { all: true, verbatim: true })\n : [{ address: hostname, family: isIP(hostname) }];\n\n if (resolvedAddresses.some(result => isDisallowedIpAddress(result.address))) {\n throw new Error(`Push notification URL resolved to a local or private IP: ${hostname}`);\n }\n\n const requestUrl = new URL(url.toString());\n requestUrl.hostname = resolvedAddresses[0]!.address;\n\n return {\n originalUrl: url,\n requestUrl,\n hostHeader: url.host,\n servername: isIP(hostname) === 0 ? hostname : undefined,\n };\n }\n\n private async postTaskSnapshot({\n requestUrl,\n hostHeader,\n servername,\n headers,\n body,\n timeout,\n }: {\n requestUrl: URL;\n hostHeader: string;\n servername?: string;\n headers: Headers;\n body: string;\n timeout: number;\n }) {\n headers.set('host', hostHeader);\n const signal = typeof AbortSignal.timeout === 'function' ? AbortSignal.timeout(timeout) : undefined;\n\n if (this.options.fetch) {\n return this.options.fetch(requestUrl.toString(), {\n method: 'POST',\n headers,\n body,\n signal,\n });\n }\n\n const transport = requestUrl.protocol === 'https:' ? httpsRequest : httpRequest;\n\n return await new Promise<{ ok: boolean; status: number; statusText: string }>((resolve, reject) => {\n const request = transport(\n {\n protocol: requestUrl.protocol,\n hostname: requestUrl.hostname,\n port: requestUrl.port || undefined,\n path: `${requestUrl.pathname}${requestUrl.search}`,\n method: 'POST',\n headers: Object.fromEntries(headers.entries()),\n servername,\n },\n response => {\n response.resume();\n response.on('end', () => {\n resolve({\n ok: !!response.statusCode && response.statusCode >= 200 && response.statusCode < 300,\n status: response.statusCode ?? 0,\n statusText: response.statusMessage ?? '',\n });\n });\n },\n );\n\n request.on('error', reject);\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n request.destroy(signal.reason instanceof Error ? signal.reason : new Error('Push notification timed out'));\n },\n { once: true },\n );\n }\n\n request.end(body);\n });\n }\n\n async sendNotifications({\n agentId,\n task,\n logger,\n }: {\n agentId: string;\n task: Task;\n logger?: IMastraLogger;\n }): Promise<void> {\n const configs = this.pushNotificationStore.list({\n agentId,\n params: { id: task.id },\n });\n\n if (configs.length === 0) {\n return;\n }\n\n await Promise.allSettled(\n configs.map(async config => {\n const headers = new Headers({\n 'content-type': 'application/json',\n });\n\n if (config.pushNotificationConfig.token) {\n headers.set(\n this.options.tokenHeaderName ?? DEFAULT_PUSH_NOTIFICATION_TOKEN_HEADER,\n config.pushNotificationConfig.token,\n );\n }\n\n const auth = config.pushNotificationConfig.authentication;\n if (auth?.credentials) {\n if (auth.schemes.includes('Bearer')) {\n headers.set('authorization', `Bearer ${auth.credentials}`);\n } else if (auth.schemes.includes('Basic')) {\n headers.set('authorization', `Basic ${auth.credentials}`);\n }\n }\n\n const { requestUrl, hostHeader, servername } = await this.resolveValidatedDestination(\n config.pushNotificationConfig.url,\n );\n const response = await this.postTaskSnapshot({\n requestUrl,\n hostHeader,\n servername,\n headers,\n body: JSON.stringify(task),\n timeout: this.options.timeout ?? 5_000,\n });\n\n if (!response.ok) {\n throw new Error(\n `Push notification failed with status ${response.status} ${response.statusText ?? ''}`.trim(),\n );\n }\n }),\n ).then(results => {\n for (const result of results) {\n if (result.status === 'rejected') {\n logger?.error('Failed to deliver A2A push notification', result.reason);\n }\n }\n });\n }\n}\n","import type {\n DeleteTaskPushNotificationConfigParams,\n GetTaskPushNotificationConfigParams,\n ListTaskPushNotificationConfigParams,\n TaskPushNotificationConfig,\n} from '@mastra/core/a2a';\n\nfunction normalizeConfigId(taskId: string, configId?: string) {\n return configId || taskId;\n}\n\nexport class InMemoryPushNotificationStore {\n private store = new Map<string, Map<string, TaskPushNotificationConfig>>();\n\n private getKey(agentId: string, taskId: string) {\n return JSON.stringify([agentId, taskId]);\n }\n\n set({ agentId, config }: { agentId: string; config: TaskPushNotificationConfig }): TaskPushNotificationConfig {\n const key = this.getKey(agentId, config.taskId);\n const configs = this.store.get(key) ?? new Map<string, TaskPushNotificationConfig>();\n const normalizedConfig: TaskPushNotificationConfig = {\n taskId: config.taskId,\n pushNotificationConfig: {\n ...config.pushNotificationConfig,\n id: normalizeConfigId(config.taskId, config.pushNotificationConfig.id),\n },\n };\n\n configs.set(normalizedConfig.pushNotificationConfig.id!, structuredClone(normalizedConfig));\n this.store.set(key, configs);\n\n return structuredClone(normalizedConfig);\n }\n\n get({\n agentId,\n params,\n }: {\n agentId: string;\n params: GetTaskPushNotificationConfigParams;\n }): TaskPushNotificationConfig | null {\n const key = this.getKey(agentId, params.id);\n const configId = normalizeConfigId(params.id, params.pushNotificationConfigId);\n const config = this.store.get(key)?.get(configId);\n return config ? structuredClone(config) : null;\n }\n\n list({\n agentId,\n params,\n }: {\n agentId: string;\n params: ListTaskPushNotificationConfigParams;\n }): TaskPushNotificationConfig[] {\n const key = this.getKey(agentId, params.id);\n return Array.from(this.store.get(key)?.values() ?? []).map(config => structuredClone(config));\n }\n\n delete({ agentId, params }: { agentId: string; params: DeleteTaskPushNotificationConfigParams }): boolean {\n const key = this.getKey(agentId, params.id);\n const configs = this.store.get(key);\n\n if (!configs) {\n return false;\n }\n\n const deleted = configs.delete(params.pushNotificationConfigId);\n if (configs.size === 0) {\n this.store.delete(key);\n }\n\n return deleted;\n }\n}\n","import type { TaskState } from '@mastra/core/a2a';\n\nexport function isTerminalTaskState(state: TaskState | undefined): boolean {\n return state === 'completed' || state === 'failed' || state === 'canceled' || state === 'rejected';\n}\n\nexport function isInterruptedTaskState(state: TaskState | undefined): boolean {\n return state === 'input-required' || state === 'auth-required';\n}\n","import type { Message, Task, TaskStatus, TaskContext, TaskArtifactUpdateEvent, Artifact } from '@mastra/core/a2a';\nimport { MastraA2AError } from '@mastra/core/a2a';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, type RequestContext } from '@mastra/core/request-context';\nimport { TaskStoreVersionConflictError, type InMemoryTaskStore } from './store';\nimport { isTerminalTaskState } from './task-state';\n\nfunction isTaskStatusUpdate(update: TaskStatus | TaskArtifactUpdateEvent): update is Omit<TaskStatus, 'timestamp'> {\n return 'state' in update && !('parts' in update);\n}\n\nfunction isArtifactUpdate(update: TaskStatus | TaskArtifactUpdateEvent): update is TaskArtifactUpdateEvent {\n return 'kind' in update && update.kind === 'artifact-update';\n}\n\nexport function applyUpdateToTask(\n current: Task,\n update: Omit<TaskStatus, 'timestamp'> | TaskArtifactUpdateEvent,\n): Task {\n let newTask = structuredClone(current);\n\n if (isTaskStatusUpdate(update)) {\n // Merge status update\n newTask.status = {\n ...newTask.status, // Keep existing properties if not overwritten\n ...update, // Apply updates\n timestamp: new Date().toISOString(),\n };\n } else if (isArtifactUpdate(update)) {\n // Handle artifact update\n if (!newTask.artifacts) {\n newTask.artifacts = [];\n } else {\n // Ensure we're working with a copy of the artifacts array\n newTask.artifacts = [...newTask.artifacts];\n }\n\n const artifact = update.artifact;\n const existingIndex = newTask.artifacts.findIndex(a => a.name === artifact.name);\n const existingArtifact = newTask.artifacts[existingIndex];\n\n if (existingArtifact) {\n if (update.append) {\n // Create a deep copy for modification to avoid mutating original\n const appendedArtifact = JSON.parse(JSON.stringify(existingArtifact)) as Artifact;\n appendedArtifact.parts.push(...artifact.parts);\n if (artifact.metadata) {\n appendedArtifact.metadata = {\n ...(appendedArtifact.metadata || {}),\n ...artifact.metadata,\n };\n }\n if (artifact.description) appendedArtifact.description = artifact.description;\n newTask.artifacts[existingIndex] = appendedArtifact; // Replace with appended version\n } else {\n // Overwrite artifact at index (with a copy of the update)\n newTask.artifacts[existingIndex] = { ...artifact };\n }\n } else {\n newTask.artifacts.push({ ...artifact });\n }\n }\n\n return newTask;\n}\n\nfunction usableId(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nexport function resolveTaskMemory({\n task,\n agentId,\n requestContext,\n metadata,\n message,\n}: {\n task?: Task;\n agentId: string;\n requestContext?: RequestContext;\n metadata?: Record<string, unknown>;\n message?: Message;\n}) {\n const trustedResource = usableId(requestContext?.get(MASTRA_RESOURCE_ID_KEY));\n const trustedThread = usableId(requestContext?.get(MASTRA_THREAD_ID_KEY));\n const storedResource = usableId(task?.metadata?.resourceId);\n\n if (\n task &&\n ((trustedResource && storedResource && trustedResource !== storedResource) ||\n (trustedThread && trustedThread !== task.contextId))\n ) {\n throw MastraA2AError.invalidRequest('Task memory identity conflicts with the authenticated request.');\n }\n\n return {\n thread: task?.contextId ?? trustedThread ?? message?.contextId,\n resource: task\n ? (storedResource ?? trustedResource ?? agentId)\n : (trustedResource ?? usableId(metadata?.resourceId) ?? usableId(message?.metadata?.resourceId) ?? agentId),\n };\n}\n\nexport async function loadOrCreateTask({\n agentId,\n taskId,\n taskStore,\n message,\n contextId,\n metadata,\n logger,\n requestContext,\n}: {\n agentId: string;\n taskId: string;\n taskStore: InMemoryTaskStore;\n message: Message;\n contextId?: string;\n metadata?: Record<string, unknown>;\n logger?: IMastraLogger;\n requestContext?: RequestContext;\n}): Promise<Task> {\n for (let attempt = 0; attempt < 2; attempt++) {\n const snapshot = taskStore.loadWithVersion({ agentId, taskId });\n const data = snapshot?.task;\n const memory = resolveTaskMemory({ task: data, agentId, requestContext, metadata, message });\n\n if (!data) {\n const initialTask: Task = {\n id: taskId,\n contextId: memory.thread || contextId || crypto.randomUUID(),\n status: {\n state: 'submitted',\n timestamp: new Date().toISOString(),\n message: undefined,\n },\n artifacts: [],\n history: [message],\n metadata: { ...metadata, resourceId: memory.resource },\n kind: 'task',\n };\n\n logger?.info(`[Task ${taskId}] Created new task.`);\n try {\n await taskStore.save({ agentId, data: initialTask, expectedVersion: 0 });\n return initialTask;\n } catch (error) {\n if (error instanceof TaskStoreVersionConflictError) {\n continue;\n }\n throw error;\n }\n }\n\n logger?.info(`[Task ${taskId}] Loaded existing task.`);\n\n const { status } = data;\n if (isTerminalTaskState(status.state)) {\n throw MastraA2AError.invalidRequest(\n `Task ${taskId} is in terminal state ${status.state} and cannot be restarted.`,\n );\n }\n\n let updatedData: Task = {\n ...data,\n metadata: { ...data.metadata, resourceId: memory.resource },\n history: [...(data.history || []), message],\n };\n\n if (status.state === 'input-required' || status.state === 'auth-required') {\n logger?.info(`[Task ${taskId}] Changing state from '${status.state}' to 'working'.`);\n updatedData = applyUpdateToTask(updatedData, { state: 'working' });\n } else if (status.state === 'working') {\n logger?.warn(`[Task ${taskId}] Received message while already 'working'. Proceeding.`);\n }\n\n try {\n await taskStore.save({ agentId, data: updatedData, expectedVersion: snapshot.version });\n return updatedData;\n } catch (error) {\n if (error instanceof TaskStoreVersionConflictError) {\n continue;\n }\n throw error;\n }\n }\n\n throw MastraA2AError.invalidRequest(`Task ${taskId} was updated concurrently. Retry the request.`);\n}\n\nexport function createTaskContext({\n task,\n userMessage,\n history,\n activeCancellations,\n}: {\n task: Task;\n userMessage: Message;\n history: Message[];\n activeCancellations: Set<string>;\n}): TaskContext {\n return {\n task: structuredClone(task),\n userMessage,\n history: structuredClone(history),\n isCancelled: () => activeCancellations.has(task.id),\n };\n}\n","import { isDeepStrictEqual } from 'node:util';\nimport { MastraA2AError } from '@mastra/core/a2a';\nimport type {\n MessageSendParams,\n TaskQueryParams,\n TaskIdParams,\n AgentCard,\n TaskStatus,\n TaskState,\n Task,\n TaskPushNotificationConfig,\n GetTaskPushNotificationConfigParams,\n ListTaskPushNotificationConfigParams,\n DeleteTaskPushNotificationConfigParams,\n Artifact,\n} from '@mastra/core/a2a';\nimport type { Agent } from '@mastra/core/agent';\nimport type { IMastraLogger } from '@mastra/core/logger';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport { z } from 'zod/v4';\nimport { signAgentCard } from '../a2a/agent-card-signing';\nimport { createV1AgentCard, type AgentCardV1 } from '../a2a/agent-card-v1';\nimport { convertToCoreMessage, normalizeError, createSuccessResponse } from '../a2a/protocol';\nimport { DefaultPushNotificationSender } from '../a2a/push-notification-sender';\nimport { InMemoryPushNotificationStore } from '../a2a/push-notification-store';\nimport { TaskStoreVersionConflictError, type InMemoryTaskStore } from '../a2a/store';\nimport { isInterruptedTaskState, isTerminalTaskState } from '../a2a/task-state';\nimport { applyUpdateToTask, loadOrCreateTask, resolveTaskMemory } from '../a2a/tasks';\nimport {\n a2aAgentIdPathParams,\n a2aV1MethodMap,\n agentExecutionBodySchema,\n agentCardResponseSchema,\n agentExecutionResponseSchema,\n} from '../schemas/a2a';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport type { Context } from '../types';\nimport { convertInstructionsToString } from '../utils';\nimport { getAgentFromSystem } from './agents';\nimport { getPublicOrigin } from './auth';\n\n// Mirrors @a2a-js/sdk's Part discriminated union (text | file | data) and the\n// part shape already declared in ../schemas/a2a.ts. Before this widening, the\n// schema hard-coded `kind: z.enum(['text'])` which rejected every non-text\n// part before the converter could see it — even though convertToCoreMessagePart\n// at ../a2a/protocol.ts already handles file and data parts. With this change,\n// FilePart (FileWithBytes | FileWithUri) and DataPart parse successfully and\n// reach the converter (data parts then throw a clear \"not supported in core\n// messages\" message; files convert natively to AI-SDK CoreMessage file parts).\nconst messagePartSchema = z.discriminatedUnion('kind', [\n z.object({\n kind: z.literal('text'),\n text: z.string(),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n z.object({\n kind: z.literal('file'),\n file: z.union([\n z.object({\n bytes: z.string(),\n mimeType: z.string().optional(),\n name: z.string().optional(),\n }),\n z.object({\n uri: z.string(),\n mimeType: z.string().optional(),\n name: z.string().optional(),\n }),\n ]),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n z.object({\n kind: z.literal('data'),\n data: z.record(z.string(), z.any()),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n]);\n\nconst messageSendParamsSchema = z.object({\n message: z.object({\n role: z.enum(['user', 'agent']),\n parts: z.array(messagePartSchema),\n kind: z.literal('message'),\n messageId: z.string(),\n contextId: z.string().optional(),\n taskId: z.string().optional(),\n referenceTaskIds: z.array(z.string()).optional(),\n extensions: z.array(z.string()).optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n }),\n configuration: z\n .object({\n acceptedOutputModes: z.array(z.string()).optional(),\n blocking: z.boolean().optional(),\n returnImmediately: z.boolean().optional(),\n historyLength: z.number().optional(),\n pushNotificationConfig: z\n .object({\n url: z.string(),\n id: z.string().optional(),\n token: z.string().optional(),\n authentication: z\n .object({\n schemes: z.array(z.string()),\n credentials: z.string().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional(),\n});\n\nconst defaultPushNotificationStore = new InMemoryPushNotificationStore();\nconst defaultPushNotificationSender = new DefaultPushNotificationSender(defaultPushNotificationStore);\n\nconst V1_TASK_STATES: Record<string, string> = {\n submitted: 'TASK_STATE_SUBMITTED',\n working: 'TASK_STATE_WORKING',\n completed: 'TASK_STATE_COMPLETED',\n failed: 'TASK_STATE_FAILED',\n canceled: 'TASK_STATE_CANCELED',\n 'input-required': 'TASK_STATE_INPUT_REQUIRED',\n rejected: 'TASK_STATE_REJECTED',\n 'auth-required': 'TASK_STATE_AUTH_REQUIRED',\n};\n\nfunction normalizeV1Part(part: Record<string, unknown>) {\n if ('text' in part) {\n return { kind: 'text', text: part.text, metadata: part.metadata };\n }\n if ('raw' in part) {\n return {\n kind: 'file',\n file: { bytes: part.raw, mimeType: part.mediaType, name: part.filename },\n metadata: part.metadata,\n };\n }\n if ('url' in part) {\n return {\n kind: 'file',\n file: { uri: part.url, mimeType: part.mediaType, name: part.filename },\n metadata: part.metadata,\n };\n }\n return { kind: 'data', data: part.data, metadata: part.metadata };\n}\n\nfunction normalizeV1Params(method: string, params: Record<string, any> | undefined): Record<string, any> | undefined {\n if (!params) {\n return params;\n }\n\n if (method === 'tasks/pushNotificationConfig/set' && !params.pushNotificationConfig) {\n const { taskId, tenant: _tenant, ...pushNotificationConfig } = params;\n return { taskId, pushNotificationConfig };\n }\n\n if (\n (method === 'tasks/pushNotificationConfig/get' || method === 'tasks/pushNotificationConfig/delete') &&\n params.taskId\n ) {\n return { id: params.taskId, pushNotificationConfigId: params.id };\n }\n\n if (method === 'tasks/pushNotificationConfig/list' && params.taskId) {\n return { id: params.taskId, pageSize: params.pageSize, pageToken: params.pageToken };\n }\n\n if (!params.message) {\n return params;\n }\n\n const configuration = params.configuration;\n return {\n ...params,\n message: {\n ...params.message,\n kind: 'message',\n role: params.message.role === 'ROLE_AGENT' ? 'agent' : 'user',\n parts: params.message.parts.map((part: Record<string, unknown>) => normalizeV1Part(part)),\n },\n configuration: configuration\n ? {\n ...configuration,\n blocking: configuration.returnImmediately === undefined ? undefined : !configuration.returnImmediately,\n pushNotificationConfig: configuration.taskPushNotificationConfig,\n }\n : undefined,\n };\n}\n\nfunction toV1Part(part: any) {\n if (part.kind === 'text') {\n return { text: part.text, metadata: part.metadata };\n }\n if (part.kind === 'file') {\n return 'uri' in part.file\n ? { url: part.file.uri, filename: part.file.name, mediaType: part.file.mimeType, metadata: part.metadata }\n : { raw: part.file.bytes, filename: part.file.name, mediaType: part.file.mimeType, metadata: part.metadata };\n }\n return { data: part.data, metadata: part.metadata };\n}\n\nfunction toV1Message(message: any) {\n if (!message) return undefined;\n return {\n messageId: message.messageId,\n contextId: message.contextId,\n taskId: message.taskId,\n role: message.role === 'agent' ? 'ROLE_AGENT' : 'ROLE_USER',\n parts: message.parts?.map(toV1Part),\n metadata: message.metadata,\n extensions: message.extensions,\n referenceTaskIds: message.referenceTaskIds,\n };\n}\n\nfunction toV1Task(\n task: any,\n { includeArtifacts = true, historyLength }: { includeArtifacts?: boolean; historyLength?: number } = {},\n) {\n return {\n id: task.id,\n contextId: task.contextId,\n status: {\n state: V1_TASK_STATES[task.status.state] ?? 'TASK_STATE_UNSPECIFIED',\n message: toV1Message(task.status.message),\n timestamp: task.status.timestamp,\n },\n artifacts: includeArtifacts\n ? task.artifacts?.map((artifact: any) => ({\n artifactId: artifact.artifactId,\n name: artifact.name,\n description: artifact.description,\n parts: artifact.parts?.map(toV1Part),\n metadata: artifact.metadata,\n extensions: artifact.extensions,\n }))\n : undefined,\n history: task.history?.slice(historyLength === undefined ? 0 : -historyLength).map(toV1Message),\n metadata: task.metadata,\n };\n}\n\nfunction toV1Result(result: any, method: string) {\n if (method === 'message/send') {\n return result?.kind === 'message' ? { message: toV1Message(result) } : { task: toV1Task(result) };\n }\n if (method === 'message/stream' || method === 'tasks/resubscribe') {\n if (result?.kind === 'status-update') {\n return {\n statusUpdate: {\n taskId: result.taskId,\n contextId: result.contextId,\n status: {\n state: V1_TASK_STATES[result.status.state] ?? 'TASK_STATE_UNSPECIFIED',\n message: toV1Message(result.status.message),\n timestamp: result.status.timestamp,\n },\n final: result.final,\n metadata: result.metadata,\n },\n };\n }\n if (result?.kind === 'artifact-update') {\n return {\n artifactUpdate: {\n taskId: result.taskId,\n contextId: result.contextId,\n artifact: {\n ...result.artifact,\n parts: result.artifact.parts?.map(toV1Part),\n },\n append: result.append,\n lastChunk: result.lastChunk,\n metadata: result.metadata,\n },\n };\n }\n return result?.kind === 'message' ? { message: toV1Message(result) } : { task: toV1Task(result) };\n }\n if (method === 'tasks/get' || method === 'tasks/cancel') {\n return toV1Task(result);\n }\n return result;\n}\n\nfunction toV1PushNotificationConfig(config: TaskPushNotificationConfig) {\n return {\n taskId: config.taskId,\n ...config.pushNotificationConfig,\n };\n}\n\nfunction convertV1PushNotificationResponse(response: any, method: string, params: Record<string, any> | undefined) {\n if (!response || !('result' in response)) return response;\n\n if (method === 'tasks/pushNotificationConfig/list') {\n const configs = (response.result as TaskPushNotificationConfig[]).map(toV1PushNotificationConfig);\n const requestedPageSize = params?.pageSize ?? 50;\n const offset = params?.pageToken ? Number.parseInt(params.pageToken, 10) : 0;\n const start = Number.isFinite(offset) && offset >= 0 ? offset : 0;\n const page = configs.slice(start, start + requestedPageSize);\n const nextOffset = start + page.length;\n\n return {\n ...response,\n result: {\n configs: page,\n nextPageToken: nextOffset < configs.length ? String(nextOffset) : '',\n },\n };\n }\n\n if (method === 'tasks/pushNotificationConfig/delete') {\n return response;\n }\n\n return { ...response, result: toV1PushNotificationConfig(response.result) };\n}\n\nfunction convertV1Response(response: any, method: string) {\n if (!response || !('result' in response)) return response;\n return { ...response, result: toV1Result(response.result, method) };\n}\n\nasync function* convertV1Stream(stream: AsyncIterable<any>, method: string) {\n for await (const response of stream) {\n yield convertV1Response(response, method);\n }\n}\n\nfunction createAgentCardDefaults({\n pushNotifications = false,\n}: {\n pushNotifications?: boolean;\n} = {}): Pick<\n AgentCard,\n | 'protocolVersion'\n | 'additionalInterfaces'\n | 'supportsAuthenticatedExtendedCard'\n | 'security'\n | 'securitySchemes'\n | 'capabilities'\n | 'defaultInputModes'\n | 'defaultOutputModes'\n> {\n return {\n protocolVersion: '0.3.0',\n additionalInterfaces: [],\n supportsAuthenticatedExtendedCard: false,\n security: [],\n securitySchemes: {},\n capabilities: {\n streaming: true,\n pushNotifications,\n stateTransitionHistory: false,\n extensions: [],\n },\n defaultInputModes: ['text/plain'],\n defaultOutputModes: ['text/plain'],\n };\n}\n\ntype AgentCardOptions = Context & {\n requestContext: RequestContext;\n agentId: string;\n executionUrl?: string;\n version?: string;\n provider?: { organization: string; url: string };\n pushNotifications?: boolean;\n protocolVersion?: A2AProtocolVersion;\n};\n\nexport function getAgentCardByIdHandler(options: AgentCardOptions & { protocolVersion: '1.0' }): Promise<AgentCardV1>;\nexport function getAgentCardByIdHandler(options: AgentCardOptions & { protocolVersion?: '0.3' }): Promise<AgentCard>;\nexport function getAgentCardByIdHandler(options: AgentCardOptions): Promise<AgentCard | AgentCardV1>;\nexport async function getAgentCardByIdHandler({\n mastra,\n agentId,\n executionUrl = `/a2a/${agentId}`,\n provider = {\n organization: 'Mastra',\n url: 'https://mastra.ai',\n },\n version = '1.0',\n pushNotifications = false,\n requestContext,\n protocolVersion = '0.3',\n}: AgentCardOptions): Promise<AgentCard | AgentCardV1> {\n const agent = await getAgentFromSystem({ mastra, agentId });\n\n const [instructions, tools]: [\n Awaited<ReturnType<typeof agent.getInstructions>>,\n Awaited<ReturnType<typeof agent.listTools>>,\n ] = await Promise.all([agent.getInstructions({ requestContext }), agent.listTools({ requestContext })]);\n\n // Extract agent information to create the AgentCard\n const agentCard: AgentCard = {\n name: agent.id || agentId,\n description: convertInstructionsToString(instructions),\n url: executionUrl,\n provider,\n version,\n ...createAgentCardDefaults({ pushNotifications }),\n // Convert agent tools to skills format for A2A protocol\n skills: Object.entries(tools).map(([toolId, tool]) => ({\n id: toolId,\n name: toolId,\n description: ('description' in tool && tool.description) || `Tool: ${toolId}`,\n // Optional fields\n tags: ['tool'],\n })),\n };\n\n const card = protocolVersion === '1.0' ? createV1AgentCard(agentCard) : agentCard;\n const signing = mastra.getServer?.()?.a2a?.agentCardSigning;\n if (!signing) {\n return card;\n }\n\n return signAgentCard({\n agentCard: card,\n signing,\n });\n}\n\nfunction getA2AExecutionUrl({\n agentId,\n request,\n routePrefix,\n}: {\n agentId: string;\n request?: Request;\n routePrefix?: string;\n}) {\n const executionPath = `${routePrefix ?? ''}/a2a/${agentId}`;\n\n if (!request) {\n return executionPath;\n }\n\n return `${getPublicOrigin(request)}${executionPath}`;\n}\n\nfunction validateMessageSendParams(params: MessageSendParams) {\n try {\n messageSendParamsSchema.parse(params);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw MastraA2AError.invalidParams(error.issues[0]!.message);\n }\n\n throw error;\n }\n}\n\nfunction createArtifactUpdate({\n taskId,\n contextId,\n text,\n data,\n}: {\n taskId: string;\n contextId: string;\n text?: string;\n data?: Record<string, unknown>;\n}) {\n const parts = [\n ...(text ? [{ kind: 'text' as const, text }] : []),\n ...(data ? [{ kind: 'data' as const, data }] : []),\n ];\n\n if (parts.length === 0) {\n return undefined;\n }\n\n return {\n kind: 'artifact-update' as const,\n taskId,\n contextId,\n lastChunk: true,\n artifact: {\n artifactId: `${taskId}:response`,\n name: data ? 'response.json' : 'response.txt',\n parts,\n },\n };\n}\n\nfunction createTextChunkArtifactUpdate({\n taskId,\n contextId,\n text,\n append,\n lastChunk,\n}: {\n taskId: string;\n contextId: string;\n text: string;\n append?: boolean;\n lastChunk?: boolean;\n}) {\n return {\n kind: 'artifact-update' as const,\n taskId,\n contextId,\n ...(append ? { append: true } : {}),\n ...(lastChunk !== undefined ? { lastChunk } : {}),\n artifact: {\n artifactId: `${taskId}:response:text`,\n name: 'response.txt',\n parts: [{ kind: 'text' as const, text }],\n },\n };\n}\n\nfunction createDataArtifactUpdate({\n taskId,\n contextId,\n data,\n lastChunk,\n}: {\n taskId: string;\n contextId: string;\n data: Record<string, unknown>;\n lastChunk?: boolean;\n}) {\n return {\n kind: 'artifact-update' as const,\n taskId,\n contextId,\n ...(lastChunk !== undefined ? { lastChunk } : {}),\n artifact: {\n artifactId: `${taskId}:response:data`,\n name: 'response.json',\n parts: [{ kind: 'data' as const, data }],\n },\n };\n}\n\n/**\n * Task metadata keys that store the resume bookkeeping for a suspended agent\n * run so a follow-up message for an `input-required` task can resume it.\n */\nconst SUSPENDED_RUN_ID_METADATA_KEY = 'suspendedRunId';\nconst SUSPENDED_TOOL_CALL_ID_METADATA_KEY = 'suspendedToolCallId';\nconst SUSPENDED_REQUIRES_APPROVAL_METADATA_KEY = 'suspendedRequiresApproval';\n\nfunction toJsonSafe(value: unknown): unknown {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Builds the `input-required` status update for a suspended agent run.\n * The status message carries a human-readable prompt plus a data part with\n * the structured suspend payload and resume schema so A2A clients can\n * render/collect the required input (HITL per the A2A spec).\n */\nfunction createInputRequiredStatusUpdate({\n taskId,\n contextId,\n suspendPayload,\n resumeSchema,\n logger,\n}: {\n taskId: string;\n contextId: string;\n suspendPayload?: unknown;\n resumeSchema?: unknown;\n logger?: IMastraLogger;\n}): Omit<TaskStatus, 'timestamp'> {\n // Suspension payloads are `{ toolCallId, toolName, suspendPayload, ... }`\n // where the nested `suspendPayload` is the tool's own suspend() data. Use a\n // `message` string from either level as the human-readable prompt.\n const extractMessage = (value: unknown): string | undefined => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const messageValue = (value as { message?: unknown }).message;\n return typeof messageValue === 'string' && messageValue.length > 0 ? messageValue : undefined;\n };\n const promptText =\n extractMessage(suspendPayload) ??\n extractMessage((suspendPayload as { suspendPayload?: unknown } | undefined)?.suspendPayload) ??\n 'Additional input is required to continue this task.';\n\n const safeSuspendPayload = toJsonSafe(suspendPayload);\n const safeResumeSchema = toJsonSafe(resumeSchema);\n if (suspendPayload !== undefined && safeSuspendPayload === undefined) {\n logger?.warn(`[Task ${taskId}] Suspend payload is not JSON-serializable and was omitted from the status message.`);\n }\n if (resumeSchema !== undefined && safeResumeSchema === undefined) {\n logger?.warn(`[Task ${taskId}] Resume schema is not JSON-serializable and was omitted from the status message.`);\n }\n const data: Record<string, unknown> = {\n ...(safeSuspendPayload !== undefined ? { suspendPayload: safeSuspendPayload } : {}),\n ...(safeResumeSchema !== undefined ? { resumeSchema: safeResumeSchema } : {}),\n };\n\n return {\n state: 'input-required',\n message: {\n messageId: crypto.randomUUID(),\n kind: 'message',\n role: 'agent',\n taskId,\n contextId,\n parts: [\n { kind: 'text', text: promptText },\n ...(Object.keys(data).length > 0 ? [{ kind: 'data' as const, data }] : []),\n ],\n },\n };\n}\n\n/**\n * Extracts resume data from a follow-up message for an `input-required` task.\n * Prefers a structured data part; falls back to parsing the text as JSON\n * (the Mastra A2A client serializes structured resume data as JSON text),\n * and finally to the raw text.\n */\nfunction extractResumeData(message: MessageSendParams['message']): unknown {\n const dataPart = message.parts.find(part => part.kind === 'data');\n if (dataPart && 'data' in dataPart) {\n return dataPart.data;\n }\n\n const text = message.parts\n .filter((part): part is Extract<(typeof message.parts)[number], { kind: 'text' }> => part.kind === 'text')\n .map(part => part.text)\n .join('\\n')\n .trim();\n\n if (!text) {\n return undefined;\n }\n\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction getSuspendedRunId(task: Task | undefined | null): string | undefined {\n const value = task?.metadata?.[SUSPENDED_RUN_ID_METADATA_KEY];\n return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Approval suspensions (`requireApproval`) carry `{ toolCallId, toolName, args, resumeSchema }`\n * without a nested `suspendPayload`, while `suspend()` suspensions include one\n * (see `ToolCallApprovalPayload` / `ToolCallSuspendedPayload` in @mastra/core).\n */\nfunction isApprovalSuspension(suspendPayload: unknown): boolean {\n if (!suspendPayload || typeof suspendPayload !== 'object') {\n return false;\n }\n\n const payload = suspendPayload as { toolCallId?: unknown; suspendPayload?: unknown };\n return typeof payload.toolCallId === 'string' && payload.suspendPayload === undefined;\n}\n\nconst APPROVAL_AFFIRMATIVE_PATTERN = /^(y|yes|approve|approved|ok|okay|confirm|confirmed|true)[.!]?$/i;\nconst APPROVAL_NEGATIVE_PATTERN = /^(n|no|decline|declined|deny|denied|reject|rejected|false)[.!]?$/i;\n\n/**\n * Approval resumes are driven by `resumeData.approved` in the agentic loop, so\n * plain-text replies from A2A clients (\"yes\", \"no\") are coerced to the\n * `{ approved }` shape. Unrecognized values pass through unchanged.\n */\nfunction normalizeResumeData(resumeData: unknown, requiresApproval: boolean): unknown {\n if (!requiresApproval || typeof resumeData !== 'string') {\n return resumeData;\n }\n\n const text = resumeData.trim();\n if (APPROVAL_AFFIRMATIVE_PATTERN.test(text)) {\n return { approved: true };\n }\n if (APPROVAL_NEGATIVE_PATTERN.test(text)) {\n return { approved: false };\n }\n\n return resumeData;\n}\n\n/**\n * Marks a task `input-required` for a suspended agent run and records the\n * resume bookkeeping (runId, toolCallId, approval flag) in task metadata.\n * Shared by the send and stream paths so both report identical suspensions.\n */\nfunction applySuspensionToTask({\n task,\n suspendPayload,\n resumeSchema,\n runId,\n logger,\n}: {\n task: Task;\n suspendPayload?: unknown;\n resumeSchema?: unknown;\n runId: string;\n logger?: IMastraLogger;\n}): Task {\n const nextTask = applyUpdateToTask(\n task,\n createInputRequiredStatusUpdate({\n taskId: task.id,\n contextId: task.contextId,\n suspendPayload,\n resumeSchema,\n logger,\n }),\n );\n\n const payload = suspendPayload as { toolCallId?: unknown } | undefined;\n nextTask.metadata = {\n ...clearSuspensionMetadata(nextTask.metadata),\n [SUSPENDED_RUN_ID_METADATA_KEY]: runId,\n ...(typeof payload?.toolCallId === 'string' ? { [SUSPENDED_TOOL_CALL_ID_METADATA_KEY]: payload.toolCallId } : {}),\n ...(isApprovalSuspension(suspendPayload) ? { [SUSPENDED_REQUIRES_APPROVAL_METADATA_KEY]: true } : {}),\n };\n\n return nextTask;\n}\n\n/** Removes the suspension bookkeeping from task metadata once the run completes. */\nfunction clearSuspensionMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> {\n const {\n [SUSPENDED_RUN_ID_METADATA_KEY]: _runId,\n [SUSPENDED_TOOL_CALL_ID_METADATA_KEY]: _toolCallId,\n [SUSPENDED_REQUIRES_APPROVAL_METADATA_KEY]: _requiresApproval,\n ...rest\n } = metadata ?? {};\n return rest;\n}\n\ninterface ResumeClaim {\n runId: string;\n toolCallId?: string;\n requiresApproval: boolean;\n}\n\n/**\n * Claims an interrupted task for resume by transitioning it to `working`.\n * `loadWithVersion` and the body of `InMemoryTaskStore.save` both execute\n * synchronously, so two concurrent follow-up messages cannot both claim (and\n * double-resume) the same suspended run.\n */\nasync function claimInterruptedTaskResume({\n taskStore,\n agentId,\n taskId,\n}: {\n taskStore: InMemoryTaskStore;\n agentId: string;\n taskId: string;\n}): Promise<ResumeClaim | undefined> {\n const snapshot = taskStore.loadWithVersion({ agentId, taskId });\n if (snapshot?.task.status.state !== 'input-required' && snapshot?.task.status.state !== 'auth-required') {\n return undefined;\n }\n\n const task = snapshot.task;\n const toolCallId = task.metadata?.[SUSPENDED_TOOL_CALL_ID_METADATA_KEY];\n const claim: ResumeClaim = {\n runId: getSuspendedRunId(task) ?? taskId,\n ...(typeof toolCallId === 'string' ? { toolCallId } : {}),\n requiresApproval: task.metadata?.[SUSPENDED_REQUIRES_APPROVAL_METADATA_KEY] === true,\n };\n\n try {\n await taskStore.save({\n agentId,\n data: applyUpdateToTask(task, { state: 'working' }),\n expectedVersion: snapshot.version,\n });\n } catch (error) {\n if (error instanceof TaskStoreVersionConflictError) {\n return undefined;\n }\n throw error;\n }\n\n return claim;\n}\n\nasync function waitForClaimedResume({\n taskStore,\n agentId,\n taskId,\n}: {\n taskStore: InMemoryTaskStore;\n agentId: string;\n taskId: string;\n}): Promise<Task> {\n let snapshot = taskStore.loadWithVersion({ agentId, taskId });\n if (!snapshot) {\n throw MastraA2AError.taskNotFound(taskId);\n }\n\n while (snapshot.task.status.state === 'working') {\n snapshot = await taskStore.waitForNextUpdate({\n agentId,\n taskId,\n afterVersion: snapshot.version,\n });\n }\n\n return snapshot.task;\n}\n\nfunction resolvePushNotificationPair({\n pushNotificationStore,\n pushNotificationSender,\n}: {\n pushNotificationStore?: InMemoryPushNotificationStore;\n pushNotificationSender?: DefaultPushNotificationSender;\n}) {\n if (pushNotificationSender) {\n return {\n pushNotificationStore: pushNotificationSender.getStore(),\n pushNotificationSender,\n };\n }\n\n if (pushNotificationStore) {\n return {\n pushNotificationStore,\n pushNotificationSender: new DefaultPushNotificationSender(pushNotificationStore),\n };\n }\n\n return {\n pushNotificationStore: defaultPushNotificationStore,\n pushNotificationSender: defaultPushNotificationSender,\n };\n}\n\nfunction createTaskPushNotificationConfig(\n taskId: string,\n pushNotificationConfig: TaskPushNotificationConfig['pushNotificationConfig'],\n): TaskPushNotificationConfig {\n return {\n taskId,\n pushNotificationConfig: {\n ...pushNotificationConfig,\n id: pushNotificationConfig.id ?? taskId,\n },\n };\n}\n\nfunction shouldSendPushNotification(previousTask: Task | undefined, nextTask: Task) {\n const pushTriggerStates: TaskState[] = [\n 'completed',\n 'failed',\n 'canceled',\n 'rejected',\n 'input-required',\n 'auth-required',\n ];\n\n if (!pushTriggerStates.includes(nextTask.status.state)) {\n return false;\n }\n\n return previousTask?.status.state !== nextTask.status.state;\n}\n\nfunction createLinkedAbortController(abortSignal?: AbortSignal) {\n const controller = new AbortController();\n\n if (!abortSignal) {\n return { controller, cleanup: () => {} };\n }\n\n const abortFromSignal = () => {\n if (!controller.signal.aborted) {\n controller.abort(abortSignal.reason);\n }\n };\n\n if (abortSignal.aborted) {\n abortFromSignal();\n } else {\n abortSignal.addEventListener('abort', abortFromSignal, { once: true });\n }\n\n return {\n controller,\n cleanup: () => abortSignal.removeEventListener('abort', abortFromSignal),\n };\n}\n\nasync function saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender,\n previousTask,\n nextTask,\n agentId,\n expectedVersion,\n logger,\n}: {\n taskStore: InMemoryTaskStore;\n pushNotificationSender: DefaultPushNotificationSender;\n previousTask?: Task;\n nextTask: Task;\n agentId: string;\n expectedVersion?: number;\n logger?: IMastraLogger;\n}): Promise<Task> {\n const storedTask = await taskStore.save({ agentId, data: nextTask, expectedVersion, skipIfCanceled: true });\n\n if (storedTask.status.state === 'canceled' && nextTask.status.state !== 'canceled') {\n return storedTask;\n }\n\n if (!shouldSendPushNotification(previousTask, storedTask)) {\n return storedTask;\n }\n\n void pushNotificationSender\n .sendNotifications({\n agentId,\n task: storedTask,\n logger,\n })\n .catch(error => {\n logger?.error('Failed to schedule A2A push notification', error);\n });\n\n return storedTask;\n}\n\nfunction extractFullStreamTextDelta(value: unknown): string | null {\n if (typeof value !== 'object' || value === null || !('type' in value)) {\n return null;\n }\n\n const chunk = value as {\n type: string;\n payload?: { text?: string; delta?: string };\n textDelta?: string;\n text?: string;\n delta?: string;\n };\n\n switch (chunk.type) {\n case 'text-delta':\n if (typeof chunk.payload?.text === 'string') {\n return chunk.payload.text;\n }\n\n if (typeof chunk.payload?.delta === 'string') {\n return chunk.payload.delta;\n }\n\n if (typeof chunk.textDelta === 'string') {\n return chunk.textDelta;\n }\n\n if (typeof chunk.delta === 'string') {\n return chunk.delta;\n }\n\n if (typeof chunk.text === 'string') {\n return chunk.text;\n }\n\n return null;\n default:\n return null;\n }\n}\n\nfunction extractFinalStructuredObject(value: unknown): Record<string, unknown> | undefined {\n if (typeof value !== 'object' || value === null || !('type' in value)) {\n return undefined;\n }\n\n const chunk = value as {\n type: string;\n object?: unknown;\n payload?: { object?: unknown };\n };\n\n if (chunk.type !== 'object-result') {\n return undefined;\n }\n\n const objectValue = chunk.payload?.object ?? chunk.object;\n return objectValue && typeof objectValue === 'object' ? (objectValue as Record<string, unknown>) : undefined;\n}\n\nfunction isSuspensionChunk(value: unknown): boolean {\n if (typeof value !== 'object' || value === null || !('type' in value)) {\n return false;\n }\n\n const type = (value as { type: string }).type;\n return type === 'tool-call-suspended' || type === 'tool-call-approval';\n}\n\nfunction artifactIdentity(artifact: Artifact) {\n return artifact.artifactId || artifact.name;\n}\n\nfunction areArtifactPartsEqual(left: Artifact['parts'], right: Artifact['parts']) {\n if (left === right) {\n return true;\n }\n\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every((part, index) => {\n const other = right[index];\n if (!other || part.kind !== other.kind) {\n return false;\n }\n\n if (part.kind === 'text' && other.kind === 'text') {\n return part.text === other.text;\n }\n\n return part === other;\n });\n}\n\nfunction areArtifactsEqual(left: Artifact | undefined, right: Artifact | undefined) {\n if (left === right) {\n return true;\n }\n\n if (!left || !right) {\n return left === right;\n }\n\n return (\n left.artifactId === right.artifactId &&\n left.name === right.name &&\n left.description === right.description &&\n left.metadata === right.metadata &&\n areArtifactPartsEqual(left.parts, right.parts)\n );\n}\n\nfunction areStatusMessagePartsEqual(\n left: NonNullable<Task['status']['message']>['parts'],\n right: NonNullable<Task['status']['message']>['parts'],\n) {\n return left === right || isDeepStrictEqual(left, right);\n}\n\nfunction areStatusMessagesEqual(left: Task['status']['message'], right: Task['status']['message']) {\n if (left === right) {\n return true;\n }\n\n if (!left || !right) {\n return left === right;\n }\n\n return (\n left.messageId === right.messageId &&\n left.kind === right.kind &&\n left.role === right.role &&\n left.contextId === right.contextId &&\n left.taskId === right.taskId &&\n isDeepStrictEqual(left.referenceTaskIds, right.referenceTaskIds) &&\n isDeepStrictEqual(left.extensions, right.extensions) &&\n isDeepStrictEqual(left.metadata, right.metadata) &&\n areStatusMessagePartsEqual(left.parts, right.parts)\n );\n}\n\nfunction didTaskStatusChange(previous: Task, next: Task) {\n return (\n previous.status.state !== next.status.state ||\n previous.status.timestamp !== next.status.timestamp ||\n !areStatusMessagesEqual(previous.status.message, next.status.message)\n );\n}\n\nfunction getTaskArtifactUpdates({ previous, next }: { previous: Task; next: Task }) {\n const previousArtifacts = new Map((previous.artifacts ?? []).map(artifact => [artifactIdentity(artifact), artifact]));\n const changedArtifacts = (next.artifacts ?? []).filter(artifact => {\n const priorArtifact = previousArtifacts.get(artifactIdentity(artifact));\n return !priorArtifact || !areArtifactsEqual(priorArtifact, artifact);\n });\n\n return changedArtifacts.map((artifact, index) => ({\n kind: 'artifact-update' as const,\n taskId: next.id,\n contextId: next.contextId,\n lastChunk: isTerminalTaskState(next.status.state) && index === changedArtifacts.length - 1,\n artifact: structuredClone(artifact),\n }));\n}\n\nasync function executeMessageSend({\n requestId,\n message,\n currentData,\n taskStore,\n pushNotificationSender,\n agent,\n agentId,\n logger,\n requestContext,\n resume,\n}: {\n requestId: number | string;\n message: MessageSendParams['message'];\n currentData: Task;\n taskStore: InMemoryTaskStore;\n pushNotificationSender: DefaultPushNotificationSender;\n agent: Agent;\n agentId: string;\n logger?: IMastraLogger;\n requestContext: RequestContext;\n resume?: ResumeClaim;\n}) {\n try {\n const memory = {\n ...resolveTaskMemory({ task: currentData, agentId, requestContext }),\n thread: currentData.contextId,\n };\n const result = resume\n ? await agent.resumeGenerate(normalizeResumeData(extractResumeData(message), resume.requiresApproval), {\n runId: resume.runId,\n ...(resume.toolCallId ? { toolCallId: resume.toolCallId } : {}),\n requestContext,\n })\n : await agent.generate([convertToCoreMessage(message)], {\n runId: currentData.id,\n requestContext,\n memory,\n });\n\n const latestTask = await taskStore.load({ agentId, taskId: currentData.id });\n if (latestTask?.status.state === 'canceled') {\n return createSuccessResponse(requestId, latestTask);\n }\n currentData = latestTask ?? currentData;\n\n const artifactUpdate = createArtifactUpdate({\n taskId: currentData.id,\n contextId: currentData.contextId,\n text: result.text,\n data: result.object as Record<string, unknown> | undefined,\n });\n\n if (artifactUpdate) {\n currentData = applyUpdateToTask(currentData, artifactUpdate);\n }\n\n // Agent suspensions (tool approval, suspend()) surface as the A2A\n // `input-required` state so clients can provide the missing input and\n // continue the task (HITL per the A2A spec).\n if (result.finishReason === 'suspended') {\n const previousTask = currentData;\n currentData = applySuspensionToTask({\n task: currentData,\n suspendPayload: result.suspendPayload,\n resumeSchema: result.resumeSchema,\n runId: result.runId ?? currentData.id,\n logger,\n });\n\n await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender,\n previousTask,\n nextTask: currentData,\n agentId,\n logger,\n });\n\n return createSuccessResponse(requestId, currentData);\n }\n\n const previousTask = currentData;\n currentData = applyUpdateToTask(currentData, {\n state: 'completed',\n message: undefined,\n });\n\n // Store execution details in task metadata\n currentData.metadata = {\n ...clearSuspensionMetadata(currentData.metadata),\n execution: {\n toolCalls: result.toolCalls,\n toolResults: result.toolResults,\n usage: result.usage,\n finishReason: result.finishReason,\n },\n };\n\n await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender,\n previousTask,\n nextTask: currentData,\n agentId,\n logger,\n });\n } catch (handlerError) {\n const latestTask = await taskStore.load({ agentId, taskId: currentData.id });\n if (latestTask?.status.state === 'canceled') {\n return createSuccessResponse(requestId, latestTask);\n }\n currentData = latestTask ?? currentData;\n\n // If handler throws, apply 'failed' status, save, and rethrow\n const failureStatusUpdate: Omit<TaskStatus, 'timestamp'> = {\n state: 'failed',\n message: {\n messageId: crypto.randomUUID(),\n role: 'agent',\n parts: [\n {\n kind: 'text',\n text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`,\n },\n ],\n kind: 'message',\n },\n };\n const previousTask = currentData;\n currentData = applyUpdateToTask(currentData, failureStatusUpdate);\n\n try {\n await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender,\n previousTask,\n nextTask: currentData,\n agentId,\n logger,\n });\n } catch (saveError) {\n // @ts-expect-error saveError is an unknown error\n logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);\n }\n\n return normalizeError(handlerError, requestId, currentData.id, logger); // Rethrow original error\n }\n\n // The loop finished, send the final task state\n return createSuccessResponse(requestId, currentData);\n}\n\nexport async function handleMessageSend({\n requestId,\n params,\n taskStore,\n pushNotificationStore,\n pushNotificationSender,\n agent,\n agentId,\n logger,\n requestContext,\n}: {\n requestId: number | string;\n params: MessageSendParams;\n taskStore: InMemoryTaskStore;\n pushNotificationStore?: InMemoryPushNotificationStore;\n pushNotificationSender?: DefaultPushNotificationSender;\n agent: Agent;\n agentId: string;\n logger?: IMastraLogger;\n requestContext: RequestContext;\n}) {\n validateMessageSendParams(params);\n\n const { message, metadata } = params;\n const { contextId } = message;\n const taskId = message.taskId || crypto.randomUUID();\n const existingTask = taskStore.loadWithVersion({ agentId, taskId })?.task;\n if (message.taskId && !existingTask) {\n throw MastraA2AError.taskNotFound(message.taskId);\n }\n resolveTaskMemory({ task: existingTask, agentId, requestContext, metadata, message });\n if (params.configuration?.blocking === false && existingTask?.status.state === 'working') {\n return createSuccessResponse(requestId, existingTask);\n }\n\n if (existingTask?.status.state === 'working' && getSuspendedRunId(existingTask)) {\n const task = await waitForClaimedResume({ taskStore, agentId, taskId });\n return createSuccessResponse(requestId, task);\n }\n\n // A follow-up message for an interrupted task resumes the suspended agent\n // run instead of starting a fresh generation (A2A HITL continuation).\n // The claim transitions the task to `working` synchronously so concurrent\n // follow-ups cannot double-resume the same run.\n const wasInterrupted = isInterruptedTaskState(existingTask?.status.state);\n const resume = await claimInterruptedTaskResume({ taskStore, agentId, taskId });\n if (wasInterrupted && !resume) {\n const task = await waitForClaimedResume({ taskStore, agentId, taskId });\n return createSuccessResponse(requestId, task);\n }\n const {\n pushNotificationStore: resolvedPushNotificationStore,\n pushNotificationSender: resolvedPushNotificationSender,\n } = resolvePushNotificationPair({\n pushNotificationStore,\n pushNotificationSender,\n });\n\n let currentData = await loadOrCreateTask({\n taskId,\n taskStore,\n agentId,\n message,\n contextId,\n metadata,\n requestContext,\n });\n\n if (params.configuration?.pushNotificationConfig) {\n resolvedPushNotificationStore.set({\n agentId,\n config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig),\n });\n }\n\n currentData = applyUpdateToTask(currentData, {\n state: 'working',\n message: {\n messageId: crypto.randomUUID(),\n kind: 'message',\n role: 'agent',\n parts: [{ kind: 'text', text: 'Generating response...' }],\n },\n });\n await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n nextTask: currentData,\n agentId,\n logger,\n });\n\n const execution = executeMessageSend({\n requestId,\n message,\n currentData,\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n agent,\n agentId,\n logger,\n requestContext,\n resume,\n });\n\n if (params.configuration?.blocking === false) {\n void execution.catch(error => {\n logger?.error(`Unexpected background failure for A2A task ${currentData.id}`, error);\n });\n return createSuccessResponse(requestId, currentData);\n }\n\n return execution;\n}\n\nexport async function handleTaskGet({\n requestId,\n taskStore,\n agentId,\n taskId,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n agentId: string;\n taskId: string;\n}) {\n const task = await taskStore.load({ agentId, taskId });\n\n if (!task) {\n throw MastraA2AError.taskNotFound(taskId);\n }\n\n return createSuccessResponse(requestId, task);\n}\n\nexport function handleTaskList({\n requestId,\n taskStore,\n agentId,\n params,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n agentId: string;\n params: Record<string, any>;\n}) {\n const requestedPageSize = params.pageSize ?? 50;\n const offset = params.pageToken ? Number.parseInt(params.pageToken, 10) : 0;\n const start = Number.isFinite(offset) && offset >= 0 ? offset : 0;\n const status =\n typeof params.status === 'string'\n ? params.status\n .replace(/^TASK_STATE_/, '')\n .toLowerCase()\n .replaceAll('_', '-')\n : undefined;\n const timestampAfter = params.statusTimestampAfter ? Date.parse(params.statusTimestampAfter) : undefined;\n\n const matchingTasks = taskStore\n .list({ agentId })\n .filter(task => !params.contextId || task.contextId === params.contextId)\n .filter(task => !status || task.status.state === status)\n .filter(\n task =>\n !timestampAfter || (task.status.timestamp !== undefined && Date.parse(task.status.timestamp) >= timestampAfter),\n );\n const tasks = matchingTasks.slice(start, start + requestedPageSize).map(task =>\n toV1Task(task, {\n includeArtifacts: params.includeArtifacts ?? false,\n historyLength: params.historyLength,\n }),\n );\n const nextOffset = start + tasks.length;\n\n return createSuccessResponse(requestId, {\n tasks,\n nextPageToken: nextOffset < matchingTasks.length ? String(nextOffset) : '',\n pageSize: requestedPageSize,\n totalSize: matchingTasks.length,\n });\n}\n\nasync function loadTaskOrThrow({\n taskStore,\n agentId,\n taskId,\n}: {\n taskStore: InMemoryTaskStore;\n agentId: string;\n taskId: string;\n}) {\n const task = await taskStore.load({ agentId, taskId });\n\n if (!task) {\n throw MastraA2AError.taskNotFound(taskId);\n }\n\n return task;\n}\n\nexport async function handleSetTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore,\n agentId,\n params,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n pushNotificationStore?: InMemoryPushNotificationStore;\n agentId: string;\n params: TaskPushNotificationConfig;\n}) {\n await loadTaskOrThrow({\n taskStore,\n agentId,\n taskId: params.taskId,\n });\n\n const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({\n pushNotificationStore,\n });\n const config = resolvedPushNotificationStore.set({\n agentId,\n config: createTaskPushNotificationConfig(params.taskId, params.pushNotificationConfig),\n });\n\n return createSuccessResponse(requestId, config);\n}\n\nexport async function handleGetTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore,\n agentId,\n params,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n pushNotificationStore?: InMemoryPushNotificationStore;\n agentId: string;\n params: GetTaskPushNotificationConfigParams;\n}) {\n await loadTaskOrThrow({\n taskStore,\n agentId,\n taskId: params.id,\n });\n\n const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({\n pushNotificationStore,\n });\n const config = resolvedPushNotificationStore.get({\n agentId,\n params,\n });\n\n if (!config) {\n throw MastraA2AError.invalidParams(\n `Push notification config not found: ${params.pushNotificationConfigId ?? params.id}`,\n );\n }\n\n return createSuccessResponse(requestId, config);\n}\n\nexport async function handleListTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore,\n agentId,\n params,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n pushNotificationStore?: InMemoryPushNotificationStore;\n agentId: string;\n params: ListTaskPushNotificationConfigParams;\n}) {\n await loadTaskOrThrow({\n taskStore,\n agentId,\n taskId: params.id,\n });\n\n const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({\n pushNotificationStore,\n });\n const configs = resolvedPushNotificationStore.list({\n agentId,\n params,\n });\n\n return createSuccessResponse(requestId, configs);\n}\n\nexport async function handleDeleteTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore,\n agentId,\n params,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n pushNotificationStore?: InMemoryPushNotificationStore;\n agentId: string;\n params: DeleteTaskPushNotificationConfigParams;\n}) {\n await loadTaskOrThrow({\n taskStore,\n agentId,\n taskId: params.id,\n });\n\n const { pushNotificationStore: resolvedPushNotificationStore } = resolvePushNotificationPair({\n pushNotificationStore,\n });\n const deleted = resolvedPushNotificationStore.delete({\n agentId,\n params,\n });\n\n if (!deleted) {\n throw MastraA2AError.invalidParams(`Push notification config not found: ${params.pushNotificationConfigId}`);\n }\n\n return createSuccessResponse(requestId, null);\n}\n\nexport async function* handleMessageStream({\n requestId,\n params,\n taskStore,\n pushNotificationStore,\n pushNotificationSender,\n agent,\n agentId,\n logger,\n requestContext,\n abortSignal,\n}: {\n requestId: number | string;\n params: MessageSendParams;\n taskStore: InMemoryTaskStore;\n pushNotificationStore?: InMemoryPushNotificationStore;\n pushNotificationSender?: DefaultPushNotificationSender;\n agent: Agent;\n agentId: string;\n logger?: IMastraLogger;\n requestContext: RequestContext;\n abortSignal?: AbortSignal;\n}) {\n validateMessageSendParams(params);\n\n const { message, metadata } = params;\n const { contextId } = message;\n const taskId = message.taskId || crypto.randomUUID();\n const existingTask = taskStore.loadWithVersion({ agentId, taskId })?.task;\n if (message.taskId && !existingTask) {\n throw MastraA2AError.taskNotFound(message.taskId);\n }\n resolveTaskMemory({ task: existingTask, agentId, requestContext, metadata, message });\n\n // A follow-up message for an interrupted task resumes the suspended agent\n // run instead of starting a fresh generation (A2A HITL continuation).\n // The claim transitions the task to `working` synchronously so concurrent\n // follow-ups cannot double-resume the same run.\n const resume = await claimInterruptedTaskResume({ taskStore, agentId, taskId });\n\n const {\n pushNotificationStore: resolvedPushNotificationStore,\n pushNotificationSender: resolvedPushNotificationSender,\n } = resolvePushNotificationPair({\n pushNotificationStore,\n pushNotificationSender,\n });\n\n let currentData = await loadOrCreateTask({\n taskId,\n taskStore,\n agentId,\n message,\n contextId,\n metadata,\n requestContext,\n });\n\n if (params.configuration?.pushNotificationConfig) {\n resolvedPushNotificationStore.set({\n agentId,\n config: createTaskPushNotificationConfig(taskId, params.configuration.pushNotificationConfig),\n });\n }\n\n currentData = applyUpdateToTask(currentData, {\n state: 'working',\n message: {\n messageId: crypto.randomUUID(),\n kind: 'message',\n role: 'agent',\n parts: [{ kind: 'text', text: 'Generating response...' }],\n },\n });\n\n await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n nextTask: currentData,\n agentId,\n logger,\n });\n\n const { controller: taskAbortController, cleanup: cleanupLinkedAbortController } =\n createLinkedAbortController(abortSignal);\n const unregisterTaskAbortController = taskStore.registerAbortController({\n agentId,\n taskId,\n controller: taskAbortController,\n });\n\n try {\n yield createSuccessResponse(requestId, currentData);\n\n const memory = {\n ...resolveTaskMemory({ task: currentData, agentId, requestContext }),\n thread: currentData.contextId,\n };\n const result = resume\n ? await agent.resumeStream(normalizeResumeData(extractResumeData(message), resume.requiresApproval), {\n runId: resume.runId,\n ...(resume.toolCallId ? { toolCallId: resume.toolCallId } : {}),\n requestContext,\n abortSignal: taskAbortController.signal,\n })\n : await agent.stream([convertToCoreMessage(message)], {\n runId: taskId,\n requestContext,\n abortSignal: taskAbortController.signal,\n memory,\n });\n let sawTextArtifact = false;\n let pendingTextChunk: string | undefined;\n let structuredData: Record<string, unknown> | undefined;\n let suspended = false;\n let streamCanceled = false;\n\n for await (const chunk of result.fullStream) {\n if (taskAbortController.signal.aborted) {\n const latestTask = await taskStore.load({ agentId, taskId: currentData.id });\n if (latestTask) {\n currentData = latestTask;\n }\n streamCanceled = true;\n break;\n }\n\n if (isSuspensionChunk(chunk)) {\n suspended = true;\n continue;\n }\n\n const textDelta = extractFullStreamTextDelta(chunk);\n if (textDelta !== null) {\n if (!pendingTextChunk) {\n pendingTextChunk = textDelta;\n continue;\n }\n\n const textUpdate = createTextChunkArtifactUpdate({\n taskId: currentData.id,\n contextId: currentData.contextId,\n text: pendingTextChunk,\n append: sawTextArtifact,\n lastChunk: false,\n });\n\n currentData = applyUpdateToTask(currentData, textUpdate);\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n nextTask: currentData,\n agentId,\n logger,\n });\n if (currentData.status.state === 'canceled') {\n streamCanceled = true;\n break;\n }\n yield createSuccessResponse(requestId, textUpdate);\n\n sawTextArtifact = true;\n pendingTextChunk = textDelta;\n continue;\n }\n\n const finalStructuredObject = extractFinalStructuredObject(chunk);\n if (finalStructuredObject) {\n structuredData = finalStructuredObject;\n }\n }\n\n if (!streamCanceled && taskAbortController.signal.aborted) {\n const latestTask = await taskStore.load({ agentId, taskId: currentData.id });\n if (latestTask) {\n currentData = latestTask;\n }\n streamCanceled = true;\n }\n\n if (streamCanceled && abortSignal?.aborted && currentData.status.state !== 'canceled') {\n const previousTask = currentData;\n currentData = applyUpdateToTask(currentData, {\n state: 'canceled',\n message: {\n messageId: crypto.randomUUID(),\n role: 'agent',\n parts: [{ kind: 'text', text: 'Task canceled because the request was aborted.' }],\n kind: 'message',\n },\n });\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n previousTask,\n nextTask: currentData,\n agentId,\n logger,\n });\n }\n\n if (!streamCanceled && suspended) {\n // Agent suspensions (tool approval, suspend()) surface as the A2A\n // `input-required` state so clients can provide the missing input and\n // continue the task (HITL per the A2A spec). Skip the completed path\n // and avoid awaiting result promises that only settle on completion.\n if (pendingTextChunk) {\n const textUpdate = createTextChunkArtifactUpdate({\n taskId: currentData.id,\n contextId: currentData.contextId,\n text: pendingTextChunk,\n append: sawTextArtifact,\n lastChunk: true,\n });\n\n currentData = applyUpdateToTask(currentData, textUpdate);\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n nextTask: currentData,\n agentId,\n logger,\n });\n if (currentData.status.state === 'canceled') {\n streamCanceled = true;\n } else {\n yield createSuccessResponse(requestId, textUpdate);\n }\n }\n\n const suspensionTask = currentData;\n currentData = applySuspensionToTask({\n task: currentData,\n suspendPayload: await result.suspendPayload,\n resumeSchema: await result.resumeSchema,\n runId: result.runId ?? currentData.id,\n logger,\n });\n\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n previousTask: suspensionTask,\n nextTask: currentData,\n agentId,\n logger,\n });\n if (currentData.status.state === 'canceled') {\n streamCanceled = true;\n }\n }\n\n if (!streamCanceled && !suspended) {\n structuredData ??= (await result.object) as Record<string, unknown> | undefined;\n\n if (!pendingTextChunk && !sawTextArtifact) {\n const finalText = await result.text;\n if (finalText) {\n pendingTextChunk = finalText;\n }\n }\n\n if (pendingTextChunk) {\n const textUpdate = createTextChunkArtifactUpdate({\n taskId: currentData.id,\n contextId: currentData.contextId,\n text: pendingTextChunk,\n append: sawTextArtifact,\n lastChunk: !structuredData,\n });\n\n currentData = applyUpdateToTask(currentData, textUpdate);\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n nextTask: currentData,\n agentId,\n logger,\n });\n if (currentData.status.state === 'canceled') {\n streamCanceled = true;\n } else {\n yield createSuccessResponse(requestId, textUpdate);\n }\n\n sawTextArtifact = true;\n pendingTextChunk = undefined;\n }\n\n if (!streamCanceled && structuredData) {\n const dataUpdate = createDataArtifactUpdate({\n taskId: currentData.id,\n contextId: currentData.contextId,\n data: structuredData,\n lastChunk: true,\n });\n\n currentData = applyUpdateToTask(currentData, dataUpdate);\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n nextTask: currentData,\n agentId,\n logger,\n });\n if (currentData.status.state === 'canceled') {\n streamCanceled = true;\n } else {\n yield createSuccessResponse(requestId, dataUpdate);\n }\n }\n\n if (!streamCanceled) {\n const previousTask = currentData;\n const completedTask = applyUpdateToTask(currentData, {\n state: 'completed',\n message: undefined,\n });\n\n completedTask.metadata = {\n ...clearSuspensionMetadata(completedTask.metadata),\n execution: {\n toolCalls: await result.toolCalls,\n toolResults: await result.toolResults,\n usage: await result.usage,\n finishReason: await result.finishReason,\n },\n };\n\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n previousTask,\n nextTask: completedTask,\n agentId,\n logger,\n });\n }\n }\n } catch (handlerError) {\n const latestTask = await taskStore.load({ agentId, taskId: currentData.id });\n if (latestTask?.status.state === 'canceled') {\n currentData = latestTask;\n } else if (taskAbortController.signal.aborted) {\n currentData = latestTask ?? currentData;\n if (abortSignal?.aborted) {\n const previousTask = currentData;\n currentData = applyUpdateToTask(currentData, {\n state: 'canceled',\n message: {\n messageId: crypto.randomUUID(),\n role: 'agent',\n parts: [{ kind: 'text', text: 'Task canceled because the request was aborted.' }],\n kind: 'message',\n },\n });\n\n try {\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n previousTask,\n nextTask: currentData,\n agentId,\n logger,\n });\n } catch (saveError) {\n // @ts-expect-error saveError is an unknown error\n logger?.error(`Failed to save task ${currentData.id} after request abort:`, saveError?.message);\n }\n }\n } else {\n currentData = latestTask ?? currentData;\n const previousTask = currentData;\n currentData = applyUpdateToTask(currentData, {\n state: 'failed',\n message: {\n messageId: crypto.randomUUID(),\n role: 'agent',\n parts: [\n {\n kind: 'text',\n text: `Handler failed: ${handlerError instanceof Error ? handlerError.message : String(handlerError)}`,\n },\n ],\n kind: 'message',\n },\n });\n\n try {\n currentData = await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n previousTask,\n nextTask: currentData,\n agentId,\n logger,\n });\n } catch (saveError) {\n // @ts-expect-error saveError is an unknown error\n logger?.error(`Failed to save task ${currentData.id} after handler error:`, saveError?.message);\n }\n }\n } finally {\n unregisterTaskAbortController();\n cleanupLinkedAbortController();\n }\n\n const latestTask = await taskStore.load({ agentId, taskId: currentData.id });\n if (latestTask?.status.state === 'canceled') {\n currentData = latestTask;\n }\n\n yield createSuccessResponse(requestId, {\n kind: 'status-update',\n taskId: currentData.id,\n contextId: currentData.contextId,\n status: currentData.status,\n final: true,\n });\n}\n\nexport async function* handleTaskResubscribe({\n requestId,\n taskStore,\n agentId,\n taskId,\n abortSignal,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n agentId: string;\n taskId: string;\n abortSignal?: AbortSignal;\n}) {\n let snapshot = taskStore.loadWithVersion({ agentId, taskId });\n\n if (!snapshot) {\n throw MastraA2AError.taskNotFound(taskId);\n }\n\n yield createSuccessResponse(requestId, snapshot.task);\n\n // Interrupted states produce no further updates until the client sends a\n // follow-up message, so the event stream ends here.\n if (isTerminalTaskState(snapshot.task.status.state) || isInterruptedTaskState(snapshot.task.status.state)) {\n return;\n }\n\n while (true) {\n const { task, version } = snapshot;\n const nextUpdate = await taskStore.waitForNextUpdate({\n agentId,\n taskId,\n afterVersion: version,\n signal: abortSignal,\n });\n\n for (const artifactUpdate of getTaskArtifactUpdates({ previous: task, next: nextUpdate.task })) {\n yield createSuccessResponse(requestId, artifactUpdate);\n }\n\n const nextState = nextUpdate.task.status.state;\n const streamEnded = isTerminalTaskState(nextState) || isInterruptedTaskState(nextState);\n\n if (didTaskStatusChange(task, nextUpdate.task)) {\n yield createSuccessResponse(requestId, {\n kind: 'status-update',\n taskId: nextUpdate.task.id,\n contextId: nextUpdate.task.contextId,\n status: nextUpdate.task.status,\n final: streamEnded,\n });\n }\n\n if (streamEnded) {\n return;\n }\n\n snapshot = nextUpdate;\n }\n}\n\nfunction getTaskIdFromParams(\n params: MessageSendParams | TaskQueryParams | TaskIdParams | Record<string, unknown> | undefined,\n) {\n if (!params || typeof params !== 'object') {\n return undefined;\n }\n\n if ('id' in params && typeof params.id === 'string') {\n return params.id;\n }\n\n if ('taskId' in params && typeof params.taskId === 'string') {\n return params.taskId;\n }\n\n if ('message' in params && params.message && typeof params.message === 'object' && 'taskId' in params.message) {\n return typeof params.message.taskId === 'string' ? params.message.taskId : undefined;\n }\n\n return undefined;\n}\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return !!value && typeof value === 'object' && Symbol.asyncIterator in value;\n}\n\nfunction createA2AJsonResponse(payload: unknown): Response {\n return Response.json(payload);\n}\n\nfunction createA2ASSEResponse(payload: AsyncIterable<unknown> | unknown): Response {\n const encoder = new TextEncoder();\n const iterable = isAsyncIterable(payload)\n ? payload\n : (async function* () {\n yield payload;\n })();\n\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n try {\n for await (const chunk of iterable) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\\n\\n`));\n }\n } catch (error) {\n controller.error(error);\n return;\n }\n\n controller.close();\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream; charset=utf-8',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n}\n\nexport async function handleTaskCancel({\n requestId,\n taskStore,\n pushNotificationSender,\n agentId,\n taskId,\n logger,\n}: {\n requestId: number | string;\n taskStore: InMemoryTaskStore;\n pushNotificationSender?: DefaultPushNotificationSender;\n agentId: string;\n taskId: string;\n logger?: IMastraLogger;\n}) {\n for (let attempt = 0; attempt < 2; attempt++) {\n const snapshot = taskStore.loadWithVersion({ agentId, taskId });\n const data = snapshot?.task;\n\n if (!data) {\n throw MastraA2AError.taskNotFound(taskId);\n }\n\n if (isTerminalTaskState(data.status.state)) {\n logger?.info(`Task ${taskId} already in final state ${data.status.state}, cannot cancel.`);\n throw MastraA2AError.taskNotCancelable(taskId);\n }\n\n taskStore.activeCancellations.add(taskId);\n taskStore.abortTask({\n agentId,\n taskId,\n reason: new DOMException('Task cancelled by request.', 'AbortError'),\n });\n\n const cancelUpdate: Omit<TaskStatus, 'timestamp'> = {\n state: 'canceled',\n message: {\n role: 'agent',\n parts: [{ kind: 'text', text: 'Task cancelled by request.' }],\n kind: 'message',\n messageId: crypto.randomUUID(),\n },\n };\n const canceledTask = applyUpdateToTask(data, cancelUpdate);\n\n try {\n await saveTaskAndMaybeSendPushNotification({\n taskStore,\n pushNotificationSender: resolvePushNotificationPair({ pushNotificationSender }).pushNotificationSender,\n previousTask: data,\n nextTask: canceledTask,\n agentId,\n expectedVersion: snapshot.version,\n logger,\n });\n return createSuccessResponse(requestId, canceledTask);\n } catch (error) {\n if (!(error instanceof TaskStoreVersionConflictError)) {\n throw error;\n }\n } finally {\n taskStore.activeCancellations.delete(taskId);\n }\n }\n\n throw MastraA2AError.invalidRequest(`Task ${taskId} was updated concurrently. Retry the request.`);\n}\n\nexport async function getAgentExecutionHandler({\n requestId,\n mastra,\n agentId,\n requestContext,\n method,\n params,\n taskStore,\n pushNotificationStore,\n pushNotificationSender,\n logger,\n abortSignal,\n protocolVersion = '0.3',\n}: Context & {\n requestId: number | string;\n requestContext: RequestContext;\n agentId: string;\n method:\n | 'message/send'\n | 'message/stream'\n | 'tasks/get'\n | 'tasks/list'\n | 'tasks/cancel'\n | 'tasks/resubscribe'\n | 'tasks/pushNotificationConfig/set'\n | 'tasks/pushNotificationConfig/get'\n | 'tasks/pushNotificationConfig/list'\n | 'tasks/pushNotificationConfig/delete'\n | 'agent/getAuthenticatedExtendedCard';\n params?: MessageSendParams | TaskQueryParams | TaskIdParams | Record<string, unknown>;\n taskStore: InMemoryTaskStore;\n pushNotificationStore?: InMemoryPushNotificationStore;\n pushNotificationSender?: DefaultPushNotificationSender;\n logger?: IMastraLogger;\n abortSignal?: AbortSignal;\n protocolVersion?: A2AProtocolVersion;\n}): Promise<any> {\n const agent = await getAgentFromSystem({ mastra, agentId });\n const protocolParams = protocolVersion === '1.0' ? normalizeV1Params(method, params) : params;\n const {\n pushNotificationStore: resolvedPushNotificationStore,\n pushNotificationSender: resolvedPushNotificationSender,\n } = resolvePushNotificationPair({\n pushNotificationStore,\n pushNotificationSender,\n });\n\n let taskId: string | undefined; // For error context\n\n try {\n taskId = getTaskIdFromParams(protocolParams);\n\n // 2. Route based on method\n switch (method) {\n case 'message/send': {\n const result = await handleMessageSend({\n requestId,\n params: protocolParams as MessageSendParams,\n taskStore,\n pushNotificationStore: resolvedPushNotificationStore,\n pushNotificationSender: resolvedPushNotificationSender,\n agent,\n agentId,\n logger,\n requestContext,\n });\n return protocolVersion === '1.0' ? convertV1Response(result, method) : result;\n }\n case 'message/stream': {\n const result = await handleMessageStream({\n requestId,\n taskStore,\n params: protocolParams as MessageSendParams,\n pushNotificationStore: resolvedPushNotificationStore,\n pushNotificationSender: resolvedPushNotificationSender,\n agent,\n agentId,\n logger,\n requestContext,\n abortSignal,\n });\n return protocolVersion === '1.0' ? convertV1Stream(result, method) : result;\n }\n\n case 'tasks/get': {\n const result = await handleTaskGet({\n requestId,\n taskStore,\n agentId,\n taskId: taskId || 'No task ID provided',\n });\n\n return protocolVersion === '1.0' ? convertV1Response(result, method) : result;\n }\n case 'tasks/list': {\n if (protocolVersion !== '1.0') {\n throw MastraA2AError.methodNotFound(method);\n }\n return handleTaskList({\n requestId,\n taskStore,\n agentId,\n params: protocolParams ?? {},\n });\n }\n case 'tasks/cancel': {\n const result = await handleTaskCancel({\n requestId,\n taskStore,\n pushNotificationSender: resolvedPushNotificationSender,\n agentId,\n taskId: taskId || 'No task ID provided',\n logger,\n });\n\n return protocolVersion === '1.0' ? convertV1Response(result, method) : result;\n }\n case 'tasks/resubscribe': {\n const result = handleTaskResubscribe({\n requestId,\n taskStore,\n agentId,\n taskId: taskId || 'No task ID provided',\n abortSignal,\n });\n return protocolVersion === '1.0' ? convertV1Stream(result, method) : result;\n }\n case 'tasks/pushNotificationConfig/set': {\n const result = await handleSetTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore: resolvedPushNotificationStore,\n agentId,\n params: protocolParams as unknown as TaskPushNotificationConfig,\n });\n return protocolVersion === '1.0' ? convertV1PushNotificationResponse(result, method, protocolParams) : result;\n }\n case 'tasks/pushNotificationConfig/get': {\n const result = await handleGetTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore: resolvedPushNotificationStore,\n agentId,\n params: protocolParams as GetTaskPushNotificationConfigParams,\n });\n return protocolVersion === '1.0' ? convertV1PushNotificationResponse(result, method, protocolParams) : result;\n }\n case 'tasks/pushNotificationConfig/list': {\n const result = await handleListTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore: resolvedPushNotificationStore,\n agentId,\n params: protocolParams as ListTaskPushNotificationConfigParams,\n });\n return protocolVersion === '1.0' ? convertV1PushNotificationResponse(result, method, protocolParams) : result;\n }\n case 'tasks/pushNotificationConfig/delete': {\n const result = await handleDeleteTaskPushNotificationConfig({\n requestId,\n taskStore,\n pushNotificationStore: resolvedPushNotificationStore,\n agentId,\n params: protocolParams as DeleteTaskPushNotificationConfigParams,\n });\n return protocolVersion === '1.0' ? convertV1PushNotificationResponse(result, method, protocolParams) : result;\n }\n case 'agent/getAuthenticatedExtendedCard':\n throw MastraA2AError.extendedAgentCardNotConfigured();\n default:\n throw MastraA2AError.methodNotFound(method);\n }\n } catch (error) {\n if (error instanceof MastraA2AError && taskId && !error.taskId) {\n error.taskId = taskId; // Add task ID context if missing\n }\n\n return normalizeError(error, requestId, taskId, logger);\n }\n}\n\n// ============================================================================\n// Route Definitions (new pattern - handlers defined inline with createRoute)\n// ============================================================================\n\nexport type A2AProtocolVersion = '0.3' | '1.0';\n\nexport function resolveA2AProtocolVersion(request?: Request): A2AProtocolVersion {\n const version = request?.headers.get('A2A-Version')?.trim();\n\n if (!version || version === '0.3') {\n return '0.3';\n }\n\n if (version === '1.0') {\n return '1.0';\n }\n\n throw MastraA2AError.versionNotSupported(version);\n}\n\nexport const GET_AGENT_CARD_ROUTE = createRoute({\n method: 'GET',\n path: '/.well-known/:agentId/agent-card.json',\n responseType: 'datastream-response',\n pathParamSchema: a2aAgentIdPathParams,\n responseSchema: agentCardResponseSchema,\n summary: 'Get agent card',\n description: 'Returns the agent card information for A2A protocol discovery',\n tags: ['Agent-to-Agent'],\n requiresAuth: true,\n handler: async ctx => {\n const executionUrl = getA2AExecutionUrl({\n agentId: ctx.agentId,\n request: (ctx as typeof ctx & { request?: Request }).request,\n routePrefix: ctx.routePrefix,\n });\n\n const headers = { Vary: 'A2A-Version' };\n try {\n const card = await getAgentCardByIdHandler({\n mastra: ctx.mastra,\n requestContext: ctx.requestContext,\n agentId: ctx.agentId,\n executionUrl,\n pushNotifications: true,\n protocolVersion: resolveA2AProtocolVersion(ctx.request),\n });\n return Response.json(card, { headers });\n } catch (error) {\n if (error instanceof MastraA2AError) {\n return Response.json(normalizeError(error, null), { status: 400, headers });\n }\n throw error;\n }\n },\n});\n\nfunction isV1Method(method: string): method is keyof typeof a2aV1MethodMap {\n return Object.hasOwn(a2aV1MethodMap, method);\n}\n\nexport const AGENT_EXECUTION_ROUTE = createRoute({\n method: 'POST',\n path: '/a2a/:agentId',\n responseType: 'datastream-response',\n pathParamSchema: a2aAgentIdPathParams,\n bodySchema: agentExecutionBodySchema,\n responseSchema: agentExecutionResponseSchema,\n summary: 'Execute agent',\n description: 'Executes an agent action via JSON-RPC 2.0 over A2A protocol',\n tags: ['Agent-to-Agent'],\n requiresAuth: true,\n handler: async ({ mastra, agentId, requestContext, taskStore, abortSignal, request, ...bodyParams }) => {\n const { id: requestId } = bodyParams;\n let { method } = bodyParams;\n const params = 'params' in bodyParams ? bodyParams.params : undefined;\n\n let protocolVersion: A2AProtocolVersion;\n try {\n protocolVersion = resolveA2AProtocolVersion(request);\n if (isV1Method(method)) {\n if (protocolVersion !== '1.0') {\n throw MastraA2AError.methodNotFound(method);\n }\n method = a2aV1MethodMap[method];\n }\n } catch (error) {\n return createA2AJsonResponse(normalizeError(error, requestId));\n }\n\n const result = await getAgentExecutionHandler({\n requestId,\n mastra,\n agentId: agentId,\n requestContext,\n method,\n params,\n taskStore: taskStore!,\n abortSignal,\n protocolVersion,\n });\n\n if (method === 'message/stream' || method === 'tasks/resubscribe') {\n return createA2ASSEResponse(result);\n }\n\n return createA2AJsonResponse(result);\n },\n});\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"channels-DMw4LEA-.cjs","names":["z","coreFeatures","HTTPException","getCallerAuthorId","hasAdminBypass","hasScopedPermission","createRoute","handleError"],"sources":["../src/server/schemas/channels.ts","../src/server/handlers/channels.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\n// ============================================================================\n// Path Parameter Schemas\n// ============================================================================\n\nexport const channelPlatformPathParams = z.object({\n platform: z.string().describe('Channel platform identifier (e.g., \"slack\")'),\n});\n\nexport const channelAgentPathParams = z.object({\n platform: z.string().describe('Channel platform identifier (e.g., \"slack\")'),\n agentId: z.string().describe('Agent identifier'),\n});\n\n// ============================================================================\n// Body Parameter Schemas\n// ============================================================================\n\nexport const connectChannelBodySchema = z.object({\n agentId: z.string().describe('Agent identifier to connect'),\n options: z.record(z.string(), z.unknown()).optional().describe('Platform-specific connection options'),\n});\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nconst channelPlatformInfoSchema = z.object({\n id: z.string().describe('Platform identifier'),\n name: z.string().describe('Human-readable platform name'),\n isConfigured: z.boolean().describe('Whether the platform is ready to connect agents'),\n connectOptionsSchema: z.record(z.string(), z.unknown()).optional().describe('JSON Schema for connect options'),\n});\n\nconst channelInstallationInfoSchema = z.object({\n id: z.string().describe('Installation identifier'),\n platform: z.string().describe('Platform identifier'),\n agentId: z.string().describe('Connected agent identifier'),\n status: z.enum(['active', 'pending']).describe('Installation status'),\n displayName: z.string().optional().describe('Platform-specific display name'),\n installedAt: z.coerce.date().optional().describe('Installation timestamp'),\n});\n\nconst channelConnectOAuthSchema = z.object({\n type: z.literal('oauth').describe('OAuth-based connection requiring browser redirect'),\n authorizationUrl: z.string().describe('OAuth authorization URL for user redirect'),\n installationId: z.string().describe('Installation identifier'),\n});\n\nconst channelConnectDeepLinkSchema = z.object({\n type: z.literal('deep_link').describe('Deep-link connection requiring native app interaction'),\n url: z.string().describe('Deep link URL to open in platform app'),\n installationId: z.string().describe('Installation identifier'),\n});\n\nconst channelConnectImmediateSchema = z.object({\n type: z.literal('immediate').describe('Immediate connection with no user interaction needed'),\n installationId: z.string().describe('Installation identifier'),\n});\n\nconst channelConnectResultSchema = z.discriminatedUnion('type', [\n channelConnectOAuthSchema,\n channelConnectDeepLinkSchema,\n channelConnectImmediateSchema,\n]);\n\nexport const listChannelPlatformsResponseSchema = z.array(channelPlatformInfoSchema);\n\nexport const listChannelInstallationsResponseSchema = z.array(channelInstallationInfoSchema);\n\nexport const connectChannelResponseSchema = channelConnectResultSchema;\n\nexport const disconnectChannelResponseSchema = z.object({\n success: z.boolean(),\n});\n","import type { Mastra } from '@mastra/core';\nimport type { ChannelProvider } from '@mastra/core/channels';\nimport type { RequestContext } from '@mastra/core/di';\nimport { coreFeatures } from '@mastra/core/features';\n\nimport { MASTRA_USER_KEY } from '../constants';\nimport { HTTPException } from '../http-exception';\nimport {\n channelPlatformPathParams,\n channelAgentPathParams,\n connectChannelBodySchema,\n listChannelPlatformsResponseSchema,\n listChannelInstallationsResponseSchema,\n connectChannelResponseSchema,\n disconnectChannelResponseSchema,\n} from '../schemas/channels';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { assertWriteAccess, getCallerAuthorId, hasAdminBypass, hasScopedPermission } from './authorship';\nimport { handleError } from './error';\n\n// ============================================================================\n// Feature gate + helpers\n// ============================================================================\n\nfunction assertChannelsAvailable(): void {\n if (!coreFeatures.has('channels')) {\n throw new HTTPException(501, { message: 'Channels require a newer version of @mastra/core' });\n }\n}\n\nfunction getChannelOrThrow(mastra: Mastra, platform: string): ChannelProvider {\n const channels = Object.values(mastra.channels ?? {});\n const channel = channels.find(c => c.id === platform);\n if (!channel) {\n const available = channels.map(c => c.id).join(', ');\n throw new HTTPException(404, {\n message: `Channel \"${platform}\" is not registered. Available: ${available || 'none'}`,\n });\n }\n return channel;\n}\n\n/**\n * Unified connect/disconnect authorization.\n *\n * - Stored agent exists → same write access as editing the agent record.\n * - Code-defined agent (no stored record) → route's `requiresAuth` is the gate.\n * - Agent doesn't exist anywhere:\n * - connect → 404 (can't connect a channel to a non-existent agent)\n * - disconnect → orphan cleanup, gated on `channels:write`\n */\nasync function assertChannelAgentWriteAccess(\n mastra: Mastra,\n requestContext: RequestContext,\n agentId: string,\n action: 'connect' | 'disconnect',\n): Promise<void> {\n const storage = mastra.getStorage();\n const agentsStore = storage ? await storage.getStore('agents') : null;\n const stored = agentsStore ? await agentsStore.getById(agentId) : null;\n\n if (stored) {\n assertWriteAccess({\n requestContext,\n resource: 'agents',\n resourceId: agentId,\n action: 'edit',\n record: stored,\n });\n return;\n }\n\n // Not in stored-agents (or storage doesn't support it). Check the runtime\n // registry for a code-defined agent.\n const codeDefined = mastra.getAgentById(agentId);\n if (codeDefined) {\n // Code-defined agents have no owner/ACL — route's requiresAuth /\n // requiresPermission is the gate. Pass-through.\n return;\n }\n\n if (action === 'connect') {\n throw new HTTPException(404, { message: `Agent \"${agentId}\" not found` });\n }\n\n // Disconnect against an unknown agentId = orphan cleanup (stored agent was\n // deleted but the channel installation row is still around). Allow it, but\n // gate on channels:write so this isn't an \"any authenticated user\" backdoor.\n // Follow the same no-auth-configured pass-through as assertWriteAccess.\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return;\n if (hasAdminBypass(requestContext, 'channels')) return;\n if (hasScopedPermission({ requestContext, resource: 'channels', action: 'write' })) return;\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /channels/platforms - List available channel platforms\n */\nexport const LIST_CHANNEL_PLATFORMS_ROUTE = createRoute({\n method: 'GET',\n path: '/channels/platforms',\n responseType: 'json',\n responseSchema: listChannelPlatformsResponseSchema,\n summary: 'List channel platforms',\n description: 'Returns available channel platforms and their configuration status',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n assertChannelsAvailable();\n try {\n const channels = Object.values(mastra.channels ?? {});\n return channels.map(channel => {\n if (channel.getInfo) {\n return channel.getInfo();\n }\n return {\n id: channel.id,\n name: channel.id.charAt(0).toUpperCase() + channel.id.slice(1),\n isConfigured: true,\n };\n });\n } catch (error) {\n return handleError(error, 'Error listing channel platforms');\n }\n },\n});\n\n/**\n * GET /channels/:platform/installations - List installations for a platform\n */\nexport const LIST_CHANNEL_INSTALLATIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/channels/:platform/installations',\n responseType: 'json',\n pathParamSchema: channelPlatformPathParams,\n responseSchema: listChannelInstallationsResponseSchema,\n summary: 'List channel installations',\n description: 'Returns all active and pending installations for a channel platform',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra, platform }) => {\n assertChannelsAvailable();\n try {\n const channel = getChannelOrThrow(mastra, platform);\n\n if (!channel.listInstallations) {\n return [];\n }\n\n return await channel.listInstallations();\n } catch (error) {\n return handleError(error, 'Error listing channel installations');\n }\n },\n});\n\n/**\n * POST /channels/:platform/connect - Connect an agent to a platform\n */\nexport const CONNECT_CHANNEL_ROUTE = createRoute({\n method: 'POST',\n path: '/channels/:platform/connect',\n responseType: 'json',\n pathParamSchema: channelPlatformPathParams,\n bodySchema: connectChannelBodySchema,\n responseSchema: connectChannelResponseSchema,\n summary: 'Connect agent to channel',\n description: 'Creates a platform app for the agent and returns an OAuth authorization URL',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, platform, agentId, options }) => {\n assertChannelsAvailable();\n try {\n const channel = getChannelOrThrow(mastra, platform);\n\n if (!channel.connect) {\n throw new HTTPException(400, {\n message: `Channel \"${platform}\" does not support programmatic connection`,\n });\n }\n\n await assertChannelAgentWriteAccess(mastra, requestContext, agentId, 'connect');\n\n return await channel.connect(agentId, options);\n } catch (error) {\n return handleError(error, 'Error connecting agent to channel');\n }\n },\n});\n\n/**\n * POST /channels/:platform/:agentId/disconnect - Disconnect an agent from a platform\n */\nexport const DISCONNECT_CHANNEL_ROUTE = createRoute({\n method: 'POST',\n path: '/channels/:platform/:agentId/disconnect',\n responseType: 'json',\n pathParamSchema: channelAgentPathParams,\n responseSchema: disconnectChannelResponseSchema,\n summary: 'Disconnect agent from channel',\n description: 'Deletes the platform app and cleans up the installation',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, platform, agentId }) => {\n assertChannelsAvailable();\n try {\n const channel = getChannelOrThrow(mastra, platform);\n\n if (!channel.disconnect) {\n throw new HTTPException(400, {\n message: `Channel \"${platform}\" does not support programmatic disconnection`,\n });\n }\n\n await assertChannelAgentWriteAccess(mastra, requestContext, agentId, 'disconnect');\n\n await channel.disconnect(agentId);\n return { success: true };\n } catch (error) {\n return handleError(error, 'Error disconnecting agent from channel');\n }\n },\n});\n"],"mappings":";;;;;;;;AAMA,MAAa,4BAA4BA,OAAAA,EAAE,OAAO,EAChD,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,+CAA6C,EAC7E,CAAC;AAED,MAAa,yBAAyBA,OAAAA,EAAE,OAAO;CAC7C,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,+CAA6C;CAC3E,SAASA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,kBAAkB;AACjD,CAAC;AAMD,MAAa,2BAA2BA,OAAAA,EAAE,OAAO;CAC/C,SAASA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,6BAA6B;CAC1D,SAASA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,sCAAsC;AACvG,CAAC;AAMD,MAAM,4BAA4BA,OAAAA,EAAE,OAAO;CACzC,IAAIA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,qBAAqB;CAC7C,MAAMA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,8BAA8B;CACxD,cAAcA,OAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS,iDAAiD;CACpF,sBAAsBA,OAAAA,EAAE,OAAOA,OAAAA,EAAE,OAAO,GAAGA,OAAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,iCAAiC;AAC/G,CAAC;AAED,MAAM,gCAAgCA,OAAAA,EAAE,OAAO;CAC7C,IAAIA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,yBAAyB;CACjD,UAAUA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,qBAAqB;CACnD,SAASA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,4BAA4B;CACzD,QAAQA,OAAAA,EAAE,KAAK,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC,SAAS,qBAAqB;CACpE,aAAaA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,gCAAgC;CAC5E,aAAaA,OAAAA,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,wBAAwB;AAC3E,CAAC;AAED,MAAM,4BAA4BA,OAAAA,EAAE,OAAO;CACzC,MAAMA,OAAAA,EAAE,QAAQ,OAAO,CAAC,CAAC,SAAS,mDAAmD;CACrF,kBAAkBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,2CAA2C;CACjF,gBAAgBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,yBAAyB;AAC/D,CAAC;AAED,MAAM,+BAA+BA,OAAAA,EAAE,OAAO;CAC5C,MAAMA,OAAAA,EAAE,QAAQ,WAAW,CAAC,CAAC,SAAS,uDAAuD;CAC7F,KAAKA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,uCAAuC;CAChE,gBAAgBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,yBAAyB;AAC/D,CAAC;AAED,MAAM,gCAAgCA,OAAAA,EAAE,OAAO;CAC7C,MAAMA,OAAAA,EAAE,QAAQ,WAAW,CAAC,CAAC,SAAS,sDAAsD;CAC5F,gBAAgBA,OAAAA,EAAE,OAAO,CAAC,CAAC,SAAS,yBAAyB;AAC/D,CAAC;AAED,MAAM,6BAA6BA,OAAAA,EAAE,mBAAmB,QAAQ;CAC9D;CACA;CACA;AACF,CAAC;AAED,MAAa,qCAAqCA,OAAAA,EAAE,MAAM,yBAAyB;AAEnF,MAAa,yCAAyCA,OAAAA,EAAE,MAAM,6BAA6B;AAE3F,MAAa,+BAA+B;AAE5C,MAAa,kCAAkCA,OAAAA,EAAE,OAAO,EACtD,SAASA,OAAAA,EAAE,QAAQ,EACrB,CAAC;;;AClDD,SAAS,0BAAgC;CACvC,IAAI,CAACC,sBAAAA,aAAa,IAAI,UAAU,GAC9B,MAAM,IAAIC,uBAAAA,cAAc,KAAK,EAAE,SAAS,mDAAmD,CAAC;AAEhG;AAEA,SAAS,kBAAkB,QAAgB,UAAmC;CAC5E,MAAM,WAAW,OAAO,OAAO,OAAO,YAAY,CAAC,CAAC;CACpD,MAAM,UAAU,SAAS,MAAK,MAAK,EAAE,OAAO,QAAQ;CACpD,IAAI,CAAC,SAEH,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAC3B,SAAS,YAAY,SAAS,kCAFd,SAAS,KAAI,MAAK,EAAE,EAAE,CAAC,CAAC,KAAK,IAE2B,KAAK,SAC/E,CAAC;CAEH,OAAO;AACT;;;;;;;;;;AAWA,eAAe,8BACb,QACA,gBACA,SACA,QACe;CACf,MAAM,UAAU,OAAO,WAAW;CAClC,MAAM,cAAc,UAAU,MAAM,QAAQ,SAAS,QAAQ,IAAI;CACjE,MAAM,SAAS,cAAc,MAAM,YAAY,QAAQ,OAAO,IAAI;CAElE,IAAI,QAAQ;EACV,mCAAA,kBAAkB;GAChB;GACA,UAAU;GACV,YAAY;GACZ,QAAQ;GACR,QAAQ;EACV,CAAC;EACD;CACF;CAKA,IADoB,OAAO,aAAa,OAC1B,GAGZ;CAGF,IAAI,WAAW,WACb,MAAM,IAAIA,uBAAAA,cAAc,KAAK,EAAE,SAAS,UAAU,QAAQ,aAAa,CAAC;CAQ1E,IAAI,CADmBC,mCAAAA,kBAAkB,cACvB,KAAK,CAAC,eAAe,IAAA,cAAmB,GAAG;CAC7D,IAAIC,mCAAAA,eAAe,gBAAgB,UAAU,GAAG;CAChD,IAAIC,mCAAAA,oBAAoB;EAAE;EAAgB,UAAU;EAAY,QAAQ;CAAQ,CAAC,GAAG;CAEpF,MAAM,IAAIH,uBAAAA,cAAc,KAAK,EAAE,SAAS,YAAY,CAAC;AACvD;;;;AASA,MAAa,+BAA+BI,sBAAAA,YAAY;CACtD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,UAAU;CACjB,cAAc;CACd,SAAS,OAAO,EAAE,aAAa;EAC7B,wBAAwB;EACxB,IAAI;GAEF,OADiB,OAAO,OAAO,OAAO,YAAY,CAAC,CACrC,CAAC,CAAC,KAAI,YAAW;IAC7B,IAAI,QAAQ,SACV,OAAO,QAAQ,QAAQ;IAEzB,OAAO;KACL,IAAI,QAAQ;KACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,QAAQ,GAAG,MAAM,CAAC;KAC7D,cAAc;IAChB;GACF,CAAC;EACH,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,iCAAiC;EAC7D;CACF;AACF,CAAC;;;;AAKD,MAAa,mCAAmCD,sBAAAA,YAAY;CAC1D,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,UAAU;CACjB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,eAAe;EACvC,wBAAwB;EACxB,IAAI;GACF,MAAM,UAAU,kBAAkB,QAAQ,QAAQ;GAElD,IAAI,CAAC,QAAQ,mBACX,OAAO,CAAC;GAGV,OAAO,MAAM,QAAQ,kBAAkB;EACzC,SAAS,OAAO;GACd,OAAOC,8BAAAA,YAAY,OAAO,qCAAqC;EACjE;CACF;AACF,CAAC;;;;AAKD,MAAa,wBAAwBD,sBAAAA,YAAY;CAC/C,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,UAAU;CACjB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,gBAAgB,UAAU,SAAS,cAAc;EACzE,wBAAwB;EACxB,IAAI;GACF,MAAM,UAAU,kBAAkB,QAAQ,QAAQ;GAElD,IAAI,CAAC,QAAQ,SACX,MAAM,IAAIJ,uBAAAA,cAAc,KAAK,EAC3B,SAAS,YAAY,SAAS,4CAChC,CAAC;GAGH,MAAM,8BAA8B,QAAQ,gBAAgB,SAAS,SAAS;GAE9E,OAAO,MAAM,QAAQ,QAAQ,SAAS,OAAO;EAC/C,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,mCAAmC;EAC/D;CACF;AACF,CAAC;;;;AAKD,MAAa,2BAA2BD,sBAAAA,YAAY;CAClD,QAAQ;CACR,MAAM;CACN,cAAc;CACd,iBAAiB;CACjB,gBAAgB;CAChB,SAAS;CACT,aAAa;CACb,MAAM,CAAC,UAAU;CACjB,cAAc;CACd,SAAS,OAAO,EAAE,QAAQ,gBAAgB,UAAU,cAAc;EAChE,wBAAwB;EACxB,IAAI;GACF,MAAM,UAAU,kBAAkB,QAAQ,QAAQ;GAElD,IAAI,CAAC,QAAQ,YACX,MAAM,IAAIJ,uBAAAA,cAAc,KAAK,EAC3B,SAAS,YAAY,SAAS,+CAChC,CAAC;GAGH,MAAM,8BAA8B,QAAQ,gBAAgB,SAAS,YAAY;GAEjF,MAAM,QAAQ,WAAW,OAAO;GAChC,OAAO,EAAE,SAAS,KAAK;EACzB,SAAS,OAAO;GACd,OAAOK,8BAAAA,YAAY,OAAO,wCAAwC;EACpE;CACF;AACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"channels-xqChW6Vw.js","names":[],"sources":["../src/server/schemas/channels.ts","../src/server/handlers/channels.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\n// ============================================================================\n// Path Parameter Schemas\n// ============================================================================\n\nexport const channelPlatformPathParams = z.object({\n platform: z.string().describe('Channel platform identifier (e.g., \"slack\")'),\n});\n\nexport const channelAgentPathParams = z.object({\n platform: z.string().describe('Channel platform identifier (e.g., \"slack\")'),\n agentId: z.string().describe('Agent identifier'),\n});\n\n// ============================================================================\n// Body Parameter Schemas\n// ============================================================================\n\nexport const connectChannelBodySchema = z.object({\n agentId: z.string().describe('Agent identifier to connect'),\n options: z.record(z.string(), z.unknown()).optional().describe('Platform-specific connection options'),\n});\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nconst channelPlatformInfoSchema = z.object({\n id: z.string().describe('Platform identifier'),\n name: z.string().describe('Human-readable platform name'),\n isConfigured: z.boolean().describe('Whether the platform is ready to connect agents'),\n connectOptionsSchema: z.record(z.string(), z.unknown()).optional().describe('JSON Schema for connect options'),\n});\n\nconst channelInstallationInfoSchema = z.object({\n id: z.string().describe('Installation identifier'),\n platform: z.string().describe('Platform identifier'),\n agentId: z.string().describe('Connected agent identifier'),\n status: z.enum(['active', 'pending']).describe('Installation status'),\n displayName: z.string().optional().describe('Platform-specific display name'),\n installedAt: z.coerce.date().optional().describe('Installation timestamp'),\n});\n\nconst channelConnectOAuthSchema = z.object({\n type: z.literal('oauth').describe('OAuth-based connection requiring browser redirect'),\n authorizationUrl: z.string().describe('OAuth authorization URL for user redirect'),\n installationId: z.string().describe('Installation identifier'),\n});\n\nconst channelConnectDeepLinkSchema = z.object({\n type: z.literal('deep_link').describe('Deep-link connection requiring native app interaction'),\n url: z.string().describe('Deep link URL to open in platform app'),\n installationId: z.string().describe('Installation identifier'),\n});\n\nconst channelConnectImmediateSchema = z.object({\n type: z.literal('immediate').describe('Immediate connection with no user interaction needed'),\n installationId: z.string().describe('Installation identifier'),\n});\n\nconst channelConnectResultSchema = z.discriminatedUnion('type', [\n channelConnectOAuthSchema,\n channelConnectDeepLinkSchema,\n channelConnectImmediateSchema,\n]);\n\nexport const listChannelPlatformsResponseSchema = z.array(channelPlatformInfoSchema);\n\nexport const listChannelInstallationsResponseSchema = z.array(channelInstallationInfoSchema);\n\nexport const connectChannelResponseSchema = channelConnectResultSchema;\n\nexport const disconnectChannelResponseSchema = z.object({\n success: z.boolean(),\n});\n","import type { Mastra } from '@mastra/core';\nimport type { ChannelProvider } from '@mastra/core/channels';\nimport type { RequestContext } from '@mastra/core/di';\nimport { coreFeatures } from '@mastra/core/features';\n\nimport { MASTRA_USER_KEY } from '../constants';\nimport { HTTPException } from '../http-exception';\nimport {\n channelPlatformPathParams,\n channelAgentPathParams,\n connectChannelBodySchema,\n listChannelPlatformsResponseSchema,\n listChannelInstallationsResponseSchema,\n connectChannelResponseSchema,\n disconnectChannelResponseSchema,\n} from '../schemas/channels';\nimport { createRoute } from '../server-adapter/routes/route-builder';\n\nimport { assertWriteAccess, getCallerAuthorId, hasAdminBypass, hasScopedPermission } from './authorship';\nimport { handleError } from './error';\n\n// ============================================================================\n// Feature gate + helpers\n// ============================================================================\n\nfunction assertChannelsAvailable(): void {\n if (!coreFeatures.has('channels')) {\n throw new HTTPException(501, { message: 'Channels require a newer version of @mastra/core' });\n }\n}\n\nfunction getChannelOrThrow(mastra: Mastra, platform: string): ChannelProvider {\n const channels = Object.values(mastra.channels ?? {});\n const channel = channels.find(c => c.id === platform);\n if (!channel) {\n const available = channels.map(c => c.id).join(', ');\n throw new HTTPException(404, {\n message: `Channel \"${platform}\" is not registered. Available: ${available || 'none'}`,\n });\n }\n return channel;\n}\n\n/**\n * Unified connect/disconnect authorization.\n *\n * - Stored agent exists → same write access as editing the agent record.\n * - Code-defined agent (no stored record) → route's `requiresAuth` is the gate.\n * - Agent doesn't exist anywhere:\n * - connect → 404 (can't connect a channel to a non-existent agent)\n * - disconnect → orphan cleanup, gated on `channels:write`\n */\nasync function assertChannelAgentWriteAccess(\n mastra: Mastra,\n requestContext: RequestContext,\n agentId: string,\n action: 'connect' | 'disconnect',\n): Promise<void> {\n const storage = mastra.getStorage();\n const agentsStore = storage ? await storage.getStore('agents') : null;\n const stored = agentsStore ? await agentsStore.getById(agentId) : null;\n\n if (stored) {\n assertWriteAccess({\n requestContext,\n resource: 'agents',\n resourceId: agentId,\n action: 'edit',\n record: stored,\n });\n return;\n }\n\n // Not in stored-agents (or storage doesn't support it). Check the runtime\n // registry for a code-defined agent.\n const codeDefined = mastra.getAgentById(agentId);\n if (codeDefined) {\n // Code-defined agents have no owner/ACL — route's requiresAuth /\n // requiresPermission is the gate. Pass-through.\n return;\n }\n\n if (action === 'connect') {\n throw new HTTPException(404, { message: `Agent \"${agentId}\" not found` });\n }\n\n // Disconnect against an unknown agentId = orphan cleanup (stored agent was\n // deleted but the channel installation row is still around). Allow it, but\n // gate on channels:write so this isn't an \"any authenticated user\" backdoor.\n // Follow the same no-auth-configured pass-through as assertWriteAccess.\n const callerAuthorId = getCallerAuthorId(requestContext);\n if (!callerAuthorId && !requestContext.get(MASTRA_USER_KEY)) return;\n if (hasAdminBypass(requestContext, 'channels')) return;\n if (hasScopedPermission({ requestContext, resource: 'channels', action: 'write' })) return;\n\n throw new HTTPException(404, { message: 'Not found' });\n}\n\n// ============================================================================\n// Route Definitions\n// ============================================================================\n\n/**\n * GET /channels/platforms - List available channel platforms\n */\nexport const LIST_CHANNEL_PLATFORMS_ROUTE = createRoute({\n method: 'GET',\n path: '/channels/platforms',\n responseType: 'json',\n responseSchema: listChannelPlatformsResponseSchema,\n summary: 'List channel platforms',\n description: 'Returns available channel platforms and their configuration status',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra }) => {\n assertChannelsAvailable();\n try {\n const channels = Object.values(mastra.channels ?? {});\n return channels.map(channel => {\n if (channel.getInfo) {\n return channel.getInfo();\n }\n return {\n id: channel.id,\n name: channel.id.charAt(0).toUpperCase() + channel.id.slice(1),\n isConfigured: true,\n };\n });\n } catch (error) {\n return handleError(error, 'Error listing channel platforms');\n }\n },\n});\n\n/**\n * GET /channels/:platform/installations - List installations for a platform\n */\nexport const LIST_CHANNEL_INSTALLATIONS_ROUTE = createRoute({\n method: 'GET',\n path: '/channels/:platform/installations',\n responseType: 'json',\n pathParamSchema: channelPlatformPathParams,\n responseSchema: listChannelInstallationsResponseSchema,\n summary: 'List channel installations',\n description: 'Returns all active and pending installations for a channel platform',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra, platform }) => {\n assertChannelsAvailable();\n try {\n const channel = getChannelOrThrow(mastra, platform);\n\n if (!channel.listInstallations) {\n return [];\n }\n\n return await channel.listInstallations();\n } catch (error) {\n return handleError(error, 'Error listing channel installations');\n }\n },\n});\n\n/**\n * POST /channels/:platform/connect - Connect an agent to a platform\n */\nexport const CONNECT_CHANNEL_ROUTE = createRoute({\n method: 'POST',\n path: '/channels/:platform/connect',\n responseType: 'json',\n pathParamSchema: channelPlatformPathParams,\n bodySchema: connectChannelBodySchema,\n responseSchema: connectChannelResponseSchema,\n summary: 'Connect agent to channel',\n description: 'Creates a platform app for the agent and returns an OAuth authorization URL',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, platform, agentId, options }) => {\n assertChannelsAvailable();\n try {\n const channel = getChannelOrThrow(mastra, platform);\n\n if (!channel.connect) {\n throw new HTTPException(400, {\n message: `Channel \"${platform}\" does not support programmatic connection`,\n });\n }\n\n await assertChannelAgentWriteAccess(mastra, requestContext, agentId, 'connect');\n\n return await channel.connect(agentId, options);\n } catch (error) {\n return handleError(error, 'Error connecting agent to channel');\n }\n },\n});\n\n/**\n * POST /channels/:platform/:agentId/disconnect - Disconnect an agent from a platform\n */\nexport const DISCONNECT_CHANNEL_ROUTE = createRoute({\n method: 'POST',\n path: '/channels/:platform/:agentId/disconnect',\n responseType: 'json',\n pathParamSchema: channelAgentPathParams,\n responseSchema: disconnectChannelResponseSchema,\n summary: 'Disconnect agent from channel',\n description: 'Deletes the platform app and cleans up the installation',\n tags: ['Channels'],\n requiresAuth: true,\n handler: async ({ mastra, requestContext, platform, agentId }) => {\n assertChannelsAvailable();\n try {\n const channel = getChannelOrThrow(mastra, platform);\n\n if (!channel.disconnect) {\n throw new HTTPException(400, {\n message: `Channel \"${platform}\" does not support programmatic disconnection`,\n });\n }\n\n await assertChannelAgentWriteAccess(mastra, requestContext, agentId, 'disconnect');\n\n await channel.disconnect(agentId);\n return { success: true };\n } catch (error) {\n return handleError(error, 'Error disconnecting agent from channel');\n }\n },\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"editor-builder-BrkDnCEd.js","names":[],"sources":["../src/server/utils/resolve-builder-model-policy.ts","../src/server/handlers/editor-builder.ts"],"sourcesContent":["import type { BuilderModelPolicy } from '@mastra/core/agent-builder/ee';\nimport type { IMastraEditor } from '@mastra/core/editor';\n\n/**\n * Server-side wrapper around `builderToModelPolicy`.\n *\n * Handles the optional `IMastraEditor` builder API surface (older / OSS editors\n * may not implement `hasEnabledBuilderConfig` / `resolveBuilder`) and returns\n * a uniform `BuilderModelPolicy` to every call site.\n *\n * Returns `{ active: false }` whenever:\n * - no editor is configured,\n * - the editor doesn't expose builder methods,\n * - the builder config is disabled, or\n * - resolving the builder fails / yields nothing.\n *\n * The `@mastra/core/agent-builder/ee` subpath is loaded lazily so this module\n * remains importable on `@mastra/core` versions that pre-date the subpath\n * (the subpath was added in core 1.34.0). The dynamic import is only reached\n * once an editor is actually configured, by which point a compatible core is\n * guaranteed.\n */\nexport async function resolveBuilderModelPolicy(editor: IMastraEditor | undefined): Promise<BuilderModelPolicy> {\n if (!editor) return { active: false };\n if (typeof editor.resolveBuilder !== 'function') return { active: false };\n if (typeof editor.hasEnabledBuilderConfig === 'function' && !editor.hasEnabledBuilderConfig()) {\n return { active: false };\n }\n\n // Degrade to inactive on builder-resolution failure rather than letting the\n // rejection escape: agent execution routes seed this on every request, so a\n // transient failure must not 500 the entire route.\n try {\n const builder = await editor.resolveBuilder();\n const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');\n return builderToModelPolicy(builder);\n } catch {\n return { active: false };\n }\n}\n","import type { Mastra } from '@mastra/core';\n\nimport { HTTPException } from '../http-exception';\nimport {\n agentFeaturesSchema,\n builderAvailableModelsResponseSchema,\n builderSettingsResponseSchema,\n infrastructureStatusResponseSchema,\n} from '../schemas/editor-builder';\nimport type { AgentFeatures, InfrastructureStatus } from '../schemas/editor-builder';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { resolveBuilderModelPolicy } from '../utils/resolve-builder-model-policy';\nimport { buildProvidersList } from './agents';\nimport { handleError } from './error';\n\n/**\n * Resolve the active builder feature flags. Returns `null` when the editor is\n * absent, the builder is disabled, or no features are configured.\n */\nasync function resolveBuilderFeatures(mastra: Mastra): Promise<AgentFeatures | null> {\n const editor = mastra.getEditor();\n if (!editor || typeof editor.resolveBuilder !== 'function') return null;\n if (!editor.hasEnabledBuilderConfig?.()) return null;\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) return null;\n const features = builder.getFeatures?.()?.agent;\n if (!features) return null;\n // Validate the shape so unknown keys cannot smuggle through.\n const parsed = agentFeaturesSchema.safeParse(features);\n return parsed.success ? parsed.data : null;\n}\n\n/**\n * Returns whether a given agent-builder feature is enabled. Used by list /\n * get-by-id handlers to soft-gate response enrichment (omit fields, ignore\n * favoritedOnly / pinFavoritedFor params) when the feature is off.\n */\nexport async function isBuilderFeatureEnabled(mastra: Mastra, feature: keyof AgentFeatures): Promise<boolean> {\n const features = await resolveBuilderFeatures(mastra);\n return features?.[feature] === true;\n}\n\n/**\n * Hard-gate helper for mutation routes that must not exist when the feature\n * is off. Throws `HTTPException(404)` so we don't leak the existence of the\n * feature surface (matches behavior of unregistered routes).\n */\nexport async function requireBuilderFeature(mastra: Mastra, feature: keyof AgentFeatures): Promise<void> {\n if (!(await isBuilderFeatureEnabled(mastra, feature))) {\n throw new HTTPException(404, { message: 'Not Found' });\n }\n}\n\n/**\n * GET /editor/builder/settings\n *\n * Returns the agent builder settings configured by the admin.\n * Used by frontend to determine which features to display.\n */\nexport const GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/settings',\n responseType: 'json',\n responseSchema: builderSettingsResponseSchema,\n summary: 'Get agent builder settings',\n description: 'Returns the agent builder feature flags and configuration for UI gating',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n const editor = mastra.getEditor();\n\n // No editor configured\n if (!editor) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Editor doesn't support builder (older version or OSS)\n if (typeof editor.resolveBuilder !== 'function') {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Check if builder is enabled in config\n if (!editor.hasEnabledBuilderConfig?.()) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Resolve the builder instance\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];\n const configuration = builder.getConfiguration();\n\n // Picker allowlists are written against entity `.id` (what users see in\n // the UI, URLs, traces). The client filters list responses by their\n // response keys, which are not always `.id`:\n // - GET /agents keys by `agent.id`\n // - GET /tools keys by registration key (values include `id`)\n // - GET /workflows keys by registration key (values omit `id`)\n // To keep the client filter simple, we accept `.id` (fallback to\n // registration key) for matching, but emit visible IDs as response keys\n // so `Object.keys(data)` lines up.\n type AliasPair = { id: string; key: string };\n const collectAliases = (registry: Record<string, unknown>): AliasPair[] =>\n Object.entries(registry).map(([key, entity]) => ({\n id: (entity as { id?: string }).id || key,\n key,\n }));\n\n const toolAliases = collectAliases(mastra.listTools() ?? {});\n const agentAliases = collectAliases(mastra.listAgents() ?? {});\n const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});\n\n // Tools/workflows responses are keyed by registration key. Agents\n // response is keyed by `.id`.\n const toResponseKey = (aliases: AliasPair[], byId: 'id' | 'key') => {\n const map = new Map<string, string>();\n for (const a of aliases) {\n map.set(a.id, byId === 'id' ? a.id : a.key);\n map.set(a.key, byId === 'id' ? a.id : a.key);\n }\n return map;\n };\n const toolKeyMap = toResponseKey(toolAliases, 'key');\n const agentKeyMap = toResponseKey(agentAliases, 'id');\n const workflowKeyMap = toResponseKey(workflowAliases, 'key');\n\n // Lazy-load the EE subpath so this module remains importable on\n // `@mastra/core` versions that pre-date it (added in core 1.34.0).\n // We only reach here after `builder.enabled` is true, which guarantees\n // a compatible core.\n const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');\n\n const picker = resolvePickerVisibility({\n config: configuration?.agent,\n registeredToolIds: toolAliases.flatMap(a => [a.id, a.key]),\n registeredAgentIds: agentAliases.flatMap(a => [a.id, a.key]),\n registeredWorkflowIds: workflowAliases.flatMap(a => [a.id, a.key]),\n });\n\n const normalize = (visible: string[] | null, map: Map<string, string>): string[] | null => {\n if (visible === null) return null;\n const out: string[] = [];\n const seen = new Set<string>();\n for (const id of visible) {\n const mapped = map.get(id);\n if (mapped && !seen.has(mapped)) {\n seen.add(mapped);\n out.push(mapped);\n }\n }\n return out;\n };\n\n const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];\n\n return {\n enabled: true,\n features: builder.getFeatures(),\n configuration,\n modelPolicy: builderToModelPolicy(builder),\n picker: {\n visibleTools: normalize(picker.visibleTools, toolKeyMap),\n visibleAgents: normalize(picker.visibleAgents, agentKeyMap),\n visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap),\n },\n ...(modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}),\n };\n } catch (error) {\n return handleError(error, 'Error getting builder settings');\n }\n },\n});\n\n/**\n * GET /editor/builder/models/available\n *\n * Returns the configured AI providers/models the agent builder may use. The\n * server is the single authority: it scopes the list to providers with a\n * configured API key (`connected`) and applies the active builder model\n * policy via `isModelAllowed`, so the Studio surfaces can render the response\n * verbatim without importing any EE matcher into the browser.\n *\n * - Providers without a configured API key are always omitted — the builder\n * decides the agent's model from this list, so an unconnected provider would\n * produce an agent that can never run.\n * - Policy inactive (or no allowlist) ⇒ all connected providers are returned.\n * - Policy active with an allowlist ⇒ each connected provider's models are\n * filtered, and providers left with no allowed models are omitted entirely.\n */\nexport const GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/models/available',\n responseType: 'json',\n responseSchema: builderAvailableModelsResponseSchema,\n summary: 'List builder-available AI models',\n description: 'Returns AI providers/models filtered by the active agent-builder model policy.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n // Only surface providers whose API key is configured (`connected`). The\n // agent builder decides the agent's model from this list, so including\n // providers without a key lets it pick a model that can never run. We\n // scope to connected providers so every choice is actually usable.\n const providers = (await buildProvidersList(mastra)).filter(provider => provider.connected);\n const policy = await resolveBuilderModelPolicy(mastra.getEditor());\n\n // Inactive policy (or no allowlist) ⇒ no allowlist filtering to apply.\n if (!policy.active || !policy.allowed || policy.allowed.length === 0) {\n return { providers };\n }\n\n // Lazy-load the EE matcher (server-only); mirrors the convention used by\n // resolve-builder-model-policy and the settings handler.\n const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');\n\n const filtered = providers\n .map(provider => ({\n ...provider,\n models: provider.models.filter(modelId => isModelAllowed(policy.allowed, { provider: provider.id, modelId })),\n }))\n .filter(provider => provider.models.length > 0);\n\n return { providers: filtered };\n } catch (error) {\n return handleError(error, 'Error fetching available models');\n }\n },\n});\n\n/**\n * GET /editor/builder/infrastructure\n *\n * Returns the runtime status of Mastra-opinionated primitives (channels,\n * browser providers, workspaces). Admin-only; surfaced in Studio Settings so\n * admins can sanity-check what's wired up to the running server.\n */\nexport const GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/infrastructure',\n responseType: 'json',\n responseSchema: infrastructureStatusResponseSchema,\n summary: 'Get infrastructure status',\n description: 'Agent Builder infrastructure configuration and lightweight runtime status.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'infrastructure:read',\n handler: async ({ mastra }) => {\n try {\n const formatConfigValue = (value: unknown): string => {\n if (value === null || value === undefined) return 'not set';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? '' : 's'}`;\n return value.constructor?.name && value.constructor.name !== 'Object' ? value.constructor.name : 'configured';\n };\n\n const getProviderName = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'object' && 'provider' in value && typeof value.provider === 'string')\n return value.provider;\n if (typeof value === 'object' && 'constructor' in value) {\n const name = (value as { constructor?: { name?: string } }).constructor?.name;\n return name && name !== 'Object' ? name : 'configured';\n }\n return null;\n };\n\n const getConfigEntries = (config: Record<string, unknown>, omittedKeys: string[] = []) =>\n Object.entries(config)\n .filter(([key, value]) => !omittedKeys.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => ({ key, value: formatConfigValue(value) }));\n\n const channelProviders = mastra.getChannelProviders() ?? {};\n const channels: InfrastructureStatus['channels'] = {\n providers: Object.entries(channelProviders)\n .map(([id, provider]) => {\n const info = provider.getInfo?.();\n const routes = provider.getRoutes?.() ?? [];\n return {\n id: info?.id ?? id,\n name: info?.name ?? id,\n isConfigured: info?.isConfigured ?? false,\n routeCount: routes.length,\n };\n })\n .filter(provider => provider.isConfigured),\n };\n\n const editor = mastra.getEditor();\n let browser: InfrastructureStatus['browser'] = {\n type: null,\n provider: null,\n env: null,\n registered: false,\n availableProviders: [],\n config: [],\n };\n let workspace: InfrastructureStatus['workspace'] = {\n type: null,\n workspaceId: null,\n name: null,\n source: null,\n registered: false,\n hasFilesystem: false,\n hasSandbox: false,\n filesystemProvider: null,\n sandboxProvider: null,\n config: [],\n };\n let registries: InfrastructureStatus['registries'] = {\n skillsSh: { enabled: false },\n };\n\n if (editor?.resolveBuilder) {\n const browsers = (editor as unknown as { __browsers?: Map<string, unknown> }).__browsers;\n const builder = await editor.resolveBuilder();\n const builderRegistries = builder?.getRegistries?.();\n registries = {\n skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true },\n };\n const configuration = builder?.getConfiguration?.()?.agent as\n | {\n browser?: { type?: string; config?: { provider?: string; env?: string } };\n workspace?: {\n type?: string;\n workspaceId?: string;\n config?: { name?: string; filesystem?: unknown; sandbox?: unknown };\n };\n }\n | undefined;\n\n const browserRef = configuration?.browser;\n const browserConfig = browserRef?.config ?? {};\n const providerId = browserConfig.provider ?? null;\n browser = {\n type: browserRef?.type ?? null,\n provider: providerId,\n env: browserConfig.env ?? null,\n registered: providerId ? !!browsers?.has(providerId) : false,\n availableProviders: browsers ? Array.from(browsers.keys()) : [],\n config: getConfigEntries(browserConfig, ['provider', 'env']),\n };\n\n const workspaceRef = configuration?.workspace;\n const workspaceConfig = workspaceRef?.config ?? {};\n const registeredWorkspaces = mastra.listWorkspaces();\n const registeredWorkspace = workspaceRef?.workspaceId\n ? registeredWorkspaces[workspaceRef.workspaceId]\n : undefined;\n const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;\n const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;\n const filesystemConfig =\n typeof workspaceConfig.filesystem === 'object' &&\n workspaceConfig.filesystem &&\n 'config' in workspaceConfig.filesystem\n ? (workspaceConfig.filesystem.config as Record<string, unknown>)\n : {};\n const sandboxConfig =\n typeof workspaceConfig.sandbox === 'object' && workspaceConfig.sandbox && 'config' in workspaceConfig.sandbox\n ? (workspaceConfig.sandbox.config as Record<string, unknown>)\n : {};\n workspace = {\n type: workspaceRef?.type ?? null,\n workspaceId: workspaceRef?.workspaceId ?? null,\n name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,\n source: registeredWorkspace?.source ?? null,\n registered: !!registeredWorkspace,\n hasFilesystem: !!filesystem,\n hasSandbox: !!sandbox,\n filesystemProvider: getProviderName(filesystem),\n sandboxProvider: getProviderName(sandbox),\n config: [\n ...getConfigEntries(filesystemConfig).map(entry => ({ ...entry, key: `filesystem.${entry.key}` })),\n ...getConfigEntries(sandboxConfig).map(entry => ({ ...entry, key: `sandbox.${entry.key}` })),\n ],\n };\n }\n\n return { channels, browser, workspace, registries };\n } catch (error) {\n return handleError(error, 'Error getting infrastructure status');\n }\n },\n});\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"editor-builder-DIpISGSI.cjs","names":["agentFeaturesSchema","HTTPException","createRoute","builderSettingsResponseSchema","handleError","builderAvailableModelsResponseSchema","buildProvidersList","infrastructureStatusResponseSchema"],"sources":["../src/server/utils/resolve-builder-model-policy.ts","../src/server/handlers/editor-builder.ts"],"sourcesContent":["import type { BuilderModelPolicy } from '@mastra/core/agent-builder/ee';\nimport type { IMastraEditor } from '@mastra/core/editor';\n\n/**\n * Server-side wrapper around `builderToModelPolicy`.\n *\n * Handles the optional `IMastraEditor` builder API surface (older / OSS editors\n * may not implement `hasEnabledBuilderConfig` / `resolveBuilder`) and returns\n * a uniform `BuilderModelPolicy` to every call site.\n *\n * Returns `{ active: false }` whenever:\n * - no editor is configured,\n * - the editor doesn't expose builder methods,\n * - the builder config is disabled, or\n * - resolving the builder fails / yields nothing.\n *\n * The `@mastra/core/agent-builder/ee` subpath is loaded lazily so this module\n * remains importable on `@mastra/core` versions that pre-date the subpath\n * (the subpath was added in core 1.34.0). The dynamic import is only reached\n * once an editor is actually configured, by which point a compatible core is\n * guaranteed.\n */\nexport async function resolveBuilderModelPolicy(editor: IMastraEditor | undefined): Promise<BuilderModelPolicy> {\n if (!editor) return { active: false };\n if (typeof editor.resolveBuilder !== 'function') return { active: false };\n if (typeof editor.hasEnabledBuilderConfig === 'function' && !editor.hasEnabledBuilderConfig()) {\n return { active: false };\n }\n\n // Degrade to inactive on builder-resolution failure rather than letting the\n // rejection escape: agent execution routes seed this on every request, so a\n // transient failure must not 500 the entire route.\n try {\n const builder = await editor.resolveBuilder();\n const { builderToModelPolicy } = await import('@mastra/core/agent-builder/ee');\n return builderToModelPolicy(builder);\n } catch {\n return { active: false };\n }\n}\n","import type { Mastra } from '@mastra/core';\n\nimport { HTTPException } from '../http-exception';\nimport {\n agentFeaturesSchema,\n builderAvailableModelsResponseSchema,\n builderSettingsResponseSchema,\n infrastructureStatusResponseSchema,\n} from '../schemas/editor-builder';\nimport type { AgentFeatures, InfrastructureStatus } from '../schemas/editor-builder';\nimport { createRoute } from '../server-adapter/routes/route-builder';\nimport { resolveBuilderModelPolicy } from '../utils/resolve-builder-model-policy';\nimport { buildProvidersList } from './agents';\nimport { handleError } from './error';\n\n/**\n * Resolve the active builder feature flags. Returns `null` when the editor is\n * absent, the builder is disabled, or no features are configured.\n */\nasync function resolveBuilderFeatures(mastra: Mastra): Promise<AgentFeatures | null> {\n const editor = mastra.getEditor();\n if (!editor || typeof editor.resolveBuilder !== 'function') return null;\n if (!editor.hasEnabledBuilderConfig?.()) return null;\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) return null;\n const features = builder.getFeatures?.()?.agent;\n if (!features) return null;\n // Validate the shape so unknown keys cannot smuggle through.\n const parsed = agentFeaturesSchema.safeParse(features);\n return parsed.success ? parsed.data : null;\n}\n\n/**\n * Returns whether a given agent-builder feature is enabled. Used by list /\n * get-by-id handlers to soft-gate response enrichment (omit fields, ignore\n * favoritedOnly / pinFavoritedFor params) when the feature is off.\n */\nexport async function isBuilderFeatureEnabled(mastra: Mastra, feature: keyof AgentFeatures): Promise<boolean> {\n const features = await resolveBuilderFeatures(mastra);\n return features?.[feature] === true;\n}\n\n/**\n * Hard-gate helper for mutation routes that must not exist when the feature\n * is off. Throws `HTTPException(404)` so we don't leak the existence of the\n * feature surface (matches behavior of unregistered routes).\n */\nexport async function requireBuilderFeature(mastra: Mastra, feature: keyof AgentFeatures): Promise<void> {\n if (!(await isBuilderFeatureEnabled(mastra, feature))) {\n throw new HTTPException(404, { message: 'Not Found' });\n }\n}\n\n/**\n * GET /editor/builder/settings\n *\n * Returns the agent builder settings configured by the admin.\n * Used by frontend to determine which features to display.\n */\nexport const GET_EDITOR_BUILDER_SETTINGS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/settings',\n responseType: 'json',\n responseSchema: builderSettingsResponseSchema,\n summary: 'Get agent builder settings',\n description: 'Returns the agent builder feature flags and configuration for UI gating',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n const editor = mastra.getEditor();\n\n // No editor configured\n if (!editor) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Editor doesn't support builder (older version or OSS)\n if (typeof editor.resolveBuilder !== 'function') {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Check if builder is enabled in config\n if (!editor.hasEnabledBuilderConfig?.()) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n // Resolve the builder instance\n const builder = await editor.resolveBuilder();\n if (!builder || !builder.enabled) {\n return { enabled: false, modelPolicy: { active: false } };\n }\n\n const baseWarnings = builder.getModelPolicyWarnings?.() ?? [];\n const configuration = builder.getConfiguration();\n\n // Picker allowlists are written against entity `.id` (what users see in\n // the UI, URLs, traces). The client filters list responses by their\n // response keys, which are not always `.id`:\n // - GET /agents keys by `agent.id`\n // - GET /tools keys by registration key (values include `id`)\n // - GET /workflows keys by registration key (values omit `id`)\n // To keep the client filter simple, we accept `.id` (fallback to\n // registration key) for matching, but emit visible IDs as response keys\n // so `Object.keys(data)` lines up.\n type AliasPair = { id: string; key: string };\n const collectAliases = (registry: Record<string, unknown>): AliasPair[] =>\n Object.entries(registry).map(([key, entity]) => ({\n id: (entity as { id?: string }).id || key,\n key,\n }));\n\n const toolAliases = collectAliases(mastra.listTools() ?? {});\n const agentAliases = collectAliases(mastra.listAgents() ?? {});\n const workflowAliases = collectAliases(mastra.listWorkflows() ?? {});\n\n // Tools/workflows responses are keyed by registration key. Agents\n // response is keyed by `.id`.\n const toResponseKey = (aliases: AliasPair[], byId: 'id' | 'key') => {\n const map = new Map<string, string>();\n for (const a of aliases) {\n map.set(a.id, byId === 'id' ? a.id : a.key);\n map.set(a.key, byId === 'id' ? a.id : a.key);\n }\n return map;\n };\n const toolKeyMap = toResponseKey(toolAliases, 'key');\n const agentKeyMap = toResponseKey(agentAliases, 'id');\n const workflowKeyMap = toResponseKey(workflowAliases, 'key');\n\n // Lazy-load the EE subpath so this module remains importable on\n // `@mastra/core` versions that pre-date it (added in core 1.34.0).\n // We only reach here after `builder.enabled` is true, which guarantees\n // a compatible core.\n const { builderToModelPolicy, resolvePickerVisibility } = await import('@mastra/core/agent-builder/ee');\n\n const picker = resolvePickerVisibility({\n config: configuration?.agent,\n registeredToolIds: toolAliases.flatMap(a => [a.id, a.key]),\n registeredAgentIds: agentAliases.flatMap(a => [a.id, a.key]),\n registeredWorkflowIds: workflowAliases.flatMap(a => [a.id, a.key]),\n });\n\n const normalize = (visible: string[] | null, map: Map<string, string>): string[] | null => {\n if (visible === null) return null;\n const out: string[] = [];\n const seen = new Set<string>();\n for (const id of visible) {\n const mapped = map.get(id);\n if (mapped && !seen.has(mapped)) {\n seen.add(mapped);\n out.push(mapped);\n }\n }\n return out;\n };\n\n const modelPolicyWarnings = [...baseWarnings, ...picker.warnings];\n\n return {\n enabled: true,\n features: builder.getFeatures(),\n configuration,\n modelPolicy: builderToModelPolicy(builder),\n picker: {\n visibleTools: normalize(picker.visibleTools, toolKeyMap),\n visibleAgents: normalize(picker.visibleAgents, agentKeyMap),\n visibleWorkflows: normalize(picker.visibleWorkflows, workflowKeyMap),\n },\n ...(modelPolicyWarnings.length > 0 ? { modelPolicyWarnings } : {}),\n };\n } catch (error) {\n return handleError(error, 'Error getting builder settings');\n }\n },\n});\n\n/**\n * GET /editor/builder/models/available\n *\n * Returns the configured AI providers/models the agent builder may use. The\n * server is the single authority: it scopes the list to providers with a\n * configured API key (`connected`) and applies the active builder model\n * policy via `isModelAllowed`, so the Studio surfaces can render the response\n * verbatim without importing any EE matcher into the browser.\n *\n * - Providers without a configured API key are always omitted — the builder\n * decides the agent's model from this list, so an unconnected provider would\n * produce an agent that can never run.\n * - Policy inactive (or no allowlist) ⇒ all connected providers are returned.\n * - Policy active with an allowlist ⇒ each connected provider's models are\n * filtered, and providers left with no allowed models are omitted entirely.\n */\nexport const GET_EDITOR_BUILDER_AVAILABLE_MODELS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/models/available',\n responseType: 'json',\n responseSchema: builderAvailableModelsResponseSchema,\n summary: 'List builder-available AI models',\n description: 'Returns AI providers/models filtered by the active agent-builder model policy.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'stored-agents:read',\n handler: async ({ mastra }) => {\n try {\n // Only surface providers whose API key is configured (`connected`). The\n // agent builder decides the agent's model from this list, so including\n // providers without a key lets it pick a model that can never run. We\n // scope to connected providers so every choice is actually usable.\n const providers = (await buildProvidersList(mastra)).filter(provider => provider.connected);\n const policy = await resolveBuilderModelPolicy(mastra.getEditor());\n\n // Inactive policy (or no allowlist) ⇒ no allowlist filtering to apply.\n if (!policy.active || !policy.allowed || policy.allowed.length === 0) {\n return { providers };\n }\n\n // Lazy-load the EE matcher (server-only); mirrors the convention used by\n // resolve-builder-model-policy and the settings handler.\n const { isModelAllowed } = await import('@mastra/core/agent-builder/ee');\n\n const filtered = providers\n .map(provider => ({\n ...provider,\n models: provider.models.filter(modelId => isModelAllowed(policy.allowed, { provider: provider.id, modelId })),\n }))\n .filter(provider => provider.models.length > 0);\n\n return { providers: filtered };\n } catch (error) {\n return handleError(error, 'Error fetching available models');\n }\n },\n});\n\n/**\n * GET /editor/builder/infrastructure\n *\n * Returns the runtime status of Mastra-opinionated primitives (channels,\n * browser providers, workspaces). Admin-only; surfaced in Studio Settings so\n * admins can sanity-check what's wired up to the running server.\n */\nexport const GET_INFRASTRUCTURE_STATUS_ROUTE = createRoute({\n method: 'GET',\n path: '/editor/builder/infrastructure',\n responseType: 'json',\n responseSchema: infrastructureStatusResponseSchema,\n summary: 'Get infrastructure status',\n description: 'Agent Builder infrastructure configuration and lightweight runtime status.',\n tags: ['Editor'],\n requiresAuth: true,\n requiresPermission: 'infrastructure:read',\n handler: async ({ mastra }) => {\n try {\n const formatConfigValue = (value: unknown): string => {\n if (value === null || value === undefined) return 'not set';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${value.length} item${value.length === 1 ? '' : 's'}`;\n return value.constructor?.name && value.constructor.name !== 'Object' ? value.constructor.name : 'configured';\n };\n\n const getProviderName = (value: unknown): string | null => {\n if (!value) return null;\n if (typeof value === 'object' && 'provider' in value && typeof value.provider === 'string')\n return value.provider;\n if (typeof value === 'object' && 'constructor' in value) {\n const name = (value as { constructor?: { name?: string } }).constructor?.name;\n return name && name !== 'Object' ? name : 'configured';\n }\n return null;\n };\n\n const getConfigEntries = (config: Record<string, unknown>, omittedKeys: string[] = []) =>\n Object.entries(config)\n .filter(([key, value]) => !omittedKeys.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => ({ key, value: formatConfigValue(value) }));\n\n const channelProviders = mastra.getChannelProviders() ?? {};\n const channels: InfrastructureStatus['channels'] = {\n providers: Object.entries(channelProviders)\n .map(([id, provider]) => {\n const info = provider.getInfo?.();\n const routes = provider.getRoutes?.() ?? [];\n return {\n id: info?.id ?? id,\n name: info?.name ?? id,\n isConfigured: info?.isConfigured ?? false,\n routeCount: routes.length,\n };\n })\n .filter(provider => provider.isConfigured),\n };\n\n const editor = mastra.getEditor();\n let browser: InfrastructureStatus['browser'] = {\n type: null,\n provider: null,\n env: null,\n registered: false,\n availableProviders: [],\n config: [],\n };\n let workspace: InfrastructureStatus['workspace'] = {\n type: null,\n workspaceId: null,\n name: null,\n source: null,\n registered: false,\n hasFilesystem: false,\n hasSandbox: false,\n filesystemProvider: null,\n sandboxProvider: null,\n config: [],\n };\n let registries: InfrastructureStatus['registries'] = {\n skillsSh: { enabled: false },\n };\n\n if (editor?.resolveBuilder) {\n const browsers = (editor as unknown as { __browsers?: Map<string, unknown> }).__browsers;\n const builder = await editor.resolveBuilder();\n const builderRegistries = builder?.getRegistries?.();\n registries = {\n skillsSh: { enabled: builderRegistries?.skillsSh?.enabled === true },\n };\n const configuration = builder?.getConfiguration?.()?.agent as\n | {\n browser?: { type?: string; config?: { provider?: string; env?: string } };\n workspace?: {\n type?: string;\n workspaceId?: string;\n config?: { name?: string; filesystem?: unknown; sandbox?: unknown };\n };\n }\n | undefined;\n\n const browserRef = configuration?.browser;\n const browserConfig = browserRef?.config ?? {};\n const providerId = browserConfig.provider ?? null;\n browser = {\n type: browserRef?.type ?? null,\n provider: providerId,\n env: browserConfig.env ?? null,\n registered: providerId ? !!browsers?.has(providerId) : false,\n availableProviders: browsers ? Array.from(browsers.keys()) : [],\n config: getConfigEntries(browserConfig, ['provider', 'env']),\n };\n\n const workspaceRef = configuration?.workspace;\n const workspaceConfig = workspaceRef?.config ?? {};\n const registeredWorkspaces = mastra.listWorkspaces();\n const registeredWorkspace = workspaceRef?.workspaceId\n ? registeredWorkspaces[workspaceRef.workspaceId]\n : undefined;\n const filesystem = registeredWorkspace?.workspace.filesystem ?? workspaceConfig.filesystem;\n const sandbox = registeredWorkspace?.workspace.sandbox ?? workspaceConfig.sandbox;\n const filesystemConfig =\n typeof workspaceConfig.filesystem === 'object' &&\n workspaceConfig.filesystem &&\n 'config' in workspaceConfig.filesystem\n ? (workspaceConfig.filesystem.config as Record<string, unknown>)\n : {};\n const sandboxConfig =\n typeof workspaceConfig.sandbox === 'object' && workspaceConfig.sandbox && 'config' in workspaceConfig.sandbox\n ? (workspaceConfig.sandbox.config as Record<string, unknown>)\n : {};\n workspace = {\n type: workspaceRef?.type ?? null,\n workspaceId: workspaceRef?.workspaceId ?? null,\n name: workspaceConfig.name ?? registeredWorkspace?.workspace.name ?? null,\n source: registeredWorkspace?.source ?? null,\n registered: !!registeredWorkspace,\n hasFilesystem: !!filesystem,\n hasSandbox: !!sandbox,\n filesystemProvider: getProviderName(filesystem),\n sandboxProvider: getProviderName(sandbox),\n config: [\n ...getConfigEntries(filesystemConfig).map(entry => ({ ...entry, key: `filesystem.${entry.key}` })),\n ...getConfigEntries(sandboxConfig).map(entry => ({ ...entry, key: `sandbox.${entry.key}` })),\n ],\n };\n }\n\n return { channels, browser, workspace, registries };\n } catch (error) {\n return handleError(error, 'Error getting infrastructure status');\n }\n },\n});\n"],"mappings":"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"}