{"version":3,"file":"create-durable-agent-CB4JGA_3.cjs","names":["runIdleLoop","boundedStringify","mastraDBMessageToSignal","RequestContext","deepMerge","MASTRA_VERSIONS_KEY","mergeVersionOverrides","MessageList","getOrCreateSpan","EntityType","createObservabilityContext","TripWire","SaveQueueManager","normalizeToolPayloadTransformPolicy","TTLCache","#entries","#messageLists","#memoryInfo","MessageList","AgentStreamEventTypes","ReadableStream","AGENT_STREAM_TOPIC","MastraModelOutput","z","DurableAgentDefaults","DurableStepIds","z","createStep","PUBSUB_SYMBOL","transformToolPayloadForTargets","withToolPayloadTransformMetadata","SaveQueueManager","RequestContext","MessageList","getNeedsApprovalFn","resolveModelConfig","z","createStep","DurableStepIds","PUBSUB_SYMBOL","isSupportedLanguageModel","mergeProviderOptions","PrepareStepProcessor","ProcessorRunner","composeStepInput","ConsoleLogger","isMastraTool","makeCoreTool","createMastraProxy","TripWire","buildLlmPromptArgs","applyAutoResumeSystemMessage","injectBackgroundTaskPrompt","findProviderToolByName","inferProviderExecuted","EntityType","getStepAvailableToolNames","execute","mergeLlmCallHeaders","buildMemoryHeaders","MastraModelOutput","MessageList","buildMessagesFromChunks","z","ProcessorRunner","createStep","DurableStepIds","PUBSUB_SYMBOL","findProviderToolByName","stopGoalActivity","resolveBackgroundConfig","createBackgroundTask","z","createStep","DurableStepIds","MessageList","EntityType","PUBSUB_SYMBOL","DurableAgentDefaults","createStep","DurableStepIds","z","PUBSUB_SYMBOL","MessageList","runStreamCompletionScorers","formatStreamCompletionFeedback","createStep","z","PUBSUB_SYMBOL","RequestContext","resolveGoalStore","readObjective","resolveEffectiveGoalSettings","resolveModelConfig","createGoalScorer","MessageList","runStreamCompletionScorers","GOAL_SCORER_ID","writeObjective","createProcessorSendSignal","DurableStepIds","createStep","z","MessageList","PUBSUB_SYMBOL","z","DurableAgentDefaults","createWorkflow","DurableStepIds","pruneAgentLoopSnapshot","input","PUBSUB_SYMBOL","MessageList","createObservabilityContext","RequestContext","Agent","#wrappedAgent","#runRegistry","#maxSteps","#hasCustomPubsub","#cleanupTimeoutMs","#innerPubsub","EventEmitterPubSub","#cacheConfig","#ensurePubsubInitialized","#resolvedCache","#cachingPubsub","CachingPubSub","#mastra","InMemoryServerCache","#resolveExecutionOptions","deepMerge","createObservabilityContext","DurableStepIds","#activeStreamUntilIdle","#clearPubsubTopic","beginGoalActivity","stopGoalActivity","agentThreadStreamRuntime","MastraError","ErrorDomain","ErrorCategory","RequestContext","#getPubsubOffset","getOrCreateSpan","EntityType","MessageList","SaveQueueManager","AGENT_STREAM_TOPIC","#workflow"],"sources":["../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/schemas.ts","../src/agent/durable/workflows/shared/iteration-state.ts","../src/agent/durable/workflows/shared/tool-call-concurrency.ts","../src/agent/durable/workflows/steps/background-task-check.ts","../src/agent/durable/utils/apply-tool-payload-transform.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/steps/is-task-complete.ts","../src/agent/durable/workflows/steps/goal.ts","../src/agent/durable/workflows/steps/signal-drain.ts","../src/agent/durable/workflows/create-durable-agentic-workflow.ts","../src/agent/durable/durable-agent.ts","../src/agent/durable/create-durable-agent.ts"],"sourcesContent":["/**\n * Implementation of `DurableAgent.streamUntilIdle` and\n * `DurableAgent.resume(..., { untilIdle })`. Mirrors the regular agent's\n * `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 * - Inner `abort()` handles are fanned out so the outer `result.abort()`\n *   cancels every active durable run\n *\n * Uses the shared `runIdleLoop` helper from `loop/shared/stream-until-idle-helpers`\n * with durable-specific hooks for cleanup/abort tracking.\n */\nimport type { BackgroundTaskManager } from '../../background-tasks/manager';\nimport { runIdleLoop } from '../../loop/shared/stream-until-idle-helpers';\nimport type { MessageListInput } from '../message-list';\n\nimport type { DurableAgent, DurableAgentStreamOptions, DurableAgentStreamResult } from './durable-agent';\n\nexport interface DurableStreamUntilIdleDeps {\n  activeStreams: Map<string, () => void>;\n  bgManager: BackgroundTaskManager | undefined;\n}\n\n/**\n * Run `DurableAgent.streamUntilIdle` (or `DurableAgent.stream({ untilIdle })`).\n * Initial turn invokes `agent.stream(messages, ...)`; continuations triggered\n * by background-task completions run as fresh `agent.stream([], ...)` calls\n * against the same memory thread.\n */\nexport async function runDurableStreamUntilIdle<OUTPUT = undefined>(\n  agent: DurableAgent<any, any, OUTPUT>,\n  messages: MessageListInput,\n  streamOptions: (DurableAgentStreamOptions<OUTPUT> & { maxIdleMs?: number }) | undefined,\n  deps: DurableStreamUntilIdleDeps,\n): Promise<DurableAgentStreamResult<OUTPUT>> {\n  // Durable-specific: track cleanup/abort handles from each inner stream\n  const innerCleanups: Array<() => void> = [];\n  const innerAborts: Array<(reason?: unknown) => void> = [];\n\n  return runIdleLoop<typeof agent, DurableAgentStreamResult<OUTPUT>, DurableAgentStreamResult<OUTPUT>>(\n    agent,\n    streamOptions,\n    deps,\n    opts => (agent as any).stream(messages, opts) as Promise<DurableAgentStreamResult<OUTPUT>>,\n    opts => (agent as any).stream([], opts) as Promise<{ fullStream: ReadableStream<any> }>,\n    (first, ctx) => {\n      // No ctx means no bgManager / no memory — fall through without wrapping.\n      if (!ctx) return first;\n\n      return {\n        output: new Proxy(first.output, {\n          get(target, prop) {\n            if (prop === 'fullStream') return ctx.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 ctx.combinedStream;\n        },\n        runId: first.runId,\n        threadId: ctx.threadId,\n        resourceId: ctx.resourceId,\n        cleanup: ctx.forceClose,\n        abort: (reason?: unknown) => {\n          // Fan the abort out to every inner DurableAgent.stream() that has been\n          // spawned by the idle loop so far. `forceClose` then unwinds the outer\n          // stream + idle timer.\n          for (const innerAbort of innerAborts) {\n            try {\n              innerAbort(reason);\n            } catch {\n              // ignore — best-effort abort across siblings\n            }\n          }\n          ctx.forceClose();\n        },\n      };\n    },\n    {\n      onInnerResult: (inner: any) => {\n        if (typeof inner.cleanup === 'function') innerCleanups.push(inner.cleanup);\n        if (typeof inner.abort === 'function') innerAborts.push(inner.abort);\n      },\n      onForceClose: () => {\n        for (const fn of innerCleanups) {\n          try {\n            fn();\n          } catch {\n            // ignore\n          }\n        }\n      },\n    },\n  );\n}\n\n/**\n * Run `DurableAgent.resume(..., { untilIdle })`. Same idle-loop semantics as\n * `runDurableStreamUntilIdle` — initial turn calls `agent.resume(runId,\n * resumeData, ...)` against the existing run snapshot, and subsequent\n * continuations triggered by background-task completions use\n * `agent.stream([], continuationOpts)` (a normal multi-turn agent stream)\n * since the resume completes and we're back in regular conversation flow.\n */\nexport async function runResumeDurableStreamUntilIdle<OUTPUT = undefined>(\n  agent: DurableAgent<any, any, OUTPUT>,\n  runId: string,\n  resumeData: unknown,\n  streamOptions: (DurableAgentStreamOptions<OUTPUT> & { maxIdleMs?: number }) | undefined,\n  deps: DurableStreamUntilIdleDeps,\n): Promise<DurableAgentStreamResult<OUTPUT>> {\n  const innerCleanups: Array<() => void> = [];\n  const innerAborts: Array<(reason?: unknown) => void> = [];\n\n  return runIdleLoop<typeof agent, DurableAgentStreamResult<OUTPUT>, DurableAgentStreamResult<OUTPUT>>(\n    agent,\n    streamOptions,\n    deps,\n    opts => (agent as any).resume(runId, resumeData, opts) as Promise<DurableAgentStreamResult<OUTPUT>>,\n    opts => (agent as any).stream([], opts) as Promise<{ fullStream: ReadableStream<any> }>,\n    (first, ctx) => {\n      if (!ctx) return first;\n\n      return {\n        output: new Proxy(first.output, {\n          get(target, prop) {\n            if (prop === 'fullStream') return ctx.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 ctx.combinedStream;\n        },\n        runId: first.runId,\n        threadId: ctx.threadId,\n        resourceId: ctx.resourceId,\n        cleanup: ctx.forceClose,\n        abort: (reason?: unknown) => {\n          for (const innerAbort of innerAborts) {\n            try {\n              innerAbort(reason);\n            } catch {\n              // ignore\n            }\n          }\n          ctx.forceClose();\n        },\n      };\n    },\n    {\n      onInnerResult: (inner: any) => {\n        if (typeof inner.cleanup === 'function') innerCleanups.push(inner.cleanup);\n        if (typeof inner.abort === 'function') innerAborts.push(inner.abort);\n      },\n      onForceClose: () => {\n        for (const fn of innerCleanups) {\n          try {\n            fn();\n          } catch {\n            // ignore\n          }\n        }\n      },\n    },\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  SerializableModelSettings,\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<string, CoreTool>): 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 * Pick the JSON-safe call settings out of an arbitrary `modelSettings` input.\n * Drops any field that is not a primitive value of the expected type so that\n * non-serializable fields (functions, AbortSignal, etc.) never reach the\n * workflow input.\n */\nexport function serializeModelSettings(\n  settings: SerializableModelSettings | Record<string, unknown> | undefined,\n): SerializableModelSettings | undefined {\n  if (!settings || typeof settings !== 'object') return undefined;\n\n  const source = settings as Record<string, unknown>;\n  const out: SerializableModelSettings = {};\n  const pickNumber = (key: keyof SerializableModelSettings) => {\n    const value = source[key as string];\n    if (typeof value === 'number' && Number.isFinite(value)) {\n      (out as Record<string, unknown>)[key as string] = value;\n    }\n  };\n\n  pickNumber('maxOutputTokens');\n  pickNumber('temperature');\n  pickNumber('topP');\n  pickNumber('topK');\n  pickNumber('presencePenalty');\n  pickNumber('frequencyPenalty');\n  pickNumber('seed');\n  pickNumber('maxRetries');\n\n  if (Array.isArray(source.stopSequences) && source.stopSequences.every(v => typeof v === 'string')) {\n    out.stopSequences = source.stopSequences as string[];\n  }\n\n  // Headers are never serialized into the workflow input. They are stored\n  // exclusively on the in-process RunRegistryEntry so they never reach\n  // durable storage. The durable llm-execution step merges them back from\n  // the registry at call time.\n  // (Previously we had a denylist of \"sensitive\" header names, but any\n  // header could carry credentials — the safest approach is to keep them\n  // all off the wire.)\n\n  return Object.keys(out).length > 0 ? out : undefined;\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  modelSettings?: SerializableModelSettings | Record<string, unknown>;\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  disableBackgroundTasks?: boolean;\n  tracingOptions?: SerializableDurableOptions['tracingOptions'];\n  actor?: SerializableDurableOptions['actor'];\n  instructionsOverride?: SerializableDurableOptions['instructionsOverride'];\n  systemMessage?: SerializableDurableOptions['systemMessage'];\n  transform?: SerializableDurableOptions['transform'];\n  isTaskComplete?: SerializableDurableOptions['isTaskComplete'];\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    modelSettings: serializeModelSettings(options.modelSettings),\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    disableBackgroundTasks: options.disableBackgroundTasks,\n    tracingOptions: options.tracingOptions,\n    actor: options.actor,\n    instructionsOverride: options.instructionsOverride,\n    systemMessage: options.systemMessage,\n    transform: options.transform,\n    isTaskComplete: options.isTaskComplete,\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<string, CoreTool>;\n  model: MastraLanguageModel;\n  modelList?: AgentModelManagerConfig[];\n  scorers?: Parameters<typeof serializeScorersConfig>[0];\n  options: Parameters<typeof serializeDurableOptions>[0];\n  state: Parameters<typeof serializeDurableState>[0];\n  messageId: string;\n  agentSpanData?: unknown;\n  modelSpanData?: unknown;\n  requestContextEntries?: Record<string, 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    requestContextEntries: params.requestContextEntries,\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, createObservabilityContext, 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 { toStandardSchema } from '../../schema';\nimport { normalizeToolPayloadTransformPolicy } from '../../tools/payload-transform';\nimport type { CoreTool, ToolHooks, ToolPayloadTransformPolicy } from '../../tools/types';\nimport { boundedStringify, deepMerge } from '../../utils';\nimport type { Workspace } from '../../workspace';\nimport type { Agent } from '../agent';\nimport type { AgentExecutionOptions, DelegationConfig } from '../agent.types';\nimport { MessageList } from '../message-list';\nimport type { MessageListInput } from '../message-list';\nimport { SaveQueueManager } from '../save-queue';\nimport type { CreatedAgentSignal } from '../signals';\nimport { mastraDBMessageToSignal } from '../signals';\nimport { TripWire } from '../trip-wire';\nimport type {\n  AgentInstructions,\n  AgentMethodType,\n  AgentModelManagerConfig,\n  GoalConfig,\n  ToolsetsInput,\n  ToolsInput,\n} from '../types';\nimport type { DurableAgenticWorkflowInput, RunRegistryEntry, SerializableStructuredOutput } from './types';\nimport { createWorkflowInput } from './utils/serialize-state';\n\n/**\n * JSON-safe snapshot of `requestContext.entries()` so durable steps (e.g.\n * is-task-complete scorers) can see the same `customContext` the non-durable\n * path passes. Best-effort: entries that fail a JSON round-trip are skipped\n * so a single non-serializable value can't break the workflow input.\n */\nfunction snapshotRequestContextEntries(\n  requestContext: RequestContext | undefined,\n): Record<string, unknown> | undefined {\n  if (!requestContext) return undefined;\n  const out: Record<string, unknown> = {};\n  let any = false;\n  for (const [key, value] of requestContext.entries()) {\n    // Serialize each entry exactly once with a bounded pass: a shared-reference\n    // graph would otherwise make JSON.stringify expand exponentially and wedge\n    // the event loop on every durable step, and reading the value twice (probe\n    // then clone) could disagree if a getter/toJSON is stateful. Entries that\n    // produce no JSON (non-serializable, or too large to serialize within\n    // budget) are skipped — they wouldn't survive the wire on cross-process\n    // engines anyway.\n    const json = boundedStringify(value);\n    if (json === undefined) continue;\n    out[key as string] = JSON.parse(json);\n    any = true;\n  }\n  return any ? out : undefined;\n}\n\n/**\n * Mirror of Agent#convertInstructionsToString — used for the AGENT_RUN span\n * `attributes.instructions` field so durable runs publish the same shape as\n * non-durable runs. Kept local to avoid promoting the private method.\n */\nfunction convertInstructionsToString(instructions: AgentInstructions | undefined): string {\n  if (!instructions) return '';\n  if (typeof instructions === 'string') return instructions;\n  if (Array.isArray(instructions)) {\n    return instructions\n      .map(msg => (typeof msg === 'string' ? msg : typeof msg.content === 'string' ? msg.content : ''))\n      .filter(Boolean)\n      .join('\\n\\n');\n  }\n  return typeof instructions.content === 'string' ? instructions.content : '';\n}\n\n/**\n * Extract signal messages already present in the messageList at run start\n * (from persisted history) so they can be echoed as data-signal stream parts\n * on the first LLM step. Mirrors `prepare-memory-step.ts#getInitialSignalEchoes`.\n */\nfunction getInitialSignalEchoes(messageList: MessageList): CreatedAgentSignal[] {\n  const inputMessageIds = messageList.makeMessageSourceChecker().input;\n  return messageList.get.all\n    .db()\n    .filter(message => message.role === 'signal' && inputMessageIds.has(message.id))\n    .map(mastraDBMessageToSignal);\n}\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  getDefaultOptions(opts: { requestContext: RequestContext }): AgentExecutionOptions | Promise<AgentExecutionOptions>;\n  getInstructions(opts: { requestContext: RequestContext }): AgentInstructions | Promise<AgentInstructions>;\n  getModel(opts: { requestContext: RequestContext }): MastraLanguageModel | Promise<MastraLanguageModel>;\n  getModelList(requestContext: RequestContext): Promise<AgentModelManagerConfig[] | null>;\n  getMemory(opts: { requestContext: RequestContext }): Promise<MastraMemory | undefined>;\n  getWorkspace(opts: { requestContext: RequestContext }): Promise<Workspace | undefined>;\n  listScorers(opts: {\n    requestContext: RequestContext;\n  }): Promise<Record<string, { scorer: unknown; sampling?: unknown }> | 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    delegation?: DelegationConfig;\n    methodType?: AgentMethodType;\n  }): Promise<Record<string, CoreTool>>;\n  listInputProcessors(requestContext?: RequestContext): Promise<InputProcessorOrWorkflow[]>;\n  listOutputProcessors(requestContext?: RequestContext): Promise<OutputProcessorOrWorkflow[]>;\n  listErrorProcessors(requestContext?: RequestContext): Promise<ErrorProcessorOrWorkflow[]>;\n  getBackgroundTasksConfig(): AgentBackgroundConfig | undefined;\n  getToolPayloadTransform?(): ToolPayloadTransformPolicy | undefined;\n  __getDrainPendingSignals(): (runId: string, scope?: 'pending' | 'pre-run') => CreatedAgentSignal[];\n  __getGoalConfig(): GoalConfig | undefined;\n  __listLLMRequestProcessors(requestContext?: RequestContext): Promise<InputProcessorOrWorkflow[]>;\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<OUTPUT = undefined> {\n  /** The agent instance (wrapped agent — used for config resolution: tools, model, instructions, memory) */\n  agent: Agent<string, any, OUTPUT>;\n  /** User messages to process */\n  messages: MessageListInput;\n  /** Execution options */\n  options?: AgentExecutionOptions<OUTPUT>;\n  /** Whether execution options already include the agent defaults. */\n  optionsAreResolved?: boolean;\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  /** Method type */\n  methodType?: AgentMethodType;\n  /**\n   * The public-facing agent ID (the DurableAgent wrapper's ID).\n   * Used for spans, background tasks, scorers, and all identification visible to Studio.\n   * Falls back to `agent.id` if not provided.\n   */\n  durableAgentId?: string;\n  /**\n   * The public-facing agent name (the DurableAgent wrapper's name).\n   * Used for spans, background tasks, scorers, and all identification visible to Studio.\n   * Falls back to `agent.name` if not provided.\n   */\n  durableAgentName?: string;\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<OUTPUT = undefined>(\n  options: PreparationOptions<OUTPUT>,\n): Promise<PreparationResult<OUTPUT>> {\n  const {\n    agent,\n    messages,\n    options: rawExecOptions,\n    optionsAreResolved = false,\n    runId: providedRunId,\n    requestContext: providedRequestContext,\n    logger,\n    mastra,\n    methodType = 'stream',\n    durableAgentId,\n    durableAgentName,\n  } = options;\n\n  // Public-facing identity: use the durable wrapper's ID/name for all\n  // external-facing identification (spans, background tasks, scorers, Studio).\n  // Fall back to the wrapped agent's ID/name when called outside the durable wrapper.\n  const publicAgentId = durableAgentId ?? agent.id;\n  const publicAgentName = durableAgentName ?? agent.name ?? agent.id;\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  // 2a. Snapshot caller-provided RequestContext entries *before* preparation\n  // mutates the context (version overrides at step 3, MastraMemory at step 4).\n  // The persisted `customContext` should reflect only what the caller passed in,\n  // not internal-key state added during prep.\n  const requestContextEntriesSnapshot = snapshotRequestContextEntries(requestContext);\n\n  // 2b. Merge the wrapped agent's defaultOptions under the per-request options,\n  // mirroring the non-durable Agent.stream()/generate() paths. Without this the\n  // agent's configured defaults (maxSteps, providerOptions, etc.) are silently\n  // dropped and durable runs fall back to DurableAgentDefaults.MAX_STEPS.\n  const execOptions: AgentExecutionOptions<OUTPUT> = optionsAreResolved\n    ? (rawExecOptions ?? ({} as AgentExecutionOptions<OUTPUT>))\n    : (deepMerge(\n        ((await typedAgent.getDefaultOptions({ requestContext })) ?? {}) as Record<string, unknown>,\n        (rawExecOptions ?? {}) as Record<string, unknown>,\n      ) as AgentExecutionOptions<OUTPUT>);\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. Per-call `options.instructions` overrides the\n  // agent's default instructions to mirror non-durable Agent.stream() behavior.\n  const instructions = execOptions?.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  // Per-call `options.system` is appended as an additional system message after\n  // context. Mirrors the non-durable Agent.stream() prepare-memory-step path.\n  if (execOptions?.system) {\n    const sys = execOptions.system;\n    if (typeof sys === 'string') {\n      messageList.addSystem(sys);\n    } else if (Array.isArray(sys)) {\n      for (const s of sys) {\n        messageList.addSystem(s);\n      }\n    } else {\n      messageList.addSystem(sys);\n    }\n  }\n\n  // Add user messages\n  messageList.add(messages, 'input');\n\n  // 6. Establish the memory/thread context BEFORE resolving input processors.\n  //\n  // Memory.getInputProcessors() decides whether to add the working-memory\n  // injector by reading requestContext.get('MastraMemory')?.memoryConfig. When\n  // working memory is disabled in the constructor and enabled per-request (the\n  // documented setup), that runtime config is the only signal that turns the\n  // injector on. If we resolve processors before setting MastraMemory, the\n  // per-request config is invisible, the chain falls back to the constructor\n  // config, and the injector is silently omitted — so stored working memory is\n  // saved by the update-working-memory tool but never read back into the prompt.\n  // Setting the context first keeps read (inject) and write (tool) in sync.\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  } else {\n    // This run has no complete per-request memory context. Clear any\n    // MastraMemory inherited from a caller-provided requestContext (e.g. a\n    // parent agent's context during sub-agent delegation) so processor\n    // resolution can't pick up the working-memory injector from stale/parent\n    // memory — that would both leak prior resource memory into this prompt and\n    // break the \"no per-request memory options means no injection\" gate.\n    requestContext.delete('MastraMemory');\n  }\n\n  // Resolve input processors now that the memory context is in place.\n  const processorStates = new Map<string, ProcessorState>();\n  let inputProcessors: InputProcessorOrWorkflow[] = [];\n  let llmRequestInputProcessors: InputProcessorOrWorkflow[] = [];\n  let outputProcessors: OutputProcessorOrWorkflow[] = [];\n  let errorProcessors: ErrorProcessorOrWorkflow[] = [];\n\n  try {\n    inputProcessors = await typedAgent.listInputProcessors(requestContext);\n    // Uncombined processors for processLLMRequest — combined (workflow-wrapped)\n    // processors are skipped by ProcessorRunner.runProcessLLMRequest.\n    llmRequestInputProcessors = await typedAgent.__listLLMRequestProcessors(requestContext);\n    // Call-time outputProcessors replace constructor-level ones (parity with\n    // Agent.listResolvedOutputProcessors which uses overrides-first semantics).\n    outputProcessors = execOptions?.outputProcessors\n      ? execOptions.outputProcessors\n      : await typedAgent.listOutputProcessors(requestContext);\n    errorProcessors = await typedAgent.listErrorProcessors(requestContext);\n  } catch (error) {\n    logger?.warn?.(`[DurableAgent] Error resolving processors: ${error}`);\n  }\n\n  // Open AGENT_RUN here so processor_run spans (and their MEMORY_OPERATION\n  // children) parent to it. MODEL_GENERATION is opened later under it.\n  //\n  // Mirrors non-durable Agent.stream(): forward attributes (conversationId,\n  // resolved instructions string, resolvedVersionId), metadata (entityVersionId),\n  // and the agent-level tracingPolicy so durable runs land in the same span\n  // shape as in-process runs.\n  const rawConfig = typeof (agent as any).toRawConfig === 'function' ? (agent as any).toRawConfig() : undefined;\n  const resolvedVersionId = rawConfig?.resolvedVersionId as string | undefined;\n  const agentTracingPolicy =\n    typeof (agent as any).getTracingPolicy === 'function' ? (agent as any).getTracingPolicy() : undefined;\n  const agentSpan = getOrCreateSpan({\n    type: SpanType.AGENT_RUN,\n    name: `agent run: '${publicAgentId}'`,\n    entityType: EntityType.AGENT,\n    entityId: publicAgentId,\n    entityName: publicAgentName,\n    input: messages,\n    attributes: {\n      conversationId: threadId,\n      instructions: convertInstructionsToString(instructions),\n      // @deprecated — use entityVersionId (top-level span context field) instead.\n      // Kept for backward compatibility during migration.\n      ...(resolvedVersionId ? { resolvedVersionId } : {}),\n    },\n    metadata: {\n      runId,\n      resourceId,\n      threadId,\n      ...(resolvedVersionId ? { entityVersionId: resolvedVersionId } : {}),\n    },\n    tracingPolicy: agentTracingPolicy,\n    tracingContext: execOptions?.tracingContext,\n    tracingOptions: execOptions?.tracingOptions,\n    requestContext,\n    mastra,\n  });\n  // Run processInput (once, before execution) if we have any processors.\n  // The MastraMemory context (thread + memoryConfig) was already established\n  // above, before processor resolution, so processors that need it (working\n  // memory, OM, message history) can access it here.\n  let tripwireData: RunRegistryEntry['tripwire'];\n  if (inputProcessors.length > 0) {\n    try {\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: publicAgentName,\n        processorStates,\n      });\n      await runner.runInputProcessors(\n        messageList,\n        createObservabilityContext({ currentSpan: agentSpan }),\n        requestContext,\n        0,\n      );\n    } catch (error) {\n      if (error instanceof TripWire) {\n        tripwireData = {\n          reason: error.message,\n          retry: error.options?.retry,\n          metadata: error.options?.metadata,\n          processorId: error.processorId,\n        };\n        logger?.warn?.('Input processor tripwire triggered', {\n          agent: publicAgentName,\n          reason: error.message,\n          processorId: error.processorId,\n          retry: error.options?.retry,\n        });\n      } else {\n        logger?.warn?.(`[DurableAgent] Error running input processors: ${error}`);\n      }\n    }\n  }\n\n  // 7. Convert tools to CoreTool format for execution\n  let tools: Record<string, CoreTool> = {};\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      delegation: execOptions?.delegation,\n      methodType,\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<string, { scorer: any; sampling?: any }> | 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. Create SaveQueueManager (memory + memoryConfig were resolved in step 6)\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. When the caller opts out with\n  // `disableBackgroundTasks: true`, drop the manager so the registry entry\n  // signals \"no background tasks for this run\" to the check step.\n  const backgroundTasksConfig = typedAgent.getBackgroundTasksConfig?.();\n  const backgroundTaskManager = execOptions?.disableBackgroundTasks ? undefined : mastra?.backgroundTaskManager;\n\n  // Resolve tool payload transform policy with the same precedence the\n  // non-durable Agent uses: per-call > agent-level > mastra-level. The\n  // resolved policy carries a closure, so it lives on the run registry; the\n  // JSON-safe `targets` shadow is serialized into workflow input below.\n  const toolPayloadTransform =\n    normalizeToolPayloadTransformPolicy(execOptions?.transform) ??\n    typedAgent.getToolPayloadTransform?.() ??\n    normalizeToolPayloadTransformPolicy(\n      mastra?.getToolPayloadTransform?.() ?? (mastra as any)?.getToolPayloadProjection?.(),\n    );\n\n  // 12. Resolve memory persistence flags\n  const savePerStep = execOptions?.savePerStep;\n  const observationalMemory = !!memoryConfig?.observationalMemory;\n\n  // 12b. Open MODEL_GENERATION under the AGENT_RUN opened in step 6, and export both\n  // into the workflow input so each durable step can rebuild them. No-ops when\n  // observability is off.\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: publicAgentId,\n    agentName: publicAgentName,\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      modelSettings: execOptions?.modelSettings as any,\n      // Function-form approval policies are closures that can't ride on the\n      // serialized workflow input — the live closure is parked on the run\n      // registry below. This boolean shadow is the cross-process fallback:\n      // function policies degrade to \"require approval for every tool call\"\n      // when the registry slot is unavailable (e.g. Inngest after a worker\n      // restart), which is the safe default.\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      disableBackgroundTasks: execOptions?.disableBackgroundTasks,\n      tracingOptions: execOptions?.tracingOptions,\n      actor: execOptions?.actor,\n      instructionsOverride: execOptions?.instructions,\n      systemMessage: execOptions?.system,\n      transform: toolPayloadTransform?.targets ? { targets: toolPayloadTransform.targets } : undefined,\n      isTaskComplete: execOptions?.isTaskComplete\n        ? {\n            scorerNames: execOptions.isTaskComplete.scorers?.map(s => s.name).filter((n): n is string => !!n),\n            strategy: execOptions.isTaskComplete.strategy,\n            timeout: execOptions.isTaskComplete.timeout,\n            parallel: execOptions.isTaskComplete.parallel,\n            suppressFeedback: execOptions.isTaskComplete.suppressFeedback,\n          }\n        : undefined,\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    requestContextEntries: requestContextEntriesSnapshot,\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          headers: entry.headers,\n        }))\n      : undefined,\n    workspace,\n    requestContext,\n    inputProcessors,\n    llmRequestInputProcessors,\n    outputProcessors,\n    errorProcessors,\n    processorStates,\n    backgroundTaskManager,\n    backgroundTasksConfig,\n    agentSpan,\n    modelSpan,\n    // Park the stopWhen predicate(s) on the registry so the durable agentic\n    // loop can evaluate them on each iteration. The predicate is a closure and\n    // cannot ride on the serialized workflow input; in-process engines read it\n    // back via globalRunRegistry, cross-process engines degrade to maxSteps.\n    stopWhen: execOptions?.stopWhen,\n    onIterationComplete: execOptions?.onIterationComplete,\n    prepareStep: execOptions?.prepareStep,\n    toolPayloadTransform,\n    isTaskComplete: execOptions?.isTaskComplete,\n    // Park the per-call requireToolApproval policy on the registry so the\n    // durable tool-call step can evaluate function-form policies with the\n    // real (toolName, args) on each call. The boolean shadow on the\n    // serialized workflow input is the cross-process fallback.\n    requireToolApproval: execOptions?.requireToolApproval,\n    // Signal drain — the closure reads from AgentThreadStreamRuntime's queues.\n    // Non-serializable; cross-process engines lose it and signals go undelivered.\n    drainPendingSignals: scope => typedAgent.__getDrainPendingSignals()(runId, scope),\n    // Thread title generation — mirrors the non-durable `#executeOnFinish` branch,\n    // which was never ported to the durable finish step (so `generateTitle` never\n    // fired for durable/evented agents). Parked here because the agent instance is\n    // in scope; the durable finish step invokes it after the run completes. No-op\n    // when the merged config has no `generateTitle` or the thread already has a\n    // title. Non-serializable — cross-process engines skip title generation.\n    generateThreadTitle: memory\n      ? async ({ threadId, resourceId, memoryConfig, messageListState, requestContext: rc, tracingContext }) => {\n          // Re-read the thread so a title written mid-run isn't regenerated, and so we only\n          // generate on the first turn (mirrors the non-durable `!thread.title` guard).\n          const thread = await memory.getThreadById?.({ threadId });\n          const mergedConfig = memory.getMergedThreadConfig?.(memoryConfig);\n          const { shouldGenerate, model, instructions, minMessages } = agent.resolveTitleGenerationConfig(\n            mergedConfig?.generateTitle as Parameters<typeof agent.resolveTitleGenerationConfig>[0],\n          );\n          if (!shouldGenerate || thread?.title) return;\n\n          const titleMessageList = new MessageList().deserialize(messageListState);\n          // Only messages of the thread being titled — resource-scoped memory can\n          // load messages from other threads into the deserialized list.\n          const uiMessages = agent.filterUiMessagesByThread(titleMessageList, threadId, titleMessageList.get.all.ui());\n          if (uiMessages.length < (minMessages ?? 1)) return;\n\n          const userMessage = agent.getMostRecentUserMessage(uiMessages);\n          if (!userMessage) return;\n\n          const title = await agent.genTitle(\n            userMessage,\n            rc ?? new RequestContext(),\n            createObservabilityContext(tracingContext),\n            model,\n            instructions,\n            uiMessages,\n          );\n          if (!title) return;\n\n          // Title-only late write. Prefer updateThread when the thread record\n          // already exists so its original createdAt is preserved (createThread\n          // rebuilds the record with a fresh createdAt). Fall back to createThread\n          // for the first-turn case where the record may not be persisted yet.\n          if (thread) {\n            await memory.updateThread({\n              id: threadId,\n              title,\n              metadata: thread.metadata ?? {},\n              memoryConfig,\n            });\n          } else {\n            await memory.createThread({\n              threadId,\n              resourceId,\n              memoryConfig,\n              title,\n            });\n          }\n        }\n      : undefined,\n    // Signal messages already in the messageList at run start (from persisted\n    // history). Echoed as data-signal parts on the first LLM step so the client\n    // sees them without refetching. Spliced once, never re-emitted.\n    initialSignalEchoes: getInitialSignalEchoes(messageList),\n    // Agent-level goal config (judge resolver, tools resolver, scorer).\n    // Non-serializable — cross-process engines skip goal evaluation.\n    goal: agent.__getGoalConfig(),\n    // Tripwire from processInput (initial input processing). When an input\n    // processor calls abort() during runInputProcessors, we store the tripwire\n    // data here so the first llm-execution step can emit a tripwire chunk and\n    // bail immediately without calling the model.\n    tripwire: tripwireData,\n    // Call-time headers from modelSettings.headers. Kept off the serialized\n    // workflow input so they never reach durable storage; the durable\n    // llm-execution step reads them from this registry slot instead.\n    callTimeHeaders: extractCallTimeHeaders(execOptions?.modelSettings),\n    // Call-time structured output config with the live schema. The schema is\n    // non-serializable (Zod / standard-schema instance), so it lives on the\n    // in-process registry. The durable stream adapter reads it to pipe LLM\n    // text through `createObjectStreamTransformer`, producing `object-result`\n    // chunks. Cross-process engines lose this slot and structured output\n    // degrades to raw text.\n    structuredOutput: execOptions?.structuredOutput?.schema\n      ? {\n          ...execOptions.structuredOutput,\n          schema: toStandardSchema(execOptions.structuredOutput.schema),\n        }\n      : undefined,\n    cleanup: () => {},\n  };\n\n  return {\n    runId,\n    messageId,\n    workflowInput,\n    registryEntry,\n    messageList,\n    threadId,\n    resourceId,\n  };\n}\n\n/**\n * Extract string-valued headers from `modelSettings.headers` for storage on the\n * in-process `RunRegistryEntry`. Returns `undefined` when no valid headers are\n * present so the registry slot stays empty rather than carrying an empty object.\n */\nfunction extractCallTimeHeaders(\n  modelSettings: Record<string, unknown> | undefined,\n): Record<string, string> | undefined {\n  const raw = (modelSettings as Record<string, unknown> | undefined)?.headers;\n  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n\n  const headers: Record<string, string> = {};\n  for (const [key, value] of Object.entries(raw as Record<string, unknown>)) {\n    if (typeof value === 'string') headers[key] = value;\n  }\n  return Object.keys(headers).length > 0 ? headers : undefined;\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<string, RunRegistryEntry>({\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<string, RunRegistryEntry>();\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<string, CoreTool> {\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<string, MessageList>();\n  #memoryInfo = new Map<string, { threadId?: string; resourceId?: string }>();\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 type { OutputProcessorOrWorkflow } from '../../processors';\nimport { safeClose, safeEnqueue } from '../../stream/base';\nimport { MastraModelOutput } from '../../stream/base/output';\nimport type {\n  ChunkType,\n  MastraOnFinishCallback,\n  MastraOnStepFinishCallback,\n  MastraStreamTransformOptions,\n  LanguageModelUsage,\n} from '../../stream/types';\nimport { MessageList } from '../message-list';\nimport type { StructuredOutputOptions } from '../types';\nimport { AGENT_STREAM_TOPIC, AgentStreamEventTypes } from './constants';\nimport type {\n  AgentStreamEvent,\n  AgentChunkEventData,\n  AgentStepFinishEventData,\n  AgentFinishEventData,\n  AgentErrorEventData,\n  AgentSuspendedEventData,\n  AgentAbortEventData,\n  AgentIterationCompleteEventData,\n} from './types';\n\n/**\n * Map workflow usage (which may use legacy promptTokens/completionTokens) to\n * the canonical LanguageModelUsage shape (inputTokens/outputTokens).\n */\nfunction normalizeUsage(raw?: Record<string, unknown>): LanguageModelUsage {\n  if (!raw) {\n    return { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n  }\n  const inputTokens = (raw.inputTokens as number) ?? (raw.promptTokens as number) ?? 0;\n  const outputTokens = (raw.outputTokens as number) ?? (raw.completionTokens as number) ?? 0;\n  const totalTokens = (raw.totalTokens as number) ?? inputTokens + outputTokens;\n  return { inputTokens, outputTokens, totalTokens };\n}\n\n/**\n * Options for creating a durable agent stream\n */\nexport interface DurableAgentStreamOptions<OUTPUT = undefined> {\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' | 'v4';\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  /**\n   * If set, terminate the stream when no pubsub event arrives for this many ms\n   * AND the run is not alive (see `isAlive`). A durable run whose driving process\n   * crashed stops emitting but never publishes a terminal event, so `observe()`\n   * would otherwise hang forever on a producerless topic. Absent ⇒ no idle bound\n   * (current behavior).\n   */\n  idleTimeoutMs?: number;\n  /**\n   * Optional liveness probe consulted when the idle timeout fires. Returns true\n   * while some process is still driving the run (e.g. a fresh run-liveness\n   * heartbeat), in which case the stream keeps waiting; false ⇒ terminate. When\n   * omitted, a bare `idleTimeoutMs` terminates on pure silence. A transient throw\n   * is treated as alive (keep waiting), so a momentary dependency blip never ends\n   * a live stream.\n   */\n  isAlive?: () => boolean | Promise<boolean>;\n  /** Callback when chunk is received */\n  onChunk?: (chunk: ChunkType<OUTPUT>) => void | Promise<void>;\n  /** Callback when step finishes */\n  onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n  /** Callback when execution finishes — routed through MastraModelOutput for rich step data */\n  onFinish?: MastraOnFinishCallback<OUTPUT>;\n  /** Lifecycle hook called after the FINISH event closes the stream (for cleanup scheduling) */\n  onStreamFinished?: () => void | Promise<void>;\n  /** Callback on error */\n  onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n  /** Callback when workflow suspends */\n  onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n  /** Callback when execution is aborted via abortSignal */\n  onAbort?: (data: AgentAbortEventData) => void | Promise<void>;\n  /** Callback fired after each agentic-loop iteration */\n  onIterationComplete?: (data: AgentIterationCompleteEventData) => void | Promise<void>;\n  /** Optional logger for structured logging */\n  logger?: IMastraLogger;\n  /**\n   * If true, close the underlying ReadableStream when a SUSPENDED event is\n   * received. Used by `generate()` / `resumeGenerate()` so that\n   * `getFullOutput()` resolves on suspend instead of hanging. Streaming\n   * callers leave this `false` so the stream stays open for a later resume.\n   */\n  closeOnSuspend?: boolean;\n  /**\n   * Structured output configuration with live schema. When provided,\n   * `MastraModelOutput` pipes LLM text through `createObjectStreamTransformer`\n   * to produce `object-result` chunks.\n   */\n  structuredOutput?: StructuredOutputOptions<OUTPUT>;\n  /** Output processors to run in MastraModelOutput's stream pipeline */\n  outputProcessors?: OutputProcessorOrWorkflow[];\n  /** Experimental transforms applied whenever the returned full stream is consumed. */\n  experimentalTransform?: MastraStreamTransformOptions<OUTPUT>;\n  /**\n   * Optional external MessageList to use instead of creating a fresh empty one.\n   * When provided (e.g. the registry's live MessageList), MastraModelOutput can\n   * resolve step content from messages added during the workflow execution.\n   */\n  messageList?: MessageList;\n}\n\n/**\n * Result from creating a durable agent stream\n */\nexport interface DurableAgentStreamResult<OUTPUT = undefined> {\n  /** The MastraModelOutput that streams from pubsub events */\n  output: MastraModelOutput<OUTPUT>;\n  /** Cleanup function to unsubscribe from pubsub */\n  cleanup: () => void;\n  /** Promise that resolves when subscription is established */\n  ready: Promise<void>;\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<OUTPUT = undefined>(\n  options: DurableAgentStreamOptions<OUTPUT>,\n): DurableAgentStreamResult<OUTPUT> {\n  const {\n    pubsub,\n    runId,\n    messageId,\n    model,\n    threadId,\n    resourceId,\n    offset,\n    idleTimeoutMs,\n    isAlive,\n    onChunk,\n    onStepFinish,\n    onFinish,\n    onStreamFinished,\n    onError,\n    onSuspended,\n    onAbort,\n    onIterationComplete,\n    logger,\n    closeOnSuspend = false,\n    structuredOutput,\n    outputProcessors,\n    experimentalTransform,\n    messageList: externalMessageList,\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  // Use an external MessageList if provided (e.g. the live registry one that\n  // llm-execution.ts keeps in sync), otherwise create a fresh empty one.\n  // This lets MastraModelOutput resolve step content from the real assistant\n  // messages added during the workflow execution.\n  const messageList =\n    externalMessageList ??\n    new MessageList({\n      threadId,\n      resourceId,\n    });\n\n  // Track subscription state\n  let isSubscribed = false;\n  let cancelled = false;\n  // Set once the stream reaches ANY terminal state (FINISH/ERROR/ABORT, a\n  // closeOnSuspend suspend, idle termination, or cleanup). `cancelled` alone is\n  // insufficient: `safeClose()` leaves `controller` set and only `cleanup()`\n  // flips `cancelled`, so without this flag the watchdog would re-arm on an\n  // already-closed stream — observing a finished run (replayed FINISH) or a\n  // late/stale event would start a self-renewing timer. Checked by armIdleTimer.\n  let terminated = false;\n  let controller: ReadableStreamDefaultController<ChunkType<OUTPUT>> | 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<void>((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  // Track the last error message seen in an 'error' chunk, so we can\n  // surface it in onError when the FINISH event arrives with reason 'error'.\n  let lastErrorMessage: string | undefined;\n\n  // Idle/liveness watchdog. A durable run whose driving process crashed stops\n  // emitting chunks but never publishes a terminal FINISH/ERROR/ABORT event, so\n  // a producerless topic would otherwise leave the stream open forever. When\n  // `idleTimeoutMs` is set we arm a timer that terminates the stream after that\n  // much silence — unless `isAlive` confirms a producer is still driving the run\n  // (e.g. a long tool call or a suspended HITL gate), in which case we re-arm and\n  // keep waiting.\n  //\n  // Declared BEFORE `handleEvent` (which re-arms on every event) so a synchronous\n  // replay delivered during `pubsub.subscribe*` in the ReadableStream `start()`\n  // can't reference these consts in their temporal dead zone. `onIdleTimeout`\n  // references `cleanup` (defined later) but only ever runs from a timer, long\n  // after `cleanup` is initialized.\n  //\n  // `idleGeneration` guards an async `isAlive()` race: a probe that resolves\n  // after a fresh event re-armed the timer (or after a terminal event) would\n  // otherwise close an active/finished stream. Every clear/re-arm bumps the\n  // generation; the probe captures it and bails if it no longer matches.\n  let idleTimer: ReturnType<typeof setTimeout> | undefined;\n  let idleGeneration = 0;\n  const clearIdleTimer = () => {\n    idleGeneration += 1;\n    if (idleTimer) {\n      clearTimeout(idleTimer);\n      idleTimer = undefined;\n    }\n  };\n  // Mark the stream terminal and stop the watchdog. Call at every terminal close\n  // so armIdleTimer() can never re-arm afterwards.\n  const markTerminated = () => {\n    terminated = true;\n    clearIdleTimer();\n  };\n  const onIdleTimeout = async (generation: number) => {\n    idleTimer = undefined;\n    if (cancelled || !controller || generation !== idleGeneration) return;\n    if (isAlive) {\n      let alive = true;\n      try {\n        alive = await isAlive();\n      } catch {\n        alive = true; // transient blip ⇒ assume alive\n      }\n      // A chunk (re-arm) or terminal event during the await bumps the generation —\n      // abandon this stale probe so it can't close a now-active or finished stream.\n      if (cancelled || !controller || generation !== idleGeneration) return;\n      if (alive) {\n        armIdleTimer(); // still driving ⇒ keep waiting\n        return;\n      }\n    }\n    // No probe (bare timeout) or provably dead ⇒ terminate with an error chunk,\n    // mirroring the ERROR-event path (enqueue error chunk + safeClose, NOT\n    // controller.error which MastraModelOutput swallows). Fire onError — for\n    // observe() that schedules registry + pubsub-topic cleanup, so an\n    // idle-terminated run doesn't retain state — then unsubscribe in finally.\n    const error = new Error(`Durable agent stream idle for ${idleTimeoutMs}ms with no live producer`);\n    safeEnqueue(controller, {\n      type: 'error',\n      payload: { error },\n    } as ChunkType<OUTPUT>);\n    safeClose(controller);\n    markTerminated(); // block any re-arm while we await onError below\n    try {\n      await onError?.({ error });\n    } catch (callbackError) {\n      logError(`[DurableAgentStream] onError callback error:`, callbackError);\n    } finally {\n      cleanup();\n    }\n  };\n  const armIdleTimer = () => {\n    // `!isSubscribed`: a synchronously-delivering PubSub can invoke handleEvent\n    // (which re-arms) DURING replay, before the subscribe promise resolves and\n    // sets isSubscribed — arming (and possibly expiring) the timer before the\n    // subscription exists. The post-subscribe `.then()` arms it once ready.\n    if (idleTimeoutMs === undefined || idleTimeoutMs <= 0 || cancelled || terminated || !isSubscribed || !controller) {\n      return;\n    }\n    clearIdleTimer();\n    const generation = idleGeneration;\n    idleTimer = setTimeout(() => {\n      void onIdleTimeout(generation);\n    }, idleTimeoutMs);\n  };\n\n  const handleEvent = async (event: Event) => {\n    if (!controller) return;\n\n    // Any event proves the producer is alive — restart the idle countdown.\n    armIdleTimer();\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          // Track error chunks for onError callback\n          if ((chunk as any).type === 'error') {\n            const errPayload = (chunk as any).payload;\n            lastErrorMessage = errPayload?.error?.message || errPayload?.message || 'LLM execution error';\n          }\n          safeEnqueue(controller, chunk as ChunkType<OUTPUT>);\n          await onChunk?.(chunk as ChunkType<OUTPUT>);\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<OUTPUT>;\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<OUTPUT>;\n          safeEnqueue(controller, finishChunk);\n          safeClose(controller);\n          markTerminated();\n\n          // Build rich onFinish payload from finish event data.\n          // The pubsub FINISH event carries output.text, output.steps, and\n          // stepResult — enough to reconstruct the fields scenario tests expect\n          // (text, steps, toolResults, finishReason, usage).\n          if (onFinish) {\n            try {\n              const steps = (data.output?.steps ?? []) as any[];\n              const allToolResults = steps.flatMap((s: any) => s?.toolResults ?? []);\n              const allToolCalls = steps.flatMap((s: any) => s?.toolCalls ?? []);\n              await onFinish({\n                text: data.output?.text ?? '',\n                steps,\n                toolResults: allToolResults,\n                toolCalls: allToolCalls,\n                dynamicToolCalls: [],\n                dynamicToolResults: [],\n                staticToolCalls: [],\n                staticToolResults: [],\n                files: [],\n                sources: [],\n                reasoning: [],\n                content: [],\n                finishReason: data.stepResult?.reason ?? 'stop',\n                usage: normalizeUsage(data.output?.usage),\n                totalUsage: normalizeUsage(data.output?.usage),\n                warnings: data.stepResult?.warnings ?? [],\n                request: { body: undefined },\n                response: {},\n                reasoningText: undefined,\n                providerMetadata: undefined,\n              });\n            } catch (callbackError) {\n              logError(`[DurableAgentStream] onFinish callback error:`, callbackError);\n            }\n          }\n\n          // When the finish reason is 'abort', also fire onAbort so\n          // consumers see it — the abort was handled gracefully (clean\n          // return from llm-execution) rather than crashing the workflow,\n          // so the separate ABORT event never fires.\n          if (onAbort && (data.stepResult?.reason as string) === 'abort') {\n            try {\n              await onAbort({ steps: (data.output?.steps ?? []) as unknown[] });\n            } catch (callbackError) {\n              logError(`[DurableAgentStream] onAbort (from FINISH) callback error:`, callbackError);\n            }\n          }\n\n          // When the finish reason is 'error', also fire onError so\n          // consumers see it — the error was handled gracefully (bail\n          // response) rather than crashing the workflow, so the ERROR\n          // event never fires.\n          if (onError && data.stepResult?.reason === 'error') {\n            try {\n              await onError({ error: new Error(lastErrorMessage || 'LLM execution error') });\n            } catch (callbackError) {\n              logError(`[DurableAgentStream] onError (from FINISH) callback error:`, callbackError);\n            }\n          }\n\n          try {\n            await onStreamFinished?.();\n          } catch (callbackError) {\n            logError(`[DurableAgentStream] onStreamFinished 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          // Enqueue an error chunk and close the stream normally (mirrors the\n          // regular agent's deferred-error-chunk pattern). Using\n          // controller.error() would error the base ReadableStream, which\n          // MastraModelOutput.consumeStream swallows — leaving fullStream\n          // hanging because no 'finish' event fires on the internal emitter.\n          safeEnqueue(controller, {\n            type: 'error',\n            payload: { error },\n          } as ChunkType<OUTPUT>);\n          safeClose(controller);\n          markTerminated();\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          // By default we leave the stream open on suspend so a later resume can\n          // keep streaming chunks (the watchdog stays armed; a suspended-but-live\n          // run reads as attachable via isAlive). `generate()`/`resumeGenerate()`\n          // opt into closing so `getFullOutput()` can resolve.\n          if (closeOnSuspend) {\n            // Mark terminal BEFORE awaiting onSuspended: handleEvent re-armed the\n            // watchdog at the top, and a slow callback (> idleTimeoutMs) would\n            // otherwise let it fire and emit a spurious idle error on an\n            // already-closing run. safeClose in `finally` so a throwing callback\n            // can't skip closure.\n            markTerminated();\n            try {\n              await onSuspended?.(data);\n            } finally {\n              safeClose(controller);\n            }\n          } else {\n            await onSuspended?.(data);\n          }\n          break;\n        }\n\n        case AgentStreamEventTypes.ABORT: {\n          const data = streamEvent.data as AgentAbortEventData;\n          // Mark terminal BEFORE awaiting onAbort, for the same reason as the\n          // closeOnSuspend path above — a slow callback must not let the re-armed\n          // watchdog fire against an already-aborted run.\n          markTerminated();\n          try {\n            await onAbort?.(data);\n          } catch (callbackError) {\n            logError(`[DurableAgentStream] onAbort callback error:`, callbackError);\n          }\n          // Abort closes the stream — the run will not continue.\n          safeClose(controller);\n          break;\n        }\n\n        case AgentStreamEventTypes.ITERATION_COMPLETE: {\n          const data = streamEvent.data as AgentIterationCompleteEventData;\n          try {\n            await onIterationComplete?.(data);\n          } catch (callbackError) {\n            logError(`[DurableAgentStream] onIterationComplete callback error:`, callbackError);\n          }\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<ChunkType<OUTPUT>>({\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          // Start the idle countdown only once subscribed.\n          armIdleTimer();\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    markTerminated();\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  // onStepFinish is passed to MastraModelOutput so it fires during stream\n  // consumption (the harness and user code iterate fullStream, which drives\n  // consumeStream internally). The pubsub STEP_FINISH event is not emitted\n  // by the durable workflow, so the pubsub handler alone is not sufficient.\n  //\n  // onFinish is called from the pubsub FINISH handler (above) with a\n  // payload built from the event data. This ensures it fires even when\n  // nobody iterates the stream (e.g. resume flows with delay-only waits).\n  const output = new MastraModelOutput<OUTPUT>({\n    model,\n    stream,\n    messageList,\n    messageId,\n    options: {\n      runId,\n      onStepFinish: onStepFinish as MastraOnStepFinishCallback<OUTPUT> | undefined,\n      // For durable agents there is only one MastraModelOutput for the whole run.\n      // isLLMExecutionStep must be true so output processors run per-chunk\n      // (processOutputStream / processPart path) rather than the batch\n      // runOutputProcessors path which only fires at finish.  It also gates\n      // createObjectStreamTransformer for structured output.\n      // resolveFinalPromises forces text/finishReason promise resolution at\n      // step-finish despite isLLMExecutionStep being true — durable agents have\n      // no outer MastraModelOutput to resolve them.\n      structuredOutput: structuredOutput as any,\n      isLLMExecutionStep: true,\n      resolveFinalPromises: true,\n      outputProcessors,\n      experimentalTransform,\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<OUTPUT = undefined>(\n  pubsub: PubSub,\n  runId: string,\n  chunk: ChunkType<OUTPUT>,\n): Promise<void> {\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 * The `data` payload must include `type: 'step-start'` so the stream-adapter\n * consumer recognises it as a `ChunkType` and enqueues it onto the client stream.\n */\nexport async function emitStepStartEvent(\n  pubsub: PubSub,\n  runId: string,\n  data: { stepId?: string; request?: unknown; warnings?: unknown[] },\n): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.STEP_START,\n    runId,\n    data: { type: 'step-start', ...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<void> {\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<void> {\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<void> {\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<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.SUSPENDED,\n    runId,\n    data,\n  });\n}\n\n/**\n * Helper to emit an abort event to pubsub\n */\nexport async function emitAbortEvent(pubsub: PubSub, runId: string, data: AgentAbortEventData): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.ABORT,\n    runId,\n    data,\n  });\n}\n\n/**\n * Helper to emit an iteration-complete event to pubsub\n */\nexport async function emitIterationCompleteEvent(\n  pubsub: PubSub,\n  runId: string,\n  data: AgentIterationCompleteEventData,\n): Promise<void> {\n  await pubsub.publish(AGENT_STREAM_TOPIC(runId), {\n    type: AgentStreamEventTypes.ITERATION_COMPLETE,\n    runId,\n    data,\n  });\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  // Set when a delegation hook calls ctx.bail() — signals the loop to stop\n  delegationBailed: z.boolean().optional(),\n  // Set when onIterationComplete returns { continue: false, feedback } — allows\n  // one more LLM turn with the feedback, then stops on the next predicate eval.\n  pendingFeedbackStop: 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<typeof baseIterationStateSchema>;\n\n/**\n * Type for accumulated usage\n */\nexport type AccumulatedUsage = z.infer<typeof accumulatedUsageSchema>;\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    delegationBailed: executionOutput.delegationBailed,\n    // Preserve the two-phase stop flag set by the dowhile predicate's\n    // onIterationComplete handler.  The predicate mutates state on the\n    // *output* of the previous iteration; createBaseIterationStateUpdate\n    // rebuilds the state for the next iteration, so we must carry the\n    // flag forward explicitly.\n    pendingFeedbackStop: currentState.pendingFeedbackStop,\n    // Carry span identity forward unchanged so every iteration shares one trace.\n    agentSpanData: currentState.agentSpanData,\n    modelSpanData: currentState.modelSpanData,\n  };\n}\n","import { DurableAgentDefaults } from '../../constants';\nimport type { DurableToolCallInput, SerializableDurableOptions, SerializableToolMetadata } from '../../types';\n\n/**\n * Resolves the effective tool-call foreach concurrency for a durable agentic\n * workflow from the serialized workflow input (iteration state) and the\n * step's tool calls.\n *\n * Mirrors @mastra/core's non-durable loop semantics\n * (loop/workflows/agentic-execution/tool-call-concurrency.ts):\n * - Global `requireToolApproval` forces sequential execution. The serialized\n *   boolean shadow is `true` for function-form policies, so those degrade\n *   safely to sequential as well.\n * - Any tool in the step's *effective active tool set* with `requireApproval`\n *   or `hasSuspendSchema` forces sequential execution so approval/suspension\n *   flows never race with concurrent tool calls. The check is against the\n *   active tool set, NOT the tools the model actually called: a registered\n *   suspending/approval tool the model skipped this step must still force\n *   sequential execution, since a concurrently-running sibling tool would\n *   race the suspension.\n * - Otherwise the configured `toolCallConcurrency` applies\n *   (default {@link DurableAgentDefaults.TOOL_CALL_CONCURRENCY}).\n *\n * The active tool set is the `activeTools` allowlist the LLM step stamps on\n * each tool call (processors may narrow or clear it; all calls in one step\n * share the value, `null` = restriction cleared → unrestricted). When the\n * calls carry no stamp, the run-level `activeTools` option applies.\n *\n * Designed to be called from a foreach concurrency resolver at execution\n * time, reading only serialized state — safe across durable-engine replays\n * and shared workflow instances.\n */\nexport function resolveDurableToolCallConcurrency({\n  options,\n  toolsMetadata,\n  toolCalls,\n}: {\n  options?: Pick<SerializableDurableOptions, 'requireToolApproval' | 'toolCallConcurrency' | 'activeTools'>;\n  toolsMetadata?: SerializableToolMetadata[];\n  toolCalls?: Pick<DurableToolCallInput, 'activeTools'>[];\n}): number {\n  if (options?.requireToolApproval) {\n    return 1;\n  }\n\n  const stamped = toolCalls?.find(tc => tc.activeTools !== undefined);\n  const activeTools = stamped ? stamped.activeTools : options?.activeTools;\n  const consideredTools =\n    activeTools === undefined || activeTools === null\n      ? (toolsMetadata ?? [])\n      : (toolsMetadata ?? []).filter(tool => activeTools.includes(tool.name));\n\n  if (consideredTools.some(tool => tool.hasSuspendSchema || tool.requireApproval)) {\n    return 1;\n  }\n\n  const configured = options?.toolCallConcurrency;\n  return typeof configured === 'number' && configured > 0 ? configured : DurableAgentDefaults.TOOL_CALL_CONCURRENCY;\n}\n","import { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\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 * - If no running tasks: passes through unchanged\n * - If an explicit waitTimeoutMs is configured and retryCount === 0: returns\n *   immediately with backgroundTaskPending=true (caller drives continuation)\n * - Otherwise: waits for the next task to complete using the configured\n *   waitTimeoutMs or a 1 s default — this keeps the workflow (and its pubsub\n *   subscription) alive so background-task tool-result chunks are delivered\n * - When a task completes: sets isContinued=true so the LLM processes the result\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, getInitData, retryCount } = params;\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      const typedInput = inputData as Record<string, any>;\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 ownstream 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      // The regular agent gates on `retryCount === 0 || !waitTimeoutMs`\n      // and can afford to skip waiting because tool-result chunks from\n      // background tasks are pushed directly into the ReadableStream\n      // controller via safeEnqueue — that works even after this step\n      // returns.\n      //\n      // The durable agent emits tool-result chunks via pubsub.  The\n      // pubsub subscription is torn down when the stream closes and the\n      // consumer calls cleanup().  If this step returns without waiting,\n      // the workflow finishes, FINISH fires, the stream closes, cleanup\n      // runs, and the pubsub subscriber is gone before the background\n      // task can deliver its result.\n      //\n      // Therefore the durable agent must always wait when background\n      // tasks are running — using the configured waitTimeoutMs, or a\n      // sensible 1 s default to keep the workflow (and pubsub) alive.\n\n      // First invocation without explicit waitTimeoutMs — match the\n      // regular agent's \"signal pending, don't block\" on retryCount 0,\n      // but only when the caller provided an explicit timeout (meaning\n      // they'll drive continuation externally).\n      if (retryCount === 0 && waitTimeoutMs) {\n        return { ...typedInput, backgroundTaskPending: true };\n      }\n\n      // Use configured timeout, or default to 1 s so the workflow stays\n      // alive long enough for pubsub to deliver background-task results.\n      const effectiveWaitMs = waitTimeoutMs ?? 1000;\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: effectiveWaitMs,\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 { IMastraLogger } from '../../../logger';\nimport { transformToolPayloadForTargets, withToolPayloadTransformMetadata } from '../../../tools/payload-transform';\nimport type { CoreTool, ToolPayloadTransformPolicy } from '../../../tools/types';\n\n/**\n * Apply the in-process tool payload transform policy to a chunk before the\n * durable layer publishes it. Mirrors `addToolPayloadTransformToChunk` in the\n * non-durable agentic-execution layer, restricted to the chunk types that the\n * durable loop emits (`tool-call`, `tool-result`, `tool-error`).\n *\n * The transform policy is only available for in-process durable runs (it\n * carries a closure that cannot be serialized into the workflow input). When\n * the policy is missing or the chunk is not tool-shaped, the chunk is\n * returned unchanged.\n */\nexport async function applyToolPayloadTransformToChunk<TChunk extends { type: string; payload?: any }>(\n  chunk: TChunk,\n  opts: {\n    policy?: ToolPayloadTransformPolicy;\n    tools?: Record<string, CoreTool>;\n    logger?: IMastraLogger;\n  },\n): Promise<TChunk> {\n  const { policy, tools, logger } = opts;\n  if (!policy && !tools) {\n    return chunk;\n  }\n\n  const payload = chunk.payload;\n  if (!payload || typeof payload !== 'object') {\n    return chunk;\n  }\n\n  const toolName = (payload as { toolName?: unknown }).toolName;\n  const toolCallId = (payload as { toolCallId?: unknown }).toolCallId;\n  if (typeof toolName !== 'string' || typeof toolCallId !== 'string') {\n    return chunk;\n  }\n\n  const tool = tools?.[toolName];\n  const source = {\n    policy,\n    toolTransform: (tool as { transform?: unknown } | undefined)?.transform as any,\n  };\n\n  let transformedChunk: TChunk = chunk;\n  let transform;\n\n  if (chunk.type === 'tool-call') {\n    transform = await transformToolPayloadForTargets(\n      {\n        phase: 'input-available',\n        toolName,\n        toolCallId,\n        input: (payload as { args?: unknown }).args,\n        providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n      },\n      source,\n      logger,\n    );\n  } else if (chunk.type === 'tool-result') {\n    transformedChunk = withToolPayloadTransformMetadata(\n      transformedChunk as any,\n      await transformToolPayloadForTargets(\n        {\n          phase: 'input-available',\n          toolName,\n          toolCallId,\n          input: (payload as { args?: unknown }).args,\n          providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n        },\n        source,\n        logger,\n      ),\n    ) as TChunk;\n    transform = await transformToolPayloadForTargets(\n      {\n        phase: 'output-available',\n        toolName,\n        toolCallId,\n        input: (payload as { args?: unknown }).args,\n        output: (payload as { result?: unknown }).result,\n        providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n      },\n      source,\n      logger,\n    );\n  } else if (chunk.type === 'tool-error') {\n    transformedChunk = withToolPayloadTransformMetadata(\n      transformedChunk as any,\n      await transformToolPayloadForTargets(\n        {\n          phase: 'input-available',\n          toolName,\n          toolCallId,\n          input: (payload as { args?: unknown }).args,\n          providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n        },\n        source,\n        logger,\n      ),\n    ) as TChunk;\n    transform = await transformToolPayloadForTargets(\n      {\n        phase: 'error',\n        toolName,\n        toolCallId,\n        input: (payload as { args?: unknown }).args,\n        error: (payload as { error?: unknown }).error,\n        providerMetadata: (payload as { providerMetadata?: Record<string, unknown> }).providerMetadata,\n      },\n      source,\n      logger,\n    );\n  } else {\n    return chunk;\n  }\n\n  return withToolPayloadTransformMetadata(transformedChunk as any, transform) as TChunk;\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 type {\n  ProcessorState,\n  ErrorProcessorOrWorkflow,\n  InputProcessorOrWorkflow,\n  OutputProcessorOrWorkflow,\n} from '../../../processors';\nimport { RequestContext } from '../../../request-context';\nimport { getNeedsApprovalFn } from '../../../tools/toolchecks';\nimport type { CoreTool, RequireToolApproval, ToolApprovalContext } 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  RunRegistryEntry,\n  SerializableDurableState,\n  SerializableDurableOptions,\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<string, CoreTool>;\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  /** Resolved input processors (rebuilt from the agent when the registry is empty) */\n  inputProcessors?: InputProcessorOrWorkflow[];\n  /** Uncombined input processors for processLLMRequest */\n  llmRequestInputProcessors?: InputProcessorOrWorkflow[];\n  /** Resolved output processors */\n  outputProcessors?: OutputProcessorOrWorkflow[];\n  /** Resolved error processors */\n  errorProcessors?: ErrorProcessorOrWorkflow[];\n  /** Processor state map */\n  processorStates?: Map<string, ProcessorState>;\n}\n\n/**\n * Build a SaveQueueManager for a run's memory, or `undefined` when no memory\n * is configured. Shared by `resolveRuntimeDependencies` and\n * `rebuildRunToolsFromMastra` so the construction lives in one place.\n */\nfunction makeSaveQueueManager(memory: MastraMemory | undefined, mastra?: Mastra): SaveQueueManager | undefined {\n  if (!memory) return undefined;\n  return new SaveQueueManager({ logger: mastra?.getLogger?.(), memory });\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 * Restore a RequestContext from the JSON-safe `requestContextEntries`\n * snapshot serialized onto the workflow input (see preparation.ts). Returns\n * an empty context when no snapshot is present.\n */\nfunction restoreRequestContext(entries?: Record<string, unknown>): RequestContext {\n  return entries\n    ? new RequestContext(Object.entries(entries) as Iterable<readonly [string, unknown]>)\n    : new RequestContext();\n}\n\n/**\n * Thrown when the per-request processor pipeline cannot be rebuilt during\n * cross-process rehydration. Propagated (not swallowed) because continuing\n * without the rebuilt processors would silently drop skills / workspace\n * instructions — the exact failure mode this rebuild exists to fix.\n */\nexport class DurableProcessorRebuildError extends Error {\n  constructor(agentId: string, cause: unknown) {\n    super(\n      `[DurableAgent:${agentId}] Failed to rebuild processor pipeline during cross-process rehydration: ${cause instanceof Error ? cause.message : String(cause)}`,\n    );\n    this.name = 'DurableProcessorRebuildError';\n    this.cause = cause;\n  }\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<ResolvedRuntimeDependencies> {\n  const { mastra, runId, agentId, input, logger } = options;\n\n  // 1. Deserialize MessageList\n  // Reuse the existing MessageList from the registry if available so that\n  // external consumers (e.g. the stream adapter) that hold a reference to it\n  // see the updated state.  Creating a new instance each iteration would\n  // orphan those references (their newResponseMessages Set would point at\n  // stale objects).\n  const existingEntry = globalRunRegistry.get(runId);\n  const messageList = existingEntry?.messageList\n    ? existingEntry.messageList.deserialize(input.messageListState)\n    : new MessageList({\n        threadId: input.state.threadId,\n        resourceId: input.state.resourceId,\n      }).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\n  // DurableAgent's registry.\n  //\n  // On a cross-process engine (e.g. the @mastra/inngest connect() worker) the\n  // durable steps run in a DIFFERENT process than the one that prepared the run,\n  // so this process's registry has either no entry or a minimal placeholder\n  // (see @mastra/inngest resume(): `{ isPlaceholder: true, tools: {}, model:\n  // undefined }`). In that case we MUST rebuild tools / processors / model from\n  // the agent registered on the Mastra instance — otherwise per-request closure\n  // tools (workspace/skill tools) and per-request processors (SkillsProcessor,\n  // WorkspaceInstructions) silently drop cross-process.\n  //\n  // IMPORTANT: an empty `tools` map is NOT a placeholder signal — agents with\n  // zero tools legitimately register `{ tools: {} }` in-process. Placeholders\n  // are detected by the explicit `isPlaceholder` flag or by the absence of a\n  // real model instance (every in-process seeding site stores the live model;\n  // placeholders and metadata-only stubs do not).\n  const globalEntry = globalRunRegistry.get(runId);\n  const registryModel = globalEntry?.model as (MastraLanguageModel & { __metadataOnly?: boolean }) | undefined;\n  const hasHydratedEntry =\n    !!globalEntry && globalEntry.isPlaceholder !== true && !!registryModel && registryModel.__metadataOnly !== true;\n  let tools: Record<string, CoreTool> = 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 = globalEntry?.memory;\n  let inputProcessors: InputProcessorOrWorkflow[] | undefined = globalEntry?.inputProcessors;\n  let llmRequestInputProcessors: InputProcessorOrWorkflow[] | undefined = globalEntry?.llmRequestInputProcessors;\n  let outputProcessors: OutputProcessorOrWorkflow[] | undefined = globalEntry?.outputProcessors;\n  let errorProcessors: ErrorProcessorOrWorkflow[] | undefined = globalEntry?.errorProcessors;\n  let processorStates: Map<string, ProcessorState> | undefined = globalEntry?.processorStates;\n  let rehydratedFromMastra = false;\n\n  // If the registry entry is a real (non-placeholder) in-process entry we\n  // trust it wholesale (in-process / same-process resume). Otherwise fall\n  // through and rebuild from the Mastra instance.\n  if (hasHydratedEntry) {\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      // Restore the caller's request context from the JSON-safe snapshot on\n      // the workflow input (mirrors durable-agent.ts resume handling), so\n      // request-scoped tools / workspace / memory / processors resolve with\n      // the same configuration as the original call site.\n      const resolveRequestContext = restoreRequestContext(input.requestContextEntries);\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          headers: entry.headers,\n        }));\n      }\n\n      memory = await (agent as any).getMemory?.({ requestContext: resolveRequestContext });\n      workspace = await (agent as any).getWorkspace?.({ requestContext: resolveRequestContext });\n\n      // Rebuild the per-request processor pipeline. `listInputProcessors` /\n      // `listOutputProcessors` already inject the SkillsProcessor and\n      // WorkspaceInstructionsProcessor (see Agent.listInputProcessors), so this\n      // restores the missing available-skills list + workspace instructions in\n      // the cross-process system prompt. Mirrors preparation.ts.\n      try {\n        inputProcessors = await (agent as any).listInputProcessors?.(resolveRequestContext);\n        llmRequestInputProcessors = await (agent as any).__listLLMRequestProcessors?.(resolveRequestContext);\n        outputProcessors = await (agent as any).listOutputProcessors?.(resolveRequestContext);\n        errorProcessors = await (agent as any).listErrorProcessors?.(resolveRequestContext);\n        // A fresh processor-state map is correct here: on a cross-process worker\n        // there is no prior state to carry, and processors are re-run per step.\n        processorStates = globalEntry?.processorStates ?? new Map<string, ProcessorState>();\n      } catch (processorError) {\n        // Fail the step loudly rather than continuing (and writing back) an\n        // incomplete pipeline: running without the rebuilt processors would\n        // silently drop skills / workspace instructions.\n        logger?.error?.(`[DurableAgent:${agentId}] Failed to rebuild processors from Mastra: ${processorError}`);\n        throw new DurableProcessorRebuildError(agentId, processorError);\n      }\n\n      rehydratedFromMastra = true;\n    } catch (error) {\n      if (error instanceof DurableProcessorRebuildError) throw 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  // Write the rebuilt state back into the per-process registry so sibling\n  // durable steps in THIS process (e.g. the tool-call step that runs after the\n  // LLM step on the same worker) reuse it instead of rebuilding per call. Only\n  // persist when we actually rehydrated from Mastra — never clobber a fully\n  // populated in-process entry.\n  if (rehydratedFromMastra) {\n    const rebuilt: Partial<RunRegistryEntry> = {\n      // The entry now carries real runtime state — drop the placeholder mark\n      // so sibling steps in this process trust it instead of rebuilding.\n      isPlaceholder: false,\n      tools,\n      model,\n      modelList,\n      workspace,\n      memory,\n      inputProcessors,\n      llmRequestInputProcessors,\n      outputProcessors,\n      errorProcessors,\n      processorStates,\n    };\n    if (globalEntry) {\n      Object.assign(globalEntry, rebuilt);\n    } else {\n      globalRunRegistry.set(runId, rebuilt as RunRegistryEntry);\n    }\n  }\n\n  // 3. Get or create SaveQueueManager\n  const saveQueueManager = makeSaveQueueManager(memory, mastra);\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    inputProcessors,\n    llmRequestInputProcessors,\n    outputProcessors,\n    errorProcessors,\n    processorStates,\n  };\n}\n\n/**\n * Tool + workspace state rebuilt for the durable tool-call step.\n */\nexport interface RebuiltRunTools {\n  tools: Record<string, CoreTool>;\n  workspace?: Workspace;\n  memory?: MastraMemory;\n  saveQueueManager?: SaveQueueManager;\n}\n\n/**\n * Rebuild the run's tools (and workspace/memory) from the agent registered on\n * the Mastra instance, then write them back into the per-process run registry.\n *\n * The durable tool-call step runs as a SEPARATE step from the LLM-execution\n * step and, on a cross-process engine (e.g. the @mastra/inngest connect()\n * worker), can execute in a different process than the one that prepared the\n * run. In that process `globalRunRegistry.get(runId)` is empty (or a minimal\n * placeholder), so per-request closure tools (workspace/skill tools:\n * `skill`, `skill_read`, `skill_search`, `mastra_workspace_*`) are absent and\n * the model's tool call rejects with `ToolNotFoundError`.\n *\n * The LLM step already rebuilds the full toolset via\n * `resolveRuntimeDependencies` → `getToolsForExecution`; this helper gives the\n * tool-call step the same rebuild so tool resolution is symmetric cross-process.\n * The writeback means the first unresolved tool call rebuilds once and later\n * calls in the same process hit the registry.\n *\n * Returns `undefined` when no Mastra instance is available or the agent can't\n * be resolved — callers fall back to their existing `ToolNotFoundError`.\n */\nexport async function rebuildRunToolsFromMastra(options: {\n  mastra?: Mastra;\n  runId: string;\n  agentId: string;\n  state: SerializableDurableState;\n  options?: SerializableDurableOptions;\n  /** JSON-safe request-context snapshot from the workflow input (see preparation.ts). */\n  requestContextEntries?: Record<string, unknown>;\n  logger?: { debug?: (...args: any[]) => void };\n}): Promise<RebuiltRunTools | undefined> {\n  const { mastra, runId, agentId, state, options: execOptions, requestContextEntries, logger } = options;\n  if (!mastra) return undefined;\n\n  try {\n    const agent = mastra.getAgentById(agentId);\n    // Restore the caller's request context so request-scoped tools, workspace\n    // and memory resolve with the same configuration as the original call.\n    const resolveRequestContext = restoreRequestContext(requestContextEntries);\n\n    const tools = await agent.getToolsForExecution({\n      runId,\n      threadId: state.threadId,\n      resourceId: state.resourceId,\n      requestContext: resolveRequestContext,\n      memoryConfig: state.memoryConfig,\n      autoResumeSuspendedTools: execOptions?.autoResumeSuspendedTools,\n    });\n\n    const memory = await (agent as any).getMemory?.({ requestContext: resolveRequestContext });\n    const workspace = await (agent as any).getWorkspace?.({ requestContext: resolveRequestContext });\n    const saveQueueManager = makeSaveQueueManager(memory, mastra);\n\n    // Write back so sibling steps in this process reuse the rebuilt tools.\n    const existing = globalRunRegistry.get(runId);\n    const patch: Partial<RunRegistryEntry> = { tools, workspace, memory, saveQueueManager };\n    if (existing) {\n      // Only fill fields the entry is missing — never clobber a populated entry.\n      if (Object.keys(existing.tools ?? {}).length === 0) existing.tools = tools;\n      existing.workspace ??= workspace;\n      existing.memory ??= memory;\n      existing.saveQueueManager ??= saveQueueManager;\n    } else {\n      globalRunRegistry.set(runId, patch as RunRegistryEntry);\n    }\n\n    return { tools, workspace, memory, saveQueueManager };\n  } catch (error) {\n    logger?.debug?.(`[DurableAgent:${agentId}] Failed to rebuild tools from Mastra for run ${runId}: ${error}`);\n    return undefined;\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<string, CoreTool>;\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 * Mirrors the non-durable precedence:\n *  - Function-form global `requireToolApproval` is evaluated per call with\n *    `(toolName, args, ...)`. Throwing defaults to \"require approval\" (safe).\n *  - Boolean global / tool-level `requireApproval` seed the decision.\n *  - A per-tool `needsApprovalFn` (e.g. skill tools) is authoritative when\n *    present and overrides the seed.\n *\n * In durable execution the function form lives on the run registry, not on\n * the serialized workflow input — pass the resolved value from the caller.\n */\nexport async function toolRequiresApproval(\n  tool: CoreTool,\n  globalRequireApproval?: RequireToolApproval,\n  args?: Record<string, unknown>,\n  approvalContext?: Partial<ToolApprovalContext> & { toolName: string },\n): Promise<boolean> {\n  let globalRequires: boolean;\n  if (typeof globalRequireApproval === 'function') {\n    try {\n      globalRequires = !!(await globalRequireApproval({\n        toolName: approvalContext?.toolName ?? '',\n        args: args ?? {},\n        requestContext: approvalContext?.requestContext,\n        workspace: approvalContext?.workspace,\n      }));\n    } catch {\n      // On error, default to requiring approval (safe default).\n      globalRequires = true;\n    }\n  } else {\n    globalRequires = !!globalRequireApproval;\n  }\n\n  let requires = globalRequires || !!(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<string, CoreTool>,\n  _toolsMetadata: SerializableToolMetadata[],\n): Record<string, CoreTool> {\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<MastraLanguageModel> {\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<typeof resolveModelConfig>[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<MastraLanguageModel> {\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 { ConsoleLogger } from '../../../../logger';\nimport { applyAutoResumeSystemMessage } from '../../../../loop/shared/auto-resume-system-message';\nimport { buildLlmPromptArgs } from '../../../../loop/shared/build-llm-prompt-args';\nimport { composeStepInput } from '../../../../loop/shared/compose-step-input';\nimport { injectBackgroundTaskPrompt } from '../../../../loop/shared/inject-background-task-prompt';\nimport { buildMemoryHeaders, mergeLlmCallHeaders } from '../../../../loop/shared/merge-llm-call-headers';\nimport { buildMessagesFromChunks } from '../../../../loop/workflows/agentic-execution/build-messages-from-chunks';\nimport type { CollectedChunk } from '../../../../loop/workflows/agentic-execution/build-messages-from-chunks';\nimport { endPendingProviderToolSpan } from '../../../../loop/workflows/agentic-execution/provider-tool-spans';\nimport type { PendingProviderToolCall } from '../../../../loop/workflows/agentic-execution/provider-tool-spans';\nimport type { Mastra } from '../../../../mastra';\nimport type {\n  SpanType,\n  AIModelGenerationSpan,\n  ExportedSpan,\n  IModelSpanTracker,\n  AnySpan,\n} from '../../../../observability';\nimport { EntityType } from '../../../../observability';\nimport { getStepAvailableToolNames } from '../../../../observability/utils';\nimport type { CachedLLMStepResponse } from '../../../../processors';\nimport { PrepareStepProcessor } from '../../../../processors/processors/prepare-step';\nimport { ProcessorRunner } from '../../../../processors/runner';\nimport { execute } from '../../../../stream/aisdk/v5/execute';\nimport { MastraModelOutput } from '../../../../stream/base/output';\nimport type { ChunkType, TextDeltaPayload, ToolCallPayload } from '../../../../stream/types';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { findProviderToolByName, inferProviderExecuted } from '../../../../tools/provider-tool-utils';\nimport type { ToolToConvert } from '../../../../tools/tool-builder/builder';\nimport { isMastraTool } from '../../../../tools/toolchecks';\nimport type { CoreTool } from '../../../../tools/types';\nimport { createMastraProxy, makeCoreTool } from '../../../../utils';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport { TripWire } from '../../../trip-wire';\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 { applyToolPayloadTransformToChunk } from '../../utils/apply-tool-payload-transform';\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 {\n        messageList,\n        tools,\n        model: resolvedModel,\n        modelList: resolvedModelList,\n        // Processors rebuilt from the agent when the per-process registry was\n        // empty (cross-process worker). resolveRuntimeDependencies also writes\n        // these back into globalRunRegistry, so `registryEntry?.inputProcessors`\n        // below is populated too — these are the direct fallback if the entry is\n        // evicted (TTL) or absent, restoring the SkillsProcessor /\n        // WorkspaceInstructionsProcessor in the cross-process system prompt.\n        inputProcessors: resolvedInputProcessors,\n        llmRequestInputProcessors: resolvedLlmRequestInputProcessors,\n        outputProcessors: resolvedOutputProcessors,\n      } = resolved;\n\n      // 1b. Check for abort signal before doing any work. If the signal is\n      // already aborted (e.g. pre-aborted before the loop starts), return a\n      // clean output so the dowhile predicate sees isContinued: false and\n      // stops the loop. The FINISH event will be emitted by the finalization\n      // block with stepResult.reason: 'abort' (set by the predicate's abort\n      // guard). We intentionally do NOT emit an ABORT event here because\n      // that would close the stream before the FINISH event arrives.\n      const executionAbortSignalEarly = globalRunRegistry.get(runId)?.abortSignal ?? abortSignal;\n      if (executionAbortSignalEarly?.aborted) {\n        return {\n          messageListState: messageList.serialize(),\n          text: '',\n          toolCalls: [],\n          stepResult: {\n            reason: 'abort' as any,\n            warnings: [],\n            isContinued: false,\n          },\n          metadata: {},\n          state: typedInput.state,\n        } satisfies DurableLLMStepOutput;\n      }\n\n      // 1c. Check for tripwire from processInput (initial input processing).\n      // If an input processor called abort() during preparation, the tripwire\n      // data is stored on the registry entry. Emit a tripwire chunk and bail\n      // immediately — the model must never be called.\n      const registryTripwire = globalRunRegistry.get(runId)?.tripwire;\n      if (registryTripwire) {\n        // Clear it so it doesn't fire again on a subsequent iteration (shouldn't\n        // happen since the loop will stop, but belt-and-suspenders).\n        const entry = globalRunRegistry.get(runId);\n        if (entry) entry.tripwire = undefined;\n\n        logger?.warn?.('Input processor tripwire triggered (from preparation)', {\n          agent: agentId,\n          reason: registryTripwire.reason,\n          processorId: registryTripwire.processorId,\n          retry: registryTripwire.retry,\n        });\n\n        if (pubsub) {\n          await emitChunkEvent(pubsub, runId, {\n            type: 'tripwire',\n            runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              reason: registryTripwire.reason || '',\n              retry: registryTripwire.retry,\n              metadata: registryTripwire.metadata,\n              processorId: registryTripwire.processorId,\n            },\n          });\n        }\n\n        return {\n          messageListState: messageList.serialize(),\n          text: '',\n          toolCalls: [],\n          stepResult: {\n            reason: 'tripwire' as const,\n            warnings: [],\n            isContinued: false,\n          },\n          metadata: {},\n          state: typedInput.state,\n        } satisfies DurableLLMStepOutput;\n      }\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      let processorRetryCount = 0;\n      const maxProcessorRetries =\n        typedInput.options?.maxProcessorRetries ??\n        (globalRunRegistry.get(runId)?.errorProcessors?.length ? 10 : 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<ToolSet> | undefined;\n            let currentActiveTools = execOptions.activeTools;\n            let currentModelSettings: Record<string, unknown> = { ...(execOptions.modelSettings ?? {}) };\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<SpanType.MODEL_GENERATION> | 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. Held in a `let`\n            // because `composeStepInput` (driven by input processors / prepareStep)\n            // is allowed to replace `structuredOutput` for this iteration.\n            const structuredOutputConfig = execOptions.structuredOutput;\n            let 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?.abortSignal ?? abortSignal;\n            const baseInputProcessors = registryEntry?.inputProcessors ?? resolvedInputProcessors ?? [];\n            // Output processors likewise fall back to the rebuilt list when the\n            // per-process registry is empty (cross-process worker).\n            const effectiveOutputProcessors = registryEntry?.outputProcessors ?? resolvedOutputProcessors ?? [];\n            const stepInputProcessors = registryEntry?.prepareStep\n              ? [...baseInputProcessors, new PrepareStepProcessor({ prepareStep: registryEntry.prepareStep })]\n              : baseInputProcessors;\n            if (stepInputProcessors.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: stepInputProcessors,\n                outputProcessors: effectiveOutputProcessors,\n                errorProcessors: registryEntry?.errorProcessors ?? [],\n                logger: logger as any,\n                agentName: typedInput.agentName ?? typedInput.agentId,\n                processorStates: registryEntry?.processorStates,\n              });\n              try {\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                const merged = composeStepInput(\n                  {\n                    messageId: currentMessageId,\n                    model: currentModel,\n                    tools: currentTools,\n                    toolChoice: currentToolChoice,\n                    activeTools: currentActiveTools,\n                    providerOptions: currentProviderOptions,\n                    modelSettings: currentModelSettings,\n                    structuredOutput,\n                  },\n                  processInputStepResult,\n                );\n                currentMessageId = merged.messageId;\n                currentModel = merged.model as typeof currentModel;\n                currentTools = merged.tools as ToolSet;\n                currentToolChoice = merged.toolChoice as ToolChoice<ToolSet> | undefined;\n                currentActiveTools = merged.activeTools;\n                currentProviderOptions = merged.providerOptions;\n                currentModelSettings = merged.modelSettings ?? {};\n                structuredOutput = merged.structuredOutput;\n\n                // Processors (e.g. ToolSearchProcessor) can inject per-step meta-tools\n                // like `search_tools` / `load_tool`. In the non-durable Agent the same\n                // step that shows these tools to the model also executes them, so a\n                // per-step tool map is enough. The DurableAgent instead runs tool calls\n                // in a SEPARATE workflow step that resolves tools from the run registry\n                // (see tool-call.ts). Without a write-back, those processor-injected\n                // tools are missing there and the call fails with ToolNotFoundError\n                // (issue #19571).\n                //\n                // Convert any raw Mastra tools the processor returned into CoreTool form\n                // (mirroring the non-durable llm-execution-step) and merge them into the\n                // run registry so the durable tool-call step can resolve and execute them.\n                if (processInputStepResult.tools) {\n                  const boundLogger = logger || new ConsoleLogger({ level: 'error' });\n                  const convertedTools: Record<string, CoreTool> = {};\n                  for (const [name, tool] of Object.entries(currentTools as Record<string, unknown>)) {\n                    if (isMastraTool(tool)) {\n                      convertedTools[name] = makeCoreTool(\n                        tool as unknown as ToolToConvert,\n                        {\n                          name,\n                          runId,\n                          threadId: typedInput.state?.threadId,\n                          resourceId: typedInput.state?.resourceId,\n                          logger: boundLogger,\n                          mastra: mastra ? createMastraProxy({ mastra, logger: boundLogger }) : undefined,\n                          memory: registryEntry?.memory,\n                          agentName: typedInput.agentName ?? agentId,\n                          requestContext,\n                          workspace: registryEntry?.workspace,\n                          requireApproval: (tool as any).requireApproval,\n                          backgroundConfig: (tool as any).background,\n                          // Emit context.writer.write() / .custom() output through pubsub,\n                          // matching how the durable tool-call step builds its writer.\n                          outputWriter: pubsub\n                            ? async (chunk: any) => {\n                                await emitChunkEvent(pubsub, runId, chunk as ChunkType);\n                              }\n                            : undefined,\n                        },\n                        undefined,\n                        execOptions.autoResumeSuspendedTools,\n                      );\n                    } else {\n                      convertedTools[name] = tool as CoreTool;\n                    }\n                  }\n                  currentTools = convertedTools as unknown as ToolSet;\n                  if (registryEntry) {\n                    // Store the exact per-step snapshot rather than merging onto the\n                    // previous step's set. `currentTools` already starts from the full\n                    // toolset resolved at the top of this step, so a snapshot keeps the\n                    // static tools while dropping processor-injected tools the current\n                    // step no longer exposes (e.g. a ToolSearchProcessor entry that hit\n                    // its TTL). Merging would leave those stale tools executable by the\n                    // tool-call step even though the model was never shown them.\n                    registryEntry.tools = convertedTools;\n                  }\n                }\n              } catch (error) {\n                // Handle TripWire from processInputStep — emit tripwire chunk and\n                // bail the step, mirroring the regular agent's buildTripWireBailResponse.\n                // Return a bail output with reason: 'tripwire' so the dowhile loop\n                // stops gracefully and emits a proper finish event.\n                if (error instanceof TripWire) {\n                  logger?.warn?.('Streaming input processor tripwire triggered', {\n                    reason: error.message,\n                    processorId: error.processorId,\n                    retry: error.options?.retry,\n                  });\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        processorId: error.processorId,\n                        reason: error.message,\n                        retry: error.options?.retry,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  // Return a bail response instead of throwing — the dowhile\n                  // predicate will see isContinued: false and stop the loop,\n                  // then emitFinishEvent will emit reason: 'tripwire'.\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: '',\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as const,\n                      warnings: [],\n                      isContinued: false,\n                    },\n                    metadata: {\n                      modelId: currentModel.modelId,\n                    },\n                    state: typedInput.state,\n                  } satisfies DurableLLMStepOutput;\n                }\n                logger?.error?.('Error in processInputStep processors:', error);\n                throw error;\n              }\n            }\n\n            // ── Signal echo & pre-run drain ───────────────────────────────\n            // Mirror the non-durable llm-execution-step:\n            //  1. Echo initialSignalEchoes (signals that were part of the input\n            //     messages, e.g. from persisted memory) so the client sees them.\n            //  2. Pre-run signals: if this is the first model request of the run\n            //     (stepIndex === 0), drain signals that were queued before the\n            //     run made its first request. These must be added to messageList\n            //     BEFORE inputMessages is materialized so the model sees them.\n            if (pubsub) {\n              const initialSignalEchoes = registryEntry?.initialSignalEchoes?.splice(0) ?? [];\n              for (const initialSignal of initialSignalEchoes) {\n                await emitChunkEvent(pubsub, runId, initialSignal.toDataPart() as any);\n              }\n\n              const isFirstModelRequest = stepIndex === 0;\n              if (isFirstModelRequest && registryEntry?.drainPendingSignals) {\n                const preRunSignals = registryEntry.drainPendingSignals('pre-run');\n                if (preRunSignals.length > 0) {\n                  currentMessageId = mastra?.generateId?.() ?? crypto.randomUUID();\n                }\n                for (const preRunSignal of preRunSignals) {\n                  const signalForTranscript = messageList.addSignal(preRunSignal);\n                  await emitChunkEvent(pubsub, runId, signalForTranscript.toDataPart() as any);\n                }\n              }\n            }\n\n            // `downloadRetries` / `downloadConcurrency` are internal-only on the\n            // non-durable path today (not exposed through AgentExecutionOptions),\n            // so durable also relies on the MessageList defaults here. If those\n            // ever become user-facing they should be plumbed in identically.\n            const messageListPromptArgs = await buildLlmPromptArgs({\n              model: currentModel,\n            });\n            const llmPromptForModel =\n              currentModel.specificationVersion === 'v4'\n                ? messageList.get.all.aiV7.llmPrompt\n                : currentModel.specificationVersion === 'v3'\n                  ? messageList.get.all.aiV6.llmPrompt\n                  : messageList.get.all.aiV5.llmPrompt;\n            let inputMessages = (await llmPromptForModel(messageListPromptArgs)) as LanguageModelV2Prompt;\n\n            // Inject the auto-resume directive into the leading system message when\n            // there are suspended tools waiting for resumption (parity with the\n            // non-durable agentic-execution step).\n            inputMessages = applyAutoResumeSystemMessage({\n              autoResume: execOptions.autoResumeSuspendedTools,\n              inputMessages,\n              messages: messageList.get.all.db(),\n            });\n\n            // Tell the model about background-task capabilities when a\n            // background-task manager is wired in. Mirrors the non-durable\n            // agentic-execution step so background-enabled tools surface the\n            // same `_background` guidance to the LLM.\n            inputMessages = injectBackgroundTaskPrompt({\n              inputMessages,\n              backgroundTaskManager: registryEntry?.backgroundTaskManager,\n              tools: currentTools as Record<string, { background?: any; description?: string }> | undefined,\n              agentBackgroundConfig: registryEntry?.backgroundTasksConfig,\n            });\n\n            // Run `processLLMRequest` for any input processors that implement it.\n            // This hook lets processors rewrite the outbound prompt transiently\n            // without persisting changes back to the message list, or short-circuit\n            // the call entirely by returning a cached response.\n            // Mirrors loop/workflows/agentic-execution/llm-execution-step.ts.\n            //\n            // Use `llmRequestInputProcessors` (uncombined) because combined\n            // (workflow-wrapped) processors are skipped by\n            // `ProcessorRunner.runProcessLLMRequest`. Fall back to\n            // `inputProcessors` for backward compatibility.\n            let cachedResponse: CachedLLMStepResponse | undefined;\n            const allInputProcessors =\n              registryEntry?.llmRequestInputProcessors ??\n              registryEntry?.inputProcessors ??\n              resolvedLlmRequestInputProcessors ??\n              resolvedInputProcessors ??\n              [];\n            // Create a single ProcessorRunner shared between processLLMRequest\n            // and processLLMResponse so processor state (e.g. cache keys stashed\n            // in the request hook) is available in the response hook.\n            const requestStepRunner =\n              allInputProcessors.length > 0\n                ? new ProcessorRunner({\n                    inputProcessors: allInputProcessors,\n                    outputProcessors: [],\n                    logger: logger as any,\n                    agentName: typedInput.agentName ?? typedInput.agentId,\n                    processorStates: registryEntry?.processorStates,\n                  })\n                : undefined;\n            const requestStepWriter = pubsub\n              ? {\n                  custom: async (data: { type: string }) => {\n                    await emitChunkEvent(pubsub, runId, data as any);\n                  },\n                }\n              : undefined;\n            if (requestStepRunner) {\n              try {\n                const requestStepResult = await requestStepRunner.runProcessLLMRequest({\n                  prompt: inputMessages,\n                  model: currentModel,\n                  stepNumber: (inputData as any).accumulatedSteps?.length ?? 0,\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  retryCount: (inputData as any).processorRetryCount ?? 0,\n                  requestContext,\n                  tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n                  writer: requestStepWriter,\n                  abortSignal: executionAbortSignal,\n                });\n                inputMessages = requestStepResult.prompt;\n                cachedResponse = requestStepResult.response;\n              } catch (error) {\n                if (error instanceof TripWire) {\n                  logger?.warn?.('Streaming request processor tripwire triggered', {\n                    reason: error.message,\n                    processorId: error.processorId,\n                    retry: error.options?.retry,\n                  });\n                  // Emit a tripwire chunk and return a bail response so the\n                  // dowhile loop stops gracefully with reason: 'tripwire'.\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        processorId: error.processorId,\n                        reason: error.message,\n                        retry: error.options?.retry,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: '',\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as const,\n                      warnings: [],\n                      isContinued: false,\n                    },\n                    metadata: {\n                      modelId: currentModel.modelId,\n                    },\n                    state: typedInput.state,\n                  } satisfies DurableLLMStepOutput;\n                }\n                logger?.error?.('Error in processLLMRequest processors:', error);\n                throw error;\n              }\n            }\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            // ── Client-tool observability + onInputStart / onInputDelta ──\n            // Mirrors the regular agent's injectClientToolObservability / endClientToolObservabilitySpan\n            // helpers. Creates CLIENT_TOOL_CALL spans for tools executed on the client side and\n            // invokes the tool-level onInputStart / onInputDelta callbacks as chunks arrive.\n            const clientToolArgsTextByToolCallId = new Map<string, string[]>();\n            const clientToolObservabilityByToolCallId = new Map<\n              string,\n              { carrier: unknown; span: AnySpan; ended: boolean }\n            >();\n            // Cache resolved tool defs by toolCallId so `tool-call-delta` chunks\n            // (which may carry only a toolCallId, no toolName) can still find the\n            // tool resolved during the preceding `tool-call-input-streaming-start`.\n            const resolvedToolByCallId = new Map<string, CoreTool>();\n            const pendingProviderToolCallsByToolCallId = new Map<string, PendingProviderToolCall>();\n            // Guards against a re-delivered tool-result minting a second span for the same call.\n            const materializedProviderToolCallIds = new Set<string>();\n\n            const resolveToolDef = (toolName: string): CoreTool | undefined => {\n              const directTool = (currentTools as unknown as Record<string, CoreTool> | undefined)?.[toolName];\n              if (directTool) return directTool;\n              const registryTool = registryEntry?.tools?.[toolName];\n              if (registryTool) return registryTool;\n              // Resolve provider tools by model-facing name (e.g. 'web_search' → provider tool with id 'anthropic.web_search').\n              // Check both currentTools and registryEntry.tools to match the durable tool-call step's resolution.\n              const providerTool = findProviderToolByName(currentTools as any, toolName) as CoreTool | undefined;\n              if (providerTool) return providerTool;\n              return findProviderToolByName(registryEntry?.tools as any, toolName) as CoreTool | undefined;\n            };\n\n            const endClientToolObservabilitySpan = (toolCallId: string, args?: unknown): void => {\n              const entry = clientToolObservabilityByToolCallId.get(toolCallId);\n              if (!entry || entry.ended) {\n                clientToolArgsTextByToolCallId.delete(toolCallId);\n                return;\n              }\n              entry.span.end(args !== undefined ? { metadata: { args } } : undefined);\n              entry.ended = true;\n              clientToolArgsTextByToolCallId.delete(toolCallId);\n            };\n\n            const parseClientToolArgsFromDeltas = (toolCallId: string): unknown | undefined => {\n              const deltas = clientToolArgsTextByToolCallId.get(toolCallId);\n              if (!deltas?.length) return undefined;\n              const input = deltas.join('');\n              if (!input) return undefined;\n              try {\n                return JSON.parse(input);\n              } catch {\n                return undefined;\n              }\n            };\n\n            const injectClientToolObservability = ({\n              toolCallId,\n              toolName,\n              args,\n              providerExecuted,\n              payload,\n            }: {\n              toolCallId: string;\n              toolName: string;\n              args?: unknown;\n              providerExecuted?: boolean;\n              payload: Record<string, unknown> & { observability?: unknown };\n            }): { toolDef: CoreTool | undefined } => {\n              const toolDef = resolveToolDef(toolName);\n              const inferredProviderExecuted = inferProviderExecuted(providerExecuted, toolDef);\n              const isClientTool =\n                !inferredProviderExecuted && !(toolDef as { execute?: unknown } | undefined)?.execute;\n\n              if (!isClientTool || !mastra || !tracingContext?.currentSpan) {\n                return { toolDef };\n              }\n\n              const existingCarrier = clientToolObservabilityByToolCallId.get(toolCallId);\n              if (existingCarrier) {\n                payload.observability = existingCarrier.carrier;\n                if (args !== undefined) {\n                  endClientToolObservabilitySpan(toolCallId, args);\n                }\n                return { toolDef };\n              }\n\n              const proxy = (mastra as Mastra).observability?.getClientObservabilityProxy?.();\n              if (!proxy) return { toolDef };\n\n              try {\n                const parentSpan =\n                  tracingContext.currentSpan.type === ('agent_run' as string)\n                    ? tracingContext.currentSpan\n                    : ((tracingContext.currentSpan as any).findParent?.('agent_run') ?? tracingContext.currentSpan);\n                const clientToolSpan = (parentSpan as any).createChildSpan?.({\n                  type: 'client_tool_call',\n                  name: `client_tool: '${toolName}'`,\n                  entityType: EntityType.TOOL,\n                  entityId: toolName,\n                  entityName: toolName,\n                  attributes: {\n                    toolDescription: (toolDef as { description?: string } | undefined)?.description,\n                    toolType: 'client-tool',\n                  },\n                  ...(args !== undefined ? { input: args } : {}),\n                });\n                if (clientToolSpan) {\n                  const carrier = proxy.inject(clientToolSpan);\n                  const entry = { carrier, span: clientToolSpan as AnySpan, ended: false };\n                  clientToolObservabilityByToolCallId.set(toolCallId, entry);\n                  payload.observability = carrier;\n                  if (args !== undefined) {\n                    endClientToolObservabilitySpan(toolCallId, args);\n                  }\n                }\n              } catch (err) {\n                logger?.warn?.('[ClientObservabilityProxy] failed to create CLIENT_TOOL_CALL span', {\n                  error: err instanceof Error ? err.message : String(err),\n                  toolName,\n                });\n              }\n\n              return { toolDef };\n            };\n\n            const resolveAgentRunFallback = (span: AnySpan): AnySpan =>\n              span.type === ('agent_run' as string)\n                ? span\n                : (((span as any).findParent?.('agent_run') ?? span) as AnySpan);\n\n            const recordProviderToolCall = ({\n              toolCallId,\n              toolName,\n              args,\n              providerExecuted,\n            }: {\n              toolCallId: string;\n              toolName: string;\n              args?: unknown;\n              providerExecuted?: boolean;\n            }) => {\n              if (!tracingContext?.currentSpan) return;\n\n              const toolDef = resolveToolDef(toolName);\n              const inferredProviderExecuted = inferProviderExecuted(providerExecuted, toolDef);\n              if (!inferredProviderExecuted) return;\n              const existingEntry = pendingProviderToolCallsByToolCallId.get(toolCallId);\n              if (existingEntry) {\n                if (args !== undefined && existingEntry.args === undefined) {\n                  existingEntry.args = args;\n                }\n                return;\n              }\n\n              pendingProviderToolCallsByToolCallId.set(toolCallId, {\n                toolName,\n                args,\n                startTime: new Date(),\n                toolDescription: (toolDef as { description?: string } | undefined)?.description,\n                fallbackParentSpan: resolveAgentRunFallback(tracingContext.currentSpan),\n              });\n            };\n\n            const cleanupToolObservabilitySpans = (flushPendingProviderToolCalls: boolean) => {\n              for (const [toolCallId, entry] of clientToolObservabilityByToolCallId.entries()) {\n                if (!entry.ended) {\n                  const parsedArgs = parseClientToolArgsFromDeltas(toolCallId);\n                  entry.span.end(parsedArgs !== undefined ? { metadata: { args: parsedArgs } } : undefined);\n                  entry.ended = true;\n                }\n              }\n              clientToolArgsTextByToolCallId.clear();\n\n              if (flushPendingProviderToolCalls) {\n                for (const [toolCallId, pending] of pendingProviderToolCallsByToolCallId.entries()) {\n                  endPendingProviderToolSpan({ toolCallId, pending, parentSpan: pending.fallbackParentSpan, logger });\n                }\n              }\n              pendingProviderToolCallsByToolCallId.clear();\n            };\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<string, unknown> | undefined,\n              providerOptions: currentProviderOptions as Record<string, unknown> | undefined,\n              availableTools: getStepAvailableToolNames(\n                currentTools as Record<string, unknown> | undefined,\n                currentActiveTools,\n              ),\n              toolChoice: currentToolChoice,\n              responseFormat: structuredOutput ? 'json_schema' : undefined,\n            });\n            modelSpanTracker?.startInference?.();\n\n            // Collect chunks for post-stream message building (via\n            // buildMessagesFromChunks) and for the processLLMResponse hook\n            // (pairs with processLLMRequest — lets processors like\n            // ResponseCache persist the model's response). Always populated\n            // so reasoning/text/tool parts are reconstructed in stream order,\n            // including empty reasoning spans that carry providerMetadata\n            // (e.g. OpenAI itemId) required by subsequent turns (#19365).\n            const collectedChunks: CollectedChunk[] = [];\n\n            // 10. Execute LLM call (or replay cached response)\n            let modelResult: ReturnType<typeof execute>;\n            if (cachedResponse) {\n              // Short-circuit: replay cached chunks instead of calling the model.\n              // Output processors are skipped on cache hit because the cached\n              // chunks already reflect their effects from the original call.\n              warnings = cachedResponse.warnings ?? [];\n              request = cachedResponse.request ?? {};\n              rawResponse = cachedResponse.rawResponse;\n              modelSpanTracker?.updateStep?.({\n                request: request || {},\n                inputMessages,\n                warnings: warnings || [],\n                messageId: currentMessageId,\n              });\n              const replayChunks = cachedResponse.chunks;\n              modelResult = new ReadableStream({\n                start(ctrl) {\n                  for (const chunk of replayChunks) {\n                    ctrl.enqueue({\n                      ...chunk,\n                      runId,\n                      from: ChunkFrom.AGENT,\n                    });\n                  }\n                  ctrl.close();\n                },\n              }) as unknown as ReturnType<typeof execute>;\n            } else {\n              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                headers: mergeLlmCallHeaders({\n                  memoryHeaders: buildMemoryHeaders({\n                    threadId: typedInput.state?.threadId,\n                    resourceId: typedInput.state?.resourceId,\n                  }),\n                  modelConfigHeaders: resolvedModelList?.find(m => m.id === modelEntry.id)?.headers,\n                  callTimeHeaders:\n                    registryEntry?.callTimeHeaders || currentModelSettings?.headers\n                      ? {\n                          ...(registryEntry?.callTimeHeaders as Record<string, string> | undefined),\n                          ...(currentModelSettings?.headers as Record<string, string> | undefined),\n                        }\n                      : undefined,\n                }),\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              });\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<any>).pipeThrough(\n              new TransformStream<any, any>({\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            let deferredStepFinishChunk: any = null;\n            try {\n              let stepStartEmitted = false;\n              for await (const rawChunk of trackedStream) {\n                if (!rawChunk) continue;\n\n                // Mirror the regular agent: if the abort signal fired between\n                // chunks, stop consuming the stream immediately so we don't\n                // send additional data to the client after cancellation.\n                if (executionAbortSignal?.aborted) break;\n\n                // Emit step-start before the first stream chunk so the\n                // ordering matches the regular agent: start → step-start → response-metadata → …\n                // onResult has already fired by the time the first chunk arrives,\n                // so `request` and `warnings` are populated.\n                if (!stepStartEmitted && pubsub) {\n                  stepStartEmitted = true;\n                  await emitStepStartEvent(pubsub, runId, {\n                    stepId: DurableStepIds.LLM_EXECUTION,\n                    request,\n                    warnings,\n                  });\n                }\n\n                // Enrich tool-related chunks with the in-process payload transform\n                // policy (mirrors the non-durable agentic-execution layer). The\n                // policy lives on the run registry; serializable `targets` shadow\n                // travels with the workflow input. No-op for non-tool chunks or\n                // when no policy is configured for this run.\n                //\n                // IMPORTANT: the transformed chunk is only used for client-facing\n                // emission. Internal tool-call state (args persisted into\n                // `toolCalls`, downstream tool execution) MUST be built from the\n                // untransformed `rawChunk` so display-layer redactions/rewrites\n                // do not leak into actual tool inputs.\n                //\n                // Use the per-step `currentTools` (post-`prepareStep` and input\n                // processors) rather than the registry-level tool list — that way\n                // any tool-level `transformToolPayload` added or replaced for the\n                // current step is honoured, instead of being silently skipped.\n                const transformTools = currentTools as unknown as Record<string, CoreTool> | undefined;\n                const clientChunk =\n                  registryEntry?.toolPayloadTransform || transformTools\n                    ? await applyToolPayloadTransformToChunk(rawChunk, {\n                        policy: registryEntry?.toolPayloadTransform,\n                        tools: transformTools,\n                        logger: logger as any,\n                      })\n                    : rawChunk;\n\n                // ── Client-tool observability injection ──\n                // For tool-call streaming chunks, inject CLIENT_TOOL_CALL spans\n                // and collect deltas so the span can be ended with parsed args.\n                //\n                // IMPORTANT: inject into `clientChunk.payload` (the published\n                // chunk), not `rawChunk.payload`. When a payload transform is\n                // active, `clientChunk` is a new object — mutating `rawChunk`\n                // would lose the observability carrier on the wire.\n                let toolInputStartToolDef: CoreTool | undefined;\n                if (rawChunk.type === 'tool-call-input-streaming-start') {\n                  ({ toolDef: toolInputStartToolDef } = injectClientToolObservability({\n                    toolCallId: rawChunk.payload.toolCallId,\n                    toolName: rawChunk.payload.toolName,\n                    providerExecuted: rawChunk.payload.providerExecuted,\n                    payload: (clientChunk as any).payload as Record<string, unknown> & { observability?: unknown },\n                  }));\n                  // Cache the resolved tool so subsequent delta chunks (which may\n                  // carry only toolCallId, no toolName) can still find it.\n                  if (toolInputStartToolDef) {\n                    resolvedToolByCallId.set(rawChunk.payload.toolCallId, toolInputStartToolDef);\n                  }\n                  recordProviderToolCall({\n                    toolCallId: rawChunk.payload.toolCallId,\n                    toolName: rawChunk.payload.toolName,\n                    providerExecuted: rawChunk.payload.providerExecuted,\n                  });\n                } else if (rawChunk.type === 'tool-call-delta') {\n                  const toolCallId = rawChunk.payload.toolCallId;\n                  if (toolCallId && rawChunk.payload.argsTextDelta) {\n                    const deltas = clientToolArgsTextByToolCallId.get(toolCallId) ?? [];\n                    deltas.push(rawChunk.payload.argsTextDelta);\n                    clientToolArgsTextByToolCallId.set(toolCallId, deltas);\n                  }\n                } else if (rawChunk.type === 'tool-call-input-streaming-end') {\n                  const parsedArgs = parseClientToolArgsFromDeltas(rawChunk.payload.toolCallId);\n                  if (parsedArgs !== undefined) {\n                    endClientToolObservabilitySpan(rawChunk.payload.toolCallId, parsedArgs);\n                  }\n                } else if (rawChunk.type === 'tool-call') {\n                  injectClientToolObservability({\n                    toolCallId: rawChunk.payload.toolCallId,\n                    toolName: rawChunk.payload.toolName,\n                    args: rawChunk.payload.args,\n                    providerExecuted: rawChunk.payload.providerExecuted,\n                    payload: (clientChunk as any).payload as Record<string, unknown> & { observability?: unknown },\n                  });\n                  recordProviderToolCall({\n                    toolCallId: rawChunk.payload.toolCallId,\n                    toolName: rawChunk.payload.toolName,\n                    args: rawChunk.payload.args,\n                    providerExecuted: rawChunk.payload.providerExecuted,\n                  });\n                }\n\n                // Forward every chunk to the client ('finish' was rewritten to 'step-finish' above).\n                // Skip 'error' chunks — they are handled internally by the retry/fallback\n                // logic and must not be emitted to the client stream. When all models are\n                // exhausted the fatal error is propagated via emitError (mirrors the regular\n                // agent's deferredErrorChunk pattern).\n                //\n                // Defer 'step-finish': for intermediate steps (hasToolCalls) we save it\n                // on the output so llm-mapping can emit it AFTER tool-result chunks,\n                // matching the regular agent's ordering (tool-result → step-finish).\n                // For final steps (no tool calls) we emit it after the assistant message\n                // is added to messageList.\n                if (pubsub && rawChunk.type !== 'error') {\n                  if (rawChunk.type === 'step-finish') {\n                    deferredStepFinishChunk = clientChunk;\n                  } else {\n                    await emitChunkEvent(pubsub, runId, clientChunk);\n                  }\n                }\n\n                // Collect every chunk for post-stream message building and the\n                // processLLMResponse hook. Always collect — reasoning parts\n                // (including empty spans with providerMetadata carrying\n                // OpenAI itemIds) are required to correctly reconstruct the\n                // assistant message and preserve pairing with subsequent\n                // tool-calls (#19365).\n                collectedChunks.push({\n                  type: rawChunk.type,\n                  payload: 'payload' in rawChunk ? rawChunk.payload : undefined,\n                  metadata: (rawChunk as { metadata?: Record<string, unknown> }).metadata,\n                });\n\n                // Process different chunk types — always from the raw chunk so\n                // internal state (tool args, finish reason, usage, metadata) is\n                // never affected by display-layer transforms.\n                switch (rawChunk.type) {\n                  case 'text-delta': {\n                    const payload = rawChunk.payload as TextDeltaPayload;\n                    textDeltas.push(payload.text);\n                    break;\n                  }\n\n                  case 'tool-call-input-streaming-start': {\n                    const tool = toolInputStartToolDef || resolveToolDef(rawChunk.payload.toolName);\n                    if (tool && 'onInputStart' in tool) {\n                      try {\n                        // Pass the actual prompt sent to the model (post-processLLMRequest\n                        // rewrites) instead of rebuilding from messageList, which would\n                        // drop any transient prompt modifications made by input processors.\n                        await (tool as any).onInputStart?.({\n                          toolCallId: rawChunk.payload.toolCallId,\n                          messages: inputMessages,\n                          abortSignal: executionAbortSignal,\n                        });\n                      } catch (error) {\n                        logger?.error?.('Error calling onInputStart', error);\n                      }\n                    }\n                    break;\n                  }\n\n                  case 'tool-call-delta': {\n                    // Prefer the cached tool resolved during the preceding start chunk.\n                    // Fall back to toolName-based resolution for completeness.\n                    const tool =\n                      resolvedToolByCallId.get(rawChunk.payload.toolCallId) ??\n                      (rawChunk.payload.toolName ? resolveToolDef(rawChunk.payload.toolName) : undefined);\n                    if (tool && 'onInputDelta' in tool) {\n                      try {\n                        await (tool as any).onInputDelta?.({\n                          inputTextDelta: rawChunk.payload.argsTextDelta,\n                          toolCallId: rawChunk.payload.toolCallId,\n                          messages: inputMessages,\n                          abortSignal: executionAbortSignal,\n                        });\n                      } catch (error) {\n                        logger?.error?.('Error calling onInputDelta', error);\n                      }\n                    }\n                    break;\n                  }\n\n                  case 'tool-call': {\n                    const payload = rawChunk.payload as ToolCallPayload;\n                    toolCalls.push({\n                      toolCallId: payload.toolCallId,\n                      toolName: payload.toolName,\n                      args: payload.args || {},\n                      providerMetadata: payload.providerMetadata as Record<string, unknown> | undefined,\n                      providerExecuted: payload.providerExecuted,\n                      output: payload.output,\n                      activeTools: currentActiveTools ?? null,\n                    });\n                    break;\n                  }\n\n                  case 'tool-result': {\n                    const payload = rawChunk.payload as any;\n                    // The result determines which MODEL_STEP owns the provider tool call, so\n                    // the PROVIDER_TOOL_CALL span is created now, backdated to the tool-call chunk.\n                    const pending = pendingProviderToolCallsByToolCallId.get(payload.toolCallId);\n                    if (pending) {\n                      endPendingProviderToolSpan({\n                        toolCallId: payload.toolCallId,\n                        pending,\n                        parentSpan: modelSpanTracker?.getTracingContext()?.currentSpan ?? pending.fallbackParentSpan,\n                        result: { output: payload.result, isError: payload.isError },\n                        logger,\n                      });\n                      pendingProviderToolCallsByToolCallId.delete(payload.toolCallId);\n                      materializedProviderToolCallIds.add(payload.toolCallId);\n                    } else if (\n                      tracingContext?.currentSpan &&\n                      !materializedProviderToolCallIds.has(payload.toolCallId)\n                    ) {\n                      // Deferred result: the call arrived in a previous step invocation.\n                      // Only create a synthetic span if this is actually a provider-executed tool.\n                      const resultToolDef2 = resolveToolDef(payload.toolName);\n                      const isProviderExec = inferProviderExecuted(payload.providerExecuted, resultToolDef2);\n                      if (!isProviderExec) break;\n\n                      let spanInput = payload.args;\n                      if (spanInput === undefined) {\n                        // Fallback: find args from the tool-call already stored in messageList\n                        const allMessages = messageList.get.all.db();\n                        for (const msg of allMessages) {\n                          if (!msg.content?.parts) continue;\n                          for (const part of msg.content.parts) {\n                            if (\n                              part.type === 'tool-invocation' &&\n                              part.toolInvocation?.toolCallId === payload.toolCallId\n                            ) {\n                              spanInput = part.toolInvocation.args;\n                              break;\n                            }\n                          }\n                          if (spanInput !== undefined) break;\n                        }\n                      }\n                      // startTime is result time, not the call time: the call was observed in a\n                      // previous invocation whose in-memory state (including its timestamp) does\n                      // not survive the invocation boundary.\n                      endPendingProviderToolSpan({\n                        toolCallId: payload.toolCallId,\n                        pending: {\n                          toolName: payload.toolName,\n                          args: spanInput,\n                          startTime: new Date(),\n                          toolDescription: (resultToolDef2 as { description?: string } | undefined)?.description,\n                        },\n                        parentSpan:\n                          modelSpanTracker?.getTracingContext()?.currentSpan ??\n                          resolveAgentRunFallback(tracingContext.currentSpan),\n                        result: { output: payload.result, isError: payload.isError },\n                        logger,\n                      });\n                      materializedProviderToolCallIds.add(payload.toolCallId);\n                    }\n                    break;\n                  }\n\n                  case 'step-finish': {\n                    const payload = rawChunk.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 = rawChunk.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 = rawChunk.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              // Clean up any unclosed observability spans after successful stream completion.\n              // Pending provider tool calls are only flushed on terminal steps — when the loop\n              // continues, the deferred result creates the real span in a later invocation.\n              cleanupToolObservabilitySpans(!(toolCalls.length > 0 && finishReason !== 'stop'));\n            } catch (error) {\n              cleanupToolObservabilitySpans(true);\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              // If this error was triggered by abortSignal cancellation, surface an\n              // abort event to the client so onAbort callbacks fire and bail out\n              // of the entire fallback/retry flow — a confirmed abort should not\n              // trigger retries on the same model nor fall through to other\n              // models. We deliberately avoid matching on arbitrary error message\n              // text (e.g. /abort/i) because that can fire for retryable provider\n              // errors whose message happens to mention \"abort\"; we only trust\n              // the canonical AbortError name or an actual aborted signal.\n              const isAbort = executionAbortSignal?.aborted === true || errorObj.name === 'AbortError';\n              if (isAbort) {\n                // Return a clean output instead of throwing so the workflow\n                // engine doesn't crash. The dowhile predicate will see\n                // isContinued: false and stop the loop. The FINISH event\n                // (emitted by the finalization block) will carry reason: 'abort'.\n                return {\n                  messageListState: messageList.serialize(),\n                  text: textDeltas.join(''),\n                  toolCalls: [],\n                  stepResult: {\n                    reason: 'abort' as any,\n                    warnings: [],\n                    isContinued: false,\n                  },\n                  metadata: { modelId: currentModel.modelId },\n                  state: typedInput.state,\n                } satisfies DurableLLMStepOutput;\n              }\n\n              lastError = errorObj;\n\n              // Try processAPIError before deciding retry/break\n              const registryEntryInner = globalRunRegistry.get(runId);\n              const canRetryErrorInner = maxProcessorRetries !== undefined && processorRetryCount < maxProcessorRetries;\n              if (registryEntryInner?.errorProcessors?.length && canRetryErrorInner) {\n                try {\n                  const runner = new ProcessorRunner({\n                    inputProcessors: registryEntryInner.inputProcessors ?? [],\n                    outputProcessors: registryEntryInner.outputProcessors ?? [],\n                    errorProcessors: registryEntryInner.errorProcessors,\n                    logger: logger as any,\n                    agentName: typedInput.agentName ?? typedInput.agentId,\n                    processorStates: registryEntryInner.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: (inputData as any).accumulatedSteps ?? [],\n                    retryCount: processorRetryCount,\n                    requestContext,\n                  });\n                  if (retry) {\n                    processorRetryCount++;\n                    // Error processor retry should NOT consume a model retry attempt.\n                    // Decrement attempt so the `for` loop increment restores it.\n                    attempt--;\n                    continue;\n                  }\n                } catch (processorError) {\n                  logger?.debug?.(`processAPIError handler failed: ${processorError}`, { runId });\n                }\n              }\n\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              const streamErrorObj = streamError instanceof Error ? streamError : new Error(String(streamError));\n              logger?.error?.('Stream captured error', { error: streamErrorObj, runId });\n\n              if (modelSpanTracker) {\n                modelSpanTracker.reportGenerationError({ error: streamErrorObj });\n              } else if (modelSpan) {\n                modelSpan.error({ error: streamErrorObj });\n              }\n\n              // Mirror the iterator catch: a captured stream error that turns out\n              // to be a confirmed abort must short-circuit retry/fallback.\n              const isStreamErrorAbort = executionAbortSignal?.aborted === true || streamErrorObj.name === 'AbortError';\n              if (isStreamErrorAbort) {\n                return {\n                  messageListState: messageList.serialize(),\n                  text: textDeltas.join(''),\n                  toolCalls: [],\n                  stepResult: {\n                    reason: 'abort' as any,\n                    warnings: [],\n                    isContinued: false,\n                  },\n                  metadata: { modelId: currentModel.modelId },\n                  state: typedInput.state,\n                } satisfies DurableLLMStepOutput;\n              }\n\n              lastError = streamErrorObj;\n              if (attempt < maxRetries) continue; // retry same model\n              break; // exhausted retries, try next model\n            }\n\n            // Run `processLLMResponse` for any input processors that implement\n            // it. Pairs with `processLLMRequest`: lets a processor write the\n            // response to a cache (or sink) using state stashed in the request\n            // hook. Skipped on cache hit — that response did not come from the\n            // model, so writing it back would just rewrite the same value.\n            // Mirrors loop/workflows/agentic-execution/llm-execution-step.ts.\n            if (!cachedResponse && requestStepRunner) {\n              try {\n                await requestStepRunner.runProcessLLMResponse({\n                  chunks: collectedChunks,\n                  model: currentModel,\n                  stepNumber: (inputData as any).accumulatedSteps?.length ?? 0,\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  warnings,\n                  request,\n                  rawResponse,\n                  fromCache: false,\n                  retryCount: (inputData as any).processorRetryCount ?? 0,\n                  requestContext,\n                  tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n                  writer: requestStepWriter,\n                  abortSignal: executionAbortSignal,\n                });\n              } catch (error) {\n                if (error instanceof TripWire) {\n                  logger?.warn?.('Streaming response processor tripwire triggered', {\n                    reason: error.message,\n                    processorId: error.processorId,\n                    retry: error.options?.retry,\n                  });\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        processorId: error.processorId,\n                        reason: error.message,\n                        retry: error.options?.retry,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: textDeltas.join(''),\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as const,\n                      warnings,\n                      isContinued: false,\n                    },\n                    metadata: {\n                      modelId: currentModel.modelId,\n                    },\n                    state: typedInput.state,\n                  } satisfies DurableLLMStepOutput;\n                }\n                logger?.error?.('Error in processLLMResponse processors:', error);\n                throw error;\n              }\n            }\n\n            // 12. Add assistant response to message list.\n            // Build parts from the full chunk sequence via the same helper\n            // the regular Agent uses, so reasoning spans (including empty\n            // reasoning with providerMetadata.openai.itemId) are preserved\n            // alongside text and tool-calls in stream order. Without this\n            // OpenAI reasoning models fail on the next turn with\n            // \"Item 'fc_...' of type 'function_call' was provided without\n            // its required 'reasoning' item\" (#19365).\n            //\n            // Mirror the regular Agent's buildResponseModelMetadata so the\n            // persisted assistant message carries the same content.metadata\n            // (modelId/provider): prefer the static model, fall back to the\n            // response-metadata chunk.\n            const responseModelId = currentModel.modelId ?? responseMetadata?.modelId;\n            const responseModelMetadata =\n              responseModelId || currentModel.provider\n                ? {\n                    metadata: {\n                      ...(responseModelId ? { modelId: responseModelId } : {}),\n                      ...(currentModel.provider ? { provider: currentModel.provider } : {}),\n                    },\n                  }\n                : undefined;\n            const builtMessages = buildMessagesFromChunks({\n              chunks: collectedChunks,\n              messageId: currentMessageId,\n              tools: currentTools,\n              responseModelMetadata,\n            });\n            if (builtMessages.length > 0) {\n              for (const msg of builtMessages) {\n                messageList.add(msg, 'response');\n              }\n\n              // Sync the updated messageList to the in-process registry so\n              // downstream steps (e.g. tool-call.ts's doFlush()) see the\n              // assistant message when persisting before suspension.\n              if (registryEntry) {\n                registryEntry.messageList = messageList;\n              }\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            // 13.5. Run processOutputStep for output processors (runs AFTER LLM response, BEFORE tool execution)\n            // Mirrors the regular agent's llm-execution-step.ts processOutputStep call\n            if (effectiveOutputProcessors.length > 0) {\n              const outputStepRunner = new ProcessorRunner({\n                inputProcessors: [],\n                outputProcessors: effectiveOutputProcessors,\n                logger: logger as any,\n                agentName: typedInput.agentName ?? typedInput.agentId,\n                processorStates: registryEntry?.processorStates,\n              });\n\n              const toolCallInfos = toolCalls.map(tc => ({\n                toolName: tc.toolName,\n                toolCallId: tc.toolCallId,\n                args: tc.args,\n              }));\n\n              const outputStepWriter = pubsub\n                ? {\n                    custom: async (data: { type: string }) => {\n                      await emitChunkEvent(pubsub, runId, data as any);\n                    },\n                  }\n                : undefined;\n\n              try {\n                await outputStepRunner.runProcessOutputStep({\n                  steps: (inputData as any).accumulatedSteps ?? [],\n                  messages: messageList.get.all.db(),\n                  messageList,\n                  stepNumber: (inputData as any).accumulatedSteps?.length ?? 0,\n                  finishReason,\n                  providerMetadata: responseMetadata,\n                  toolCalls: toolCallInfos.length > 0 ? toolCallInfos : undefined,\n                  text: textDeltas.join(''),\n                  usage,\n                  requestContext,\n                  tracingContext: modelSpanTracker?.getTracingContext() ?? tracingContext,\n                  writer: outputStepWriter,\n                });\n              } catch (error) {\n                if (error instanceof TripWire) {\n                  // Emit tripwire chunk and return bail response\n                  if (pubsub) {\n                    await emitChunkEvent(pubsub, runId, {\n                      type: 'tripwire',\n                      runId,\n                      from: ChunkFrom.AGENT,\n                      payload: {\n                        reason: error.message,\n                        processorId: error.processorId,\n                        metadata: error.options?.metadata,\n                      },\n                    });\n                  }\n                  return {\n                    messageListState: messageList.serialize(),\n                    text: '',\n                    toolCalls: [],\n                    stepResult: {\n                      reason: 'tripwire' as any,\n                      warnings: [],\n                      isContinued: false,\n                    },\n                    metadata: { modelId: currentModel.modelId },\n                    state: typedInput.state,\n                  };\n                }\n                throw error;\n              }\n            }\n\n            // 13.9. step-finish emission strategy:\n            //\n            // For FINAL steps (no tool calls): emit step-finish now. The assistant\n            // message is in messageList and there are no tool-results to wait for.\n            //\n            // For INTERMEDIATE steps (hasToolCalls): save the step-finish chunk\n            // on the output so llm-mapping can emit it AFTER tool-call.ts has\n            // emitted tool-result chunks. This matches the regular agent's chunk\n            // ordering (tool-result → step-finish) which MastraModelOutput relies\n            // on for correct step content reconstruction.\n            if (pubsub && deferredStepFinishChunk) {\n              if (!hasToolCalls) {\n                // Final step: emit immediately with pre-computed content\n                // Build step content directly from the current step's data rather\n                // than relying on messageList which may contain response messages\n                // from previous iterations after deserialization.\n                const stepContent: Array<{ type: string; [key: string]: unknown }> = [];\n                const currentText = textDeltas.join('');\n                if (currentText) {\n                  stepContent.push({ type: 'text', text: currentText });\n                }\n                deferredStepFinishChunk = {\n                  ...deferredStepFinishChunk,\n                  payload: {\n                    ...deferredStepFinishChunk.payload,\n                    _durableStepContent: stepContent,\n                  },\n                };\n                await emitChunkEvent(pubsub, runId, deferredStepFinishChunk);\n                deferredStepFinishChunk = null;\n              }\n              // else: intermediate step — saved in output.deferredStepFinishChunk below\n            }\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              // For intermediate steps (hasToolCalls), save the deferred step-finish\n              // chunk so llm-mapping can emit it AFTER tool-result chunks.\n              deferredStepFinishChunk: hasToolCalls ? deferredStepFinishChunk : undefined,\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            // TripWire errors from processLLMRequest / processLLMResponse are\n            // guardrail/cache processor decisions, not model failures. They\n            // must not be retried or fall back to the next model.\n            if (error instanceof TripWire) {\n              throw error;\n            }\n\n            lastError = error instanceof Error ? error : new Error(String(error));\n\n            // Confirmed aborts bypass all retry / fallback / processAPIError\n            // handling — the user (or upstream caller) explicitly cancelled the\n            // run and we must terminate immediately rather than burning more\n            // attempts or paying for fallback model calls. Re-derive the signal\n            // from the registry (the inner try-scoped `executionAbortSignal` is\n            // out of scope here).\n            const outerRegistryEntry = globalRunRegistry.get(runId);\n            const outerAbortSignal = outerRegistryEntry?.abortSignal ?? abortSignal;\n            const isAbort = outerAbortSignal?.aborted === true || lastError.name === 'AbortError';\n            if (isAbort) {\n              // Return a clean output instead of throwing so the workflow\n              // engine doesn't crash. The abort event was already emitted\n              // by the inner catch.\n              return {\n                messageListState: messageList.serialize(),\n                text: '',\n                toolCalls: [],\n                stepResult: {\n                  reason: 'abort' as any,\n                  warnings: [],\n                  isContinued: false,\n                },\n                metadata: { modelId: modelEntry.config.modelId },\n                state: typedInput.state,\n              } satisfies DurableLLMStepOutput;\n            }\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            // Error processor retry for non-stream errors (e.g. provider\n            // rejections that throw before the stream opens). Stream-level\n            // errors are already handled in the inner catch above.\n            const registryEntry = globalRunRegistry.get(runId);\n            const canRetryError = maxProcessorRetries !== undefined && processorRetryCount < maxProcessorRetries;\n            if (registryEntry?.errorProcessors?.length && canRetryError) {\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: (inputData as any).accumulatedSteps ?? [],\n                  retryCount: processorRetryCount,\n                  requestContext,\n                  tracingContext,\n                });\n                if (retry) {\n                  processorRetryCount++;\n                  // Error processor retry should NOT consume a model retry attempt.\n                  attempt--;\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 - emit error + step-finish chunks and return a bail response.\n      // This mirrors the regular agent which sets stepResult.reason = 'error' and emits\n      // a deferred error chunk rather than crashing the loop.\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      // Emit the deferred error chunk so consumers see it\n      if (pubsub) {\n        await emitChunkEvent(pubsub, runId, {\n          type: 'error',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: { error: fatalError },\n        });\n\n        // Emit step-finish so MastraModelOutput resolves finishReason to 'error'\n        await emitChunkEvent(pubsub, runId, {\n          type: 'step-finish',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: {\n            stepResult: {\n              reason: 'error',\n              isContinued: false,\n            },\n            output: {\n              usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n            },\n            metadata: {},\n          },\n        });\n      }\n\n      const modelId = modelList[0]?.id ?? 'unknown';\n      return {\n        messageListState: messageList.serialize(),\n        text: '',\n        toolCalls: [],\n        stepResult: {\n          reason: 'error' as any,\n          warnings: [],\n          isContinued: false,\n        },\n        metadata: { modelId },\n        state: typedInput.state,\n      };\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 type { ProcessorState } from '../../../../processors';\nimport { ProcessorRunner } from '../../../../processors/runner';\nimport type { ChunkType } from '../../../../stream/types';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { findProviderToolByName } from '../../../../tools/provider-tool-utils';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport type { SuspendOptions } from '../../../../workflows/step';\nimport { createStep } from '../../../../workflows/workflow';\nimport { stopGoalActivity } from '../../../goal';\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 {\n  DurableToolCallInput,\n  SerializableDurableOptions,\n  AgentSuspendedEventData,\n  RunRegistryEntry,\n} from '../../types';\nimport { applyToolPayloadTransformToChunk } from '../../utils/apply-tool-payload-transform';\nimport { rebuildRunToolsFromMastra, 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  // Approval decision for a `requireApproval` tool. Without this field Zod would strip the\n  // approval off the step output, so a declined call would lose its `output-denied` marker.\n  approval: z\n    .object({\n      id: z.string(),\n      approved: z.boolean(),\n      reason: 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 *\n * Skips entirely when memoryConfig.readOnly is set, mirroring the readOnly\n * guard on the durable finish path — a readOnly run shouldn't get a thread\n * created or messages written just because it happened to suspend mid-run.\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 || memoryConfig?.readOnly) {\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 * Run a tool-result or tool-error chunk through the run's output processor pipeline.\n * Returns the processed chunk (possibly modified), or `null` if a processor blocked it\n * (in which case a tripwire chunk is emitted instead).\n *\n * Mirrors the regular agent's `processAndEnqueueChunk` in llm-mapping-step.ts.\n */\nasync function processChunkThroughOutputProcessors(\n  chunk: ChunkType,\n  registryEntry: RunRegistryEntry | undefined,\n  pubsub: PubSub | undefined,\n  runId: string,\n  agentName: string,\n  logger: any,\n  messageList?: MessageList,\n): Promise<ChunkType | null> {\n  if (!registryEntry?.outputProcessors?.length || !registryEntry.processorStates) {\n    return chunk;\n  }\n\n  try {\n    const runner = new ProcessorRunner({\n      inputProcessors: [],\n      outputProcessors: registryEntry.outputProcessors,\n      logger,\n      agentName,\n      processorStates: registryEntry.processorStates,\n    });\n\n    const {\n      part: processed,\n      blocked,\n      reason,\n      tripwireOptions,\n      processorId,\n    } = await runner.processPart(\n      chunk,\n      registryEntry.processorStates as Map<string, ProcessorState>,\n      undefined, // observabilityContext\n      registryEntry.requestContext,\n      messageList,\n      0,\n      pubsub\n        ? {\n            custom: async (data: { type: string }) => {\n              await emitChunkEvent(pubsub, runId, data as ChunkType);\n            },\n          }\n        : undefined,\n    );\n\n    if (blocked) {\n      // Emit a tripwire chunk so downstream knows about the block\n      if (pubsub) {\n        await emitChunkEvent(pubsub, runId, {\n          type: 'tripwire',\n          payload: {\n            reason: reason || 'Output processor blocked content',\n            retry: tripwireOptions?.retry,\n            metadata: tripwireOptions?.metadata,\n            processorId,\n          },\n        } as ChunkType);\n      }\n      return null;\n    }\n\n    return (processed as ChunkType) ?? null;\n  } catch (error) {\n    logger?.warn?.(`[DurableAgent] Output processor error for tool chunk: ${error}`);\n    // Fall through: emit the original chunk if processor fails\n    return chunk;\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 {\n        inputData,\n        mastra,\n        suspend,\n        resumeData: workflowResumeData,\n        suspendData,\n        requestContext,\n        actor,\n        getInitData,\n      } = 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: rawArgs, providerExecuted, output, activeTools } = typedInput;\n\n      // Extract resumeData from tool call arguments (autoResumeSuspendedTools path)\n      // When the LLM auto-resumes a suspended tool, it injects `resumeData` into the\n      // tool call arguments. We extract it here to skip re-suspending for approval.\n      // Mirrors the regular agent's tool-call-step.ts logic.\n      let resumeDataFromArgs: any = undefined;\n      let args: any = rawArgs;\n      if (typeof rawArgs === 'object' && rawArgs !== null) {\n        const { resumeData: resumeDataFromInput, ...argsFromInput } = rawArgs as Record<string, any>;\n        args = argsFromInput;\n        resumeDataFromArgs = resumeDataFromInput;\n      }\n      const resumeData = resumeDataFromArgs ?? workflowResumeData;\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        requestContextEntries?: Record<string, unknown>;\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<SpanType.MODEL_STEP>)?.end({ output });\n          }\n          if (modelSpanData) {\n            obs.rebuildSpan(modelSpanData as ExportedSpan<SpanType.MODEL_GENERATION>)?.end({ output });\n          }\n          if (agentSpanData) {\n            obs.rebuildSpan(agentSpanData as ExportedSpan<SpanType.AGENT_RUN>)?.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 by provider-tool\n      // model-facing name (e.g. `web_search` resolves to `webSearch` when the\n      // provider tool advertises the snake-case name), then by id, then fall\n      // back to the Mastra-wide tool registry (exact name, provider-tool\n      // name, then by id). Mirrors the non-durable tool-call step.\n      const registryEntry = globalRunRegistry.get(runId);\n      let tool = registryEntry?.tools?.[toolName];\n      let mastraTools: Record<string, any> | undefined;\n      // Tools rebuilt from the Mastra instance when the per-process registry is\n      // empty (cross-process worker). Populated lazily below; reused for\n      // workspace/memory resolution further down.\n      let rebuiltTools: Record<string, any> | undefined;\n      let rebuiltWorkspace: any;\n      let rebuiltMemory: any;\n      let rebuiltSaveQueueManager: any;\n\n      if (!tool) {\n        tool = findProviderToolByName(registryEntry?.tools as any, toolName) as typeof tool;\n      }\n\n      if (!tool) {\n        tool = Object.values(registryEntry?.tools ?? {}).find(\n          (t: any) => t && typeof t === 'object' && 'id' in t && t.id === toolName,\n        ) as typeof tool;\n      }\n\n      if (!tool) {\n        tool = resolveTool(toolName, mastra as Mastra);\n      }\n\n      if (!tool && mastra) {\n        mastraTools = (mastra as Mastra).listTools?.() as Record<string, any> | undefined;\n        if (mastraTools) {\n          tool = findProviderToolByName(mastraTools as any, toolName) as typeof tool;\n          if (!tool) {\n            tool = Object.values(mastraTools).find(\n              (t: any) => t && typeof t === 'object' && 'id' in t && t.id === toolName,\n            ) as typeof tool;\n          }\n        }\n      }\n\n      // Cross-process fallback: workspace/skill tools are per-request closures\n      // never registered at the Mastra-instance level, so the lookups above miss\n      // them when the durable steps run on a separate process (e.g. the\n      // @mastra/inngest connect() worker) whose registry is empty. Rebuild the\n      // full toolset from the agent — the same rebuild the LLM step already does\n      // via resolveRuntimeDependencies — and retry. This is the root-cause fix\n      // for `ToolNotFoundError` on skill/mastra_workspace_* tools cross-process.\n      //\n      // The same rebuild is ALSO the only source of a SaveQueueManager. `createInngestAgent`\n      // registers one on the run-registry entry, but only in the process that called `stream()`;\n      // the connect() worker that actually runs the loop has an empty registry, so\n      // `registryEntry?.saveQueueManager` is undefined there. Without it\n      // `flushMessagesBeforeSuspension()` early-returns and the suspend metadata written by\n      // `addToolMetadata()` is never persisted — a reloading client then sees no pending approval\n      // even though the run is parked. So rebuild when the save queue is missing too, not just\n      // when the tool is.\n      //\n      // Gated on `state?.threadId`: an agent without memory legitimately has no SaveQueueManager\n      // (see preparation.ts — it is only built when `memory` is set), and the flush requires a\n      // threadId regardless. Without this guard every tool call on a memoryless durable run would\n      // pay for a full rebuild to obtain something that can neither exist nor be used.\n      const needsSaveQueueForFlush = !registryEntry?.saveQueueManager && !!state?.threadId;\n      if ((!tool || needsSaveQueueForFlush) && mastra) {\n        const rebuilt = await rebuildRunToolsFromMastra({\n          mastra: mastra as Mastra,\n          runId,\n          agentId: initData.agentId,\n          state: state as any,\n          options: agentOptions,\n          requestContextEntries: initData.requestContextEntries,\n          logger,\n        });\n        if (rebuilt) {\n          rebuiltTools = rebuilt.tools;\n          rebuiltWorkspace = rebuilt.workspace;\n          rebuiltMemory = rebuilt.memory;\n          rebuiltSaveQueueManager = rebuilt.saveQueueManager;\n          // Keep an already-resolved tool: we may have rebuilt purely to obtain the\n          // SaveQueueManager, and the registry's instance is the live per-request closure.\n          if (!tool) {\n            tool = rebuiltTools[toolName] as typeof tool;\n          }\n          if (!tool) {\n            tool = findProviderToolByName(rebuiltTools as any, toolName) as typeof tool;\n          }\n          if (!tool) {\n            tool = Object.values(rebuiltTools).find(\n              (t: any) => t && typeof t === 'object' && 'id' in t && t.id === toolName,\n            ) as typeof tool;\n          }\n        }\n      }\n\n      // Resolve the key the tool is registered under for activeTools filtering.\n      // Prefer the per-run registryEntry key (exact name then identity match),\n      // and fall back to the Mastra-wide registry when the tool was resolved\n      // there. Without this fallback, a globally-registered tool like\n      // `webSearch` invoked by its model-facing name `web_search` would be\n      // hidden whenever `activeTools` was set, because the key from\n      // registryEntry.tools would be `undefined`.\n      const toolKey =\n        registryEntry?.tools?.[toolName] || rebuiltTools?.[toolName]\n          ? toolName\n          : (Object.entries(registryEntry?.tools ?? {}).find(([, registeredTool]) => registeredTool === tool)?.[0] ??\n            Object.entries(rebuiltTools ?? {}).find(([, registeredTool]) => registeredTool === tool)?.[0] ??\n            Object.entries(mastraTools ?? {}).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(rebuiltTools ?? 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. Fall back to the\n      // values rebuilt from Mastra above (cross-process worker), so workspace\n      // tools receive their `workspace` and message flushing still works.\n      const saveQueueManager = registryEntry?.saveQueueManager ?? rebuiltSaveQueueManager;\n      const memory = registryEntry?.memory ?? rebuiltMemory;\n      const workspace = registryEntry?.workspace ?? rebuiltWorkspace;\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 = async () => {\n        await 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\n      // 2. Check if tool requires approval. Prefer the live policy on the\n      //    in-process registry (which preserves the function form with real\n      //    toolName/args); fall back to the JSON-safe boolean shadow on the\n      //    serialized workflow input for cross-process engines.\n      const registryRequireToolApproval = registryEntry?.requireToolApproval;\n      const effectiveRequireToolApproval =\n        registryRequireToolApproval !== undefined ? registryRequireToolApproval : agentOptions.requireToolApproval;\n      const requiresApproval = await toolRequiresApproval(tool, effectiveRequireToolApproval, args, {\n        toolName,\n        requestContext: registryEntry?.requestContext\n          ? Object.fromEntries(\n              [...registryEntry.requestContext.entries()].filter(([key]) => key !== '__mastra_requireToolApproval'),\n            )\n          : undefined,\n        // Use the same rebuilt-workspace fallback as execution (above), so\n        // workspace-aware approval policies see their workspace cross-process.\n        workspace,\n      });\n\n      // Add suspended-tool / pending-approval metadata to the last assistant\n      // message so `extractSuspendedToolsFromMessages` can detect it on the\n      // next turn (autoResumeSuspendedTools) or on page-refresh resume.\n      // Mirrors the regular agent's `addToolMetadata()`.\n      const addToolMetadata = (opts: {\n        type: 'approval' | 'suspension';\n        resumeSchema?: string;\n        suspendPayload?: unknown;\n        delegatedRunId?: string;\n      }) => {\n        if (!messageList) return;\n        const metadataKey = opts.type === 'suspension' ? 'suspendedTools' : 'pendingToolApprovals';\n        const entry = {\n          toolCallId,\n          toolName,\n          args,\n          type: opts.type,\n          // `runId` is the outer resumable durable run. When a delegated\n          // sub-agent/workflow suspends, its inner suspended run is preserved\n          // separately as `delegatedRunId` so the resume leg can recover it\n          // (mirrors the regular engine's tool-call-step metadata shape).\n          runId,\n          ...(opts.delegatedRunId && opts.delegatedRunId !== runId ? { delegatedRunId: opts.delegatedRunId } : {}),\n          ...(opts.type === 'suspension' ? { suspendPayload: opts.suspendPayload } : {}),\n          ...(opts.resumeSchema ? { resumeSchema: opts.resumeSchema } : {}),\n        };\n\n        const carriesToolCall = (msg: any) =>\n          msg.role === 'assistant' &&\n          (msg.content?.parts ?? []).some(\n            (part: any) => part?.type === 'tool-invocation' && part.toolInvocation?.toolCallId === toolCallId,\n          );\n\n        const responseMessages = messageList.get.response.db();\n        const lastAssistantMessage = [...responseMessages].reverse().find(carriesToolCall);\n        if (lastAssistantMessage?.content) {\n          let metadata: Record<string, any>;\n          if (\n            typeof lastAssistantMessage.content.metadata === 'object' &&\n            lastAssistantMessage.content.metadata !== null\n          ) {\n            metadata = lastAssistantMessage.content.metadata as Record<string, any>;\n          } else {\n            metadata = {};\n            lastAssistantMessage.content.metadata = metadata;\n          }\n          metadata[metadataKey] = metadata[metadataKey] || {};\n          metadata[metadataKey][toolCallId] = entry;\n          return;\n        }\n\n        // The response view is empty: a sibling parallel tool call already\n        // suspended and its pre-suspension flush drained the unsaved response\n        // messages. Without a fallback this sibling's entry is silently lost\n        // and only the first suspension survives in persisted metadata. Merge\n        // the entry into the assistant message that carries this tool call via\n        // updateMessageMetadataByToolCallId, which also re-marks the message\n        // unsaved so the following flush persists this write too.\n        const allMessages = messageList.get.all.db();\n        const target = [...allMessages].reverse().find(carriesToolCall);\n        if (!target?.content) {\n          logger?.warn?.(\n            `[DurableAgent] addToolMetadata could not find an assistant message for tool call ${toolCallId} (${toolName}); ${metadataKey} entry was not persisted.`,\n          );\n          return;\n        }\n        const existingMeta =\n          typeof target.content.metadata === 'object' && target.content.metadata !== null\n            ? (target.content.metadata as Record<string, any>)\n            : {};\n        const existingEntries = (existingMeta[metadataKey] ?? {}) as Record<string, any>;\n        messageList.updateMessageMetadataByToolCallId(toolCallId, {\n          [metadataKey]: { ...existingEntries, [toolCallId]: entry },\n        });\n      };\n\n      // Remove suspended-tool / pending-approval metadata from the last\n      // assistant message when a tool is being resumed. This mirrors the\n      // regular agent's `removeToolMetadata()`.\n      const removeToolMetadata = async (type: 'suspension' | 'approval') => {\n        if (!messageList) return;\n        const metadataKey = type === 'suspension' ? 'suspendedTools' : 'pendingToolApprovals';\n        const allMessages = messageList.get.all.db();\n        const lastAssistantMessage = [...allMessages].reverse().find(msg => {\n          const content = msg.content;\n          if (!content) return false;\n          const meta =\n            typeof content.metadata === 'object' && content.metadata !== null\n              ? (content.metadata as Record<string, any>)\n              : undefined;\n          return (\n            !!meta?.[metadataKey]?.[toolCallId] ||\n            Object.values(meta?.[metadataKey] ?? {}).some(\n              (e: any) => e?.toolCallId === toolCallId || e?.toolName === toolName,\n            )\n          );\n        });\n        if (!lastAssistantMessage?.content) return;\n        const meta =\n          typeof lastAssistantMessage.content.metadata === 'object' && lastAssistantMessage.content.metadata !== null\n            ? (lastAssistantMessage.content.metadata as Record<string, any>)\n            : undefined;\n        if (!meta?.[metadataKey]) return;\n        // Resolve key: exact toolCallId, then by entry toolCallId, then by toolName\n        const entries = meta[metadataKey] as Record<string, any>;\n        const key = entries[toolCallId]\n          ? toolCallId\n          : (Object.keys(entries).find(k => entries[k]?.toolCallId === toolCallId) ??\n            Object.keys(entries).find(k => entries[k]?.toolName === toolName) ??\n            (entries[toolName] ? toolName : undefined));\n        if (key) {\n          delete entries[key];\n          if (Object.keys(entries).length === 0) {\n            delete meta[metadataKey];\n          }\n        }\n        // Flush to persist the metadata removal\n        await doFlush();\n      };\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        // Persist active goal time before exposing the approval wait.\n        await stopGoalActivity({ agentId: initData.agentId, runId });\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        // Add approval metadata to message before persisting\n        addToolMetadata({ type: 'approval', resumeSchema });\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 — only when the tool actually requires\n      // approval.  Without the `requiresApproval` guard, generic resume data that\n      // happens to contain an `approved` field (e.g. from context.agent.suspend())\n      // would be misinterpreted as an approval response.\n      if (\n        requiresApproval &&\n        resumeData &&\n        typeof resumeData === 'object' &&\n        resumeData !== null &&\n        'approved' in resumeData\n      ) {\n        // Remove approval metadata since we're resuming (either approved or declined)\n        await removeToolMetadata('approval');\n\n        if (!(resumeData as { approved: boolean }).approved) {\n          // Return the approval decision (not a `result` string) so it persists as\n          // `state: 'output-denied'` with `approval`. The denial reason carries the\n          // existing string so downstream consumers/UI keep the same message.\n          return {\n            ...typedInput,\n            approval: {\n              id: toolCallId,\n              approved: false,\n              reason: 'Tool call was not approved by the user',\n            },\n          };\n        }\n      }\n\n      // When an approval-gated tool is approved on resume, tag the resolved output with the\n      // approval decision so it round-trips through persistence as `approval: { approved: true }`.\n      const approvalGrant =\n        requiresApproval &&\n        resumeData &&\n        typeof resumeData === 'object' &&\n        resumeData !== null &&\n        (resumeData as { approved?: boolean }).approved === true\n          ? ({ approval: { id: toolCallId, approved: true as const } } as const)\n          : undefined;\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      // For approval-gated tools, only an object with an `approved` field is an\n      // approval decision; any other defined resume data is forwarded from an\n      // in-execution suspension.\n      const isResumingFromSuspension =\n        resumeData !== undefined &&\n        !(requiresApproval && typeof resumeData === 'object' && resumeData !== null && 'approved' in resumeData);\n\n      // Remove suspension metadata when resuming from an in-execution (non-approval-decision) suspension.\n      // `isResumingFromSuspension` already excludes the approval-decision case above.\n      if (isResumingFromSuspension) {\n        await removeToolMetadata('suspension');\n      }\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      // When resuming a delegated sub-agent/workflow tool, recover the inner\n      // suspended run id from this tool call's workflow suspend payload. The\n      // payload is partitioned by resumeLabel, so parallel calls to the same\n      // delegate cannot select each other's run. Auto-resume calls already pass\n      // suspendedToolRunId in their arguments and keep that value unchanged.\n      const isResumableTool = toolName?.startsWith('agent-') || toolName?.startsWith('workflow-');\n      const suspendedToolRunId = (suspendData as { suspendedToolRunId?: unknown } | undefined)?.suspendedToolRunId;\n      // When the delegation tool is itself approval-gated, an `{ approved: true }`\n      // resume is ambiguous: it can answer this step's pre-execution gate (execute\n      // fresh) or a delegated approval raised mid-execution by the sub-agent. The\n      // suspend payload disambiguates — only the delegated approval persists an\n      // inner suspended run id, so its decision must resume that inner run.\n      const isDelegatedApprovalResume = !!approvalGrant && isResumableTool && typeof suspendedToolRunId === 'string';\n      if (\n        (isResumingFromSuspension || isDelegatedApprovalResume) &&\n        isResumableTool &&\n        !cleanedArgs.suspendedToolRunId &&\n        typeof suspendedToolRunId === 'string'\n      ) {\n        cleanedArgs.suspendedToolRunId = suspendedToolRunId;\n      }\n\n      // Fire onInputAvailable lifecycle hook before execution (matches non-durable path).\n      if (tool && 'onInputAvailable' in tool && typeof (tool as any).onInputAvailable === 'function') {\n        try {\n          await (tool as any).onInputAvailable({\n            toolCallId,\n            input: cleanedArgs,\n            messages: messageList ? messageList.get.input.aiV5.model() : [],\n          });\n        } catch (hookError) {\n          logger?.error?.('Error calling onInputAvailable', hookError);\n        }\n      }\n\n      // Execute the tool\n      if (!tool.execute) {\n        return {\n          ...typedInput,\n          result: undefined,\n          ...(approvalGrant ?? {}),\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<SpanType.MODEL_STEP>)\n          : undefined;\n      const toolTracingContext = stepSpan ? { currentSpan: stepSpan } : undefined;\n\n      // Track whether the tool's suspend callback was invoked so we can skip\n      // emitting a spurious tool-result after tool.execute() returns (the\n      // workflow engine's suspend() sets an internal flag but does not throw,\n      // so execution continues past the suspend call).\n      let wasSuspended = false;\n\n      // Forward abort signal from the run registry so tools can observe\n      // cancellation (mirrors the non-durable tool-call-step).\n      const toolAbortSignal = registryEntry?.abortSignal;\n\n      const toolOptions = {\n        toolCallId,\n        messages: [],\n        workspace,\n        requestContext,\n        tracingContext: toolTracingContext,\n        // Use the actor supplied for this workflow segment. A resumed segment\n        // must never recover the initial actor from serialized agent options.\n        actor,\n        // Delegated approval decisions must also flow to the wrapper tool: it only\n        // resumes the inner suspended run when resumeData is present.\n        resumeData: isResumingFromSuspension || isDelegatedApprovalResume ? resumeData : undefined,\n        ...(toolAbortSignal ? { abortSignal: toolAbortSignal } : {}),\n        // Provide outputWriter so context.writer.write() / context.writer.custom()\n        // emit chunks through pubsub (matching the regular agent's tool streaming).\n        outputWriter: pubsub\n          ? async (chunk: any) => {\n              await emitChunkEvent(pubsub, runId, chunk as ChunkType);\n            }\n          : undefined,\n\n        // In-execution suspend callback — allows tools to suspend mid-execution\n        suspend: async (suspendPayload: any, suspendOptions?: SuspendOptions) => {\n          wasSuspended = true;\n          // When a delegated sub-agent requests approval, the delegation tool\n          // wrapper passes its inner suspended run id via `suspendOptions.runId`\n          // (see the agent-tool wrapper's `suspend(..., { runId, isAgentSuspend })`).\n          // Persist it with the approval so the resume leg targets that inner\n          // run instead of restarting the sub-agent from scratch.\n          const delegatedRunId =\n            typeof suspendOptions?.runId === 'string' && suspendOptions.runId !== runId\n              ? suspendOptions.runId\n              : undefined;\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            await stopGoalActivity({ agentId: initData.agentId, runId });\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            // Add approval metadata to message before persisting\n            addToolMetadata({ type: 'approval', resumeSchema: approvalResumeSchema, delegatedRunId });\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                // Persist the inner suspended run id in the workflow snapshot,\n                // partitioned per tool call (resumeLabel = toolCallId), so the\n                // resume leg can recover it even if message metadata is stale.\n                ...(delegatedRunId ? { suspendedToolRunId: delegatedRunId } : {}),\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            // Add suspension metadata to message before persisting\n            addToolMetadata({\n              type: 'suspension',\n              suspendPayload,\n              resumeSchema: suspendOptions?.resumeSchema,\n              delegatedRunId,\n            });\n\n            await doFlush();\n\n            endSpansAsSuspended({ toolCallId, toolName, reason: 'suspension' });\n\n            return suspend(\n              {\n                type: 'suspension',\n                toolCallSuspended: suspendPayload,\n                toolCallId,\n                toolName,\n                resumeLabel: suspendOptions?.resumeLabel,\n                // Persist the inner suspended run id in the workflow snapshot,\n                // partitioned per tool call (resumeLabel = toolCallId), so the\n                // resume leg continues the delegate's suspended run instead of\n                // restarting it (#20496; mirrors the approval branch above).\n                ...(delegatedRunId ? { suspendedToolRunId: delegatedRunId } : {}),\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                      outputWriter: async (chunk: any) => {\n                        await taskContext?.onProgress?.(chunk);\n                        return toolOptions.outputWriter?.(chunk);\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                        // A failed background task is recorded as `output-error` with the\n                        // message in `errorText`; a successful one keeps `state: 'result'`.\n                        ...(params.status === 'failed'\n                          ? { state: 'output-error' as const, errorText: result }\n                          : { state: 'result' as const, result }),\n                        toolCallId: params.toolCallId,\n                        toolName: params.toolName,\n                        args: cleanedArgs,\n                        // Preserve the approval decision for an approved approval-gated tool that\n                        // ran in the background so it round-trips on recall, matching the sync path.\n                        ...(approvalGrant ?? {}),\n                      },\n                    },\n                    {\n                      mode: 'stream',\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 && !state?.memoryConfig?.readOnly) {\n                    await saveQueueManager.flushMessages(messageList, state.threadId, state.memoryConfig);\n                  }\n                },\n\n                onExecution: async (params: any) => {\n                  if (!messageList) return;\n\n                  messageList.updateMessageMetadataByToolCallId(params.toolCallId, {\n                    mode: 'stream',\n                    backgroundTasks: {\n                      [params.toolCallId]: {\n                        startedAt: params.startedAt,\n                        suspendedAt: params.suspendedAt,\n                        taskId: params.taskId,\n                      },\n                    },\n                  });\n\n                  // Flush to storage so the metadata update (especially suspendedAt)\n                  // is persisted. Unlike the regular agent which has a single long-lived\n                  // messageList, the durable agent's workflow state is serialized before\n                  // this async callback fires, so we must flush directly.\n                  if (saveQueueManager && state?.threadId && !state?.memoryConfig?.readOnly) {\n                    await saveQueueManager.flushMessages(messageList, state.threadId, state.memoryConfig);\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 isPreviouslyRunning = await bgTask.checkIfRunning({\n              toolCallId,\n              runId,\n              agentId: initData.agentId,\n              threadId: state?.threadId,\n              resourceId: state?.resourceId,\n              toolName,\n            });\n\n            if (isPreviouslyRunning) {\n              const task = await bgTask.restart();\n              return {\n                ...typedInput,\n                args: cleanedArgs,\n                result: `Background task restarted. Task ID: ${task.id}. The tool \"${toolName}\" is running in the background. You will be notified when it completes.`,\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                ...(approvalGrant ?? {}),\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        // Fire onOutput lifecycle hook after successful execution (matches non-durable path).\n        if (tool && 'onOutput' in tool && typeof (tool as any).onOutput === 'function') {\n          try {\n            await (tool as any).onOutput({\n              toolCallId,\n              toolName,\n              output: result,\n            });\n          } catch (hookError) {\n            logger?.error?.('Error calling onOutput', hookError);\n          }\n        }\n\n        // Emit tool-result chunk (non-fatal — result is returned regardless).\n        // Skip emission when the tool called suspend() — the workflow engine's\n        // suspend() sets a flag but does NOT throw, so execution continues past\n        // the suspend call and tool.execute() returns undefined. Emitting a\n        // tool-result with undefined would produce a spurious entry that\n        // confuses downstream consumers (e.g. MastraModelOutput.toolResults).\n        if (pubsub && !wasSuspended) {\n          try {\n            const resultChunk = await applyToolPayloadTransformToChunk(\n              {\n                type: 'tool-result' as const,\n                runId,\n                from: ChunkFrom.AGENT,\n                payload: { toolCallId, toolName, args, result },\n              },\n              {\n                policy: registryEntry?.toolPayloadTransform,\n                tools: registryEntry?.tools,\n                logger: logger as any,\n              },\n            );\n            // Run through output processors (tripwire/blocking/redaction)\n            const processed = await processChunkThroughOutputProcessors(\n              resultChunk,\n              registryEntry,\n              pubsub,\n              runId,\n              initData.agentId,\n              logger,\n              messageList,\n            );\n            if (processed) {\n              await emitChunkEvent(pubsub, runId, processed);\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          ...(approvalGrant ?? {}),\n        };\n      } catch (error) {\n        // Re-throw FGA authorization errors instead of swallowing them —\n        // an authorization denial must fail the run, not be serialized as a\n        // recoverable tool error for the LLM to retry (mirrors the\n        // non-durable tool-call step).\n        if (error instanceof Error && error.name === 'FGADeniedError') {\n          throw error;\n        }\n        const toolError = serializeError(error);\n\n        // Emit tool-error chunk (non-fatal — error result is returned regardless)\n        if (pubsub && !wasSuspended) {\n          try {\n            const errorChunk = await applyToolPayloadTransformToChunk(\n              {\n                type: 'tool-error' as const,\n                runId,\n                from: ChunkFrom.AGENT,\n                payload: { toolCallId, toolName, args, error: toolError },\n              },\n              {\n                policy: registryEntry?.toolPayloadTransform,\n                tools: registryEntry?.tools,\n                logger: logger as any,\n              },\n            );\n            // Run through output processors (tripwire/blocking/redaction)\n            const processed = await processChunkThroughOutputProcessors(\n              errorChunk,\n              registryEntry,\n              pubsub,\n              runId,\n              initData.agentId,\n              logger,\n              messageList,\n            );\n            if (processed) {\n              await emitChunkEvent(pubsub, runId, processed);\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          ...(approvalGrant ?? {}),\n        };\n      }\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { Mastra } from '../../../../mastra';\nimport { EntityType, SpanType } from '../../../../observability';\nimport type { ExportedSpan } from '../../../../observability';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\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  delegationBailed: z.boolean().optional(),\n  processorRetryCount: z.number().optional(),\n  processorRetryFeedback: z.string().optional(),\n});\n\n/**\n * Normalize modelOutput from toModelOutput() into the AI SDK's\n * LanguageModelV2ToolResultOutput shape.\n *\n * The AI SDK's content array only accepts type 'text' or 'media'.\n * Mastra's createTool docs show type 'image-url' as a convenience shorthand,\n * so we normalize that here into type 'media' with the correct structure.\n *\n * Mirrors the normalizeModelOutput in llm-mapping-step.ts (regular agent).\n */\nfunction normalizeModelOutput(output: unknown): unknown {\n  if (output == null || typeof output !== 'object') return output;\n\n  const obj = output as Record<string, unknown>;\n  if (obj.type !== 'content' || !Array.isArray(obj.value)) return output;\n\n  return {\n    ...obj,\n    value: (obj.value as unknown[]).map(item => {\n      if (item == null || typeof item !== 'object') return item;\n      const part = item as Record<string, unknown>;\n      if (part.type === 'image-url' && typeof part.url === 'string') {\n        const mediaType =\n          typeof part.mediaType === 'string' && part.mediaType\n            ? part.mediaType\n            : part.url.startsWith('data:')\n              ? part.url.slice(5, part.url.indexOf(';')) || 'image/jpeg'\n              : 'image/jpeg';\n        return { type: 'media', data: part.url, mediaType };\n      }\n      if (part.type === 'image-data' && typeof part.data === 'string') {\n        return { type: 'media', data: part.data, mediaType: part.mediaType ?? 'image/jpeg' };\n      }\n      if (part.type === 'file-data' && typeof part.data === 'string') {\n        return { type: 'media', data: part.data, mediaType: part.mediaType ?? 'application/octet-stream' };\n      }\n      return part;\n    }),\n  };\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 params => {\n      const { inputData, mastra, requestContext } = params;\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      // A declined approval has no `result` but is fully resolved: persist it as `output-denied`\n      // with the approval decision (rather than as a successful `result`) so it round-trips on\n      // recall. Mirrors the non-durable llm-mapping-step.\n      const isDeniedApproval = (toolResult: { approval?: { approved?: boolean } }) =>\n        toolResult?.approval?.approved === false;\n\n      // 2. Add tool results to message list\n      // Look up tools from the in-process registry for toModelOutput support\n      const registryEntry = globalRunRegistry.get(_runId);\n      const registryTools = registryEntry?.tools;\n\n      // Rebuild the MODEL_STEP span early so MAPPING child spans can nest under it\n      let stepSpan:\n        | ReturnType<\n            NonNullable<\n              ReturnType<NonNullable<NonNullable<Mastra['observability']>['getSelectedInstance']>>\n            >['rebuildSpan']\n          >\n        | undefined;\n      if (llmOutput.stepSpanData) {\n        try {\n          const observability = (mastra as Mastra | undefined)?.observability?.getSelectedInstance({ requestContext });\n          stepSpan = observability?.rebuildSpan(llmOutput.stepSpanData as ExportedSpan<SpanType.MODEL_STEP>);\n        } catch {\n          // Span bookkeeping must never break the merge step.\n        }\n      }\n\n      if (toolResults.length > 0) {\n        for (const toolResult of toolResults) {\n          if (isDeniedApproval(toolResult)) {\n            messageList.updateToolInvocation({\n              type: 'tool-invocation' as const,\n              toolInvocation: {\n                state: 'output-denied' as const,\n                toolCallId: toolResult.toolCallId,\n                toolName: toolResult.toolName,\n                args: toolResult.args,\n                approval: {\n                  id: toolResult.approval!.id,\n                  approved: false,\n                  reason: toolResult.approval!.reason,\n                },\n              },\n            });\n            continue;\n          }\n\n          const result = toolResult.error ? toolResult.error.message : toolResult.result;\n\n          // Compute toModelOutput for successful tool results (Bug 9 parity).\n          // Start from the existing providerMetadata so it's preserved even when\n          // toModelOutput is absent or fails — otherwise provider-executed tools\n          // or tools without a mapper lose their metadata.\n          let providerMetadata: Record<string, unknown> | undefined = toolResult.providerMetadata as\n            | Record<string, unknown>\n            | undefined;\n          if (!toolResult.error && toolResult.result != null && !toolResult.providerExecuted) {\n            const tool = registryTools?.[toolResult.toolName] as\n              | { toModelOutput?: (output: unknown) => unknown }\n              | undefined;\n\n            if (tool?.toModelOutput) {\n              const mappingSpan = stepSpan?.createChildSpan({\n                type: SpanType.MAPPING,\n                name: `tool output mapping: '${toolResult.toolName}'`,\n                entityType: EntityType.TOOL,\n                entityId: toolResult.toolName,\n                entityName: toolResult.toolName,\n                input: toolResult.result,\n                attributes: {\n                  mappingType: 'toModelOutput',\n                  toolCallId: toolResult.toolCallId,\n                },\n              });\n              try {\n                let modelOutput = await tool.toModelOutput(toolResult.result);\n                modelOutput = normalizeModelOutput(modelOutput);\n                mappingSpan?.end({ output: modelOutput });\n\n                // A nullish return means \"no special mapping needed\" — the raw result is\n                // already what the model should see (see read-file.ts / sandboxToModelOutput).\n                // Writing the key anyway would make the consumer in MessageList (which keys\n                // off presence) override the real result with `undefined`, producing a tool\n                // message with no `output`. Mirrors the non-durable llm-mapping-step.\n                if (modelOutput != null) {\n                  const existingMastra = (toolResult.providerMetadata as any)?.mastra;\n                  providerMetadata = {\n                    ...toolResult.providerMetadata,\n                    mastra: { ...existingMastra, modelOutput },\n                  };\n                }\n              } catch (err) {\n                mappingSpan?.error({ error: err as Error, endSpan: true });\n                // toModelOutput errors are non-fatal — the tool result is still usable\n                (mastra as Mastra | undefined)\n                  ?.getLogger?.()\n                  ?.warn?.(`[DurableAgent] toModelOutput failed for tool \"${toolResult.toolName}\": ${err}`);\n              }\n            }\n          }\n\n          const updated = messageList.updateToolInvocation({\n            type: 'tool-invocation' as const,\n            toolInvocation: {\n              // A tool error must be recorded as `output-error` with the message in\n              // `errorText` so the transcript/adapters read it as a failure rather than\n              // a normal result. Successful results keep `state: 'result'` + `result`.\n              ...(toolResult.error\n                ? { state: 'output-error' as const, errorText: toolResult.error.message }\n                : { state: 'result' as const, result }),\n              toolCallId: toolResult.toolCallId,\n              toolName: toolResult.toolName,\n              args: toolResult.args,\n              // Preserve the approval decision for an approved approval-gated tool so it\n              // round-trips on recall as `approval: { approved: true }`.\n              ...(toolResult.approval ? { approval: toolResult.approval } : {}),\n            },\n            ...(providerMetadata ? { providerMetadata: providerMetadata as any } : {}),\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      // 2b. Sync the updated messageList back to the in-process registry.\n      // The durable workflow deserializes a fresh MessageList on every step,\n      // so updates (output-denied, tool results) are invisible to other\n      // steps that read from the registry — in particular tool-call.ts's\n      // doFlush() which persists messages before suspension. Without this\n      // sync, a declined tool's output-denied state would never reach memory\n      // if the workflow re-suspends on a subsequent iteration.\n      if (registryEntry) {\n        registryEntry.messageList = messageList;\n      }\n\n      // 3. Determine if we should continue\n      // When tool errors occur, always continue the agentic loop so the model\n      // can see the error messages (already added to messageList above) and\n      // self-correct. This matches the regular agent's behaviour where both\n      // ToolNotFoundError and generic tool execution errors are recoverable.\n      const hasToolErrors = toolResults.some(r => r.error !== undefined);\n      const isContinued = hasToolErrors ? true : llmOutput.stepResult.isContinued;\n\n      // Check if any delegation hook called ctx.bail(). The bail flag is\n      // communicated via requestContext because Zod output validation strips\n      // unknown fields from the tool result. We read it here and propagate\n      // it on the serializable output so the dowhile predicate can stop.\n      let delegationBailed = false;\n      if (requestContext?.get('__mastra_delegationBailed')) {\n        delegationBailed = true;\n        requestContext.set('__mastra_delegationBailed', false);\n      }\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        delegationBailed,\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      // The span was already rebuilt earlier so MAPPING child spans could nest under it.\n      if (stepSpan) {\n        try {\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      // Emit the deferred step-finish chunk for intermediate steps.\n      // llm-execution defers step-finish emission for tool-calling steps so that\n      // it arrives AFTER tool-result chunks (emitted by tool-call.ts). This\n      // matches the regular agent's chunk ordering which MastraModelOutput\n      // relies on for correct step content reconstruction in onStepFinish.\n      const deferredChunk = llmOutput.deferredStepFinishChunk as any;\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      if (deferredChunk && pubsub) {\n        try {\n          // Build step content directly from this iteration's data.\n          // We cannot rely on messageList.get.response.aiV5.modelContent(-1)\n          // because each durable step deserializes a fresh MessageList, so\n          // the MastraModelOutput's reference is stale. Instead, construct\n          // the content array from the LLM output (text + tool calls) and\n          // the tool results collected in this step.\n          const stepContent: unknown[] = [];\n          if (llmOutput.text) {\n            stepContent.push({ type: 'text', text: llmOutput.text });\n          }\n          for (const tc of llmOutput.toolCalls ?? []) {\n            stepContent.push({\n              type: 'tool-call',\n              toolCallId: tc.toolCallId,\n              toolName: tc.toolName,\n              args: tc.args,\n            });\n          }\n          for (const tr of toolResults ?? []) {\n            stepContent.push({\n              type: 'tool-result',\n              toolCallId: tr.toolCallId,\n              toolName: tr.toolName,\n              result: tr.error ? tr.error.message : tr.result,\n              ...(tr.error ? { isError: true } : {}),\n            });\n          }\n\n          const enrichedChunk = {\n            ...deferredChunk,\n            payload: {\n              ...deferredChunk.payload,\n              _durableStepContent: stepContent,\n            },\n          };\n          await emitChunkEvent(pubsub, _runId, enrichedChunk);\n        } catch (error) {\n          (mastra as Mastra | undefined)\n            ?.getLogger?.()\n            ?.warn?.(`[DurableAgent] Failed to emit deferred step-finish: ${error}`);\n        }\n      }\n\n      return output;\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { IsTaskCompleteRunResult, MastraDBMessage } from '../../../../agent';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { StreamCompletionContext } from '../../../../loop/network/validation';\nimport { formatStreamCompletionFeedback, runStreamCompletionScorers } from '../../../../loop/network/validation';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport { DurableAgentDefaults, DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\n/**\n * Create the durable isTaskComplete step.\n *\n * Mirrors the non-durable `createIsTaskCompleteStep` contract:\n *  - Runs after each agentic iteration has settled its tool calls.\n *  - Only scores iterations where the LLM has signaled it is done\n *    (`lastStepResult.isContinued === false`) so we don't interrupt mid-loop\n *    tool execution.\n *  - Skips working-memory-only iterations (same heuristic as the non-durable\n *    step) — those are bookkeeping, not user-visible task progress.\n *  - Pulls the scorer instances + `onComplete` closure from the in-process run\n *    registry. They can't survive the wire, so cross-process engines (Inngest\n *    after a worker restart) simply skip this step and fall back to\n *    `maxSteps` + `stopWhen`.\n *  - On a verdict it flips `state.lastStepResult.isContinued` so the outer\n *    `dowhile` predicate either stops the loop (passed) or runs one more LLM\n *    iteration (not passed). Feedback (when not suppressed) is appended as an\n *    assistant message so the next LLM call can see it.\n *  - Emits an `is-task-complete` chunk via pubsub so external observers see\n *    the verdict and payload exactly like the non-durable path.\n */\nexport function createDurableIsTaskCompleteStep(defaultMaxSteps: number = DurableAgentDefaults.MAX_STEPS) {\n  // The step is a pass-through over the IterationState — we mutate\n  // `lastStepResult.isContinued` and `messageListState` in place when a\n  // verdict requires it. We use `z.any()` instead of the iteration schema to\n  // avoid coupling this step to whichever extended schema each workflow uses\n  // (core's IterationState extends the base shape with `modelList`).\n  return createStep({\n    id: DurableStepIds.IS_TASK_COMPLETE,\n    inputSchema: z.any(),\n    outputSchema: z.any(),\n    execute: async params => {\n      const { inputData, mastra, getInitData } = params;\n      const state = inputData as {\n        runId: string;\n        iterationCount: number;\n        messageListState: any;\n        accumulatedSteps: Array<{\n          text?: string;\n          toolCalls?: Array<{ toolName?: string; args?: unknown }>;\n          toolResults?: Array<{ toolName?: string; result?: unknown }>;\n        }>;\n        lastStepResult?: { isContinued?: boolean };\n        options?: { maxSteps?: number };\n        backgroundTaskPending?: boolean;\n      };\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      const initData = getInitData() as {\n        agentId?: string;\n        agentName?: string;\n        state?: { threadId?: string; resourceId?: string };\n        requestContextEntries?: Record<string, unknown>;\n      };\n\n      const registryEntry = globalRunRegistry.get(state.runId);\n      const isTaskComplete = registryEntry?.isTaskComplete;\n      const hasScorers = !!isTaskComplete?.scorers && isTaskComplete.scorers.length > 0;\n\n      // Fast path — nothing to do without a registered policy.\n      if (!hasScorers || !isTaskComplete) {\n        return state;\n      }\n\n      // Don't interrupt mid-tool loops. The non-durable step has the same\n      // guard via `inputData.stepResult?.isContinued`.\n      const llmSignaledDone = state.lastStepResult?.isContinued === false;\n      if (!llmSignaledDone) {\n        return state;\n      }\n\n      // The background-task-check step may set backgroundTaskPending=true to\n      // force one more LLM iteration after a task settles. Skip scoring in\n      // that case so we don't double-score the same outcome.\n      if (state.backgroundTaskPending) {\n        return state;\n      }\n\n      const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n      const iterationToolCalls = (lastStep?.toolCalls ?? []) as Array<{\n        toolName?: string;\n        args?: unknown;\n      }>;\n      const isWorkingMemoryToolName = (name?: string) =>\n        name === 'updateWorkingMemory' || name === 'setWorkingMemory' || name === 'update-working-memory';\n      const allWorkingMemory =\n        iterationToolCalls.length > 0 && iterationToolCalls.every(tc => isWorkingMemoryToolName(tc.toolName));\n      if (allWorkingMemory) {\n        return state;\n      }\n\n      const runMaxSteps = state.options?.maxSteps ?? defaultMaxSteps;\n\n      // Rehydrate the message list once so we can read the original task and\n      // append feedback after scoring.\n      const messageList = new MessageList();\n      messageList.deserialize(state.messageListState);\n      const userMessages = messageList.get.input.db();\n      const firstUserMessage = userMessages[0];\n      let originalTask = 'Unknown task';\n      if (firstUserMessage) {\n        if (typeof firstUserMessage.content === 'string') {\n          originalTask = firstUserMessage.content;\n        } else if ((firstUserMessage.content as any)?.parts?.[0]?.type === 'text') {\n          originalTask = ((firstUserMessage.content as any).parts[0] as { text: string }).text;\n        }\n      }\n\n      const toolResultsForCtx = (lastStep?.toolResults ?? []) as Array<{\n        toolName?: string;\n        result?: unknown;\n      }>;\n\n      const ctx: StreamCompletionContext = {\n        iteration: state.iterationCount,\n        maxIterations: runMaxSteps,\n        originalTask,\n        currentText: lastStep?.text || '',\n        toolCalls: iterationToolCalls.map(tc => ({\n          name: tc.toolName || '',\n          args: (tc.args as Record<string, unknown>) ?? {},\n        })),\n        messages: messageList.get.all.db(),\n        toolResults: toolResultsForCtx.map(tr => ({\n          name: tr.toolName || '',\n          result: (tr.result as Record<string, unknown>) ?? {},\n        })),\n        agentId: initData.agentId || '',\n        agentName: initData.agentName || '',\n        runId: state.runId,\n        threadId: initData.state?.threadId,\n        resourceId: initData.state?.resourceId,\n        customContext: initData.requestContextEntries,\n      };\n\n      let result: IsTaskCompleteRunResult | undefined;\n      try {\n        result = await runStreamCompletionScorers(isTaskComplete.scorers!, ctx, {\n          strategy: isTaskComplete.strategy,\n          parallel: isTaskComplete.parallel,\n          timeout: isTaskComplete.timeout,\n        });\n      } catch (err) {\n        mastra?.getLogger?.()?.warn?.(`[DurableAgent] isTaskComplete scoring failed: ${err}`);\n        return state;\n      }\n\n      if (!result) {\n        return state;\n      }\n\n      if (isTaskComplete.onComplete) {\n        try {\n          await isTaskComplete.onComplete(result);\n        } catch (err) {\n          mastra?.getLogger?.()?.warn?.(`[DurableAgent] isTaskComplete onComplete callback failed: ${err}`);\n        }\n      }\n\n      const maxIterationReached = runMaxSteps ? state.iterationCount >= runMaxSteps : false;\n\n      // Flip isContinued based on the verdict so the outer dowhile predicate\n      // continues (not complete) or stops (complete). This is the contract\n      // the non-durable createIsTaskCompleteStep uses.\n      const nextState: typeof state = { ...state };\n      if (nextState.lastStepResult) {\n        nextState.lastStepResult = {\n          ...nextState.lastStepResult,\n          isContinued: !result.complete,\n        };\n      }\n\n      // Append the feedback as an assistant message so the next LLM iteration\n      // can course-correct. Skipped when the check passes, mirroring the\n      // non-durable createIsTaskCompleteStep.\n      if (!result.complete) {\n        const feedback = formatStreamCompletionFeedback(result, maxIterationReached);\n        messageList.add(\n          {\n            id: mastra?.generateId?.(),\n            createdAt: new Date(),\n            type: 'text',\n            role: 'assistant',\n            content: {\n              parts: [{ type: 'text', text: feedback }],\n              metadata: {\n                mode: 'stream',\n                completionResult: {\n                  passed: result.complete,\n                  suppressFeedback: !!isTaskComplete.suppressFeedback,\n                },\n              },\n              format: 2,\n            },\n          } as MastraDBMessage,\n          'response',\n        );\n      }\n      nextState.messageListState = messageList.serialize();\n\n      if (pubsub) {\n        try {\n          await emitChunkEvent(pubsub, state.runId, {\n            type: 'is-task-complete',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              iteration: state.iterationCount,\n              passed: result.complete,\n              results: result.scorers,\n              duration: result.totalDuration,\n              timedOut: result.timedOut,\n              reason: result.completionReason,\n              maxIterationReached,\n              suppressFeedback: !!isTaskComplete.suppressFeedback,\n            },\n          } as any);\n        } catch {\n          // PubSub may be closed — fall through.\n        }\n      }\n\n      return nextState;\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { MastraScorer } from '../../../../evals';\nimport type { PubSub } from '../../../../events/pubsub';\nimport { resolveModelConfig } from '../../../../llm';\nimport type { MastraLanguageModel } from '../../../../llm/model/shared.types';\nimport { runStreamCompletionScorers } from '../../../../loop/network/validation';\nimport type { StreamCompletionContext } from '../../../../loop/network/validation';\nimport { createProcessorSendSignal } from '../../../../processors/send-signal';\nimport { RequestContext } from '../../../../request-context';\nimport type { GoalObjectiveRecord } from '../../../../storage/domains/thread-state/base';\nimport type { ChunkType, GoalEvaluationActivity } from '../../../../stream/types';\nimport { ChunkFrom } from '../../../../stream/types';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport type { ResolvedGoalStore } from '../../../goal';\nimport {\n  createGoalScorer,\n  GOAL_SCORE_WAITING,\n  GOAL_SCORER_ID,\n  readObjective,\n  resolveEffectiveGoalSettings,\n  resolveGoalStore,\n  writeObjective,\n} from '../../../goal';\nimport { MessageList } from '../../../message-list';\nimport type { ToolsInput } from '../../../types';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\nfunction isWorkingMemoryTool(name: string): boolean {\n  return name === 'updateWorkingMemory' || name === 'setWorkingMemory' || name === 'update-working-memory';\n}\n\nfunction formatJudgeActivityName(name: string | undefined): string | undefined {\n  if (!name) return undefined;\n  if (name === 'view') return 'read';\n  if (name === 'search_content') return 'search';\n  if (name === 'find_files') return 'find files';\n  if (name === 'file_stat') return 'stat';\n  if (name === 'lsp_inspect') return 'inspect';\n  return name;\n}\n\nfunction getStringArg(args: unknown, key: string): string | undefined {\n  if (!args || typeof args !== 'object' || Array.isArray(args)) return undefined;\n  const value = (args as Record<string, unknown>)[key];\n  return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction truncateActivityDetail(value: string): string {\n  return value.length > 80 ? `${value.slice(0, 77)}...` : value;\n}\n\nfunction extractPartialReasonFromStructuredText(text: string): string | undefined {\n  const match = text.match(/\"reason\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)/);\n  const partialReason = match?.[1];\n  if (!partialReason) return undefined;\n  return partialReason.replace(/\\\\n/g, '\\n').replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\').trim();\n}\n\nfunction formatJudgeActivityMessage(name: string | undefined, args: unknown): string | undefined {\n  const label = formatJudgeActivityName(name);\n  if (!label) return undefined;\n\n  if (name === 'view' || name === 'file_stat') {\n    const path = getStringArg(args, 'path');\n    return path ? `${label} ${truncateActivityDetail(path)}` : label;\n  }\n\n  if (name === 'search_content') {\n    const pattern = getStringArg(args, 'pattern');\n    const path = getStringArg(args, 'path');\n    const detail = [pattern, path].filter(Boolean).join(' in ');\n    return detail ? `${label} ${truncateActivityDetail(detail)}` : label;\n  }\n\n  if (name === 'find_files') {\n    const path = getStringArg(args, 'path');\n    const pattern = getStringArg(args, 'pattern');\n    const detail = [path, pattern].filter(Boolean).join(' ');\n    return detail ? `${label} ${truncateActivityDetail(detail)}` : label;\n  }\n\n  if (name === 'lsp_inspect') {\n    const path = getStringArg(args, 'path');\n    const line =\n      !args || typeof args !== 'object' || Array.isArray(args) ? undefined : (args as Record<string, unknown>).line;\n    const detail = path ? `${path}${typeof line === 'number' ? `:${line}` : ''}` : undefined;\n    return detail ? `${label} ${truncateActivityDetail(detail)}` : label;\n  }\n\n  return label;\n}\n\n/**\n * Create the durable goal step.\n *\n * Mirrors the non-durable `createGoalStep` contract:\n *  - Runs after `isTaskCompleteStep` in the `singleIterationWorkflow`.\n *  - Only evaluates iterations where the LLM has signaled it is done\n *    (`lastStepResult.isContinued === false`) so we don't interrupt mid-loop\n *    tool execution.\n *  - Skips background-pending, working-memory-only iterations (same\n *    heuristic as the non-durable step).\n *  - Pulls the `goal` config from the in-process run registry (closures\n *    like `judge`, `scorer`, `tools` can't survive the wire). Cross-process\n *    engines without this slot skip goal evaluation.\n *  - Reads/writes the `GoalObjectiveRecord` from/to thread state storage.\n *  - Emits `goal` chunks via pubsub so external observers see the verdict.\n *  - Injects system-reminder + goal feedback into `messageList` via\n *    `createProcessorSendSignal` so the next LLM iteration can see it.\n */\nexport function createDurableGoalStep() {\n  return createStep({\n    id: 'durable-goal',\n    inputSchema: z.any(),\n    outputSchema: z.any(),\n    execute: async params => {\n      const { inputData, mastra, getInitData } = params;\n      const state = inputData as {\n        runId: string;\n        iterationCount: number;\n        messageListState: any;\n        messageId: string;\n        accumulatedSteps: Array<{\n          text?: string;\n          toolCalls?: Array<{ toolName?: string; args?: unknown }>;\n          toolResults?: Array<{ toolName?: string; result?: unknown }>;\n        }>;\n        lastStepResult?: { isContinued?: boolean; reason?: string };\n        options?: { maxSteps?: number };\n        backgroundTaskPending?: boolean;\n      };\n      if (state.lastStepResult?.reason === 'error') return state;\n\n      const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n      const initData = getInitData() as {\n        agentId?: string;\n        agentName?: string;\n        state?: { threadId?: string; resourceId?: string };\n        requestContextEntries?: Record<string, unknown>;\n      };\n\n      const registryEntry = globalRunRegistry.get(state.runId);\n      // This is shared agent configuration (judge, scorer, tools, defaults), not per-goal state.\n      // The objective and its progress are isolated by thread and loaded from storage below.\n      let goalConfig = registryEntry?.goal;\n      if (!goalConfig && initData.agentId) {\n        goalConfig = (mastra as any)?.getAgentById?.(initData.agentId)?.__getGoalConfig?.();\n      }\n\n      // No goal mode configured → nothing to do.\n      if (!goalConfig) return state;\n\n      // Same gating as isTaskComplete: skip background results, mid-tool-loop\n      // continuations, and working-memory-only iterations.\n      if (state.backgroundTaskPending || state.lastStepResult?.isContinued) {\n        return state;\n      }\n\n      const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n      const iterationToolCalls = (lastStep?.toolCalls ?? []) as Array<{\n        toolName?: string;\n        args?: unknown;\n      }>;\n      if (iterationToolCalls.length > 0 && iterationToolCalls.every(tc => isWorkingMemoryTool(tc.toolName ?? ''))) {\n        return state;\n      }\n\n      const threadId = initData.state?.threadId;\n\n      // Reconstruct requestContext from serialized entries for resolvers.\n      const requestContext = new RequestContext();\n      if (initData.requestContextEntries) {\n        for (const [key, value] of Object.entries(initData.requestContextEntries)) {\n          requestContext.set(key, value);\n        }\n      }\n\n      const store = (await resolveGoalStore(mastra as any)) as ResolvedGoalStore | undefined;\n      const record = await readObjective(store, threadId);\n\n      // No active objective → no gating, no chunk.\n      if (!record || record.status !== 'active' || !store || !threadId) {\n        return state;\n      }\n\n      const effective = resolveEffectiveGoalSettings(record, {\n        judgeModelId: typeof goalConfig.judge === 'string' ? goalConfig.judge : undefined,\n        maxRuns: goalConfig.maxRuns,\n        prompt: goalConfig.prompt,\n        maxSteps: goalConfig.maxSteps,\n      });\n\n      // Defensive budget guard.\n      const nextState: typeof state = { ...state };\n      if (record.runsUsed >= effective.maxRuns) {\n        if (nextState.lastStepResult) {\n          nextState.lastStepResult = {\n            ...nextState.lastStepResult,\n            isContinued: false,\n          };\n        }\n        if (pubsub) {\n          try {\n            await emitChunkEvent(pubsub, state.runId, {\n              type: 'goal',\n              runId: state.runId,\n              from: ChunkFrom.AGENT,\n              payload: {\n                objective: record.objective,\n                iteration: record.runsUsed,\n                maxRuns: effective.maxRuns,\n                passed: false,\n                status: record.status,\n                results: [],\n                reason: undefined,\n                duration: 0,\n                timedOut: false,\n                maxRunsReached: true,\n                suppressFeedback: false,\n                shouldContinue: false,\n              },\n            } as any);\n          } catch {\n            // PubSub may be closed — fall through.\n          }\n        }\n        return nextState;\n      }\n\n      // Determine the judge model config. A non-string agent `goalConfig.judge` (a\n      // resolved model or a model-resolver function) takes precedence.\n      const nonStringAgentJudge =\n        goalConfig.judge && typeof goalConfig.judge !== 'string' ? goalConfig.judge : undefined;\n\n      let judgeModelConfig: unknown = nonStringAgentJudge ?? effective.judgeModelId;\n      if (typeof judgeModelConfig === 'function') {\n        judgeModelConfig = await (judgeModelConfig as (args: any) => unknown)({ requestContext, mastra });\n      }\n      if (!judgeModelConfig) {\n        return state;\n      }\n\n      // Evaluate the goal. Catch any failure to prevent infinite loops.\n      let result: Awaited<ReturnType<typeof runStreamCompletionScorers>>;\n      try {\n        const emitJudgeActivity = (activity: GoalEvaluationActivity, args?: unknown) => {\n          const name =\n            activity.type === 'reason' ? activity.name : formatJudgeActivityName(activity.name ?? activity.message);\n          const message =\n            activity.type === 'reason'\n              ? activity.message\n              : formatJudgeActivityMessage(activity.name ?? activity.message, args);\n          if (!message || !pubsub) return;\n          emitChunkEvent(pubsub, state.runId, {\n            type: 'goal',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              objective: record.objective,\n              iteration: record.runsUsed + 1,\n              maxRuns: effective.maxRuns,\n              passed: false,\n              status: record.status,\n              results: [],\n              duration: 0,\n              timedOut: false,\n              maxRunsReached: false,\n              suppressFeedback: true,\n              pending: true,\n              activity: [{ ...activity, name, message }],\n            },\n          } as any).catch(() => {});\n        };\n\n        const observeJudgeStream = (stream: { fullStream?: AsyncIterable<ChunkType> }) => {\n          if (!stream.fullStream) return;\n          void (async () => {\n            try {\n              let streamedText = '';\n              let lastReason = '';\n              for await (const chunk of stream.fullStream!) {\n                if (chunk.type === 'text-delta') {\n                  streamedText += (chunk as any).payload?.text ?? '';\n                  const reason = extractPartialReasonFromStructuredText(streamedText);\n                  if (reason && reason !== lastReason) {\n                    lastReason = reason;\n                    emitJudgeActivity({ type: 'reason', message: reason });\n                  }\n                } else if (chunk.type === 'tool-call') {\n                  emitJudgeActivity(\n                    {\n                      type: 'tool-call',\n                      name: (chunk as any).payload?.toolName,\n                      message: (chunk as any).payload?.toolName,\n                    },\n                    (chunk as any).payload?.args,\n                  );\n                }\n              }\n            } catch {\n              // The scorer owns structured-output fallback and error reporting.\n              // Judge activity streaming is best-effort UI feedback and must not\n              // turn a recoverable scorer stream failure into an unhandled rejection.\n            }\n          })();\n        };\n\n        // Resolve the scorer.\n        let scorer: MastraScorer<any, any, any, any> | undefined;\n        if (goalConfig.scorer) {\n          scorer =\n            typeof goalConfig.scorer === 'string'\n              ? (mastra?.getScorer?.(goalConfig.scorer as any) as MastraScorer<any, any, any, any> | undefined)\n              : goalConfig.scorer;\n        }\n        if (!scorer) {\n          const judgeModel = (\n            typeof judgeModelConfig === 'string'\n              ? await resolveModelConfig(judgeModelConfig, requestContext, mastra)\n              : judgeModelConfig\n          ) as MastraLanguageModel;\n\n          const goalTools: ToolsInput | undefined =\n            typeof goalConfig.tools === 'function'\n              ? ((await (goalConfig.tools as (args: any) => unknown)({ requestContext, mastra })) as\n                  | ToolsInput\n                  | undefined)\n              : goalConfig.tools;\n\n          scorer = createGoalScorer({\n            mastra,\n            judgeModel,\n            prompt: effective.prompt,\n            tools: goalTools,\n            requestContext,\n            onStream: observeJudgeStream,\n            ...(effective.maxSteps ? { maxSteps: effective.maxSteps } : {}),\n          });\n        }\n\n        // Build scorer context.\n        const messageList = new MessageList();\n        messageList.deserialize(state.messageListState);\n\n        const toolCalls = (lastStep?.toolCalls ?? []) as Array<{ toolName?: string; args?: unknown }>;\n        const toolResults = (lastStep?.toolResults ?? []) as Array<{ toolName?: string; result?: unknown }>;\n        const goalContext: StreamCompletionContext = {\n          iteration: record.runsUsed + 1,\n          maxIterations: effective.maxRuns,\n          originalTask: record.objective,\n          currentText: lastStep?.text || '',\n          toolCalls: toolCalls.map(tc => ({\n            name: tc.toolName || '',\n            args: (tc.args || {}) as Record<string, unknown>,\n          })),\n          messages: messageList.get.all.db(),\n          toolResults: toolResults.map(tr => ({\n            name: tr.toolName || '',\n            result: (tr.result as Record<string, unknown>) ?? {},\n          })),\n          agentId: initData.agentId || '',\n          agentName: initData.agentName || '',\n          runId: state.runId,\n          threadId,\n          resourceId: initData.state?.resourceId,\n          customContext: initData.requestContextEntries,\n        };\n\n        // Emit a pending chunk so consumers can show a loading indicator.\n        if (pubsub) {\n          emitChunkEvent(pubsub, state.runId, {\n            type: 'goal',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: {\n              objective: record.objective,\n              iteration: record.runsUsed + 1,\n              maxRuns: effective.maxRuns,\n              passed: false,\n              status: record.status,\n              results: [],\n              duration: 0,\n              timedOut: false,\n              maxRunsReached: false,\n              suppressFeedback: true,\n              pending: true,\n            },\n          } as any).catch(() => {});\n        }\n\n        result = await runStreamCompletionScorers([scorer], goalContext, { strategy: 'all' });\n      } catch (error: any) {\n        const reason = `Goal evaluation failed: ${error?.message ?? String(error)}`;\n        result = {\n          complete: false,\n          completionReason: undefined,\n          scorers: [\n            {\n              score: 0,\n              passed: false,\n              reason,\n              scorerId: GOAL_SCORER_ID,\n              scorerName: 'Goal (LLM)',\n              duration: 0,\n              errored: true,\n            },\n          ],\n          totalDuration: 0,\n          timedOut: false,\n        };\n      }\n\n      // Tri-state decision: done / waiting / keep working / errored.\n      const erroredScorer = result.scorers.find(s => s.errored);\n      const judgeFailed = !!erroredScorer;\n      const waiting =\n        !judgeFailed &&\n        !result.complete &&\n        result.scorers.some(s => s.scorerId === GOAL_SCORER_ID && s.score === GOAL_SCORE_WAITING);\n\n      // Increment runs and update status.\n      const runsUsed = record.runsUsed + 1;\n      const maxRunsReached = runsUsed >= effective.maxRuns;\n      let status: GoalObjectiveRecord['status'] = record.status;\n      let pausedReason: string | undefined;\n      if (judgeFailed) {\n        status = 'paused';\n        pausedReason = erroredScorer?.reason ?? 'The goal judge failed to evaluate the objective.';\n      } else if (result.complete) {\n        status = 'done';\n      } else if (maxRunsReached && !waiting) {\n        status = 'paused';\n        pausedReason = `Ran out of evaluation budget (${effective.maxRuns} runs) before reaching the goal — raise maxRuns to resume.`;\n      }\n\n      const updated: GoalObjectiveRecord = {\n        ...record,\n        runsUsed,\n        status,\n        pausedReason: status === 'paused' ? pausedReason : undefined,\n        updatedAt: Date.now(),\n      };\n      await writeObjective(store, threadId, updated, requestContext);\n\n      // Continuation decision.\n      const shouldContinue = !result.complete && !waiting && !judgeFailed && !maxRunsReached;\n      if (nextState.lastStepResult) {\n        nextState.lastStepResult = {\n          ...nextState.lastStepResult,\n          isContinued: shouldContinue,\n        };\n      }\n\n      const suppressFeedback = false;\n      const goalEvaluationPayload = {\n        objective: record.objective,\n        iteration: runsUsed,\n        maxRuns: effective.maxRuns,\n        passed: result.complete,\n        status,\n        pausedReason,\n        judgeFailed,\n        waitingForUser: waiting,\n        results: result.scorers,\n        reason: status === 'paused' ? pausedReason : result.completionReason,\n        duration: result.totalDuration,\n        timedOut: result.timedOut,\n        maxRunsReached,\n        suppressFeedback,\n        shouldContinue,\n      };\n\n      // Inject feedback into messageList via signal so the next LLM call sees it.\n      const messageList = new MessageList();\n      messageList.deserialize(nextState.messageListState);\n\n      let currentMessageId = nextState.messageId;\n      const sendSignal = createProcessorSendSignal({\n        messageList,\n        writer: pubsub\n          ? {\n              custom: async (data, _options) => {\n                await emitChunkEvent(pubsub, state.runId, data as ChunkType);\n              },\n            }\n          : undefined,\n        rotateResponseMessageId: () => {\n          currentMessageId = mastra?.generateId?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n          nextState.messageId = currentMessageId;\n          return currentMessageId;\n        },\n      });\n\n      const feedback = result.completionReason ?? 'The goal is not yet complete.';\n      const continuation = shouldContinue\n        ? `[Goal attempt ${runsUsed}/${effective.maxRuns}] The goal is not yet complete. Judge feedback: ${feedback}\\n\\nContinue working toward the goal: ${record.objective}`\n        : `${status} (${runsUsed}/${effective.maxRuns})\\n${goalEvaluationPayload.reason ?? ''}`;\n      await sendSignal({\n        type: 'system-reminder',\n        contents: continuation,\n        attributes: { type: 'goal-judge' },\n        metadata: { goalEvaluation: goalEvaluationPayload },\n      });\n\n      // Re-serialize messageList after signal injection.\n      nextState.messageListState = messageList.serialize();\n\n      // Emit the final goal chunk for external observers.\n      if (pubsub) {\n        try {\n          await emitChunkEvent(pubsub, state.runId, {\n            type: 'goal',\n            runId: state.runId,\n            from: ChunkFrom.AGENT,\n            payload: goalEvaluationPayload,\n          } as any);\n        } catch {\n          // PubSub may be closed — fall through.\n        }\n      }\n\n      return nextState;\n    },\n  });\n}\n","import { z } from 'zod';\nimport type { PubSub } from '../../../../events/pubsub';\nimport type { Mastra } from '../../../../mastra';\nimport { PUBSUB_SYMBOL } from '../../../../workflows/constants';\nimport { createStep } from '../../../../workflows/workflow';\nimport { MessageList } from '../../../message-list';\nimport { DurableStepIds } from '../../constants';\nimport { globalRunRegistry } from '../../run-registry';\nimport { emitChunkEvent } from '../../stream-adapter';\n\nconst SIGNAL_DRAIN_STEP_ID = `${DurableStepIds.AGENTIC_EXECUTION}-signal-drain`;\n\n/**\n * Create a durable signal drain step.\n *\n * Mirrors the regular agent's `signalDrainStep` which sits between\n * backgroundTaskCheckStep and isTaskCompleteStep:\n * - Drains any signals queued while tool execution was running\n * - Adds drained signals to the messageList transcript\n * - Emits signal chunks via pubsub for the stream adapter\n * - Sets isContinued=true so the LLM processes the signals on the next turn\n * - Best-effort: swallows errors so signals remain queued on failure\n */\nexport function createDurableSignalDrainStep() {\n  return createStep({\n    id: SIGNAL_DRAIN_STEP_ID,\n    inputSchema: z.any(),\n    outputSchema: z.any(),\n    execute: async params => {\n      const { inputData, getInitData } = params;\n      const execOutput = inputData as Record<string, any>;\n      const initData = getInitData<{ runId: string }>();\n      const runId = initData.runId;\n      const registryEntry = globalRunRegistry.get(runId);\n      const drainFn = registryEntry?.drainPendingSignals;\n\n      if (!drainFn) return execOutput;\n\n      try {\n        const pendingSignals = drainFn('pending');\n        if (pendingSignals.length === 0) return execOutput;\n\n        const drainList = new MessageList();\n        drainList.deserialize(execOutput.messageListState);\n        drainList.markResponseMessageBoundary(execOutput.messageId);\n\n        const nextMessageId =\n          (params.mastra as Mastra | undefined)?.generateId?.() ??\n          globalThis.crypto?.randomUUID?.() ??\n          `msg_${Date.now()}`;\n\n        const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n        for (const pendingSignal of pendingSignals) {\n          const signalForTranscript = drainList.addSignal(pendingSignal);\n          if (pubsub) {\n            await emitChunkEvent(pubsub, runId, signalForTranscript.toDataPart() as any);\n          }\n        }\n\n        return {\n          ...execOutput,\n          messageListState: drainList.serialize(),\n          messageId: nextMessageId,\n          stepResult: {\n            ...execOutput.stepResult,\n            messageId: nextMessageId,\n            isContinued: true,\n          },\n        };\n      } catch {\n        // Signal drain is best-effort; drainPendingSignals() is inside\n        // the try so signals remain queued if it throws.\n        return execOutput;\n      }\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 { pruneAgentLoopSnapshot } from '../../../loop/workflows/prune-snapshot';\nimport type { Mastra } from '../../../mastra';\nimport { createObservabilityContext, InternalSpans } from '../../../observability';\nimport type { AIModelGenerationSpan, ExportedSpan, SpanType } from '../../../observability';\nimport { RequestContext } from '../../../request-context';\nimport { PUBSUB_SYMBOL } from '../../../workflows/constants';\nimport { createWorkflow } from '../../../workflows/create';\nimport { MessageList } from '../../message-list';\nimport { DurableStepIds, DurableAgentDefaults } from '../constants';\nimport { globalRunRegistry } from '../run-registry';\nimport { emitChunkEvent, emitFinishEvent, emitIterationCompleteEvent } 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  resolveDurableToolCallConcurrency,\n} from './shared';\nimport {\n  createDurableBackgroundTaskCheckStep,\n  createDurableGoalStep,\n  createDurableIsTaskCompleteStep,\n  createDurableLLMExecutionStep,\n  createDurableToolCallStep,\n  createDurableLLMMappingStep,\n  createDurableSignalDrainStep,\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  // JSON-safe snapshot of requestContext.entries() so durable steps can read\n  // it (e.g. is-task-complete scorers pass it as customContext).\n  requestContextEntries: z.record(z.string(), 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<typeof iterationStateSchema>;\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 signal drain step — mirrors the non-durable `signalDrainStep`\n  // which drains signals queued during tool execution.\n  const signalDrainStep = createDurableSignalDrainStep();\n\n  // Create the isTaskComplete evaluation step (mirrors the non-durable\n  // createIsTaskCompleteStep). Lives as a real step (not predicate logic)\n  // so it shows up in workflow traces and produces a proper state transition.\n  const isTaskCompleteStep = createDurableIsTaskCompleteStep(maxSteps);\n\n  // Create the goal evaluation step — mirrors the non-durable\n  // `createGoalStep`. Runs after isTaskComplete so the goal judge\n  // sees whether isTaskComplete already stopped the loop.\n  const goalStep = createDurableGoalStep();\n\n  // Create the single iteration workflow (LLM -> Tool Calls -> Mapping)\n  // Note: tool-call foreach concurrency is resolved per run at execution time\n  // (see resolveDurableToolCallConcurrency) — approval/suspend flows force\n  // sequential execution; otherwise the run's `toolCallConcurrency` applies.\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: params => {\n        // We need a persisted snapshot record to support both:\n        //  - `resumeStream()` after a suspend (records with status\n        //    `pending` / `paused` / `suspended`)\n        //  - boot-time recovery of orphaned RUNNING runs after a process\n        //    restart, via `DurableAgent.recoverActiveRuns()` — this requires\n        //    the row to actually be stamped `running` while the loop is\n        //    in-flight (issue #19056).\n        //\n        // The engine's persist path guards against overwriting a `suspended`\n        // / `paused` snapshot with a later `running` update from the same\n        // run (see `persistStepUpdate` in workflows/handlers/entry.ts), so\n        // it is safe to return true for `running` here.\n        return (\n          params.workflowStatus === 'pending' ||\n          params.workflowStatus === 'paused' ||\n          params.workflowStatus === 'suspended' ||\n          params.workflowStatus === 'running'\n        );\n      },\n      // Agent-loop snapshots are pure resume artifacts — strip everything a\n      // resume never reads before persisting.\n      pruneSnapshot: pruneAgentLoopSnapshot,\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    // Concurrency is resolved per run from the serialized iteration state:\n    // approval/suspend-capable tool sets run sequentially, everything else\n    // honors the run's `toolCallConcurrency` (default 10). The workflow graph\n    // is shared across runs, so this must be a resolver — never a mutated\n    // shared options object.\n    .foreach(toolCallStep, {\n      concurrency: ({ inputData, getInitData }) => {\n        const state = getInitData() as IterationState | undefined;\n        return resolveDurableToolCallConcurrency({\n          options: state?.options,\n          toolsMetadata: state?.toolsMetadata,\n          toolCalls: inputData as DurableToolCallInput[],\n        });\n      },\n    })\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 6.5: Drain signals that were queued while tool execution was running\n    // within this iteration. Mirrors the non-durable `signalDrainStep` which\n    // sits between backgroundTaskCheckStep and isTaskCompleteStep.\n    .then(signalDrainStep)\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    // Step 8: Evaluate user-supplied isTaskComplete scorers (if any). Runs as\n    // a real step so it shows up in traces and may mutate lastStepResult /\n    // messageListState before the dowhile predicate decides whether to loop\n    // again. No-op when the run has no policy configured.\n    .then(isTaskCompleteStep)\n    // Step 9: Goal evaluation. Mirrors the non-durable createGoalStep — judges\n    // whether the thread's active objective is satisfied or should continue.\n    // No-op when no goal is configured or no active objective exists.\n    .then(goalStep)\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: params => {\n          // See the singleIterationWorkflow comment above — same policy for\n          // the outer loop. The persist path guards against overwriting a\n          // suspended snapshot with running.\n          return (\n            params.workflowStatus === 'pending' ||\n            params.workflowStatus === 'paused' ||\n            params.workflowStatus === 'suspended' ||\n            params.workflowStatus === 'running'\n          );\n        },\n        // Agent-loop snapshots are pure resume artifacts — strip everything a\n        // resume never reads before persisting.\n        pruneSnapshot: pruneAgentLoopSnapshot,\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 params => {\n        const { inputData, mastra } = params;\n        const state = inputData as IterationState;\n        const initData = params.getInitData() as DurableAgenticWorkflowInput;\n        const pubsub = (params as any)[PUBSUB_SYMBOL] as PubSub | undefined;\n        const registryEntry = globalRunRegistry.get(state.runId);\n\n        // ── Abort check ────────────────────────────────────────────────\n        // If the abort signal has fired, stop the loop immediately.\n        // The llm-execution step may have already emitted the ABORT event\n        // and returned a clean output, but the signal may also have fired\n        // between steps (e.g. inside a tool). Override the stepResult\n        // reason so the FINISH event carries 'abort' and the client sees\n        // the correct finishReason.\n        if (registryEntry?.abortSignal?.aborted) {\n          if (state.lastStepResult) {\n            state.lastStepResult.reason = 'abort';\n            state.lastStepResult.isContinued = false;\n          }\n          return false;\n        }\n\n        // Two-phase stop: if onIterationComplete returned { continue: false, feedback }\n        // on the previous iteration, we allowed one more LLM turn with that feedback.\n        // Now that the turn has completed, stop the loop unconditionally.\n        let hasFinishedSteps = false;\n        // Hard-stop tracks reasons that onIterationComplete must NOT override.\n        // pendingFeedbackStop and delegationBailed are unconditional stops.\n        let hardStop = false;\n        if (state.pendingFeedbackStop) {\n          hasFinishedSteps = true;\n          hardStop = true;\n          state.pendingFeedbackStop = false;\n        }\n\n        // Continuation check. isTaskComplete (when configured) runs as a\n        // proper step inside singleIterationWorkflow and may have already\n        // flipped lastStepResult.isContinued by the time we get here.\n        // Declared as `let` because signal drain may force isContinued later.\n        let shouldContinue = state.lastStepResult?.isContinued === true;\n        const runMaxSteps = state.options?.maxSteps ?? maxSteps;\n        const underMaxSteps = state.iterationCount < runMaxSteps;\n\n        // Evaluate user-supplied stopWhen predicate(s) parked on the registry\n        // up-front so we can include them in the finality decision emitted on\n        // the iteration-complete event. The predicate is a closure and can't\n        // survive the wire, so we read it from in-process state. Cross-process\n        // engines (Inngest after worker restart) won't have the registry entry\n        // and fall back to maxSteps only.\n        let stopWhenMatched = false;\n        if (shouldContinue && underMaxSteps && !hasFinishedSteps) {\n          const stopWhen = registryEntry?.stopWhen;\n          if (stopWhen && state.accumulatedSteps.length > 0) {\n            const conditions = Array.isArray(stopWhen) ? stopWhen : [stopWhen];\n            // Mirror agentic-loop: cast steps to any for v5/v6 StopCondition shape\n            // compatibility — the StepRecord we accumulate is sufficient at runtime.\n            const steps = state.accumulatedSteps as any;\n            const results = await Promise.all(conditions.map(condition => condition({ steps })));\n            stopWhenMatched = results.some(Boolean);\n          }\n        }\n\n        if (stopWhenMatched) {\n          hasFinishedSteps = true;\n        }\n\n        // Check if a delegation hook called ctx.bail() during this iteration.\n        // The flag was set by the mapping step and propagated via iteration state.\n        const delegationBailed = !!(state as any).delegationBailed;\n        if (delegationBailed) {\n          hasFinishedSteps = true;\n          hardStop = true;\n          // Reset the flag so it doesn't carry forward\n          (state as any).delegationBailed = false;\n        }\n\n        // ── Inter-iteration signal drain ──────────────────────────────\n        // Mirror the non-durable agentic-loop predicate: drain pending\n        // signals that were queued while the previous iteration was\n        // running. If signals are present, mark a response boundary,\n        // rotate the messageId, add them to the transcript, emit them\n        // to the stream, and force continuation so the LLM sees them.\n        if (pubsub && registryEntry?.drainPendingSignals) {\n          try {\n            const pendingSignals = registryEntry.drainPendingSignals('pending');\n            if (pendingSignals.length > 0) {\n              const drainList = new MessageList();\n              drainList.deserialize(state.messageListState);\n              drainList.markResponseMessageBoundary();\n\n              const nextMessageId =\n                (mastra as Mastra | undefined)?.generateId?.() ??\n                globalThis.crypto?.randomUUID?.() ??\n                `msg_${Date.now()}`;\n              state.messageId = nextMessageId;\n\n              for (const pendingSignal of pendingSignals) {\n                const signalForTranscript = drainList.addSignal(pendingSignal);\n                await emitChunkEvent(pubsub, state.runId, signalForTranscript.toDataPart() as any);\n              }\n\n              state.messageListState = drainList.serialize();\n\n              // Force continuation — the LLM must see the injected signals\n              if (state.lastStepResult) {\n                state.lastStepResult.isContinued = true;\n              }\n              shouldContinue = true;\n            }\n          } catch {\n            // Signal drain is best-effort; if deserialization fails\n            // the next iteration still runs with the un-drained state.\n            // drainPendingSignals() is inside the try so signals remain\n            // queued if the drain function itself throws.\n          }\n        }\n\n        let isFinal = !shouldContinue || !underMaxSteps || hasFinishedSteps;\n\n        // Call onIterationComplete hook if provided (for every iteration, not\n        // just continued ones). Mirrors the regular agentic-loop predicate:\n        // the handler can return { continue: false } to stop, { continue: true }\n        // to force-continue (if under maxSteps), and/or { feedback } to inject\n        // a message before the next turn.\n        const onIterationComplete = registryEntry?.onIterationComplete;\n        if (onIterationComplete && !state.backgroundTaskPending) {\n          const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n\n          try {\n            // Deserialize messageList for the callback's messages snapshot\n            const callbackMessageList = new MessageList();\n            try {\n              callbackMessageList.deserialize(state.messageListState);\n            } catch {\n              // If deserialization fails, callback sees empty messages\n            }\n\n            const iterationContext = {\n              iteration: state.accumulatedSteps.length,\n              maxIterations: runMaxSteps,\n              text: lastStep?.text ?? '',\n              toolCalls: (lastStep?.toolCalls ?? []).map((tc: any) => ({\n                id: tc.toolCallId || tc.id || '',\n                name: tc.toolName || tc.name || '',\n                args: (tc.args || {}) as Record<string, unknown>,\n              })),\n              toolResults: (lastStep?.toolResults ?? []).map((tr: any) => ({\n                id: tr.toolCallId || tr.id || '',\n                name: tr.toolName || tr.name || '',\n                result: tr.result,\n                error: tr.error,\n              })),\n              isFinal,\n              finishReason: lastStep?.finishReason ?? 'unknown',\n              runId: state.runId,\n              threadId: initData.state?.threadId,\n              resourceId: initData.state?.resourceId,\n              agentId: state.agentId,\n              agentName: state.agentName ?? state.agentId,\n              messages: callbackMessageList.get.all.db(),\n            };\n\n            const iterationResult = await onIterationComplete(iterationContext);\n\n            if (iterationResult) {\n              // Determine whether we can run another turn. Hard stops\n              // (pendingFeedbackStop, delegationBailed) are unconditional —\n              // onIterationComplete cannot override them.\n              const canRunAnotherTurn =\n                !hardStop && underMaxSteps && (shouldContinue || iterationResult.continue === true);\n\n              if (iterationResult.feedback && canRunAnotherTurn) {\n                // Inject feedback as a synthetic assistant message so the LLM\n                // sees it on the next turn. Mirror the regular agent: mark it\n                // with completionResult.suppressFeedback so isTaskComplete\n                // scorers skip it.\n                const feedbackId =\n                  (mastra as Mastra | undefined)?.generateId?.() ??\n                  globalThis.crypto?.randomUUID?.() ??\n                  `msg_${Date.now()}`;\n                callbackMessageList.add(\n                  {\n                    id: feedbackId,\n                    createdAt: new Date(),\n                    type: 'text',\n                    role: 'assistant',\n                    content: {\n                      parts: [{ type: 'text', text: iterationResult.feedback }],\n                      metadata: {\n                        mode: 'stream',\n                        completionResult: { suppressFeedback: true },\n                      },\n                      format: 2,\n                    },\n                  } as any,\n                  'response',\n                );\n                // Re-serialize the updated messageList\n                state.messageListState = callbackMessageList.serialize();\n\n                if (iterationResult.continue === false) {\n                  // Two-phase stop: let one more LLM turn run with the feedback,\n                  // then stop on the next predicate evaluation.\n                  state.pendingFeedbackStop = true;\n                  isFinal = false;\n                } else if (!hasFinishedSteps && underMaxSteps) {\n                  isFinal = false;\n                  if (state.lastStepResult) {\n                    state.lastStepResult.isContinued = true;\n                  }\n                }\n              } else if (iterationResult.continue === false && !hasFinishedSteps) {\n                hasFinishedSteps = true;\n                isFinal = true;\n              } else if (iterationResult.continue === true && !hardStop && (hasFinishedSteps || !shouldContinue)) {\n                if (underMaxSteps || !runMaxSteps) {\n                  hasFinishedSteps = false;\n                  isFinal = false;\n                  if (state.lastStepResult) {\n                    state.lastStepResult.isContinued = true;\n                  }\n                }\n              }\n            }\n          } catch (error) {\n            // Log error but don't fail the iteration\n            const logger = (mastra as Mastra | undefined)?.getLogger?.();\n            logger?.error('Error in onIterationComplete hook:', error);\n          }\n        }\n\n        // Rotate messageId for the next iteration. Each iteration's assistant\n        // response is a distinct message, mirroring the non-durable agentic\n        // loop which calls rotateResponseMessageId() between iterations. The\n        // mutated state.messageId flows into the next singleIterationWorkflow\n        // input via map-to-llm-input.\n        //\n        // We also mark the current MessageList's last assistant message as a\n        // response boundary so MessageMerger won't collapse the next\n        // iteration's assistant content into it. Without this, persisted\n        // memory keeps a single assistant message and the rotated id is never\n        // observable to consumers.\n        if (!isFinal) {\n          const nextMessageId =\n            (mastra as Mastra | undefined)?.generateId?.() ?? globalThis.crypto?.randomUUID?.() ?? `msg_${Date.now()}`;\n          state.messageId = nextMessageId;\n\n          try {\n            const boundaryList = new MessageList();\n            boundaryList.deserialize(state.messageListState);\n            boundaryList.markResponseMessageBoundary();\n            state.messageListState = boundaryList.serialize();\n          } catch {\n            // Boundary marking is best-effort; if deserialization fails the\n            // next iteration will still run with the un-marked state.\n          }\n        }\n\n        // Emit an iteration-complete event for observability. This fires after\n        // every iteration (including the last one) so client-side callbacks\n        // (via stream-adapter) can track progress. The in-process callback\n        // above has already been evaluated and its result applied to the\n        // continuation decision.\n        if (pubsub) {\n          const lastStep = state.accumulatedSteps[state.accumulatedSteps.length - 1];\n          await emitIterationCompleteEvent(pubsub, state.runId, {\n            iteration: state.iterationCount,\n            maxIterations: runMaxSteps,\n            text: lastStep?.text,\n            toolCalls: lastStep?.toolCalls,\n            toolResults: lastStep?.toolResults,\n            isFinal,\n            finishReason: lastStep?.finishReason,\n            runId: state.runId,\n            threadId: initData.state?.threadId,\n            resourceId: initData.state?.resourceId,\n            agentId: initData.agentId,\n            agentName: initData.agentName,\n          });\n        }\n\n        return !isFinal;\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, tracingContext } = 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              // Forward the step's tracingContext so processor_run spans parent\n              // to the AGENT_RUN ancestor via ProcessorRunner's findParent walk.\n              await runner.runOutputProcessors(\n                outputMessageList,\n                createObservabilityContext(tracingContext),\n                requestContext ?? new RequestContext(),\n                0,\n              );\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            // Respect readOnly memory config (\"read memory but don't save new\n            // messages\"). Mirrors the non-durable executeOnFinish `!readOnlyMemory`\n            // guard and the MessageHistory output processor's readOnly check.\n            !durableState.memoryConfig?.readOnly\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          // Thread title generation (executeOnFinish equivalent).\n          // The non-durable `#executeOnFinish` generates a thread title from the first user\n          // message when `memory.options.generateTitle` is set. That branch was never ported\n          // to the durable path, so `generateTitle` silently never fired for durable/evented\n          // agents (and Inngest). The `generateThreadTitle` closure — parked on the registry\n          // entry during preparation, where the agent instance is in scope — runs it here.\n          //\n          // Kept OUTSIDE the `!observationalMemory` guard above: OM handles its own message\n          // persistence, but title generation is orthogonal and should still run when OM is on.\n          // Non-serializable (a closure), so like the other registry closures it only fires for\n          // in-process durable runs; cross-process engines (Inngest after a restart) skip it.\n          if (\n            registryEntry?.generateThreadTitle &&\n            durableState?.threadId &&\n            durableState?.resourceId &&\n            !durableState.memoryConfig?.readOnly\n          ) {\n            try {\n              await registryEntry.generateThreadTitle({\n                threadId: durableState.threadId,\n                resourceId: durableState.resourceId,\n                memoryConfig: durableState.memoryConfig,\n                messageListState: state.messageListState,\n                requestContext,\n                tracingContext,\n              });\n            } catch (error) {\n              logger?.warn?.(`[DurableAgent] Error generating thread title: ${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<SpanType.MODEL_GENERATION>,\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<SpanType.AGENT_RUN>);\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. We serialize scorers by name,\n              // and `getScorerById` searches by id-or-name without throwing\n              // on the common path, so try it first. Fall back to the\n              // registration-key-keyed `getScorer` for older configs.\n              let scorer: MastraScorer | undefined;\n              try {\n                scorer = (mastra as Mastra)?.getScorerById?.(scorerName) as MastraScorer | undefined;\n              } catch {\n                scorer = undefined;\n              }\n              if (!scorer) {\n                try {\n                  scorer = (mastra as Mastra)?.getScorer?.(scorerName) as MastraScorer | undefined;\n                } catch {\n                  scorer = undefined;\n                }\n              }\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 { MastraError, ErrorDomain, ErrorCategory } from '../../error';\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 { RequestContext } from '../../request-context';\nimport type { FullOutput, MastraModelOutput } from '../../stream/base/output';\nimport type { ChunkType, MastraOnFinishCallback, MastraStreamTransformOptions } from '../../stream/types';\nimport { ChunkFrom } from '../../stream/types';\nimport { deepMerge } from '../../utils';\nimport type { WorkflowRunState, WorkflowRunStatus } from '../../workflows/types';\nimport { Agent } from '../agent';\nimport type { AgentExecutionOptions } from '../agent.types';\nimport { beginGoalActivity, stopGoalActivity } from '../goal';\nimport { MessageList } from '../message-list';\nimport type { MessageListInput } from '../message-list';\nimport { SaveQueueManager } from '../save-queue';\nimport { agentThreadStreamRuntime } from '../thread-stream-runtime';\nimport type { ToolsInput } from '../types';\n\nimport { AGENT_STREAM_TOPIC, DurableStepIds } from './constants';\nimport { runDurableStreamUntilIdle, runResumeDurableStreamUntilIdle } from './durable-stream-until-idle';\nimport { prepareForDurableExecution } from './preparation';\nimport { endRunSpansWithError, ExtendedRunRegistry, globalRunRegistry } from './run-registry';\nimport { createDurableAgentStream, emitChunkEvent, emitErrorEvent } from './stream-adapter';\nimport type { AgentStepFinishEventData, AgentSuspendedEventData, DurableAgenticWorkflowInput } from './types';\nimport { createDurableAgenticWorkflow } from './workflows';\n\n/**\n * Internal flag used by `generate()`/`resumeGenerate()` to tell the stream\n * adapter to close the underlying ReadableStream on SUSPENDED events so that\n * `getFullOutput()` resolves instead of hanging on a suspended run.\n * Not part of the public `DurableAgentStreamOptions` surface.\n */\nconst CLOSE_ON_SUSPEND = Symbol('mastra.durable.closeOnSuspend');\nconst RESOLVED_EXECUTION_OPTIONS = Symbol('mastra.durable.resolvedExecutionOptions');\n\n/**\n * Options for DurableAgent.stream()\n */\nexport interface DurableAgentStreamOptions<OUTPUT = undefined> {\n  /** Custom instructions that override the agent's default instructions for this execution */\n  instructions?: AgentExecutionOptions<OUTPUT>['instructions'];\n  /** Additional context messages to provide to the agent */\n  context?: AgentExecutionOptions<OUTPUT>['context'];\n  /** Memory configuration for conversation persistence and retrieval */\n  memory?: AgentExecutionOptions<OUTPUT>['memory'];\n  /** Unique identifier for this execution run */\n  runId?: string;\n  /** Request Context containing dynamic configuration and state */\n  requestContext?: AgentExecutionOptions<OUTPUT>['requestContext'];\n  /** Maximum number of steps to run */\n  maxSteps?: number;\n  /**\n   * Conditions for stopping execution (e.g., step count, token limit).\n   *\n   * The predicate is non-serializable, so it's parked on the in-process run\n   * registry and evaluated by the durable loop on every iteration. Cross-process\n   * durable engines (e.g. Inngest after a worker restart) cannot recover the\n   * closure and degrade to `maxSteps` only.\n   */\n  stopWhen?: AgentExecutionOptions<OUTPUT>['stopWhen'];\n  /** Additional tool sets that can be used for this execution */\n  toolsets?: AgentExecutionOptions<OUTPUT>['toolsets'];\n  /** Client-side tools available during execution */\n  clientTools?: AgentExecutionOptions<OUTPUT>['clientTools'];\n  /** Tool selection strategy */\n  toolChoice?: AgentExecutionOptions<OUTPUT>['toolChoice'];\n  /** Tool names enabled for this execution */\n  activeTools?: AgentExecutionOptions<OUTPUT>['activeTools'];\n  /** Model-specific settings like temperature */\n  modelSettings?: AgentExecutionOptions<OUTPUT>['modelSettings'];\n  /** Require approval for tool calls. Boolean (gate all / none) or a per-call function policy. */\n  requireToolApproval?: AgentExecutionOptions<OUTPUT>['requireToolApproval'];\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  /** Experimental transforms applied whenever `fullStream` is consumed. */\n  experimentalTransform?: MastraStreamTransformOptions<OUTPUT>;\n  /** Maximum processor retries */\n  maxProcessorRetries?: number;\n  /** Structured output configuration */\n  structuredOutput?: AgentExecutionOptions<OUTPUT>['structuredOutput'];\n  /** Version overrides for sub-agent delegation */\n  versions?: AgentExecutionOptions<OUTPUT>['versions'];\n  /** Callback when chunk is received */\n  onChunk?: (chunk: ChunkType<OUTPUT>) => void | Promise<void>;\n  /** Callback when step finishes */\n  onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n  /** Callback when execution finishes — receives rich step data (text, steps, toolResults) */\n  onFinish?: MastraOnFinishCallback<OUTPUT>;\n  /** Callback on error */\n  onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n  /** Callback when workflow suspends (e.g., for tool approval) */\n  onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n  /** Callback when execution is aborted via abortSignal */\n  onAbort?: AgentExecutionOptions<OUTPUT>['onAbort'];\n  /** Callback fired after each agentic-loop iteration */\n  onIterationComplete?: AgentExecutionOptions<OUTPUT>['onIterationComplete'];\n  /** Additional system message appended after context but before user messages. */\n  system?: AgentExecutionOptions<OUTPUT>['system'];\n  /** When true, background tasks are disabled for this run. */\n  disableBackgroundTasks?: AgentExecutionOptions<OUTPUT>['disableBackgroundTasks'];\n  /** Tracing options forwarded to the agent/model spans. */\n  tracingOptions?: AgentExecutionOptions<OUTPUT>['tracingOptions'];\n  /** Per-call actor signal forwarded to FGA checks and tool execution. */\n  actor?: AgentExecutionOptions<OUTPUT>['actor'];\n  /**\n   * Per-invocation tool payload transform policy. The closure rides on the\n   * in-process run registry; only the JSON-safe `targets` shadow is serialized\n   * for cross-process engines.\n   */\n  transform?: AgentExecutionOptions<OUTPUT>['transform'];\n  /**\n   * Per-step preparation hook. Closure-only: stored on the in-process run\n   * registry and invoked as a `PrepareStepProcessor` at the start of every\n   * iteration. Cross-process resumes lose the hook.\n   */\n  prepareStep?: AgentExecutionOptions<OUTPUT>['prepareStep'];\n  /**\n   * Per-call `isTaskComplete` policy. Scorer instances and `onComplete` are\n   * closure-only and live on the in-process run registry; the JSON-safe\n   * primitives (`strategy`, `timeout`, `parallel`, `suppressFeedback`,\n   * `scorerNames`) are serialized for cross-process observability.\n   */\n  isTaskComplete?: AgentExecutionOptions<OUTPUT>['isTaskComplete'];\n  /**\n   * Sub-agent delegation hooks (`onDelegationStart`, `onDelegationComplete`,\n   * `messageFilter`, etc.). The callbacks are forwarded into `convertTools`\n   * at prepare time and burned into the sub-agent `CoreTool` wrappers on the\n   * in-process run registry. Cross-process resumes lose the callbacks (only\n   * `includeSubAgentToolResultsInModelContext` would be JSON-safe), so a\n   * fresh worker degrades to default delegation behaviour.\n   */\n  delegation?: AgentExecutionOptions<OUTPUT>['delegation'];\n  /**\n   * When set, `stream()` delegates to the idle-loop wrapper that keeps the\n   * outer stream open across background-task continuations — the same\n   * behaviour as the now-deprecated `streamUntilIdle()`.\n   *\n   * Pass `true` for default idle timeout (5 min), or `{ maxIdleMs }` to\n   * customise.\n   *\n   * @example\n   * ```typescript\n   * const { output, cleanup } = await durableAgent.stream('Research topic', {\n   *   untilIdle: true,\n   *   memory: { thread: 't1', resource: 'u1' },\n   * });\n   * ```\n   */\n  untilIdle?: boolean | { maxIdleMs?: number };\n  /** When true, the in-loop background task check step skips waiting (streamUntilIdle sets this) */\n  _skipBgTaskWait?: boolean;\n  /**\n   * External abort signal. The durable agent always installs its own internal\n   * `AbortController` for the run; when this signal is provided, its `abort`\n   * event is forwarded to the internal controller so either source can cancel\n   * the run.\n   *\n   * Cross-process resumes (e.g. Inngest after a worker restart) cannot\n   * recover the signal — call `resume(runId, ..., { abortSignal })` with a\n   * fresh signal on each segment if you need abortability post-resume.\n   */\n  abortSignal?: AbortSignal;\n}\n\ntype DurableAgentResumeOptions<OUTPUT = undefined> = DurableAgentStreamOptions<OUTPUT> & {\n  toolCallId?: string;\n};\n\n/**\n * Result from DurableAgent.stream()\n */\nexport interface DurableAgentStreamResult<OUTPUT = undefined> {\n  /** The streaming output */\n  output: MastraModelOutput<OUTPUT>;\n  /** The full stream - delegates to output.fullStream for server compatibility */\n  readonly fullStream: ReadableStream<any>;\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   * Abort the run. Flips the internal `AbortController` for this run, which\n   * surfaces as an `AbortError` inside the durable LLM-execution step and\n   * is bridged to the user's `onAbort` callback via the run's pubsub topic.\n   *\n   * Safe to call after the run has already finished — it's a no-op in that\n   * case.\n   */\n  abort: (reason?: unknown) => 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<TAgentId, TTools, TOutput>;\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 */\n\n/**\n * Statuses of durable agent runs discoverable via {@link DurableAgent.listActiveRuns}.\n *\n * `running` is the status reported by the workflow engine while the durable\n * agent's agentic loop is actively executing (i.e. between suspend\n * boundaries). Persisted `running` snapshots are the recovery source for runs\n * orphaned by a process restart.\n */\nexport type DurableAgentActiveRunStatus = Extract<WorkflowRunStatus, 'running'>;\n\n/**\n * Filters for {@link DurableAgent.listActiveRuns}. Mirrors the\n * `listWorkflowRuns` filter contract, plus the agent-level `threadId` /\n * `resourceId` filters used by the base {@link Agent.listSuspendedRuns}.\n */\nexport interface DurableAgentListActiveRunsOptions {\n  /** Only return runs that belong to this memory thread. */\n  threadId?: string;\n  /** Only return runs that belong to this memory resource. */\n  resourceId?: string;\n  /** Only return runs created at or after this date. */\n  fromDate?: Date;\n  /** Only return runs created at or before this date. */\n  toDate?: Date;\n  /**\n   * Number of items per page. Pagination is applied when both `perPage` and\n   * `page` are provided; otherwise all matching runs are returned.\n   */\n  perPage?: number;\n  /** Zero-indexed page number. */\n  page?: number;\n}\n\n/**\n * A durable agent run currently reported as `running` in workflow snapshot\n * storage. These are the runs that a boot-time or operator-initiated\n * recovery would re-drive after a process restart.\n */\nexport interface DurableAgentActiveRun {\n  /** Run ID accepted by {@link DurableAgent.recoverActiveRuns} and workflow `restart`. */\n  runId: string;\n  status: DurableAgentActiveRunStatus;\n  threadId?: string;\n  resourceId?: string;\n  /** When the run's snapshot was last persisted while running. */\n  updatedAt: Date;\n}\n\nexport interface DurableAgentListActiveRunsResult {\n  runs: DurableAgentActiveRun[];\n  /** Total number of matching runs, before pagination. */\n  total: number;\n}\n\n/**\n * Outcome of a single run restart attempted by\n * {@link DurableAgent.recoverActiveRuns}. `success` means `run.restart()`\n * returned; `failed` means it threw and the error was captured so recovery\n * of remaining runs could proceed.\n */\nexport interface DurableAgentRecoveredRun {\n  runId: string;\n  status: 'success' | 'failed';\n  /** Populated only when `status === 'failed'`. */\n  error?: Error;\n}\n\n/**\n * Filters for {@link DurableAgent.recoverActiveRuns}. Reuses the\n * {@link DurableAgentListActiveRunsOptions} discovery filters and adds an\n * escape hatch for targeting a specific run ID.\n */\nexport interface DurableAgentRecoverActiveRunsOptions extends DurableAgentListActiveRunsOptions {\n  /**\n   * Recover a specific run by ID. When set, the discovery filters and\n   * pagination fields are ignored. Useful when the caller already knows the\n   * run ID from another source (e.g. their own bookkeeping).\n   */\n  runId?: string;\n}\n\nexport interface DurableAgentRecoverActiveRunsResult {\n  recovered: DurableAgentRecoveredRun[];\n  /** Number of runs that restarted successfully. */\n  succeeded: number;\n  /** Number of runs whose restart threw. */\n  failed: number;\n}\n\n/**\n * Options for {@link DurableAgent.recover}, a single-run streamable recovery\n * counterpart to {@link DurableAgent.resume}.\n *\n * `recover()` rebuilds the run's non-serializable state from the persisted\n * workflow snapshot (message list, model, tools, memory, saveQueueManager,\n * request context, agent span) and returns a fresh {@link DurableAgentStreamResult}\n * whose `fullStream` observes the recovered run through pubsub. Callbacks\n * mirror `stream()` / `resume()`.\n */\nexport interface DurableAgentRecoverOptions<OUTPUT = undefined> {\n  /** Callback when chunk is received */\n  onChunk?: (chunk: ChunkType<OUTPUT>) => void | Promise<void>;\n  /** Experimental transforms applied whenever `fullStream` is consumed. */\n  experimentalTransform?: MastraStreamTransformOptions<OUTPUT>;\n  /** Callback when a step finishes */\n  onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n  /** Callback when the recovered run finishes */\n  onFinish?: MastraOnFinishCallback<OUTPUT>;\n  /** Callback when the recovered run errors */\n  onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n  /** Callback when the recovered run suspends again */\n  onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n  /**\n   * Optional abort signal for the recovered segment. Forwarded onto a fresh\n   * internal `AbortController` installed on the run's registry entry, so\n   * `result.abort()` and the external signal can both cancel the recovered run.\n   */\n  abortSignal?: AbortSignal;\n}\n\nexport class DurableAgent<\n  TAgentId extends string = string,\n  TTools extends ToolsInput = ToolsInput,\n  TOutput = undefined,\n> extends Agent<TAgentId, TTools, TOutput> {\n  /** The wrapped agent */\n  readonly #wrappedAgent: Agent<TAgentId, TTools, TOutput>;\n\n  /** Registry for per-run non-serializable state */\n  readonly #runRegistry: ExtendedRunRegistry;\n\n  /** The durable workflow for agent execution */\n  #workflow: ReturnType<typeof createDurableAgenticWorkflow> | 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<string, () => 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<TAgentId, TTools, TOutput>) {\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 if (this.#innerPubsub instanceof CachingPubSub) {\n      // The inner pubsub already provides caching/replay. This happens when the\n      // user passes a CachingPubSub to `new Mastra({ pubsub })`: on registration\n      // the agent adopts mastra.pubsub as its inner transport. Wrapping it again\n      // in a second CachingPubSub that shares the same cache would store every\n      // event twice (once per layer, with consecutive indices), so observe()/\n      // replay would deliver the buffered prefix doubled (issue #18148). Reuse\n      // the existing instance instead of double-wrapping.\n      this.#cachingPubsub = this.#innerPubsub;\n      this.#resolvedCache = this.#cacheConfig ?? this.#mastra?.serverCache ?? 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<TAgentId, TTools, TOutput> {\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  // ===========================================================================\n  // Delegate Agent methods to wrapped agent\n  //\n  // DurableAgent's super() only passes id, name, instructions, and model.\n  // All other private fields (#tools, #memory, #workspace, #processors, etc.)\n  // are empty on the DurableAgent instance. Every public/protected method that\n  // reads those fields must be overridden to delegate to the wrapped agent.\n  // ===========================================================================\n\n  // --- Model & LLM ---\n  override getModel(options?: any) {\n    return this.#wrappedAgent.getModel(options);\n  }\n\n  override getLLM(options?: any) {\n    return this.#wrappedAgent.getLLM(options);\n  }\n\n  override async getModelList(requestContext?: any) {\n    return this.#wrappedAgent.getModelList(requestContext);\n  }\n\n  // --- Instructions, description, metadata ---\n  override getInstructions(options?: any) {\n    return this.#wrappedAgent.getInstructions(options);\n  }\n\n  override getDescription() {\n    return this.#wrappedAgent.getDescription();\n  }\n\n  override getMetadata(options?: any) {\n    return this.#wrappedAgent.getMetadata(options);\n  }\n\n  override getTracingPolicy() {\n    return this.#wrappedAgent.getTracingPolicy();\n  }\n\n  // --- Tools ---\n  override listTools(options?: any) {\n    return this.#wrappedAgent.listTools(options);\n  }\n\n  override getConfiguredToolHooks() {\n    return this.#wrappedAgent.getConfiguredToolHooks();\n  }\n\n  // --- Default options ---\n  override getDefaultOptions(options?: any) {\n    return this.#wrappedAgent.getDefaultOptions(options);\n  }\n\n  async #resolveExecutionOptions(\n    options?: DurableAgentStreamOptions<TOutput>,\n  ): Promise<DurableAgentStreamOptions<TOutput>> {\n    if ((options as any)?.[RESOLVED_EXECUTION_OPTIONS]) {\n      return options!;\n    }\n\n    const defaultOptions = await this.getDefaultOptions({ requestContext: options?.requestContext });\n    const resolvedOptions = deepMerge(\n      (defaultOptions ?? {}) as Record<string, unknown>,\n      (options ?? {}) as Record<string, unknown>,\n    ) as DurableAgentStreamOptions<TOutput>;\n    // Actor is a per-call trust signal, so an explicit value replaces the\n    // default actor as a whole rather than inheriting any of its fields.\n    if (options?.actor !== undefined) {\n      resolvedOptions.actor = options.actor;\n    }\n    if ((options as any)?.[CLOSE_ON_SUSPEND] === true) {\n      Object.defineProperty(resolvedOptions, CLOSE_ON_SUSPEND, { value: true, enumerable: true });\n    }\n    // Preserve the marker when the until-idle wrapper spreads these options.\n    Object.defineProperty(resolvedOptions, RESOLVED_EXECUTION_OPTIONS, { value: true, enumerable: true });\n    return resolvedOptions;\n  }\n\n  override getDefaultGenerateOptionsLegacy(options?: any) {\n    return this.#wrappedAgent.getDefaultGenerateOptionsLegacy(options);\n  }\n\n  override getDefaultStreamOptionsLegacy(options?: any) {\n    return this.#wrappedAgent.getDefaultStreamOptionsLegacy(options);\n  }\n\n  override getDefaultNetworkOptions(options?: any) {\n    return this.#wrappedAgent.getDefaultNetworkOptions(options);\n  }\n\n  // --- Memory ---\n  override getMemory(options?: any) {\n    return this.#wrappedAgent.getMemory(options);\n  }\n\n  override hasOwnMemory(): boolean {\n    return this.#wrappedAgent.hasOwnMemory();\n  }\n\n  // --- Workspace ---\n  override getWorkspace(options?: any) {\n    return this.#wrappedAgent.getWorkspace(options);\n  }\n\n  override hasOwnWorkspace(): boolean {\n    return this.#wrappedAgent.hasOwnWorkspace?.() ?? false;\n  }\n\n  // --- Voice ---\n  override getVoice(options?: any) {\n    return this.#wrappedAgent.getVoice(options);\n  }\n\n  override get voice() {\n    return this.#wrappedAgent.voice;\n  }\n\n  // --- Request context ---\n  override get requestContextSchema() {\n    return this.#wrappedAgent.requestContextSchema;\n  }\n\n  // --- Processors ---\n  override async getConfiguredProcessorWorkflows() {\n    return this.#wrappedAgent.getConfiguredProcessorWorkflows();\n  }\n\n  override async listInputProcessors(requestContext?: any) {\n    return this.#wrappedAgent.listInputProcessors(requestContext);\n  }\n\n  override async listOutputProcessors(requestContext?: any) {\n    return this.#wrappedAgent.listOutputProcessors(requestContext);\n  }\n\n  override async listErrorProcessors(requestContext?: any) {\n    return this.#wrappedAgent.listErrorProcessors(requestContext);\n  }\n\n  override async resolveProcessorById<TId extends string = string>(processorId: TId, requestContext?: any) {\n    return this.#wrappedAgent.resolveProcessorById(processorId, requestContext);\n  }\n\n  override async listConfiguredInputProcessors(requestContext?: any) {\n    return this.#wrappedAgent.listConfiguredInputProcessors(requestContext);\n  }\n\n  override async listConfiguredOutputProcessors(requestContext?: any) {\n    return this.#wrappedAgent.listConfiguredOutputProcessors(requestContext);\n  }\n\n  override async getConfiguredProcessorIds(requestContext?: any) {\n    return this.#wrappedAgent.getConfiguredProcessorIds(requestContext);\n  }\n\n  // --- Sub-agents ---\n  override listAgents(options?: any) {\n    return this.#wrappedAgent.listAgents(options);\n  }\n\n  override __getStaticAgents() {\n    return this.#wrappedAgent.__getStaticAgents();\n  }\n\n  override __hasSubAgentsConfigured() {\n    return this.#wrappedAgent.__hasSubAgentsConfigured();\n  }\n\n  // --- Workflows ---\n  override async listWorkflows(options?: any) {\n    return this.#wrappedAgent.listWorkflows(options);\n  }\n\n  // --- Skills ---\n  override async getSkill(skillName: string, options?: any) {\n    return this.#wrappedAgent.getSkill(skillName, options);\n  }\n\n  override async listSkills(options?: any) {\n    return this.#wrappedAgent.listSkills(options);\n  }\n\n  // --- Scorers ---\n  override async listScorers(options?: any) {\n    return this.#wrappedAgent.listScorers(options);\n  }\n\n  // --- Background tasks ---\n  override getBackgroundTasksConfig() {\n    return this.#wrappedAgent.getBackgroundTasksConfig();\n  }\n\n  override disableBackgroundTasks() {\n    this.#wrappedAgent.disableBackgroundTasks();\n  }\n\n  override enableBackgroundTasks() {\n    this.#wrappedAgent.enableBackgroundTasks();\n  }\n\n  // --- Tool payload transform & goal ---\n  override getToolPayloadTransform() {\n    return this.#wrappedAgent.getToolPayloadTransform();\n  }\n\n  override __getGoalConfig() {\n    return this.#wrappedAgent.__getGoalConfig();\n  }\n\n  // --- Browser ---\n  override get browser() {\n    return this.#wrappedAgent.browser;\n  }\n\n  override setBrowser(browser: any) {\n    this.#wrappedAgent.setBrowser(browser);\n  }\n\n  override hasOwnBrowser() {\n    return this.#wrappedAgent.hasOwnBrowser();\n  }\n\n  // --- Channels ---\n  override getChannels() {\n    return this.#wrappedAgent.getChannels();\n  }\n\n  override setChannels(agentChannels: any) {\n    this.#wrappedAgent.setChannels(agentChannels);\n  }\n\n  // --- PubSub (base Agent fields — DurableAgent has its own pubsub) ---\n  override hasOwnPubSub() {\n    return this.#wrappedAgent.hasOwnPubSub();\n  }\n\n  // --- Setters called by AgentController — forward to BOTH wrapper and wrapped ---\n  // We propagate to both so that:\n  //  - The wrapped agent sees the value for its own internal use.\n  //  - The DurableAgent's inherited getPubSub()/getMemory()/getWorkspace()\n  //    also work (they read #inheritedPubSub / #memory / #workspace set by super).\n  override __setMemory(memory: any) {\n    super.__setMemory(memory);\n    this.#wrappedAgent.__setMemory(memory);\n  }\n\n  override __setPubSub(pubsub: any) {\n    super.__setPubSub(pubsub);\n    this.#wrappedAgent.__setPubSub(pubsub);\n  }\n\n  override __setWorkspace(workspace: any) {\n    super.__setWorkspace(workspace);\n    this.#wrappedAgent.__setWorkspace(workspace);\n  }\n\n  // ===========================================================================\n  // Editor / fork delegation\n  //\n  // The base Agent serves tools/instructions/model from its own private fields,\n  // but a DurableAgent serves all of them from the wrapped agent (see the\n  // delegating getters above). The editor applies stored overrides per request\n  // by calling `__fork()` and then mutating the fork via `__updateInstructions`\n  // / `__updateModel` / `__setTools`, and inspecting it via `__getEditorConfig`\n  // / `__getOverridableFields`. If those operated on the DurableAgent's own\n  // (unused) base fields the served agent would silently lose its tools and\n  // ignore overrides, so forward them to the wrapped agent — it stays the single\n  // source of truth.\n  // ===========================================================================\n\n  override __getEditorConfig() {\n    return this.#wrappedAgent.__getEditorConfig();\n  }\n\n  override __getOverridableFields() {\n    return this.#wrappedAgent.__getOverridableFields();\n  }\n\n  override __updateInstructions(instructions: Parameters<Agent<TAgentId, TTools, TOutput>['__updateInstructions']>[0]) {\n    this.#wrappedAgent.__updateInstructions(instructions);\n  }\n\n  override __updateModel(config: Parameters<Agent<TAgentId, TTools, TOutput>['__updateModel']>[0]) {\n    this.#wrappedAgent.__updateModel(config);\n  }\n\n  override __setTools(tools: Parameters<Agent<TAgentId, TTools, TOutput>['__setTools']>[0]) {\n    this.#wrappedAgent.__setTools(tools);\n  }\n\n  /**\n   * Create a per-request clone for applying stored editor overrides.\n   *\n   * The base `Agent.__fork()` builds a bare `new Agent(...)`, which for a\n   * DurableAgent would drop the wrapped agent and every delegating override\n   * (tools, model, memory, voice, durable streaming) — the served fork ends up a\n   * plain `Agent` with no tools. Instead, fork the wrapped agent (so overrides\n   * applied to this fork don't mutate the singleton) and re-wrap it in the same\n   * durable subclass, preserving pubsub/cache/run configuration.\n   *\n   * @internal\n   */\n  override __fork(): Agent<TAgentId, TTools, TOutput> {\n    const innerFork = this.#wrappedAgent.__fork();\n\n    const Ctor = this.constructor as new (\n      config: DurableAgentConfig<TAgentId, TTools, TOutput>,\n    ) => DurableAgent<TAgentId, TTools, TOutput>;\n\n    const fork = new Ctor({\n      agent: innerFork,\n      id: this.id,\n      name: this.name,\n      pubsub: this.#hasCustomPubsub ? this.#innerPubsub : undefined,\n      cache: this.#cacheConfig,\n      maxSteps: this.#maxSteps,\n      cleanupTimeoutMs: this.#cleanupTimeoutMs,\n    });\n\n    // Preserve runtime state set after construction (mastra registration and the\n    // wired inner pubsub, e.g. mastra.pubsub) without re-triggering registration\n    // side effects — mirrors Agent.__fork().\n    if (this.#mastra) {\n      fork.#mastra = this.#mastra;\n    }\n    fork.#innerPubsub = this.#innerPubsub;\n    fork.source = this.source;\n    // `_agentNetworkAppend` is a private base-class flag; copy it via an indexed\n    // cast (the same idiom the base uses in `toRawConfig()`) so the fork mirrors\n    // `Agent.__fork()` without widening the field's visibility.\n    (fork as unknown as { _agentNetworkAppend: unknown })._agentNetworkAppend = (\n      this as unknown as { _agentNetworkAppend: unknown }\n    )._agentNetworkAppend;\n\n    // DurableAgent intentionally diverges from Agent's `stream` signature, so the\n    // re-wrapped fork is bridged to the base `Agent` return type here. The editor's\n    // fork-then-mutate contract only relies on the base Agent surface.\n    return fork as unknown as Agent<TAgentId, TTools, TOutput>;\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<void> {\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      actor: workflowInput.options?.actor,\n      ...createObservabilityContext({ currentSpan: entry?.agentSpan }),\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    // Reaching any non-suspended terminal status means the run is done and its\n    // persisted snapshot rows will never be resumed. Delete them so snapshot\n    // storage doesn't grow one stale row per completed run. Suspended runs\n    // keep their snapshots so `resume()` / `recoverActiveRuns()` can find them.\n    if (result?.status && result.status !== 'suspended') {\n      await this.deleteRunSnapshots(runId);\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<typeof createDurableAgenticWorkflow> {\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<void> {\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   * Delete the persisted workflow snapshot rows for a completed durable run.\n   *\n   * A durable agent write two rows per run: one for the outer `AGENTIC_LOOP`\n   * workflow and one for the nested `AGENTIC_EXECUTION` workflow (persisted\n   * under the same `runId`). Once the run reaches a non-suspended terminal\n   * state neither row is needed again — leaving them behind fills snapshot\n   * storage with stale `pending`/`running` rows for every completed run and\n   * pollutes `listActiveRuns` / `recoverActiveRuns` on the next boot.\n   *\n   * Best-effort: a cleanup failure must never turn a finished run into an\n   * error — a stale row is preferable to a broken exit path.\n   *\n   * @internal\n   */\n  protected async deleteRunSnapshots(runId: string): Promise<void> {\n    try {\n      const workflow = this.getWorkflow();\n      await workflow.deleteWorkflowRunById(runId);\n      const workflowsStore = await this.#mastra?.getStorage()?.getStore('workflows');\n      await workflowsStore?.deleteWorkflowRunById({\n        runId,\n        workflowName: DurableStepIds.AGENTIC_EXECUTION,\n      });\n    } catch (error) {\n      this.#mastra\n        ?.getLogger?.()\n        ?.warn?.(`[DurableAgent] Failed to delete workflow snapshot rows after terminal state`, { runId, error });\n    }\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<TOutput>,\n  ): Promise<DurableAgentStreamResult<TOutput>> {\n    options = await this.#resolveExecutionOptions(options);\n\n    // Delegate to the idle-loop wrapper when `untilIdle` is set.\n    // Strip `untilIdle` before passing to the wrapper so its internal\n    // agent.stream() call doesn't recurse.\n    if (options?.untilIdle) {\n      const { untilIdle, ...rest } = options;\n      const maxIdleMs = typeof untilIdle === 'object' ? untilIdle.maxIdleMs : undefined;\n      // The idle helper normally resolves defaults for scope discovery. These\n      // options are already resolved, so keep its inner stream on the same values.\n      const resolvedOptionsAgent = {\n        id: this.id,\n        getDefaultOptions: () => ({}),\n        getMemory: (args?: any) => this.getMemory(args),\n        stream: (innerMessages: MessageListInput, innerOptions?: DurableAgentStreamOptions<TOutput>) =>\n          this.stream(innerMessages, innerOptions),\n      } as unknown as DurableAgent<any, any, TOutput>;\n      return runDurableStreamUntilIdle<TOutput>(\n        resolvedOptionsAgent,\n        messages,\n        { ...rest, maxIdleMs },\n        {\n          activeStreams: this.#activeStreamUntilIdle,\n          bgManager: this.#mastra?.backgroundTaskManager,\n        },\n      );\n    }\n\n    // Enforce agent-level FGA (agents:execute) before durable execution. The\n    // base Agent enforces this in its stream()/generate(); durable execution\n    // runs a workflow instead and would otherwise skip the gate. This also\n    // covers evented subclasses, which inherit stream()/generate().\n    await this.requireAgentExecutionFGA({\n      requestContext: options?.requestContext,\n      memory: options?.memory,\n      runId: options?.runId,\n      actor: options?.actor,\n    });\n\n    // 1. Prepare for durable execution (non-durable phase)\n    const preparation = await prepareForDurableExecution<TOutput>({\n      agent: this.#wrappedAgent as Agent<string, any, TOutput>,\n      messages,\n      options: options as AgentExecutionOptions<TOutput>,\n      runId: options?.runId,\n      requestContext: options?.requestContext,\n      optionsAreResolved: true,\n      mastra: this.#mastra,\n      durableAgentId: this.id,\n      durableAgentName: this.name,\n    });\n\n    const { runId, messageId, workflowInput, registryEntry, messageList, threadId, resourceId } = preparation;\n\n    // 1a. Install the abort controller for this run. The controller is owned\n    // by this DurableAgent instance; the result's abort() method flips it,\n    // and the durable LLM-execution step reads `abortSignal` off the registry\n    // to thread it into the model call + abort short-circuits. If the caller\n    // also supplied an external signal, forward its abort to the internal\n    // controller so either source can cancel the run.\n    const abortController = new AbortController();\n    if (options?.abortSignal) {\n      if (options.abortSignal.aborted) {\n        abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason);\n      } else {\n        options.abortSignal.addEventListener(\n          'abort',\n          () => abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason),\n          { once: true },\n        );\n      }\n    }\n    registryEntry.abortController = abortController;\n    registryEntry.abortSignal = abortController.signal;\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<typeof setTimeout> | 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<TOutput>({\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      experimentalTransform: options?.experimentalTransform,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      onAbort: async data => {\n        try {\n          await (options?.onAbort as ((event: any) => void | Promise<void>) | undefined)?.(data);\n        } finally {\n          scheduleAutoCleanup();\n        }\n      },\n      // onIterationComplete is NOT forwarded here — the dowhile predicate\n      // now calls it in-process from globalRunRegistry and honors its return\n      // value ({ continue, feedback }). The pubsub ITERATION_COMPLETE event\n      // still fires for external observability subscribers.\n      closeOnSuspend: (options as any)?.[CLOSE_ON_SUSPEND] === true,\n      structuredOutput: registryEntry.structuredOutput as any,\n      outputProcessors: registryEntry.outputProcessors,\n      messageList,\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    const workflowExecution = ready\n      .then(async () => {\n        // Emit 'start' chunk before the workflow begins (matches regular agent's stream.ts).\n        // Only the initial stream() path emits 'start'; resume() does not.\n        await emitChunkEvent(this.pubsub, runId, {\n          type: 'start',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: { id: workflowInput.agentId, messageId },\n        });\n        if (this.__getGoalConfig()) {\n          await beginGoalActivity({\n            mastra: this.#mastra,\n            agentId: workflowInput.agentId,\n            threadId,\n            runId,\n            requestContext: globalRunRegistry.get(runId)?.requestContext,\n          });\n        }\n        try {\n          return await this.executeWorkflow(runId, workflowInput);\n        } finally {\n          await stopGoalActivity({ agentId: workflowInput.agentId, runId });\n        }\n      })\n      .catch(error => {\n        void this.emitError(runId, error);\n      });\n    const trackedEntry = globalRunRegistry.get(runId);\n    if (trackedEntry) {\n      trackedEntry.workflowExecution = workflowExecution;\n    }\n\n    // 4b. Register with the thread-stream runtime so subscribeToThread /\n    // sendMessage subscribers receive run-registered events and stream parts.\n    // Uses the Mastra-level pubsub (this.getPubSub()) — not the internal\n    // CachingPubSub (this.pubsub) which carries durable workflow chunks.\n    await agentThreadStreamRuntime.registerRun(\n      this as unknown as Agent<any, any, any, any>,\n      output,\n      options as AgentExecutionOptions<TOutput>,\n      this.getPubSub(),\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    const abort = (reason?: unknown) => {\n      if (!abortController.signal.aborted) {\n        abortController.abort(reason);\n      }\n    };\n\n    return {\n      output,\n      get fullStream() {\n        return output.fullStream as ReadableStream<any>;\n      },\n      runId,\n      threadId,\n      resourceId,\n      cleanup,\n      abort,\n    };\n  }\n\n  /**\n   * Resume a suspended workflow execution.\n   */\n  async resume(\n    runId: string,\n    resumeData: unknown,\n    options?: DurableAgentResumeOptions<TOutput>,\n  ): Promise<DurableAgentStreamResult<TOutput>> {\n    let entry = this.#runRegistry.get(runId);\n    if (!entry) {\n      // A persisted durable run can outlive this process (or the registry TTL).\n      // Rebuild the non-serializable runtime state before resuming the stored\n      // workflow snapshot. Keep warm resumes on the existing path to avoid\n      // racing an active registry entry with a second preparation pass.\n      const workflowsStore = await this.#mastra?.getStorage()?.getStore('workflows');\n      const persisted = await workflowsStore?.getWorkflowRunById({\n        runId,\n        workflowName: DurableStepIds.AGENTIC_LOOP,\n      });\n      if (!persisted) {\n        throw new Error(`No registry entry found for run ${runId}. Cannot resume.`);\n      }\n\n      const snapshot =\n        typeof persisted.snapshot === 'string'\n          ? (JSON.parse(persisted.snapshot) as WorkflowRunState)\n          : persisted.snapshot;\n      if (snapshot?.status !== 'suspended') {\n        throw new Error('This workflow run was not suspended');\n      }\n      const workflowInput = snapshot?.context?.input as DurableAgenticWorkflowInput | undefined;\n      if (!workflowInput || workflowInput.__workflowKind !== 'durable-agent') {\n        throw new MastraError({\n          id: 'DURABLE_AGENT_RESUME_INVALID_SNAPSHOT',\n          domain: ErrorDomain.AGENT,\n          category: ErrorCategory.SYSTEM,\n          text: `DurableAgent \"${this.name}\" resume(${runId}): persisted snapshot does not contain a durable-agent workflow input.`,\n          details: { agentName: this.name, runId },\n        });\n      }\n      if (workflowInput.agentId !== this.id) {\n        throw new MastraError({\n          id: 'DURABLE_AGENT_RESUME_AGENT_MISMATCH',\n          domain: ErrorDomain.AGENT,\n          category: ErrorCategory.USER,\n          text: `DurableAgent \"${this.name}\" resume(${runId}): persisted run belongs to agent \"${workflowInput.agentId}\", not \"${this.id}\".`,\n          details: { agentName: this.name, runId, ownerAgentId: workflowInput.agentId },\n        });\n      }\n\n      const messageListMemoryInfo = (\n        workflowInput.messageListState as { memoryInfo?: { threadId?: string; resourceId?: string } } | undefined\n      )?.memoryInfo;\n      const threadId = workflowInput.state?.threadId ?? messageListMemoryInfo?.threadId;\n      const resourceId = workflowInput.state?.resourceId ?? messageListMemoryInfo?.resourceId;\n      const snapshotRequestContext = workflowInput.requestContextEntries\n        ? new RequestContext<unknown>(Object.entries(workflowInput.requestContextEntries))\n        : undefined;\n      const memory = threadId\n        ? {\n            ...options?.memory,\n            thread: threadId,\n            resource: resourceId ?? options?.memory?.resource,\n          }\n        : options?.memory;\n\n      await this.prepare([], {\n        ...(options as AgentExecutionOptions<TOutput>),\n        runId,\n        requestContext: options?.requestContext ?? snapshotRequestContext,\n        memory,\n      });\n      entry = this.#runRegistry.get(runId);\n    }\n    if (!entry) {\n      throw new Error(`Failed to rehydrate registry entry for run ${runId}. Cannot resume.`);\n    }\n\n    const memoryInfo = this.#runRegistry.getMemoryInfo(runId);\n    const registeredMemory = memoryInfo?.threadId\n      ? ({\n          ...options?.memory,\n          thread: memoryInfo.threadId,\n          resource: memoryInfo.resourceId ?? options?.memory?.resource,\n        } as DurableAgentStreamOptions<TOutput>['memory'])\n      : options?.memory;\n\n    const resolvedOptions = (await this.#resolveExecutionOptions({\n      ...(options as DurableAgentStreamOptions<TOutput>),\n      requestContext:\n        options?.requestContext ??\n        (entry.requestContext as DurableAgentStreamOptions<TOutput>['requestContext'] | undefined),\n      memory: registeredMemory ?? options?.memory,\n    })) as DurableAgentResumeOptions<TOutput>;\n\n    // Delegate to the idle-loop wrapper when `untilIdle` is set. Strip\n    // `untilIdle` before passing to the wrapper so the inner agent.resume()\n    // call (and subsequent agent.stream([]) continuations) don't recurse.\n    if (resolvedOptions.untilIdle) {\n      const { untilIdle, ...rest } = resolvedOptions;\n      const maxIdleMs = typeof untilIdle === 'object' ? untilIdle.maxIdleMs : undefined;\n      const resolvedOptionsAgent = {\n        id: this.id,\n        getDefaultOptions: () => ({}),\n        getMemory: (args?: any) => this.getMemory(args),\n        resume: (innerRunId: string, innerResumeData: unknown, innerOptions?: DurableAgentResumeOptions<TOutput>) =>\n          this.resume(innerRunId, innerResumeData, innerOptions),\n        stream: (innerMessages: MessageListInput, innerOptions?: DurableAgentStreamOptions<TOutput>) =>\n          this.stream(innerMessages, innerOptions),\n      } as unknown as DurableAgent<any, any, TOutput>;\n      return runResumeDurableStreamUntilIdle<TOutput>(\n        resolvedOptionsAgent,\n        runId,\n        resumeData,\n        { ...rest, maxIdleMs } as DurableAgentStreamOptions<TOutput> & { maxIdleMs?: number },\n        {\n          activeStreams: this.#activeStreamUntilIdle,\n          bgManager: this.#mastra?.backgroundTaskManager,\n        },\n      );\n    }\n\n    await this.requireAgentExecutionFGA({\n      requestContext: resolvedOptions.requestContext,\n      memory: resolvedOptions.memory,\n      runId,\n      snapshotMemoryInfo: memoryInfo,\n      actor: resolvedOptions.actor,\n    });\n\n    // Install a fresh abort controller for the resumed segment. The original\n    // controller is gone (the stream that owned it has already settled), so\n    // we overwrite the registry slot. If the caller passed an external\n    // signal, forward it onto the new internal controller.\n    const abortController = new AbortController();\n    if (resolvedOptions.abortSignal) {\n      if (resolvedOptions.abortSignal.aborted) {\n        abortController.abort((resolvedOptions.abortSignal as AbortSignal & { reason?: unknown }).reason);\n      } else {\n        resolvedOptions.abortSignal.addEventListener(\n          'abort',\n          () => abortController.abort((resolvedOptions.abortSignal as AbortSignal & { reason?: unknown }).reason),\n          { once: true },\n        );\n      }\n    }\n    entry.abortController = abortController;\n    entry.abortSignal = abortController.signal;\n    const globalEntryForAbort = globalRunRegistry.get(runId);\n    if (globalEntryForAbort) {\n      globalEntryForAbort.abortController = abortController;\n      globalEntryForAbort.abortSignal = abortController.signal;\n    }\n\n    // Track cleanup state to avoid double cleanup\n    let cleanedUp = false;\n    let autoCleanupTimer: ReturnType<typeof setTimeout> | 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    // Skip events already broadcast by the original run (e.g. the SUSPENDED\n    // chunk that paused it). Without this, a resume that closes on suspend\n    // (resumeGenerate) would immediately close on the replayed SUSPENDED.\n    const resumeOffset = await this.#getPubsubOffset(runId);\n\n    const {\n      output,\n      cleanup: streamCleanup,\n      ready,\n    } = createDurableAgentStream<TOutput>({\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      offset: resumeOffset,\n      onChunk: resolvedOptions.onChunk,\n      experimentalTransform: resolvedOptions.experimentalTransform,\n      onStepFinish: resolvedOptions.onStepFinish,\n      onFinish: resolvedOptions.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await resolvedOptions.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: resolvedOptions.onSuspended,\n      closeOnSuspend: (resolvedOptions as any)[CLOSE_ON_SUSPEND] === true,\n      structuredOutput: entry.structuredOutput as any,\n      outputProcessors: entry.outputProcessors,\n      messageList: globalEntry?.messageList ?? this.#runRegistry.getMessageList(runId),\n    });\n\n    // Wait for subscription to be ready, then resume workflow\n    const workflow = this.getWorkflow();\n    const requestContext = resolvedOptions.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    const origSpanId = entry.agentSpan?.id;\n    if (origTraceId && this.#mastra?.observability) {\n      try {\n        const ag = this.#wrappedAgent as Agent<string, any, any>;\n        // Match non-durable Agent.stream() resume-span shape: same name suffix\n        // `(resumed)`, forward agent-level tracingPolicy, link to the original\n        // span via `resumedFromSpanId` metadata, and carry the resolvedVersionId.\n        const rawConfig = typeof (ag as any).toRawConfig === 'function' ? (ag as any).toRawConfig() : undefined;\n        const resolvedVersionId = rawConfig?.resolvedVersionId as string | undefined;\n        const agentTracingPolicy = typeof ag.getTracingPolicy === 'function' ? ag.getTracingPolicy() : undefined;\n        const resumeAgentSpan = getOrCreateSpan({\n          type: SpanType.AGENT_RUN,\n          name: `agent run: '${ag.id}' (resumed)`,\n          entityType: EntityType.AGENT,\n          entityId: ag.id,\n          entityName: ag.name,\n          metadata: {\n            runId,\n            resumed: true,\n            ...(origSpanId ? { resumedFromSpanId: origSpanId } : {}),\n            ...(resolvedVersionId ? { entityVersionId: resolvedVersionId } : {}),\n          },\n          tracingPolicy: agentTracingPolicy,\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    // Capture the prior workflow execution BEFORE creating the new promise.\n    // If we read it inside the `.then()` callback, the global registry will\n    // already point to the NEW promise (assigned synchronously below),\n    // causing a self-referential deadlock.\n    const priorExecution = globalRunRegistry.get(runId)?.workflowExecution;\n\n    const workflowExecution = ready\n      .then(async () => {\n        // Wait for the prior workflow execution (stream / previous resume) to\n        // fully settle so the snapshot is persisted as 'suspended' before we\n        // attempt to resume it.  Without this, the pubsub tool-call-suspended\n        // event can arrive (and the consumer can call resumeStream) before the\n        // engine has finished writing the snapshot, leading to\n        // \"This workflow run was not suspended\".\n        if (priorExecution) {\n          await priorExecution.catch(() => {\n            /* errors already handled by the prior segment */\n          });\n        }\n\n        const run = await workflow.createRun({ runId, pubsub: this.pubsub });\n        if (this.__getGoalConfig()) {\n          await beginGoalActivity({\n            mastra: this.#mastra,\n            agentId: this.id,\n            threadId: memoryInfo?.threadId,\n            runId,\n            requestContext,\n          });\n        }\n        let result;\n        try {\n          result = await run.resume({\n            resumeData,\n            label: resolvedOptions.toolCallId,\n            requestContext,\n            actor: resolvedOptions.actor,\n            ...createObservabilityContext({ currentSpan: entry.resumeAgentSpan ?? entry.agentSpan }),\n          });\n        } finally {\n          await stopGoalActivity({ agentId: this.id, runId });\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        // Same snapshot cleanup as the initial `start()` path: once resume\n        // settles on any non-suspended terminal status the persisted rows are\n        // no longer needed. A resume that re-suspends must keep them so the\n        // next resume/recover can find the snapshot.\n        if (result?.status && result.status !== 'suspended') {\n          await this.deleteRunSnapshots(runId);\n        }\n      })\n      .catch(error => {\n        void this.emitError(runId, error);\n      });\n    const trackedResumeEntry = globalRunRegistry.get(runId);\n    if (trackedResumeEntry) {\n      trackedResumeEntry.workflowExecution = workflowExecution;\n    }\n\n    // Register the resumed run with the thread-stream runtime so\n    // subscribeToThread subscribers are notified of the new stream.\n    const resumeStreamOptions: AgentExecutionOptions<TOutput> = {\n      ...resolvedOptions,\n      runId,\n    } as AgentExecutionOptions<TOutput>;\n    await agentThreadStreamRuntime.registerRun(\n      this as unknown as Agent<any, any, any, any>,\n      output,\n      resumeStreamOptions,\n      this.getPubSub(),\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    const abort = (reason?: unknown) => {\n      if (!abortController.signal.aborted) {\n        abortController.abort(reason);\n      }\n    };\n\n    return {\n      output,\n      get fullStream() {\n        return output.fullStream as ReadableStream<any>;\n      },\n      runId,\n      threadId: memoryInfo?.threadId,\n      resourceId: memoryInfo?.resourceId,\n      cleanup,\n      abort,\n    };\n  }\n\n  /**\n   * Recover a single durable run whose in-process agentic loop was orphaned by\n   * a process restart. Streamable counterpart to\n   * {@link DurableAgent.recoverActiveRuns} — where the bulk API only re-drives\n   * the workflow and returns counts, `recover()` rebuilds the run's\n   * non-serializable state (message list, model, tools, memory,\n   * saveQueueManager, request context, agent span) from the persisted workflow\n   * snapshot and returns a fresh {@link DurableAgentStreamResult} whose\n   * `fullStream` observes the recovered run through pubsub.\n   *\n   * Because the rebuilt registry entry carries `memory` + `saveQueueManager`,\n   * the durable agentic workflow's terminal step will flush new messages to\n   * memory just like a fresh `stream()` call would. The single-run form is\n   * useful when operators want to attach listeners to a specific recovered\n   * run; for boot-time bulk recovery of every orphaned run, use\n   * `recoverActiveRuns()`.\n   *\n   * @example\n   * ```typescript\n   * const { fullStream, output, cleanup } = await durableAgent.recover(runId, {\n   *   onChunk: chunk => process.stdout.write(chunk.payload?.text ?? ''),\n   * });\n   * for await (const chunk of fullStream) {\n   *   // ...\n   * }\n   * cleanup();\n   * ```\n   */\n  async recover(\n    runId: string,\n    options?: DurableAgentRecoverOptions<TOutput>,\n  ): Promise<DurableAgentStreamResult<TOutput>> {\n    if (!this.#mastra) {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_RECOVER_NO_MASTRA',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text: `DurableAgent \"${this.name}\" recover() requires the agent to be registered on a Mastra instance.`,\n        details: { agentName: this.name, runId },\n      });\n    }\n\n    const workflowsStore = await this.#mastra.getStorage()?.getStore('workflows');\n    if (!workflowsStore) {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_RECOVER_NO_STORAGE',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text:\n          `DurableAgent \"${this.name}\" recover() requires persistent storage to load the run snapshot. ` +\n          `Register the agent on a Mastra instance with persistent storage (e.g. PostgreSQL, LibSQL).`,\n        details: { agentName: this.name, runId },\n      });\n    }\n\n    // 1. Load the persisted snapshot for the durable agentic loop workflow.\n    const persisted = await workflowsStore.getWorkflowRunById({\n      runId,\n      workflowName: DurableStepIds.AGENTIC_LOOP,\n    });\n    if (!persisted) {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_RECOVER_SNAPSHOT_NOT_FOUND',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text:\n          `DurableAgent \"${this.name}\" recover(${runId}): no persisted workflow snapshot found. ` +\n          `The run may have already completed or been cleaned up.`,\n        details: { agentName: this.name, runId },\n      });\n    }\n\n    const snapshot =\n      typeof persisted.snapshot === 'string'\n        ? (JSON.parse(persisted.snapshot) as WorkflowRunState)\n        : persisted.snapshot;\n\n    const workflowInput = snapshot?.context?.input as DurableAgenticWorkflowInput | undefined;\n    if (!workflowInput || workflowInput.__workflowKind !== 'durable-agent') {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_RECOVER_INVALID_SNAPSHOT',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.SYSTEM,\n        text: `DurableAgent \"${this.name}\" recover(${runId}): persisted snapshot does not contain a durable-agent workflow input.`,\n        details: { agentName: this.name, runId },\n      });\n    }\n\n    // All durable agents share the same workflow name (`durable-agentic-loop`),\n    // so a caller with runId in hand could otherwise recover another agent's\n    // run. Refuse to rehydrate a snapshot whose agentId doesn't match this\n    // instance — the caller must reach the owning agent to recover the run.\n    if (workflowInput.agentId !== this.id) {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_RECOVER_AGENT_MISMATCH',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text: `DurableAgent \"${this.name}\" recover(${runId}): persisted run belongs to agent \"${workflowInput.agentId}\", not \"${this.id}\".`,\n        details: { agentName: this.name, runId, ownerAgentId: workflowInput.agentId },\n      });\n    }\n\n    // 2. Rebuild the RequestContext from the persisted JSON-safe snapshot.\n    const requestContext: RequestContext = workflowInput.requestContextEntries\n      ? new RequestContext(Object.entries(workflowInput.requestContextEntries) as Iterable<readonly [string, unknown]>)\n      : new RequestContext();\n\n    // 3. Rebuild MessageList from the persisted state. threadId/resourceId\n    //    come from the workflow input's `state` block when present; older\n    //    snapshots may only have them under `messageListState.memoryInfo`.\n    const messageListMemoryInfo = (\n      workflowInput.messageListState as { memoryInfo?: { threadId?: string; resourceId?: string } } | undefined\n    )?.memoryInfo;\n    const threadId = workflowInput.state?.threadId ?? messageListMemoryInfo?.threadId;\n    const resourceId = workflowInput.state?.resourceId ?? messageListMemoryInfo?.resourceId;\n    const messageList = new MessageList({ threadId, resourceId });\n    try {\n      messageList.deserialize(workflowInput.messageListState);\n    } catch (err) {\n      // Fresh (never-executed) snapshots may have a minimal `messageListState`;\n      // fall back to an empty MessageList so recovery still proceeds. The\n      // workflow steps rebuild the real MessageList from serialized input.\n      this.#mastra?.getLogger?.()?.warn?.(`[DurableAgent] recover(${runId}) messageList deserialize skipped: ${err}`);\n    }\n\n    // 4. Resolve model/memory from the live agent. Tools are rebuilt by the\n    //    durable step from `toolsMetadata`, so we only need the live agent's\n    //    memory here to enable message persistence at the terminal step.\n    const wrapped = this.#wrappedAgent as Agent<string, any, TOutput>;\n    let model;\n    try {\n      model = await wrapped.getModel({ requestContext });\n    } catch (err) {\n      const logger = this.#mastra?.getLogger?.();\n      logger?.warn?.(`[DurableAgent] Failed to resolve model during recover(${runId}): ${err}`);\n    }\n    let memory;\n    try {\n      memory = await wrapped.getMemory({ requestContext });\n    } catch (err) {\n      const logger = this.#mastra?.getLogger?.();\n      logger?.warn?.(`[DurableAgent] Failed to resolve memory during recover(${runId}): ${err}`);\n    }\n    const saveQueueManager = memory\n      ? new SaveQueueManager({ logger: this.#mastra?.getLogger?.() as any, memory })\n      : undefined;\n\n    // Re-wire background-task state so the recovered segment can wait for\n    // pre-crash tasks (via `bg-task-check`), dispatch new background tool\n    // calls (via `tool-call`), and inject the background-task system prompt\n    // (via `llm-execution`). The manager is storage-backed, so in-flight\n    // tasks spawned before the crash are still discoverable via\n    // `bgManager.listTasks(...)`.\n    const backgroundTasksConfig = this.getBackgroundTasksConfig?.();\n    const backgroundTaskManager = this.#mastra?.backgroundTaskManager;\n\n    // Re-resolve processors from the live agent config. `llm-execution` reads\n    // `inputProcessors` / `llmRequestInputProcessors` / `outputProcessors` from\n    // the global registry, and the terminal `.map(...)` reads `outputProcessors`\n    // + `errorProcessors` — without these, the recovered segment would run\n    // with no processors even if the agent has some configured.\n    let inputProcessors: any[] = [];\n    let llmRequestInputProcessors: any[] = [];\n    let outputProcessors: any[] = [];\n    let errorProcessors: any[] = [];\n    try {\n      inputProcessors = (await (wrapped as any).listInputProcessors?.(requestContext)) ?? [];\n      llmRequestInputProcessors = (await (wrapped as any).__listLLMRequestProcessors?.(requestContext)) ?? [];\n      outputProcessors = (await (wrapped as any).listOutputProcessors?.(requestContext)) ?? [];\n      errorProcessors = (await (wrapped as any).listErrorProcessors?.(requestContext)) ?? [];\n    } catch (err) {\n      this.#mastra?.getLogger?.()?.warn?.(`[DurableAgent] recover(${runId}) processor resolution failed: ${err}`);\n    }\n    // Fresh empty processorStates for the recovered segment — the pre-crash\n    // segment's in-memory processor state is gone, but the terminal state\n    // (memory writes, message list) lives on the persisted snapshot.\n    const processorStates = new Map<string, any>();\n\n    // 5. Re-open an AGENT_RUN span for the recovered segment. Follow the same\n    //    pattern as resume(): reuse the original traceId when possible so the\n    //    recovered run stays linked to the original agent trace.\n    const abortController = new AbortController();\n    if (options?.abortSignal) {\n      if (options.abortSignal.aborted) {\n        abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason);\n      } else {\n        options.abortSignal.addEventListener(\n          'abort',\n          () => abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason),\n          { once: true },\n        );\n      }\n    }\n\n    const origAgentSpanData = workflowInput.agentSpanData as { traceId?: string; id?: string } | undefined;\n    let recoverAgentSpan: any;\n    if (this.#mastra?.observability) {\n      try {\n        const rawConfig =\n          typeof (wrapped as any).toRawConfig === 'function' ? (wrapped as any).toRawConfig() : undefined;\n        const resolvedVersionId = rawConfig?.resolvedVersionId as string | undefined;\n        const agentTracingPolicy =\n          typeof wrapped.getTracingPolicy === 'function' ? wrapped.getTracingPolicy() : undefined;\n        recoverAgentSpan = getOrCreateSpan({\n          type: SpanType.AGENT_RUN,\n          name: `agent run: '${wrapped.id}' (recovered)`,\n          entityType: EntityType.AGENT,\n          entityId: wrapped.id,\n          entityName: wrapped.name,\n          metadata: {\n            runId,\n            recovered: true,\n            ...(origAgentSpanData?.id ? { recoveredFromSpanId: origAgentSpanData.id } : {}),\n            ...(resolvedVersionId ? { entityVersionId: resolvedVersionId } : {}),\n          },\n          tracingPolicy: agentTracingPolicy,\n          tracingOptions: origAgentSpanData?.traceId ? { traceId: origAgentSpanData.traceId } : undefined,\n          requestContext,\n          mastra: this.#mastra,\n        });\n      } catch (err) {\n        // Span bookkeeping must never block recovery.\n        this.#mastra?.getLogger?.()?.warn?.(`[DurableAgent] Failed to open recover span: ${err}`);\n      }\n    }\n\n    // 6. Assemble a minimal RunRegistryEntry. Fields that the durable steps\n    //    would normally populate on the fly (tools, workspace, processor\n    //    states, etc.) are left undefined — the workflow's own\n    //    `resolveRuntimeDependencies` will fall back to the persisted step\n    //    input to reconstruct them, so we only need the fields that the\n    //    terminal `.map(...)` step and stream adapter read from the registry:\n    //    saveQueueManager + memory + agentSpan + abortController.\n    const registryEntry: any = {\n      model,\n      memory,\n      saveQueueManager,\n      requestContext,\n      agentSpan: recoverAgentSpan,\n      abortController,\n      abortSignal: abortController.signal,\n      backgroundTaskManager,\n      backgroundTasksConfig,\n      inputProcessors,\n      llmRequestInputProcessors,\n      outputProcessors,\n      errorProcessors,\n      processorStates,\n      cleanup: () => {},\n    };\n\n    // 7. Register the reconstructed state in both the per-instance and global\n    //    registries so the workflow steps + terminal memory flush can find it.\n    this.#runRegistry.registerWithMessageList(runId, registryEntry, messageList, { threadId, resourceId });\n    globalRunRegistry.set(runId, { ...registryEntry, messageList });\n\n    // 8. Cleanup plumbing (mirrors stream()/resume()).\n    let cleanedUp = false;\n    let autoCleanupTimer: ReturnType<typeof setTimeout> | null = null;\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    // 9. Skip any pubsub events broadcast before recovery started. Persistent\n    //    pubsub backends may retain chunks from the pre-crash segment; the\n    //    caller only wants events from the recovered segment forward.\n    const recoverOffset = await this.#getPubsubOffset(runId);\n\n    const {\n      output,\n      cleanup: streamCleanup,\n      ready,\n    } = createDurableAgentStream<TOutput>({\n      pubsub: this.pubsub,\n      runId,\n      messageId: workflowInput.messageId ?? crypto.randomUUID(),\n      model: {\n        modelId: workflowInput.modelConfig?.modelId,\n        provider: workflowInput.modelConfig?.provider,\n        version: 'v3',\n      },\n      threadId,\n      resourceId,\n      offset: recoverOffset,\n      onChunk: options?.onChunk,\n      experimentalTransform: options?.experimentalTransform,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      // Recovered runs use the default `closeOnSuspend: false` — a run that\n      // suspends again should stay observable so a later resume/recover can\n      // pick it up. Callers wanting to close on suspend can call `cleanup()`\n      // from `onSuspended`.\n      messageList,\n    });\n\n    // 10. Re-drive the workflow from the persisted snapshot in the background\n    //     and delete snapshot rows on non-suspended terminals (same contract\n    //     as start()/resume()). Errors are also broadcast via `emitError` so\n    //     observers on the pubsub topic see the failure. Callers who await\n    //     the returned `workflowExecution` (e.g. `recoverActiveRuns()`) see\n    //     the raw rejection so they can classify the run as failed.\n    const workflow = this.getWorkflow();\n    const workflowExecution = ready.then(async () => {\n      try {\n        const run = await workflow.createRun({ runId, pubsub: this.pubsub });\n        const result = await run.restart({\n          requestContext,\n          ...createObservabilityContext({ currentSpan: recoverAgentSpan }),\n        } as any);\n        // Snapshot cleanup runs for every non-suspended terminal (success or\n        // failed) so storage stays bounded — mirrors the start()/resume()\n        // contract.\n        if (result?.status && result.status !== 'suspended') {\n          await this.deleteRunSnapshots(runId);\n        }\n        if (result?.status === 'failed') {\n          const error = new Error((result as any).error?.message || 'Workflow recover failed');\n          void this.emitError(runId, error);\n          throw error;\n        }\n      } catch (error) {\n        void this.emitError(runId, error as Error);\n        throw error;\n      }\n    });\n    const trackedRecoverEntry = globalRunRegistry.get(runId);\n    if (trackedRecoverEntry) {\n      trackedRecoverEntry.workflowExecution = workflowExecution;\n    }\n    // Guard against unhandled rejection warnings for callers who don't await\n    // `workflowExecution` (single-run `recover()` returns a stream, not the\n    // workflow promise). Errors are already surfaced through `emitError` /\n    // the stream's `onError` callback.\n    workflowExecution.catch(() => {});\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    const abort = (reason?: unknown) => {\n      if (!abortController.signal.aborted) {\n        abortController.abort(reason);\n      }\n    };\n\n    return {\n      output,\n      get fullStream() {\n        return output.fullStream as ReadableStream<any>;\n      },\n      runId,\n      threadId,\n      resourceId,\n      cleanup,\n      abort,\n    };\n  }\n\n  /**\n   * Override the inherited `resumeStream()` so that callers using the base\n   * `Agent` API (including `approveToolCall` / `declineToolCall`) are routed\n   * through the durable `resume()` path instead of the regular Agent's\n   * snapshot-based resume.\n   *\n   * Returns just the `MastraModelOutput` (matching the base Agent's return\n   * type) while internally delegating to `this.resume()`.\n   */\n  override async resumeStream(resumeData: any, streamOptions?: any): Promise<MastraModelOutput<TOutput>> {\n    const runId = streamOptions?.runId;\n    if (!runId) {\n      throw new Error('resumeStream() on DurableAgent requires a runId in streamOptions.');\n    }\n    const { runId: _runId, ...resumeOptions } = streamOptions;\n    const result = await this.resume(runId, resumeData, {\n      ...resumeOptions,\n      // Close the stream when the workflow re-suspends so the caller's\n      // `for await` loop terminates. Without this the stream stays open\n      // indefinitely when the resumed turn hits another suspend point.\n      [CLOSE_ON_SUSPEND]: true,\n    } as Parameters<DurableAgent<TAgentId, TTools, TOutput>['resume']>[2]);\n    return result.output;\n  }\n\n  /**\n   * Override the inherited `approveToolCall()` to route through the durable\n   * `resume()` path.\n   */\n  override async approveToolCall(\n    options: { runId: string; toolCallId?: string } & Record<string, any>,\n  ): Promise<MastraModelOutput<any>> {\n    return this.resumeStream({ approved: true }, options);\n  }\n\n  /**\n   * Override the inherited `declineToolCall()` to route through the durable\n   * `resume()` path.\n   */\n  override async declineToolCall(\n    options: { runId: string; toolCallId?: string } & Record<string, any>,\n  ): Promise<MastraModelOutput<any>> {\n    return this.resumeStream({ approved: false }, options);\n  }\n\n  override async approveToolCallGenerate<OUTPUT = undefined>(\n    options: AgentExecutionOptions<OUTPUT> & { runId: string; toolCallId?: string },\n  ): Promise<Awaited<ReturnType<MastraModelOutput<OUTPUT>['getFullOutput']>>> {\n    const { runId, ...resumeOptions } = options;\n    return this.resumeGenerate(runId, { approved: true }, resumeOptions as any) as any;\n  }\n\n  override async declineToolCallGenerate<OUTPUT = undefined>(\n    options: AgentExecutionOptions<OUTPUT> & { runId: string; toolCallId?: string },\n  ): Promise<Awaited<ReturnType<MastraModelOutput<OUTPUT>['getFullOutput']>>> {\n    const { runId, ...resumeOptions } = options;\n    return this.resumeGenerate(runId, { approved: false }, resumeOptions as any) as any;\n  }\n\n  /**\n   * Generate a complete response from the agent using durable execution.\n   *\n   * Drains the underlying durable stream to completion and returns the same\n   * {@link FullOutput} shape as non-durable `Agent.generate`. The underlying\n   * workflow is identical to `stream()` — it just collects the final result\n   * for callers that don't want to consume chunks themselves.\n   *\n   * This method intentionally re-implements the `stream()` setup rather than\n   * delegating to `this.stream(...)` so that `prepareForDurableExecution` (and\n   * downstream `convertTools`) receives `methodType: 'generate'`. Tool\n   * factories that vary their `CoreTool` output based on the calling method\n   * (e.g. `clientTools` vs server-side tools) rely on this signal — calling\n   * `stream()` here would silently pass `methodType: 'stream'`.\n   *\n   * If the run suspends (e.g. tool approval or `suspend()` from a tool), the\n   * returned output's `finishReason` will be `'suspended'` and\n   * `suspendPayload` will be populated. Use {@link DurableAgent.resumeGenerate}\n   * to continue.\n   *\n   * Note on suspend persistence: for the base `DurableAgent`, the workflow\n   * engine's `run.start()` only resolves after the suspend snapshot is\n   * persisted, so awaiting `workflowExecution` on suspend is sufficient for\n   * a subsequent `resumeGenerate()` to find the snapshot. Subclasses like\n   * `EventedAgent` use a fire-and-forget `run.startAsync()` and therefore\n   * cannot rely on this await for snapshot durability — see the\n   * `EventedAgent` docs for the recommended pattern.\n   */\n  // @ts-expect-error - Intentionally different signature for durable execution\n  async generate(\n    messages: MessageListInput,\n    options?: DurableAgentStreamOptions<TOutput>,\n  ): Promise<FullOutput<TOutput>> {\n    options = await this.#resolveExecutionOptions(options);\n\n    // Enforce agent-level FGA (agents:execute) before durable execution — see\n    // stream() above. Durable/evented generate would otherwise skip the gate.\n    await this.requireAgentExecutionFGA({\n      requestContext: options?.requestContext,\n      memory: options?.memory,\n      runId: options?.runId,\n      actor: options?.actor,\n    });\n\n    // 1. Prepare for durable execution (non-durable phase)\n    const preparation = await prepareForDurableExecution<TOutput>({\n      agent: this.#wrappedAgent as Agent<string, any, TOutput>,\n      messages,\n      options: options as AgentExecutionOptions<TOutput>,\n      runId: options?.runId,\n      requestContext: options?.requestContext,\n      optionsAreResolved: true,\n      mastra: this.#mastra,\n      methodType: 'generate',\n      durableAgentId: this.id,\n      durableAgentName: this.name,\n    });\n\n    const { runId, messageId, workflowInput, registryEntry, messageList, threadId, resourceId } = preparation;\n\n    // 1a. Install the abort controller for this run. The controller is owned\n    // by this DurableAgent instance; the result's abort() method flips it,\n    // and the durable LLM-execution step reads `abortSignal` off the registry\n    // to thread it into the model call + abort short-circuits. If the caller\n    // also supplied an external signal, forward its abort to the internal\n    // controller so either source can cancel the run.\n    const abortController = new AbortController();\n    if (options?.abortSignal) {\n      if (options.abortSignal.aborted) {\n        abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason);\n      } else {\n        options.abortSignal.addEventListener(\n          'abort',\n          () => abortController.abort((options.abortSignal as AbortSignal & { reason?: unknown }).reason),\n          { once: true },\n        );\n      }\n    }\n    registryEntry.abortController = abortController;\n    registryEntry.abortSignal = abortController.signal;\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<typeof setTimeout> | 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<TOutput>({\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      experimentalTransform: options?.experimentalTransform,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      onAbort: async data => {\n        try {\n          await (options?.onAbort as ((event: any) => void | Promise<void>) | undefined)?.(data);\n        } finally {\n          scheduleAutoCleanup();\n        }\n      },\n      // onIterationComplete is NOT forwarded here — the dowhile predicate\n      // now calls it in-process from globalRunRegistry and honors its return\n      // value ({ continue, feedback }). The pubsub ITERATION_COMPLETE event\n      // still fires for external observability subscribers.\n      closeOnSuspend: true,\n      structuredOutput: registryEntry.structuredOutput as any,\n      outputProcessors: registryEntry.outputProcessors,\n      messageList,\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    const workflowExecution = ready\n      .then(async () => {\n        // Emit 'start' chunk before the workflow begins (matches regular agent's stream.ts).\n        // Only the initial generate()/stream() path emits 'start'; resume() does not.\n        await emitChunkEvent(this.pubsub, runId, {\n          type: 'start',\n          runId,\n          from: ChunkFrom.AGENT,\n          payload: { id: workflowInput.agentId, messageId },\n        });\n        if (this.__getGoalConfig()) {\n          await beginGoalActivity({\n            mastra: this.#mastra,\n            agentId: workflowInput.agentId,\n            threadId,\n            runId,\n            requestContext: globalRunRegistry.get(runId)?.requestContext,\n          });\n        }\n        try {\n          return await this.executeWorkflow(runId, workflowInput);\n        } finally {\n          await stopGoalActivity({ agentId: workflowInput.agentId, runId });\n        }\n      })\n      .catch(error => {\n        void this.emitError(runId, error);\n      });\n    const trackedEntry = globalRunRegistry.get(runId);\n    if (trackedEntry) {\n      trackedEntry.workflowExecution = workflowExecution;\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    let suspended = false;\n    try {\n      const fullOutput = (await output.getFullOutput()) as FullOutput<TOutput>;\n      if (fullOutput.error) {\n        throw fullOutput.error;\n      }\n      suspended = fullOutput.finishReason === 'suspended';\n      // On suspend, the SUSPENDED event is emitted from the tool-call step\n      // before the workflow engine has persisted the snapshot. Awaiting the\n      // workflow execution promise blocks until `run.start()` returns, which\n      // happens after the suspend snapshot has been persisted — so a later\n      // `resumeGenerate()` can find the snapshot. Subclasses that drive the\n      // workflow with a fire-and-forget API (see `EventedAgent`) need their\n      // own persistence guarantee here; their `executeWorkflow` promise may\n      // resolve before the snapshot lands.\n      if (suspended) {\n        await globalRunRegistry.get(runId)?.workflowExecution;\n      }\n      // Fall back to the stream-level runId if MastraModelOutput.runId wasn't\n      // populated (no chunk surfaced before suspend).\n      if (!fullOutput.runId) {\n        (fullOutput as { runId?: string }).runId = runId;\n      }\n      return fullOutput;\n    } finally {\n      // Keep the registry entry alive on suspend so `resumeGenerate()` can\n      // pick it up. Auto-cleanup is scheduled by FINISH/ERROR/ABORT paths.\n      if (!suspended) {\n        cleanup();\n      }\n    }\n  }\n\n  /**\n   * Resume a suspended durable run and drain it to a single\n   * {@link FullOutput}. Mirrors {@link Agent.resumeGenerate} on top of\n   * {@link DurableAgent.resume}.\n   *\n   * Unlike `generate()`, this delegates to `resume()` because resume reads\n   * its tools from the existing run-registry entry rather than running\n   * `prepareForDurableExecution` again — there is no `methodType` to thread\n   * through. The same `EventedAgent` caveat about fire-and-forget snapshot\n   * persistence noted on `generate()` applies if the resumed turn suspends.\n   */\n  async resumeGenerate(\n    runId: string,\n    resumeData: unknown,\n    options?: Parameters<DurableAgent<TAgentId, TTools, TOutput>['resume']>[2],\n  ): Promise<FullOutput<TOutput>> {\n    const result = await this.resume(runId, resumeData, {\n      ...(options ?? {}),\n      [CLOSE_ON_SUSPEND]: true,\n    } as Parameters<DurableAgent<TAgentId, TTools, TOutput>['resume']>[2]);\n    let suspended = false;\n    try {\n      const fullOutput = (await result.output.getFullOutput()) as FullOutput<TOutput>;\n      if (fullOutput.error) {\n        throw fullOutput.error;\n      }\n      suspended = fullOutput.finishReason === 'suspended';\n      if (suspended) {\n        await globalRunRegistry.get(result.runId)?.workflowExecution;\n      }\n      if (!fullOutput.runId) {\n        (fullOutput as { runId?: string }).runId = result.runId;\n      }\n      return fullOutput;\n    } finally {\n      if (!suspended) {\n        result.cleanup();\n      }\n    }\n  }\n\n  /**\n   * List durable agent runs currently reported as `running` in workflow\n   * snapshot storage.\n   *\n   * A `running` snapshot is a durable agent run whose agentic loop was\n   * mid-execution the last time the workflow engine persisted its state. On a\n   * healthy process these transition to `suspended` (waiting on\n   * tool approval / resume) or a terminal status. On a crashed / restarted\n   * process they are orphaned in the `running` state with no in-process\n   * driver — this is the discovery API used to enumerate them for recovery\n   * (see {@link DurableAgent.recoverActiveRuns} and workflow `restart`).\n   *\n   * Requires persistent workflow storage. Filters `agentId` against the\n   * persisted `DurableAgenticWorkflowInput.agentId`, so runs started by other\n   * durable agents sharing the same storage are not surfaced.\n   *\n   * @example\n   * ```typescript\n   * const { runs } = await durableAgent.listActiveRuns({ resourceId });\n   * for (const run of runs) {\n   *   await durableAgent.recoverActiveRuns({ runId: run.runId });\n   * }\n   * ```\n   */\n  async listActiveRuns(options: DurableAgentListActiveRunsOptions = {}): Promise<DurableAgentListActiveRunsResult> {\n    const { threadId, resourceId, fromDate, toDate, perPage, page } = options;\n\n    if (perPage !== undefined && (!Number.isInteger(perPage) || perPage <= 0)) {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_LIST_ACTIVE_RUNS_INVALID_PER_PAGE',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text: `DurableAgent \"${this.name}\" listActiveRuns() requires perPage to be a positive integer.`,\n        details: { agentName: this.name, perPage },\n      });\n    }\n    if (page !== undefined && (!Number.isInteger(page) || page < 0)) {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_LIST_ACTIVE_RUNS_INVALID_PAGE',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text: `DurableAgent \"${this.name}\" listActiveRuns() requires page to be a non-negative integer.`,\n        details: { agentName: this.name, page },\n      });\n    }\n\n    const workflowsStore = await this.#mastra?.getStorage()?.getStore('workflows');\n\n    if (!workflowsStore) {\n      throw new MastraError({\n        id: 'DURABLE_AGENT_LIST_ACTIVE_RUNS_NO_STORAGE',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text:\n          `DurableAgent \"${this.name}\" listActiveRuns() requires storage to discover running runs. ` +\n          `Register the agent on a Mastra instance with persistent storage (e.g. PostgreSQL, LibSQL).`,\n        details: { agentName: this.name },\n      });\n    }\n\n    const { runs } = await workflowsStore.listWorkflowRuns({\n      workflowName: DurableStepIds.AGENTIC_LOOP,\n      status: 'running',\n      fromDate,\n      toDate,\n    });\n\n    const matchedRuns: DurableAgentActiveRun[] = [];\n    for (const run of runs) {\n      let snapshot = run.snapshot;\n      if (typeof snapshot === 'string') {\n        try {\n          snapshot = JSON.parse(snapshot) as WorkflowRunState;\n        } catch {\n          continue;\n        }\n      }\n      if (snapshot?.status !== 'running') continue;\n\n      // The persisted workflow input carries the owning agentId. Default-deny:\n      // a snapshot without an input or whose agentId does not match this agent\n      // is skipped so runs cannot leak across agents sharing the same storage.\n      const input = snapshot.context?.input as\n        | { agentId?: string; messageListState?: { memoryInfo?: { threadId?: string; resourceId?: string } } }\n        | undefined;\n      const runAgentId = input?.agentId;\n      if (runAgentId !== this.id) continue;\n\n      const memoryInfo = input?.messageListState?.memoryInfo;\n      const runThreadId = memoryInfo?.threadId;\n      const runResourceId = run.resourceId ?? memoryInfo?.resourceId;\n      if (threadId && runThreadId !== threadId) continue;\n      if (resourceId && runResourceId !== resourceId) continue;\n\n      matchedRuns.push({\n        runId: run.runId,\n        status: 'running',\n        threadId: runThreadId,\n        resourceId: runResourceId,\n        updatedAt: run.updatedAt,\n      });\n    }\n\n    const total = matchedRuns.length;\n    const paginatedRuns =\n      perPage !== undefined && page !== undefined\n        ? matchedRuns.slice(page * perPage, (page + 1) * perPage)\n        : matchedRuns;\n\n    return { runs: paginatedRuns, total };\n  }\n\n  /**\n   * Bulk recover durable agent runs whose in-process agentic loop was orphaned\n   * by a process restart. This is the recovery half of the discovery API\n   * paired with {@link DurableAgent.listActiveRuns} and is the typical\n   * boot-time hook.\n   *\n   * Each targeted run is delegated to {@link DurableAgent.recover}, which\n   * rebuilds the run's non-serializable state (message list, model, memory,\n   * save-queue manager, request context, agent span), re-subscribes to the\n   * run's pubsub topic, and restarts the workflow in the background. Because\n   * `recover()` registers `memory` + `saveQueueManager` on the run entry, the\n   * durable agentic workflow's terminal step flushes new messages to memory\n   * just like a fresh `stream()` call would.\n   *\n   * The per-run stream returned by `recover()` is discarded — this method\n   * awaits each run's workflow settlement and reports summary counts instead\n   * of surfacing live event streams. Callers who want to observe a specific\n   * recovered run's events should use {@link DurableAgent.recover} directly\n   * (or {@link DurableAgent.observe} with the returned `runId`).\n   *\n   * Failures are captured per-run so a single bad run does not block\n   * recovery of the rest.\n   *\n   * @example\n   * ```typescript\n   * // Recover every orphaned run for this agent (typical boot-time hook).\n   * const { recovered, succeeded, failed } = await durableAgent.recoverActiveRuns();\n   * logger.info('Recovered durable agent runs', { succeeded, failed });\n   *\n   * // Recover a single run by ID.\n   * await durableAgent.recoverActiveRuns({ runId });\n   * ```\n   */\n  async recoverActiveRuns(\n    options: DurableAgentRecoverActiveRunsOptions = {},\n  ): Promise<DurableAgentRecoverActiveRunsResult> {\n    const { runId, ...discoveryOptions } = options;\n\n    let targetRunIds: string[];\n    if (runId) {\n      targetRunIds = [runId];\n    } else {\n      const { runs } = await this.listActiveRuns(discoveryOptions);\n      targetRunIds = runs.map(r => r.runId);\n    }\n\n    const recovered: DurableAgentRecoveredRun[] = [];\n    let succeeded = 0;\n    let failed = 0;\n\n    for (const targetRunId of targetRunIds) {\n      let runError: Error | undefined;\n      try {\n        // Delegate to the single-run streamable recover path so each run\n        // benefits from the rebuilt registry entry (message list, memory,\n        // saveQueueManager, request context, agent span) and the pubsub\n        // stream / terminal snapshot-cleanup contract stays identical to\n        // `recover()`. We don't surface the per-run stream here — bulk\n        // callers only care about counts — so we just await the workflow\n        // execution promise that `recover()` parks on the registry entry,\n        // capture any failure it surfaces via `onError`, and drop the\n        // stream.\n        const { cleanup } = await this.recover(targetRunId, {\n          onError: ({ error }) => {\n            runError = error instanceof Error ? error : new Error(String(error));\n          },\n        });\n        try {\n          const workflowExecution = globalRunRegistry.get(targetRunId)?.workflowExecution;\n          if (workflowExecution) {\n            await workflowExecution;\n          }\n        } finally {\n          cleanup();\n        }\n        if (runError) throw runError;\n        recovered.push({ runId: targetRunId, status: 'success' });\n        succeeded++;\n      } catch (error) {\n        const err = runError ?? (error instanceof Error ? error : new Error(String(error)));\n        recovered.push({ runId: targetRunId, status: 'failed', error: err });\n        failed++;\n        this.#mastra\n          ?.getLogger?.()\n          ?.error?.(`[DurableAgent] Failed to recover run ${targetRunId}: ${err.message}`, { error: err });\n      }\n    }\n\n    return { recovered, succeeded, failed };\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   * Pass `idleTimeoutMs` to bound how long the stream waits on a silent topic:\n   * a durable run whose driving process crashed stops emitting chunks but never\n   * publishes a terminal event, so without this `observe()` hangs forever on a\n   * producerless topic. When the idle timeout fires, the optional `isAlive`\n   * probe is consulted first — returning true (e.g. a live run-liveness\n   * heartbeat, or a suspended HITL gate) re-arms the timer and keeps waiting,\n   * while false/absent terminates the stream with an error chunk. Both options\n   * are opt-in; omit them for the current unbounded behavior.\n   */\n  async observe(\n    runId: string,\n    options?: {\n      offset?: number;\n      idleTimeoutMs?: number;\n      isAlive?: () => boolean | Promise<boolean>;\n      onChunk?: (chunk: ChunkType<TOutput>) => void | Promise<void>;\n      experimentalTransform?: MastraStreamTransformOptions<TOutput>;\n      onStepFinish?: (result: AgentStepFinishEventData) => void | Promise<void>;\n      onFinish?: MastraOnFinishCallback<TOutput>;\n      onError?: ({ error }: { error: Error | string }) => void | Promise<void>;\n      onSuspended?: (data: AgentSuspendedEventData) => void | Promise<void>;\n    },\n  ): Promise<Omit<DurableAgentStreamResult<TOutput>, '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<typeof setTimeout> | 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<TOutput>({\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      idleTimeoutMs: options?.idleTimeoutMs,\n      isAlive: options?.isAlive,\n      onChunk: options?.onChunk,\n      experimentalTransform: options?.experimentalTransform,\n      onStepFinish: options?.onStepFinish,\n      onFinish: options?.onFinish,\n      onStreamFinished: scheduleAutoCleanup,\n      onError: async error => {\n        await options?.onError?.(error);\n        scheduleAutoCleanup();\n      },\n      onSuspended: options?.onSuspended,\n      structuredOutput: this.#runRegistry.get(runId)?.structuredOutput as any,\n      outputProcessors: this.#runRegistry.get(runId)?.outputProcessors,\n      messageList: globalRunRegistry.get(runId)?.messageList ?? this.#runRegistry.getMessageList(runId),\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    // observe() doesn't own the run's lifecycle, but for API symmetry the\n    // returned `abort` flips the in-process controller currently installed\n    // on the registry. If the run already ended (or is running in a\n    // different process), this is a best-effort no-op.\n    const abort = (reason?: unknown) => {\n      const controller = (globalRunRegistry.get(runId) ?? this.#runRegistry.get(runId))?.abortController;\n      if (controller && !controller.signal.aborted) {\n        controller.abort(reason);\n      }\n    };\n\n    return {\n      output,\n      get fullStream() {\n        return output.fullStream as ReadableStream<any>;\n      },\n      runId,\n      threadId: memoryInfo?.threadId,\n      resourceId: memoryInfo?.resourceId,\n      cleanup,\n      abort,\n    };\n  }\n\n  /**\n   * Clear retained pubsub state for a run's topic (cached history and, for\n   * persistent transports, the underlying stream). Fire-and-forget: the\n   * `clearTopic` contract is best-effort and non-throwing.\n   *\n   * Unlike the evented workflow engine's per-run topic cleanup, this needs no\n   * restart guard: cleanup timers arm only on terminal outcomes\n   * (FINISH/ERROR/ABORT — never SUSPENDED), `resume()` rejects runs whose\n   * snapshot isn't `suspended`, `untilIdle` continuations mint a fresh runId\n   * per segment, and cross-process `recover()` can't race a dead process's\n   * timer. No supported flow re-engages a runId after its timer is armed.\n   */\n  #clearPubsubTopic(runId: string): void {\n    void this.pubsub.clearTopic(AGENT_STREAM_TOPIC(runId));\n  }\n\n  /**\n   * Read the current number of cached events for this run's stream topic.\n   * Used by `resume()` as the subscription offset so we don't re-deliver\n   * events emitted by the original run (notably the SUSPENDED chunk that\n   * paused it).\n   */\n  async #getPubsubOffset(runId: string): Promise<number> {\n    const pubsub = this.pubsub as PubSub & {\n      getHistory?: (topic: string) => Promise<unknown[]>;\n    };\n    if (typeof pubsub.getHistory !== 'function') return 0;\n    try {\n      const history = await pubsub.getHistory(AGENT_STREAM_TOPIC(runId));\n      return Array.isArray(history) ? history.length : 0;\n    } catch {\n      return 0;\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   * @deprecated Use `stream(messages, { untilIdle: true })` instead.\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<OUTPUT = TOutput>(\n    messages: MessageListInput,\n    streamOptions?: DurableAgentStreamOptions<OUTPUT> & { maxIdleMs?: number },\n  ): Promise<DurableAgentStreamResult<OUTPUT>> {\n    const { maxIdleMs, ...options } = streamOptions ?? {};\n    return this.stream(messages, {\n      ...options,\n      untilIdle: maxIdleMs === undefined ? true : { maxIdleMs },\n    } as DurableAgentStreamOptions<TOutput>) as unknown as Promise<DurableAgentStreamResult<OUTPUT>>;\n  }\n\n  /**\n   * Prepare for durable execution without starting it.\n   */\n  async prepare(messages: MessageListInput, options?: AgentExecutionOptions<TOutput>) {\n    const preparation = await prepareForDurableExecution<TOutput>({\n      agent: this.#wrappedAgent as Agent<string, any, TOutput>,\n      messages,\n      options,\n      // Forward the caller-provided runId (mirrors stream()). Without this,\n      // prepareForDurableExecution mints a fresh id, so prepare() registers a\n      // different run than requested and a follow-up resume(runId) — e.g. when\n      // rehydrating a persisted, suspended run in a fresh process — can't find\n      // its registry entry.\n      runId: options?.runId,\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<string, any> = Record<string, any>,\n  TOutput = undefined,\n> {\n  /** The Agent to wrap with durable execution capabilities */\n  agent: Agent<TAgentId, TTools, TOutput>;\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   * Auto-cleanup timer for durable stream state (ms).\n   * Set to `0` to disable auto-cleanup. Defaults to `30_000` (30 seconds).\n   */\n  cleanupTimeoutMs?: 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 when you need to customize the cache, pubsub, or\n * other advanced options. For the common case, prefer the `durable` config\n * flag on `AgentConfig` — attaching an agent constructed with `durable: true`\n * (or `durable: { … }`) to a `Mastra` instance auto-wraps it at registration.\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 *\n * @example\n * ```typescript\n * // Equivalent, using the durable config flag:\n * const agent = new Agent({\n *   id: 'my-agent',\n *   instructions: 'You are helpful',\n *   model: openai('gpt-4'),\n *   durable: true,\n * });\n *\n * const mastra = new Mastra({ agents: { myAgent: agent } });\n * ```\n */\nexport function createDurableAgent<\n  TAgentId extends string = string,\n  TTools extends Record<string, any> = Record<string, any>,\n  TOutput = undefined,\n>(options: CreateDurableAgentOptions<TAgentId, TTools, TOutput>): DurableAgent<TAgentId, TTools, TOutput> {\n  const { agent, id, name, cache, pubsub, maxSteps, cleanupTimeoutMs } = options;\n\n  return new DurableAgent({\n    agent,\n    id,\n    name,\n    cache,\n    pubsub,\n    maxSteps,\n    cleanupTimeoutMs,\n  } as DurableAgentConfig<TAgentId, TTools, TOutput>);\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<string, any> = Record<string, any>,\n  TOutput = undefined,\n> = DurableAgent<TAgentId, TTools, TOutput>;\n"],"mappings":"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"}