{"version":3,"sources":["../../../src/agent/durable/constants.ts","../../../src/agent/durable/durable-stream-until-idle.ts","../../../src/agent/durable/utils/serialize-state.ts","../../../src/agent/durable/preparation.ts","../../../src/agent/durable/run-registry.ts","../../../src/agent/durable/stream-adapter.ts","../../../src/agent/durable/workflows/shared/execute-tool-calls.ts","../../../src/agent/durable/workflows/shared/schemas.ts","../../../src/agent/durable/workflows/shared/iteration-state.ts","../../../src/agent/durable/workflows/steps/background-task-check.ts","../../../src/agent/durable/utils/resolve-runtime.ts","../../../src/agent/durable/workflows/steps/llm-execution.ts","../../../src/agent/durable/workflows/steps/tool-call.ts","../../../src/agent/durable/workflows/steps/llm-mapping.ts","../../../src/agent/durable/workflows/create-durable-agentic-workflow.ts","../../../src/agent/durable/durable-agent.ts","../../../src/agent/durable/create-durable-agent.ts","../../../src/agent/durable/evented-agent.ts","../../../src/agent/durable/create-evented-agent.ts"],"names":["RequestContext","MASTRA_THREAD_ID_KEY","MASTRA_RESOURCE_ID_KEY","deepMerge","MASTRA_VERSIONS_KEY","mergeVersionOverrides","MessageList","memory","memoryConfig","ProcessorRunner","SaveQueueManager","getOrCreateSpan","EntityType","TTLCache","safeEnqueue","safeClose","ReadableStream","MastraModelOutput","z","createStep","PUBSUB_SYMBOL","getNeedsApprovalFn","resolveModelConfig","isSupportedLanguageModel","mergeProviderOptions","getStepAvailableToolNames","execute","output","resolveBackgroundConfig","createBackgroundTask","params","task","createWorkflow","runScorer","createObservabilityContext","Agent","EventEmitterPubSub","InMemoryServerCache","CachingPubSub"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Constants for DurableAgent pubsub channels and event types\n */\n\n/**\n * Symbol for passing run registry to workflow steps\n * This allows steps to access the actual model/tool instances\n */\nexport const RUN_REGISTRY_SYMBOL = Symbol('run_registry');\n\n/**\n * Generate the pubsub topic name for agent streaming events\n * @param runId - The unique run identifier\n * @returns The topic name for subscribing/publishing agent stream events\n */\nexport const AGENT_STREAM_TOPIC = (runId: string): string => `agent.stream.${runId}`;\n\n/**\n * Event type constants for agent stream events\n */\nexport const AgentStreamEventTypes = {\n /** Chunk of streaming data (text, tool call, etc.) */\n CHUNK: 'chunk',\n /** Start of a new step in the agentic loop */\n STEP_START: 'step-start',\n /** End of a step in the agentic loop */\n STEP_FINISH: 'step-finish',\n /** Agent execution completed successfully */\n FINISH: 'finish',\n /** Error occurred during execution */\n ERROR: 'error',\n /** Workflow suspended (e.g., for tool approval) */\n SUSPENDED: 'suspended',\n} as const;\n\n/**\n * Default values for durable agent execution\n */\nexport const DurableAgentDefaults = {\n /** Default maximum number of agentic loop iterations */\n MAX_STEPS: 5,\n /**\n * Default tool call concurrency.\n * NOTE: Currently unused — durable workflows run tool calls sequentially\n * (concurrency: 1) because tool approval and suspension require sequential\n * execution. The serialized toolCallConcurrency option is preserved in\n * workflow input for future use when dynamic foreach concurrency is supported.\n */\n TOOL_CALL_CONCURRENCY: 10,\n} as const;\n\n/**\n * Step IDs used in the durable agentic workflow\n */\nexport const DurableStepIds = {\n /** LLM execution step */\n LLM_EXECUTION: 'durable-llm-execution',\n /** Tool call step */\n TOOL_CALL: 'durable-tool-call',\n /** LLM mapping step (combines results) */\n LLM_MAPPING: 'durable-llm-mapping',\n /** Agentic execution workflow (one iteration) */\n AGENTIC_EXECUTION: 'durable-agentic-execution',\n /** Full agentic loop workflow */\n AGENTIC_LOOP: 'durable-agentic-loop',\n /** Scorer execution step */\n SCORER_EXECUTION: 'durable-scorer-execution',\n} as const;\n","/**\n * Implementation of `DurableAgent.streamUntilIdle`. Mirrors the regular\n * agent's `stream-until-idle.ts` but adapted for durable execution:\n * - `DurableAgent.stream()` returns `DurableAgentStreamResult` (not `MastraModelOutput`)\n * - Each continuation starts a new durable workflow (new runId)\n * - Cleanup functions from each inner stream are tracked and called on close\n *\n * High-level flow:\n * 1. Resolve memory scope (threadId, resourceId) -- falls through to plain\n * `agent.stream` if no memory or bgManager.\n * 2. Register this call as the active wrapper for the scope, aborting any\n * prior wrapper.\n * 3. Run initial turn via `agent.stream(messages, { _skipBgTaskWait: true })`\n * and pipe its `fullStream` into a combined outer stream.\n * 4. Subscribe to `bgManager.stream(...)` for background task lifecycle\n * events. On terminal events, queue a continuation.\n * 5. `maxIdleMs` fires only between turns when nothing is happening.\n */\nimport type { BackgroundTaskManager } from '../../background-tasks/manager';\nimport { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, RequestContext } from '../../request-context';\nimport { deepMerge } from '../../utils';\nimport type { MessageListInput } from '../message-list';\n\nimport type { DurableAgent, DurableAgentStreamOptions, DurableAgentStreamResult } from './durable-agent';\n\nexport interface DurableStreamUntilIdleDeps {\n activeStreams: Map void>;\n bgManager: BackgroundTaskManager | undefined;\n}\n\nconst TERMINAL_BG_CHUNKS = new Set([\n 'background-task-completed',\n 'background-task-failed',\n 'background-task-cancelled',\n // Suspended is non-terminal for the bg task itself (it can be resumed\n // later via `manager.resume`), but it IS terminal-for-this-iteration of\n // the streamUntilIdle wrapper: the agent should react to the suspend in\n // a follow-up turn so the user is told the task is parked. Without\n // this, the wrapper waits indefinitely for completed/failed/cancelled\n // and the stream times out.\n 'background-task-suspended',\n]);\n\nasync function resolveScope(\n agent: DurableAgent,\n mergedOptions: Record,\n): Promise<{ threadId: string | undefined; resourceId: string | undefined; scopeKey: string | null } | null> {\n const requestContext = (mergedOptions?.requestContext as RequestContext | undefined) ?? new RequestContext();\n const memory = await agent.getMemory();\n if (!memory) return null;\n\n const threadIdFromContext = requestContext.get(MASTRA_THREAD_ID_KEY) as string | undefined;\n const resourceIdFromContext = requestContext.get(MASTRA_RESOURCE_ID_KEY) as string | undefined;\n const threadIdFromArgs =\n typeof mergedOptions?.memory?.thread === 'string'\n ? mergedOptions.memory.thread\n : (mergedOptions?.memory?.thread as { id?: string } | undefined)?.id;\n\n const threadId = threadIdFromContext ?? threadIdFromArgs;\n const resourceId = resourceIdFromContext ?? (mergedOptions?.memory?.resource as string | undefined);\n const scopeKey = threadId || resourceId ? `${threadId ?? ''}|${resourceId ?? ''}` : null;\n return { threadId, resourceId, scopeKey };\n}\n\nfunction buildContinuationDirective(batch: Array>): string {\n const entries = batch\n .map(chunk => {\n const payload = (chunk as { payload?: Record }).payload ?? {};\n return {\n toolCallId: payload.toolCallId as string | undefined,\n toolName: payload.toolName as string | undefined,\n isSuspended: !!payload.suspendedAt,\n };\n })\n .filter(e => !!e.toolCallId);\n\n const idList = entries\n .filter(e => !e.isSuspended)\n .map(e => (e.toolName ? `${e.toolCallId} (${e.toolName})` : e.toolCallId))\n .join(', ');\n\n // Suspend payloads are tool-controlled and may carry secrets, PII, or\n // large opaque blobs — never serialize them into the continuation\n // prompt. Just name the suspended tool-call IDs.\n const suspendedIdList = entries\n .filter(e => e.isSuspended)\n .map(e => `${e.toolCallId} (${e.toolName})`)\n .join(', ');\n\n return (\n `Background task(s) you previously dispatched have completed. ` +\n `Process ONLY these tool-call IDs (their results are now in the conversation): ${idList}. ` +\n `IMPORTANT: Do NOT process any tool-call IDs that were not in the list, ` +\n `and do NOT call the same tool again — the result is already available. ` +\n `Use these result(s) to answer the user's original question.` +\n `IMPORTANT: The following tool-call IDs are suspended: ${suspendedIdList}. Do not attempt to resume them; let the user know they are waiting for explicit resume input.`\n );\n}\n\nfunction buildContinuationOpts(\n baseContinuationOpts: Record,\n callerContext: any[] | undefined,\n batch: Array>,\n): Record {\n const directive = buildContinuationDirective(batch);\n return {\n ...baseContinuationOpts,\n context: [...(callerContext ?? []), { role: 'user' as const, content: directive }],\n };\n}\n\nfunction acquireStreamSlot(activeStreams: Map void>, scopeKey: string | null, closer: () => void): void {\n if (!scopeKey) return;\n const priorClose = activeStreams.get(scopeKey);\n priorClose?.();\n activeStreams.set(scopeKey, closer);\n}\n\nfunction releaseStreamSlot(activeStreams: Map void>, scopeKey: string | null, closer: () => void): void {\n if (!scopeKey) return;\n if (activeStreams.get(scopeKey) === closer) {\n activeStreams.delete(scopeKey);\n }\n}\n\nexport async function runDurableStreamUntilIdle(\n agent: DurableAgent,\n messages: MessageListInput,\n streamOptions: (DurableAgentStreamOptions & { maxIdleMs?: number }) | undefined,\n deps: DurableStreamUntilIdleDeps,\n): Promise> {\n const { maxIdleMs: _maxIdleMs, ...restStreamOptions } = streamOptions ?? {};\n\n const defaultOptions = await agent.getDefaultOptions({\n requestContext: streamOptions?.requestContext,\n });\n const mergedOptions = deepMerge(\n defaultOptions as Record,\n (restStreamOptions ?? {}) as Record,\n ) as Record;\n\n const scope = await resolveScope(agent, mergedOptions);\n\n if (!deps.bgManager || !scope) {\n return (agent as any).stream(messages, restStreamOptions as any) as Promise>;\n }\n\n const { threadId, resourceId, scopeKey } = scope;\n const maxIdleMs = _maxIdleMs ?? 5 * 60_000;\n\n const baseContinuationOpts = {\n ...(restStreamOptions ?? {}),\n onFinish: undefined,\n _skipBgTaskWait: true,\n } as Record;\n\n const initialStreamOpts = {\n ...(restStreamOptions ?? {}),\n _skipBgTaskWait: true,\n } as DurableAgentStreamOptions;\n\n // --- State ---\n const runningTaskIds = new Set();\n const pendingCompletions: Array> = [];\n // Keyed by `${taskId}:${chunkType}` so a task that suspends + later\n // resumes + completes doesn't see its `background-task-completed`\n // dropped as a \"duplicate\" of the earlier `background-task-suspended`.\n const processedTerminalKeys = new Set();\n const innerCleanups: Array<() => void> = [];\n let isProcessing = false;\n let closed = false;\n let idleTimer: ReturnType | undefined;\n let outerController!: ReadableStreamDefaultController;\n const outerAbort = new AbortController();\n let firstRunId: string | undefined;\n\n // --- Close / idle timer ---\n const forceClose = () => {\n if (closed) return;\n closed = true;\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n outerAbort.abort();\n try {\n outerController.close();\n } catch {\n // already closed\n }\n for (const fn of innerCleanups) {\n try {\n fn();\n } catch {\n // ignore\n }\n }\n releaseStreamSlot(deps.activeStreams, scopeKey, forceClose);\n };\n\n const tryClose = () => {\n if (closed) return;\n if (isProcessing) return;\n if (runningTaskIds.size > 0) return;\n if (pendingCompletions.length > 0) return;\n forceClose();\n };\n\n const clearIdleTimer = () => {\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = undefined;\n }\n };\n\n const updateIdleTimer = () => {\n if (closed) return;\n clearIdleTimer();\n if (isProcessing) return;\n if (runningTaskIds.size === 0) return;\n if (pendingCompletions.length > 0) return;\n idleTimer = setTimeout(forceClose, maxIdleMs);\n };\n\n // --- Stream plumbing ---\n const pipeInner = async (inner: ReadableStream) => {\n const reader = inner.getReader();\n try {\n while (true) {\n if (outerAbort.signal.aborted) break;\n const { done, value } = await reader.read();\n if (done) break;\n clearIdleTimer();\n try {\n outerController.enqueue(value);\n } catch {\n break;\n }\n if (value && typeof value === 'object' && (value as any).type === 'background-task-started') {\n const taskId = (value as any).payload?.taskId;\n if (taskId) runningTaskIds.add(taskId);\n }\n }\n } finally {\n reader.releaseLock();\n }\n };\n\n const processIfIdle = async () => {\n if (isProcessing || closed || pendingCompletions.length === 0) return;\n isProcessing = true;\n try {\n const batch = pendingCompletions.splice(0, pendingCompletions.length);\n for (const chunk of batch) {\n const tid = (chunk as { payload?: { taskId?: string } }).payload?.taskId;\n const ctype = (chunk as { type?: string }).type;\n if (tid && ctype) processedTerminalKeys.add(`${tid}:${ctype}`);\n }\n const continuationOpts = buildContinuationOpts(baseContinuationOpts, restStreamOptions?.context as any[], batch);\n const inner = await (agent as any).stream([], continuationOpts);\n innerCleanups.push(inner.cleanup);\n await pipeInner(inner.fullStream);\n } catch (err) {\n try {\n outerController.error(err);\n } catch {\n // already closed\n }\n forceClose();\n return;\n } finally {\n isProcessing = false;\n if (pendingCompletions.length > 0) {\n void processIfIdle();\n } else {\n tryClose();\n updateIdleTimer();\n }\n }\n };\n\n // --- Setup ---\n acquireStreamSlot(deps.activeStreams, scopeKey, forceClose);\n\n (streamOptions as any)?.abortSignal?.addEventListener('abort', forceClose);\n\n const combinedStream = new ReadableStream({\n start(controller) {\n outerController = controller;\n },\n cancel() {\n closed = true;\n outerAbort.abort();\n clearIdleTimer();\n },\n });\n\n // --- Subscribe to background task events ---\n const bgStream = deps.bgManager.stream({\n agentId: agent.id,\n threadId,\n resourceId,\n abortSignal: outerAbort.signal,\n });\n const bgReader = bgStream.getReader();\n void (async () => {\n try {\n while (true) {\n if (outerAbort.signal.aborted) break;\n const { done, value } = await bgReader.read();\n if (done) break;\n const chunk = value as { type?: string; payload?: Record };\n if (!chunk || typeof chunk !== 'object' || typeof chunk.type !== 'string') continue;\n\n const taskId = (chunk.payload as { taskId?: string } | undefined)?.taskId;\n\n const terminalKey = taskId && TERMINAL_BG_CHUNKS.has(chunk.type) ? `${taskId}:${chunk.type}` : undefined;\n if (terminalKey && processedTerminalKeys.has(terminalKey)) {\n continue;\n }\n\n updateIdleTimer();\n\n try {\n outerController.enqueue(chunk);\n } catch {\n break;\n }\n\n if (!taskId) continue;\n if (chunk.type === 'background-task-running') {\n runningTaskIds.add(taskId);\n } else if (TERMINAL_BG_CHUNKS.has(chunk.type)) {\n runningTaskIds.delete(taskId);\n pendingCompletions.push(chunk);\n void processIfIdle();\n }\n }\n } catch {\n // bg stream ended\n } finally {\n bgReader.releaseLock();\n }\n })();\n\n // --- Initial turn ---\n isProcessing = true;\n clearIdleTimer();\n let first: DurableAgentStreamResult;\n try {\n first = await (agent as any).stream(messages, initialStreamOpts);\n } catch (err) {\n forceClose();\n throw err;\n }\n firstRunId = first.runId;\n innerCleanups.push(first.cleanup);\n\n void (async () => {\n try {\n await pipeInner(first.fullStream);\n } catch (err) {\n try {\n outerController.error(err);\n } catch {\n // already closed\n }\n }\n isProcessing = false;\n if (pendingCompletions.length > 0) {\n void processIfIdle();\n } else {\n tryClose();\n updateIdleTimer();\n }\n })();\n\n return {\n output: new Proxy(first.output, {\n get(target, prop) {\n if (prop === 'fullStream') return combinedStream;\n const value = Reflect.get(target, prop, target);\n return typeof value === 'function' ? value.bind(target) : value;\n },\n }) as any,\n get fullStream() {\n return combinedStream;\n },\n runId: firstRunId!,\n threadId,\n resourceId,\n cleanup: forceClose,\n };\n}\n","import type { JSONSchema7 } from 'json-schema';\nimport type { MastraLanguageModel } from '../../../llm/model/shared.types';\nimport type { MemoryConfig } from '../../../memory/types';\nimport type { CoreTool } from '../../../tools/types';\nimport type { MessageList } from '../../message-list';\nimport type { AgentModelManagerConfig } from '../../types';\nimport type {\n SerializableToolMetadata,\n SerializableModelConfig,\n SerializableModelListEntry,\n SerializableDurableState,\n SerializableDurableOptions,\n SerializableScorersConfig,\n SerializableScorerEntry,\n DurableAgenticWorkflowInput,\n} from '../types';\n\n/**\n * Extract serializable metadata from a CoreTool\n * This strips out the execute function and converts the schema to JSON Schema\n */\nexport function serializeToolMetadata(name: string, tool: CoreTool): SerializableToolMetadata {\n // Extract JSON Schema from the parameters\n let inputSchema: JSONSchema7 = { type: 'object' };\n\n if (tool.parameters) {\n // If it's already a JSON Schema object\n if ('type' in tool.parameters && typeof tool.parameters.type === 'string') {\n inputSchema = tool.parameters as JSONSchema7;\n }\n // If it has a jsonSchema property (zod schema converted)\n else if ('jsonSchema' in tool.parameters) {\n inputSchema = (tool.parameters as any).jsonSchema as JSONSchema7;\n }\n // If it's a Zod schema with _def (try to extract)\n else if ('_def' in tool.parameters) {\n // We'll need to use zodToJsonSchema at runtime if available\n // For now, use a basic object schema\n inputSchema = { type: 'object' };\n }\n }\n\n return {\n id: 'id' in tool && typeof tool.id === 'string' ? tool.id : name,\n name,\n description: tool.description,\n inputSchema,\n requireApproval: (tool as any).requireApproval,\n hasSuspendSchema: (tool as any).hasSuspendSchema,\n };\n}\n\n/**\n * Extract serializable metadata from all tools\n */\nexport function serializeToolsMetadata(tools: Record): SerializableToolMetadata[] {\n return Object.entries(tools).map(([name, tool]) => serializeToolMetadata(name, tool));\n}\n\n/**\n * Extract serializable model configuration\n */\nexport function serializeModelConfig(model: MastraLanguageModel): SerializableModelConfig {\n return {\n provider: model.provider,\n modelId: model.modelId,\n specificationVersion: model.specificationVersion,\n // Store the original config string for runtime resolution (e.g., 'openai/gpt-4o')\n originalConfig: `${model.provider}/${model.modelId}`,\n // Note: We don't serialize model settings here - they come from execution options\n };\n}\n\n/**\n * Extract serializable model list entry from AgentModelManagerConfig\n */\nexport function serializeModelListEntry(entry: AgentModelManagerConfig): SerializableModelListEntry {\n const model = entry.model;\n return {\n id: entry.id,\n config: {\n provider: model.provider,\n modelId: model.modelId,\n specificationVersion: model.specificationVersion,\n originalConfig: `${model.provider}/${model.modelId}`,\n providerOptions: entry.providerOptions,\n },\n maxRetries: entry.maxRetries,\n enabled: entry.enabled,\n };\n}\n\n/**\n * Serialize an array of model configs into a model list.\n * Filters out disabled models since they shouldn't be included in durable execution.\n */\nexport function serializeModelList(models: AgentModelManagerConfig[]): SerializableModelListEntry[] {\n return models.filter(m => m.enabled !== false).map(serializeModelListEntry);\n}\n\n/**\n * Serialize scorers configuration for durable execution.\n *\n * This extracts the scorer name (for resolution at runtime) and sampling config.\n * The actual scorer objects are resolved from Mastra at step execution time.\n *\n * @param scorers The agent's scorers configuration (from agent.scorers or options.scorers)\n * @returns Serializable scorer configuration\n */\nexport function serializeScorersConfig(\n scorers: Record<\n string,\n { scorer: { name: string } | string; sampling?: { type: 'none' } | { type: 'ratio'; rate: number } }\n >,\n): SerializableScorersConfig {\n const result: SerializableScorersConfig = {};\n\n for (const [key, entry] of Object.entries(scorers)) {\n // Get the scorer name - can be a string directly or from scorer.name\n const scorerName = typeof entry.scorer === 'string' ? entry.scorer : entry.scorer.name;\n\n const scorerEntry: SerializableScorerEntry = {\n scorerName,\n };\n\n // Include sampling if provided\n if (entry.sampling) {\n scorerEntry.sampling = entry.sampling;\n }\n\n result[key] = scorerEntry;\n }\n\n return result;\n}\n\n/**\n * Extract serializable state from _internal-like objects\n */\nexport function serializeDurableState(params: {\n memoryConfig?: MemoryConfig;\n threadId?: string;\n resourceId?: string;\n threadExists?: boolean;\n savePerStep?: boolean;\n observationalMemory?: boolean;\n}): SerializableDurableState {\n return {\n memoryConfig: params.memoryConfig,\n threadId: params.threadId,\n resourceId: params.resourceId,\n threadExists: params.threadExists,\n savePerStep: params.savePerStep,\n observationalMemory: params.observationalMemory,\n };\n}\n\n/**\n * Extract serializable options from agent execution options\n */\nexport function serializeDurableOptions(options: {\n maxSteps?: number;\n toolChoice?: any;\n activeTools?: string[];\n temperature?: number;\n requireToolApproval?: boolean;\n toolCallConcurrency?: number;\n autoResumeSuspendedTools?: boolean;\n maxProcessorRetries?: number;\n includeRawChunks?: boolean;\n returnScorerData?: boolean;\n hasErrorProcessors?: boolean;\n providerOptions?: SerializableDurableOptions['providerOptions'];\n structuredOutput?: SerializableDurableOptions['structuredOutput'];\n skipBgTaskWait?: boolean;\n}): SerializableDurableOptions {\n // Normalize toolChoice to serializable form\n let serializedToolChoice: SerializableDurableOptions['toolChoice'];\n if (options.toolChoice) {\n if (typeof options.toolChoice === 'string') {\n serializedToolChoice = options.toolChoice as 'auto' | 'none' | 'required';\n } else if (typeof options.toolChoice === 'object' && 'type' in options.toolChoice) {\n if (options.toolChoice.type === 'tool' && 'toolName' in options.toolChoice) {\n serializedToolChoice = {\n type: 'tool',\n toolName: options.toolChoice.toolName as string,\n };\n }\n }\n }\n\n return {\n maxSteps: options.maxSteps,\n toolChoice: serializedToolChoice,\n activeTools: options.activeTools,\n temperature: options.temperature,\n requireToolApproval: options.requireToolApproval,\n toolCallConcurrency: options.toolCallConcurrency,\n autoResumeSuspendedTools: options.autoResumeSuspendedTools,\n maxProcessorRetries: options.maxProcessorRetries,\n includeRawChunks: options.includeRawChunks,\n returnScorerData: options.returnScorerData,\n hasErrorProcessors: options.hasErrorProcessors,\n providerOptions: options.providerOptions,\n structuredOutput: options.structuredOutput,\n skipBgTaskWait: options.skipBgTaskWait,\n };\n}\n\n/**\n * Create the full workflow input from all components\n */\nexport function createWorkflowInput(params: {\n runId: string;\n agentId: string;\n agentName?: string;\n messageList: MessageList;\n tools: Record;\n model: MastraLanguageModel;\n modelList?: AgentModelManagerConfig[];\n scorers?: Parameters[0];\n options: Parameters[0];\n state: Parameters[0];\n messageId: string;\n agentSpanData?: unknown;\n modelSpanData?: unknown;\n}): DurableAgenticWorkflowInput {\n return {\n __workflowKind: 'durable-agent',\n runId: params.runId,\n agentId: params.agentId,\n agentName: params.agentName,\n messageListState: params.messageList.serialize(),\n toolsMetadata: serializeToolsMetadata(params.tools),\n modelConfig: serializeModelConfig(params.model),\n modelList: params.modelList ? serializeModelList(params.modelList) : undefined,\n scorers: params.scorers ? serializeScorersConfig(params.scorers) : undefined,\n options: serializeDurableOptions(params.options),\n state: serializeDurableState(params.state),\n messageId: params.messageId,\n agentSpanData: params.agentSpanData,\n modelSpanData: params.modelSpanData,\n };\n}\n\n/**\n * Serialize an error for workflow state\n */\nexport function serializeError(error: unknown): { name: string; message: string; stack?: string } {\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n }\n return {\n name: 'Error',\n message: String(error),\n };\n}\n\n/**\n * Serialize a Date to ISO string for workflow state\n */\nexport function serializeDate(date: Date | undefined): string | undefined {\n return date?.toISOString();\n}\n\n/**\n * Deserialize an ISO string back to Date\n */\nexport function deserializeDate(isoString: string | undefined): Date | undefined {\n return isoString ? new Date(isoString) : undefined;\n}\n","import type { AgentBackgroundConfig } from '../../background-tasks/types';\nimport type { MastraLanguageModel } from '../../llm/model/shared.types';\nimport type { IMastraLogger } from '../../logger';\nimport type { Mastra } from '../../mastra';\nimport type { MastraMemory } from '../../memory/memory';\nimport type { MemoryConfig, MemoryConfig as _MemoryConfig, StorageThreadType } from '../../memory/types';\nimport { EntityType, SpanType, getOrCreateSpan } from '../../observability';\nimport type { InputProcessorOrWorkflow, OutputProcessorOrWorkflow, ErrorProcessorOrWorkflow } from '../../processors';\nimport type { ProcessorState } from '../../processors/runner';\nimport { RequestContext, MASTRA_VERSIONS_KEY, mergeVersionOverrides } from '../../request-context';\nimport type { VersionOverrides } from '../../request-context';\nimport type { CoreTool, ToolHooks } from '../../tools/types';\nimport type { Workspace } from '../../workspace';\nimport type { Agent } from '../agent';\nimport type { AgentExecutionOptions } from '../agent.types';\nimport { MessageList } from '../message-list';\nimport type { MessageListInput } from '../message-list';\nimport { SaveQueueManager } from '../save-queue';\nimport type { AgentInstructions, AgentModelManagerConfig, ToolsetsInput, ToolsInput } from '../types';\nimport type { DurableAgenticWorkflowInput, RunRegistryEntry, SerializableStructuredOutput } from './types';\nimport { createWorkflowInput } from './utils/serialize-state';\n\n/**\n * Interface for the Agent methods needed during durable preparation.\n * This provides proper typing for the public Agent methods we call.\n */\ninterface DurablePreparationAgent {\n id: string;\n name?: string;\n getInstructions(opts: { requestContext: RequestContext }): AgentInstructions | Promise;\n getModel(opts: { requestContext: RequestContext }): MastraLanguageModel | Promise;\n getModelList(requestContext: RequestContext): Promise;\n getMemory(opts: { requestContext: RequestContext }): Promise;\n getWorkspace(opts: { requestContext: RequestContext }): Promise;\n listScorers(opts: {\n requestContext: RequestContext;\n }): Promise | undefined>;\n getToolsForExecution(opts: {\n toolsets?: ToolsetsInput;\n clientTools?: ToolsInput;\n threadId?: string;\n resourceId?: string;\n runId?: string;\n requestContext?: RequestContext;\n memoryConfig?: MemoryConfig;\n autoResumeSuspendedTools?: boolean;\n hooks?: ToolHooks;\n }): Promise>;\n listInputProcessors(requestContext?: RequestContext): Promise;\n listOutputProcessors(requestContext?: RequestContext): Promise;\n listErrorProcessors(requestContext?: RequestContext): Promise;\n getBackgroundTasksConfig(): AgentBackgroundConfig | undefined;\n}\n\n/**\n * Result from the preparation phase\n */\nexport interface PreparationResult<_OUTPUT = undefined> {\n /** Unique run identifier */\n runId: string;\n /** Message ID for this generation */\n messageId: string;\n /** Serialized workflow input */\n workflowInput: DurableAgenticWorkflowInput;\n /** Non-serializable state for the run registry */\n registryEntry: RunRegistryEntry;\n /** MessageList for callback access */\n messageList: MessageList;\n /** Thread ID if using memory */\n threadId?: string;\n /** Resource ID if using memory */\n resourceId?: string;\n}\n\n/**\n * Options for preparation phase\n */\nexport interface PreparationOptions {\n /** The agent instance */\n agent: Agent;\n /** User messages to process */\n messages: MessageListInput;\n /** Execution options */\n options?: AgentExecutionOptions;\n /** Run ID (will be generated if not provided) */\n runId?: string;\n /** Request context */\n requestContext?: RequestContext;\n /** Logger */\n logger?: IMastraLogger;\n /** Mastra instance (for version overrides, background tasks, etc.) */\n mastra?: Mastra;\n}\n\n/**\n * Prepare for durable agent execution.\n *\n * This function performs the non-durable preparation phase:\n * 1. Generates run ID and message ID\n * 2. Resolves thread/memory context\n * 3. Creates MessageList with instructions and messages\n * 4. Converts tools to CoreTool format\n * 5. Gets the model configuration\n * 6. Creates serialized workflow input\n * 7. Creates run registry entry for non-serializable state\n *\n * The result includes both the serialized workflow input (for the durable\n * workflow) and the run registry entry (for non-serializable state).\n */\nexport async function prepareForDurableExecution(\n options: PreparationOptions,\n): Promise> {\n const {\n agent,\n messages,\n options: execOptions,\n runId: providedRunId,\n requestContext: providedRequestContext,\n logger,\n mastra,\n } = options;\n\n const typedAgent = agent as unknown as DurablePreparationAgent;\n\n // 1. Generate IDs\n const runId = providedRunId ?? crypto.randomUUID();\n const messageId = crypto.randomUUID();\n\n // 2. Get request context\n const requestContext = providedRequestContext ?? new RequestContext();\n\n // 3. Merge version overrides (Mastra defaults < requestContext < call-site)\n const requestVersions = requestContext.get(MASTRA_VERSIONS_KEY) as VersionOverrides | undefined;\n let mergedVersions = mergeVersionOverrides(mastra?.getVersionOverrides?.(), requestVersions);\n if ((execOptions as any)?.versions) {\n mergedVersions = mergeVersionOverrides(mergedVersions, (execOptions as any).versions);\n }\n if (mergedVersions) {\n requestContext.set(MASTRA_VERSIONS_KEY, mergedVersions);\n }\n\n // 4. Resolve thread/memory context\n const thread =\n typeof execOptions?.memory?.thread === 'string' ? { id: execOptions.memory.thread } : execOptions?.memory?.thread;\n const threadId = thread?.id;\n const resourceId = execOptions?.memory?.resource;\n let threadObject: StorageThreadType | undefined;\n let threadExists = false;\n\n // 5. Create MessageList\n const messageList = new MessageList({\n threadId,\n resourceId,\n });\n\n // Add agent instructions\n const instructions = await typedAgent.getInstructions({ requestContext });\n if (instructions) {\n if (typeof instructions === 'string') {\n messageList.addSystem(instructions);\n } else if (Array.isArray(instructions)) {\n for (const inst of instructions) {\n messageList.addSystem(inst);\n }\n } else {\n messageList.addSystem(instructions);\n }\n }\n const workspace = await typedAgent.getWorkspace({ requestContext });\n\n // Durable preparation runs processInput processors below, but workspace\n // instructions are a processInputStep concern in the non-durable path.\n // Add them here once so durable runs get the same workspace context.\n if (workspace) {\n const hasFs =\n typeof workspace.hasFilesystemConfig === 'function' ? workspace.hasFilesystemConfig() : !!workspace.filesystem;\n const hasSb = typeof workspace.hasSandboxConfig === 'function' ? workspace.hasSandboxConfig() : !!workspace.sandbox;\n if (hasFs || hasSb) {\n const wsInstructions =\n typeof workspace.getInstructionsAsync === 'function'\n ? await workspace.getInstructionsAsync({ requestContext })\n : workspace.getInstructions({ requestContext });\n if (wsInstructions) {\n messageList.addSystem({ role: 'system', content: wsInstructions });\n }\n }\n }\n\n // Add context messages if provided\n if (execOptions?.context) {\n messageList.add(execOptions.context, 'context');\n }\n\n // Add user messages\n messageList.add(messages, 'input');\n\n // 6. Run input processors on the message list\n const processorStates = new Map();\n let inputProcessors: InputProcessorOrWorkflow[] = [];\n let outputProcessors: OutputProcessorOrWorkflow[] = [];\n let errorProcessors: ErrorProcessorOrWorkflow[] = [];\n\n try {\n inputProcessors = await typedAgent.listInputProcessors(requestContext);\n outputProcessors = await typedAgent.listOutputProcessors(requestContext);\n errorProcessors = await typedAgent.listErrorProcessors(requestContext);\n } catch (error) {\n logger?.warn?.(`[DurableAgent] Error resolving processors: ${error}`);\n }\n\n // Run processInput (once, before execution) if we have any processors\n if (inputProcessors.length > 0) {\n try {\n // Set MastraMemory context so processors that need it (OM, message history) can access it\n const memory = await typedAgent.getMemory({ requestContext });\n const memoryConfig = execOptions?.memory?.options;\n if (memory && threadId && resourceId) {\n const existingThread = await memory.getThreadById({ threadId });\n threadObject =\n existingThread ??\n (await memory.createThread({\n threadId,\n metadata: thread?.metadata,\n title: thread?.title,\n memoryConfig,\n resourceId,\n saveThread: true,\n }));\n threadExists = true;\n requestContext.set('MastraMemory', { thread: threadObject, resourceId, memoryConfig });\n }\n\n const { ProcessorRunner } = await import('../../processors/runner');\n const runner = new ProcessorRunner({\n inputProcessors,\n outputProcessors,\n errorProcessors,\n logger: logger as any,\n agentName: agent.name,\n processorStates,\n });\n await runner.runInputProcessors(messageList, {} as any, requestContext, 0);\n } catch (error) {\n logger?.warn?.(`[DurableAgent] Error running input processors: ${error}`);\n }\n }\n\n // 7. Convert tools to CoreTool format for execution\n let tools: Record = {};\n try {\n tools = await typedAgent.getToolsForExecution({\n toolsets: execOptions?.toolsets,\n clientTools: execOptions?.clientTools,\n threadId,\n resourceId,\n runId,\n requestContext,\n memoryConfig: execOptions?.memory?.options,\n autoResumeSuspendedTools: execOptions?.autoResumeSuspendedTools,\n hooks: execOptions?.hooks,\n });\n } catch (error) {\n logger?.warn?.(`[DurableAgent] Error converting tools: ${error}`);\n }\n\n // 8. Get model (and model list if configured)\n const model = await typedAgent.getModel({ requestContext });\n if (!model) {\n throw new Error('Agent model not available');\n }\n\n const modelList = await typedAgent.getModelList(requestContext);\n\n // 8b. Get scorers configuration\n const overrideScorers = (execOptions as any)?.scorers;\n let scorers: Record | undefined;\n\n if (overrideScorers) {\n scorers = overrideScorers;\n } else {\n try {\n const agentScorers = await typedAgent.listScorers({ requestContext });\n if (agentScorers && Object.keys(agentScorers).length > 0) {\n scorers = agentScorers;\n }\n } catch (error) {\n logger?.debug?.(`[DurableAgent] Error getting scorers: ${error}`);\n }\n }\n\n // 9. Get memory and create SaveQueueManager\n const memory = await typedAgent.getMemory({ requestContext });\n const memoryConfig = execOptions?.memory?.options;\n\n const saveQueueManager = memory\n ? new SaveQueueManager({\n logger,\n memory,\n })\n : undefined;\n\n // 10. Serialize structured output if provided\n let serializedStructuredOutput: SerializableStructuredOutput | undefined;\n if (execOptions?.structuredOutput) {\n const so = execOptions.structuredOutput as any;\n if (so.schema) {\n serializedStructuredOutput = {\n jsonPromptInjection: so.jsonPromptInjection,\n useAgent: so.useAgent,\n };\n // Convert Zod schema to JSON Schema if possible\n if (typeof so.schema === 'object' && 'type' in so.schema) {\n serializedStructuredOutput.schema = so.schema;\n } else if (typeof so.schema === 'object' && 'jsonSchema' in so.schema) {\n serializedStructuredOutput.schema = so.schema.jsonSchema;\n }\n }\n }\n\n // 11. Get background task config\n const backgroundTasksConfig = typedAgent.getBackgroundTasksConfig?.();\n const backgroundTaskManager = mastra?.backgroundTaskManager;\n\n // 12. Resolve memory persistence flags\n const savePerStep = execOptions?.savePerStep;\n const observationalMemory = !!memoryConfig?.observationalMemory;\n\n // 12b. Open the AGENT_RUN + MODEL_GENERATION spans and export them into the workflow\n // input so each durable step can rebuild them. No-ops when observability is off.\n const agentSpan = getOrCreateSpan({\n type: SpanType.AGENT_RUN,\n name: `agent run: '${agent.id}'`,\n entityType: EntityType.AGENT,\n entityId: agent.id,\n entityName: agent.name,\n input: messages,\n metadata: {\n runId,\n resourceId,\n threadId,\n },\n tracingContext: execOptions?.tracingContext,\n tracingOptions: execOptions?.tracingOptions,\n requestContext,\n mastra,\n });\n\n const modelSpan = agentSpan?.createChildSpan({\n type: SpanType.MODEL_GENERATION,\n name: `llm: '${model.modelId}'`,\n attributes: {\n model: model.modelId,\n provider: model.provider,\n streaming: true,\n },\n metadata: {\n runId,\n threadId,\n resourceId,\n },\n requestContext,\n });\n\n // 13. Create serialized workflow input\n const workflowInput = createWorkflowInput({\n runId,\n agentId: agent.id,\n agentName: agent.name,\n messageList,\n tools,\n model,\n modelList: modelList ?? undefined,\n scorers,\n options: {\n maxSteps: execOptions?.maxSteps,\n toolChoice: execOptions?.toolChoice as any,\n activeTools: execOptions?.activeTools,\n temperature: execOptions?.modelSettings?.temperature,\n // Durable runs serialize their options, so a function-valued global approval policy\n // can't be persisted. Degrade safely by requiring approval for every tool call.\n requireToolApproval:\n typeof execOptions?.requireToolApproval === 'function' ? true : execOptions?.requireToolApproval,\n toolCallConcurrency: execOptions?.toolCallConcurrency,\n autoResumeSuspendedTools: execOptions?.autoResumeSuspendedTools,\n maxProcessorRetries: execOptions?.maxProcessorRetries,\n includeRawChunks: execOptions?.includeRawChunks,\n returnScorerData: (execOptions as any)?.returnScorerData,\n hasErrorProcessors: errorProcessors.length > 0,\n providerOptions: execOptions?.providerOptions,\n structuredOutput: serializedStructuredOutput,\n skipBgTaskWait: (execOptions as any)?._skipBgTaskWait,\n },\n state: {\n memoryConfig,\n threadId,\n resourceId,\n threadExists,\n savePerStep,\n observationalMemory,\n },\n messageId,\n agentSpanData: agentSpan?.exportSpan(),\n modelSpanData: modelSpan?.exportSpan(),\n });\n\n // 14. Create registry entry for non-serializable state\n const registryEntry: RunRegistryEntry = {\n tools,\n saveQueueManager,\n memory,\n model,\n modelList: modelList\n ? modelList.map((entry: AgentModelManagerConfig) => ({\n id: entry.id,\n model: entry.model,\n maxRetries: entry.maxRetries ?? 0,\n enabled: entry.enabled ?? true,\n }))\n : undefined,\n workspace,\n requestContext,\n inputProcessors,\n outputProcessors,\n errorProcessors,\n processorStates,\n backgroundTaskManager,\n backgroundTasksConfig,\n agentSpan,\n modelSpan,\n cleanup: () => {},\n };\n\n return {\n runId,\n messageId,\n workflowInput,\n registryEntry,\n messageList,\n threadId,\n resourceId,\n };\n}\n","import { TTLCache } from '@isaacs/ttlcache';\nimport type { MastraLanguageModel } from '../../llm/model/shared.types';\nimport type { CoreTool } from '../../tools/types';\nimport type { MessageList } from '../message-list';\nimport type { SaveQueueManager } from '../save-queue';\nimport type { RunRegistryEntry } from './types';\n\n/**\n * Global registry for accessing run entries from workflow steps.\n * This is necessary because workflow steps don't have direct access to\n * the DurableAgent instance's registry.\n *\n * Entries are keyed by runId (which are unique UUIDs).\n *\n * Uses TTLCache to prevent unbounded memory growth: entries auto-expire\n * after 10 minutes (refreshed on access) and the registry is hard-capped\n * at 1000 concurrent entries.\n */\nexport const globalRunRegistry = new TTLCache({\n max: 1000,\n ttl: 10 * 60 * 1000,\n updateAgeOnGet: true,\n dispose: entry => {\n entry.cleanup?.();\n },\n noDisposeOnSet: true,\n});\n\n/**\n * End a run's root spans (MODEL_GENERATION then AGENT_RUN) with an error so the trace\n * still exports — stores persist only span-end events. After a resume the fresh resume\n * spans are the active root, so prefer them. Ending an already-ended span is a no-op,\n * so the duplicate error paths (workflow failure + emitError) are safe. Never throws.\n */\nexport function endRunSpansWithError(runId: string, error: Error): void {\n try {\n const entry = globalRunRegistry.get(runId);\n (entry?.resumeModelSpan ?? entry?.modelSpan)?.error({ error, endSpan: true });\n (entry?.resumeAgentSpan ?? entry?.agentSpan)?.error({ error, endSpan: true });\n } catch {\n // Span bookkeeping must never break error reporting.\n }\n}\n\n/**\n * Registry for per-run non-serializable state.\n *\n * During durable execution, the DurableAgent needs to store non-serializable\n * objects (tools with execute functions, SaveQueueManager, etc.) that can't\n * flow through workflow state. This registry provides a way to store and\n * retrieve these objects keyed by runId.\n *\n * The registry is scoped to a single DurableAgent instance and entries are\n * cleaned up when a run completes.\n */\nexport class RunRegistry {\n #entries = new Map();\n\n /**\n * Register non-serializable state for a run\n * @param runId - The unique run identifier\n * @param entry - The registry entry containing tools, saveQueueManager, etc.\n */\n register(runId: string, entry: RunRegistryEntry): void {\n // Clean up any existing entry first\n this.cleanup(runId);\n this.#entries.set(runId, entry);\n }\n\n /**\n * Get the registry entry for a run\n * @param runId - The unique run identifier\n * @returns The registry entry or undefined if not found\n */\n get(runId: string): RunRegistryEntry | undefined {\n return this.#entries.get(runId);\n }\n\n /**\n * Get tools for a specific run\n * @param runId - The unique run identifier\n * @returns The tools record or an empty object if not found\n */\n getTools(runId: string): Record {\n return this.#entries.get(runId)?.tools ?? {};\n }\n\n /**\n * Get SaveQueueManager for a specific run\n * @param runId - The unique run identifier\n * @returns The SaveQueueManager or undefined if not found\n */\n getSaveQueueManager(runId: string): SaveQueueManager | undefined {\n return this.#entries.get(runId)?.saveQueueManager;\n }\n\n /**\n * Get the language model for a specific run\n * @param runId - The unique run identifier\n * @returns The MastraLanguageModel or undefined if not found\n */\n getModel(runId: string): MastraLanguageModel | undefined {\n return this.#entries.get(runId)?.model;\n }\n\n /**\n * Check if a run is registered\n * @param runId - The unique run identifier\n * @returns True if the run is registered\n */\n has(runId: string): boolean {\n return this.#entries.has(runId);\n }\n\n /**\n * Cleanup and remove a run's entry from the registry\n * @param runId - The unique run identifier\n */\n cleanup(runId: string): void {\n const entry = this.#entries.get(runId);\n if (entry) {\n // Call cleanup function if provided\n entry.cleanup?.();\n this.#entries.delete(runId);\n }\n }\n\n /**\n * Get the number of active runs in the registry\n */\n get size(): number {\n return this.#entries.size;\n }\n\n /**\n * Get all active run IDs\n */\n get runIds(): string[] {\n return Array.from(this.#entries.keys());\n }\n\n /**\n * Clear all entries from the registry\n * Calls cleanup on each entry before removing\n */\n clear(): void {\n for (const runId of this.#entries.keys()) {\n this.cleanup(runId);\n }\n }\n}\n\n/**\n * Extended registry entry that also stores the MessageList reference.\n * This is useful for accessing message state outside of workflow steps\n * (e.g., for callbacks that need to read messages).\n */\nexport interface ExtendedRunRegistryEntry extends RunRegistryEntry {\n /** MessageList reference for callback access */\n messageList?: MessageList;\n /** Thread ID for memory */\n threadId?: string;\n /** Resource ID for memory */\n resourceId?: string;\n}\n\n/**\n * Extended run registry that also stores MessageList references and memory info\n */\nexport class ExtendedRunRegistry extends RunRegistry {\n #messageLists = new Map();\n #memoryInfo = new Map();\n\n /**\n * Register non-serializable state for a run including MessageList\n */\n registerWithMessageList(\n runId: string,\n entry: RunRegistryEntry,\n messageList: MessageList,\n memoryInfo?: { threadId?: string; resourceId?: string },\n ): void {\n this.register(runId, entry);\n this.#messageLists.set(runId, messageList);\n if (memoryInfo) {\n this.#memoryInfo.set(runId, memoryInfo);\n }\n }\n\n /**\n * Get MessageList for a specific run\n */\n getMessageList(runId: string): MessageList | undefined {\n return this.#messageLists.get(runId);\n }\n\n /**\n * Get memory info for a specific run\n */\n getMemoryInfo(runId: string): { threadId?: string; resourceId?: string } | undefined {\n return this.#memoryInfo.get(runId);\n }\n\n /**\n * Override cleanup to also remove MessageList and memory info\n */\n override cleanup(runId: string): void {\n super.cleanup(runId);\n this.#messageLists.delete(runId);\n this.#memoryInfo.delete(runId);\n }\n\n /**\n * Override clear to also clear MessageLists and memory info\n */\n override clear(): void {\n super.clear();\n this.#messageLists.clear();\n this.#memoryInfo.clear();\n }\n}\n","import { ReadableStream } from 'node:stream/web';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Event } from '../../events/types';\nimport type { IMastraLogger } from '../../logger';\nimport { safeClose, safeEnqueue } from '../../stream/base';\nimport { MastraModelOutput } from '../../stream/base/output';\nimport type { ChunkType } from '../../stream/types';\nimport { MessageList } from '../message-list';\nimport { AGENT_STREAM_TOPIC, AgentStreamEventTypes } from './constants';\nimport type {\n AgentStreamEvent,\n AgentChunkEventData,\n AgentStepFinishEventData,\n AgentFinishEventData,\n AgentErrorEventData,\n AgentSuspendedEventData,\n} from './types';\n\n/**\n * Options for creating a durable agent stream\n */\nexport interface DurableAgentStreamOptions {\n /** Pubsub instance to subscribe to */\n pubsub: PubSub;\n /** Run identifier */\n runId: string;\n /** Message ID for this execution */\n messageId: string;\n /** Model information for the output */\n model: {\n modelId: string | undefined;\n provider: string | undefined;\n version: 'v2' | 'v3';\n };\n /** Thread ID for memory */\n threadId?: string;\n /** Resource ID for memory */\n resourceId?: string;\n /**\n * Start replay from this index (0-based).\n * If undefined, uses full replay (subscribeWithReplay).\n * If specified, uses efficient indexed replay (subscribeFromOffset).\n */\n offset?: number;\n /** Callback when chunk is received */\n onChunk?: (chunk: ChunkType) => void | Promise;\n /** Callback when step finishes */\n onStepFinish?: (result: AgentStepFinishEventData) => void | Promise;\n /** Callback when execution finishes */\n onFinish?: (result: AgentFinishEventData) => void | Promise;\n /** Callback on error */\n onError?: (error: Error) => void | Promise;\n /** Callback when workflow suspends */\n onSuspended?: (data: AgentSuspendedEventData) => void | Promise;\n /** Optional logger for structured logging */\n logger?: IMastraLogger;\n}\n\n/**\n * Result from creating a durable agent stream\n */\nexport interface DurableAgentStreamResult {\n /** The MastraModelOutput that streams from pubsub events */\n output: MastraModelOutput;\n /** Cleanup function to unsubscribe from pubsub */\n cleanup: () => void;\n /** Promise that resolves when subscription is established */\n ready: Promise;\n}\n\n/**\n * Create a MastraModelOutput that streams from pubsub events.\n *\n * This adapter subscribes to the agent stream pubsub channel and converts\n * pubsub events into a ReadableStream that MastraModelOutput can consume.\n * Callbacks are invoked as events arrive.\n */\nexport function createDurableAgentStream(\n options: DurableAgentStreamOptions,\n): DurableAgentStreamResult {\n const {\n pubsub,\n runId,\n messageId,\n model,\n threadId,\n resourceId,\n offset,\n onChunk,\n onStepFinish,\n onFinish,\n onError,\n onSuspended,\n logger,\n } = options;\n\n // Helper to log errors (uses logger if available, falls back to console)\n const logError = (message: string, error: unknown) => {\n if (logger) {\n logger.error(message, error);\n } else {\n console.error(message, error);\n }\n };\n\n // Create a message list for the output\n const messageList = new MessageList({\n threadId,\n resourceId,\n });\n\n // Track subscription state\n let isSubscribed = false;\n let cancelled = false;\n let controller: ReadableStreamDefaultController> | null = null;\n\n // Promise that resolves when subscription is established\n let resolveReady: () => void;\n let rejectReady: (error: Error) => void;\n const ready = new Promise((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n\n // Handler for pubsub events.\n //\n // All `controller.enqueue` / `controller.close` / `controller.error` calls\n // are wrapped in safe* helpers because pubsub events can arrive AFTER the\n // stream has already been closed (e.g. a stale background-task lifecycle\n // event published after the agent's FINISH chunk closed the controller).\n // Without the guards, those late events surface as\n // `TypeError: Invalid state: Controller is already closed` from the\n // controller, which the outer try/catch logs but which floods the\n // console and (in test runs) causes timeouts as event handlers retry.\n const handleEvent = async (event: Event) => {\n if (!controller) return;\n\n // Parse the event data as AgentStreamEvent\n const streamEvent = event as unknown as AgentStreamEvent;\n\n try {\n switch (streamEvent.type) {\n case AgentStreamEventTypes.CHUNK: {\n const chunk = streamEvent.data as AgentChunkEventData;\n safeEnqueue(controller, chunk as ChunkType);\n await onChunk?.(chunk as ChunkType);\n break;\n }\n\n case AgentStreamEventTypes.STEP_START: {\n // Step start - enqueue if it's a chunk type\n const chunk = streamEvent.data as ChunkType;\n if (chunk && 'type' in chunk) {\n safeEnqueue(controller, chunk);\n }\n break;\n }\n\n case AgentStreamEventTypes.STEP_FINISH: {\n const data = streamEvent.data as AgentStepFinishEventData;\n await onStepFinish?.(data);\n break;\n }\n\n case AgentStreamEventTypes.FINISH: {\n const data = streamEvent.data as AgentFinishEventData;\n // Enqueue finish chunk and close stream even if callback throws\n const finishChunk = {\n type: 'finish' as const,\n payload: {\n output: data.output,\n stepResult: data.stepResult,\n },\n } as ChunkType;\n safeEnqueue(controller, finishChunk);\n safeClose(controller);\n // Call callback after closing stream (errors don't prevent closure)\n try {\n await onFinish?.(data);\n } catch (callbackError) {\n logError(`[DurableAgentStream] onFinish callback error:`, callbackError);\n }\n break;\n }\n\n case AgentStreamEventTypes.ERROR: {\n const data = streamEvent.data as AgentErrorEventData;\n const error = new Error(data.error.message);\n error.name = data.error.name;\n if (data.error.stack) {\n error.stack = data.error.stack;\n }\n // Close stream with error first, then call callback. Wrapped in\n // try/catch because `controller.error` throws if the controller\n // has already been closed/errored by an earlier event.\n try {\n controller.error(error);\n } catch {\n // Stream already closed/errored — drop silently.\n }\n try {\n await onError?.(error);\n } catch (callbackError) {\n logError(`[DurableAgentStream] onError callback error:`, callbackError);\n }\n break;\n }\n\n case AgentStreamEventTypes.SUSPENDED: {\n const data = streamEvent.data as AgentSuspendedEventData;\n await onSuspended?.(data);\n // Don't close the stream on suspend - it can be resumed\n break;\n }\n\n default:\n // Unknown event type - ignore\n break;\n }\n } catch (error) {\n // Intentional catch-and-continue: callback errors (onChunk, onStepFinish,\n // onSuspended) must not kill the stream. onFinish/onError have their own\n // inner try/catch and close/error the stream before invoking callbacks,\n // so they are not affected by this outer handler.\n logError(`[DurableAgentStream] Error handling event ${streamEvent.type}:`, error);\n }\n };\n\n // Create the readable stream\n const stream = new ReadableStream>({\n start(ctrl) {\n controller = ctrl;\n\n // Subscribe to pubsub with replay support for resumable streams\n // If offset is specified, use indexed replay for efficiency\n // Otherwise use full replay\n const topic = AGENT_STREAM_TOPIC(runId);\n const subscribePromise =\n offset !== undefined\n ? pubsub.subscribeFromOffset(topic, offset, handleEvent)\n : pubsub.subscribeWithReplay(topic, handleEvent);\n\n subscribePromise\n .then(() => {\n if (cancelled) {\n // cleanup() was called before subscribe resolved — unsubscribe now\n void pubsub.unsubscribe(topic, handleEvent).catch(error => {\n logError(`[DurableAgentStream] Failed to unsubscribe from ${topic}:`, error);\n });\n resolveReady();\n return;\n }\n isSubscribed = true;\n resolveReady();\n })\n .catch(error => {\n logError(`[DurableAgentStream] Failed to subscribe to ${topic}:`, error);\n rejectReady(error);\n ctrl.error(error);\n });\n },\n cancel() {\n cleanup();\n },\n });\n\n // Cleanup function - intentionally fire-and-forget for unsubscribe.\n // Sets cancelled=true so the subscribe .then() handler will unsubscribe\n // if cleanup runs before the subscription promise resolves.\n const cleanup = () => {\n cancelled = true;\n if (isSubscribed) {\n isSubscribed = false;\n const topic = AGENT_STREAM_TOPIC(runId);\n void pubsub.unsubscribe(topic, handleEvent).catch(error => {\n logError(`[DurableAgentStream] Failed to unsubscribe from ${topic}:`, error);\n });\n }\n controller = null;\n };\n\n // Create the MastraModelOutput\n const output = new MastraModelOutput({\n model,\n stream,\n messageList,\n messageId,\n options: {\n runId,\n },\n });\n\n return {\n output,\n cleanup,\n ready,\n };\n}\n\n/**\n * Helper to emit a chunk event to pubsub\n */\nexport async function emitChunkEvent(\n pubsub: PubSub,\n runId: string,\n chunk: ChunkType,\n): Promise {\n const topic = AGENT_STREAM_TOPIC(runId);\n await pubsub.publish(topic, {\n type: AgentStreamEventTypes.CHUNK,\n runId,\n data: chunk,\n });\n}\n\n/**\n * Helper to emit a step start event to pubsub\n */\nexport async function emitStepStartEvent(\n pubsub: PubSub,\n runId: string,\n data: { stepId?: string; request?: unknown; warnings?: unknown[] },\n): Promise {\n await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n type: AgentStreamEventTypes.STEP_START,\n runId,\n data,\n });\n}\n\n/**\n * Helper to emit a step finish event to pubsub\n */\nexport async function emitStepFinishEvent(\n pubsub: PubSub,\n runId: string,\n data: AgentStepFinishEventData,\n): Promise {\n await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n type: AgentStreamEventTypes.STEP_FINISH,\n runId,\n data,\n });\n}\n\n/**\n * Helper to emit a finish event to pubsub\n */\nexport async function emitFinishEvent(pubsub: PubSub, runId: string, data: AgentFinishEventData): Promise {\n await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n type: AgentStreamEventTypes.FINISH,\n runId,\n data,\n });\n}\n\n/**\n * Helper to emit an error event to pubsub\n */\nexport async function emitErrorEvent(pubsub: PubSub, runId: string, error: Error): Promise {\n await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n type: AgentStreamEventTypes.ERROR,\n runId,\n data: {\n error: {\n name: error.name,\n message: error.message,\n // stack intentionally omitted — avoid leaking internals through external pubsub\n },\n },\n });\n}\n\n/**\n * Helper to emit a suspended event to pubsub\n */\nexport async function emitSuspendedEvent(pubsub: PubSub, runId: string, data: AgentSuspendedEventData): Promise {\n await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n type: AgentStreamEventTypes.SUSPENDED,\n runId,\n data,\n });\n}\n","import type { RequestContext } from '../../../../request-context';\nimport type { Workspace } from '../../../../workspace';\nimport type { DurableToolCallInput, DurableToolCallOutput } from '../../types';\n\n/**\n * Context for tool execution\n */\nexport interface ToolExecutionContext {\n /** Tool calls from the LLM output */\n toolCalls: DurableToolCallInput[];\n /** Resolved tools with execute functions */\n tools: Record;\n /** Run identifier */\n runId: string;\n /** Agent identifier */\n agentId: string;\n /** Message identifier */\n messageId: string;\n /** Serializable state */\n state: any;\n /** Workspace for file/sandbox operations */\n workspace?: Workspace;\n /** Request context for auth data, feature flags, etc. */\n requestContext?: RequestContext;\n\n /**\n * Optional hooks for observability/streaming.\n * All hooks can be sync or async.\n */\n\n /** Called before starting tool execution (for span creation) */\n onToolStart?: (toolCall: DurableToolCallInput) => void | Promise;\n /** Called after successful tool execution (for span close, pubsub emit) */\n onToolResult?: (toolCall: DurableToolCallInput, result: unknown) => void | Promise;\n /** Called on tool execution error (for span error, pubsub emit) */\n onToolError?: (toolCall: DurableToolCallInput, error: ToolExecutionError) => void | Promise;\n}\n\n/**\n * Error structure for tool execution failures\n */\nexport interface ToolExecutionError {\n name: string;\n message: string;\n stack?: string;\n}\n\n/**\n * Execute tool calls durably with optional hooks for observability and streaming.\n *\n * This is the shared implementation used by:\n * - Core DurableAgent workflow\n * - Inngest durable agent workflow (with observability hooks)\n * - Evented durable agent workflow\n *\n * @param ctx - Tool execution context with tool calls, resolved tools, and optional hooks\n * @returns Array of tool call outputs with results or errors\n */\nexport async function executeDurableToolCalls(ctx: ToolExecutionContext): Promise {\n const toolResults: DurableToolCallOutput[] = [];\n\n for (const toolCall of ctx.toolCalls) {\n // Handle provider-executed tools (e.g., OpenAI function calling with parallel_tool_calls)\n if (toolCall.providerExecuted && toolCall.output !== undefined) {\n toolResults.push({\n ...toolCall,\n result: toolCall.output,\n });\n continue;\n }\n\n // Resolve the tool from the tools record\n const tool = ctx.tools[toolCall.toolName];\n\n if (!tool) {\n const error: ToolExecutionError = {\n name: 'ToolNotFoundError',\n message: `Tool ${toolCall.toolName} not found`,\n };\n await ctx.onToolError?.(toolCall, error);\n toolResults.push({\n ...toolCall,\n error,\n });\n continue;\n }\n\n // Notify start of tool execution (for observability)\n await ctx.onToolStart?.(toolCall);\n\n // Execute the tool\n try {\n if (tool.execute) {\n const result = await tool.execute(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n messages: [],\n workspace: ctx.workspace,\n requestContext: ctx.requestContext,\n });\n await ctx.onToolResult?.(toolCall, result);\n toolResults.push({\n ...toolCall,\n result,\n });\n } else {\n // Tool has no execute function - return undefined result\n await ctx.onToolResult?.(toolCall, undefined);\n toolResults.push({\n ...toolCall,\n result: undefined,\n });\n }\n } catch (error) {\n const toolError: ToolExecutionError = {\n name: 'ToolExecutionError',\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n };\n await ctx.onToolError?.(toolCall, toolError);\n toolResults.push({\n ...toolCall,\n error: toolError,\n });\n }\n }\n\n return toolResults;\n}\n","import { z } from 'zod';\n\n/**\n * Shared Zod schemas for durable agentic workflows.\n *\n * These schemas are used by:\n * - Core DurableAgent workflow\n * - Inngest durable agent workflow\n * - Evented durable agent workflow (future)\n */\n\n/**\n * Schema for model configuration\n */\nexport const modelConfigSchema = z.object({\n provider: z.string(),\n modelId: z.string(),\n specificationVersion: z.string().optional(),\n settings: z.record(z.string(), z.any()).optional(),\n providerOptions: z.record(z.string(), z.any()).optional(),\n});\n\n/**\n * Schema for model list entry (fallback support)\n */\nexport const modelListEntrySchema = z.object({\n id: z.string(),\n config: z.object({\n provider: z.string(),\n modelId: z.string(),\n specificationVersion: z.string().optional(),\n originalConfig: z.union([z.string(), z.record(z.string(), z.any())]).optional(),\n providerOptions: z.record(z.string(), z.any()).optional(),\n }),\n maxRetries: z.number(),\n enabled: z.boolean(),\n});\n\n/**\n * Schema for accumulated usage across iterations\n */\nexport const accumulatedUsageSchema = z.object({\n inputTokens: z.number(),\n outputTokens: z.number(),\n totalTokens: z.number(),\n});\n\n/**\n * Schema for output from the durable agentic workflow\n */\nexport const durableAgenticOutputSchema = z.object({\n messageListState: z.any(),\n messageId: z.string(),\n stepResult: z.any(),\n output: z.object({\n text: z.string().optional(),\n usage: z.any(),\n steps: z.array(z.any()),\n }),\n state: z.any(),\n});\n\n/**\n * Base schema for durable agentic workflow input.\n * Implementations can extend this with additional fields.\n */\nexport const baseDurableAgenticInputSchema = z.object({\n runId: z.string(),\n agentId: z.string(),\n agentName: z.string().optional(),\n messageListState: z.any(),\n toolsMetadata: z.array(z.any()),\n modelConfig: modelConfigSchema,\n options: z.any(),\n state: z.any(),\n messageId: z.string(),\n});\n\n/**\n * Base schema for iteration state.\n * Implementations can extend this with additional fields.\n */\nexport const baseIterationStateSchema = z.object({\n // Original input fields\n runId: z.string(),\n agentId: z.string(),\n agentName: z.string().optional(),\n messageListState: z.any(),\n toolsMetadata: z.array(z.any()),\n modelConfig: z.any(),\n options: z.any(),\n state: z.any(),\n messageId: z.string(),\n // Iteration tracking\n iterationCount: z.number(),\n accumulatedSteps: z.array(z.any()),\n accumulatedUsage: accumulatedUsageSchema,\n // Last step result for continuation check\n lastStepResult: z.any().optional(),\n // Background task tracking\n backgroundTaskPending: z.boolean().optional(),\n // Span data, carried unchanged so every iteration shares one trace\n agentSpanData: z.any().optional(),\n modelSpanData: z.any().optional(),\n});\n\n/**\n * Type for the base iteration state\n */\nexport type BaseIterationState = z.infer;\n\n/**\n * Type for accumulated usage\n */\nexport type AccumulatedUsage = z.infer;\n","import type { DurableAgenticExecutionOutput } from '../../types';\nimport type { AccumulatedUsage, BaseIterationState } from './schemas';\n\n/**\n * Input for creating iteration state update\n */\nexport interface IterationStateUpdateInput {\n /** Current iteration state */\n currentState: BaseIterationState;\n /** Output from the current iteration's execution */\n executionOutput: DurableAgenticExecutionOutput;\n}\n\n/**\n * Step record for tracking iteration history\n */\nexport interface StepRecord {\n text?: string;\n toolCalls?: unknown[];\n toolResults?: unknown[];\n usage?: unknown;\n finishReason?: string;\n}\n\n/**\n * Calculate accumulated usage from current state and new execution output.\n */\nexport function calculateAccumulatedUsage(\n currentUsage: AccumulatedUsage,\n executionUsage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number },\n): AccumulatedUsage {\n return {\n inputTokens: currentUsage.inputTokens + (executionUsage?.inputTokens || 0),\n outputTokens: currentUsage.outputTokens + (executionUsage?.outputTokens || 0),\n totalTokens: currentUsage.totalTokens + (executionUsage?.totalTokens || 0),\n };\n}\n\n/**\n * Build a step record from execution output.\n */\nexport function buildStepRecord(executionOutput: DurableAgenticExecutionOutput): StepRecord {\n return {\n text: executionOutput.output.text,\n toolCalls: executionOutput.output.toolCalls,\n toolResults: executionOutput.toolResults,\n usage: executionOutput.output.usage,\n finishReason: executionOutput.stepResult.reason,\n };\n}\n\n/**\n * Create the base iteration state update.\n *\n * This returns the common fields for iteration state updates.\n * Implementations can extend this with their specific fields.\n *\n * @example\n * ```typescript\n * const baseUpdate = createBaseIterationStateUpdate({\n * currentState: initData,\n * executionOutput,\n * });\n *\n * // Core extends with modelList\n * const coreState = { ...baseUpdate, modelList: initData.modelList };\n *\n * // Inngest extends with observability\n * const inngestState = {\n * ...baseUpdate,\n * agentSpanData: initData.agentSpanData,\n * modelSpanData: initData.modelSpanData,\n * stepIndex: initData.stepIndex + 1,\n * };\n * ```\n */\nexport function createBaseIterationStateUpdate(input: IterationStateUpdateInput): BaseIterationState {\n const { currentState, executionOutput } = input;\n\n const newUsage = calculateAccumulatedUsage(currentState.accumulatedUsage, executionOutput.output.usage);\n const stepRecord = buildStepRecord(executionOutput);\n\n return {\n runId: currentState.runId,\n agentId: currentState.agentId,\n agentName: currentState.agentName,\n messageListState: executionOutput.messageListState,\n toolsMetadata: currentState.toolsMetadata,\n modelConfig: currentState.modelConfig,\n options: currentState.options,\n state: executionOutput.state,\n messageId: executionOutput.messageId,\n iterationCount: currentState.iterationCount + 1,\n accumulatedSteps: [...currentState.accumulatedSteps, stepRecord],\n accumulatedUsage: newUsage,\n lastStepResult: executionOutput.stepResult,\n backgroundTaskPending: executionOutput.backgroundTaskPending,\n // Carry span identity forward unchanged so every iteration shares one trace.\n agentSpanData: currentState.agentSpanData,\n modelSpanData: currentState.modelSpanData,\n };\n}\n","import { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { createStep } from '../../../../workflows';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\nconst BG_CHECK_STEP_ID = `${DurableStepIds.AGENTIC_EXECUTION}-bg-task-check`;\n\n/**\n * The background task check step accepts the output of llmMappingStep\n * and passes it through, adding backgroundTaskPending if tasks are running.\n */\nconst bgCheckInputSchema = z.any();\nconst bgCheckOutputSchema = z.any();\n\n/**\n * Create a durable background task check step.\n *\n * Mirrors the regular agent's backgroundTaskCheckStep pattern:\n * - After tool calls complete, checks if any background tasks are still running\n * - First invocation (retryCount === 0): returns immediately with backgroundTaskPending=true\n * so the loop can re-enter without blocking\n * - Subsequent invocations: waits with timeout for the next task to complete,\n * then sets isContinued=true so the LLM processes the result\n * - If no running tasks: passes through unchanged\n */\nexport function createDurableBackgroundTaskCheckStep() {\n return createStep({\n id: BG_CHECK_STEP_ID,\n inputSchema: bgCheckInputSchema,\n outputSchema: bgCheckOutputSchema,\n execute: async params => {\n const { inputData, retryCount, getInitData } = params;\n const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n const typedInput = inputData as Record;\n\n const initData = getInitData<{\n runId: string;\n agentId: string;\n options?: { skipBgTaskWait?: boolean };\n state?: { threadId?: string; resourceId?: string };\n }>();\n const { runId, agentId } = initData;\n\n const registryEntry = globalRunRegistry.get(runId);\n const bgManager = registryEntry?.backgroundTaskManager;\n\n if (!bgManager) {\n return typedInput;\n }\n\n const runningResult = await bgManager.listTasks({\n agentId,\n status: 'running',\n threadId: initData.state?.threadId,\n resourceId: initData.state?.resourceId,\n });\n const runningTasks = runningResult?.tasks;\n\n if (!runningTasks || runningTasks.length === 0) {\n return typedInput;\n }\n\n // When the outer caller drives continuation externally (e.g. streamUntilIdle),\n // skip the in-loop wait. We still mark pending so downstream knows.\n if (initData.options?.skipBgTaskWait) {\n return { ...typedInput, backgroundTaskPending: true };\n }\n\n const taskIds = runningTasks.map(task => task.id);\n\n const bgConfig = registryEntry?.backgroundTasksConfig;\n const managerConfig = bgManager.config;\n const waitTimeoutMs = bgConfig?.waitTimeoutMs ?? managerConfig?.waitTimeoutMs;\n\n // First invocation: signal pending but don't block\n if (retryCount === 0 || !waitTimeoutMs) {\n return { ...typedInput, backgroundTaskPending: true };\n }\n\n // Emit initial progress chunk\n if (pubsub) {\n try {\n await emitChunkEvent(pubsub, runId, {\n type: 'background-task-progress' as any,\n runId,\n from: ChunkFrom.AGENT,\n payload: { taskIds, runningCount: runningTasks.length, elapsedMs: 0 },\n });\n } catch {\n // PubSub may be closed\n }\n }\n\n // Wait for the next task to complete (or until timeout)\n try {\n await bgManager.waitForNextTask(taskIds, {\n timeoutMs: waitTimeoutMs,\n onProgress: (elapsedMs: number) => {\n if (!pubsub) return;\n void emitChunkEvent(pubsub, runId, {\n type: 'background-task-progress' as any,\n runId,\n from: ChunkFrom.AGENT,\n payload: { taskIds, runningCount: runningTasks.length, elapsedMs },\n }).catch(() => {});\n },\n progressIntervalMs: 3000,\n });\n } catch {\n // Timeout elapsed — no task completed. Return unchanged so the loop can end.\n // The tasks keep running in the background — results are picked up on\n // the next user message or stream.\n return typedInput;\n }\n\n // A task completed — force the loop to continue so the LLM processes the result\n if (typedInput.stepResult) {\n return {\n ...typedInput,\n backgroundTaskPending: true,\n stepResult: { ...typedInput.stepResult, isContinued: true },\n };\n }\n\n return { ...typedInput, backgroundTaskPending: true };\n },\n });\n}\n","import type { ToolSet } from '@internal/ai-sdk-v5';\nimport { resolveModelConfig } from '../../../llm/model/resolve-model';\nimport type { MastraLanguageModel } from '../../../llm/model/shared.types';\nimport type { StreamInternal } from '../../../loop/types';\nimport type { Mastra } from '../../../mastra';\nimport type { MastraMemory } from '../../../memory/memory';\nimport { RequestContext } from '../../../request-context';\nimport { getNeedsApprovalFn } from '../../../tools/toolchecks';\nimport type { CoreTool } from '../../../tools/types';\nimport type { Workspace } from '../../../workspace';\nimport { MessageList } from '../../message-list';\nimport { SaveQueueManager } from '../../save-queue';\nimport { globalRunRegistry } from '../run-registry';\nimport type {\n SerializableDurableState,\n SerializableModelConfig,\n SerializableModelListEntry,\n SerializableToolMetadata,\n DurableAgenticWorkflowInput,\n RegistryModelListEntry,\n} from '../types';\n\n/**\n * Runtime dependencies that need to be resolved at step execution time.\n * These cannot be serialized and must be recreated from available context.\n */\nexport interface ResolvedRuntimeDependencies {\n /** Reconstructed _internal object for compatibility with existing code */\n _internal: StreamInternal;\n /** Resolved tools with execute functions */\n tools: Record;\n /** Resolved language model */\n model: MastraLanguageModel;\n /** Resolved model list for fallback support (actual model instances) */\n modelList?: RegistryModelListEntry[];\n /** Deserialized MessageList */\n messageList: MessageList;\n /** Memory instance (if available) */\n memory?: MastraMemory;\n /** SaveQueueManager for message persistence */\n saveQueueManager?: SaveQueueManager;\n /** Workspace for file/sandbox operations */\n workspace?: Workspace;\n}\n\n/**\n * Options for resolving runtime dependencies\n */\nexport interface ResolveRuntimeOptions {\n /** Mastra instance for accessing services */\n mastra?: Mastra;\n /** Run identifier */\n runId: string;\n /** Agent identifier */\n agentId: string;\n /** Workflow input containing serialized state */\n input: DurableAgenticWorkflowInput;\n /** Logger for debugging */\n logger?: { debug?: (...args: any[]) => void; error?: (...args: any[]) => void };\n}\n\n/**\n * Resolve all runtime dependencies needed for durable step execution.\n *\n * This function reconstructs the non-serializable state needed to execute\n * agent steps from:\n * 1. The Mastra instance (for agent lookup, tools, model)\n * 2. The serialized workflow input (for MessageList, state)\n *\n * Unlike the registry-based approach, this reconstructs tools and model\n * from the agent registered with Mastra, making it truly durable across\n * process restarts.\n */\nexport async function resolveRuntimeDependencies(options: ResolveRuntimeOptions): Promise {\n const { mastra, runId, agentId, input, logger } = options;\n\n // 1. Deserialize MessageList\n const messageList = new MessageList({\n threadId: input.state.threadId,\n resourceId: input.state.resourceId,\n });\n messageList.deserialize(input.messageListState);\n\n // 2. Check global registry first (for local/test execution)\n // This is necessary because workflow steps don't have direct access to DurableAgent's registry\n const globalEntry = globalRunRegistry.get(runId);\n let tools: Record = globalEntry?.tools ?? {};\n let model: MastraLanguageModel = globalEntry?.model as MastraLanguageModel;\n let modelList: RegistryModelListEntry[] | undefined = globalEntry?.modelList;\n let workspace: Workspace | undefined = globalEntry?.workspace;\n let memory: MastraMemory | undefined;\n\n // If we found the entry in global registry, we already have model and tools\n if (globalEntry) {\n logger?.debug?.(`[DurableAgent:${agentId}] Using model and tools from global registry for run ${runId}`);\n } else if (mastra) {\n try {\n const agent = mastra.getAgentById(agentId);\n\n // Build a request context with version overrides if available\n const resolveRequestContext = new RequestContext();\n // Future: restore serialized version overrides from workflow input here\n\n tools = await agent.getToolsForExecution({\n runId,\n threadId: input.state.threadId,\n resourceId: input.state.resourceId,\n requestContext: resolveRequestContext,\n memoryConfig: input.state.memoryConfig,\n autoResumeSuspendedTools: input.options?.autoResumeSuspendedTools,\n });\n\n model =\n (await (agent as any).getModel?.({ requestContext: resolveRequestContext })) ??\n resolveModel(input.modelConfig, mastra);\n\n const rawModelList = await (agent as any).getModelList?.(resolveRequestContext);\n if (rawModelList && Array.isArray(rawModelList)) {\n modelList = rawModelList.map((entry: any) => ({\n id: entry.id,\n model: entry.model,\n maxRetries: entry.maxRetries ?? 0,\n enabled: entry.enabled ?? true,\n }));\n }\n\n memory = await (agent as any).getMemory?.({ requestContext: resolveRequestContext });\n workspace = await (agent as any).getWorkspace?.({ requestContext: resolveRequestContext });\n } catch (error) {\n logger?.debug?.(`[DurableAgent:${agentId}] Failed to get agent from Mastra: ${error}`);\n model = resolveModel(input.modelConfig, mastra);\n }\n } else {\n logger?.debug?.(`[DurableAgent:${agentId}] No Mastra instance available, using fallback model`);\n model = resolveModel(input.modelConfig);\n }\n\n if (Object.keys(tools).length === 0) {\n logger?.debug?.(`[DurableAgent:${agentId}] No tools resolved for run ${runId}`);\n }\n\n // 3. Get or create SaveQueueManager\n let saveQueueManager: SaveQueueManager | undefined;\n if (memory) {\n saveQueueManager = new SaveQueueManager({\n logger: mastra?.getLogger?.(),\n memory,\n });\n }\n\n // 4. Reconstruct _internal for compatibility with existing code\n const _internal = resolveInternalState({\n state: input.state,\n memory,\n saveQueueManager,\n tools,\n });\n\n return {\n _internal,\n tools,\n model,\n modelList,\n messageList,\n memory,\n saveQueueManager,\n workspace,\n };\n}\n\n/**\n * Resolve the language model from serialized config.\n *\n * Note: This is a fallback when the model is not in the run registry.\n * The preferred approach is to store the actual model instance in the\n * run registry during preparation and retrieve it via runRegistry.getModel().\n *\n * This fallback returns a metadata-only stub that will fail the\n * isSupportedLanguageModel check with a descriptive error message.\n */\nexport function resolveModel(config: SerializableModelConfig, _mastra?: Mastra): MastraLanguageModel {\n const metadataError = () => {\n throw new Error(\n `Model ${config.provider}/${config.modelId} is a metadata-only stub. ` +\n `The actual model instance should be resolved from the run registry.`,\n );\n };\n\n return {\n provider: config.provider,\n modelId: config.modelId,\n specificationVersion: config.specificationVersion ?? 'v2',\n supportedUrls: {},\n doGenerate: metadataError,\n doStream: metadataError,\n __metadataOnly: true,\n } as MastraLanguageModel;\n}\n\n/**\n * Reconstruct the _internal (StreamInternal) object from available state\n */\nexport function resolveInternalState(options: {\n state: SerializableDurableState;\n memory?: MastraMemory;\n saveQueueManager?: SaveQueueManager;\n tools?: Record;\n}): StreamInternal {\n const { state, memory, saveQueueManager, tools } = options;\n\n return {\n // Functions - create fresh\n now: () => Date.now(),\n generateId: () => crypto.randomUUID(),\n currentDate: () => new Date(),\n\n // Class instances - from resolved state\n saveQueueManager,\n memory,\n\n // Serializable state\n memoryConfig: state.memoryConfig,\n threadId: state.threadId,\n resourceId: state.resourceId,\n threadExists: state.threadExists,\n\n // Tools if provided - cast to ToolSet for compatibility\n // CoreTool and ToolSet are structurally compatible at runtime\n stepTools: tools as ToolSet | undefined,\n };\n}\n\n/**\n * Resolve a single tool by name from Mastra's global tool registry\n */\nexport function resolveTool(toolName: string, mastra?: Mastra): CoreTool | undefined {\n // Get from Mastra's global tool registry\n try {\n return mastra?.getTool?.(toolName as any) as CoreTool | undefined;\n } catch {\n // Tool not found in global registry\n return undefined;\n }\n}\n\n/**\n * Check if a tool requires human approval.\n *\n * If the tool has a `needsApprovalFn`, it takes precedence over both the\n * global `requireToolApproval` flag and the tool-level `requireApproval` flag\n * (e.g. skill tools return `false` to suppress approval). On error the call\n * defaults to requiring approval (safe default).\n */\nexport async function toolRequiresApproval(\n tool: CoreTool,\n globalRequireApproval?: boolean,\n args?: Record,\n): Promise {\n let requires = !!(globalRequireApproval || (tool as any).requireApproval);\n\n // needsApprovalFn overrides all other flags (e.g., skill tools return false)\n const needsApprovalFn = getNeedsApprovalFn(tool);\n if (needsApprovalFn) {\n try {\n requires = !!(await needsApprovalFn(args ?? {}));\n } catch {\n // On error, default to requiring approval (safe default)\n requires = true;\n }\n }\n\n return requires;\n}\n\n/**\n * Extract tool metadata needed for LLM from resolved tools\n * This is useful when we need to pass tool info to the model\n */\nexport function extractToolsForModel(\n tools: Record,\n _toolsMetadata: SerializableToolMetadata[],\n): Record {\n // Return the tools as-is since they're already in CoreTool format\n // The metadata is just for reference/serialization\n return tools;\n}\n\n/**\n * Resolve a language model from a serialized model config.\n *\n * This is used during durable execution to reconstruct models from\n * serialized configuration. It uses the originalConfig string (e.g., 'openai/gpt-4o')\n * to resolve the model through the standard model resolution pipeline.\n *\n * @param config The serialized model configuration\n * @param mastra Optional Mastra instance for custom gateways\n * @returns Resolved language model\n */\nexport async function resolveModelFromConfig(\n config: SerializableModelConfig,\n mastra?: Mastra,\n): Promise {\n const requestContext = new RequestContext();\n\n // Use originalConfig if available (e.g., 'openai/gpt-4o'), otherwise construct from provider/modelId\n const modelConfigString = config.originalConfig ?? `${config.provider}/${config.modelId}`;\n\n if (typeof modelConfigString === 'string') {\n return (await resolveModelConfig(modelConfigString, requestContext, mastra)) as MastraLanguageModel;\n }\n\n // If originalConfig is an object, pass it through\n return (await resolveModelConfig(\n modelConfigString as Parameters[0],\n requestContext,\n mastra,\n )) as MastraLanguageModel;\n}\n\n/**\n * Resolve a model from a model list entry.\n *\n * @param entry The model list entry with config, maxRetries, enabled\n * @param mastra Optional Mastra instance\n * @returns Resolved language model\n */\nexport async function resolveModelFromListEntry(\n entry: SerializableModelListEntry,\n mastra?: Mastra,\n): Promise {\n return resolveModelFromConfig(entry.config, mastra);\n}\n","import type { LanguageModelV2Prompt } from '@ai-sdk/provider-v5';\nimport type { ToolChoice, ToolSet } from '@internal/ai-sdk-v5';\nimport { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport { mergeProviderOptions } from '../../../../llm/model/provider-options';\nimport type { SharedProviderOptions } from '../../../../llm/model/shared.types';\nimport type { Mastra } from '../../../../mastra';\nimport type { SpanType, AIModelGenerationSpan, ExportedSpan, IModelSpanTracker } from '../../../../observability';\nimport { getStepAvailableToolNames } from '../../../../observability/utils';\nimport { ProcessorRunner } from '../../../../processors/runner';\nimport { execute } from '../../../../stream/aisdk/v5/execute';\nimport { MastraModelOutput } from '../../../../stream/base/output';\nimport type { TextDeltaPayload, ToolCallPayload } from '../../../../stream/types';\nimport { createStep } from '../../../../workflows';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { MessageList } from '../../../message-list';\nimport type { MastraDBMessage } from '../../../message-list';\nimport { isSupportedLanguageModel } from '../../../utils';\nimport { DurableStepIds } from '../../constants';\nimport { endRunSpansWithError, globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent, emitStepStartEvent } from '../../stream-adapter';\nimport type { DurableAgenticWorkflowInput, DurableLLMStepOutput, DurableToolCallInput } from '../../types';\nimport { resolveRuntimeDependencies, resolveModelFromListEntry } from '../../utils/resolve-runtime';\n\n/**\n * Input schema for the durable LLM execution step\n */\nconst durableLLMInputSchema = z.object({\n runId: z.string(),\n agentId: z.string(),\n agentName: z.string().optional(),\n messageListState: z.any(), // SerializedMessageListState\n toolsMetadata: z.array(z.any()),\n modelConfig: z.object({\n provider: z.string(),\n modelId: z.string(),\n specificationVersion: z.string().optional(),\n originalConfig: z.union([z.string(), z.record(z.string(), z.any())]).optional(),\n settings: z.record(z.string(), z.any()).optional(),\n providerOptions: z.record(z.string(), z.any()).optional(),\n }),\n // Model list for fallback support (when agent configured with array of models)\n modelList: z\n .array(\n z.object({\n id: z.string(),\n config: z.object({\n provider: z.string(),\n modelId: z.string(),\n specificationVersion: z.string().optional(),\n originalConfig: z.union([z.string(), z.record(z.string(), z.any())]).optional(),\n providerOptions: z.record(z.string(), z.any()).optional(),\n }),\n maxRetries: z.number(),\n enabled: z.boolean(),\n }),\n )\n .optional(),\n options: z.any(),\n state: z.any(),\n messageId: z.string(),\n // Agent span data for model span parenting\n agentSpanData: z.any().optional(),\n // Model span data (ONE span for entire agent run, created before workflow)\n modelSpanData: z.any().optional(),\n // Step index for continuation (step: 0, 1, 2, ...)\n stepIndex: z.number().optional(),\n});\n\n/**\n * Output schema for the durable LLM execution step\n */\nconst durableLLMOutputSchema = z.object({\n messageListState: z.any(),\n text: z.string().optional(),\n toolCalls: z.array(\n z.object({\n toolCallId: z.string(),\n toolName: z.string(),\n args: z.record(z.string(), z.any()),\n providerMetadata: z.record(z.string(), z.any()).optional(),\n activeTools: z.array(z.string()).nullable().optional(),\n }),\n ),\n stepResult: z.object({\n reason: z.string(),\n warnings: z.array(z.any()),\n isContinued: z.boolean(),\n totalUsage: z.any().optional(),\n }),\n metadata: z.any(),\n processorRetryCount: z.number().optional(),\n processorRetryFeedback: z.string().optional(),\n state: z.any(),\n // Step index used in this execution (for tracking)\n stepIndex: z.number().optional(),\n // Exported span data forwarded to downstream steps for trace nesting/closing\n modelSpanData: z.any().optional(),\n stepSpanData: z.any().optional(),\n stepFinishPayload: z.any().optional(),\n});\n\n/**\n * Options for creating the durable LLM execution step\n */\nexport interface DurableLLMExecutionStepOptions {\n // No options needed - tools and model are resolved from Mastra at runtime\n}\n\n/**\n * Create a durable LLM execution step.\n *\n * This step:\n * 1. Deserializes the MessageList from workflow input\n * 2. Resolves tools and model from the runtime context\n * 3. Executes the LLM call\n * 4. Emits streaming chunks via pubsub\n * 5. Returns serialized state for the next step\n *\n * The key difference from the non-durable version is that all state\n * flows through the workflow input/output, and non-serializable\n * dependencies are resolved at execution time.\n */\nexport function createDurableLLMExecutionStep(_options?: DurableLLMExecutionStepOptions) {\n return createStep({\n id: DurableStepIds.LLM_EXECUTION,\n inputSchema: durableLLMInputSchema,\n outputSchema: durableLLMOutputSchema,\n execute: async params => {\n const { inputData, mastra, tracingContext, requestContext, abortSignal } = params;\n\n // Access pubsub via symbol\n const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n\n const typedInput = inputData as DurableAgenticWorkflowInput;\n const { agentId, messageId, options: execOptions } = typedInput;\n const runId = typedInput.runId;\n const logger = mastra?.getLogger?.();\n\n // 1. Resolve runtime dependencies (tools from Mastra)\n const resolved = await resolveRuntimeDependencies({\n mastra: mastra as Mastra,\n runId,\n agentId,\n input: typedInput,\n logger,\n });\n\n const { messageList, tools, model: resolvedModel, modelList: resolvedModelList } = resolved;\n\n // 2. Determine if we have a model list for fallback support\n const hasModelList = typedInput.modelList && typedInput.modelList.length > 0;\n\n // 3. Build the model list - either from explicit list or single model\n // For single model case (no modelList), we use the resolved model directly\n // which supports mock models and directly-provided models\n const modelList = hasModelList\n ? typedInput.modelList!.filter(m => m.enabled)\n : [\n {\n id: `${typedInput.modelConfig.provider}/${typedInput.modelConfig.modelId}`,\n config: typedInput.modelConfig,\n maxRetries: 0,\n enabled: true,\n },\n ];\n\n if (modelList.length === 0) {\n throw new Error('No enabled models available for execution');\n }\n\n // 4. Execute with model fallback - try each model in the list with retries\n let lastError: Error | undefined;\n\n for (let modelIndex = 0; modelIndex < modelList.length; modelIndex++) {\n const modelEntry = modelList[modelIndex]!;\n const maxRetries = modelEntry.maxRetries || 0;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Resolve the model - for single model case (no modelList), use resolved model\n // For model list case, try registry first (works with mock models), then config resolution (for Inngest)\n const model = !hasModelList\n ? resolvedModel\n : (resolvedModelList?.find(m => m.id === modelEntry.id)?.model ??\n (await resolveModelFromListEntry(modelEntry, mastra as Mastra)));\n\n // Check if model is supported\n if (!isSupportedLanguageModel(model)) {\n const hint = (model as any).__metadataOnly\n ? ' The model could not be resolved from the run registry or Mastra instance.'\n : '';\n throw new Error(\n `Unsupported model version: ${(model as any).specificationVersion}. Model must implement doStream.${hint}`,\n );\n }\n\n let currentMessageId = messageId;\n\n // 5. Prepare tools - cast through unknown as CoreTool and ToolSet are structurally compatible at runtime\n let currentModel = model;\n let currentTools = tools as unknown as ToolSet;\n let currentToolChoice = execOptions.toolChoice as ToolChoice | undefined;\n let currentActiveTools = execOptions.activeTools;\n let currentModelSettings = { temperature: execOptions.temperature };\n let currentProviderOptions: SharedProviderOptions | undefined = mergeProviderOptions(\n execOptions.providerOptions,\n modelEntry.config.providerOptions,\n ) as SharedProviderOptions | undefined;\n\n // 6. Rebuild MODEL_GENERATION span from passed data\n // For durable execution, ONE model_generation span is created BEFORE the workflow starts\n // and passed through each iteration. This ensures all steps are children of the same span.\n const observability = mastra?.observability?.getSelectedInstance({ requestContext });\n\n // modelSpanData is threaded through the iteration state (seeded in preparation.ts);\n // after a resume the registry override points steps at the resumed generation.\n const inputModelSpanData = (globalRunRegistry.get(runId)?.resumeModelSpanData ??\n (inputData as any).modelSpanData) as ExportedSpan | undefined;\n const modelSpan = inputModelSpanData\n ? (observability?.rebuildSpan(inputModelSpanData) as AIModelGenerationSpan | undefined)\n : undefined;\n\n // Create model span tracker for MODEL_STEP and MODEL_CHUNK spans\n const modelSpanTracker: IModelSpanTracker | undefined = modelSpan?.createTracker();\n\n // Set the step index for continuation (step: 0, 1, 2, ...)\n // This ensures step numbering continues across agentic loop iterations\n const stepIndex = (inputData as any).stepIndex ?? 0;\n modelSpanTracker?.setStepIndex(stepIndex);\n\n // Build structured output for AI SDK if configured\n const structuredOutputConfig = execOptions.structuredOutput;\n const structuredOutput =\n structuredOutputConfig?.schema && !structuredOutputConfig?.structuringModelConfig\n ? {\n schema: structuredOutputConfig.schema,\n jsonPromptInjection: structuredOutputConfig.jsonPromptInjection,\n }\n : undefined;\n\n const registryEntry = globalRunRegistry.get(runId);\n const executionAbortSignal = (registryEntry as any)?.abortSignal ?? abortSignal;\n if (registryEntry?.inputProcessors?.length) {\n const inputStepWriter = pubsub\n ? {\n custom: async (data: { type: string }) => {\n await emitChunkEvent(pubsub, runId, data as any);\n },\n }\n : undefined;\n const runner = new ProcessorRunner({\n inputProcessors: registryEntry.inputProcessors,\n outputProcessors: registryEntry.outputProcessors ?? [],\n errorProcessors: registryEntry.errorProcessors ?? [],\n logger: logger as any,\n agentName: typedInput.agentName ?? typedInput.agentId,\n processorStates: registryEntry.processorStates,\n });\n const processInputStepResult = await runner.runProcessInputStep({\n messageList,\n stepNumber: stepIndex,\n steps: (inputData as any).accumulatedSteps ?? [],\n tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n requestContext,\n memory: registryEntry.memory,\n resourceId: typedInput.state?.resourceId,\n threadId: typedInput.state?.threadId,\n model: currentModel,\n messageId: currentMessageId,\n rotateResponseMessageId: () => {\n currentMessageId = crypto.randomUUID();\n return currentMessageId;\n },\n tools: currentTools,\n toolChoice: currentToolChoice,\n providerOptions: currentProviderOptions,\n activeTools: currentActiveTools,\n modelSettings: currentModelSettings,\n structuredOutput: structuredOutput as any,\n retryCount: (inputData as any).processorRetryCount ?? 0,\n abortSignal: executionAbortSignal,\n writer: inputStepWriter,\n });\n currentMessageId = processInputStepResult.messageId ?? currentMessageId;\n currentModel = (processInputStepResult.model ?? currentModel) as typeof currentModel;\n currentTools = (processInputStepResult.tools ?? currentTools) as ToolSet;\n currentToolChoice = processInputStepResult.toolChoice as ToolChoice | undefined;\n currentProviderOptions = processInputStepResult.providerOptions ?? currentProviderOptions;\n currentActiveTools = processInputStepResult.activeTools;\n currentModelSettings = {\n ...currentModelSettings,\n ...(processInputStepResult.modelSettings ?? {}),\n };\n }\n\n // Get messages for LLM (using async llmPrompt for proper format conversion)\n const inputMessages = (await messageList.get.all.aiV5.llmPrompt()) as LanguageModelV2Prompt;\n\n // Enable defer mode - step-finish won't auto-close the step span\n // This allows us to export the step span and close it later after tool execution\n modelSpanTracker?.setDeferStepClose(true);\n\n // 7. Track state during streaming\n let warnings: any[] = [];\n let request: any = {};\n let rawResponse: any = {};\n const textDeltas: string[] = [];\n const toolCalls: DurableToolCallInput[] = [];\n let finishReason: string = 'stop';\n let usage: any = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let responseMetadata: any = {};\n\n // 8. Start MODEL_STEP span at the beginning of LLM execution\n modelSpanTracker?.startStep();\n\n // Apply post-processor request-side context to MODEL_INFERENCE then\n // open the inference span immediately before the model call so its\n // startTime excludes any input processor work and availableTools /\n // toolChoice reflect per-step mutations. responseFormat tracks the\n // actual structuredOutput payload sent to execute() — which is\n // undefined when structuringModelConfig routes through a separate\n // structuring step instead of asking the model for json_schema.\n modelSpanTracker?.setInferenceContext?.({\n parameters: currentModelSettings as Record | undefined,\n providerOptions: currentProviderOptions as Record | undefined,\n availableTools: getStepAvailableToolNames(\n currentTools as Record | undefined,\n currentActiveTools,\n ),\n toolChoice: currentToolChoice,\n responseFormat: structuredOutput ? 'json_schema' : undefined,\n });\n modelSpanTracker?.startInference?.();\n\n // 10. Execute LLM call\n const modelResult = execute({\n runId,\n model: currentModel,\n providerOptions: currentProviderOptions,\n inputMessages,\n tools: currentTools,\n toolChoice: currentToolChoice,\n activeTools: currentActiveTools,\n options: { abortSignal: executionAbortSignal },\n modelSettings: {\n ...currentModelSettings,\n maxRetries: 0,\n },\n includeRawChunks: execOptions.includeRawChunks,\n methodType: 'stream',\n structuredOutput: structuredOutput as any,\n onResult: ({ warnings: w, request: r, rawResponse: rr }) => {\n warnings = w || [];\n request = r || {};\n rawResponse = rr || {};\n modelSpanTracker?.updateStep?.({ request, inputMessages, warnings, messageId: currentMessageId });\n\n if (pubsub) {\n void emitStepStartEvent(pubsub, runId, {\n stepId: DurableStepIds.LLM_EXECUTION,\n request,\n warnings,\n });\n }\n },\n });\n\n // 10. Create output stream to process chunks\n // Note: We cast through any to handle the web/node ReadableStream type mismatch\n const outputStream = new MastraModelOutput({\n model: {\n modelId: currentModel.modelId,\n provider: currentModel.provider,\n version: currentModel.specificationVersion,\n },\n stream: modelResult as any,\n messageList,\n messageId: currentMessageId,\n options: {\n runId,\n tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n requestContext,\n },\n });\n\n // 11. Process the stream and emit chunks via pubsub.\n // The inner LLM stream emits 'finish' but never 'step-finish' (durable calls\n // `execute` directly). Rewrite 'finish' -> 'step-finish' before the tracker so\n // MODEL_STEP / MODEL_INFERENCE close and the client buffers the step.\n const baseStream = outputStream._getBaseStream();\n const stepBoundaryStream = (baseStream as ReadableStream).pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk?.type === 'finish') {\n controller.enqueue({ ...chunk, type: 'step-finish' });\n } else {\n controller.enqueue(chunk);\n }\n },\n }),\n );\n // Wrap with ModelSpanTracker to create/close MODEL_STEP and MODEL_CHUNK spans\n const trackedStream = modelSpanTracker?.wrapStream(stepBoundaryStream) ?? stepBoundaryStream;\n\n try {\n for await (const chunk of trackedStream) {\n if (!chunk) continue;\n\n // Forward every chunk to the client ('finish' was rewritten to 'step-finish' above).\n if (pubsub) {\n await emitChunkEvent(pubsub, runId, chunk);\n }\n\n // Process different chunk types\n switch (chunk.type) {\n case 'text-delta': {\n const payload = chunk.payload as TextDeltaPayload;\n textDeltas.push(payload.text);\n break;\n }\n\n case 'tool-call': {\n const payload = chunk.payload as ToolCallPayload;\n toolCalls.push({\n toolCallId: payload.toolCallId,\n toolName: payload.toolName,\n args: payload.args || {},\n providerMetadata: payload.providerMetadata as Record | undefined,\n providerExecuted: payload.providerExecuted,\n output: payload.output,\n activeTools: currentActiveTools ?? null,\n });\n break;\n }\n\n case 'step-finish': {\n const payload = chunk.payload as any;\n // The terminal chunk (rewritten from 'finish' above) carries finishReason\n // in stepResult.reason and usage in output.usage.\n finishReason = payload.stepResult?.reason || payload.finishReason || 'stop';\n usage = payload.output?.usage || payload.usage || usage;\n break;\n }\n\n case 'response-metadata': {\n const payload = chunk.payload as any;\n responseMetadata = {\n id: payload.id,\n timestamp: payload.timestamp,\n modelId: payload.modelId,\n headers: payload.headers,\n };\n break;\n }\n\n case 'error': {\n const payload = chunk.payload as any;\n const errorMessage = payload?.error?.message || payload?.message || 'LLM execution error';\n const errorObj = new Error(errorMessage);\n // DON'T emit error event here - we might have fallback models to try\n // Error event will be emitted after all models are exhausted\n throw errorObj;\n }\n }\n }\n } catch (error) {\n logger?.error?.('Error processing LLM stream', { error, runId });\n\n const errorObj = error instanceof Error ? error : new Error(String(error));\n if (modelSpanTracker) {\n modelSpanTracker.reportGenerationError({ error: errorObj });\n } else if (modelSpan) {\n modelSpan.error({ error: errorObj });\n }\n\n lastError = errorObj;\n if (attempt < maxRetries) continue; // retry same model\n break; // exhausted retries, try next model\n }\n\n // Check if the stream captured an error (MastraModelOutput swallows errors internally)\n const streamError = outputStream.error;\n if (streamError) {\n logger?.error?.('Stream captured error', { error: streamError, runId });\n\n if (modelSpanTracker) {\n modelSpanTracker.reportGenerationError({ error: streamError });\n } else if (modelSpan) {\n modelSpan.error({ error: streamError });\n }\n\n lastError = streamError;\n if (attempt < maxRetries) continue; // retry same model\n break; // exhausted retries, try next model\n }\n\n // 12. Add assistant response to message list\n if (textDeltas.length > 0 || toolCalls.length > 0) {\n const parts: any[] = [];\n\n if (textDeltas.length > 0) {\n parts.push({\n type: 'text' as const,\n text: textDeltas.join(''),\n });\n }\n\n for (const tc of toolCalls) {\n parts.push({\n type: 'tool-invocation' as const,\n toolInvocation: {\n state: 'call' as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n },\n });\n }\n\n const assistantMessage: MastraDBMessage = {\n id: currentMessageId,\n role: 'assistant' as const,\n content: {\n format: 2,\n parts,\n },\n createdAt: new Date(),\n };\n\n messageList.add(assistantMessage, 'response');\n }\n\n // 13. Determine if we should continue (has tool calls)\n const isContinued = toolCalls.length > 0 && finishReason !== 'stop';\n const hasToolCalls = toolCalls.length > 0;\n\n // 14. Export spans if there are tool calls (so tools can be children of model_step)\n // Don't end the spans yet - they will be ended after tool execution\n const stepSpanData = hasToolCalls ? modelSpanTracker?.exportCurrentStep() : undefined;\n const stepFinishPayload = hasToolCalls ? modelSpanTracker?.getPendingStepFinishPayload() : undefined;\n\n // 15. Build output\n const output: DurableLLMStepOutput = {\n messageListState: messageList.serialize(),\n text: textDeltas.join(''),\n toolCalls,\n stepResult: {\n reason: finishReason as any,\n warnings,\n isContinued,\n totalUsage: usage,\n headers: rawResponse?.headers,\n request,\n },\n metadata: {\n id: responseMetadata.id,\n modelId: responseMetadata.modelId || currentModel.modelId,\n timestamp: responseMetadata.timestamp || new Date().toISOString(),\n providerMetadata: responseMetadata,\n headers: rawResponse?.headers,\n request,\n },\n state: typedInput.state,\n // Pass span data so tool calls can be children of model_step\n modelSpanData: hasToolCalls ? modelSpan?.exportSpan?.() : undefined,\n stepSpanData,\n stepFinishPayload,\n };\n\n // 16. End step span only if there are NO tool calls\n // If there are tool calls, step span will be ended after tool execution\n // NOTE: We NEVER close the model span here - it stays open for the entire agent run\n // and is closed in map-final-output after the agentic loop completes\n if (!hasToolCalls) {\n // Close the step span with usage/finish info\n const pendingPayload = modelSpanTracker?.getPendingStepFinishPayload() as any;\n if (pendingPayload) {\n // End step span using the pending payload\n const stepSpan = modelSpanTracker?.exportCurrentStep();\n if (stepSpan && observability) {\n const rebuiltStepSpan = observability.rebuildSpan(stepSpan);\n rebuiltStepSpan?.end({\n output: {\n text: textDeltas.join(''),\n toolCalls: [],\n },\n attributes: {\n usage: pendingPayload.output?.usage,\n finishReason: pendingPayload.stepResult?.reason,\n isContinued: pendingPayload.stepResult?.isContinued,\n },\n });\n }\n }\n }\n\n // Success - return the output\n return output;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n const modelId = modelEntry.config.modelId;\n logger?.error?.(`Error executing model ${modelId}, attempt ${attempt + 1}/${maxRetries + 1}`, {\n error: lastError,\n runId,\n modelIndex,\n attempt,\n });\n\n // Try processAPIError if error processors are available\n const registryEntry = globalRunRegistry.get(runId);\n if (registryEntry?.errorProcessors?.length) {\n try {\n const runner = new ProcessorRunner({\n inputProcessors: registryEntry.inputProcessors ?? [],\n outputProcessors: registryEntry.outputProcessors ?? [],\n errorProcessors: registryEntry.errorProcessors,\n logger: logger as any,\n agentName: typedInput.agentName ?? typedInput.agentId,\n processorStates: registryEntry.processorStates,\n });\n const currentMessageList = new MessageList();\n currentMessageList.deserialize(typedInput.messageListState);\n const { retry } = await runner.runProcessAPIError({\n error: lastError,\n messages: currentMessageList.get.all.db(),\n messageList: currentMessageList,\n stepNumber: (inputData as any).stepIndex ?? 0,\n steps: [],\n requestContext,\n });\n if (retry) {\n logger?.debug?.(`processAPIError requested retry for model ${modelId}`, { runId });\n continue;\n }\n } catch (processorError) {\n logger?.debug?.(`processAPIError handler failed: ${processorError}`, { runId });\n }\n }\n\n if (attempt >= maxRetries) {\n logger?.debug?.(`Exhausted retries for model ${modelId}, trying next model`, { runId });\n break;\n }\n\n const delayMs = Math.min(1000 * Math.pow(2, attempt), 10000);\n logger?.debug?.(`Retrying model ${modelId} after ${delayMs}ms`, { runId, attempt });\n await new Promise(resolve => setTimeout(resolve, delayMs));\n }\n } // end retry loop\n } // end model loop\n\n // All models exhausted - throw the last error.\n const fatalError =\n lastError ?? new Error('Exhausted all fallback models and reached the maximum number of retries.');\n\n // End the root spans here too — this is the only error path that covers EventedAgent,\n // whose fire-and-forget launch never sees the failure (so emitError never runs).\n endRunSpansWithError(runId, fatalError);\n\n throw fatalError;\n },\n });\n}\n","import { z } from 'zod';\nimport { createBackgroundTask } from '../../../../background-tasks/create';\nimport { resolveBackgroundConfig } from '../../../../background-tasks/resolve-config';\nimport type { ToolBackgroundConfig } from '../../../../background-tasks/types';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { Mastra } from '../../../../mastra';\nimport type { MastraMemory } from '../../../../memory/memory';\nimport type { MemoryConfig } from '../../../../memory/types';\nimport type { ExportedSpan, SpanType } from '../../../../observability';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { createStep } from '../../../../workflows';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport type { SuspendOptions } from '../../../../workflows/step';\nimport type { MessageList } from '../../../message-list';\nimport type { SaveQueueManager } from '../../../save-queue';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitSuspendedEvent, emitChunkEvent } from '../../stream-adapter';\nimport type { DurableToolCallInput, SerializableDurableOptions, AgentSuspendedEventData } from '../../types';\nimport { resolveTool, toolRequiresApproval } from '../../utils/resolve-runtime';\nimport { serializeError } from '../../utils/serialize-state';\n\n/**\n * Input schema for the durable tool call step.\n * Each tool call flows through this schema when using .foreach()\n */\nconst durableToolCallInputSchema = z.object({\n toolCallId: z.string(),\n toolName: z.string(),\n args: z.record(z.string(), z.any()),\n providerMetadata: z.record(z.string(), z.any()).optional(),\n providerExecuted: z.boolean().optional(),\n output: z.any().optional(),\n activeTools: z.array(z.string()).nullable().optional(),\n // Exported MODEL_STEP span so the TOOL_CALL nests under the LLM call\n stepSpanData: z.any().optional(),\n});\n\n/**\n * Output schema for the durable tool call step\n */\nconst durableToolCallOutputSchema = durableToolCallInputSchema.extend({\n result: z.any().optional(),\n error: z\n .object({\n name: z.string(),\n message: z.string(),\n stack: z.string().optional(),\n })\n .optional(),\n});\n\n/**\n * Flush messages to memory before suspending.\n * Mirrors the base Agent's flushMessagesBeforeSuspension() to ensure\n * the thread exists and all pending messages are persisted.\n */\nasync function flushMessagesBeforeSuspension({\n saveQueueManager,\n messageList,\n memory,\n threadId,\n resourceId,\n memoryConfig,\n threadExists,\n onThreadCreated,\n}: {\n saveQueueManager?: SaveQueueManager;\n messageList?: MessageList;\n memory?: MastraMemory;\n threadId?: string;\n resourceId?: string;\n memoryConfig?: MemoryConfig;\n threadExists?: boolean;\n onThreadCreated?: () => void;\n}) {\n if (!saveQueueManager || !messageList || !threadId) {\n return;\n }\n\n try {\n // Ensure thread exists before flushing messages\n if (memory && !threadExists && resourceId) {\n const thread = await memory.getThreadById?.({ threadId });\n if (!thread) {\n await memory.createThread?.({\n threadId,\n resourceId,\n memoryConfig,\n });\n }\n onThreadCreated?.();\n }\n\n // Flush all pending messages immediately\n await saveQueueManager.flushMessages(messageList, threadId, memoryConfig);\n } catch {\n // Log but don't throw — suspension should proceed even if flush fails\n }\n}\n\n/**\n * Create a durable tool call step.\n *\n * This step mirrors the base Agent's createToolCallStep pattern:\n * 1. Resolves the tool from the run registry or Mastra\n * 2. Checks if approval is required (global or per-tool)\n * 3. If approval required, emits suspended event, persists messages, and suspends\n * 4. Executes the tool with a suspend callback for in-execution suspension\n * 5. Emits tool-result or tool-error chunks via PubSub\n * 6. Returns the result or error\n *\n * Tool suspension is handled via workflow suspend/resume mechanism:\n * - Tool approval: step suspends with approval payload\n * - In-execution suspension: tool calls suspend() callback, step suspends with suspension payload\n * - Message persistence: messages are flushed before any suspension\n */\nexport function createDurableToolCallStep() {\n return createStep({\n id: DurableStepIds.TOOL_CALL,\n inputSchema: durableToolCallInputSchema,\n outputSchema: durableToolCallOutputSchema,\n execute: async params => {\n const { inputData, mastra, suspend, resumeData, requestContext, getInitData } = params;\n\n // Access pubsub via symbol\n const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n\n const typedInput = inputData as DurableToolCallInput;\n const { toolCallId, toolName, args, providerExecuted, output, activeTools } = typedInput;\n\n // Get context from init data (the parent workflow input)\n const initData = getInitData<{\n runId: string;\n agentId: string;\n options: SerializableDurableOptions;\n state: {\n threadId?: string;\n resourceId?: string;\n memoryConfig?: MemoryConfig;\n threadExists?: boolean;\n };\n agentSpanData?: unknown;\n modelSpanData?: unknown;\n }>();\n\n const { runId, options: agentOptions, state } = initData;\n const logger = (mastra as any)?.getLogger?.();\n\n // End the open MODEL_STEP + MODEL_GENERATION + AGENT_RUN as `suspended` before\n // pausing — stores persist only span-end events, so an un-ended root is dropped if\n // the run is never resumed. On resume a fresh root is opened (see DurableAgent.resume).\n const endSpansAsSuspended = (info: { toolCallId?: string; toolName?: string; reason?: string }) => {\n try {\n const obs = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({ requestContext });\n if (!obs) return;\n const output = {\n status: 'suspended' as const,\n reason: info.reason,\n toolName: info.toolName,\n toolCallId: info.toolCallId,\n };\n // After a prior resume, end the resume spans (registry override) — they are the\n // active root for this segment. Otherwise end the threaded originals.\n const reg = globalRunRegistry.get(runId);\n const agentSpanData = reg?.resumeAgentSpanData ?? initData.agentSpanData;\n const modelSpanData = reg?.resumeModelSpanData ?? initData.modelSpanData;\n if (typedInput.stepSpanData) {\n obs.rebuildSpan(typedInput.stepSpanData as ExportedSpan)?.end({ output });\n }\n if (modelSpanData) {\n obs.rebuildSpan(modelSpanData as ExportedSpan)?.end({ output });\n }\n if (agentSpanData) {\n obs.rebuildSpan(agentSpanData as ExportedSpan)?.end({ output });\n }\n } catch (error) {\n // Span bookkeeping must never break suspension.\n logger?.warn?.(`[DurableAgent] Failed to end spans on suspend: ${error}`);\n }\n };\n\n // If the tool was already executed by the provider, return the output\n if (providerExecuted && output !== undefined) {\n return {\n ...typedInput,\n result: output,\n };\n }\n\n // 1. Resolve the tool from global registry first, then Mastra\n const registryEntry = globalRunRegistry.get(runId);\n let tool = registryEntry?.tools?.[toolName];\n\n if (!tool) {\n tool = resolveTool(toolName, mastra as Mastra);\n }\n\n const toolKey = registryEntry?.tools?.[toolName]\n ? toolName\n : Object.entries(registryEntry?.tools ?? {}).find(([, registeredTool]) => registeredTool === tool)?.[0];\n const effectiveActiveTools = activeTools === null ? undefined : (activeTools ?? agentOptions.activeTools);\n const activeToolKey = toolKey ?? toolName;\n const isHiddenByActiveTools = effectiveActiveTools !== undefined && !effectiveActiveTools.includes(activeToolKey);\n\n if (!tool || isHiddenByActiveTools) {\n const availableToolNames = effectiveActiveTools ?? Object.keys(registryEntry?.tools ?? {});\n const availableToolsStr =\n availableToolNames.length > 0 ? ` Available tools: ${availableToolNames.join(', ')}` : '';\n const error = {\n name: 'ToolNotFoundError',\n message: `Tool \"${toolName}\" not found.${availableToolsStr}. Call tools by their exact name only — never add prefixes, namespaces, or colons.`,\n };\n if (pubsub) {\n await emitChunkEvent(pubsub, runId, {\n type: 'tool-error',\n runId,\n from: ChunkFrom.AGENT,\n payload: { toolCallId, toolName, args, error },\n });\n }\n return {\n ...typedInput,\n error,\n };\n }\n\n // Get memory-related state for message persistence\n const saveQueueManager = registryEntry?.saveQueueManager;\n const memory = registryEntry?.memory;\n const workspace = registryEntry?.workspace;\n let threadExists = state?.threadExists ?? false;\n\n // Reconstruct MessageList from workflow state if available\n // Note: In foreach mode, the message list from the registry may be available\n // but for durability, we access what's available through the registry\n let messageList: MessageList | undefined;\n // For local execution, the globalRunRegistry might have an ExtendedRunRegistry entry\n // that stores the messageList. We cast and check safely.\n const extendedEntry = globalRunRegistry.get(runId) as any;\n if (extendedEntry?.messageList) {\n messageList = extendedEntry.messageList;\n }\n\n const doFlush = () =>\n flushMessagesBeforeSuspension({\n saveQueueManager,\n messageList,\n memory,\n threadId: state?.threadId,\n resourceId: state?.resourceId,\n memoryConfig: state?.memoryConfig,\n threadExists,\n onThreadCreated: () => {\n threadExists = true;\n },\n });\n\n // 2. Check if tool requires approval\n const requiresApproval = await toolRequiresApproval(tool, agentOptions.requireToolApproval, args);\n\n if (requiresApproval && !resumeData) {\n const resumeSchema = JSON.stringify({\n type: 'object',\n properties: {\n approved: { type: 'boolean' },\n },\n required: ['approved'],\n });\n\n // Emit approval chunk via PubSub (mirrors base agent's controller.enqueue)\n if (pubsub) {\n await emitChunkEvent(pubsub, runId, {\n type: 'tool-call-approval',\n runId,\n from: ChunkFrom.AGENT,\n payload: { toolCallId, toolName, args, resumeSchema },\n });\n }\n\n // Emit suspended event for the stream adapter\n if (pubsub) {\n await emitSuspendedEvent(pubsub, runId, {\n toolCallId,\n toolName,\n args,\n type: 'approval',\n resumeSchema,\n });\n }\n\n // Flush messages before suspension\n await doFlush();\n\n // End the trace's open spans as suspended before pausing.\n endSpansAsSuspended({ toolCallId, toolName, reason: 'approval' });\n\n // Suspend and wait for approval\n return suspend(\n {\n type: 'approval',\n toolCallId,\n toolName,\n args,\n },\n {\n resumeLabel: toolCallId,\n },\n );\n }\n\n // Check if resuming from approval\n if (resumeData && typeof resumeData === 'object' && resumeData !== null && 'approved' in resumeData) {\n if (!(resumeData as { approved: boolean }).approved) {\n return {\n ...typedInput,\n result: 'Tool call was not approved by the user',\n };\n }\n }\n\n // Check if resuming from in-execution suspension\n // Pass resumeData through to the tool so it can continue from where it left off\n const isResumingFromSuspension =\n resumeData && typeof resumeData === 'object' && resumeData !== null && !('approved' in resumeData);\n\n // 3. Check for background task execution\n const bgManager = registryEntry?.backgroundTaskManager;\n const bgConfig = registryEntry?.backgroundTasksConfig;\n const toolBgConfig = (tool as any).backgroundConfig as ToolBackgroundConfig | undefined;\n const llmBgOverrides =\n typeof args === 'object' && args !== null && '_background' in args ? (args as any)._background : undefined;\n\n // Strip _background from args before execution (same as non-durable path)\n const cleanedArgs = { ...args };\n if ('_background' in cleanedArgs) {\n delete (cleanedArgs as any)._background;\n }\n\n // Execute the tool\n if (!tool.execute) {\n return {\n ...typedInput,\n result: undefined,\n };\n }\n\n // Rebuild the forwarded model_step span and pass it as the tool's tracing context so\n // the TOOL_CALL span nests under the LLM call (matches the non-durable path).\n const observability = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({ requestContext });\n const stepSpan =\n typedInput.stepSpanData && observability\n ? observability.rebuildSpan(typedInput.stepSpanData as ExportedSpan)\n : undefined;\n const toolTracingContext = stepSpan ? { currentSpan: stepSpan } : undefined;\n\n const toolOptions = {\n toolCallId,\n messages: [],\n workspace,\n requestContext,\n tracingContext: toolTracingContext,\n resumeData: isResumingFromSuspension ? resumeData : undefined,\n\n // In-execution suspend callback — allows tools to suspend mid-execution\n suspend: async (suspendPayload: any, suspendOptions?: SuspendOptions) => {\n if (suspendOptions?.requireToolApproval) {\n // Tool is requesting approval during execution\n const approvalResumeSchema = JSON.stringify({\n type: 'object',\n properties: {\n approved: { type: 'boolean' },\n },\n required: ['approved'],\n });\n\n if (pubsub) {\n await emitChunkEvent(pubsub, runId, {\n type: 'tool-call-approval',\n runId,\n from: ChunkFrom.AGENT,\n payload: { toolCallId, toolName, args, resumeSchema: approvalResumeSchema },\n });\n }\n\n if (pubsub) {\n await emitSuspendedEvent(pubsub, runId, {\n toolCallId,\n toolName,\n args,\n type: 'approval',\n resumeSchema: approvalResumeSchema,\n });\n }\n\n await doFlush();\n\n endSpansAsSuspended({ toolCallId, toolName, reason: 'approval' });\n\n return suspend(\n {\n type: 'approval',\n requireToolApproval: { toolCallId, toolName, args },\n },\n { resumeLabel: toolCallId },\n );\n } else {\n // General tool suspension (e.g., tool calls context.agent.suspend())\n const suspendedEventData: AgentSuspendedEventData = {\n toolCallId,\n toolName,\n args,\n suspendPayload,\n type: 'suspension',\n resumeSchema: suspendOptions?.resumeSchema,\n };\n\n if (pubsub) {\n await emitChunkEvent(pubsub, runId, {\n type: 'tool-call-suspended',\n runId,\n from: ChunkFrom.AGENT,\n payload: {\n toolCallId,\n toolName,\n suspendPayload,\n args,\n resumeSchema: suspendOptions?.resumeSchema,\n },\n });\n\n await emitSuspendedEvent(pubsub, runId, suspendedEventData);\n }\n\n await doFlush();\n\n endSpansAsSuspended({ toolCallId, toolName, reason: 'suspension' });\n\n return suspend(\n {\n type: 'suspension',\n toolCallSuspended: suspendPayload,\n toolName,\n resumeLabel: suspendOptions?.resumeLabel,\n },\n { resumeLabel: toolCallId },\n );\n }\n },\n };\n\n // Resolve whether to run in background using the shared config resolver\n if (bgManager && !bgConfig?.disabled && typeof cleanedArgs === 'object' && cleanedArgs !== null) {\n const bgResolved = resolveBackgroundConfig({\n llmBgOverrides,\n toolName,\n toolConfig: toolBgConfig,\n agentConfig: bgConfig,\n managerConfig: bgManager.config,\n });\n\n if (bgResolved.runInBackground) {\n try {\n const bgTask = createBackgroundTask(bgManager, {\n toolName,\n toolCallId,\n args: cleanedArgs,\n agentId: initData.agentId,\n threadId: state?.threadId,\n resourceId: state?.resourceId,\n runId,\n timeoutMs: bgResolved.timeoutMs,\n maxRetries: bgResolved.maxRetries,\n context: {\n executor: {\n execute: async (taskArgs: any, taskContext: any) => {\n return tool.execute!(taskArgs, {\n ...toolOptions,\n ...(taskContext?.resumeData !== undefined ? { resumeData: taskContext.resumeData } : {}),\n suspend: async (data?: unknown, options?: SuspendOptions) => {\n await toolOptions.suspend?.(data, options);\n return taskContext?.suspend?.(data, options);\n },\n });\n },\n },\n onChunk: (chunk: any) => {\n if (!pubsub) return;\n try {\n const bgRunId = chunk.payload.runId;\n // Emit tool-call chunk so UIs can render the invocation inline\n if (bgRunId !== runId || (bgRunId === runId && resumeData)) {\n void emitChunkEvent(pubsub, bgRunId, {\n type: 'tool-call',\n runId: bgRunId,\n from: ChunkFrom.AGENT,\n payload: {\n toolCallId: chunk.payload.toolCallId,\n toolName: chunk.payload.toolName,\n args: cleanedArgs,\n },\n });\n }\n\n if (chunk.type === 'background-task-completed') {\n void emitChunkEvent(pubsub, bgRunId, {\n type: 'tool-result',\n runId: bgRunId,\n from: ChunkFrom.AGENT,\n payload: {\n toolCallId: chunk.payload.toolCallId,\n toolName: chunk.payload.toolName,\n args: cleanedArgs,\n result: chunk.payload.result,\n },\n });\n } else if (chunk.type === 'background-task-failed') {\n void emitChunkEvent(pubsub, bgRunId, {\n type: 'tool-error',\n runId: bgRunId,\n from: ChunkFrom.AGENT,\n payload: {\n toolCallId: chunk.payload.toolCallId,\n toolName: chunk.payload.toolName,\n error: chunk.payload.error,\n args: cleanedArgs,\n },\n });\n }\n } catch {\n // PubSub may be closed — ignore\n }\n },\n\n onResult: async (params: any) => {\n if (!messageList) return;\n\n const result =\n params.status === 'failed'\n ? `Background task failed: ${params.error?.message ?? 'Unknown error'}`\n : params.result;\n\n const updated = messageList.updateToolInvocation(\n {\n type: 'tool-invocation',\n toolInvocation: {\n state: 'result',\n toolCallId: params.toolCallId,\n toolName: params.toolName,\n args: cleanedArgs,\n result,\n },\n },\n {\n backgroundTasks: {\n [params.toolCallId]: {\n startedAt: params.startedAt,\n completedAt: params.completedAt,\n taskId: params.taskId,\n },\n },\n },\n );\n\n if (!updated) {\n if (params.runId !== runId || (params.runId === runId && resumeData)) {\n messageList.add(\n [\n {\n role: 'tool' as const,\n type: 'tool-call',\n id: crypto.randomUUID(),\n createdAt: new Date(),\n content: [\n {\n type: 'tool-call' as const,\n toolCallId: params.toolCallId,\n toolName: params.toolName,\n args: cleanedArgs,\n },\n ],\n },\n ],\n 'response',\n );\n }\n messageList.add(\n [\n {\n role: 'tool' as const,\n content: [\n {\n type: 'tool-result' as const,\n toolCallId: params.toolCallId,\n toolName: params.toolName,\n result,\n isError: params.status === 'failed',\n },\n ],\n },\n ],\n 'response',\n );\n }\n\n if (saveQueueManager && state?.threadId) {\n await saveQueueManager.flushMessages(messageList, state.threadId, state.memoryConfig);\n }\n },\n\n onExecution: async (params: any) => {\n if (!messageList) return;\n\n messageList.updateToolInvocation(\n {\n type: 'tool-invocation',\n toolInvocation: {\n state: 'call',\n toolCallId: params.toolCallId,\n toolName: params.toolName,\n args: cleanedArgs,\n },\n },\n {\n backgroundTasks: {\n [params.toolCallId]: {\n startedAt: params.startedAt,\n suspendedAt: params.suspendedAt,\n taskId: params.taskId,\n },\n },\n },\n );\n },\n\n onComplete: toolBgConfig?.onComplete ?? bgConfig?.onTaskComplete,\n onFailed: toolBgConfig?.onFailed ?? bgConfig?.onTaskFailed,\n },\n });\n\n // If the agent is resuming this tool call and a previously-suspended\n // bg task exists for this toolCallId+runId, resume the bg task with\n // the agent-resume payload instead of dispatching a fresh one.\n const isSuspendedBgResume =\n isResumingFromSuspension && resumeData && typeof resumeData === 'object' && resumeData !== null;\n if (isSuspendedBgResume) {\n const isSuspended = await bgTask.checkIfSuspended({\n toolCallId,\n runId,\n agentId: initData.agentId,\n threadId: state?.threadId,\n resourceId: state?.resourceId,\n toolName,\n });\n if (isSuspended) {\n const task = await bgTask.resume(resumeData);\n return {\n ...typedInput,\n args: cleanedArgs,\n result: `Background task resumed. Task ID: ${task.id}. The tool \"${toolName}\" is running in the background. You will be notified when it completes.`,\n };\n }\n }\n\n const { task, fallbackToSync } = await bgTask.dispatch();\n\n if (!fallbackToSync) {\n // Emit background-task-started chunk via PubSub\n if (pubsub) {\n await emitChunkEvent(pubsub, runId, {\n type: 'background-task-started' as any,\n runId,\n from: ChunkFrom.AGENT,\n payload: {\n taskId: task.id,\n toolName,\n toolCallId,\n },\n });\n }\n\n // Return placeholder result so the LLM can continue\n return {\n ...typedInput,\n args: cleanedArgs,\n result: `Background task started. Task ID: ${task.id}. The tool \"${toolName}\" is running in the background. You will be notified when it completes.`,\n };\n }\n // fallbackToSync: concurrency limit hit, fall through to synchronous execution\n } catch (bgError) {\n logger?.debug?.(\n `[DurableAgent] Background task dispatch failed for ${toolName}, falling back to sync: ${bgError}`,\n );\n }\n }\n }\n\n try {\n const result = await tool.execute(cleanedArgs, toolOptions);\n\n // Emit tool-result chunk (non-fatal — result is returned regardless)\n if (pubsub) {\n try {\n await emitChunkEvent(pubsub, runId, {\n type: 'tool-result',\n runId,\n from: ChunkFrom.AGENT,\n payload: { toolCallId, toolName, args, result },\n });\n } catch (emitError) {\n logger?.warn?.(`[DurableAgent] Failed to emit tool-result chunk for ${toolName}: ${emitError}`);\n }\n }\n\n return {\n ...typedInput,\n result,\n };\n } catch (error) {\n const toolError = serializeError(error);\n\n // Emit tool-error chunk (non-fatal — error result is returned regardless)\n if (pubsub) {\n try {\n await emitChunkEvent(pubsub, runId, {\n type: 'tool-error',\n runId,\n from: ChunkFrom.AGENT,\n payload: { toolCallId, toolName, args, error: toolError },\n });\n } catch (emitError) {\n logger?.warn?.(`[DurableAgent] Failed to emit tool-error chunk for ${toolName}: ${emitError}`);\n }\n }\n\n return {\n ...typedInput,\n error: toolError,\n };\n }\n },\n });\n}\n","import { z } from 'zod';\nimport type { Mastra } from '../../../../mastra';\nimport type { ExportedSpan, SpanType } from '../../../../observability';\nimport { createStep } from '../../../../workflows';\nimport { MessageList } from '../../../message-list';\nimport { DurableStepIds } from '../../constants';\nimport type {\n DurableLLMStepOutput,\n DurableToolCallOutput,\n DurableAgenticExecutionOutput,\n SerializableDurableState,\n} from '../../types';\n\n/**\n * Input schema for the durable LLM mapping step.\n * This combines the LLM execution output with tool call results.\n */\nconst durableLLMMappingInputSchema = z.object({\n llmOutput: z.any(), // DurableLLMStepOutput\n toolResults: z.array(z.any()), // DurableToolCallOutput[]\n runId: z.string(),\n agentId: z.string(),\n messageId: z.string(),\n state: z.any(), // SerializableDurableState\n});\n\n/**\n * Output schema for the durable LLM mapping step\n */\nconst durableLLMMappingOutputSchema = z.object({\n messageListState: z.any(),\n messageId: z.string(),\n stepResult: z.any(),\n toolResults: z.array(z.any()),\n output: z.object({\n text: z.string().optional(),\n toolCalls: z.array(z.any()).optional(),\n usage: z.any(),\n steps: z.array(z.any()),\n }),\n state: z.any(),\n processorRetryCount: z.number().optional(),\n processorRetryFeedback: z.string().optional(),\n});\n\n/**\n * Create a durable LLM mapping step.\n *\n * This step:\n * 1. Takes the LLM execution output and tool call results\n * 2. Updates the message list with tool results\n * 3. Combines everything into the final iteration output\n *\n * This is the \"merge\" step that combines parallel tool call results\n * back into a single coherent state.\n */\nexport function createDurableLLMMappingStep() {\n return createStep({\n id: DurableStepIds.LLM_MAPPING,\n inputSchema: durableLLMMappingInputSchema,\n outputSchema: durableLLMMappingOutputSchema,\n execute: async ({ inputData, mastra, requestContext }) => {\n const {\n llmOutput,\n toolResults,\n runId: _runId,\n agentId: _agentId,\n messageId,\n state,\n } = inputData as {\n llmOutput: DurableLLMStepOutput;\n toolResults: DurableToolCallOutput[];\n runId: string;\n agentId: string;\n messageId: string;\n state: SerializableDurableState;\n };\n\n // 1. Deserialize message list\n const messageList = new MessageList({\n threadId: state.threadId,\n resourceId: state.resourceId,\n });\n messageList.deserialize(llmOutput.messageListState);\n\n // 2. Add tool results to message list\n if (toolResults.length > 0) {\n for (const toolResult of toolResults) {\n const result = toolResult.error ? toolResult.error.message : toolResult.result;\n const updated = messageList.updateToolInvocation({\n type: 'tool-invocation' as const,\n toolInvocation: {\n state: 'result' as const,\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName,\n args: toolResult.args,\n result,\n },\n });\n\n if (!updated) {\n messageList.add(\n [\n {\n role: 'tool' as const,\n content: [\n {\n type: 'tool-result' as const,\n toolCallId: toolResult.toolCallId,\n toolName: toolResult.toolName,\n result,\n isError: toolResult.error !== undefined,\n },\n ],\n },\n ],\n 'response',\n );\n }\n }\n }\n\n // 3. Determine if we should continue\n // Preserve the LLM step's isContinued (which respects finishReason).\n // Keep ToolNotFoundError recoverable so the model can see the error and\n // retry with one of the currently available tool names.\n const allToolsErrored = toolResults.length > 0 && toolResults.every(r => r.error !== undefined);\n const allToolsNotFound = allToolsErrored && toolResults.every(r => r.error?.name === 'ToolNotFoundError');\n const isContinued = llmOutput.stepResult.isContinued && (!allToolsErrored || allToolsNotFound);\n\n // 4. Build the output\n const output: DurableAgenticExecutionOutput = {\n messageListState: messageList.serialize(),\n messageId,\n stepResult: {\n ...llmOutput.stepResult,\n isContinued,\n },\n toolResults,\n output: {\n text: llmOutput.text,\n toolCalls: llmOutput.toolCalls,\n usage: llmOutput.stepResult.totalUsage ?? {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n steps: [], // Steps are accumulated at the loop level\n },\n state: {\n ...state,\n threadExists: state.threadExists,\n },\n processorRetryCount: llmOutput.processorRetryCount,\n processorRetryFeedback: llmOutput.processorRetryFeedback,\n };\n\n // Close the MODEL_STEP span for tool-calling iterations: the LLM step defers it so\n // tool calls can nest under it, and the tools have now run. No-ops without tool calls.\n if (llmOutput.stepSpanData) {\n try {\n const observability = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({ requestContext });\n const stepSpan = observability?.rebuildSpan(llmOutput.stepSpanData as ExportedSpan);\n const pendingPayload = llmOutput.stepFinishPayload as any;\n stepSpan?.end({\n output: {\n text: llmOutput.text,\n toolCalls: llmOutput.toolCalls,\n },\n attributes: {\n usage: pendingPayload?.output?.usage,\n finishReason: pendingPayload?.stepResult?.reason,\n isContinued: pendingPayload?.stepResult?.isContinued,\n },\n });\n } catch (error) {\n // Span bookkeeping must never break the merge step.\n (mastra as Mastra | undefined)\n ?.getLogger?.()\n ?.warn?.(`[DurableAgent] Failed to close model_step span: ${error}`);\n }\n }\n\n return output;\n },\n });\n}\n","import { z } from 'zod';\nimport type { MastraScorer, MastraScorerEntry } from '../../../evals/base';\nimport { runScorer } from '../../../evals/hooks';\nimport type { PubSub } from '../../../events/pubsub';\nimport type { Mastra } from '../../../mastra';\nimport { createObservabilityContext, InternalSpans } from '../../../observability';\nimport type { AIModelGenerationSpan, ExportedSpan, SpanType } from '../../../observability';\nimport { RequestContext } from '../../../request-context';\nimport { createWorkflow } from '../../../workflows';\nimport { PUBSUB_SYMBOL } from '../../../workflows/constants';\nimport { MessageList } from '../../message-list';\nimport { DurableStepIds, DurableAgentDefaults } from '../constants';\nimport { globalRunRegistry } from '../run-registry';\nimport { emitFinishEvent } from '../stream-adapter';\nimport type {\n DurableToolCallInput,\n DurableAgenticWorkflowInput,\n DurableAgenticExecutionOutput,\n DurableLLMStepOutput,\n DurableToolCallOutput,\n SerializableScorersConfig,\n} from '../types';\nimport {\n modelConfigSchema,\n modelListEntrySchema,\n durableAgenticOutputSchema,\n baseIterationStateSchema,\n createBaseIterationStateUpdate,\n} from './shared';\nimport {\n createDurableBackgroundTaskCheckStep,\n createDurableLLMExecutionStep,\n createDurableToolCallStep,\n createDurableLLMMappingStep,\n} from './steps';\n\n/**\n * Options for creating a durable agentic workflow\n */\nexport interface DurableAgenticWorkflowOptions {\n /** Maximum number of agentic loop iterations */\n maxSteps?: number;\n}\n\n/**\n * Input schema for the durable agentic workflow.\n * Extends base schema with model list for fallback support.\n */\nconst durableAgenticInputSchema = z.object({\n __workflowKind: z.literal('durable-agent'),\n runId: z.string(),\n agentId: z.string(),\n agentName: z.string().optional(),\n messageListState: z.any(),\n toolsMetadata: z.array(z.any()),\n modelConfig: modelConfigSchema,\n // Model list for fallback support (when agent configured with array of models)\n modelList: z.array(modelListEntrySchema).optional(),\n options: z.any(),\n state: z.any(),\n messageId: z.string(),\n // Exported AGENT_RUN / MODEL_GENERATION span data, threaded so the run shares one trace\n agentSpanData: z.any().optional(),\n modelSpanData: z.any().optional(),\n});\n\n// Re-export shared output schema (identical across implementations)\n// Note: durableAgenticOutputSchema is imported from shared\n\n/**\n * Schema for the iteration state that flows through the dowhile loop.\n * Extends base schema with model list for fallback support.\n */\nconst iterationStateSchema = baseIterationStateSchema.extend({\n // Model list for fallback support\n modelList: z.array(z.any()).optional(),\n});\n\ntype IterationState = z.infer;\n\n/**\n * Create a durable agentic workflow.\n *\n * This workflow implements the agentic loop pattern in a durable way:\n *\n * 1. LLM Execution Step - Calls the LLM and gets response/tool calls\n * 2. Tool Call Steps (foreach) - Executes each tool call in parallel\n * 3. LLM Mapping Step - Merges tool results back into state\n * 4. Loop - Continues if more tool calls are needed (dowhile)\n *\n * All state flows through workflow input/output, making it durable across\n * process restarts and execution engine replays.\n */\nexport function createDurableAgenticWorkflow(options?: DurableAgenticWorkflowOptions) {\n const maxSteps = options?.maxSteps ?? DurableAgentDefaults.MAX_STEPS;\n\n // Create the LLM execution step - tools and model are resolved from Mastra at runtime\n const llmExecutionStep = createDurableLLMExecutionStep();\n\n // Create the tool call step - each tool call runs as its own step with suspend support\n const toolCallStep = createDurableToolCallStep();\n\n // Create the LLM mapping step\n const llmMappingStep = createDurableLLMMappingStep();\n\n // Create the background task check step\n const backgroundTaskCheckStep = createDurableBackgroundTaskCheckStep();\n\n // Create the single iteration workflow (LLM -> Tool Calls -> Mapping)\n // Note: foreach runs with concurrency: 1 (sequential) because tool approval\n // and suspension require sequential execution to properly handle suspend/resume.\n // The workflow is created once at startup and reused for all runs.\n const singleIterationWorkflow = createWorkflow({\n id: DurableStepIds.AGENTIC_EXECUTION,\n inputSchema: iterationStateSchema,\n outputSchema: iterationStateSchema,\n options: {\n shouldPersistSnapshot: ({ workflowStatus }) => workflowStatus === 'suspended',\n validateInputs: false,\n sharePubsub: true,\n // Internal durable-agent execution plumbing — hide workflow spans;\n // the agent/tool/model spans within still surface for users.\n tracingPolicy: {\n internal: InternalSpans.WORKFLOW,\n },\n },\n })\n // Step 0: Convert iteration state to LLM input format\n .map(\n async ({ inputData }) => {\n const state = inputData as IterationState;\n return {\n runId: state.runId,\n agentId: state.agentId,\n agentName: state.agentName,\n messageListState: state.messageListState,\n toolsMetadata: state.toolsMetadata,\n modelConfig: state.modelConfig,\n modelList: state.modelList,\n options: state.options,\n state: state.state,\n messageId: state.messageId,\n stepIndex: state.iterationCount,\n agentSpanData: state.agentSpanData,\n modelSpanData: state.modelSpanData,\n };\n },\n { id: 'map-to-llm-input' },\n )\n // Step 1: Execute LLM\n .then(llmExecutionStep)\n // Step 2: Extract tool calls as array for foreach (forward model_step span for nesting)\n .map(\n async ({ inputData }) => {\n const llmOutput = inputData as DurableLLMStepOutput;\n return (llmOutput.toolCalls ?? []).map(toolCall => ({\n ...toolCall,\n stepSpanData: llmOutput.stepSpanData,\n })) as DurableToolCallInput[];\n },\n { id: 'extract-tool-calls' },\n )\n // Step 3: Execute each tool call individually (with suspend support)\n .foreach(toolCallStep)\n // Step 4: Collect tool results and bundle with LLM output for mapping step\n .map(\n async ({ inputData, getStepResult, getInitData }) => {\n const toolResults = inputData as DurableToolCallOutput[];\n const llmOutput = getStepResult(llmExecutionStep.id) as DurableLLMStepOutput;\n const initData = getInitData() as IterationState;\n\n return {\n llmOutput,\n toolResults,\n runId: initData.runId,\n agentId: initData.agentId,\n messageId: initData.messageId,\n state: llmOutput?.state ?? initData.state,\n };\n },\n { id: 'collect-tool-results' },\n )\n // Step 5: Map tool results back to state\n .then(llmMappingStep)\n // Step 6: Check for pending background tasks\n .then(backgroundTaskCheckStep)\n // Step 7: Map back to iteration state format using shared function\n .map(\n async ({ inputData, getInitData }) => {\n const executionOutput = inputData as DurableAgenticExecutionOutput;\n const initData = getInitData() as IterationState;\n\n // Use shared function for base state update\n const baseUpdate = createBaseIterationStateUpdate({\n currentState: initData,\n executionOutput,\n });\n\n // Extend with core-specific fields\n const newIterationState: IterationState = {\n ...baseUpdate,\n modelList: initData.modelList,\n };\n\n return newIterationState;\n },\n { id: 'update-iteration-state' },\n )\n .commit();\n\n // Create the main agentic loop workflow with dowhile\n return (\n createWorkflow({\n id: DurableStepIds.AGENTIC_LOOP,\n inputSchema: durableAgenticInputSchema,\n outputSchema: durableAgenticOutputSchema,\n options: {\n shouldPersistSnapshot: ({ workflowStatus }) => workflowStatus === 'suspended',\n validateInputs: false,\n // Internal durable-agent execution plumbing — see singleIterationWorkflow.\n tracingPolicy: {\n internal: InternalSpans.WORKFLOW,\n },\n },\n })\n // Initialize iteration state from input\n .map(\n async ({ inputData }) => {\n const input = inputData as DurableAgenticWorkflowInput;\n const iterationState: IterationState = {\n ...input,\n iterationCount: 0,\n accumulatedSteps: [],\n accumulatedUsage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n lastStepResult: undefined,\n };\n return iterationState;\n },\n { id: 'init-iteration-state' },\n )\n // Run the agentic loop with dowhile\n .dowhile(singleIterationWorkflow, async ({ inputData }) => {\n const state = inputData as IterationState;\n\n // Check if we should continue\n const shouldContinue = state.lastStepResult?.isContinued === true;\n const runMaxSteps = state.options?.maxSteps ?? maxSteps;\n const underMaxSteps = state.iterationCount < runMaxSteps;\n\n return shouldContinue && underMaxSteps;\n })\n // Map final state to output format, run output processors, persist memory, emit finish\n .map(\n async params => {\n const { inputData, mastra, requestContext } = params;\n const state = inputData as IterationState;\n const initData = params.getInitData() as DurableAgenticWorkflowInput;\n\n const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n const logger = mastra?.getLogger?.();\n\n // Extract final text from last step\n const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n const finalText = lastStep?.text;\n\n // Run output processors (processOutputResult) if available\n const registryEntry = globalRunRegistry.get(state.runId);\n if (registryEntry?.outputProcessors?.length) {\n try {\n const { ProcessorRunner } = await import('../../../processors/runner');\n const runner = new ProcessorRunner({\n inputProcessors: registryEntry.inputProcessors ?? [],\n outputProcessors: registryEntry.outputProcessors,\n errorProcessors: registryEntry.errorProcessors ?? [],\n logger: logger as any,\n agentName: initData.agentName ?? initData.agentId,\n processorStates: registryEntry.processorStates,\n });\n const outputMessageList = new MessageList();\n outputMessageList.deserialize(state.messageListState);\n await runner.runOutputProcessors(outputMessageList, {} as any, requestContext ?? new RequestContext(), 0);\n } catch (error) {\n logger?.warn?.(`[DurableAgent] Error running output processors: ${error}`);\n }\n }\n\n // Memory persistence (executeOnFinish equivalent)\n const durableState = initData.state;\n if (\n registryEntry?.saveQueueManager &&\n registryEntry.memory &&\n durableState?.threadId &&\n durableState?.resourceId &&\n !durableState.observationalMemory\n ) {\n try {\n const memoryMessageList = new MessageList();\n memoryMessageList.deserialize(state.messageListState);\n\n if (!durableState.threadExists) {\n await registryEntry.memory.createThread?.({\n threadId: durableState.threadId,\n resourceId: durableState.resourceId,\n memoryConfig: durableState.memoryConfig,\n });\n }\n\n await registryEntry.saveQueueManager.flushMessages(\n memoryMessageList,\n durableState.threadId,\n durableState.memoryConfig,\n );\n } catch (error) {\n logger?.warn?.(`[DurableAgent] Error persisting messages: ${error}`);\n }\n }\n\n const finalOutput = {\n messageListState: state.messageListState,\n messageId: state.messageId,\n stepResult: state.lastStepResult || {\n reason: 'stop',\n warnings: [],\n isContinued: false,\n },\n output: {\n text: finalText,\n usage: state.accumulatedUsage,\n steps: state.accumulatedSteps,\n },\n state: state.state,\n };\n\n if (pubsub) {\n await emitFinishEvent(pubsub, state.runId, {\n output: finalOutput.output,\n stepResult: finalOutput.stepResult,\n });\n }\n\n // End MODEL_GENERATION then AGENT_RUN once at completion. After a resume the\n // originals were ended as `suspended`, so end the *resume* spans (registry override).\n try {\n const observability = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({\n requestContext,\n });\n const reg = globalRunRegistry.get(initData.runId);\n const modelSpanData = reg?.resumeModelSpanData ?? initData.modelSpanData;\n const agentSpanData = reg?.resumeAgentSpanData ?? initData.agentSpanData;\n if (observability) {\n if (modelSpanData) {\n const modelSpan = observability.rebuildSpan(\n modelSpanData as ExportedSpan,\n ) as AIModelGenerationSpan | undefined;\n modelSpan?.createTracker()?.endGeneration({\n output: { text: finalText },\n attributes: { finishReason: finalOutput.stepResult?.reason },\n usage: state.accumulatedUsage,\n });\n }\n if (agentSpanData) {\n const agentSpan = observability.rebuildSpan(agentSpanData as ExportedSpan);\n agentSpan?.end({ output: { text: finalText } });\n }\n }\n } catch (error) {\n logger?.warn?.(`[DurableAgent] Error ending observability spans: ${error}`);\n }\n\n return finalOutput;\n },\n { id: 'map-final-output' },\n )\n // Execute scorers (fire-and-forget, doesn't affect main result)\n .map(\n async params => {\n const { inputData, getInitData, mastra, requestContext, tracingContext } = params;\n const finalOutput = inputData;\n const initData = getInitData() as DurableAgenticWorkflowInput;\n\n // If no scorers configured, skip\n const scorers = initData.scorers as SerializableScorersConfig | undefined;\n if (!scorers || Object.keys(scorers).length === 0) {\n return finalOutput;\n }\n\n const logger = mastra?.getLogger?.();\n\n // Reconstruct input MessageList to extract scorer input\n const inputMessageList = new MessageList();\n inputMessageList.deserialize(initData.messageListState);\n\n // Build scorer input (messages before generation)\n const scorerInput = {\n inputMessages: inputMessageList.getPersisted.input.db(),\n rememberedMessages: inputMessageList.getPersisted.remembered.db(),\n systemMessages: inputMessageList.getSystemMessages(),\n taggedSystemMessages: inputMessageList.getPersisted.taggedSystemMessages,\n };\n\n // Reconstruct output MessageList to extract scorer output\n const outputMessageList = new MessageList();\n outputMessageList.deserialize(finalOutput.messageListState);\n const scorerOutput = outputMessageList.getPersisted.response.db();\n\n // Create request context for scorer resolution\n const resolveContext = requestContext ?? new RequestContext();\n\n // Execute each scorer (fire-and-forget)\n for (const [scorerKey, scorerEntry] of Object.entries(scorers)) {\n const { scorerName, sampling } = scorerEntry;\n\n try {\n // Resolve the scorer from Mastra\n const scorer = (mastra as Mastra)?.getScorer?.(scorerName) as MastraScorer | undefined;\n\n if (!scorer) {\n logger?.warn?.(`Scorer ${scorerName} not found in Mastra, skipping`, {\n runId: initData.runId,\n scorerKey,\n });\n continue;\n }\n\n // Create the scorer entry expected by runScorer\n const scorerObject: MastraScorerEntry = {\n scorer,\n sampling,\n };\n\n // Call runScorer (fire-and-forget via hooks)\n runScorer({\n runId: initData.runId,\n scorerId: scorerKey,\n scorerObject,\n input: scorerInput,\n output: scorerOutput,\n requestContext: resolveContext as any,\n entity: {\n id: initData.agentId,\n name: initData.agentName ?? initData.agentId,\n },\n structuredOutput: false,\n source: 'LIVE',\n entityType: 'AGENT',\n threadId: initData.state?.threadId,\n resourceId: initData.state?.resourceId,\n ...createObservabilityContext(tracingContext),\n });\n } catch (error) {\n // Log but don't fail - scorer errors shouldn't affect main execution\n logger?.warn?.(`Error executing scorer ${scorerName}`, {\n error,\n runId: initData.runId,\n scorerKey,\n });\n }\n }\n\n return finalOutput;\n },\n { id: 'execute-scorers' },\n )\n .commit()\n );\n}\n","import type { MastraServerCache } from '../../cache/base';\nimport { InMemoryServerCache } from '../../cache/inmemory';\nimport { CachingPubSub } from '../../events/caching-pubsub';\nimport { EventEmitterPubSub } from '../../events/event-emitter';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Mastra } from '../../mastra';\nimport { createObservabilityContext, getOrCreateSpan, SpanType, EntityType } from '../../observability';\nimport type { MastraModelOutput } from '../../stream/base/output';\nimport type { ChunkType } from '../../stream/types';\nimport { Agent } from '../agent';\nimport type { AgentExecutionOptions } from '../agent.types';\nimport type { MessageListInput } from '../message-list';\nimport type { ToolsInput } from '../types';\n\nimport { AGENT_STREAM_TOPIC } from './constants';\nimport { runDurableStreamUntilIdle } from './durable-stream-until-idle';\nimport { prepareForDurableExecution } from './preparation';\nimport { endRunSpansWithError, ExtendedRunRegistry, globalRunRegistry } from './run-registry';\nimport { createDurableAgentStream, emitErrorEvent } from './stream-adapter';\nimport type {\n AgentFinishEventData,\n AgentStepFinishEventData,\n AgentSuspendedEventData,\n DurableAgenticWorkflowInput,\n} from './types';\nimport { createDurableAgenticWorkflow } from './workflows';\n\n/**\n * Options for DurableAgent.stream()\n */\nexport interface DurableAgentStreamOptions {\n /** Custom instructions that override the agent's default instructions for this execution */\n instructions?: AgentExecutionOptions['instructions'];\n /** Additional context messages to provide to the agent */\n context?: AgentExecutionOptions['context'];\n /** Memory configuration for conversation persistence and retrieval */\n memory?: AgentExecutionOptions['memory'];\n /** Unique identifier for this execution run */\n runId?: string;\n /** Request Context containing dynamic configuration and state */\n requestContext?: AgentExecutionOptions['requestContext'];\n /** Maximum number of steps to run */\n maxSteps?: number;\n /** Additional tool sets that can be used for this execution */\n toolsets?: AgentExecutionOptions['toolsets'];\n /** Client-side tools available during execution */\n clientTools?: AgentExecutionOptions['clientTools'];\n /** Tool selection strategy */\n toolChoice?: AgentExecutionOptions['toolChoice'];\n /** Tool names enabled for this execution */\n activeTools?: AgentExecutionOptions['activeTools'];\n /** Model-specific settings like temperature */\n modelSettings?: AgentExecutionOptions['modelSettings'];\n /** Require approval for all tool calls */\n requireToolApproval?: boolean;\n /** Automatically resume suspended tools */\n autoResumeSuspendedTools?: boolean;\n /** Maximum number of tool calls to execute concurrently */\n toolCallConcurrency?: number;\n /** Whether to include raw chunks in the stream output */\n includeRawChunks?: boolean;\n /** Maximum processor retries */\n maxProcessorRetries?: number;\n /** Structured output configuration */\n structuredOutput?: AgentExecutionOptions['structuredOutput'];\n /** Version overrides for sub-agent delegation */\n versions?: AgentExecutionOptions['versions'];\n /** Callback when chunk is received */\n onChunk?: (chunk: ChunkType) => void | Promise;\n /** Callback when step finishes */\n onStepFinish?: (result: AgentStepFinishEventData) => void | Promise;\n /** Callback when execution finishes */\n onFinish?: (result: AgentFinishEventData) => void | Promise;\n /** Callback on error */\n onError?: (error: Error) => void | Promise;\n /** Callback when workflow suspends (e.g., for tool approval) */\n onSuspended?: (data: AgentSuspendedEventData) => void | Promise;\n /** When true, the in-loop background task check step skips waiting (streamUntilIdle sets this) */\n _skipBgTaskWait?: boolean;\n}\n\n/**\n * Result from DurableAgent.stream()\n */\nexport interface DurableAgentStreamResult {\n /** The streaming output */\n output: MastraModelOutput;\n /** The full stream - delegates to output.fullStream for server compatibility */\n readonly fullStream: ReadableStream;\n /** The unique run ID for this execution */\n runId: string;\n /** Thread ID if using memory */\n threadId?: string;\n /** Resource ID if using memory */\n resourceId?: string;\n /** Cleanup function to call when done (unsubscribes from pubsub) */\n cleanup: () => void;\n}\n\n/**\n * Configuration for DurableAgent - wraps an existing Agent with durable execution\n */\nexport interface DurableAgentConfig<\n TAgentId extends string = string,\n TTools extends ToolsInput = ToolsInput,\n TOutput = undefined,\n> {\n /**\n * The Agent to wrap with durable execution capabilities.\n * All agent methods (getModel, listTools, etc.) delegate to this agent.\n */\n agent: Agent;\n\n /**\n * Optional ID override. Defaults to agent.id.\n */\n id?: TAgentId;\n\n /**\n * Optional name override. Defaults to agent.name.\n */\n name?: string;\n\n /**\n * PubSub instance for streaming events.\n * Optional - if not provided, defaults to EventEmitterPubSub.\n */\n pubsub?: PubSub;\n\n /**\n * Cache instance for storing stream events.\n * Enables resumable streams - clients can disconnect and reconnect\n * without missing events.\n *\n * - If not provided: Inherits from Mastra instance, or uses InMemoryServerCache\n * - If provided: Uses the provided cache backend (e.g., Redis)\n * - If set to `false`: Disables caching (streams are not resumable)\n */\n cache?: MastraServerCache | false;\n\n /**\n * Maximum steps for the agentic loop.\n * Defaults to the workflow default if not specified.\n */\n maxSteps?: number;\n\n /**\n * Timeout in milliseconds before automatic cleanup of registry entries\n * after a stream finishes or errors. This provides a grace period for\n * late observers to access the stream.\n *\n * Defaults to 30000 (30 seconds).\n * Set to 0 to disable auto-cleanup (manual cleanup() required).\n */\n cleanupTimeoutMs?: number;\n}\n\n/**\n * DurableAgent wraps an existing Agent with durable execution capabilities.\n *\n * Key features:\n * 1. Resumable streams - clients can disconnect and reconnect without missing events\n * 2. Serializable workflow inputs - works with durable execution engines\n * 3. PubSub-based streaming - events flow through pubsub for distribution\n *\n * DurableAgent extends Agent, delegating most methods to the wrapped agent.\n * It overrides stream() to use durable execution with the agentic workflow.\n *\n * Subclasses (EventedAgent, InngestAgent) override executeWorkflow() to\n * customize how the workflow is executed.\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { DurableAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n * id: 'my-agent',\n * instructions: 'You are a helpful assistant',\n * model: openai('gpt-4'),\n * });\n *\n * const durableAgent = new DurableAgent({ agent });\n *\n * const { output, runId, cleanup } = await durableAgent.stream('Hello!');\n * const text = await output.text;\n * cleanup();\n * ```\n */\nexport class DurableAgent<\n TAgentId extends string = string,\n TTools extends ToolsInput = ToolsInput,\n TOutput = undefined,\n> extends Agent {\n /** The wrapped agent */\n readonly #wrappedAgent: Agent;\n\n /** Registry for per-run non-serializable state */\n readonly #runRegistry: ExtendedRunRegistry;\n\n /** The durable workflow for agent execution */\n #workflow: ReturnType | null = null;\n\n /** Maximum steps for the agentic loop */\n readonly #maxSteps?: number;\n\n /** Inner pubsub (before CachingPubSub wrapper) */\n #innerPubsub: PubSub;\n\n /** Whether the user explicitly provided a pubsub (don't override with mastra.pubsub) */\n readonly #hasCustomPubsub: boolean;\n\n /** User-provided cache (undefined = inherit from mastra, false = disabled) */\n #cacheConfig: MastraServerCache | false | undefined;\n\n /** Resolved cache instance (lazily initialized) */\n #resolvedCache: MastraServerCache | null = null;\n\n /** CachingPubSub instance (lazily initialized) */\n #cachingPubsub: PubSub | null = null;\n\n /** Mastra instance (set via __setMastra when registered) */\n #mastra: Mastra | undefined;\n\n /** Active streamUntilIdle wrappers keyed by scope (threadId|resourceId) */\n #activeStreamUntilIdle = new Map void>();\n\n /** Timeout for auto-cleanup after stream finishes (0 = disabled) */\n readonly #cleanupTimeoutMs: number;\n\n /**\n * Create a new DurableAgent that wraps an existing Agent\n */\n constructor(config: DurableAgentConfig) {\n const { agent, id: idOverride, name: nameOverride, pubsub, cache, maxSteps, cleanupTimeoutMs } = config;\n\n // Use provided id/name or fall back to agent.id/agent.name\n const agentId = idOverride ?? agent.id;\n const agentName = nameOverride ?? agent.name ?? agent.id;\n\n // Call Agent constructor with minimal config - we delegate to the wrapped agent\n super({\n id: agentId as TAgentId,\n name: agentName,\n // Delegate to wrapped agent's instructions\n instructions: ({ requestContext }) => agent.getInstructions({ requestContext }),\n // We need to provide model to satisfy the base class, but we'll delegate to wrapped agent\n model: (agent as any).__model ?? agent.getModel(),\n });\n\n this.#wrappedAgent = agent;\n this.#runRegistry = new ExtendedRunRegistry();\n this.#maxSteps = maxSteps;\n this.#hasCustomPubsub = !!pubsub;\n this.#innerPubsub = pubsub ?? new EventEmitterPubSub();\n this.#cacheConfig = cache;\n this.#cleanupTimeoutMs = cleanupTimeoutMs ?? 30_000;\n }\n\n // ===========================================================================\n // Lazy PubSub/Cache initialization (allows inheriting cache from Mastra)\n // ===========================================================================\n\n /**\n * Get the resolved cache instance.\n * Lazily initialized to allow inheriting from Mastra.\n */\n get cache(): MastraServerCache | null {\n this.#ensurePubsubInitialized();\n return this.#resolvedCache;\n }\n\n /**\n * Get the PubSub instance.\n * Returns CachingPubSub if caching is enabled, otherwise the inner pubsub.\n */\n get pubsub(): PubSub {\n this.#ensurePubsubInitialized();\n return this.#cachingPubsub!;\n }\n\n /**\n * Ensure pubsub and cache are initialized.\n * Called lazily on first access to allow inheriting cache from Mastra.\n */\n #ensurePubsubInitialized(): void {\n if (this.#cachingPubsub) return;\n\n if (this.#cacheConfig === false) {\n // Caching explicitly disabled\n this.#cachingPubsub = this.#innerPubsub;\n this.#resolvedCache = null;\n } else {\n // Resolve cache: user-provided > mastra's cache > default InMemoryServerCache\n const resolvedCache = this.#cacheConfig ?? this.#mastra?.serverCache ?? new InMemoryServerCache();\n this.#resolvedCache = resolvedCache;\n this.#cachingPubsub = new CachingPubSub(this.#innerPubsub, resolvedCache);\n }\n }\n\n // ===========================================================================\n // Delegate to wrapped agent\n // ===========================================================================\n\n /**\n * Get the wrapped agent instance.\n */\n get agent(): Agent {\n return this.#wrappedAgent;\n }\n\n /**\n * Get the run registry (for testing and advanced usage)\n */\n get runRegistry(): ExtendedRunRegistry {\n return this.#runRegistry;\n }\n\n /**\n * Get the max steps configured for this agent\n */\n get maxSteps(): number | undefined {\n return this.#maxSteps;\n }\n\n /**\n * Get the cleanup timeout in milliseconds.\n * Returns 0 if auto-cleanup is disabled.\n */\n get cleanupTimeoutMs(): number {\n return this.#cleanupTimeoutMs;\n }\n\n // Delegate Agent methods to wrapped agent\n override getModel(options?: any) {\n return this.#wrappedAgent.getModel(options);\n }\n\n override getInstructions(options?: any) {\n return this.#wrappedAgent.getInstructions(options);\n }\n\n override listTools(options?: any) {\n return this.#wrappedAgent.listTools(options);\n }\n\n override getMemory() {\n return this.#wrappedAgent.getMemory();\n }\n\n override getVoice() {\n return this.#wrappedAgent.getVoice();\n }\n\n // ===========================================================================\n // Protected methods for subclass overrides\n // ===========================================================================\n\n /**\n * Get the PubSub instance for use by subclasses.\n * @internal\n */\n protected get pubsubInternal(): PubSub {\n return this.pubsub;\n }\n\n /**\n * Get the run registry for use by subclasses.\n * @internal\n */\n protected get runRegistryInternal(): ExtendedRunRegistry {\n return this.#runRegistry;\n }\n\n /**\n * Execute the durable workflow.\n *\n * Subclasses override this method to customize how the workflow is executed:\n * - DurableAgent (this): Runs the workflow directly via createRun + start\n * - EventedAgent: Uses run.startAsync() for fire-and-forget execution\n * - InngestAgent: Uses inngest.send() to trigger Inngest function\n *\n * @param runId - The unique run ID\n * @param workflowInput - The serialized workflow input\n * @internal\n */\n protected async executeWorkflow(runId: string, workflowInput: DurableAgenticWorkflowInput): Promise {\n const workflow = this.getWorkflow();\n const entry = globalRunRegistry.get(runId);\n const requestContext = entry?.requestContext;\n\n const run = await workflow.createRun({ runId, pubsub: this.pubsub });\n // Parent the workflow run under the AGENT_RUN span so the trace exports under it.\n const result = await run.start({\n inputData: workflowInput,\n requestContext,\n ...createObservabilityContext({ currentSpan: entry?.agentSpan }),\n });\n\n if (result?.status === 'failed') {\n const error = new Error((result as any).error?.message || 'Workflow execution failed');\n await this.emitError(runId, error);\n }\n }\n\n /**\n * Create the durable workflow for this agent.\n *\n * Subclasses can override this method to use a different workflow implementation:\n * - DurableAgent (this): Uses createDurableAgenticWorkflow()\n * - InngestAgent: Uses createInngestDurableAgenticWorkflow()\n *\n * @internal\n */\n protected createWorkflow(): ReturnType {\n return createDurableAgenticWorkflow({\n maxSteps: this.#maxSteps,\n });\n }\n\n /**\n * Emit an error event to pubsub.\n *\n * @param runId - The run ID\n * @param error - The error to emit\n * @internal\n */\n protected async emitError(runId: string, error: Error): Promise {\n // End the root spans on error so the trace exports (mirrors the non-durable map-results-step).\n endRunSpansWithError(runId, error);\n await emitErrorEvent(this.pubsub, runId, error);\n }\n\n // ===========================================================================\n // Public API\n // ===========================================================================\n\n /**\n * Stream a response from the agent using durable execution.\n */\n // @ts-expect-error - Intentionally different signature for durable execution\n async stream(\n messages: MessageListInput,\n options?: DurableAgentStreamOptions,\n ): Promise> {\n // 1. Prepare for durable execution (non-durable phase)\n const preparation = await prepareForDurableExecution({\n agent: this.#wrappedAgent as Agent,\n messages,\n options: options as AgentExecutionOptions,\n runId: options?.runId,\n requestContext: options?.requestContext,\n mastra: this.#mastra,\n });\n\n const { runId, messageId, workflowInput, registryEntry, messageList, threadId, resourceId } = preparation;\n\n // 2. Register non-serializable state (both local and global registries)\n this.#runRegistry.registerWithMessageList(runId, registryEntry, messageList, { threadId, resourceId });\n globalRunRegistry.set(runId, { ...registryEntry, messageList });\n\n // Track cleanup state to avoid double cleanup\n let cleanedUp = false;\n let autoCleanupTimer: ReturnType | null = null;\n\n // Schedule automatic registry cleanup after stream ends\n const scheduleAutoCleanup = () => {\n if (autoCleanupTimer || cleanedUp || this.#cleanupTimeoutMs === 0) return;\n autoCleanupTimer = setTimeout(() => {\n if (!cleanedUp) {\n this.#runRegistry.cleanup(runId);\n globalRunRegistry.delete(runId);\n this.#clearPubsubTopic(runId);\n cleanedUp = true;\n }\n }, this.#cleanupTimeoutMs);\n };\n\n // 3. Create the durable agent stream (subscribes to pubsub)\n const {\n output,\n cleanup: streamCleanup,\n ready,\n } = createDurableAgentStream({\n pubsub: this.pubsub,\n runId,\n messageId,\n model: {\n modelId: workflowInput.modelConfig.modelId,\n provider: workflowInput.modelConfig.provider,\n version: 'v3',\n },\n threadId,\n resourceId,\n onChunk: options?.onChunk,\n onStepFinish: options?.onStepFinish,\n onFinish: async result => {\n await options?.onFinish?.(result);\n scheduleAutoCleanup();\n },\n onError: async error => {\n await options?.onError?.(error);\n scheduleAutoCleanup();\n },\n onSuspended: options?.onSuspended,\n });\n\n // 4. Wait for subscription to be ready, then execute workflow\n // This prevents race conditions where events are published before subscription\n ready\n .then(() => this.executeWorkflow(runId, workflowInput))\n .catch(error => {\n void this.emitError(runId, error);\n });\n\n // 5. Create cleanup function (cancels auto-cleanup timer if called)\n const cleanup = () => {\n if (autoCleanupTimer) {\n clearTimeout(autoCleanupTimer);\n autoCleanupTimer = null;\n }\n if (!cleanedUp) {\n streamCleanup();\n this.#runRegistry.cleanup(runId);\n globalRunRegistry.delete(runId);\n this.#clearPubsubTopic(runId);\n cleanedUp = true;\n }\n };\n\n return {\n output,\n get fullStream() {\n return output.fullStream as ReadableStream;\n },\n runId,\n threadId,\n resourceId,\n cleanup,\n };\n }\n\n /**\n * Resume a suspended workflow execution.\n */\n async resume(\n runId: string,\n resumeData: unknown,\n options?: {\n onChunk?: (chunk: ChunkType) => void | Promise;\n onStepFinish?: (result: AgentStepFinishEventData) => void | Promise;\n onFinish?: (result: AgentFinishEventData) => void | Promise;\n onError?: (error: Error) => void | Promise;\n onSuspended?: (data: AgentSuspendedEventData) => void | Promise;\n },\n ): Promise> {\n const entry = this.#runRegistry.get(runId);\n if (!entry) {\n throw new Error(`No registry entry found for run ${runId}. Cannot resume.`);\n }\n\n const memoryInfo = this.#runRegistry.getMemoryInfo(runId);\n\n // Track cleanup state to avoid double cleanup\n let cleanedUp = false;\n let autoCleanupTimer: ReturnType | null = null;\n\n const scheduleAutoCleanup = () => {\n if (autoCleanupTimer || cleanedUp || this.#cleanupTimeoutMs === 0) return;\n autoCleanupTimer = setTimeout(() => {\n if (!cleanedUp) {\n this.#runRegistry.cleanup(runId);\n globalRunRegistry.delete(runId);\n this.#clearPubsubTopic(runId);\n cleanedUp = true;\n }\n }, this.#cleanupTimeoutMs);\n };\n\n const globalEntry = globalRunRegistry.get(runId);\n const resumeModel = globalEntry?.model as any;\n\n const {\n output,\n cleanup: streamCleanup,\n ready,\n } = createDurableAgentStream({\n pubsub: this.pubsub,\n runId,\n messageId: crypto.randomUUID(),\n model: {\n modelId: resumeModel?.modelId,\n provider: resumeModel?.provider,\n version: 'v3',\n },\n threadId: memoryInfo?.threadId,\n resourceId: memoryInfo?.resourceId,\n onChunk: options?.onChunk,\n onStepFinish: options?.onStepFinish,\n onFinish: async result => {\n await options?.onFinish?.(result);\n scheduleAutoCleanup();\n },\n onError: async error => {\n await options?.onError?.(error);\n scheduleAutoCleanup();\n },\n onSuspended: options?.onSuspended,\n });\n\n // Wait for subscription to be ready, then resume workflow\n const workflow = this.getWorkflow();\n const requestContext = globalRunRegistry.get(runId)?.requestContext;\n\n // Open a fresh AGENT_RUN + MODEL_GENERATION for the resumed segment on the same\n // traceId — the originals were ended as `suspended` and can't be reopened. Post-resume\n // steps + terminal end() target these via the registry override. (Linking = follow-up.)\n const origTraceId = entry.agentSpan?.traceId;\n if (origTraceId && this.#mastra?.observability) {\n try {\n const ag = this.#wrappedAgent as Agent;\n const resumeAgentSpan = getOrCreateSpan({\n type: SpanType.AGENT_RUN,\n name: `agent run (resumed): '${ag.id}'`,\n entityType: EntityType.AGENT,\n entityId: ag.id,\n entityName: ag.name,\n metadata: { runId, resumed: true },\n tracingOptions: { traceId: origTraceId },\n requestContext,\n mastra: this.#mastra,\n });\n const resumeModelSpan = resumeAgentSpan?.createChildSpan({\n type: SpanType.MODEL_GENERATION,\n name: `llm: '${resumeModel?.modelId ?? ''}'`,\n attributes: { model: resumeModel?.modelId, provider: resumeModel?.provider, streaming: true },\n metadata: { runId, resumed: true },\n requestContext,\n });\n for (const reg of [entry, globalRunRegistry.get(runId)]) {\n if (!reg) continue;\n reg.resumeAgentSpan = resumeAgentSpan;\n reg.resumeModelSpan = resumeModelSpan;\n reg.resumeAgentSpanData = resumeAgentSpan?.exportSpan();\n reg.resumeModelSpanData = resumeModelSpan?.exportSpan();\n }\n } catch (error) {\n // Span bookkeeping must never block resume.\n this.#mastra?.getLogger?.()?.warn?.(`[DurableAgent] Failed to open resume spans: ${error}`);\n }\n }\n\n ready\n .then(async () => {\n const run = await workflow.createRun({ runId, pubsub: this.pubsub });\n const result = await run.resume({\n resumeData,\n requestContext,\n ...createObservabilityContext({ currentSpan: entry.resumeAgentSpan ?? entry.agentSpan }),\n });\n if (result?.status === 'failed') {\n const error = new Error((result as any).error?.message || 'Workflow resume failed');\n void this.emitError(runId, error);\n }\n })\n .catch(error => {\n void this.emitError(runId, error);\n });\n\n const cleanup = () => {\n if (autoCleanupTimer) {\n clearTimeout(autoCleanupTimer);\n autoCleanupTimer = null;\n }\n if (!cleanedUp) {\n streamCleanup();\n this.#runRegistry.cleanup(runId);\n globalRunRegistry.delete(runId);\n this.#clearPubsubTopic(runId);\n cleanedUp = true;\n }\n };\n\n return {\n output,\n get fullStream() {\n return output.fullStream as ReadableStream;\n },\n runId,\n threadId: memoryInfo?.threadId,\n resourceId: memoryInfo?.resourceId,\n cleanup,\n };\n }\n\n /**\n * Observe an existing stream.\n * Use this to reconnect to a stream after a network disconnection.\n *\n * **Warning:** The returned `cleanup()` function destroys the run's registry\n * entries and cached PubSub events. Only call it when you are done with the\n * run entirely. If the workflow is suspended and you intend to resume later,\n * do not call cleanup — let the auto-cleanup timer handle it after\n * FINISH/ERROR. Auto-cleanup does not fire on SUSPENDED events.\n */\n async observe(\n runId: string,\n options?: {\n offset?: number;\n onChunk?: (chunk: ChunkType) => void | Promise;\n onStepFinish?: (result: AgentStepFinishEventData) => void | Promise;\n onFinish?: (result: AgentFinishEventData) => void | Promise;\n onError?: (error: Error) => void | Promise;\n onSuspended?: (data: AgentSuspendedEventData) => void | Promise;\n },\n ): Promise, 'runId'> & { runId: string }> {\n const memoryInfo = this.#runRegistry.getMemoryInfo(runId);\n\n // Track cleanup state to avoid double cleanup\n let cleanedUp = false;\n let autoCleanupTimer: ReturnType | null = null;\n\n const scheduleAutoCleanup = () => {\n if (autoCleanupTimer || cleanedUp || this.#cleanupTimeoutMs === 0) return;\n autoCleanupTimer = setTimeout(() => {\n if (!cleanedUp) {\n this.#runRegistry.cleanup(runId);\n globalRunRegistry.delete(runId);\n this.#clearPubsubTopic(runId);\n cleanedUp = true;\n }\n }, this.#cleanupTimeoutMs);\n };\n\n const {\n output,\n cleanup: streamCleanup,\n ready,\n } = createDurableAgentStream({\n pubsub: this.pubsub,\n runId,\n messageId: crypto.randomUUID(),\n model: {\n modelId: undefined,\n provider: undefined,\n version: 'v3',\n },\n threadId: memoryInfo?.threadId,\n resourceId: memoryInfo?.resourceId,\n offset: options?.offset,\n onChunk: options?.onChunk,\n onStepFinish: options?.onStepFinish,\n onFinish: async result => {\n await options?.onFinish?.(result);\n scheduleAutoCleanup();\n },\n onError: async error => {\n await options?.onError?.(error);\n scheduleAutoCleanup();\n },\n onSuspended: options?.onSuspended,\n });\n\n // Wait for subscription to be ready\n await ready;\n\n const cleanup = () => {\n if (autoCleanupTimer) {\n clearTimeout(autoCleanupTimer);\n autoCleanupTimer = null;\n }\n if (!cleanedUp) {\n streamCleanup();\n this.#runRegistry.cleanup(runId);\n globalRunRegistry.delete(runId);\n this.#clearPubsubTopic(runId);\n cleanedUp = true;\n }\n };\n\n return {\n output,\n get fullStream() {\n return output.fullStream as ReadableStream;\n },\n runId,\n threadId: memoryInfo?.threadId,\n resourceId: memoryInfo?.resourceId,\n cleanup,\n };\n }\n\n /**\n * Clear cached pubsub events for a run's topic.\n * Only effective when pubsub supports clearTopic (e.g. CachingPubSub).\n */\n #clearPubsubTopic(runId: string): void {\n const pubsub = this.pubsub;\n if ('clearTopic' in pubsub && typeof (pubsub as any).clearTopic === 'function') {\n void (pubsub as any).clearTopic(AGENT_STREAM_TOPIC(runId));\n }\n }\n\n /**\n * Get the workflow instance for direct execution.\n * Lazily creates the workflow and registers Mastra on it (needed for\n * getAgentById in execution steps).\n */\n getWorkflow() {\n if (!this.#workflow) {\n this.#workflow = this.createWorkflow();\n // Register mastra on the workflow so execution steps can access agents/tools.\n // DurableAgent goes through the normal Agent registration path (not the durable wrapper\n // path that calls addWorkflow), so the workflow isn't registered in Mastra's #workflows.\n // We set mastra directly here instead.\n if (this.#mastra) {\n this.#workflow.__registerMastra(this.#mastra);\n this.#workflow.__registerPrimitives({\n logger: this.#mastra.getLogger(),\n storage: this.#mastra.getStorage(),\n });\n }\n }\n return this.#workflow;\n }\n\n /**\n * Stream until all background tasks complete and the agent is idle.\n * Mirrors the regular Agent's streamUntilIdle but adapted for durable execution.\n */\n // @ts-expect-error - Intentionally different return type for durable execution\n override async streamUntilIdle(\n messages: MessageListInput,\n streamOptions?: DurableAgentStreamOptions & { maxIdleMs?: number },\n ): Promise> {\n return runDurableStreamUntilIdle(\n this as unknown as DurableAgent,\n messages,\n streamOptions,\n {\n activeStreams: this.#activeStreamUntilIdle,\n bgManager: this.#mastra?.backgroundTaskManager,\n },\n );\n }\n\n /**\n * Prepare for durable execution without starting it.\n */\n async prepare(messages: MessageListInput, options?: AgentExecutionOptions) {\n const preparation = await prepareForDurableExecution({\n agent: this.#wrappedAgent as Agent,\n messages,\n options,\n requestContext: options?.requestContext,\n mastra: this.#mastra,\n });\n\n this.#runRegistry.registerWithMessageList(preparation.runId, preparation.registryEntry, preparation.messageList, {\n threadId: preparation.threadId,\n resourceId: preparation.resourceId,\n });\n globalRunRegistry.set(preparation.runId, {\n ...preparation.registryEntry,\n messageList: preparation.messageList,\n });\n\n return {\n runId: preparation.runId,\n messageId: preparation.messageId,\n workflowInput: preparation.workflowInput,\n registryEntry: preparation.registryEntry,\n threadId: preparation.threadId,\n resourceId: preparation.resourceId,\n };\n }\n\n /**\n * Get the durable workflows required by this agent.\n * Called by Mastra during agent registration.\n * @internal\n */\n getDurableWorkflows() {\n return [this.getWorkflow()];\n }\n\n /**\n * Set the Mastra instance.\n * Called by the durable agent registration path in addAgent().\n * Delegates to __registerMastra so the pubsub wiring and agent\n * registration happen regardless of which entry point is called first.\n * @internal\n */\n __setMastra(mastra: Mastra): void {\n this.__registerMastra(mastra);\n }\n\n /**\n * Register the Mastra instance.\n * Called by Mastra during agent registration (normal Agent path).\n *\n * Also wires mastra.pubsub as the inner pubsub (if the user didn't provide\n * a custom one), so that the OBSERVE_AGENT_STREAM_ROUTE handler can subscribe\n * to the same PubSub instance that this agent publishes to.\n * @internal\n */\n __registerMastra(mastra: Mastra): void {\n super.__registerMastra(mastra);\n this.#mastra = mastra;\n // Also set on wrapped agent\n this.#wrappedAgent.__registerMastra(mastra);\n\n // Wire mastra.pubsub as the inner pubsub if user didn't provide a custom one.\n // This must happen before CachingPubSub initialization.\n if (!this.#hasCustomPubsub && !this.#cachingPubsub) {\n this.#innerPubsub = mastra.pubsub;\n }\n }\n}\n","/**\n * Factory function to create a DurableAgent that wraps an existing Agent.\n *\n * This is the recommended way to add durable execution capabilities to an agent.\n * The factory creates a DurableAgent instance with resumable streams.\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { createDurableAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n * id: 'my-agent',\n * name: 'My Agent',\n * instructions: 'You are a helpful assistant',\n * model: openai('gpt-4'),\n * });\n *\n * const durableAgent = createDurableAgent({ agent });\n *\n * const mastra = new Mastra({\n * agents: { myAgent: durableAgent },\n * });\n * ```\n */\n\nimport type { MastraServerCache } from '../../cache/base';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Agent } from '../agent';\n\nimport { DurableAgent } from './durable-agent';\nimport type { DurableAgentConfig } from './durable-agent';\n\n/**\n * Options for createDurableAgent factory function.\n */\nexport interface CreateDurableAgentOptions<\n TAgentId extends string = string,\n TTools extends Record = Record,\n TOutput = undefined,\n> {\n /** The Agent to wrap with durable execution capabilities */\n agent: Agent;\n\n /** Optional ID override (defaults to agent.id) */\n id?: TAgentId;\n\n /** Optional name override (defaults to agent.name) */\n name?: string;\n\n /**\n * Cache instance for storing stream events.\n * Enables resumable streams - clients can disconnect and reconnect\n * without missing events.\n *\n * - If not provided: Inherits from Mastra instance, or uses InMemoryServerCache\n * - If provided: Uses the provided cache backend (e.g., Redis)\n * - If set to `false`: Disables caching (streams are not resumable)\n */\n cache?: MastraServerCache | false;\n\n /**\n * PubSub instance for streaming events.\n * Optional - if not provided, defaults to EventEmitterPubSub.\n */\n pubsub?: PubSub;\n\n /** Maximum steps for agentic loop */\n maxSteps?: number;\n}\n\n/**\n * Create a DurableAgent that wraps an existing Agent.\n *\n * This factory function is the recommended way to add durable execution\n * capabilities to an agent. It creates a DurableAgent instance with\n * resumable streams.\n *\n * @param options - Configuration options\n * @returns A DurableAgent instance\n *\n * @example\n * ```typescript\n * const agent = new Agent({\n * id: 'my-agent',\n * instructions: 'You are helpful',\n * model: openai('gpt-4'),\n * });\n *\n * const durableAgent = createDurableAgent({ agent });\n *\n * const mastra = new Mastra({\n * agents: { myAgent: durableAgent },\n * });\n * ```\n */\nexport function createDurableAgent<\n TAgentId extends string = string,\n TTools extends Record = Record,\n TOutput = undefined,\n>(options: CreateDurableAgentOptions): DurableAgent {\n const { agent, id, name, cache, pubsub, maxSteps } = options;\n\n return new DurableAgent({\n agent,\n id,\n name,\n cache,\n pubsub,\n maxSteps,\n } as DurableAgentConfig);\n}\n\n/**\n * Check if an object is a DurableAgent\n */\nexport function isDurableAgent(obj: any): obj is DurableAgent {\n return obj instanceof DurableAgent;\n}\n\n/**\n * Alias for isDurableAgent for backwards compatibility\n * @deprecated Use isDurableAgent instead\n */\nexport const isLocalDurableAgent = isDurableAgent;\n\n// Re-export types for convenience\nexport type { DurableAgentConfig, DurableAgentStreamOptions, DurableAgentStreamResult } from './durable-agent';\n\n// Backwards compatibility type aliases\nexport type LocalDurableAgent<\n TAgentId extends string = string,\n TTools extends Record = Record,\n TOutput = undefined,\n> = DurableAgent;\n","/**\n * EventedAgent - A durable agent that uses fire-and-forget execution.\n *\n * EventedAgent extends DurableAgent and overrides the execution strategy to use\n * fire-and-forget execution via the workflow engine's startAsync() method.\n *\n * Unlike DurableAgent which runs the workflow synchronously, EventedAgent:\n * 1. Uses startAsync() for non-blocking execution\n * 2. Fire-and-forget pattern - execution starts and returns immediately\n * 3. Events are streamed via pubsub as the workflow executes\n */\n\nimport { createObservabilityContext } from '../../observability';\nimport type { ToolsInput } from '../types';\n\nimport { DurableAgent } from './durable-agent';\nimport type { DurableAgentConfig } from './durable-agent';\nimport { globalRunRegistry } from './run-registry';\nimport type { DurableAgenticWorkflowInput } from './types';\n\n/**\n * Configuration for EventedAgent - wraps an existing Agent with fire-and-forget execution\n */\nexport interface EventedAgentConfig<\n TAgentId extends string = string,\n TTools extends ToolsInput = ToolsInput,\n TOutput = undefined,\n> extends DurableAgentConfig {}\n\n/**\n * EventedAgent extends DurableAgent to use fire-and-forget execution.\n *\n * This agent type uses the built-in evented workflow engine, which is useful when:\n * - You don't need an external execution engine (like Inngest)\n * - You want fire-and-forget execution with pubsub streaming\n * - You need resumable streams with event caching\n *\n * The key difference from DurableAgent is the execution strategy:\n * - DurableAgent: Runs the workflow synchronously via createRun + start\n * - EventedAgent: Uses run.startAsync() for fire-and-forget execution\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { EventedAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n * id: 'my-agent',\n * instructions: 'You are a helpful assistant',\n * model: openai('gpt-4'),\n * });\n *\n * const eventedAgent = new EventedAgent({ agent });\n *\n * const { output, runId, cleanup } = await eventedAgent.stream('Hello!');\n * const text = await output.text;\n * cleanup();\n * ```\n */\nexport class EventedAgent<\n TAgentId extends string = string,\n TTools extends ToolsInput = ToolsInput,\n TOutput = undefined,\n> extends DurableAgent {\n /**\n * Create a new EventedAgent that wraps an existing Agent\n */\n constructor(config: EventedAgentConfig) {\n super(config);\n }\n\n /**\n * Execute the durable workflow using fire-and-forget pattern.\n *\n * Unlike DurableAgent which runs the workflow synchronously, EventedAgent uses\n * the workflow's startAsync() method for non-blocking execution.\n *\n * @param runId - The unique run ID\n * @param workflowInput - The serialized workflow input\n * @internal\n */\n protected override async executeWorkflow(runId: string, workflowInput: DurableAgenticWorkflowInput): Promise {\n try {\n const workflow = this.getWorkflow();\n const run = await workflow.createRun({\n runId,\n pubsub: this.pubsubInternal,\n });\n // Fire and forget - use startAsync for non-blocking execution.\n // Pass the caller's requestContext (so config selectors pick the same observability\n // instance the root spans were created with) and parent the run under the AGENT_RUN span.\n const entry = globalRunRegistry.get(runId);\n await run.startAsync({\n inputData: workflowInput,\n requestContext: entry?.requestContext,\n ...createObservabilityContext({ currentSpan: entry?.agentSpan }),\n });\n } catch (error) {\n await this.emitError(runId, error instanceof Error ? error : new Error(String(error)));\n }\n }\n}\n\n/**\n * Check if an object is an EventedAgent class instance\n */\nexport function isEventedAgentClass(obj: any): obj is EventedAgent {\n return obj instanceof EventedAgent;\n}\n","/**\n * Factory function to create an EventedAgent that wraps an existing Agent.\n *\n * This creates a durable agent that uses fire-and-forget execution via\n * the built-in workflow engine with startAsync().\n *\n * @example\n * ```typescript\n * import { Agent } from '@mastra/core/agent';\n * import { createEventedAgent } from '@mastra/core/agent/durable';\n *\n * const agent = new Agent({\n * id: 'my-agent',\n * name: 'My Agent',\n * instructions: 'You are a helpful assistant',\n * model: openai('gpt-4'),\n * });\n *\n * const eventedAgent = createEventedAgent({ agent });\n *\n * const mastra = new Mastra({\n * agents: { myAgent: eventedAgent },\n * });\n * ```\n */\n\nimport type { MastraServerCache } from '../../cache/base';\nimport type { PubSub } from '../../events/pubsub';\nimport type { Agent } from '../agent';\n\nimport { EventedAgent } from './evented-agent';\nimport type { EventedAgentConfig } from './evented-agent';\n\n/**\n * Options for createEventedAgent factory function.\n */\nexport interface CreateEventedAgentOptions<\n TAgentId extends string = string,\n TTools extends Record = Record,\n TOutput = undefined,\n> {\n /** The Agent to wrap with evented durable execution capabilities */\n agent: Agent;\n\n /**\n * PubSub instance for streaming events.\n * Optional - if not provided, defaults to EventEmitterPubSub.\n */\n pubsub?: PubSub;\n\n /**\n * Cache instance for storing stream events.\n * Enables resumable streams - clients can disconnect and reconnect\n * without missing events.\n *\n * - If not provided: Inherits from Mastra instance, or uses InMemoryServerCache\n * - If provided: Uses the provided cache backend (e.g., Redis)\n * - If set to `false`: Disables caching (streams are not resumable)\n */\n cache?: MastraServerCache | false;\n\n /** Maximum steps for agentic loop */\n maxSteps?: number;\n}\n\n/**\n * Create an EventedAgent that wraps an existing Agent.\n *\n * This factory function creates an EventedAgent instance with fire-and-forget\n * execution via the built-in workflow engine.\n *\n * @param options - Configuration options\n * @returns An EventedAgent instance\n *\n * @example\n * ```typescript\n * const agent = new Agent({\n * id: 'my-agent',\n * instructions: 'You are helpful',\n * model: openai('gpt-4'),\n * });\n *\n * const eventedAgent = createEventedAgent({ agent });\n *\n * const mastra = new Mastra({\n * agents: { myAgent: eventedAgent },\n * });\n * ```\n */\nexport function createEventedAgent<\n TAgentId extends string = string,\n TTools extends Record = Record,\n TOutput = undefined,\n>(options: CreateEventedAgentOptions): EventedAgent {\n const { agent, pubsub, cache, maxSteps } = options;\n\n return new EventedAgent({\n agent,\n pubsub,\n cache,\n maxSteps,\n } as EventedAgentConfig);\n}\n\n/**\n * Check if an object is an EventedAgent\n */\nexport function isEventedAgent(obj: any): obj is EventedAgent {\n return obj instanceof EventedAgent;\n}\n\n// Re-export types for convenience\nexport type { EventedAgentConfig } from './evented-agent';\n"]}