@mastra/server 1.74.0 → 1.75.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{api-schema-manifest-BmraF-WX.js → api-schema-manifest-Cg5BAmJ6.js} +2 -2
- package/dist/{api-schema-manifest-BmraF-WX.js.map → api-schema-manifest-Cg5BAmJ6.js.map} +1 -1
- package/dist/{api-schema-manifest-Blh5-4VH.cjs → api-schema-manifest-hJw56vOw.cjs} +2 -2
- package/dist/{api-schema-manifest-Blh5-4VH.cjs.map → api-schema-manifest-hJw56vOw.cjs.map} +1 -1
- package/dist/{dist-D-O086vY.js → dist-BKGwFBci.js} +152 -45
- package/dist/{dist-D-O086vY.js.map → dist-BKGwFBci.js.map} +1 -1
- package/dist/{dist-BACW0Que.cjs → dist-DL6nu99w.cjs} +152 -45
- package/dist/{dist-BACW0Que.cjs.map → dist-DL6nu99w.cjs.map} +1 -1
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/assets/SOURCE_MAP.json +1 -1
- package/dist/{routes-CcjyQojv.cjs → routes-mJga4N4C.cjs} +2 -2
- package/dist/{routes-CcjyQojv.cjs.map → routes-mJga4N4C.cjs.map} +1 -1
- package/dist/{routes-Boe1UThy.js → routes-obDo67aE.js} +2 -2
- package/dist/{routes-Boe1UThy.js.map → routes-obDo67aE.js.map} +1 -1
- package/dist/server/handlers/agent-builder.cjs +1 -1
- package/dist/server/handlers/agent-builder.js +1 -1
- package/dist/server/handlers/agent-controller.cjs +1 -1
- package/dist/server/handlers/agent-controller.js +1 -1
- package/dist/server/handlers/agents.cjs +17 -1
- package/dist/server/handlers/agents.cjs.map +1 -1
- package/dist/server/handlers/agents.d.ts.map +1 -1
- package/dist/server/handlers/agents.js +17 -1
- package/dist/server/handlers/agents.js.map +1 -1
- package/dist/server/handlers/conversations.cjs +1 -1
- package/dist/server/handlers/conversations.js +1 -1
- package/dist/server/handlers/logs.cjs +1 -1
- package/dist/server/handlers/logs.js +1 -1
- package/dist/server/handlers/memory.cjs +1 -1
- package/dist/server/handlers/memory.js +1 -1
- package/dist/server/handlers/plans.cjs +1 -1
- package/dist/server/handlers/plans.js +1 -1
- package/dist/server/handlers/responses.adapter.cjs +3 -2
- package/dist/server/handlers/responses.adapter.cjs.map +1 -1
- package/dist/server/handlers/responses.adapter.d.ts.map +1 -1
- package/dist/server/handlers/responses.adapter.js +3 -2
- package/dist/server/handlers/responses.adapter.js.map +1 -1
- package/dist/server/handlers/responses.cjs +1 -1
- package/dist/server/handlers/responses.js +1 -1
- package/dist/server/handlers/responses.storage.cjs +1 -1
- package/dist/server/handlers/responses.storage.js +1 -1
- package/dist/server/handlers/system.cjs +1 -1
- package/dist/server/handlers/system.js +1 -1
- package/dist/server/handlers/tools.cjs +1 -1
- package/dist/server/handlers/tools.js +1 -1
- package/dist/server/handlers/utils.cjs +2 -1
- package/dist/server/handlers/utils.d.ts +6 -0
- package/dist/server/handlers/utils.d.ts.map +1 -1
- package/dist/server/handlers/utils.js +2 -2
- package/dist/server/handlers/workflow-builder.cjs +1 -1
- package/dist/server/handlers/workflow-builder.js +1 -1
- package/dist/server/handlers/workflows.cjs +1 -1
- package/dist/server/handlers/workflows.js +1 -1
- package/dist/server/server-adapter/index.cjs +1 -1
- package/dist/server/server-adapter/index.js +1 -1
- package/dist/{utils-aIu3gkhJ.cjs → utils-HqDZJwRc.cjs} +31 -1
- package/dist/utils-HqDZJwRc.cjs.map +1 -0
- package/dist/{utils-KsERfbhc.js → utils-KcHk7C0D.js} +26 -2
- package/dist/utils-KcHk7C0D.js.map +1 -0
- package/dist/{workflow-builder-DTcM8ER3.cjs → workflow-builder-BSjQJCVD.cjs} +2 -2
- package/dist/{workflow-builder-DTcM8ER3.cjs.map → workflow-builder-BSjQJCVD.cjs.map} +1 -1
- package/dist/{workflow-builder-KRSpDol2.js → workflow-builder-DJ48IzXQ.js} +2 -2
- package/dist/{workflow-builder-KRSpDol2.js.map → workflow-builder-DJ48IzXQ.js.map} +1 -1
- package/package.json +6 -6
- package/dist/utils-KsERfbhc.js.map +0 -1
- package/dist/utils-aIu3gkhJ.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.adapter.js","names":[],"sources":["../../../src/server/handlers/responses.adapter.ts"],"sourcesContent":["import type { MastraDBMessage } from '@mastra/core/agent';\nimport { isProviderDefinedTool } from '@mastra/core/tools';\nimport { zodToJsonSchema } from '@mastra/core/utils/zod-to-json';\nimport type {\n ConversationItem,\n ResponseInputMessage,\n ResponseObject,\n ResponseOutputItem,\n ResponseTextConfig,\n ResponseTool,\n} from '../schemas/responses';\nimport type { ProviderMetadataLike, ResponseTurnRecord, UsageLike } from './responses.storage';\n\nexport type ResponseExecutionMessage = {\n role: 'system' | 'user' | 'assistant';\n content: string;\n};\n\n/**\n * Flattens Responses API message content into the plain-text shape Mastra agent\n * execution expects today.\n */\nfunction normalizeMessageContent(content: ResponseInputMessage['content']): string {\n if (typeof content === 'string') {\n return content;\n }\n\n return content.map(part => part.text).join('');\n}\n\n/**\n * Extracts the human-readable text represented by a persisted Mastra message.\n */\nfunction getMessageText(message: MastraDBMessage): string {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n return parts\n .flatMap(part => (part.type === 'text' ? [part.text] : []))\n .filter((text): text is string => typeof text === 'string')\n .join('');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction getMessageRole(message: MastraDBMessage): string {\n return (message as { role?: string }).role ?? '';\n}\n\n/**\n * Creates a stable fallback key for tool items when a tool call id is missing\n * from the stored message payload.\n */\nfunction getToolKey(toolCallId: string | null, messageId: string, partIndex: number) {\n return toolCallId ?? `${messageId}:${partIndex}`;\n}\n\nfunction getFunctionCallOutputItemId(toolCallId: string) {\n return `${toolCallId}:output`;\n}\n\n/**\n * Normalizes tool parameter schemas so the Responses API always exposes the\n * plain JSON Schema object regardless of whether the source tool came from a\n * provider-defined tool or a Mastra/Zod tool definition.\n */\nfunction normalizeToolParameters(schema: unknown): unknown {\n if (!isRecord(schema)) {\n return schema;\n }\n\n if (isRecord(schema.json) && Object.keys(schema).length === 1) {\n return schema.json;\n }\n\n return schema;\n}\n\n/**\n * Maps configured Mastra tools into Responses API tool definitions.\n */\nexport function mapMastraToolsToResponseTools(tools: Record<string, unknown> | undefined): ResponseTool[] {\n if (!tools) {\n return [];\n }\n\n return Object.values(tools).flatMap(tool => {\n if (!isRecord(tool)) {\n return [];\n }\n\n const name = typeof tool.id === 'string' ? tool.id : typeof tool.name === 'string' ? tool.name : null;\n if (!name) {\n return [];\n }\n\n const description = typeof tool.description === 'string' ? tool.description : undefined;\n\n let parameters: unknown;\n if (isProviderDefinedTool(tool)) {\n const resolvedSchema = typeof tool.inputSchema === 'function' ? tool.inputSchema() : tool.inputSchema;\n parameters =\n isRecord(resolvedSchema) && 'jsonSchema' in resolvedSchema\n ? normalizeToolParameters(resolvedSchema.jsonSchema)\n : undefined;\n } else if ('inputSchema' in tool && tool.inputSchema) {\n parameters = normalizeToolParameters(zodToJsonSchema(tool.inputSchema as never));\n }\n\n return [\n {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n ...(parameters !== undefined ? { parameters: JSON.parse(JSON.stringify(parameters)) } : {}),\n } satisfies ResponseTool,\n ];\n });\n}\n\nfunction stringifyToolPayload(value: unknown) {\n if (typeof value === 'string') {\n return value;\n }\n\n return JSON.stringify(value === undefined ? {} : value);\n}\n\nfunction stringifyToolArguments(value: unknown) {\n if (isRecord(value) && typeof value.__raw === 'string') {\n return value.__raw;\n }\n\n return stringifyToolPayload(value === null ? undefined : value);\n}\n\nfunction createOutputMessage({\n messageId,\n status,\n text,\n}: {\n messageId: string;\n status: ResponseObject['status'];\n text: string;\n}) {\n const responseStatus: Extract<ResponseObject['output'][number], { type: 'message' }>['status'] =\n status === 'completed' ? 'completed' : 'incomplete';\n\n return {\n id: messageId,\n type: 'message' as const,\n role: 'assistant' as const,\n status: responseStatus,\n content: [createOutputTextPart(text)],\n };\n}\n\nfunction createConversationMessage({\n messageId,\n role,\n text,\n}: {\n messageId: string;\n role: 'system' | 'user' | 'assistant';\n text: string;\n}) {\n return {\n id: messageId,\n type: 'message' as const,\n role,\n status: 'completed' as const,\n content: [\n role === 'assistant'\n ? createOutputTextPart(text)\n : {\n type: 'input_text' as const,\n text,\n },\n ],\n };\n}\n\nfunction createFunctionCallItem({\n itemId,\n callId,\n name,\n args,\n}: {\n itemId: string;\n callId: string;\n name: string;\n args: unknown;\n}) {\n return {\n id: itemId,\n type: 'function_call' as const,\n call_id: callId,\n name,\n arguments: stringifyToolArguments(args),\n status: 'completed' as const,\n };\n}\n\nfunction createFunctionCallOutputItem({ itemId, callId, output }: { itemId: string; callId: string; output: unknown }) {\n return {\n id: itemId,\n type: 'function_call_output' as const,\n call_id: callId,\n output: stringifyToolPayload(output),\n };\n}\n\ntype ResponseToolItem = Extract<ConversationItem, { type: 'function_call' | 'function_call_output' }>;\n\n/**\n * Records which tool call ids already have dedicated tool-result messages so we can\n * avoid duplicating `function_call_output` items when assistant messages echo the\n * result inline.\n */\nfunction collectToolResultCallIds(messages: MastraDBMessage[]) {\n const toolResultCallIds = new Set<string>();\n\n for (const message of messages) {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n for (const [partIndex, part] of parts.entries()) {\n if (!isRecord(part) || part.type !== 'tool-invocation' || !isRecord(part.toolInvocation)) {\n continue;\n }\n\n const toolInvocation = part.toolInvocation;\n const toolCallId =\n typeof toolInvocation.toolCallId === 'string'\n ? toolInvocation.toolCallId\n : getToolKey(null, message.id, partIndex);\n\n if (getMessageRole(message) === 'tool' && toolInvocation.result !== undefined) {\n toolResultCallIds.add(toolCallId);\n }\n }\n }\n\n return toolResultCallIds;\n}\n\n/**\n * Maps one persisted Mastra message into the tool-related Responses items that\n * it contributes to the conversation timeline.\n */\nfunction mapMastraMessageToResponseToolItems({\n message,\n toolResultCallIds,\n emittedCallIds,\n emittedResultCallIds,\n}: {\n message: MastraDBMessage;\n toolResultCallIds: Set<string>;\n emittedCallIds: Set<string>;\n emittedResultCallIds: Set<string>;\n}): ResponseToolItem[] {\n const items: ResponseToolItem[] = [];\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n\n for (const [partIndex, part] of parts.entries()) {\n if (!isRecord(part) || part.type !== 'tool-invocation' || !isRecord(part.toolInvocation)) {\n continue;\n }\n\n const toolInvocation = part.toolInvocation;\n const toolName = typeof toolInvocation.toolName === 'string' ? toolInvocation.toolName : null;\n const toolCallId =\n typeof toolInvocation.toolCallId === 'string'\n ? toolInvocation.toolCallId\n : getToolKey(null, message.id, partIndex);\n\n if (getMessageRole(message) === 'assistant' && toolName && !emittedCallIds.has(toolCallId)) {\n items.push(\n createFunctionCallItem({\n itemId: toolCallId,\n callId: toolCallId,\n name: toolName,\n args: toolInvocation.args,\n }),\n );\n emittedCallIds.add(toolCallId);\n }\n\n if (\n toolInvocation.result !== undefined &&\n !emittedResultCallIds.has(toolCallId) &&\n (getMessageRole(message) === 'tool' || !toolResultCallIds.has(toolCallId))\n ) {\n items.push(\n createFunctionCallOutputItem({\n itemId: getFunctionCallOutputItemId(toolCallId),\n callId: toolCallId,\n output: toolInvocation.result,\n }),\n );\n emittedResultCallIds.add(toolCallId);\n }\n }\n\n return items;\n}\n\n/**\n * Maps Mastra thread messages into OpenAI-style conversation items.\n */\nexport function mapMastraMessagesToConversationItems(messages: MastraDBMessage[]): ConversationItem[] {\n if (!messages.length) {\n return [];\n }\n\n const items: ConversationItem[] = [];\n const toolResultCallIds = collectToolResultCallIds(messages);\n const emittedCallIds = new Set<string>();\n const emittedResultCallIds = new Set<string>();\n\n for (const message of messages) {\n items.push(\n ...mapMastraMessageToResponseToolItems({\n message,\n toolResultCallIds,\n emittedCallIds,\n emittedResultCallIds,\n }),\n );\n\n const role = getMessageRole(message);\n const text = getMessageText(message);\n\n if ((role === 'user' || role === 'system' || role === 'assistant') && text) {\n items.push(\n createConversationMessage({\n messageId: message.id,\n role,\n text,\n }),\n );\n continue;\n }\n\n if (role === 'assistant' && !text) {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n const hasOnlyToolInvocations = parts.every(\n part => isRecord(part) && part.type === 'tool-invocation' && isRecord(part.toolInvocation),\n );\n\n if (hasOnlyToolInvocations) {\n continue;\n }\n }\n\n if (role === 'tool') {\n continue;\n }\n }\n\n return items;\n}\n\nfunction mergeFallbackOutputItems({\n output,\n fallbackOutputItems,\n}: {\n output: ResponseOutputItem[];\n fallbackOutputItems: ResponseOutputItem[];\n}): ResponseOutputItem[] {\n if (!fallbackOutputItems.length) {\n return output;\n }\n\n const outputById = new Map(output.map(item => [item.id, item]));\n const fallbackIds = new Set(fallbackOutputItems.map(item => item.id));\n\n return [\n ...fallbackOutputItems.map(item => outputById.get(item.id) ?? item),\n ...output.filter(item => !fallbackIds.has(item.id)),\n ];\n}\n\nfunction getOutputMessageText(item: Extract<ResponseOutputItem, { type: 'message' }>): string {\n return item.content.map(part => part.text).join('');\n}\n\n/**\n * Maps the stored Mastra messages for one response turn back into OpenAI-style\n * `response.output` items, preserving tool/message ordering from the thread.\n */\nexport function mapMastraMessagesToResponseOutputItems({\n messages,\n outputMessageId,\n status,\n fallbackText,\n fallbackOutputItems = [],\n}: {\n messages: MastraDBMessage[] | undefined;\n outputMessageId: string;\n status: ResponseObject['status'];\n fallbackText: string;\n fallbackOutputItems?: ResponseOutputItem[];\n}): ResponseOutputItem[] {\n if (!messages?.length) {\n if (fallbackOutputItems.length) {\n return fallbackOutputItems;\n }\n\n return [createOutputMessage({ messageId: outputMessageId, status, text: fallbackText })];\n }\n\n const output: ResponseOutputItem[] = [];\n const lastAssistantIndex = [...messages].map(message => message.role).lastIndexOf('assistant');\n const outputMessageIndex =\n [...messages]\n .map((message, index) => ({ index, message }))\n .reverse()\n .find(({ message }) => getMessageRole(message) === 'assistant' && getMessageText(message))?.index ??\n lastAssistantIndex;\n const toolResultCallIds = collectToolResultCallIds(messages);\n const emittedCallIds = new Set<string>();\n const emittedResultCallIds = new Set<string>();\n const fallbackMessageItems = fallbackOutputItems.filter(\n (item): item is Extract<ResponseOutputItem, { type: 'message' }> => item.type === 'message',\n );\n const emittedFallbackMessageIds = new Set<string>();\n\n const getOutputMessageId = ({\n message,\n text,\n useOutputMessageId,\n }: {\n message: MastraDBMessage;\n text: string;\n useOutputMessageId: boolean;\n }) => {\n const directFallbackItem = fallbackMessageItems.find(item => item.id === message.id);\n if (directFallbackItem) {\n emittedFallbackMessageIds.add(directFallbackItem.id);\n return directFallbackItem.id;\n }\n\n if (useOutputMessageId) {\n const matchingFallbackItem = fallbackMessageItems.find(\n item =>\n item.id !== outputMessageId && !emittedFallbackMessageIds.has(item.id) && getOutputMessageText(item) === text,\n );\n if (matchingFallbackItem) {\n emittedFallbackMessageIds.add(matchingFallbackItem.id);\n return matchingFallbackItem.id;\n }\n }\n\n return useOutputMessageId ? outputMessageId : message.id;\n };\n\n for (const [messageIndex, message] of messages.entries()) {\n output.push(\n ...mapMastraMessageToResponseToolItems({\n message,\n toolResultCallIds,\n emittedCallIds,\n emittedResultCallIds,\n }),\n );\n\n const text = getMessageText(message);\n if (getMessageRole(message) === 'assistant' && text) {\n const useOutputMessageId = messageIndex === outputMessageIndex;\n output.push(\n createOutputMessage({\n messageId: getOutputMessageId({ message, text, useOutputMessageId }),\n status,\n text,\n }),\n );\n }\n }\n\n if (!output.some(item => item.type === 'message') && fallbackText) {\n output.push(createOutputMessage({ messageId: outputMessageId, status, text: fallbackText }));\n }\n\n return mergeFallbackOutputItems({ output, fallbackOutputItems });\n}\n\n/**\n * Creates a stable assistant-message-backed response identifier.\n */\nexport function createMessageId() {\n return `msg_${globalThis.crypto.randomUUID()}`;\n}\n\n/**\n * Maps Responses API input into the plain execution messages Mastra agents expect.\n */\nexport function mapResponseInputToExecutionMessages(\n input: ResponseInputMessage[] | string,\n): ResponseExecutionMessage[] {\n if (typeof input === 'string') {\n return [{ role: 'user', content: input }];\n }\n\n return input.map(message => ({\n role: message.role === 'developer' ? 'system' : message.role,\n content: normalizeMessageContent(message.content),\n }));\n}\n\n/**\n * Converts usage details to the Responses API usage shape.\n */\nexport function toResponseUsage(usage: UsageLike): ResponseObject['usage'] {\n if (!usage) {\n return null;\n }\n\n const inputTokens = usage.inputTokens ?? usage.promptTokens ?? 0;\n const outputTokens = usage.outputTokens ?? usage.completionTokens ?? 0;\n const totalTokens = usage.totalTokens ?? inputTokens + outputTokens;\n\n return {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: totalTokens,\n input_tokens_details: {\n cached_tokens: 0,\n },\n output_tokens_details: {\n reasoning_tokens: 0,\n },\n };\n}\n\n/**\n * Maps model finish reasons onto the Responses API status field.\n */\nexport function toResponseStatus(finishReason: string | undefined): ResponseObject['status'] {\n if (finishReason === 'suspended' || finishReason === 'error') {\n return 'incomplete';\n }\n\n return 'completed';\n}\n\n/**\n * Formats a text response part using the OpenAI-compatible Responses shape.\n */\nexport function createOutputTextPart(text: string) {\n return {\n type: 'output_text' as const,\n text,\n annotations: [] as unknown[],\n logprobs: [] as unknown[],\n };\n}\n\n/**\n * Builds a completed Responses API object from Mastra execution state.\n */\nexport function buildCompletedResponse({\n responseId,\n outputMessageId,\n model,\n createdAt,\n completedAt,\n status,\n text,\n usage,\n instructions,\n textConfig,\n previousResponseId,\n conversationId,\n providerOptions,\n tools,\n store,\n messages,\n fallbackOutputItems,\n}: {\n responseId: string;\n outputMessageId: string;\n model: string;\n createdAt: number;\n completedAt: number | null;\n status: ResponseObject['status'];\n text: string;\n usage: UsageLike;\n instructions?: string;\n textConfig?: ResponseTextConfig;\n previousResponseId?: string;\n conversationId?: string;\n providerOptions?: ProviderMetadataLike;\n tools: ResponseTool[];\n store: boolean;\n messages?: MastraDBMessage[];\n fallbackOutputItems?: ResponseOutputItem[];\n}): ResponseObject {\n return {\n id: responseId,\n object: 'response',\n created_at: createdAt,\n completed_at: completedAt,\n model,\n status,\n output: mapMastraMessagesToResponseOutputItems({\n messages,\n outputMessageId,\n status,\n fallbackText: text,\n fallbackOutputItems,\n }),\n usage: toResponseUsage(usage),\n error: null,\n incomplete_details: null,\n instructions: instructions ?? null,\n text: textConfig ?? null,\n previous_response_id: previousResponseId ?? null,\n conversation_id: conversationId ?? null,\n providerOptions,\n tools,\n store,\n };\n}\n\n/**\n * Builds the initial in-progress Responses API object emitted at stream start.\n */\nexport function buildInProgressResponse({\n responseId,\n model,\n createdAt,\n instructions,\n textConfig,\n previousResponseId,\n conversationId,\n tools,\n store,\n}: {\n responseId: string;\n model: string;\n createdAt: number;\n instructions?: string;\n textConfig?: ResponseTextConfig;\n previousResponseId?: string;\n conversationId?: string;\n store: boolean;\n tools?: ResponseTool[];\n}): ResponseObject {\n return {\n id: responseId,\n object: 'response',\n created_at: createdAt,\n completed_at: null,\n model,\n status: 'in_progress',\n output: [],\n usage: null,\n error: null,\n incomplete_details: null,\n instructions: instructions ?? null,\n text: textConfig ?? null,\n previous_response_id: previousResponseId ?? null,\n conversation_id: conversationId ?? null,\n tools: tools ?? [],\n store,\n };\n}\n\n/**\n * Reconstructs a Responses API object from a stored response-turn record.\n */\nexport function mapResponseTurnRecordToResponse(match: ResponseTurnRecord): ResponseObject {\n return {\n id: match.message.id,\n object: 'response',\n created_at: match.metadata.createdAt,\n completed_at: match.metadata.completedAt,\n model: match.metadata.model,\n status: match.metadata.status,\n output: mapMastraMessagesToResponseOutputItems({\n messages: match.messages,\n outputMessageId: match.message.id,\n status: match.metadata.status,\n fallbackText: getMessageText(match.message),\n fallbackOutputItems: match.metadata.outputItems,\n }),\n usage: match.metadata.usage,\n error: null,\n incomplete_details: null,\n instructions: match.metadata.instructions ?? null,\n text: match.metadata.text ?? null,\n previous_response_id: match.metadata.previousResponseId ?? null,\n conversation_id: match.thread.id,\n providerOptions: match.metadata.providerOptions,\n tools: match.metadata.tools,\n store: match.metadata.store,\n };\n}\n\n/**\n * Formats an SSE event line for the streaming Responses route.\n */\nexport function formatSseEvent(event: string, data: unknown): Uint8Array {\n return new TextEncoder().encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n}\n\n/**\n * Extracts text deltas from the Mastra stream chunk variants used by the route.\n */\nexport function extractTextDelta(value: unknown): string | null {\n if (typeof value !== 'object' || value === null || !('type' in value)) {\n return null;\n }\n\n const chunk = value as { type: string; payload?: { text?: string }; textDelta?: string; text?: string };\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.textDelta === 'string') {\n return chunk.textDelta;\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\ntype ResponseOutputItemAddedPayload = {\n type: 'response.output_item.added';\n output_index: number;\n item: ResponseOutputItem;\n};\n\ntype ResponseContentPartAddedPayload = {\n type: 'response.content_part.added';\n output_index: number;\n content_index: number;\n item_id: string;\n part: ReturnType<typeof createOutputTextPart>;\n};\n\ntype ResponseOutputTextDeltaPayload = {\n type: 'response.output_text.delta';\n output_index: number;\n content_index: number;\n item_id: string;\n delta: string;\n};\n\ntype ResponseFunctionCallArgumentsDeltaPayload = {\n type: 'response.function_call_arguments.delta';\n output_index: number;\n item_id: string;\n delta: string;\n};\n\ntype ResponseFunctionCallArgumentsDonePayload = {\n type: 'response.function_call_arguments.done';\n output_index: number;\n item_id: string;\n name: string;\n arguments: string;\n};\n\ntype ResponseOutputItemDonePayload = {\n type: 'response.output_item.done';\n output_index: number;\n item: ResponseOutputItem;\n};\n\ntype ResponseOutputTextDonePayload = {\n type: 'response.output_text.done';\n output_index: number;\n content_index: number;\n item_id: string;\n text: string;\n};\n\ntype ResponseContentPartDonePayload = {\n type: 'response.content_part.done';\n output_index: number;\n content_index: number;\n item_id: string;\n part: ReturnType<typeof createOutputTextPart>;\n};\n\ntype ResponseSsePayload =\n | ResponseOutputItemAddedPayload\n | ResponseContentPartAddedPayload\n | ResponseOutputTextDeltaPayload\n | ResponseFunctionCallArgumentsDeltaPayload\n | ResponseFunctionCallArgumentsDonePayload\n | ResponseOutputItemDonePayload\n | ResponseOutputTextDonePayload\n | ResponseContentPartDonePayload;\n\ntype ResponseSseEvent<TPayload extends ResponseSsePayload = ResponseSsePayload> = {\n event: TPayload['type'];\n payload: TPayload;\n};\n\nfunction createResponseSseEvent<TPayload extends ResponseSsePayload>(payload: TPayload): ResponseSseEvent<TPayload> {\n return { event: payload.type, payload };\n}\n\ntype ToolCallStreamState = {\n argumentsText: string;\n completed: boolean;\n itemId: string;\n name: string;\n outputIndex: number;\n zeroArgumentInputEnded: boolean;\n};\n\ntype ToolResultStreamState = {\n args: unknown;\n result: unknown;\n toolCallId: string;\n toolName?: string;\n};\n\nfunction getChunkPayload(value: unknown): Record<string, unknown> | null {\n if (!isRecord(value)) {\n return null;\n }\n\n return isRecord(value.payload) ? value.payload : value;\n}\n\nfunction stringifyResponsePayload(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n return JSON.stringify(value === undefined ? {} : value);\n}\n\nfunction stringifyFunctionCallArguments(value: unknown, fallback = ''): string {\n const serialized = value === undefined || value === null ? fallback : stringifyResponsePayload(value);\n return serialized || fallback || '{}';\n}\n\nfunction removeWhitespaceOutsideJsonStrings(value: string): string {\n let inString = false;\n let escaped = false;\n let result = '';\n\n for (const char of value) {\n if (escaped) {\n escaped = false;\n result += char;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escaped = true;\n result += char;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n result += char;\n continue;\n }\n\n if (!inString && /\\s/.test(char)) {\n continue;\n }\n\n result += char;\n }\n\n return result;\n}\n\nfunction getRemainingArgumentsDelta(current: string, canonical: string): string | null {\n if (!current) {\n return canonical;\n }\n\n if (canonical.startsWith(current)) {\n return canonical.slice(current.length);\n }\n\n const compactCurrent = removeWhitespaceOutsideJsonStrings(current);\n const compactCanonical = removeWhitespaceOutsideJsonStrings(canonical);\n if (compactCurrent && compactCanonical.startsWith(compactCurrent)) {\n return compactCanonical.slice(compactCurrent.length);\n }\n\n return null;\n}\n\nfunction isCompleteJsonString(value: string): boolean {\n if (!value) {\n return true;\n }\n\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction serializeToolError(error: unknown) {\n if (error instanceof Error) {\n return { error: error.message };\n }\n\n return { error };\n}\n\nfunction getToolCallStart(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call-input-streaming-start') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n const toolName = payload?.toolName;\n if (typeof toolCallId !== 'string' || typeof toolName !== 'string') {\n return null;\n }\n\n return { toolCallId, toolName };\n}\n\nfunction getToolCallDelta(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call-delta') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n // Mastra/AI SDK stream chunks have used different names for streamed tool\n // argument text across versions; normalize them to the Responses delta shape.\n const delta = payload?.argsTextDelta ?? payload?.inputTextDelta ?? payload?.argsDelta ?? payload?.delta;\n if (!payload || typeof toolCallId !== 'string' || typeof delta !== 'string') {\n return null;\n }\n\n return {\n toolCallId,\n toolName: typeof payload.toolName === 'string' ? payload.toolName : undefined,\n delta,\n };\n}\n\nfunction getToolCall(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n const toolName = payload?.toolName;\n const args = payload?.args ?? payload?.input;\n if (typeof toolCallId !== 'string' || typeof toolName !== 'string') {\n return null;\n }\n\n return { toolCallId, toolName, args };\n}\n\nfunction getToolCallEnd(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call-input-streaming-end') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n if (typeof toolCallId !== 'string') {\n return null;\n }\n\n return { toolCallId };\n}\n\nfunction getToolResult(value: unknown) {\n if (!isRecord(value) || (value.type !== 'tool-result' && value.type !== 'tool-error')) {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n if (!payload || typeof toolCallId !== 'string') {\n return null;\n }\n\n const toolName = typeof payload.toolName === 'string' ? payload.toolName : undefined;\n const args = payload.args ?? payload.input;\n\n if (value.type === 'tool-error') {\n return { toolCallId, toolName, args, result: serializeToolError(payload.error) };\n }\n\n const outputValue = payload.result !== undefined ? payload.result : payload.output;\n const result = payload.isError ? serializeToolError(outputValue) : outputValue;\n\n return { toolCallId, toolName, args, result };\n}\n\nexport function createResponseStreamEventTranslator(responseId: string) {\n // Keep emitted SSE terminal payloads and the final completed response output\n // aligned. Once a tool call is completed, later duplicate/canonical chunks are\n // ignored because Responses SSE has no replacement event for arguments.done.\n let text = '';\n let nextOutputIndex = 0;\n let textOutputIndex: number | null = null;\n const completedToolResultCallIds = new Set<string>();\n const pendingToolResults = new Map<string, ToolResultStreamState>();\n const toolCalls = new Map<string, ToolCallStreamState>();\n const outputItems = new Map<number, ResponseOutputItem>();\n\n const ensureTextOutputItem = (): { events: ResponseSseEvent[]; outputIndex: number } => {\n if (textOutputIndex !== null) {\n return { events: [], outputIndex: textOutputIndex };\n }\n\n textOutputIndex = nextOutputIndex++;\n return {\n outputIndex: textOutputIndex,\n events: [\n createResponseSseEvent({\n type: 'response.output_item.added',\n output_index: textOutputIndex,\n item: {\n id: responseId,\n type: 'message',\n role: 'assistant',\n status: 'in_progress',\n content: [],\n },\n }),\n createResponseSseEvent({\n type: 'response.content_part.added',\n output_index: textOutputIndex,\n content_index: 0,\n item_id: responseId,\n part: createOutputTextPart(''),\n }),\n ],\n };\n };\n\n const ensureToolCallItem = ({\n toolCallId,\n toolName,\n }: {\n toolCallId: string;\n toolName: string;\n }): { events: ResponseSseEvent[]; state: ToolCallStreamState } => {\n const existing = toolCalls.get(toolCallId);\n if (existing) {\n if (!existing.completed && toolName && existing.name !== toolName) {\n existing.name = toolName;\n }\n\n return { events: [], state: existing };\n }\n\n const state = {\n argumentsText: '',\n completed: false,\n itemId: toolCallId,\n name: toolName,\n outputIndex: nextOutputIndex++,\n zeroArgumentInputEnded: false,\n };\n toolCalls.set(toolCallId, state);\n\n return {\n state,\n events: [\n createResponseSseEvent({\n type: 'response.output_item.added',\n output_index: state.outputIndex,\n item: {\n id: state.itemId,\n type: 'function_call',\n call_id: toolCallId,\n name: toolName,\n arguments: '',\n status: 'in_progress',\n },\n }),\n ],\n };\n };\n\n const completeToolCallItem = ({\n events,\n state,\n toolCallId,\n toolName,\n args,\n }: {\n events: ResponseSseEvent[];\n state: ToolCallStreamState;\n toolCallId: string;\n toolName: string;\n args: string;\n }): ResponseSseEvent[] => {\n if (state.completed) {\n return events;\n }\n\n const item = {\n id: state.itemId,\n type: 'function_call' as const,\n call_id: toolCallId,\n name: toolName,\n arguments: args,\n status: 'completed' as const,\n };\n\n state.argumentsText = args;\n state.completed = true;\n outputItems.set(state.outputIndex, item);\n\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.function_call_arguments.done',\n item_id: state.itemId,\n output_index: state.outputIndex,\n name: toolName,\n arguments: args,\n }),\n createResponseSseEvent({\n type: 'response.output_item.done',\n output_index: state.outputIndex,\n item,\n }),\n ];\n };\n\n const completeToolResultItem = ({\n events,\n toolResult,\n }: {\n events: ResponseSseEvent[];\n toolResult: ToolResultStreamState;\n }): ResponseSseEvent[] => {\n if (completedToolResultCallIds.has(toolResult.toolCallId)) {\n return events;\n }\n completedToolResultCallIds.add(toolResult.toolCallId);\n pendingToolResults.delete(toolResult.toolCallId);\n\n const outputIndex = nextOutputIndex++;\n const item = {\n id: getFunctionCallOutputItemId(toolResult.toolCallId),\n type: 'function_call_output' as const,\n call_id: toolResult.toolCallId,\n output: stringifyResponsePayload(toolResult.result),\n };\n outputItems.set(outputIndex, item);\n\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.output_item.added',\n output_index: outputIndex,\n item,\n }),\n createResponseSseEvent({\n type: 'response.output_item.done',\n output_index: outputIndex,\n item,\n }),\n ];\n };\n\n return {\n get text() {\n return text;\n },\n\n getOutputItems({ text, status }: { text: string; status: ResponseObject['status'] }) {\n const items = new Map(outputItems);\n if (text) {\n const messageOutputIndex = textOutputIndex ?? nextOutputIndex;\n items.set(messageOutputIndex, createOutputMessage({ messageId: responseId, status, text }));\n }\n\n return [...items.entries()].sort(([left], [right]) => left - right).map(([, item]) => item);\n },\n\n consume(value: unknown): ResponseSseEvent[] {\n const textDelta = extractTextDelta(value);\n if (textDelta) {\n const { events, outputIndex } = ensureTextOutputItem();\n text += textDelta;\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.output_text.delta',\n output_index: outputIndex,\n content_index: 0,\n item_id: responseId,\n delta: textDelta,\n }),\n ];\n }\n\n const toolCallStart = getToolCallStart(value);\n if (toolCallStart) {\n return ensureToolCallItem(toolCallStart).events;\n }\n\n const toolCallDelta = getToolCallDelta(value);\n if (toolCallDelta) {\n const existing = toolCalls.get(toolCallDelta.toolCallId);\n if (!existing && !toolCallDelta.toolName) {\n return [];\n }\n if (existing?.completed) {\n return [];\n }\n\n const ensured = ensureToolCallItem({\n toolCallId: toolCallDelta.toolCallId,\n toolName: toolCallDelta.toolName ?? existing!.name,\n });\n\n ensured.state.argumentsText += toolCallDelta.delta;\n ensured.state.zeroArgumentInputEnded = false;\n return [\n ...ensured.events,\n createResponseSseEvent({\n type: 'response.function_call_arguments.delta',\n item_id: ensured.state.itemId,\n output_index: ensured.state.outputIndex,\n delta: toolCallDelta.delta,\n }),\n ];\n }\n\n const toolCallEnd = getToolCallEnd(value);\n if (toolCallEnd) {\n const state = toolCalls.get(toolCallEnd.toolCallId);\n if (!state || state.completed) {\n return [];\n }\n\n state.zeroArgumentInputEnded = !state.argumentsText;\n return [];\n }\n\n const toolCall = getToolCall(value);\n if (toolCall) {\n const { events, state } = ensureToolCallItem(toolCall);\n const canonicalArgs = stringifyFunctionCallArguments(toolCall.args, state.argumentsText);\n if (state.completed) {\n const nextEvents = completeToolCallItem({\n events,\n state,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: canonicalArgs,\n });\n\n const pendingToolResult = pendingToolResults.get(toolCall.toolCallId);\n return pendingToolResult\n ? completeToolResultItem({ events: nextEvents, toolResult: pendingToolResult })\n : nextEvents;\n }\n\n const remainingArgsDelta = getRemainingArgumentsDelta(state.argumentsText, canonicalArgs);\n const args =\n remainingArgsDelta === null\n ? // If both strings are valid but disagree, keep the bytes already emitted\n // as deltas so arguments.done and response.output stay consistent.\n isCompleteJsonString(state.argumentsText)\n ? state.argumentsText\n : canonicalArgs\n : state.argumentsText + remainingArgsDelta;\n const nextEvents = remainingArgsDelta\n ? [\n ...events,\n createResponseSseEvent({\n type: 'response.function_call_arguments.delta',\n item_id: state.itemId,\n output_index: state.outputIndex,\n delta: remainingArgsDelta,\n }),\n ]\n : events;\n\n const completedEvents = completeToolCallItem({\n events: nextEvents,\n state,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args,\n });\n\n const pendingToolResult = pendingToolResults.get(toolCall.toolCallId);\n return pendingToolResult\n ? completeToolResultItem({ events: completedEvents, toolResult: pendingToolResult })\n : completedEvents;\n }\n\n const toolResult = getToolResult(value);\n if (toolResult) {\n const existingToolCallState = toolCalls.get(toolResult.toolCallId);\n if (!existingToolCallState && !toolResult.toolName) {\n return [];\n }\n\n const { events: toolCallEvents, state: toolCallState } = ensureToolCallItem({\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName ?? existingToolCallState!.name,\n });\n\n if (completedToolResultCallIds.has(toolResult.toolCallId)) {\n return [];\n }\n\n const events: ResponseSseEvent[] = [...toolCallEvents];\n if (!toolCallState.completed) {\n const args = stringifyFunctionCallArguments(toolResult.args, toolCallState.argumentsText || '{}');\n const hasZeroArgumentHint = toolCallState.zeroArgumentInputEnded && !toolCallState.argumentsText;\n if (\n toolResult.args === undefined &&\n !hasZeroArgumentHint &&\n (!toolCallState.argumentsText || !isCompleteJsonString(toolCallState.argumentsText))\n ) {\n pendingToolResults.set(toolResult.toolCallId, toolResult);\n return events;\n }\n\n events.push(\n ...completeToolCallItem({\n events: [],\n state: toolCallState,\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName ?? toolCallState.name,\n args,\n }),\n );\n }\n\n return completeToolResultItem({ events, toolResult });\n }\n\n return [];\n },\n\n flushPendingToolResults(): ResponseSseEvent[] {\n const events: ResponseSseEvent[] = [];\n for (const toolResult of pendingToolResults.values()) {\n const toolCallState = toolCalls.get(toolResult.toolCallId);\n if (!toolCallState) {\n continue;\n }\n\n if (!toolCallState.completed) {\n const safeFallbackArgs = isCompleteJsonString(toolCallState.argumentsText)\n ? toolCallState.argumentsText\n : '{}';\n events.push(\n ...completeToolCallItem({\n events: [],\n state: toolCallState,\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName ?? toolCallState.name,\n args: stringifyFunctionCallArguments(toolResult.args, safeFallbackArgs),\n }),\n );\n }\n\n events.push(...completeToolResultItem({ events: [], toolResult }));\n }\n\n return events;\n },\n\n completeText(text: string, completedItem: Extract<ResponseOutputItem, { type: 'message' }>): ResponseSseEvent[] {\n const { events, outputIndex } = ensureTextOutputItem();\n const completedTextItem = {\n ...completedItem,\n content: [createOutputTextPart(text)],\n };\n\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.output_text.done',\n output_index: outputIndex,\n content_index: 0,\n item_id: responseId,\n text,\n }),\n createResponseSseEvent({\n type: 'response.content_part.done',\n output_index: outputIndex,\n content_index: 0,\n item_id: responseId,\n part: createOutputTextPart(text),\n }),\n createResponseSseEvent({\n type: 'response.output_item.done',\n output_index: outputIndex,\n item: completedTextItem,\n }),\n ];\n },\n };\n}\n"],"mappings":";;;;;;;AAsBA,SAAS,wBAAwB,SAAkD;CACjF,IAAI,OAAO,YAAY,UACrB,OAAO;CAGT,OAAO,QAAQ,KAAI,SAAQ,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE;AAC/C;;;;AAKA,SAAS,eAAe,SAAkC;CAExD,QADc,MAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,CAAC,EAAA,CAE5E,SAAQ,SAAS,KAAK,SAAS,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAE,CAAC,CAC1D,QAAQ,SAAyB,OAAO,SAAS,QAAQ,CAAC,CAC1D,KAAK,EAAE;AACZ;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,eAAe,SAAkC;CACxD,OAAQ,QAA8B,QAAQ;AAChD;;;;;AAMA,SAAS,WAAW,YAA2B,WAAmB,WAAmB;CACnF,OAAO,cAAc,GAAG,UAAU,GAAG;AACvC;AAEA,SAAS,4BAA4B,YAAoB;CACvD,OAAO,GAAG,WAAW;AACvB;;;;;;AAOA,SAAS,wBAAwB,QAA0B;CACzD,IAAI,CAAC,SAAS,MAAM,GAClB,OAAO;CAGT,IAAI,SAAS,OAAO,IAAI,KAAK,OAAO,KAAK,MAAM,CAAC,CAAC,WAAW,GAC1D,OAAO,OAAO;CAGhB,OAAO;AACT;;;;AAKA,SAAgB,8BAA8B,OAA4D;CACxG,IAAI,CAAC,OACH,OAAO,CAAC;CAGV,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC,SAAQ,SAAQ;EAC1C,IAAI,CAAC,SAAS,IAAI,GAChB,OAAO,CAAC;EAGV,MAAM,OAAO,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;EACjG,IAAI,CAAC,MACH,OAAO,CAAC;EAGV,MAAM,cAAc,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,KAAA;EAE9E,IAAI;EACJ,IAAI,sBAAsB,IAAI,GAAG;GAC/B,MAAM,iBAAiB,OAAO,KAAK,gBAAgB,aAAa,KAAK,YAAY,IAAI,KAAK;GAC1F,aACE,SAAS,cAAc,KAAK,gBAAgB,iBACxC,wBAAwB,eAAe,UAAU,IACjD,KAAA;EACR,OAAO,IAAI,iBAAiB,QAAQ,KAAK,aACvC,aAAa,wBAAwB,gBAAgB,KAAK,WAAoB,CAAC;EAGjF,OAAO,CACL;GACE,MAAM;GACN;GACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;GACrC,GAAI,eAAe,KAAA,IAAY,EAAE,YAAY,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC,EAAE,IAAI,CAAC;EAC3F,CACF;CACF,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAgB;CAC5C,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,OAAO,KAAK,UAAU,UAAU,KAAA,IAAY,CAAC,IAAI,KAAK;AACxD;AAEA,SAAS,uBAAuB,OAAgB;CAC9C,IAAI,SAAS,KAAK,KAAK,OAAO,MAAM,UAAU,UAC5C,OAAO,MAAM;CAGf,OAAO,qBAAqB,UAAU,OAAO,KAAA,IAAY,KAAK;AAChE;AAEA,SAAS,oBAAoB,EAC3B,WACA,QACA,QAKC;CAID,OAAO;EACL,IAAI;EACJ,MAAM;EACN,MAAM;EACN,QANA,WAAW,cAAc,cAAc;EAOvC,SAAS,CAAC,qBAAqB,IAAI,CAAC;CACtC;AACF;AAEA,SAAS,0BAA0B,EACjC,WACA,MACA,QAKC;CACD,OAAO;EACL,IAAI;EACJ,MAAM;EACN;EACA,QAAQ;EACR,SAAS,CACP,SAAS,cACL,qBAAqB,IAAI,IACzB;GACE,MAAM;GACN;EACF,CACN;CACF;AACF;AAEA,SAAS,uBAAuB,EAC9B,QACA,QACA,MACA,QAMC;CACD,OAAO;EACL,IAAI;EACJ,MAAM;EACN,SAAS;EACT;EACA,WAAW,uBAAuB,IAAI;EACtC,QAAQ;CACV;AACF;AAEA,SAAS,6BAA6B,EAAE,QAAQ,QAAQ,UAA+D;CACrH,OAAO;EACL,IAAI;EACJ,MAAM;EACN,SAAS;EACT,QAAQ,qBAAqB,MAAM;CACrC;AACF;;;;;;AASA,SAAS,yBAAyB,UAA6B;CAC7D,MAAM,oCAAoB,IAAI,IAAY;CAE1C,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,QAAQ,MAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,CAAC;EAC/E,KAAK,MAAM,CAAC,WAAW,SAAS,MAAM,QAAQ,GAAG;GAC/C,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,qBAAqB,CAAC,SAAS,KAAK,cAAc,GACrF;GAGF,MAAM,iBAAiB,KAAK;GAC5B,MAAM,aACJ,OAAO,eAAe,eAAe,WACjC,eAAe,aACf,WAAW,MAAM,QAAQ,IAAI,SAAS;GAE5C,IAAI,eAAe,OAAO,MAAM,UAAU,eAAe,WAAW,KAAA,GAClE,kBAAkB,IAAI,UAAU;EAEpC;CACF;CAEA,OAAO;AACT;;;;;AAMA,SAAS,oCAAoC,EAC3C,SACA,mBACA,gBACA,wBAMqB;CACrB,MAAM,QAA4B,CAAC;CACnC,MAAM,QAAQ,MAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,CAAC;CAE/E,KAAK,MAAM,CAAC,WAAW,SAAS,MAAM,QAAQ,GAAG;EAC/C,IAAI,CAAC,SAAS,IAAI,KAAK,KAAK,SAAS,qBAAqB,CAAC,SAAS,KAAK,cAAc,GACrF;EAGF,MAAM,iBAAiB,KAAK;EAC5B,MAAM,WAAW,OAAO,eAAe,aAAa,WAAW,eAAe,WAAW;EACzF,MAAM,aACJ,OAAO,eAAe,eAAe,WACjC,eAAe,aACf,WAAW,MAAM,QAAQ,IAAI,SAAS;EAE5C,IAAI,eAAe,OAAO,MAAM,eAAe,YAAY,CAAC,eAAe,IAAI,UAAU,GAAG;GAC1F,MAAM,KACJ,uBAAuB;IACrB,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,MAAM,eAAe;GACvB,CAAC,CACH;GACA,eAAe,IAAI,UAAU;EAC/B;EAEA,IACE,eAAe,WAAW,KAAA,KAC1B,CAAC,qBAAqB,IAAI,UAAU,MACnC,eAAe,OAAO,MAAM,UAAU,CAAC,kBAAkB,IAAI,UAAU,IACxE;GACA,MAAM,KACJ,6BAA6B;IAC3B,QAAQ,4BAA4B,UAAU;IAC9C,QAAQ;IACR,QAAQ,eAAe;GACzB,CAAC,CACH;GACA,qBAAqB,IAAI,UAAU;EACrC;CACF;CAEA,OAAO;AACT;;;;AAKA,SAAgB,qCAAqC,UAAiD;CACpG,IAAI,CAAC,SAAS,QACZ,OAAO,CAAC;CAGV,MAAM,QAA4B,CAAC;CACnC,MAAM,oBAAoB,yBAAyB,QAAQ;CAC3D,MAAM,iCAAiB,IAAI,IAAY;CACvC,MAAM,uCAAuB,IAAI,IAAY;CAE7C,KAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,KACJ,GAAG,oCAAoC;GACrC;GACA;GACA;GACA;EACF,CAAC,CACH;EAEA,MAAM,OAAO,eAAe,OAAO;EACnC,MAAM,OAAO,eAAe,OAAO;EAEnC,KAAK,SAAS,UAAU,SAAS,YAAY,SAAS,gBAAgB,MAAM;GAC1E,MAAM,KACJ,0BAA0B;IACxB,WAAW,QAAQ;IACnB;IACA;GACF,CAAC,CACH;GACA;EACF;EAEA,IAAI,SAAS,eAAe,CAAC,MACb;QAAA,MAAM,QAAQ,QAAQ,SAAS,KAAK,IAAI,QAAQ,QAAQ,QAAQ,CAAC,EAAA,CAC1C,OACnC,SAAQ,SAAS,IAAI,KAAK,KAAK,SAAS,qBAAqB,SAAS,KAAK,cAAc,CAGlE,GACvB;EAAA;EAIJ,IAAI,SAAS,QACX;CAEJ;CAEA,OAAO;AACT;AAEA,SAAS,yBAAyB,EAChC,QACA,uBAIuB;CACvB,IAAI,CAAC,oBAAoB,QACvB,OAAO;CAGT,MAAM,aAAa,IAAI,IAAI,OAAO,KAAI,SAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;CAC9D,MAAM,cAAc,IAAI,IAAI,oBAAoB,KAAI,SAAQ,KAAK,EAAE,CAAC;CAEpE,OAAO,CACL,GAAG,oBAAoB,KAAI,SAAQ,WAAW,IAAI,KAAK,EAAE,KAAK,IAAI,GAClE,GAAG,OAAO,QAAO,SAAQ,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC,CACpD;AACF;AAEA,SAAS,qBAAqB,MAAgE;CAC5F,OAAO,KAAK,QAAQ,KAAI,SAAQ,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE;AACpD;;;;;AAMA,SAAgB,uCAAuC,EACrD,UACA,iBACA,QACA,cACA,sBAAsB,CAAC,KAOA;CACvB,IAAI,CAAC,UAAU,QAAQ;EACrB,IAAI,oBAAoB,QACtB,OAAO;EAGT,OAAO,CAAC,oBAAoB;GAAE,WAAW;GAAiB;GAAQ,MAAM;EAAa,CAAC,CAAC;CACzF;CAEA,MAAM,SAA+B,CAAC;CACtC,MAAM,qBAAqB,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAI,YAAW,QAAQ,IAAI,CAAC,CAAC,YAAY,WAAW;CAC7F,MAAM,qBACJ,CAAC,GAAG,QAAQ,CAAC,CACV,KAAK,SAAS,WAAW;EAAE;EAAO;CAAQ,EAAE,CAAC,CAC7C,QAAQ,CAAC,CACT,MAAM,EAAE,cAAc,eAAe,OAAO,MAAM,eAAe,eAAe,OAAO,CAAC,CAAC,EAAE,SAC9F;CACF,MAAM,oBAAoB,yBAAyB,QAAQ;CAC3D,MAAM,iCAAiB,IAAI,IAAY;CACvC,MAAM,uCAAuB,IAAI,IAAY;CAC7C,MAAM,uBAAuB,oBAAoB,QAC9C,SAAmE,KAAK,SAAS,SACpF;CACA,MAAM,4CAA4B,IAAI,IAAY;CAElD,MAAM,sBAAsB,EAC1B,SACA,MACA,yBAKI;EACJ,MAAM,qBAAqB,qBAAqB,MAAK,SAAQ,KAAK,OAAO,QAAQ,EAAE;EACnF,IAAI,oBAAoB;GACtB,0BAA0B,IAAI,mBAAmB,EAAE;GACnD,OAAO,mBAAmB;EAC5B;EAEA,IAAI,oBAAoB;GACtB,MAAM,uBAAuB,qBAAqB,MAChD,SACE,KAAK,OAAO,mBAAmB,CAAC,0BAA0B,IAAI,KAAK,EAAE,KAAK,qBAAqB,IAAI,MAAM,IAC7G;GACA,IAAI,sBAAsB;IACxB,0BAA0B,IAAI,qBAAqB,EAAE;IACrD,OAAO,qBAAqB;GAC9B;EACF;EAEA,OAAO,qBAAqB,kBAAkB,QAAQ;CACxD;CAEA,KAAK,MAAM,CAAC,cAAc,YAAY,SAAS,QAAQ,GAAG;EACxD,OAAO,KACL,GAAG,oCAAoC;GACrC;GACA;GACA;GACA;EACF,CAAC,CACH;EAEA,MAAM,OAAO,eAAe,OAAO;EACnC,IAAI,eAAe,OAAO,MAAM,eAAe,MAAM;GACnD,MAAM,qBAAqB,iBAAiB;GAC5C,OAAO,KACL,oBAAoB;IAClB,WAAW,mBAAmB;KAAE;KAAS;KAAM;IAAmB,CAAC;IACnE;IACA;GACF,CAAC,CACH;EACF;CACF;CAEA,IAAI,CAAC,OAAO,MAAK,SAAQ,KAAK,SAAS,SAAS,KAAK,cACnD,OAAO,KAAK,oBAAoB;EAAE,WAAW;EAAiB;EAAQ,MAAM;CAAa,CAAC,CAAC;CAG7F,OAAO,yBAAyB;EAAE;EAAQ;CAAoB,CAAC;AACjE;;;;AAKA,SAAgB,kBAAkB;CAChC,OAAO,OAAO,WAAW,OAAO,WAAW;AAC7C;;;;AAKA,SAAgB,oCACd,OAC4B;CAC5B,IAAI,OAAO,UAAU,UACnB,OAAO,CAAC;EAAE,MAAM;EAAQ,SAAS;CAAM,CAAC;CAG1C,OAAO,MAAM,KAAI,aAAY;EAC3B,MAAM,QAAQ,SAAS,cAAc,WAAW,QAAQ;EACxD,SAAS,wBAAwB,QAAQ,OAAO;CAClD,EAAE;AACJ;;;;AAKA,SAAgB,gBAAgB,OAA2C;CACzE,IAAI,CAAC,OACH,OAAO;CAGT,MAAM,cAAc,MAAM,eAAe,MAAM,gBAAgB;CAC/D,MAAM,eAAe,MAAM,gBAAgB,MAAM,oBAAoB;CAGrE,OAAO;EACL,cAAc;EACd,eAAe;EACf,cALkB,MAAM,eAAe,cAAc;EAMrD,sBAAsB,EACpB,eAAe,EACjB;EACA,uBAAuB,EACrB,kBAAkB,EACpB;CACF;AACF;;;;AAKA,SAAgB,iBAAiB,cAA4D;CAC3F,IAAI,iBAAiB,eAAe,iBAAiB,SACnD,OAAO;CAGT,OAAO;AACT;;;;AAKA,SAAgB,qBAAqB,MAAc;CACjD,OAAO;EACL,MAAM;EACN;EACA,aAAa,CAAC;EACd,UAAU,CAAC;CACb;AACF;;;;AAKA,SAAgB,uBAAuB,EACrC,YACA,iBACA,OACA,WACA,aACA,QACA,MACA,OACA,cACA,YACA,oBACA,gBACA,iBACA,OACA,OACA,UACA,uBAmBiB;CACjB,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,YAAY;EACZ,cAAc;EACd;EACA;EACA,QAAQ,uCAAuC;GAC7C;GACA;GACA;GACA,cAAc;GACd;EACF,CAAC;EACD,OAAO,gBAAgB,KAAK;EAC5B,OAAO;EACP,oBAAoB;EACpB,cAAc,gBAAgB;EAC9B,MAAM,cAAc;EACpB,sBAAsB,sBAAsB;EAC5C,iBAAiB,kBAAkB;EACnC;EACA;EACA;CACF;AACF;;;;AAKA,SAAgB,wBAAwB,EACtC,YACA,OACA,WACA,cACA,YACA,oBACA,gBACA,OACA,SAWiB;CACjB,OAAO;EACL,IAAI;EACJ,QAAQ;EACR,YAAY;EACZ,cAAc;EACd;EACA,QAAQ;EACR,QAAQ,CAAC;EACT,OAAO;EACP,OAAO;EACP,oBAAoB;EACpB,cAAc,gBAAgB;EAC9B,MAAM,cAAc;EACpB,sBAAsB,sBAAsB;EAC5C,iBAAiB,kBAAkB;EACnC,OAAO,SAAS,CAAC;EACjB;CACF;AACF;;;;AAKA,SAAgB,gCAAgC,OAA2C;CACzF,OAAO;EACL,IAAI,MAAM,QAAQ;EAClB,QAAQ;EACR,YAAY,MAAM,SAAS;EAC3B,cAAc,MAAM,SAAS;EAC7B,OAAO,MAAM,SAAS;EACtB,QAAQ,MAAM,SAAS;EACvB,QAAQ,uCAAuC;GAC7C,UAAU,MAAM;GAChB,iBAAiB,MAAM,QAAQ;GAC/B,QAAQ,MAAM,SAAS;GACvB,cAAc,eAAe,MAAM,OAAO;GAC1C,qBAAqB,MAAM,SAAS;EACtC,CAAC;EACD,OAAO,MAAM,SAAS;EACtB,OAAO;EACP,oBAAoB;EACpB,cAAc,MAAM,SAAS,gBAAgB;EAC7C,MAAM,MAAM,SAAS,QAAQ;EAC7B,sBAAsB,MAAM,SAAS,sBAAsB;EAC3D,iBAAiB,MAAM,OAAO;EAC9B,iBAAiB,MAAM,SAAS;EAChC,OAAO,MAAM,SAAS;EACtB,OAAO,MAAM,SAAS;CACxB;AACF;;;;AAKA,SAAgB,eAAe,OAAe,MAA2B;CACvE,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,UAAU,MAAM,UAAU,KAAK,UAAU,IAAI,EAAE,KAAK;AACtF;;;;AAKA,SAAgB,iBAAiB,OAA+B;CAC9D,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,EAAE,UAAU,QAC7D,OAAO;CAGT,MAAM,QAAQ;CAEd,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,IAAI,OAAO,MAAM,SAAS,SAAS,UACjC,OAAO,MAAM,QAAQ;GAGvB,IAAI,OAAO,MAAM,cAAc,UAC7B,OAAO,MAAM;GAGf,IAAI,OAAO,MAAM,SAAS,UACxB,OAAO,MAAM;GAGf,OAAO;EACT,SACE,OAAO;CACX;AACF;AA4EA,SAAS,uBAA4D,SAA+C;CAClH,OAAO;EAAE,OAAO,QAAQ;EAAM;CAAQ;AACxC;AAkBA,SAAS,gBAAgB,OAAgD;CACvE,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO;CAGT,OAAO,SAAS,MAAM,OAAO,IAAI,MAAM,UAAU;AACnD;AAEA,SAAS,yBAAyB,OAAwB;CACxD,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,OAAO,KAAK,UAAU,UAAU,KAAA,IAAY,CAAC,IAAI,KAAK;AACxD;AAEA,SAAS,+BAA+B,OAAgB,WAAW,IAAY;CAE7E,QADmB,UAAU,KAAA,KAAa,UAAU,OAAO,WAAW,yBAAyB,KAAK,MAC/E,YAAY;AACnC;AAEA,SAAS,mCAAmC,OAAuB;CACjE,IAAI,WAAW;CACf,IAAI,UAAU;CACd,IAAI,SAAS;CAEb,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI,SAAS;GACX,UAAU;GACV,UAAU;GACV;EACF;EAEA,IAAI,SAAS,QAAQ,UAAU;GAC7B,UAAU;GACV,UAAU;GACV;EACF;EAEA,IAAI,SAAS,MAAK;GAChB,WAAW,CAAC;GACZ,UAAU;GACV;EACF;EAEA,IAAI,CAAC,YAAY,KAAK,KAAK,IAAI,GAC7B;EAGF,UAAU;CACZ;CAEA,OAAO;AACT;AAEA,SAAS,2BAA2B,SAAiB,WAAkC;CACrF,IAAI,CAAC,SACH,OAAO;CAGT,IAAI,UAAU,WAAW,OAAO,GAC9B,OAAO,UAAU,MAAM,QAAQ,MAAM;CAGvC,MAAM,iBAAiB,mCAAmC,OAAO;CACjE,MAAM,mBAAmB,mCAAmC,SAAS;CACrE,IAAI,kBAAkB,iBAAiB,WAAW,cAAc,GAC9D,OAAO,iBAAiB,MAAM,eAAe,MAAM;CAGrD,OAAO;AACT;AAEA,SAAS,qBAAqB,OAAwB;CACpD,IAAI,CAAC,OACH,OAAO;CAGT,IAAI;EACF,KAAK,MAAM,KAAK;EAChB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,mBAAmB,OAAgB;CAC1C,IAAI,iBAAiB,OACnB,OAAO,EAAE,OAAO,MAAM,QAAQ;CAGhC,OAAO,EAAE,MAAM;AACjB;AAEA,SAAS,iBAAiB,OAAgB;CACxC,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,mCACrC,OAAO;CAGT,MAAM,UAAU,gBAAgB,KAAK;CACrC,MAAM,aAAa,SAAS;CAC5B,MAAM,WAAW,SAAS;CAC1B,IAAI,OAAO,eAAe,YAAY,OAAO,aAAa,UACxD,OAAO;CAGT,OAAO;EAAE;EAAY;CAAS;AAChC;AAEA,SAAS,iBAAiB,OAAgB;CACxC,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,mBACrC,OAAO;CAGT,MAAM,UAAU,gBAAgB,KAAK;CACrC,MAAM,aAAa,SAAS;CAG5B,MAAM,QAAQ,SAAS,iBAAiB,SAAS,kBAAkB,SAAS,aAAa,SAAS;CAClG,IAAI,CAAC,WAAW,OAAO,eAAe,YAAY,OAAO,UAAU,UACjE,OAAO;CAGT,OAAO;EACL;EACA,UAAU,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,KAAA;EACpE;CACF;AACF;AAEA,SAAS,YAAY,OAAgB;CACnC,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,aACrC,OAAO;CAGT,MAAM,UAAU,gBAAgB,KAAK;CACrC,MAAM,aAAa,SAAS;CAC5B,MAAM,WAAW,SAAS;CAC1B,MAAM,OAAO,SAAS,QAAQ,SAAS;CACvC,IAAI,OAAO,eAAe,YAAY,OAAO,aAAa,UACxD,OAAO;CAGT,OAAO;EAAE;EAAY;EAAU;CAAK;AACtC;AAEA,SAAS,eAAe,OAAgB;CACtC,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,SAAS,iCACrC,OAAO;CAIT,MAAM,aADU,gBAAgB,KACP,CAAC,EAAE;CAC5B,IAAI,OAAO,eAAe,UACxB,OAAO;CAGT,OAAO,EAAE,WAAW;AACtB;AAEA,SAAS,cAAc,OAAgB;CACrC,IAAI,CAAC,SAAS,KAAK,KAAM,MAAM,SAAS,iBAAiB,MAAM,SAAS,cACtE,OAAO;CAGT,MAAM,UAAU,gBAAgB,KAAK;CACrC,MAAM,aAAa,SAAS;CAC5B,IAAI,CAAC,WAAW,OAAO,eAAe,UACpC,OAAO;CAGT,MAAM,WAAW,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW,KAAA;CAC3E,MAAM,OAAO,QAAQ,QAAQ,QAAQ;CAErC,IAAI,MAAM,SAAS,cACjB,OAAO;EAAE;EAAY;EAAU;EAAM,QAAQ,mBAAmB,QAAQ,KAAK;CAAE;CAGjF,MAAM,cAAc,QAAQ,WAAW,KAAA,IAAY,QAAQ,SAAS,QAAQ;CAG5E,OAAO;EAAE;EAAY;EAAU;EAAM,QAFtB,QAAQ,UAAU,mBAAmB,WAAW,IAAI;CAEvB;AAC9C;AAEA,SAAgB,oCAAoC,YAAoB;CAItE,IAAI,OAAO;CACX,IAAI,kBAAkB;CACtB,IAAI,kBAAiC;CACrC,MAAM,6CAA6B,IAAI,IAAY;CACnD,MAAM,qCAAqB,IAAI,IAAmC;CAClE,MAAM,4BAAY,IAAI,IAAiC;CACvD,MAAM,8BAAc,IAAI,IAAgC;CAExD,MAAM,6BAAkF;EACtF,IAAI,oBAAoB,MACtB,OAAO;GAAE,QAAQ,CAAC;GAAG,aAAa;EAAgB;EAGpD,kBAAkB;EAClB,OAAO;GACL,aAAa;GACb,QAAQ,CACN,uBAAuB;IACrB,MAAM;IACN,cAAc;IACd,MAAM;KACJ,IAAI;KACJ,MAAM;KACN,MAAM;KACN,QAAQ;KACR,SAAS,CAAC;IACZ;GACF,CAAC,GACD,uBAAuB;IACrB,MAAM;IACN,cAAc;IACd,eAAe;IACf,SAAS;IACT,MAAM,qBAAqB,EAAE;GAC/B,CAAC,CACH;EACF;CACF;CAEA,MAAM,sBAAsB,EAC1B,YACA,eAIgE;EAChE,MAAM,WAAW,UAAU,IAAI,UAAU;EACzC,IAAI,UAAU;GACZ,IAAI,CAAC,SAAS,aAAa,YAAY,SAAS,SAAS,UACvD,SAAS,OAAO;GAGlB,OAAO;IAAE,QAAQ,CAAC;IAAG,OAAO;GAAS;EACvC;EAEA,MAAM,QAAQ;GACZ,eAAe;GACf,WAAW;GACX,QAAQ;GACR,MAAM;GACN,aAAa;GACb,wBAAwB;EAC1B;EACA,UAAU,IAAI,YAAY,KAAK;EAE/B,OAAO;GACL;GACA,QAAQ,CACN,uBAAuB;IACrB,MAAM;IACN,cAAc,MAAM;IACpB,MAAM;KACJ,IAAI,MAAM;KACV,MAAM;KACN,SAAS;KACT,MAAM;KACN,WAAW;KACX,QAAQ;IACV;GACF,CAAC,CACH;EACF;CACF;CAEA,MAAM,wBAAwB,EAC5B,QACA,OACA,YACA,UACA,WAOwB;EACxB,IAAI,MAAM,WACR,OAAO;EAGT,MAAM,OAAO;GACX,IAAI,MAAM;GACV,MAAM;GACN,SAAS;GACT,MAAM;GACN,WAAW;GACX,QAAQ;EACV;EAEA,MAAM,gBAAgB;EACtB,MAAM,YAAY;EAClB,YAAY,IAAI,MAAM,aAAa,IAAI;EAEvC,OAAO;GACL,GAAG;GACH,uBAAuB;IACrB,MAAM;IACN,SAAS,MAAM;IACf,cAAc,MAAM;IACpB,MAAM;IACN,WAAW;GACb,CAAC;GACD,uBAAuB;IACrB,MAAM;IACN,cAAc,MAAM;IACpB;GACF,CAAC;EACH;CACF;CAEA,MAAM,0BAA0B,EAC9B,QACA,iBAIwB;EACxB,IAAI,2BAA2B,IAAI,WAAW,UAAU,GACtD,OAAO;EAET,2BAA2B,IAAI,WAAW,UAAU;EACpD,mBAAmB,OAAO,WAAW,UAAU;EAE/C,MAAM,cAAc;EACpB,MAAM,OAAO;GACX,IAAI,4BAA4B,WAAW,UAAU;GACrD,MAAM;GACN,SAAS,WAAW;GACpB,QAAQ,yBAAyB,WAAW,MAAM;EACpD;EACA,YAAY,IAAI,aAAa,IAAI;EAEjC,OAAO;GACL,GAAG;GACH,uBAAuB;IACrB,MAAM;IACN,cAAc;IACd;GACF,CAAC;GACD,uBAAuB;IACrB,MAAM;IACN,cAAc;IACd;GACF,CAAC;EACH;CACF;CAEA,OAAO;EACL,IAAI,OAAO;GACT,OAAO;EACT;EAEA,eAAe,EAAE,MAAM,UAA8D;GACnF,MAAM,QAAQ,IAAI,IAAI,WAAW;GACjC,IAAI,MAAM;IACR,MAAM,qBAAqB,mBAAmB;IAC9C,MAAM,IAAI,oBAAoB,oBAAoB;KAAE,WAAW;KAAY;KAAQ;IAAK,CAAC,CAAC;GAC5F;GAEA,OAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG,UAAU,IAAI;EAC5F;EAEA,QAAQ,OAAoC;GAC1C,MAAM,YAAY,iBAAiB,KAAK;GACxC,IAAI,WAAW;IACb,MAAM,EAAE,QAAQ,gBAAgB,qBAAqB;IACrD,QAAQ;IACR,OAAO,CACL,GAAG,QACH,uBAAuB;KACrB,MAAM;KACN,cAAc;KACd,eAAe;KACf,SAAS;KACT,OAAO;IACT,CAAC,CACH;GACF;GAEA,MAAM,gBAAgB,iBAAiB,KAAK;GAC5C,IAAI,eACF,OAAO,mBAAmB,aAAa,CAAC,CAAC;GAG3C,MAAM,gBAAgB,iBAAiB,KAAK;GAC5C,IAAI,eAAe;IACjB,MAAM,WAAW,UAAU,IAAI,cAAc,UAAU;IACvD,IAAI,CAAC,YAAY,CAAC,cAAc,UAC9B,OAAO,CAAC;IAEV,IAAI,UAAU,WACZ,OAAO,CAAC;IAGV,MAAM,UAAU,mBAAmB;KACjC,YAAY,cAAc;KAC1B,UAAU,cAAc,YAAY,SAAU;IAChD,CAAC;IAED,QAAQ,MAAM,iBAAiB,cAAc;IAC7C,QAAQ,MAAM,yBAAyB;IACvC,OAAO,CACL,GAAG,QAAQ,QACX,uBAAuB;KACrB,MAAM;KACN,SAAS,QAAQ,MAAM;KACvB,cAAc,QAAQ,MAAM;KAC5B,OAAO,cAAc;IACvB,CAAC,CACH;GACF;GAEA,MAAM,cAAc,eAAe,KAAK;GACxC,IAAI,aAAa;IACf,MAAM,QAAQ,UAAU,IAAI,YAAY,UAAU;IAClD,IAAI,CAAC,SAAS,MAAM,WAClB,OAAO,CAAC;IAGV,MAAM,yBAAyB,CAAC,MAAM;IACtC,OAAO,CAAC;GACV;GAEA,MAAM,WAAW,YAAY,KAAK;GAClC,IAAI,UAAU;IACZ,MAAM,EAAE,QAAQ,UAAU,mBAAmB,QAAQ;IACrD,MAAM,gBAAgB,+BAA+B,SAAS,MAAM,MAAM,aAAa;IACvF,IAAI,MAAM,WAAW;KACnB,MAAM,aAAa,qBAAqB;MACtC;MACA;MACA,YAAY,SAAS;MACrB,UAAU,SAAS;MACnB,MAAM;KACR,CAAC;KAED,MAAM,oBAAoB,mBAAmB,IAAI,SAAS,UAAU;KACpE,OAAO,oBACH,uBAAuB;MAAE,QAAQ;MAAY,YAAY;KAAkB,CAAC,IAC5E;IACN;IAEA,MAAM,qBAAqB,2BAA2B,MAAM,eAAe,aAAa;IACxF,MAAM,OACJ,uBAAuB,OAGnB,qBAAqB,MAAM,aAAa,IACtC,MAAM,gBACN,gBACF,MAAM,gBAAgB;IAC5B,MAAM,aAAa,qBACf,CACE,GAAG,QACH,uBAAuB;KACrB,MAAM;KACN,SAAS,MAAM;KACf,cAAc,MAAM;KACpB,OAAO;IACT,CAAC,CACH,IACA;IAEJ,MAAM,kBAAkB,qBAAqB;KAC3C,QAAQ;KACR;KACA,YAAY,SAAS;KACrB,UAAU,SAAS;KACnB;IACF,CAAC;IAED,MAAM,oBAAoB,mBAAmB,IAAI,SAAS,UAAU;IACpE,OAAO,oBACH,uBAAuB;KAAE,QAAQ;KAAiB,YAAY;IAAkB,CAAC,IACjF;GACN;GAEA,MAAM,aAAa,cAAc,KAAK;GACtC,IAAI,YAAY;IACd,MAAM,wBAAwB,UAAU,IAAI,WAAW,UAAU;IACjE,IAAI,CAAC,yBAAyB,CAAC,WAAW,UACxC,OAAO,CAAC;IAGV,MAAM,EAAE,QAAQ,gBAAgB,OAAO,kBAAkB,mBAAmB;KAC1E,YAAY,WAAW;KACvB,UAAU,WAAW,YAAY,sBAAuB;IAC1D,CAAC;IAED,IAAI,2BAA2B,IAAI,WAAW,UAAU,GACtD,OAAO,CAAC;IAGV,MAAM,SAA6B,CAAC,GAAG,cAAc;IACrD,IAAI,CAAC,cAAc,WAAW;KAC5B,MAAM,OAAO,+BAA+B,WAAW,MAAM,cAAc,iBAAiB,IAAI;KAChG,MAAM,sBAAsB,cAAc,0BAA0B,CAAC,cAAc;KACnF,IACE,WAAW,SAAS,KAAA,KACpB,CAAC,wBACA,CAAC,cAAc,iBAAiB,CAAC,qBAAqB,cAAc,aAAa,IAClF;MACA,mBAAmB,IAAI,WAAW,YAAY,UAAU;MACxD,OAAO;KACT;KAEA,OAAO,KACL,GAAG,qBAAqB;MACtB,QAAQ,CAAC;MACT,OAAO;MACP,YAAY,WAAW;MACvB,UAAU,WAAW,YAAY,cAAc;MAC/C;KACF,CAAC,CACH;IACF;IAEA,OAAO,uBAAuB;KAAE;KAAQ;IAAW,CAAC;GACtD;GAEA,OAAO,CAAC;EACV;EAEA,0BAA8C;GAC5C,MAAM,SAA6B,CAAC;GACpC,KAAK,MAAM,cAAc,mBAAmB,OAAO,GAAG;IACpD,MAAM,gBAAgB,UAAU,IAAI,WAAW,UAAU;IACzD,IAAI,CAAC,eACH;IAGF,IAAI,CAAC,cAAc,WAAW;KAC5B,MAAM,mBAAmB,qBAAqB,cAAc,aAAa,IACrE,cAAc,gBACd;KACJ,OAAO,KACL,GAAG,qBAAqB;MACtB,QAAQ,CAAC;MACT,OAAO;MACP,YAAY,WAAW;MACvB,UAAU,WAAW,YAAY,cAAc;MAC/C,MAAM,+BAA+B,WAAW,MAAM,gBAAgB;KACxE,CAAC,CACH;IACF;IAEA,OAAO,KAAK,GAAG,uBAAuB;KAAE,QAAQ,CAAC;KAAG;IAAW,CAAC,CAAC;GACnE;GAEA,OAAO;EACT;EAEA,aAAa,MAAc,eAAqF;GAC9G,MAAM,EAAE,QAAQ,gBAAgB,qBAAqB;GACrD,MAAM,oBAAoB;IACxB,GAAG;IACH,SAAS,CAAC,qBAAqB,IAAI,CAAC;GACtC;GAEA,OAAO;IACL,GAAG;IACH,uBAAuB;KACrB,MAAM;KACN,cAAc;KACd,eAAe;KACf,SAAS;KACT;IACF,CAAC;IACD,uBAAuB;KACrB,MAAM;KACN,cAAc;KACd,eAAe;KACf,SAAS;KACT,MAAM,qBAAqB,IAAI;IACjC,CAAC;IACD,uBAAuB;KACrB,MAAM;KACN,cAAc;KACd,MAAM;IACR,CAAC;GACH;EACF;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"responses.adapter.js","names":[],"sources":["../../../src/server/handlers/responses.adapter.ts"],"sourcesContent":["import type { MastraDBMessage } from '@mastra/core/agent';\nimport { isProviderDefinedTool } from '@mastra/core/tools';\nimport { zodToJsonSchema } from '@mastra/core/utils/zod-to-json';\nimport type {\n ConversationItem,\n ResponseInputMessage,\n ResponseObject,\n ResponseOutputItem,\n ResponseTextConfig,\n ResponseTool,\n} from '../schemas/responses';\nimport type { ProviderMetadataLike, ResponseTurnRecord, UsageLike } from './responses.storage';\n\nexport type ResponseExecutionMessage = {\n role: 'system' | 'user' | 'assistant';\n content: string;\n};\n\n/**\n * Flattens Responses API message content into the plain-text shape Mastra agent\n * execution expects today.\n */\nfunction normalizeMessageContent(content: ResponseInputMessage['content']): string {\n if (typeof content === 'string') {\n return content;\n }\n\n return content.map(part => part.text).join('');\n}\n\n/**\n * Extracts the human-readable text represented by a persisted Mastra message.\n */\nfunction getMessageText(message: MastraDBMessage): string {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n return parts\n .flatMap(part => (part.type === 'text' ? [part.text] : []))\n .filter((text): text is string => typeof text === 'string')\n .join('');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction getMessageRole(message: MastraDBMessage): string {\n return (message as { role?: string }).role ?? '';\n}\n\n/**\n * Creates a stable fallback key for tool items when a tool call id is missing\n * from the stored message payload.\n */\nfunction getToolKey(toolCallId: string | null, messageId: string, partIndex: number) {\n return toolCallId ?? `${messageId}:${partIndex}`;\n}\n\nfunction getFunctionCallOutputItemId(toolCallId: string) {\n return `${toolCallId}:output`;\n}\n\n/**\n * Normalizes tool parameter schemas so the Responses API always exposes the\n * plain JSON Schema object regardless of whether the source tool came from a\n * provider-defined tool or a Mastra/Zod tool definition.\n */\nfunction normalizeToolParameters(schema: unknown): unknown {\n if (!isRecord(schema)) {\n return schema;\n }\n\n if (isRecord(schema.json) && Object.keys(schema).length === 1) {\n return schema.json;\n }\n\n return schema;\n}\n\n/**\n * Maps configured Mastra tools into Responses API tool definitions.\n */\nexport function mapMastraToolsToResponseTools(tools: Record<string, unknown> | undefined): ResponseTool[] {\n if (!tools) {\n return [];\n }\n\n return Object.values(tools).flatMap(tool => {\n if (!isRecord(tool)) {\n return [];\n }\n\n const name = typeof tool.id === 'string' ? tool.id : typeof tool.name === 'string' ? tool.name : null;\n if (!name) {\n return [];\n }\n\n const description = typeof tool.description === 'string' ? tool.description : undefined;\n\n let parameters: unknown;\n if (isProviderDefinedTool(tool)) {\n const resolvedSchema = typeof tool.inputSchema === 'function' ? tool.inputSchema() : tool.inputSchema;\n parameters =\n isRecord(resolvedSchema) && 'jsonSchema' in resolvedSchema\n ? normalizeToolParameters(resolvedSchema.jsonSchema)\n : undefined;\n } else if ('inputSchema' in tool && tool.inputSchema) {\n parameters = normalizeToolParameters(zodToJsonSchema(tool.inputSchema as never));\n }\n\n return [\n {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n ...(parameters !== undefined ? { parameters: JSON.parse(JSON.stringify(parameters)) } : {}),\n } satisfies ResponseTool,\n ];\n });\n}\n\nfunction stringifyToolPayload(value: unknown) {\n if (typeof value === 'string') {\n return value;\n }\n\n return JSON.stringify(value === undefined ? {} : value);\n}\n\nfunction stringifyToolArguments(value: unknown) {\n if (isRecord(value) && typeof value.__raw === 'string') {\n return value.__raw;\n }\n\n return stringifyToolPayload(value === null ? undefined : value);\n}\n\nfunction createOutputMessage({\n messageId,\n status,\n text,\n}: {\n messageId: string;\n status: ResponseObject['status'];\n text: string;\n}) {\n const responseStatus: Extract<ResponseObject['output'][number], { type: 'message' }>['status'] =\n status === 'completed' ? 'completed' : 'incomplete';\n\n return {\n id: messageId,\n type: 'message' as const,\n role: 'assistant' as const,\n status: responseStatus,\n content: [createOutputTextPart(text)],\n };\n}\n\nfunction createConversationMessage({\n messageId,\n role,\n text,\n}: {\n messageId: string;\n role: 'system' | 'user' | 'assistant';\n text: string;\n}) {\n return {\n id: messageId,\n type: 'message' as const,\n role,\n status: 'completed' as const,\n content: [\n role === 'assistant'\n ? createOutputTextPart(text)\n : {\n type: 'input_text' as const,\n text,\n },\n ],\n };\n}\n\nfunction createFunctionCallItem({\n itemId,\n callId,\n name,\n args,\n}: {\n itemId: string;\n callId: string;\n name: string;\n args: unknown;\n}) {\n return {\n id: itemId,\n type: 'function_call' as const,\n call_id: callId,\n name,\n arguments: stringifyToolArguments(args),\n status: 'completed' as const,\n };\n}\n\nfunction createFunctionCallOutputItem({ itemId, callId, output }: { itemId: string; callId: string; output: unknown }) {\n return {\n id: itemId,\n type: 'function_call_output' as const,\n call_id: callId,\n output: stringifyToolPayload(output),\n };\n}\n\ntype ResponseToolItem = Extract<ConversationItem, { type: 'function_call' | 'function_call_output' }>;\n\n/**\n * Records which tool call ids already have dedicated tool-result messages so we can\n * avoid duplicating `function_call_output` items when assistant messages echo the\n * result inline.\n */\nfunction collectToolResultCallIds(messages: MastraDBMessage[]) {\n const toolResultCallIds = new Set<string>();\n\n for (const message of messages) {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n for (const [partIndex, part] of parts.entries()) {\n if (!isRecord(part) || part.type !== 'tool-invocation' || !isRecord(part.toolInvocation)) {\n continue;\n }\n\n const toolInvocation = part.toolInvocation;\n const toolCallId =\n typeof toolInvocation.toolCallId === 'string'\n ? toolInvocation.toolCallId\n : getToolKey(null, message.id, partIndex);\n\n if (getMessageRole(message) === 'tool' && toolInvocation.result !== undefined) {\n toolResultCallIds.add(toolCallId);\n }\n }\n }\n\n return toolResultCallIds;\n}\n\n/**\n * Maps one persisted Mastra message into the tool-related Responses items that\n * it contributes to the conversation timeline.\n */\nfunction mapMastraMessageToResponseToolItems({\n message,\n toolResultCallIds,\n emittedCallIds,\n emittedResultCallIds,\n}: {\n message: MastraDBMessage;\n toolResultCallIds: Set<string>;\n emittedCallIds: Set<string>;\n emittedResultCallIds: Set<string>;\n}): ResponseToolItem[] {\n const items: ResponseToolItem[] = [];\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n\n for (const [partIndex, part] of parts.entries()) {\n if (!isRecord(part) || part.type !== 'tool-invocation' || !isRecord(part.toolInvocation)) {\n continue;\n }\n\n const toolInvocation = part.toolInvocation;\n const toolName = typeof toolInvocation.toolName === 'string' ? toolInvocation.toolName : null;\n const toolCallId =\n typeof toolInvocation.toolCallId === 'string'\n ? toolInvocation.toolCallId\n : getToolKey(null, message.id, partIndex);\n\n if (getMessageRole(message) === 'assistant' && toolName && !emittedCallIds.has(toolCallId)) {\n items.push(\n createFunctionCallItem({\n itemId: toolCallId,\n callId: toolCallId,\n name: toolName,\n args: toolInvocation.args,\n }),\n );\n emittedCallIds.add(toolCallId);\n }\n\n if (\n toolInvocation.result !== undefined &&\n !emittedResultCallIds.has(toolCallId) &&\n (getMessageRole(message) === 'tool' || !toolResultCallIds.has(toolCallId))\n ) {\n items.push(\n createFunctionCallOutputItem({\n itemId: getFunctionCallOutputItemId(toolCallId),\n callId: toolCallId,\n output: toolInvocation.result,\n }),\n );\n emittedResultCallIds.add(toolCallId);\n }\n }\n\n return items;\n}\n\n/**\n * Maps Mastra thread messages into OpenAI-style conversation items.\n */\nexport function mapMastraMessagesToConversationItems(messages: MastraDBMessage[]): ConversationItem[] {\n if (!messages.length) {\n return [];\n }\n\n const items: ConversationItem[] = [];\n const toolResultCallIds = collectToolResultCallIds(messages);\n const emittedCallIds = new Set<string>();\n const emittedResultCallIds = new Set<string>();\n\n for (const message of messages) {\n items.push(\n ...mapMastraMessageToResponseToolItems({\n message,\n toolResultCallIds,\n emittedCallIds,\n emittedResultCallIds,\n }),\n );\n\n const role = getMessageRole(message);\n const text = getMessageText(message);\n\n if ((role === 'user' || role === 'system' || role === 'assistant') && text) {\n items.push(\n createConversationMessage({\n messageId: message.id,\n role,\n text,\n }),\n );\n continue;\n }\n\n if (role === 'assistant' && !text) {\n const parts = Array.isArray(message.content?.parts) ? message.content.parts : [];\n const hasOnlyToolInvocations = parts.every(\n part => isRecord(part) && part.type === 'tool-invocation' && isRecord(part.toolInvocation),\n );\n\n if (hasOnlyToolInvocations) {\n continue;\n }\n }\n\n if (role === 'tool') {\n continue;\n }\n }\n\n return items;\n}\n\nfunction mergeFallbackOutputItems({\n output,\n fallbackOutputItems,\n}: {\n output: ResponseOutputItem[];\n fallbackOutputItems: ResponseOutputItem[];\n}): ResponseOutputItem[] {\n if (!fallbackOutputItems.length) {\n return output;\n }\n\n const outputById = new Map(output.map(item => [item.id, item]));\n const fallbackIds = new Set(fallbackOutputItems.map(item => item.id));\n\n return [\n ...fallbackOutputItems.map(item => outputById.get(item.id) ?? item),\n ...output.filter(item => !fallbackIds.has(item.id)),\n ];\n}\n\nfunction getOutputMessageText(item: Extract<ResponseOutputItem, { type: 'message' }>): string {\n return item.content.map(part => part.text).join('');\n}\n\n/**\n * Maps the stored Mastra messages for one response turn back into OpenAI-style\n * `response.output` items, preserving tool/message ordering from the thread.\n */\nexport function mapMastraMessagesToResponseOutputItems({\n messages,\n outputMessageId,\n status,\n fallbackText,\n fallbackOutputItems = [],\n}: {\n messages: MastraDBMessage[] | undefined;\n outputMessageId: string;\n status: ResponseObject['status'];\n fallbackText: string;\n fallbackOutputItems?: ResponseOutputItem[];\n}): ResponseOutputItem[] {\n if (!messages?.length) {\n if (fallbackOutputItems.length) {\n return fallbackOutputItems;\n }\n\n return [createOutputMessage({ messageId: outputMessageId, status, text: fallbackText })];\n }\n\n const output: ResponseOutputItem[] = [];\n const lastAssistantIndex = [...messages].map(message => message.role).lastIndexOf('assistant');\n const outputMessageIndex =\n [...messages]\n .map((message, index) => ({ index, message }))\n .reverse()\n .find(({ message }) => getMessageRole(message) === 'assistant' && getMessageText(message))?.index ??\n lastAssistantIndex;\n const toolResultCallIds = collectToolResultCallIds(messages);\n const emittedCallIds = new Set<string>();\n const emittedResultCallIds = new Set<string>();\n const fallbackMessageItems = fallbackOutputItems.filter(\n (item): item is Extract<ResponseOutputItem, { type: 'message' }> => item.type === 'message',\n );\n const emittedFallbackMessageIds = new Set<string>();\n\n const getOutputMessageId = ({\n message,\n text,\n useOutputMessageId,\n }: {\n message: MastraDBMessage;\n text: string;\n useOutputMessageId: boolean;\n }) => {\n const directFallbackItem = fallbackMessageItems.find(item => item.id === message.id);\n if (directFallbackItem) {\n emittedFallbackMessageIds.add(directFallbackItem.id);\n return directFallbackItem.id;\n }\n\n if (useOutputMessageId) {\n const matchingFallbackItem = fallbackMessageItems.find(\n item =>\n item.id !== outputMessageId && !emittedFallbackMessageIds.has(item.id) && getOutputMessageText(item) === text,\n );\n if (matchingFallbackItem) {\n emittedFallbackMessageIds.add(matchingFallbackItem.id);\n return matchingFallbackItem.id;\n }\n }\n\n return useOutputMessageId ? outputMessageId : message.id;\n };\n\n for (const [messageIndex, message] of messages.entries()) {\n output.push(\n ...mapMastraMessageToResponseToolItems({\n message,\n toolResultCallIds,\n emittedCallIds,\n emittedResultCallIds,\n }),\n );\n\n const text = getMessageText(message);\n if (getMessageRole(message) === 'assistant' && text) {\n const useOutputMessageId = messageIndex === outputMessageIndex;\n output.push(\n createOutputMessage({\n messageId: getOutputMessageId({ message, text, useOutputMessageId }),\n status,\n text,\n }),\n );\n }\n }\n\n if (!output.some(item => item.type === 'message') && fallbackText) {\n output.push(createOutputMessage({ messageId: outputMessageId, status, text: fallbackText }));\n }\n\n return mergeFallbackOutputItems({ output, fallbackOutputItems });\n}\n\n/**\n * Creates a stable assistant-message-backed response identifier.\n */\nexport function createMessageId() {\n return `msg_${globalThis.crypto.randomUUID()}`;\n}\n\n/**\n * Maps Responses API input into the plain execution messages Mastra agents expect.\n */\nexport function mapResponseInputToExecutionMessages(\n input: ResponseInputMessage[] | string,\n): ResponseExecutionMessage[] {\n if (typeof input === 'string') {\n return [{ role: 'user', content: input }];\n }\n\n return input.map(message => ({\n role: message.role === 'developer' ? 'system' : message.role,\n content: normalizeMessageContent(message.content),\n }));\n}\n\n/**\n * Converts usage details to the Responses API usage shape.\n */\nexport function toResponseUsage(usage: UsageLike): ResponseObject['usage'] {\n if (!usage) {\n return null;\n }\n\n const inputTokens = usage.inputTokens ?? usage.promptTokens;\n const outputTokens = usage.outputTokens ?? usage.completionTokens;\n if (inputTokens === undefined || outputTokens === undefined) {\n return null;\n }\n const totalTokens = usage.totalTokens ?? inputTokens + outputTokens;\n\n return {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: totalTokens,\n input_tokens_details: {\n cached_tokens: 0,\n },\n output_tokens_details: {\n reasoning_tokens: 0,\n },\n };\n}\n\n/**\n * Maps model finish reasons onto the Responses API status field.\n */\nexport function toResponseStatus(finishReason: string | undefined): ResponseObject['status'] {\n if (finishReason === 'suspended' || finishReason === 'error') {\n return 'incomplete';\n }\n\n return 'completed';\n}\n\n/**\n * Formats a text response part using the OpenAI-compatible Responses shape.\n */\nexport function createOutputTextPart(text: string) {\n return {\n type: 'output_text' as const,\n text,\n annotations: [] as unknown[],\n logprobs: [] as unknown[],\n };\n}\n\n/**\n * Builds a completed Responses API object from Mastra execution state.\n */\nexport function buildCompletedResponse({\n responseId,\n outputMessageId,\n model,\n createdAt,\n completedAt,\n status,\n text,\n usage,\n instructions,\n textConfig,\n previousResponseId,\n conversationId,\n providerOptions,\n tools,\n store,\n messages,\n fallbackOutputItems,\n}: {\n responseId: string;\n outputMessageId: string;\n model: string;\n createdAt: number;\n completedAt: number | null;\n status: ResponseObject['status'];\n text: string;\n usage: UsageLike;\n instructions?: string;\n textConfig?: ResponseTextConfig;\n previousResponseId?: string;\n conversationId?: string;\n providerOptions?: ProviderMetadataLike;\n tools: ResponseTool[];\n store: boolean;\n messages?: MastraDBMessage[];\n fallbackOutputItems?: ResponseOutputItem[];\n}): ResponseObject {\n return {\n id: responseId,\n object: 'response',\n created_at: createdAt,\n completed_at: completedAt,\n model,\n status,\n output: mapMastraMessagesToResponseOutputItems({\n messages,\n outputMessageId,\n status,\n fallbackText: text,\n fallbackOutputItems,\n }),\n usage: toResponseUsage(usage),\n error: null,\n incomplete_details: null,\n instructions: instructions ?? null,\n text: textConfig ?? null,\n previous_response_id: previousResponseId ?? null,\n conversation_id: conversationId ?? null,\n providerOptions,\n tools,\n store,\n };\n}\n\n/**\n * Builds the initial in-progress Responses API object emitted at stream start.\n */\nexport function buildInProgressResponse({\n responseId,\n model,\n createdAt,\n instructions,\n textConfig,\n previousResponseId,\n conversationId,\n tools,\n store,\n}: {\n responseId: string;\n model: string;\n createdAt: number;\n instructions?: string;\n textConfig?: ResponseTextConfig;\n previousResponseId?: string;\n conversationId?: string;\n store: boolean;\n tools?: ResponseTool[];\n}): ResponseObject {\n return {\n id: responseId,\n object: 'response',\n created_at: createdAt,\n completed_at: null,\n model,\n status: 'in_progress',\n output: [],\n usage: null,\n error: null,\n incomplete_details: null,\n instructions: instructions ?? null,\n text: textConfig ?? null,\n previous_response_id: previousResponseId ?? null,\n conversation_id: conversationId ?? null,\n tools: tools ?? [],\n store,\n };\n}\n\n/**\n * Reconstructs a Responses API object from a stored response-turn record.\n */\nexport function mapResponseTurnRecordToResponse(match: ResponseTurnRecord): ResponseObject {\n return {\n id: match.message.id,\n object: 'response',\n created_at: match.metadata.createdAt,\n completed_at: match.metadata.completedAt,\n model: match.metadata.model,\n status: match.metadata.status,\n output: mapMastraMessagesToResponseOutputItems({\n messages: match.messages,\n outputMessageId: match.message.id,\n status: match.metadata.status,\n fallbackText: getMessageText(match.message),\n fallbackOutputItems: match.metadata.outputItems,\n }),\n usage: match.metadata.usage,\n error: null,\n incomplete_details: null,\n instructions: match.metadata.instructions ?? null,\n text: match.metadata.text ?? null,\n previous_response_id: match.metadata.previousResponseId ?? null,\n conversation_id: match.thread.id,\n providerOptions: match.metadata.providerOptions,\n tools: match.metadata.tools,\n store: match.metadata.store,\n };\n}\n\n/**\n * Formats an SSE event line for the streaming Responses route.\n */\nexport function formatSseEvent(event: string, data: unknown): Uint8Array {\n return new TextEncoder().encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`);\n}\n\n/**\n * Extracts text deltas from the Mastra stream chunk variants used by the route.\n */\nexport function extractTextDelta(value: unknown): string | null {\n if (typeof value !== 'object' || value === null || !('type' in value)) {\n return null;\n }\n\n const chunk = value as { type: string; payload?: { text?: string }; textDelta?: string; text?: string };\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.textDelta === 'string') {\n return chunk.textDelta;\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\ntype ResponseOutputItemAddedPayload = {\n type: 'response.output_item.added';\n output_index: number;\n item: ResponseOutputItem;\n};\n\ntype ResponseContentPartAddedPayload = {\n type: 'response.content_part.added';\n output_index: number;\n content_index: number;\n item_id: string;\n part: ReturnType<typeof createOutputTextPart>;\n};\n\ntype ResponseOutputTextDeltaPayload = {\n type: 'response.output_text.delta';\n output_index: number;\n content_index: number;\n item_id: string;\n delta: string;\n};\n\ntype ResponseFunctionCallArgumentsDeltaPayload = {\n type: 'response.function_call_arguments.delta';\n output_index: number;\n item_id: string;\n delta: string;\n};\n\ntype ResponseFunctionCallArgumentsDonePayload = {\n type: 'response.function_call_arguments.done';\n output_index: number;\n item_id: string;\n name: string;\n arguments: string;\n};\n\ntype ResponseOutputItemDonePayload = {\n type: 'response.output_item.done';\n output_index: number;\n item: ResponseOutputItem;\n};\n\ntype ResponseOutputTextDonePayload = {\n type: 'response.output_text.done';\n output_index: number;\n content_index: number;\n item_id: string;\n text: string;\n};\n\ntype ResponseContentPartDonePayload = {\n type: 'response.content_part.done';\n output_index: number;\n content_index: number;\n item_id: string;\n part: ReturnType<typeof createOutputTextPart>;\n};\n\ntype ResponseSsePayload =\n | ResponseOutputItemAddedPayload\n | ResponseContentPartAddedPayload\n | ResponseOutputTextDeltaPayload\n | ResponseFunctionCallArgumentsDeltaPayload\n | ResponseFunctionCallArgumentsDonePayload\n | ResponseOutputItemDonePayload\n | ResponseOutputTextDonePayload\n | ResponseContentPartDonePayload;\n\ntype ResponseSseEvent<TPayload extends ResponseSsePayload = ResponseSsePayload> = {\n event: TPayload['type'];\n payload: TPayload;\n};\n\nfunction createResponseSseEvent<TPayload extends ResponseSsePayload>(payload: TPayload): ResponseSseEvent<TPayload> {\n return { event: payload.type, payload };\n}\n\ntype ToolCallStreamState = {\n argumentsText: string;\n completed: boolean;\n itemId: string;\n name: string;\n outputIndex: number;\n zeroArgumentInputEnded: boolean;\n};\n\ntype ToolResultStreamState = {\n args: unknown;\n result: unknown;\n toolCallId: string;\n toolName?: string;\n};\n\nfunction getChunkPayload(value: unknown): Record<string, unknown> | null {\n if (!isRecord(value)) {\n return null;\n }\n\n return isRecord(value.payload) ? value.payload : value;\n}\n\nfunction stringifyResponsePayload(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n return JSON.stringify(value === undefined ? {} : value);\n}\n\nfunction stringifyFunctionCallArguments(value: unknown, fallback = ''): string {\n const serialized = value === undefined || value === null ? fallback : stringifyResponsePayload(value);\n return serialized || fallback || '{}';\n}\n\nfunction removeWhitespaceOutsideJsonStrings(value: string): string {\n let inString = false;\n let escaped = false;\n let result = '';\n\n for (const char of value) {\n if (escaped) {\n escaped = false;\n result += char;\n continue;\n }\n\n if (char === '\\\\' && inString) {\n escaped = true;\n result += char;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n result += char;\n continue;\n }\n\n if (!inString && /\\s/.test(char)) {\n continue;\n }\n\n result += char;\n }\n\n return result;\n}\n\nfunction getRemainingArgumentsDelta(current: string, canonical: string): string | null {\n if (!current) {\n return canonical;\n }\n\n if (canonical.startsWith(current)) {\n return canonical.slice(current.length);\n }\n\n const compactCurrent = removeWhitespaceOutsideJsonStrings(current);\n const compactCanonical = removeWhitespaceOutsideJsonStrings(canonical);\n if (compactCurrent && compactCanonical.startsWith(compactCurrent)) {\n return compactCanonical.slice(compactCurrent.length);\n }\n\n return null;\n}\n\nfunction isCompleteJsonString(value: string): boolean {\n if (!value) {\n return true;\n }\n\n try {\n JSON.parse(value);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction serializeToolError(error: unknown) {\n if (error instanceof Error) {\n return { error: error.message };\n }\n\n return { error };\n}\n\nfunction getToolCallStart(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call-input-streaming-start') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n const toolName = payload?.toolName;\n if (typeof toolCallId !== 'string' || typeof toolName !== 'string') {\n return null;\n }\n\n return { toolCallId, toolName };\n}\n\nfunction getToolCallDelta(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call-delta') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n // Mastra/AI SDK stream chunks have used different names for streamed tool\n // argument text across versions; normalize them to the Responses delta shape.\n const delta = payload?.argsTextDelta ?? payload?.inputTextDelta ?? payload?.argsDelta ?? payload?.delta;\n if (!payload || typeof toolCallId !== 'string' || typeof delta !== 'string') {\n return null;\n }\n\n return {\n toolCallId,\n toolName: typeof payload.toolName === 'string' ? payload.toolName : undefined,\n delta,\n };\n}\n\nfunction getToolCall(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n const toolName = payload?.toolName;\n const args = payload?.args ?? payload?.input;\n if (typeof toolCallId !== 'string' || typeof toolName !== 'string') {\n return null;\n }\n\n return { toolCallId, toolName, args };\n}\n\nfunction getToolCallEnd(value: unknown) {\n if (!isRecord(value) || value.type !== 'tool-call-input-streaming-end') {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n if (typeof toolCallId !== 'string') {\n return null;\n }\n\n return { toolCallId };\n}\n\nfunction getToolResult(value: unknown) {\n if (!isRecord(value) || (value.type !== 'tool-result' && value.type !== 'tool-error')) {\n return null;\n }\n\n const payload = getChunkPayload(value);\n const toolCallId = payload?.toolCallId;\n if (!payload || typeof toolCallId !== 'string') {\n return null;\n }\n\n const toolName = typeof payload.toolName === 'string' ? payload.toolName : undefined;\n const args = payload.args ?? payload.input;\n\n if (value.type === 'tool-error') {\n return { toolCallId, toolName, args, result: serializeToolError(payload.error) };\n }\n\n const outputValue = payload.result !== undefined ? payload.result : payload.output;\n const result = payload.isError ? serializeToolError(outputValue) : outputValue;\n\n return { toolCallId, toolName, args, result };\n}\n\nexport function createResponseStreamEventTranslator(responseId: string) {\n // Keep emitted SSE terminal payloads and the final completed response output\n // aligned. Once a tool call is completed, later duplicate/canonical chunks are\n // ignored because Responses SSE has no replacement event for arguments.done.\n let text = '';\n let nextOutputIndex = 0;\n let textOutputIndex: number | null = null;\n const completedToolResultCallIds = new Set<string>();\n const pendingToolResults = new Map<string, ToolResultStreamState>();\n const toolCalls = new Map<string, ToolCallStreamState>();\n const outputItems = new Map<number, ResponseOutputItem>();\n\n const ensureTextOutputItem = (): { events: ResponseSseEvent[]; outputIndex: number } => {\n if (textOutputIndex !== null) {\n return { events: [], outputIndex: textOutputIndex };\n }\n\n textOutputIndex = nextOutputIndex++;\n return {\n outputIndex: textOutputIndex,\n events: [\n createResponseSseEvent({\n type: 'response.output_item.added',\n output_index: textOutputIndex,\n item: {\n id: responseId,\n type: 'message',\n role: 'assistant',\n status: 'in_progress',\n content: [],\n },\n }),\n createResponseSseEvent({\n type: 'response.content_part.added',\n output_index: textOutputIndex,\n content_index: 0,\n item_id: responseId,\n part: createOutputTextPart(''),\n }),\n ],\n };\n };\n\n const ensureToolCallItem = ({\n toolCallId,\n toolName,\n }: {\n toolCallId: string;\n toolName: string;\n }): { events: ResponseSseEvent[]; state: ToolCallStreamState } => {\n const existing = toolCalls.get(toolCallId);\n if (existing) {\n if (!existing.completed && toolName && existing.name !== toolName) {\n existing.name = toolName;\n }\n\n return { events: [], state: existing };\n }\n\n const state = {\n argumentsText: '',\n completed: false,\n itemId: toolCallId,\n name: toolName,\n outputIndex: nextOutputIndex++,\n zeroArgumentInputEnded: false,\n };\n toolCalls.set(toolCallId, state);\n\n return {\n state,\n events: [\n createResponseSseEvent({\n type: 'response.output_item.added',\n output_index: state.outputIndex,\n item: {\n id: state.itemId,\n type: 'function_call',\n call_id: toolCallId,\n name: toolName,\n arguments: '',\n status: 'in_progress',\n },\n }),\n ],\n };\n };\n\n const completeToolCallItem = ({\n events,\n state,\n toolCallId,\n toolName,\n args,\n }: {\n events: ResponseSseEvent[];\n state: ToolCallStreamState;\n toolCallId: string;\n toolName: string;\n args: string;\n }): ResponseSseEvent[] => {\n if (state.completed) {\n return events;\n }\n\n const item = {\n id: state.itemId,\n type: 'function_call' as const,\n call_id: toolCallId,\n name: toolName,\n arguments: args,\n status: 'completed' as const,\n };\n\n state.argumentsText = args;\n state.completed = true;\n outputItems.set(state.outputIndex, item);\n\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.function_call_arguments.done',\n item_id: state.itemId,\n output_index: state.outputIndex,\n name: toolName,\n arguments: args,\n }),\n createResponseSseEvent({\n type: 'response.output_item.done',\n output_index: state.outputIndex,\n item,\n }),\n ];\n };\n\n const completeToolResultItem = ({\n events,\n toolResult,\n }: {\n events: ResponseSseEvent[];\n toolResult: ToolResultStreamState;\n }): ResponseSseEvent[] => {\n if (completedToolResultCallIds.has(toolResult.toolCallId)) {\n return events;\n }\n completedToolResultCallIds.add(toolResult.toolCallId);\n pendingToolResults.delete(toolResult.toolCallId);\n\n const outputIndex = nextOutputIndex++;\n const item = {\n id: getFunctionCallOutputItemId(toolResult.toolCallId),\n type: 'function_call_output' as const,\n call_id: toolResult.toolCallId,\n output: stringifyResponsePayload(toolResult.result),\n };\n outputItems.set(outputIndex, item);\n\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.output_item.added',\n output_index: outputIndex,\n item,\n }),\n createResponseSseEvent({\n type: 'response.output_item.done',\n output_index: outputIndex,\n item,\n }),\n ];\n };\n\n return {\n get text() {\n return text;\n },\n\n getOutputItems({ text, status }: { text: string; status: ResponseObject['status'] }) {\n const items = new Map(outputItems);\n if (text) {\n const messageOutputIndex = textOutputIndex ?? nextOutputIndex;\n items.set(messageOutputIndex, createOutputMessage({ messageId: responseId, status, text }));\n }\n\n return [...items.entries()].sort(([left], [right]) => left - right).map(([, item]) => item);\n },\n\n consume(value: unknown): ResponseSseEvent[] {\n const textDelta = extractTextDelta(value);\n if (textDelta) {\n const { events, outputIndex } = ensureTextOutputItem();\n text += textDelta;\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.output_text.delta',\n output_index: outputIndex,\n content_index: 0,\n item_id: responseId,\n delta: textDelta,\n }),\n ];\n }\n\n const toolCallStart = getToolCallStart(value);\n if (toolCallStart) {\n return ensureToolCallItem(toolCallStart).events;\n }\n\n const toolCallDelta = getToolCallDelta(value);\n if (toolCallDelta) {\n const existing = toolCalls.get(toolCallDelta.toolCallId);\n if (!existing && !toolCallDelta.toolName) {\n return [];\n }\n if (existing?.completed) {\n return [];\n }\n\n const ensured = ensureToolCallItem({\n toolCallId: toolCallDelta.toolCallId,\n toolName: toolCallDelta.toolName ?? existing!.name,\n });\n\n ensured.state.argumentsText += toolCallDelta.delta;\n ensured.state.zeroArgumentInputEnded = false;\n return [\n ...ensured.events,\n createResponseSseEvent({\n type: 'response.function_call_arguments.delta',\n item_id: ensured.state.itemId,\n output_index: ensured.state.outputIndex,\n delta: toolCallDelta.delta,\n }),\n ];\n }\n\n const toolCallEnd = getToolCallEnd(value);\n if (toolCallEnd) {\n const state = toolCalls.get(toolCallEnd.toolCallId);\n if (!state || state.completed) {\n return [];\n }\n\n state.zeroArgumentInputEnded = !state.argumentsText;\n return [];\n }\n\n const toolCall = getToolCall(value);\n if (toolCall) {\n const { events, state } = ensureToolCallItem(toolCall);\n const canonicalArgs = stringifyFunctionCallArguments(toolCall.args, state.argumentsText);\n if (state.completed) {\n const nextEvents = completeToolCallItem({\n events,\n state,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args: canonicalArgs,\n });\n\n const pendingToolResult = pendingToolResults.get(toolCall.toolCallId);\n return pendingToolResult\n ? completeToolResultItem({ events: nextEvents, toolResult: pendingToolResult })\n : nextEvents;\n }\n\n const remainingArgsDelta = getRemainingArgumentsDelta(state.argumentsText, canonicalArgs);\n const args =\n remainingArgsDelta === null\n ? // If both strings are valid but disagree, keep the bytes already emitted\n // as deltas so arguments.done and response.output stay consistent.\n isCompleteJsonString(state.argumentsText)\n ? state.argumentsText\n : canonicalArgs\n : state.argumentsText + remainingArgsDelta;\n const nextEvents = remainingArgsDelta\n ? [\n ...events,\n createResponseSseEvent({\n type: 'response.function_call_arguments.delta',\n item_id: state.itemId,\n output_index: state.outputIndex,\n delta: remainingArgsDelta,\n }),\n ]\n : events;\n\n const completedEvents = completeToolCallItem({\n events: nextEvents,\n state,\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n args,\n });\n\n const pendingToolResult = pendingToolResults.get(toolCall.toolCallId);\n return pendingToolResult\n ? completeToolResultItem({ events: completedEvents, toolResult: pendingToolResult })\n : completedEvents;\n }\n\n const toolResult = getToolResult(value);\n if (toolResult) {\n const existingToolCallState = toolCalls.get(toolResult.toolCallId);\n if (!existingToolCallState && !toolResult.toolName) {\n return [];\n }\n\n const { events: toolCallEvents, state: toolCallState } = ensureToolCallItem({\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName ?? existingToolCallState!.name,\n });\n\n if (completedToolResultCallIds.has(toolResult.toolCallId)) {\n return [];\n }\n\n const events: ResponseSseEvent[] = [...toolCallEvents];\n if (!toolCallState.completed) {\n const args = stringifyFunctionCallArguments(toolResult.args, toolCallState.argumentsText || '{}');\n const hasZeroArgumentHint = toolCallState.zeroArgumentInputEnded && !toolCallState.argumentsText;\n if (\n toolResult.args === undefined &&\n !hasZeroArgumentHint &&\n (!toolCallState.argumentsText || !isCompleteJsonString(toolCallState.argumentsText))\n ) {\n pendingToolResults.set(toolResult.toolCallId, toolResult);\n return events;\n }\n\n events.push(\n ...completeToolCallItem({\n events: [],\n state: toolCallState,\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName ?? toolCallState.name,\n args,\n }),\n );\n }\n\n return completeToolResultItem({ events, toolResult });\n }\n\n return [];\n },\n\n flushPendingToolResults(): ResponseSseEvent[] {\n const events: ResponseSseEvent[] = [];\n for (const toolResult of pendingToolResults.values()) {\n const toolCallState = toolCalls.get(toolResult.toolCallId);\n if (!toolCallState) {\n continue;\n }\n\n if (!toolCallState.completed) {\n const safeFallbackArgs = isCompleteJsonString(toolCallState.argumentsText)\n ? toolCallState.argumentsText\n : '{}';\n events.push(\n ...completeToolCallItem({\n events: [],\n state: toolCallState,\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName ?? toolCallState.name,\n args: stringifyFunctionCallArguments(toolResult.args, safeFallbackArgs),\n }),\n );\n }\n\n events.push(...completeToolResultItem({ events: [], toolResult }));\n }\n\n return events;\n },\n\n completeText(text: string, completedItem: Extract<ResponseOutputItem, { type: 'message' }>): ResponseSseEvent[] {\n const { events, outputIndex } = ensureTextOutputItem();\n const completedTextItem = {\n ...completedItem,\n content: [createOutputTextPart(text)],\n };\n\n return [\n ...events,\n createResponseSseEvent({\n type: 'response.output_text.done',\n output_index: outputIndex,\n content_index: 0,\n item_id: responseId,\n text,\n }),\n createResponseSseEvent({\n type: 'response.content_part.done',\n output_index: outputIndex,\n content_index: 0,\n item_id: responseId,\n part: createOutputTextPart(text),\n }),\n createResponseSseEvent({\n type: 'response.output_item.done',\n output_index: outputIndex,\n item: completedTextItem,\n }),\n ];\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ const require_rolldown_runtime = require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
|
3
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
4
4
|
const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
|
|
5
5
|
const require_server_handlers_error = require("./error.cjs");
|
|
6
|
-
const require_utils = require("../../utils-
|
|
6
|
+
const require_utils = require("../../utils-HqDZJwRc.cjs");
|
|
7
7
|
const require_server_handlers_agents = require("./agents.cjs");
|
|
8
8
|
const require_responses = require("../../responses-CKNdSRkS.cjs");
|
|
9
9
|
const require_server_handlers_responses_adapter = require("./responses.adapter.cjs");
|
|
@@ -2,7 +2,7 @@ import { r as __exportAll } from "../../rolldown-runtime-maW3aOIk.js";
|
|
|
2
2
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
3
3
|
import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
|
|
4
4
|
import { handleError } from "./error.js";
|
|
5
|
-
import { i as getEffectiveThreadId,
|
|
5
|
+
import { i as getEffectiveThreadId, m as MastraFGAPermissions, r as getEffectiveResourceId, t as enforceThreadAccess } from "../../utils-KcHk7C0D.js";
|
|
6
6
|
import { getAgentFromSystem } from "./agents.js";
|
|
7
7
|
import { a as deleteResponseSchema, i as createResponseBodySchema, o as responseIdPathParams, u as responseObjectSchema } from "../../responses-DJNJgCTg.js";
|
|
8
8
|
import { buildCompletedResponse, buildInProgressResponse, createMessageId, createOutputTextPart, createResponseStreamEventTranslator, formatSseEvent, mapMastraToolsToResponseTools, mapResponseInputToExecutionMessages, mapResponseTurnRecordToResponse, toResponseStatus, toResponseUsage } from "./responses.adapter.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
3
|
const require_http_exception = require("../../http-exception-CKDHupKw.cjs");
|
|
4
|
-
const require_utils = require("../../utils-
|
|
4
|
+
const require_utils = require("../../utils-HqDZJwRc.cjs");
|
|
5
5
|
//#region src/server/handlers/responses.storage.ts
|
|
6
6
|
function isPlainObject(value) {
|
|
7
7
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as HTTPException } from "../../http-exception-CyfxZB6W.js";
|
|
2
|
-
import {
|
|
2
|
+
import { p as validateThreadOwnership, r as getEffectiveResourceId } from "../../utils-KcHk7C0D.js";
|
|
3
3
|
//#region src/server/handlers/responses.storage.ts
|
|
4
4
|
function isPlainObject(value) {
|
|
5
5
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -89,7 +89,7 @@ const GET_API_SCHEMA_ROUTE = require_route_builder.createRoute({
|
|
|
89
89
|
tags: ["System"],
|
|
90
90
|
requiresAuth: true,
|
|
91
91
|
handler: async () => {
|
|
92
|
-
const { buildApiSchemaManifest } = await Promise.resolve().then(() => require("../../api-schema-manifest-
|
|
92
|
+
const { buildApiSchemaManifest } = await Promise.resolve().then(() => require("../../api-schema-manifest-hJw56vOw.cjs"));
|
|
93
93
|
return buildApiSchemaManifest();
|
|
94
94
|
}
|
|
95
95
|
});
|
|
@@ -87,7 +87,7 @@ const GET_API_SCHEMA_ROUTE = createRoute({
|
|
|
87
87
|
tags: ["System"],
|
|
88
88
|
requiresAuth: true,
|
|
89
89
|
handler: async () => {
|
|
90
|
-
const { buildApiSchemaManifest } = await import("../../api-schema-manifest-
|
|
90
|
+
const { buildApiSchemaManifest } = await import("../../api-schema-manifest-Cg5BAmJ6.js");
|
|
91
91
|
return buildApiSchemaManifest();
|
|
92
92
|
}
|
|
93
93
|
});
|
|
@@ -8,7 +8,7 @@ const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
|
|
|
8
8
|
require("../../schema-BVcoNfni.cjs");
|
|
9
9
|
const require_utils = require("../../utils-DFQixxkO.cjs");
|
|
10
10
|
const require_server_handlers_error = require("./error.cjs");
|
|
11
|
-
const require_utils$1 = require("../../utils-
|
|
11
|
+
const require_utils$1 = require("../../utils-HqDZJwRc.cjs");
|
|
12
12
|
const require_server_handlers_tool_schema_overrides = require("./tool-schema-overrides.cjs");
|
|
13
13
|
const require_server_handlers_agents = require("./agents.cjs");
|
|
14
14
|
let _mastra_core_tools = require("@mastra/core/tools");
|
|
@@ -7,7 +7,7 @@ import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
|
|
|
7
7
|
import "../../schema-Xxr5X5Je.js";
|
|
8
8
|
import { l as stringify } from "../../utils-BJm0ZYnM.js";
|
|
9
9
|
import { handleError } from "./error.js";
|
|
10
|
-
import {
|
|
10
|
+
import { d as validateBody, m as MastraFGAPermissions } from "../../utils-KcHk7C0D.js";
|
|
11
11
|
import { stripInjectedToolOverrideFields } from "./tool-schema-overrides.js";
|
|
12
12
|
import { getAgentFromSystem } from "./agents.js";
|
|
13
13
|
import { isProviderDefinedTool, isVercelTool } from "@mastra/core/tools";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
-
const require_utils = require("../../utils-
|
|
3
|
+
const require_utils = require("../../utils-HqDZJwRc.cjs");
|
|
4
4
|
exports.enforceThreadAccess = require_utils.enforceThreadAccess;
|
|
5
5
|
exports.getContextResourceId = require_utils.getContextResourceId;
|
|
6
6
|
exports.getEffectiveResourceId = require_utils.getEffectiveResourceId;
|
|
@@ -10,6 +10,7 @@ exports.parseFilters = require_utils.parseFilters;
|
|
|
10
10
|
exports.parsePerPage = require_utils.parsePerPage;
|
|
11
11
|
exports.requireEffectiveResourceId = require_utils.requireEffectiveResourceId;
|
|
12
12
|
exports.sanitizeBody = require_utils.sanitizeBody;
|
|
13
|
+
exports.stripClientCredentialHeaders = require_utils.stripClientCredentialHeaders;
|
|
13
14
|
exports.validateBody = require_utils.validateBody;
|
|
14
15
|
exports.validateRunOwnership = require_utils.validateRunOwnership;
|
|
15
16
|
exports.validateThreadOwnership = require_utils.validateThreadOwnership;
|
|
@@ -7,6 +7,12 @@ export declare function validateBody(body: Record<string, unknown>): void;
|
|
|
7
7
|
* @param disallowedKeys keys to remove from the body
|
|
8
8
|
*/
|
|
9
9
|
export declare function sanitizeBody(body: Record<string, unknown>, disallowedKeys: string[]): void;
|
|
10
|
+
/**
|
|
11
|
+
* Removes credential-bearing headers from client-supplied `modelSettings.headers`
|
|
12
|
+
* so a caller's own auth (e.g. the app's bearer token) can never override the
|
|
13
|
+
* provider credential configured on the server. Non-credential headers are kept.
|
|
14
|
+
*/
|
|
15
|
+
export declare function stripClientCredentialHeaders(body: Record<string, unknown>): void;
|
|
10
16
|
export declare function parsePerPage(value: string | undefined, defaultValue?: number, max?: number): number | false;
|
|
11
17
|
/**
|
|
12
18
|
* Parses filter query parameters into a key-value object.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAWzD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,QAMnF;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,GAAE,MAAY,EAC1B,GAAG,GAAE,MAAa,GACjB,MAAM,GAAG,KAAK,CAShB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAUvG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,oBAAoB,EAAE,cAAc,EAAE,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAW/G;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEnG;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,OAAO,CAAC,mBAAmB,IAAI,MAAM,CAOvC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACzD,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,MAAM,EACN,cAAc,EACd,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,UAA6C,GAC9C,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,wBAAwB,CAAC;CACvC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACtD,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAOtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAWzD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,QAMnF;AAWD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAUzE;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,YAAY,GAAE,MAAY,EAC1B,GAAG,GAAE,MAAa,GACjB,MAAM,GAAG,KAAK,CAShB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAUvG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,oBAAoB,EAAE,cAAc,EAAE,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAW/G;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEnG;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,OAAO,CAAC,mBAAmB,IAAI,MAAM,CAOvC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,MAAM,GAAG,SAAS,CAGpB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACzD,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,EACxC,MAAM,EACN,cAAc,EACd,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,UAA6C,GAC9C,EAAE;IACD,MAAM,EAAE,GAAG,CAAC;IACZ,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,wBAAwB,CAAC;CACvC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,EACtD,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as mergeBodyRequestContext, c as requireEffectiveResourceId, d as
|
|
2
|
-
export { enforceThreadAccess, getContextResourceId, getEffectiveResourceId, getEffectiveThreadId, mergeBodyRequestContext, parseFilters, parsePerPage, requireEffectiveResourceId, sanitizeBody, validateBody, validateRunOwnership, validateThreadOwnership };
|
|
1
|
+
import { a as mergeBodyRequestContext, c as requireEffectiveResourceId, d as validateBody, f as validateRunOwnership, i as getEffectiveThreadId, l as sanitizeBody, n as getContextResourceId, o as parseFilters, p as validateThreadOwnership, r as getEffectiveResourceId, s as parsePerPage, t as enforceThreadAccess, u as stripClientCredentialHeaders } from "../../utils-KcHk7C0D.js";
|
|
2
|
+
export { enforceThreadAccess, getContextResourceId, getEffectiveResourceId, getEffectiveThreadId, mergeBodyRequestContext, parseFilters, parsePerPage, requireEffectiveResourceId, sanitizeBody, stripClientCredentialHeaders, validateBody, validateRunOwnership, validateThreadOwnership };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../rolldown-runtime-Bd6kNlEP.cjs");
|
|
3
|
-
const require_workflow_builder = require("../../workflow-builder-
|
|
3
|
+
const require_workflow_builder = require("../../workflow-builder-BSjQJCVD.cjs");
|
|
4
4
|
exports.GET_WORKFLOW_BUILDER_SETTINGS_ROUTE = require_workflow_builder.GET_WORKFLOW_BUILDER_SETTINGS_ROUTE;
|
|
5
5
|
exports.STREAM_WORKFLOW_BUILDER_ROUTE = require_workflow_builder.STREAM_WORKFLOW_BUILDER_ROUTE;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as STREAM_WORKFLOW_BUILDER_ROUTE, t as GET_WORKFLOW_BUILDER_SETTINGS_ROUTE } from "../../workflow-builder-
|
|
1
|
+
import { n as STREAM_WORKFLOW_BUILDER_ROUTE, t as GET_WORKFLOW_BUILDER_SETTINGS_ROUTE } from "../../workflow-builder-DJ48IzXQ.js";
|
|
2
2
|
export { GET_WORKFLOW_BUILDER_SETTINGS_ROUTE, STREAM_WORKFLOW_BUILDER_ROUTE };
|
|
@@ -7,7 +7,7 @@ const require_agents = require("../../agents-DwJE1tsB.cjs");
|
|
|
7
7
|
const require_route_builder = require("../../route-builder-2yrD15TL.cjs");
|
|
8
8
|
const require_utils = require("../../utils-DFQixxkO.cjs");
|
|
9
9
|
const require_server_handlers_error = require("./error.cjs");
|
|
10
|
-
const require_utils$1 = require("../../utils-
|
|
10
|
+
const require_utils$1 = require("../../utils-HqDZJwRc.cjs");
|
|
11
11
|
let zod_v4 = require("zod/v4");
|
|
12
12
|
let _mastra_core_stream = require("@mastra/core/stream");
|
|
13
13
|
//#region src/server/handlers/workflows.ts
|
|
@@ -6,7 +6,7 @@ import { J as streamResponseSchema } from "../../agents-kOz1lr_e.js";
|
|
|
6
6
|
import { n as createRoute } from "../../route-builder-lBil8Cvo.js";
|
|
7
7
|
import { a as getWorkflowInfo, t as WorkflowRegistry } from "../../utils-BJm0ZYnM.js";
|
|
8
8
|
import { handleError } from "./error.js";
|
|
9
|
-
import {
|
|
9
|
+
import { f as validateRunOwnership, m as MastraFGAPermissions, r as getEffectiveResourceId } from "../../utils-KcHk7C0D.js";
|
|
10
10
|
import { z } from "zod/v4";
|
|
11
11
|
import { createReplayStream } from "@mastra/core/stream";
|
|
12
12
|
//#region src/server/handlers/workflows.ts
|
|
@@ -6,7 +6,7 @@ const require_utils = require("../../utils-DFQixxkO.cjs");
|
|
|
6
6
|
const require_constants = require("../../constants-4IJp_uzj.cjs");
|
|
7
7
|
const require_server_handlers_error = require("../handlers/error.cjs");
|
|
8
8
|
const require_helpers = require("../../helpers-8jl_xtug.cjs");
|
|
9
|
-
const require_routes = require("../../routes-
|
|
9
|
+
const require_routes = require("../../routes-mJga4N4C.cjs");
|
|
10
10
|
let zod_v4 = require("zod/v4");
|
|
11
11
|
let stream = require("stream");
|
|
12
12
|
let _mastra_core_request_context = require("@mastra/core/request-context");
|
|
@@ -4,7 +4,7 @@ import { o as normalizeRoutePath, t as WorkflowRegistry } from "../../utils-BJm0
|
|
|
4
4
|
import { i as MASTRA_IS_STUDIO_KEY, l as MASTRA_USER_KEY, m as isStudioClientTypeHeader, n as MASTRA_AUTH_TOKEN_KEY, o as MASTRA_RESOURCE_ID_KEY$1, p as isReservedRequestContextKey, r as MASTRA_CLIENT_TYPE_HEADER, s as MASTRA_STUDIO_CLIENT_TYPE, t as MASTRA_AUTH_MODE_KEY } from "../../constants-0jFCWoex.js";
|
|
5
5
|
import { formatZodError, isZodError } from "../handlers/error.js";
|
|
6
6
|
import { d as pathMatchesPattern, i as findMatchingCustomRoute, o as isCustomRoutePublic, r as coreAuthMiddleware } from "../../helpers-610L0lwQ.js";
|
|
7
|
-
import { t as SERVER_ROUTES } from "../../routes-
|
|
7
|
+
import { t as SERVER_ROUTES } from "../../routes-obDo67aE.js";
|
|
8
8
|
import { z } from "zod/v4";
|
|
9
9
|
import { Readable } from "stream";
|
|
10
10
|
import { RequestContext } from "@mastra/core/request-context";
|
|
@@ -68,6 +68,30 @@ function validateBody(body) {
|
|
|
68
68
|
function sanitizeBody(body, disallowedKeys) {
|
|
69
69
|
for (const key of disallowedKeys) if (key in body) delete body[key];
|
|
70
70
|
}
|
|
71
|
+
const CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
72
|
+
"authorization",
|
|
73
|
+
"proxy-authorization",
|
|
74
|
+
"x-api-key",
|
|
75
|
+
"api-key",
|
|
76
|
+
"x-goog-api-key",
|
|
77
|
+
"cookie"
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* Removes credential-bearing headers from client-supplied `modelSettings.headers`
|
|
81
|
+
* so a caller's own auth (e.g. the app's bearer token) can never override the
|
|
82
|
+
* provider credential configured on the server. Non-credential headers are kept.
|
|
83
|
+
*/
|
|
84
|
+
function stripClientCredentialHeaders(body) {
|
|
85
|
+
const modelSettings = body.modelSettings;
|
|
86
|
+
if (!modelSettings || typeof modelSettings !== "object") return;
|
|
87
|
+
const headers = modelSettings.headers;
|
|
88
|
+
if (!headers || typeof headers !== "object") return;
|
|
89
|
+
const kept = Object.fromEntries(Object.entries(headers).filter(([name]) => !CREDENTIAL_HEADER_NAMES.has(name.toLowerCase())));
|
|
90
|
+
body.modelSettings = {
|
|
91
|
+
...modelSettings,
|
|
92
|
+
headers: kept
|
|
93
|
+
};
|
|
94
|
+
}
|
|
71
95
|
function parsePerPage(value, defaultValue = 100, max = 1e3) {
|
|
72
96
|
if ((value || "").trim().toLowerCase() === "false") return false;
|
|
73
97
|
const parsed = parseInt(value || String(defaultValue), 10);
|
|
@@ -223,6 +247,12 @@ Object.defineProperty(exports, "sanitizeBody", {
|
|
|
223
247
|
return sanitizeBody;
|
|
224
248
|
}
|
|
225
249
|
});
|
|
250
|
+
Object.defineProperty(exports, "stripClientCredentialHeaders", {
|
|
251
|
+
enumerable: true,
|
|
252
|
+
get: function() {
|
|
253
|
+
return stripClientCredentialHeaders;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
226
256
|
Object.defineProperty(exports, "validateBody", {
|
|
227
257
|
enumerable: true,
|
|
228
258
|
get: function() {
|
|
@@ -242,4 +272,4 @@ Object.defineProperty(exports, "validateThreadOwnership", {
|
|
|
242
272
|
}
|
|
243
273
|
});
|
|
244
274
|
|
|
245
|
-
//# sourceMappingURL=utils-
|
|
275
|
+
//# sourceMappingURL=utils-HqDZJwRc.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-HqDZJwRc.cjs","names":["authEE","HTTPException","isReservedRequestContextKey","MASTRA_RESOURCE_ID_KEY","MastraMemory"],"sources":["../src/server/fga-permissions.ts","../src/server/handlers/utils.ts"],"sourcesContent":["/**\n * Safe re-export of `MastraFGAPermissions` from `@mastra/core/auth/ee`.\n *\n * Why this shim exists:\n * `MastraFGAPermissions` was introduced in `@mastra/core@1.32.0`. Earlier\n * versions of `@mastra/core` ship `@mastra/core/auth/ee` but do not export\n * this constant. A direct named import (`import { MastraFGAPermissions }\n * from '@mastra/core/auth/ee'`) fails at ESM link time when this version\n * of `@mastra/server` is paired with `@mastra/core < 1.32.0`, taking the\n * entire user bundle down before any code runs.\n *\n * A namespace import tolerates missing names — `ns.MissingExport` is just\n * `undefined`, no link-time error. We then expose the permission map.\n *\n * Fallback values:\n * If the consuming `@mastra/core` does not export `MastraFGAPermissions`,\n * we substitute a hardcoded map of the canonical permission strings used\n * by routes in `@mastra/server`. This preserves the explicit RBAC\n * permission overrides those routes already had as string literals in\n * `@mastra/server@1.31.0` (e.g. `requiresPermission: \"agents:execute\"`\n * on `/v1/responses`). Without this fallback, `requiresPermission` would\n * be `undefined` on old core and the auth layer would derive the wrong\n * permission from the route path (e.g. `v1:write` instead of\n * `agents:execute`), breaking RBAC users who upgrade `@mastra/server`\n * but stay on `@mastra/core@1.31.0`.\n *\n * Once the consuming `@mastra/core` is on `1.32.0+` the values are real\n * and behaviour is identical to a direct named import.\n */\n\nimport * as authEE from '@mastra/core/auth/ee';\n\n// Canonical strings for the FGA permission keys actually referenced by\n// `@mastra/server` source. Mirrors `MastraFGAPermissions` in\n// `@mastra/core@1.32.0+` for these specific keys, and matches the string\n// literals previously hardcoded on the same routes in `@mastra/server@1.31.0`.\nconst FALLBACK_PERMISSIONS = {\n AGENTS_CREATE: 'agents:create',\n AGENTS_DELETE: 'agents:delete',\n AGENTS_EXECUTE: 'agents:execute',\n AGENTS_READ: 'agents:read',\n MEMORY_DELETE: 'memory:delete',\n MEMORY_READ: 'memory:read',\n MEMORY_WRITE: 'memory:write',\n TOOLS_EXECUTE: 'tools:execute',\n TOOLS_READ: 'tools:read',\n STORED_WORKFLOWS_READ: 'stored-workflows:read',\n STORED_WORKFLOWS_WRITE: 'stored-workflows:write',\n WORKFLOWS_EXECUTE: 'workflows:execute',\n WORKFLOWS_READ: 'workflows:read',\n} as const;\n\nconst realPermissions = (authEE as any).MastraFGAPermissions;\n\n// Typed as `any` on purpose: consumers of `@mastra/server` may run their\n// typecheck against a `@mastra/core` that doesn't export `MastraFGAPermissions`\n// (anything < 1.32.0). Pinning to the real type would push that name into the\n// emitted `.d.ts` and break downstream typecheck. `any` lets the property\n// accesses (`MastraFGAPermissions.AGENTS_READ`) flow through cleanly on every\n// supported core.\nexport const MastraFGAPermissions: any =\n realPermissions && Object.keys(realPermissions).length > 0 ? realPermissions : FALLBACK_PERMISSIONS;\n","import type { MastraFGAPermissionInput } from '@mastra/core/auth/ee';\nimport type { RequestContext } from '@mastra/core/di';\nimport { MastraMemory } from '@mastra/core/memory';\nimport { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, isReservedRequestContextKey } from '../constants';\nimport { MastraFGAPermissions } from '../fga-permissions';\nimport { HTTPException } from '../http-exception';\n\n// Validation helper\nexport function validateBody(body: Record<string, unknown>) {\n const errorResponse = Object.entries(body).reduce<Record<string, string>>((acc, [key, value]) => {\n if (!value) {\n acc[key] = `Argument \"${key}\" is required`;\n }\n return acc;\n }, {});\n\n if (Object.keys(errorResponse).length > 0) {\n throw new HTTPException(400, { message: Object.values(errorResponse)[0] });\n }\n}\n\n/**\n * sanitizes the body by removing disallowed keys.\n * @param body body to sanitize\n * @param disallowedKeys keys to remove from the body\n */\nexport function sanitizeBody(body: Record<string, unknown>, disallowedKeys: string[]) {\n for (const key of disallowedKeys) {\n if (key in body) {\n delete body[key];\n }\n }\n}\n\nconst CREDENTIAL_HEADER_NAMES = new Set([\n 'authorization',\n 'proxy-authorization',\n 'x-api-key',\n 'api-key',\n 'x-goog-api-key',\n 'cookie',\n]);\n\n/**\n * Removes credential-bearing headers from client-supplied `modelSettings.headers`\n * so a caller's own auth (e.g. the app's bearer token) can never override the\n * provider credential configured on the server. Non-credential headers are kept.\n */\nexport function stripClientCredentialHeaders(body: Record<string, unknown>) {\n const modelSettings = body.modelSettings;\n if (!modelSettings || typeof modelSettings !== 'object') return;\n const headers = (modelSettings as { headers?: unknown }).headers;\n if (!headers || typeof headers !== 'object') return;\n\n const kept = Object.fromEntries(\n Object.entries(headers).filter(([name]) => !CREDENTIAL_HEADER_NAMES.has(name.toLowerCase())),\n );\n body.modelSettings = { ...modelSettings, headers: kept };\n}\n\nexport function parsePerPage(\n value: string | undefined,\n defaultValue: number = 100,\n max: number = 1000,\n): number | false {\n const normalized = (value || '').trim().toLowerCase();\n // Handle explicit false to bypass pagination\n if (normalized === 'false') {\n return false;\n }\n const parsed = parseInt(value || String(defaultValue), 10);\n if (isNaN(parsed)) return defaultValue;\n return Math.min(max, Math.max(1, parsed));\n}\n\n/**\n * Parses filter query parameters into a key-value object.\n */\nexport function parseFilters(filters: string | string[] | undefined): Record<string, string> | undefined {\n if (!filters) return undefined;\n\n return Object.fromEntries(\n (Array.isArray(filters) ? filters : [filters]).map((attr: string) => {\n const [key, ...valueParts] = attr.split(':');\n const value = valueParts.join(':'); // ✅ Handles colons in values\n return [key, value];\n }),\n );\n}\n\n/**\n * Merges a body-supplied requestContext into the trusted server RequestContext.\n * The server context is authoritative: reserved keys are skipped and body values\n * only fill keys the server context has not already set.\n */\nexport function mergeBodyRequestContext(serverRequestContext: RequestContext, bodyRequestContext: unknown): void {\n if (!bodyRequestContext || typeof bodyRequestContext !== 'object') {\n return;\n }\n\n for (const [key, value] of Object.entries(bodyRequestContext)) {\n if (isReservedRequestContextKey(key)) continue;\n if (serverRequestContext.get(key) === undefined) {\n serverRequestContext.set(key, value);\n }\n }\n}\n\n// ============================================================================\n// Authorization Utilities\n// ============================================================================\n\n/**\n * Gets the effective resourceId, preferring the reserved key from requestContext\n * over client-provided values for security.\n */\nexport function getEffectiveResourceId(\n requestContext: RequestContext | undefined,\n clientResourceId: string | undefined,\n): string | undefined {\n const contextResourceId = requestContext?.get(MASTRA_RESOURCE_ID_KEY) as string | undefined;\n return contextResourceId || clientResourceId;\n}\n\n/**\n * Returns the resource id resolved from the request context alone (set via\n * `mapUserToResourceId` or the `x-resource-id` header), ignoring any\n * client-provided value. Its presence indicates a resource-scoped caller;\n * its absence indicates a privileged/service context.\n */\nexport function getContextResourceId(requestContext: RequestContext | undefined): string | undefined {\n return requestContext?.get(MASTRA_RESOURCE_ID_KEY) as string | undefined;\n}\n\n/**\n * Ensures a memory request has a resolvable resource ID. The body's\n * `memory.resource` is optional so authenticated setups can rely on the\n * server-derived resource ID (MASTRA_RESOURCE_ID_KEY set via mapUserToResourceId).\n * When neither the body nor the request context provides one, reject with a\n * clear 400 instead of failing deep inside agent execution.\n */\nexport function requireEffectiveResourceId(\n effectiveResourceId: string | undefined,\n): asserts effectiveResourceId is string {\n if (!effectiveResourceId) {\n throw new HTTPException(400, {\n message:\n 'A resource ID is required when using memory. Provide memory.resource in the request body, or configure server auth with mapUserToResourceId to derive it from the authenticated user.',\n });\n }\n}\n\n/**\n * Gets the effective threadId, preferring the reserved key from requestContext\n * over client-provided values for security.\n */\nexport function getEffectiveThreadId(\n requestContext: RequestContext | undefined,\n clientThreadId: string | undefined,\n): string | undefined {\n const contextThreadId = requestContext?.get(MASTRA_THREAD_ID_KEY) as string | undefined;\n return contextThreadId || clientThreadId;\n}\n\n/**\n * Validates that a thread belongs to the specified resourceId.\n * Throws 403 if the thread exists but belongs to a different resource.\n * Threads with no resourceId are accessible to all (shared threads).\n */\nexport async function validateThreadOwnership(\n thread: { resourceId?: string | null } | null | undefined,\n effectiveResourceId: string | undefined,\n): Promise<void> {\n if (thread && effectiveResourceId && thread.resourceId && thread.resourceId !== effectiveResourceId) {\n throw new HTTPException(403, { message: 'Access denied: thread belongs to a different resource' });\n }\n}\n\n/**\n * Validates both coarse resource ownership and fine-grained thread access.\n * FGA enforcement is a no-op when no FGA provider is configured.\n */\nexport async function enforceThreadAccess({\n mastra,\n requestContext,\n threadId,\n thread,\n effectiveResourceId,\n permission = MastraFGAPermissions.MEMORY_READ,\n}: {\n mastra: any;\n requestContext?: RequestContext;\n threadId: string;\n thread?: { resourceId?: string | null } | null;\n effectiveResourceId?: string;\n permission?: MastraFGAPermissionInput;\n}): Promise<void> {\n await validateThreadOwnership(thread, effectiveResourceId);\n\n const fgaProvider = mastra?.getServer?.()?.fga;\n if (!fgaProvider) {\n return;\n }\n\n const user = requestContext?.get('user');\n if (!user || typeof user !== 'object') {\n throw new HTTPException(403, { message: 'FGA authorization denied: authenticated user is required' });\n }\n\n await MastraMemory.checkThreadFGA({\n mastra,\n user: user as { id: string; [key: string]: unknown },\n threadId,\n resourceId: thread?.resourceId ?? effectiveResourceId,\n requestContext,\n permission,\n });\n}\n\n/**\n * Validates that a workflow run belongs to the specified resourceId.\n * Throws 403 if the run exists but belongs to a different resource.\n */\nexport async function validateRunOwnership(\n run: { resourceId?: string | null } | null | undefined,\n effectiveResourceId: string | undefined,\n): Promise<void> {\n if (run && effectiveResourceId && run.resourceId && run.resourceId !== effectiveResourceId) {\n throw new HTTPException(403, { message: 'Access denied: workflow run belongs to a different resource' });\n }\n}\n"],"mappings":"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"}
|
|
@@ -66,6 +66,30 @@ function validateBody(body) {
|
|
|
66
66
|
function sanitizeBody(body, disallowedKeys) {
|
|
67
67
|
for (const key of disallowedKeys) if (key in body) delete body[key];
|
|
68
68
|
}
|
|
69
|
+
const CREDENTIAL_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
70
|
+
"authorization",
|
|
71
|
+
"proxy-authorization",
|
|
72
|
+
"x-api-key",
|
|
73
|
+
"api-key",
|
|
74
|
+
"x-goog-api-key",
|
|
75
|
+
"cookie"
|
|
76
|
+
]);
|
|
77
|
+
/**
|
|
78
|
+
* Removes credential-bearing headers from client-supplied `modelSettings.headers`
|
|
79
|
+
* so a caller's own auth (e.g. the app's bearer token) can never override the
|
|
80
|
+
* provider credential configured on the server. Non-credential headers are kept.
|
|
81
|
+
*/
|
|
82
|
+
function stripClientCredentialHeaders(body) {
|
|
83
|
+
const modelSettings = body.modelSettings;
|
|
84
|
+
if (!modelSettings || typeof modelSettings !== "object") return;
|
|
85
|
+
const headers = modelSettings.headers;
|
|
86
|
+
if (!headers || typeof headers !== "object") return;
|
|
87
|
+
const kept = Object.fromEntries(Object.entries(headers).filter(([name]) => !CREDENTIAL_HEADER_NAMES.has(name.toLowerCase())));
|
|
88
|
+
body.modelSettings = {
|
|
89
|
+
...modelSettings,
|
|
90
|
+
headers: kept
|
|
91
|
+
};
|
|
92
|
+
}
|
|
69
93
|
function parsePerPage(value, defaultValue = 100, max = 1e3) {
|
|
70
94
|
if ((value || "").trim().toLowerCase() === "false") return false;
|
|
71
95
|
const parsed = parseInt(value || String(defaultValue), 10);
|
|
@@ -161,6 +185,6 @@ async function validateRunOwnership(run, effectiveResourceId) {
|
|
|
161
185
|
if (run && effectiveResourceId && run.resourceId && run.resourceId !== effectiveResourceId) throw new HTTPException(403, { message: "Access denied: workflow run belongs to a different resource" });
|
|
162
186
|
}
|
|
163
187
|
//#endregion
|
|
164
|
-
export { mergeBodyRequestContext as a, requireEffectiveResourceId as c,
|
|
188
|
+
export { mergeBodyRequestContext as a, requireEffectiveResourceId as c, validateBody as d, validateRunOwnership as f, getEffectiveThreadId as i, sanitizeBody as l, MastraFGAPermissions as m, getContextResourceId as n, parseFilters as o, validateThreadOwnership as p, getEffectiveResourceId as r, parsePerPage as s, enforceThreadAccess as t, stripClientCredentialHeaders as u };
|
|
165
189
|
|
|
166
|
-
//# sourceMappingURL=utils-
|
|
190
|
+
//# sourceMappingURL=utils-KcHk7C0D.js.map
|