{"version":3,"file":"index.cjs","names":["MastraClient","isDataChunk","exhaustiveCheck","isDataChunk","isRecord","AIV5Adapter","MastraClient","typedError"],"sources":["../src/mastra-client-context.tsx","../src/mastra-react-provider.tsx","../src/agent/signal-data.ts","../src/lib/mastra-db/formatCompletionFeedback.ts","../src/lib/mastra-db/types.ts","../src/lib/mastra-db/accumulator.ts","../src/lib/mastra-db/fromCoreUserMessage.ts","../src/agent/extract-tasks.ts","../src/agent/extractRunIdFromMessages.ts","../src/agent/hooks.ts","../src/lib/use-mutation.ts","../src/workflows/use-stream-workflow.ts","../src/workflows/hooks.ts","../src/workflows/WorkflowStepFactory/WorkflowStepFactory.tsx","../src/voice/record-mic-to-file.ts","../src/voice/play-stream-with-web-audio.ts","../src/voice/use-speech-recognition.ts"],"sourcesContent":["import { MastraClient } from '@mastra/client-js';\nimport type { ReactNode } from 'react';\nimport { createContext, useContext, useMemo } from 'react';\n\nexport type MastraClientContextType = MastraClient;\n\nconst MastraClientContext = createContext<MastraClientContextType>({} as MastraClientContextType);\n\n/** Passed through to `fetch` / `MastraClient`. Default `include` sends cookies on cross-origin Studio → API requests. */\nexport type MastraClientCredentials = 'omit' | 'same-origin' | 'include';\n\nexport interface MastraClientProviderProps {\n  children: ReactNode;\n  baseUrl?: string;\n  headers?: Record<string, string>;\n  /** API route prefix. Defaults to '/api'. Set this to match your server's apiPrefix configuration. */\n  apiPrefix?: string;\n  /**\n   * Credentials mode for API requests. Defaults to `include` so session cookies reach a custom server when Studio and API differ by origin/port.\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials\n   */\n  credentials?: MastraClientCredentials;\n  /**\n   * Custom fetch function for HTTP requests. Useful for adding middleware like auth refresh.\n   * When provided, this overrides the default fetch behavior.\n   */\n  customFetch?: typeof fetch;\n}\n\nexport const MastraClientProvider = ({\n  children,\n  baseUrl,\n  headers,\n  apiPrefix,\n  credentials = 'include',\n  customFetch,\n}: MastraClientProviderProps) => {\n  // Consumers key per-client caches (endpoint support, capability probes) on this instance,\n  // so a fresh client each render silently resets them.\n  const client = useMemo(\n    () => createMastraClient(baseUrl, headers, apiPrefix, credentials, customFetch),\n    [baseUrl, headers, apiPrefix, credentials, customFetch],\n  );\n\n  return <MastraClientContext.Provider value={client}>{children}</MastraClientContext.Provider>;\n};\n\nexport const useMastraClient = () => useContext(MastraClientContext);\n\nconst IPV4_LOOPBACK_RE = /^127\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/;\n\nconst isIPv4Loopback = (hostname: string): boolean => {\n  const m = IPV4_LOOPBACK_RE.exec(hostname);\n  if (!m) return false;\n  return +m[1]! <= 255 && +m[2]! <= 255 && +m[3]! <= 255;\n};\n\nexport const isLocalUrl = (url?: string): boolean => {\n  if (!url) return true;\n  try {\n    const { hostname } = new URL(url);\n    return (\n      hostname === 'localhost' ||\n      hostname.endsWith('.localhost') ||\n      isIPv4Loopback(hostname) ||\n      hostname === '::1' ||\n      hostname === '[::1]'\n    );\n  } catch {\n    return false;\n  }\n};\n\nconst createMastraClient = (\n  baseUrl?: string,\n  mastraClientHeaders: Record<string, string> = {},\n  apiPrefix?: string,\n  credentials: MastraClientCredentials = 'include',\n  customFetch?: typeof fetch,\n) => {\n  return new MastraClient({\n    baseUrl: baseUrl || '',\n    headers: isLocalUrl(baseUrl) ? { ...mastraClientHeaders, 'x-mastra-dev-playground': 'true' } : mastraClientHeaders,\n    apiPrefix,\n    credentials,\n    fetch: customFetch,\n  });\n};\n","import type { MastraClientProviderProps } from './mastra-client-context';\nimport { MastraClientProvider } from './mastra-client-context';\ntype MastraReactProviderProps = MastraClientProviderProps;\n\nexport const MastraReactProvider = ({\n  children,\n  baseUrl,\n  headers,\n  apiPrefix,\n  credentials,\n  customFetch,\n}: MastraReactProviderProps) => {\n  return (\n    <MastraClientProvider\n      baseUrl={baseUrl}\n      headers={headers}\n      apiPrefix={apiPrefix}\n      credentials={credentials}\n      customFetch={customFetch}\n    >\n      {children}\n    </MastraClientProvider>\n  );\n};\n","export const uint8ArrayToBase64 = (bytes: Uint8Array): string => {\n  const chunkSize = 0x8000;\n  let binary = '';\n  for (let i = 0; i < bytes.length; i += chunkSize) {\n    binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));\n  }\n  return btoa(binary);\n};\n\nexport function convertSignalDataToBase64String(content: string | ArrayBuffer | Uint8Array): string {\n  if (typeof content === 'string') {\n    return content;\n  }\n\n  const bytes = content instanceof ArrayBuffer ? new Uint8Array(content) : content;\n  return uint8ArrayToBase64(bytes);\n}\n\n/** Canonical DB `file` part `data` for optimistic UI and memory-shaped storage. */\nexport function encodeFilePartDataForStorage(data: string | URL | ArrayBuffer | Uint8Array, mimeType: string): string {\n  if (typeof data === 'string') {\n    return data;\n  }\n\n  if (data instanceof URL) {\n    return data.toString();\n  }\n\n  const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\n  const base64 = uint8ArrayToBase64(bytes);\n  if (base64.startsWith('data:')) {\n    return base64;\n  }\n\n  return `data:${mimeType};base64,${base64}`;\n}\n","type CompletionScorerResult = {\n  duration?: number;\n  passed: boolean;\n  reason?: string;\n  score: number;\n  scorerId: string;\n  scorerName: string;\n};\n\ntype CompletionResult = {\n  complete: boolean;\n  completionReason?: string;\n  scorers: CompletionScorerResult[];\n  timedOut: boolean;\n  totalDuration: number;\n};\n\n// Browser-safe copy of the core completion-feedback formatter.\n// Keep this local so @mastra/react does not pull @mastra/core/loop into client bundles.\nconst formatBaseCompletionFeedback = (\n  result: CompletionResult,\n  maxIterationReached: boolean,\n  formatScorerHeading: (scorer: CompletionScorerResult) => string,\n  incompleteMessage: string,\n) => {\n  const lines: string[] = [];\n\n  lines.push('#### Completion Check Results');\n  lines.push('');\n  lines.push(`Overall: ${result.complete ? '✅ COMPLETE' : '❌ NOT COMPLETE'}`);\n  lines.push(`Duration: ${result.totalDuration}ms`);\n  if (result.timedOut) {\n    lines.push('⚠️ Scoring timed out');\n  }\n  lines.push('');\n\n  for (const scorer of result.scorers) {\n    lines.push(formatScorerHeading(scorer));\n    lines.push(`Score: ${scorer.score} ${scorer.passed ? '✅' : '❌'}`);\n    if (scorer.reason) {\n      lines.push(`Reason: ${scorer.reason}`);\n    }\n    lines.push('');\n  }\n\n  if (result.complete) {\n    lines.push('✅ The task is complete.');\n  } else if (maxIterationReached) {\n    lines.push('⚠️ Max iterations reached.');\n  } else {\n    lines.push(incompleteMessage);\n  }\n\n  return lines.join('\\n');\n};\n\nexport const formatCompletionFeedback = (result: CompletionResult, maxIterationReached: boolean): string => {\n  return formatBaseCompletionFeedback(\n    result,\n    maxIterationReached,\n    scorer => `###### ${scorer.scorerName} (${scorer.scorerId})`,\n    '🔄 Will continue working on the task.',\n  );\n};\n\nexport const formatStreamCompletionFeedback = (result: CompletionResult, maxIterationReached: boolean): string => {\n  return formatBaseCompletionFeedback(\n    result,\n    maxIterationReached,\n    scorer => `**${scorer.scorerName}** (${scorer.scorerId})`,\n    '🔄 The task is not yet complete. Please continue working based on the feedback above.',\n  );\n};\n","import type { MastraMessagePart, AIV5Type } from '@mastra/core/agent/message-list';\nimport type { TripwirePayload } from '@mastra/core/stream';\n\nexport type MastraProviderMetadata = Record<string, Record<string, unknown>>;\n\n/**\n * Tripwire metadata included when a processor triggers a tripwire.\n * Canonical shape sourced from core's `tripwire` stream-chunk payload.\n */\nexport type TripwireMetadata = TripwirePayload;\n\nexport type ToolApprovalArgs = Record<string, unknown>;\n\nexport type RequireApprovalEntry = {\n  toolCallId: string;\n  toolName: string;\n  args: ToolApprovalArgs;\n  runId?: string;\n};\n\nexport type SuspendedToolEntry = {\n  toolCallId: string;\n  toolName: string;\n  args: ToolApprovalArgs;\n  suspendPayload: unknown;\n  runId?: string;\n};\n\nexport type PendingToolApprovalEntry = {\n  toolCallId: string;\n  toolName: string;\n  args: ToolApprovalArgs;\n  runId?: string;\n};\n\nexport type BackgroundTaskEntry = {\n  startedAt: Date;\n  completedAt?: Date;\n  suspendedAt?: Date;\n  taskId: string;\n};\n\nexport type CompletionResult = {\n  passed: boolean;\n  suppressFeedback?: boolean;\n};\n\n/**\n * Canonical metadata block stored under `MastraDBMessage.content.metadata`.\n *\n * Every UX hint the React accumulator needs to surface lives here. Mode-specific\n * fields are all optional so a single record can carry the union without forcing\n * narrowing on the consumer side.\n */\n/**\n * Metadata key carrying a client-generated correlation id. The optimistic\n * pending user bubble and the outgoing `sendMessage` request both stamp this\n * id; the server echoes it back on the `data-user-message` data part so the\n * accumulator can reconcile the pending bubble deterministically (decoupled\n * from the server-assigned signal id). This is transient client state and is\n * stripped once the echo is reconciled and on reload.\n */\nexport const CLIENT_MESSAGE_ID_KEY = 'clientMessageId';\n\nexport type MastraDBMessageMetadata = {\n  /** Which run mode produced this message. */\n  mode?: 'generate' | 'stream' | 'network';\n  /** Client-generated correlation id (see {@link CLIENT_MESSAGE_ID_KEY}). */\n  clientMessageId?: string;\n  /**\n   * Streaming/abort/error/tripwire surface status. `'pending'` marks an\n   * optimistically-appended user message that is awaiting its server signal\n   * echo; it is cleared once the echo arrives and is stripped on reload.\n   */\n  status?: 'warning' | 'error' | 'tripwire' | 'pending';\n  /** Reason recorded by the upstream stream when it finishes. */\n  finishReason?: string;\n  /** Tripwire metadata when status === 'tripwire'. */\n  tripwire?: TripwireMetadata;\n  /** Per-toolName approval requirements declared mid-stream. */\n  requireApprovalMetadata?: Record<string, RequireApprovalEntry>;\n  /** Per-toolName suspension records from suspended tool calls. */\n  suspendedTools?: Record<string, SuspendedToolEntry>;\n  /** Pending approvals keyed by toolCallId (for runtime resolution). */\n  pendingToolApprovals?: Record<string, PendingToolApprovalEntry>;\n  /** Per-toolCallId background-task bookkeeping. */\n  backgroundTasks?: Record<string, BackgroundTaskEntry>;\n  /** Number of background tasks currently executing for this message. */\n  runningBackgroundTasksCount?: number;\n  /** Task-completion result returned by the run (network mode). */\n  completionResult?: CompletionResult;\n  /**\n   * Task-completion verdict from the supervisor `isTaskComplete` path. Shares\n   * the `{ passed, suppressFeedback }` shape with `completionResult`; core\n   * persists it as an object and reads it back as one (see `MessageMerger`).\n   */\n  isTaskCompleteResult?: CompletionResult;\n  /** Signal-echo dedupe: signalId of the user message echoed back. */\n  signalEchoIds?: string[];\n  /** Network-mode bookkeeping. */\n  from?: 'AGENT' | 'WORKFLOW' | 'TOOL';\n  selectionReason?: string;\n  agentInput?: string | object | Array<object>;\n  hasMoreMessages?: boolean;\n  /**\n   * Structured decision emitted by the routing agent. Parsed from the\n   * routing-agent text stream when it forms a balanced JSON object so the\n   * raw payload never reaches the rendered thread.\n   */\n  routingDecision?: Record<string, unknown>;\n  /**\n   * Raw routing-agent text used when the stream did not parse as JSON. Kept\n   * out of the visible parts but exposed for downstream UI (badge tooltips,\n   * metadata dialogs, debugging).\n   */\n  routingDecisionText?: string;\n  /**\n   * Internal buffer for partial routing-agent text deltas. Cleared once the\n   * buffer parses as JSON and is promoted to `routingDecision`.\n   */\n  routingDecisionBuffer?: string;\n};\n\n/**\n * Mastra-extended text part. Adds `textId` (per-stream identifier) and\n * `state` (streaming/done) on top of the V4 text part shape, mirroring the\n * `MastraStepStartPart` extension pattern in core.\n */\nexport type MastraTextPart = {\n  type: 'text';\n  text: string;\n  textId?: string;\n  state?: 'streaming' | 'done';\n  providerMetadata?: MastraProviderMetadata;\n  createdAt?: number;\n};\n\n/**\n * Mastra-extended reasoning part with per-stream identifier and streaming state.\n * `redacted: true` indicates the upstream provider redacted the reasoning content.\n */\nexport type MastraReasoningPart = {\n  type: 'reasoning';\n  reasoning: string;\n  reasoningId?: string;\n  state?: 'streaming' | 'done';\n  redacted?: boolean;\n  providerMetadata?: MastraProviderMetadata;\n  createdAt?: number;\n};\n\n/**\n * Streaming buffer attached to a tool-invocation part while `tool-call-delta`\n * fragments arrive. The accumulator concatenates JSON chunks into `argsText`\n * and parses them on `tool-call-input-streaming-end`. Stored alongside the\n * canonical `args` so the persisted shape still satisfies `MastraDBMessage`.\n */\nexport type StreamingToolInvocationExtension = {\n  argsText?: string;\n};\n\n/**\n * Custom `data-*` chunk part shape persisted on a `MastraDBMessage`. Mirrors\n * AI SDK v5 `DataUIPart` structurally so it is structurally compatible with\n * `MastraMessagePart`, while keeping the React-side accumulator independent\n * of the v5 type machinery.\n */\nexport type StreamingDataPart = {\n  type: `data-${string}`;\n  data: unknown;\n  id?: string;\n};\n\n/**\n * Union of part types the accumulator emits. Compatible with `MastraMessagePart`\n * at runtime; the extended text/reasoning parts add optional fields that\n * downstream consumers (e.g. `AIV5Adapter.toUIMessage`) preserve via\n * providerMetadata round-tripping.\n *\n * `AIV5Type.SourceUrlUIPart` is the flat `type: 'source-url'` shape the\n * accumulator actually pushes for URL source citations (the typed\n * `MastraMessagePart` only models the nested `type: 'source'` shape), so it is\n * listed explicitly as a first-class member of the runtime union.\n */\nexport type AccumulatorPart =\n  | MastraMessagePart\n  | MastraTextPart\n  | MastraReasoningPart\n  | StreamingDataPart\n  | AIV5Type.SourceUrlUIPart;\n","import type {\n  AIV5Type,\n  MastraDBMessage,\n  MastraMessagePart,\n  MastraMessageContentV2,\n  MastraToolInvocation,\n  MastraToolInvocationPart,\n} from '@mastra/core/agent/message-list';\nimport type { AgentChunkType, ChunkType, NetworkChunkType } from '@mastra/core/stream';\nimport type { WorkflowStreamResult, StepResult } from '@mastra/core/workflows';\nimport { uint8ArrayToBase64, encodeFilePartDataForStorage } from '../../agent/signal-data';\nimport { formatCompletionFeedback, formatStreamCompletionFeedback } from './formatCompletionFeedback';\nimport { CLIENT_MESSAGE_ID_KEY } from './types';\nimport type {\n  BackgroundTaskEntry,\n  MastraDBMessageMetadata,\n  MastraProviderMetadata,\n  MastraReasoningPart,\n  MastraTextPart,\n} from './types';\n\n// Boundary cast policy\n// --------------------\n// `MastraMessagePart` (from @mastra/core) is V4-shaped:\n//   - text/reasoning parts have no `state`, `textId`, `reasoningId`, or `redacted`\n//   - the V4 reasoning part requires a `details` array we do not synthesize\n//   - file parts use the canonical DB shape `{ mimeType, data }` so MessageList /\n//     `toAISdkMessages` adapters can read them (V5-shaped `{ mediaType, url }`\n//     only survives conversion on the way *out* to AI SDK UI parts)\n//   - V4 source parts wrap a `LanguageModelV1Source` object; we emit V5-shaped\n//     flat `source-url` / `source-document` parts\n//\n// The React SDK targets AI SDK v5 only, so the accumulator stores a V5-flavored\n// superset of `MastraMessagePart`. Every `as unknown as MastraMessagePart` site\n// in this file is a deliberate storage-boundary cast for one of the above\n// extensions, not an accident. Downstream consumers (`toAISdkV5Messages`,\n// playground `to-assistant-ui-message`) read the V5 fields directly.\n\ntype StreamChunk = {\n  type: string;\n  payload: any;\n  runId: string;\n  from: 'AGENT' | 'WORKFLOW';\n};\n\nconst cloneMetadata = (metadata: MastraDBMessageMetadata | undefined): MastraDBMessageMetadata =>\n  metadata ? { ...metadata } : {};\n\nconst withParts = (message: MastraDBMessage, parts: MastraMessagePart[]): MastraDBMessage => ({\n  ...message,\n  content: {\n    ...message.content,\n    parts,\n  },\n});\n\nconst withMetadata = (message: MastraDBMessage, metadata: MastraDBMessageMetadata): MastraDBMessage => ({\n  ...message,\n  content: {\n    ...message.content,\n    metadata,\n  },\n});\n\n// Drops the transient `pending` status and the `clientMessageId` correlation\n// key from an optimistic user message once its server echo confirms it, leaving\n// the rest of the metadata intact.\nconst clearPendingStatus = (message: MastraDBMessage): MastraDBMessage => {\n  const { status: _status, [CLIENT_MESSAGE_ID_KEY]: _clientMessageId, ...rest } = message.content.metadata ?? {};\n  return withMetadata(message, rest);\n};\n\n// Like `clearPendingStatus` but retains the `clientMessageId` correlation key.\n// Used during `data-user-message` reconciliation so the rendered row key (which\n// prefers `clientMessageId`) stays stable across the id swap, preventing a\n// React unmount/remount and the resulting layout shift. `clientMessageId` is\n// still stripped from persisted threads by `resolveInitialMessages`.\nconst clearPendingStatusKeepClientId = (message: MastraDBMessage): MastraDBMessage => {\n  const { status: _status, ...rest } = message.content.metadata ?? {};\n  return withMetadata(message, rest);\n};\n\nconst replaceLast = (conversation: MastraDBMessage[], message: MastraDBMessage): MastraDBMessage[] => [\n  ...conversation.slice(0, -1),\n  message,\n];\n\nconst replaceAt = (conversation: MastraDBMessage[], index: number, message: MastraDBMessage): MastraDBMessage[] => [\n  ...conversation.slice(0, index),\n  message,\n  ...conversation.slice(index + 1),\n];\n\nconst newAssistantMessage = (\n  id: string,\n  parts: MastraMessagePart[],\n  metadata: MastraDBMessageMetadata,\n): MastraDBMessage => ({\n  id,\n  role: 'assistant',\n  createdAt: new Date(),\n  content: {\n    format: 2,\n    parts,\n    metadata: cloneMetadata(metadata),\n  } satisfies MastraMessageContentV2,\n});\n\nconst appendAssistantMessage = (\n  conversation: MastraDBMessage[],\n  id: string,\n  parts: MastraMessagePart[],\n  metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] => [...conversation, newAssistantMessage(id, parts, metadata)];\n\nconst isToolPart = (part: MastraMessagePart): part is MastraToolInvocationPart => part.type === 'tool-invocation';\n\nconst partTextId = (part: MastraMessagePart): string | undefined =>\n  part.type === 'text' ? (part as MastraTextPart).textId : undefined;\n\nconst partState = (part: MastraMessagePart): string | undefined => (part as { state?: string }).state;\n\nconst partProviderMetadata = (part: MastraMessagePart): Record<string, unknown> | undefined =>\n  (part as { providerMetadata?: Record<string, unknown> }).providerMetadata;\n\n/**\n * Set any streaming text/reasoning parts on the trailing assistant message to\n * `state: 'done'`. Mirrors the previous `finishStreamingAssistantMessage` from\n * the AI-SDK accumulator.\n */\nexport const finishStreamingAssistantMessage = (conversation: MastraDBMessage[]): MastraDBMessage[] => {\n  const lastMessage = conversation[conversation.length - 1];\n  if (!lastMessage || lastMessage.role !== 'assistant') return conversation;\n  if (lastMessage.content.parts.length === 0) return conversation.slice(0, -1);\n\n  const nextParts = lastMessage.content.parts.map(part => {\n    if ((part.type === 'text' || part.type === 'reasoning') && partState(part) === 'streaming') {\n      return {\n        ...(part as MastraTextPart | MastraReasoningPart),\n        state: 'done' as const,\n      } as unknown as MastraMessagePart;\n    }\n    return part;\n  });\n\n  return replaceLast(conversation, withParts(lastMessage, nextParts));\n};\n\n/**\n * Locate the assistant message + tool part owning `toolCallId`. Prefers the\n * most recent assistant message and walks back up to 10 messages, matching the\n * historical accumulator's lookup behavior.\n */\nconst locateToolPart = (\n  messages: MastraDBMessage[],\n  toolCallId: string,\n  allowMetadataOnlyMatch: boolean,\n): { messageIndex: number; toolPartIndex: number } | null => {\n  const findIndex = (parts: MastraMessagePart[]) =>\n    parts.findIndex(part => isToolPart(part) && part.toolInvocation.toolCallId === toolCallId);\n\n  const lastMessage = messages[messages.length - 1];\n  if (lastMessage && lastMessage.role === 'assistant') {\n    const idx = findIndex(lastMessage.content.parts);\n    if (idx !== -1) return { messageIndex: messages.length - 1, toolPartIndex: idx };\n  }\n\n  let count = 0;\n  const maxMessagesBack = 10;\n  for (let i = messages.length - 1; i >= 0; i--) {\n    if (count > maxMessagesBack) break;\n    const message = messages[i];\n    if (message.role !== 'assistant') continue;\n    const idx = findIndex(message.content.parts);\n    if (idx !== -1) return { messageIndex: i, toolPartIndex: idx };\n    count++;\n  }\n\n  if (!allowMetadataOnlyMatch) return null;\n\n  // Fall back to most-recent assistant message for metadata-only updates.\n  for (let i = messages.length - 1; i >= 0; i--) {\n    if (messages[i].role === 'assistant') return { messageIndex: i, toolPartIndex: -1 };\n  }\n  return null;\n};\n\n/**\n * Merge per-toolCallId background-task bookkeeping onto message metadata.\n */\nconst mergeBgTaskMetadata = (\n  existing: MastraDBMessageMetadata | undefined,\n  mode: 'stream' | 'generate' | 'network' | undefined,\n  args: {\n    resetRunningCount?: boolean;\n    perTaskEntry?: {\n      toolCallId: string;\n      startedAt?: Date;\n      completedAt?: Date;\n      suspendedAt?: Date;\n      taskId: string;\n    };\n  },\n  otherMetadata?: MastraDBMessageMetadata,\n): MastraDBMessageMetadata => {\n  const base = cloneMetadata(existing);\n  const existingBgTasks = (base.backgroundTasks ?? {}) as Record<string, BackgroundTaskEntry>;\n\n  const nextBgTasks: Record<string, BackgroundTaskEntry> = { ...existingBgTasks };\n  if (args.perTaskEntry) {\n    const { toolCallId, startedAt, completedAt, taskId, suspendedAt } = args.perTaskEntry;\n    const prev = existingBgTasks[toolCallId] ?? ({ taskId } as BackgroundTaskEntry);\n    nextBgTasks[toolCallId] = {\n      ...prev,\n      taskId,\n      ...(startedAt !== undefined ? { startedAt } : {}),\n      ...(completedAt !== undefined ? { completedAt } : {}),\n      ...(suspendedAt !== undefined ? { suspendedAt } : {}),\n    };\n  }\n\n  const merged: MastraDBMessageMetadata = {\n    ...base,\n    ...(otherMetadata ?? {}),\n    mode,\n    backgroundTasks: nextBgTasks,\n  };\n  if (args.resetRunningCount) merged.runningBackgroundTasksCount = undefined;\n  return merged;\n};\n\n/**\n * Workflow chunk accumulation. Mirrors\n * `mapWorkflowStreamChunkToWatchResult` from the previous accumulator.\n */\nexport const mapWorkflowStreamChunkToWatchResult = (\n  prev: WorkflowStreamResult<any, any, any, any>,\n  chunk: StreamChunk,\n): WorkflowStreamResult<any, any, any, any> => {\n  if (chunk.type === 'workflow-start') {\n    return {\n      input: prev?.input,\n      status: 'running',\n      steps: prev?.steps || {},\n    };\n  }\n\n  if (chunk.type === 'workflow-canceled') {\n    return { ...prev, status: 'canceled' };\n  }\n\n  if (chunk.type === 'workflow-finish') {\n    const finalStatus = chunk.payload.workflowStatus;\n    const prevSteps = prev?.steps ?? {};\n    const lastStep = Object.values(prevSteps).pop();\n    return {\n      ...prev,\n      status: chunk.payload.workflowStatus,\n      ...(finalStatus === 'success' && lastStep?.status === 'success'\n        ? { result: lastStep?.output }\n        : finalStatus === 'failed' && lastStep?.status === 'failed'\n          ? { error: lastStep?.error }\n          : finalStatus === 'tripwire' && chunk.payload.tripwire\n            ? { tripwire: chunk.payload.tripwire }\n            : {}),\n    };\n  }\n\n  const { stepCallId: _stepCallId, stepName: _stepName, ...newPayload } = chunk.payload ?? {};\n  const newSteps = {\n    ...prev?.steps,\n    [chunk.payload.id]: {\n      ...prev?.steps?.[chunk.payload.id],\n      ...newPayload,\n    },\n  };\n\n  if (chunk.type === 'workflow-step-start') return { ...prev, steps: newSteps };\n\n  if (chunk.type === 'workflow-step-suspended') {\n    const suspendedStepIds = Object.entries(newSteps as Record<string, StepResult<any, any, any, any>>).flatMap(\n      ([stepId, stepResult]) => {\n        if (stepResult?.status === 'suspended') {\n          const nestedPath = stepResult?.suspendPayload?.__workflow_meta?.path;\n          return nestedPath ? [[stepId, ...nestedPath]] : [[stepId]];\n        }\n        return [];\n      },\n    );\n    return {\n      ...prev,\n      status: 'suspended',\n      steps: newSteps,\n      suspendPayload: chunk.payload.suspendPayload,\n      suspended: suspendedStepIds as any,\n    };\n  }\n\n  if (chunk.type === 'workflow-step-waiting') return { ...prev, status: 'waiting', steps: newSteps };\n\n  if (chunk.type === 'workflow-step-progress') {\n    return {\n      ...prev,\n      steps: {\n        ...prev?.steps,\n        [chunk.payload.id]: {\n          ...prev?.steps?.[chunk.payload.id],\n          foreachProgress: {\n            completedCount: chunk.payload.completedCount,\n            totalCount: chunk.payload.totalCount,\n            currentIndex: chunk.payload.currentIndex,\n            iterationStatus: chunk.payload.iterationStatus,\n            iterationOutput: chunk.payload.iterationOutput,\n          },\n        },\n      },\n    };\n  }\n\n  if (chunk.type === 'workflow-step-result') return { ...prev, steps: newSteps };\n\n  return prev;\n};\n\nconst signalContentsToUserMessages = (contents: unknown, metadata: MastraDBMessageMetadata): MastraDBMessage[] => {\n  const makeUserMessage = (parts: MastraMessagePart[]): MastraDBMessage => ({\n    id: `signal-${Date.now()}`,\n    role: 'user',\n    createdAt: new Date(),\n    content: {\n      format: 2,\n      parts,\n      metadata: cloneMetadata(metadata),\n    },\n  });\n\n  const toMessagePart = (part: unknown): MastraMessagePart[] => {\n    if (!part || typeof part !== 'object') return [];\n    const typedPart = part as Record<string, unknown>;\n\n    if (typedPart.type === 'text' && typeof typedPart.text === 'string') {\n      return [{ type: 'text', text: typedPart.text }];\n    }\n\n    if (typedPart.type === 'image') {\n      const image = typedPart.image;\n      const mimeType =\n        typeof typedPart.mediaType === 'string'\n          ? typedPart.mediaType\n          : typeof typedPart.mimeType === 'string'\n            ? typedPart.mimeType\n            : 'image/*';\n      if (\n        typeof image === 'string' ||\n        image instanceof URL ||\n        image instanceof ArrayBuffer ||\n        image instanceof Uint8Array\n      ) {\n        return [\n          {\n            type: 'file',\n            mimeType,\n            data: encodeFilePartDataForStorage(image, mimeType),\n          },\n        ];\n      }\n      return [{ type: 'file', mimeType, data: '' }];\n    }\n\n    if (typedPart.type === 'file') {\n      const data = typedPart.data;\n      const mimeType =\n        typeof typedPart.mediaType === 'string'\n          ? typedPart.mediaType\n          : typeof typedPart.mimeType === 'string'\n            ? typedPart.mimeType\n            : 'application/octet-stream';\n      if (\n        typeof data === 'string' ||\n        data instanceof URL ||\n        data instanceof ArrayBuffer ||\n        data instanceof Uint8Array\n      ) {\n        return [\n          {\n            type: 'file',\n            mimeType,\n            data: encodeFilePartDataForStorage(data, mimeType),\n            ...(typeof typedPart.filename === 'string' ? { filename: typedPart.filename } : {}),\n          },\n        ];\n      }\n      const urlFallback = typeof typedPart.url === 'string' ? typedPart.url : '';\n      return [\n        {\n          type: 'file',\n          mimeType,\n          data: urlFallback,\n          ...(typeof typedPart.filename === 'string' ? { filename: typedPart.filename } : {}),\n        },\n      ];\n    }\n\n    return [];\n  };\n\n  if (typeof contents === 'string') {\n    return [makeUserMessage([{ type: 'text', text: contents }])];\n  }\n\n  if (Array.isArray(contents)) {\n    const parts = contents.flatMap(toMessagePart);\n    return parts.length\n      ? [makeUserMessage(parts)]\n      : contents.flatMap(content => signalContentsToUserMessages(content, metadata));\n  }\n\n  if (!contents || typeof contents !== 'object') return [];\n\n  const message = contents as { role?: unknown; content?: unknown };\n  if (message.role && message.role !== 'user') return [];\n\n  const content = message.content;\n  if (typeof content === 'string') {\n    return [makeUserMessage([{ type: 'text', text: content }])];\n  }\n\n  if (!Array.isArray(content)) return [];\n\n  const parts = content.flatMap(toMessagePart);\n  return parts.length ? [makeUserMessage(parts)] : [];\n};\n\nconst reconcilePendingUserEcho = (\n  message: MastraDBMessage,\n  echoedContents: unknown,\n  metadata: MastraDBMessageMetadata,\n  options: { signalId?: string; keepClientMessageId: boolean },\n): MastraDBMessage => {\n  const echoedMessages = signalContentsToUserMessages(echoedContents, metadata);\n  const echoedParts = echoedMessages[0]?.content.parts;\n  let reconciled = typeof options.signalId === 'string' ? { ...message, id: options.signalId } : message;\n  if (echoedParts?.length) {\n    reconciled = { ...reconciled, content: { ...reconciled.content, parts: echoedParts } };\n  }\n  return options.keepClientMessageId ? clearPendingStatusKeepClientId(reconciled) : clearPendingStatus(reconciled);\n};\n\nconst makeToolInvocationPart = (invocation: MastraToolInvocation): MastraToolInvocationPart => ({\n  type: 'tool-invocation',\n  toolInvocation: invocation,\n});\n\n/**\n * Narrow the chunk to the template-literal passthrough variants from\n * `NetworkChunkType`. Encoded as a type guard so the surrounding `switch`\n * statement can stay exhaustive over the remaining string-literal cases.\n */\nconst isTemplateLiteralPassthrough = <T extends { type: string }>(\n  chunk: T,\n): chunk is T & { type: `agent-execution-event-${string}` | `workflow-execution-event-${string}` } =>\n  chunk.type.startsWith('agent-execution-event-') || chunk.type.startsWith('workflow-execution-event-');\n\n/**\n * Narrow the chunk to the `data-${string}` family. Used so the trailing\n * exhaustiveness check can prove the switch covers every remaining variant.\n */\nconst isDataChunk = <T extends { type: string }>(chunk: T): chunk is T & { type: `data-${string}` } =>\n  chunk.type.startsWith('data-');\n\nexport interface AccumulateChunkArgs {\n  chunk: ChunkType;\n  conversation: MastraDBMessage[];\n  metadata: MastraDBMessageMetadata;\n}\n\n/**\n * Reduce a single stream chunk into the running `MastraDBMessage[]`\n * conversation. The accumulator owns the entire chunk→DB mapping for the\n * React SDK; consumers downstream (e.g. `toAISdkV5Messages` in the playground)\n * translate the result into AI SDK / assistant-ui shapes as needed.\n */\nexport const accumulateChunk = ({ chunk, conversation, metadata }: AccumulateChunkArgs): MastraDBMessage[] => {\n  const result = [...conversation];\n\n  // ----- Template-literal passthrough chunk types from NetworkChunkType -----\n  // `agent-execution-event-*` and `workflow-execution-event-*` carry nested\n  // events that are surfaced through other mechanisms (e.g. tool-output\n  // routing); at the top-level DB accumulator they are no-ops. The narrow is\n  // expressed as a function so the remaining switch can be exhaustive over\n  // the literal-typed variants.\n  if (isTemplateLiteralPassthrough(chunk)) {\n    return result;\n  }\n\n  // ----- Custom `data-*` chunks (including signal-echo) -----\n  if (isDataChunk(chunk)) {\n    if (\n      chunk.type === 'data-user-message' &&\n      'data' in chunk &&\n      ((chunk as any).data?.type === 'user-message' || (chunk as any).data?.type === 'user')\n    ) {\n      const signalId = (chunk as any).data.id;\n\n      // Preferred reconciliation: the optimistic pending bubble and the outgoing\n      // message both carry a client-generated `clientMessageId`; the server\n      // echoes it back here. Match on it (not the server-assigned signal id) so\n      // the single optimistic bubble adopts the server id and clears its\n      // transient pending state instead of being duplicated.\n      const echoedClientMessageId = (chunk as any).data?.metadata?.[CLIENT_MESSAGE_ID_KEY];\n      if (\n        typeof echoedClientMessageId === 'string' &&\n        result.some(\n          message =>\n            message.content.metadata?.status === 'pending' &&\n            message.content.metadata[CLIENT_MESSAGE_ID_KEY] === echoedClientMessageId,\n        )\n      ) {\n        return finishStreamingAssistantMessage(\n          result.map(message =>\n            message.content.metadata?.status === 'pending' &&\n            message.content.metadata[CLIENT_MESSAGE_ID_KEY] === echoedClientMessageId\n              ? reconcilePendingUserEcho(message, (chunk as any).data.contents, metadata, {\n                  signalId: typeof signalId === 'string' ? signalId : undefined,\n                  keepClientMessageId: true,\n                })\n              : message,\n          ),\n        );\n      }\n\n      if (typeof signalId === 'string' && result.some(message => message.id === signalId)) {\n        return finishStreamingAssistantMessage(\n          result.map(message =>\n            message.id === signalId && message.content.metadata?.status === 'pending'\n              ? reconcilePendingUserEcho(message, (chunk as any).data.contents, metadata, {\n                  keepClientMessageId: false,\n                })\n              : message,\n          ),\n        );\n      }\n\n      const userMessages = signalContentsToUserMessages((chunk as any).data.contents, metadata);\n      if (!userMessages.length) return result;\n\n      const conversationWithFinishedAssistant = finishStreamingAssistantMessage(result);\n      const messageIdPrefix = typeof signalId === 'string' ? signalId : `signal-${chunk.runId}-${Date.now()}`;\n      return [\n        ...conversationWithFinishedAssistant,\n        ...userMessages.map((message, index) => ({\n          ...message,\n          id: index === 0 ? messageIdPrefix : `${messageIdPrefix}-${index}`,\n        })),\n      ];\n    }\n\n    const dataPart = {\n      type: chunk.type as `data-${string}`,\n      data: 'data' in chunk ? (chunk as any).data : undefined,\n      ...('id' in chunk && typeof (chunk as any).id === 'string' ? { id: (chunk as any).id } : {}),\n    } as unknown as MastraMessagePart;\n\n    const lastMessage = result[result.length - 1];\n    if (!lastMessage || lastMessage.role !== 'assistant') {\n      return appendAssistantMessage(result, `data-${chunk.runId}-${Date.now()}`, [dataPart], metadata);\n    }\n\n    return replaceLast(result, withParts(lastMessage, [...lastMessage.content.parts, dataPart]));\n  }\n\n  switch (chunk.type) {\n    case 'tripwire': {\n      const newMessage = newAssistantMessage(\n        `tripwire-${chunk.runId + Date.now()}`,\n        [{ type: 'text', text: chunk.payload.reason } as MastraMessagePart],\n        {\n          ...metadata,\n          status: 'tripwire',\n          tripwire: {\n            reason: chunk.payload.reason,\n            retry: chunk.payload.retry,\n            metadata: chunk.payload.metadata,\n            processorId: chunk.payload.processorId,\n          },\n        },\n      );\n      return [...result, newMessage];\n    }\n\n    case 'start': {\n      const messageId = typeof chunk.payload.messageId === 'string' ? chunk.payload.messageId : undefined;\n      if (messageId && result.some(message => message.id === messageId)) return result;\n      return [...result, newAssistantMessage(messageId ?? `start-${chunk.runId + Date.now()}`, [], metadata)];\n    }\n\n    case 'text-start': {\n      const lastMessage = result[result.length - 1];\n      const textId = chunk.payload.id || `text-${Date.now()}`;\n      // Dedupe a repeated text-start only when the currently open (tail) text\n      // part already carries this id. Matching anywhere in the message would\n      // wrongly swallow a post-tool continuation that reuses the same text id\n      // (text → tool → text), leaving the second segment without its own part.\n      const tailPart = lastMessage?.content.parts[lastMessage.content.parts.length - 1];\n      if (\n        chunk.payload.id &&\n        lastMessage?.role === 'assistant' &&\n        tailPart?.type === 'text' &&\n        partTextId(tailPart) === textId\n      ) {\n        return result;\n      }\n\n      const newTextPart: MastraTextPart = {\n        type: 'text',\n        text: '',\n        state: 'streaming',\n        textId,\n        providerMetadata: chunk.payload.providerMetadata,\n      };\n\n      if (!lastMessage || lastMessage.role !== 'assistant') {\n        return appendAssistantMessage(\n          result,\n          `start-${chunk.runId}-${Date.now()}`,\n          [newTextPart as MastraMessagePart],\n          metadata,\n        );\n      }\n\n      // If the last message is a completion/isTaskComplete result message, start a new assistant message\n      if (lastMessage.content.metadata?.completionResult) {\n        return appendAssistantMessage(\n          result,\n          `start-${chunk.runId}-${Date.now()}`,\n          [newTextPart as MastraMessagePart],\n          metadata,\n        );\n      }\n\n      return replaceLast(\n        result,\n        withParts(lastMessage, [...lastMessage.content.parts, newTextPart as MastraMessagePart]),\n      );\n    }\n\n    case 'background-task-progress': {\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') return result;\n\n      return replaceLast(\n        result,\n        withMetadata(lastMessage, {\n          mode: metadata.mode,\n          ...(lastMessage.content.metadata as MastraDBMessageMetadata | undefined),\n          runningBackgroundTasksCount: chunk.payload.runningCount,\n        }),\n      );\n    }\n\n    case 'text-delta': {\n      const lastMessage = result[result.length - 1];\n      const textId = chunk.payload.id;\n\n      if (!lastMessage || lastMessage.role !== 'assistant') {\n        const newTextPart: MastraTextPart = {\n          type: 'text',\n          text: chunk.payload.text,\n          state: 'streaming',\n          textId,\n          providerMetadata: chunk.payload.providerMetadata,\n        };\n        return appendAssistantMessage(\n          result,\n          `text-${chunk.runId}-${Date.now()}`,\n          [newTextPart as MastraMessagePart],\n          metadata,\n        );\n      }\n\n      const parts = [...lastMessage.content.parts];\n\n      let textPartIndex = textId\n        ? parts.findLastIndex(part => part.type === 'text' && partTextId(part) === textId)\n        : -1;\n\n      if (textPartIndex === -1) {\n        textPartIndex = parts.findLastIndex(part => part.type === 'text' && partState(part) === 'streaming');\n      }\n\n      // A text run is closed once ANY non-text part is emitted after it — a tool\n      // call, reasoning, a source/citation, a file, a step marker, etc. If the\n      // matched text part is followed by such a part (e.g. text → tool → text or\n      // text → reasoning → text, where a provider like DeepSeek reuses the same\n      // text id across segments), this delta belongs to a NEW text segment.\n      // Appending to the earlier part would merge the two text blocks and push\n      // the intervening part out of order in the live view (issue #18964).\n      // Storage persists them as separate parts, which is why a reload already\n      // renders correctly.\n      if (textPartIndex !== -1 && parts.some((part, index) => index > textPartIndex && part.type !== 'text')) {\n        textPartIndex = -1;\n      }\n\n      if (textPartIndex === -1) {\n        const newTextPart: MastraTextPart = {\n          type: 'text',\n          text: chunk.payload.text,\n          state: 'streaming',\n          textId,\n          providerMetadata: chunk.payload.providerMetadata,\n        };\n        parts.push(newTextPart as MastraMessagePart);\n      } else {\n        const textPart = parts[textPartIndex] as MastraTextPart;\n        parts[textPartIndex] = {\n          ...textPart,\n          text: textPart.text + chunk.payload.text,\n          state: 'streaming',\n        } as MastraMessagePart;\n      }\n\n      return replaceLast(result, withParts(lastMessage, parts));\n    }\n\n    case 'text-end': {\n      // Lifecycle marker only. Streaming text parts stay in `state: 'streaming'`\n      // and are finalized by `finish` / `abort` via `finishStreamingAssistantMessage`.\n      // Returned as-is so the chunk-to-DB mapping stays total.\n      return result;\n    }\n\n    case 'reasoning-start': {\n      const lastMessage = result[result.length - 1];\n      const newReasoningPart: MastraReasoningPart = {\n        type: 'reasoning',\n        reasoning: '',\n        state: 'streaming',\n        providerMetadata: chunk.payload.providerMetadata,\n      };\n\n      if (!lastMessage || lastMessage.role !== 'assistant') {\n        return appendAssistantMessage(\n          result,\n          `reasoning-${chunk.runId + Date.now()}`,\n          [newReasoningPart as unknown as MastraMessagePart],\n          metadata,\n        );\n      }\n\n      return replaceLast(\n        result,\n        withParts(lastMessage, [...lastMessage.content.parts, newReasoningPart as unknown as MastraMessagePart]),\n      );\n    }\n\n    case 'reasoning-delta': {\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') {\n        const newReasoningPart: MastraReasoningPart = {\n          type: 'reasoning',\n          reasoning: chunk.payload.text,\n          state: 'streaming',\n          providerMetadata: chunk.payload.providerMetadata,\n        };\n        return appendAssistantMessage(\n          result,\n          `reasoning-${chunk.runId + Date.now()}`,\n          [newReasoningPart as unknown as MastraMessagePart],\n          metadata,\n        );\n      }\n\n      const parts = [...lastMessage.content.parts];\n      const lastIndex = parts.length - 1;\n      const lastPart = parts[lastIndex];\n\n      if (lastPart?.type === 'reasoning') {\n        const reasoningPart = lastPart as unknown as MastraReasoningPart;\n        parts[lastIndex] = {\n          ...reasoningPart,\n          reasoning: reasoningPart.reasoning + chunk.payload.text,\n          state: 'streaming',\n        } as unknown as MastraMessagePart;\n      } else {\n        const newReasoningPart: MastraReasoningPart = {\n          type: 'reasoning',\n          reasoning: chunk.payload.text,\n          state: 'streaming',\n          providerMetadata: chunk.payload.providerMetadata,\n        };\n        parts.push(newReasoningPart as unknown as MastraMessagePart);\n      }\n\n      return replaceLast(result, withParts(lastMessage, parts));\n    }\n\n    case 'reasoning-end': {\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') return result;\n\n      const parts = [...lastMessage.content.parts];\n      const reasoningIndex = parts.findLastIndex(part => part.type === 'reasoning' && partState(part) === 'streaming');\n      if (reasoningIndex === -1) return result;\n\n      const reasoningPart = parts[reasoningIndex] as unknown as MastraReasoningPart;\n      const existingMeta = reasoningPart.providerMetadata;\n      const endMeta = chunk.payload.providerMetadata;\n\n      parts[reasoningIndex] = {\n        ...reasoningPart,\n        state: 'done',\n        ...(existingMeta || endMeta ? { providerMetadata: { ...(existingMeta ?? {}), ...(endMeta ?? {}) } } : {}),\n      } as unknown as MastraMessagePart;\n\n      return replaceLast(result, withParts(lastMessage, parts));\n    }\n\n    case 'reasoning-signature': {\n      // Merge the signature provider metadata into the most recent reasoning part\n      // (streaming or done). Mirrors historical AI-SDK behavior where the\n      // signature payload becomes part of the reasoning part's providerMetadata.\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') return result;\n\n      const parts = [...lastMessage.content.parts];\n      const reasoningIndex = parts.findLastIndex(part => part.type === 'reasoning');\n      if (reasoningIndex === -1) return result;\n\n      const reasoningPart = parts[reasoningIndex] as unknown as MastraReasoningPart;\n      const existingMeta = reasoningPart.providerMetadata;\n      const sigMeta = chunk.payload.providerMetadata;\n\n      parts[reasoningIndex] = {\n        ...reasoningPart,\n        ...(existingMeta || sigMeta ? { providerMetadata: { ...(existingMeta ?? {}), ...(sigMeta ?? {}) } } : {}),\n      } as unknown as MastraMessagePart;\n\n      return replaceLast(result, withParts(lastMessage, parts));\n    }\n\n    case 'redacted-reasoning': {\n      // Emit a done reasoning part flagged as redacted. The provider redacted\n      // the content; the placeholder preserves the slot in the parts array.\n      const lastMessage = result[result.length - 1];\n      const redactedData = chunk.payload.data;\n      const redactedPart: MastraReasoningPart = {\n        type: 'reasoning',\n        reasoning: typeof redactedData === 'string' ? redactedData : '',\n        state: 'done',\n        redacted: true,\n        providerMetadata: chunk.payload.providerMetadata,\n      };\n\n      if (!lastMessage || lastMessage.role !== 'assistant') {\n        return appendAssistantMessage(\n          result,\n          `redacted-reasoning-${chunk.runId + Date.now()}`,\n          [redactedPart as unknown as MastraMessagePart],\n          metadata,\n        );\n      }\n\n      return replaceLast(\n        result,\n        withParts(lastMessage, [...lastMessage.content.parts, redactedPart as unknown as MastraMessagePart]),\n      );\n    }\n\n    case 'tool-call': {\n      const invocation: MastraToolInvocation = {\n        state: 'call',\n        toolCallId: chunk.payload.toolCallId,\n        toolName: chunk.payload.toolName,\n        args: chunk.payload.args,\n      };\n      const newPart: MastraToolInvocationPart = {\n        ...makeToolInvocationPart(invocation),\n        providerMetadata: chunk.payload.providerMetadata,\n      };\n\n      // Upsert by toolCallId: if `tool-call-input-streaming-start` already created\n      // a placeholder part for this id, transition it in place instead of\n      // appending a duplicate. `chunk.payload.args` is the authoritative\n      // server-side parsed args and overwrites any client-side JSON.parse done\n      // during streaming.\n      const existing = locateToolPart(result, chunk.payload.toolCallId, false);\n      if (existing && existing.toolPartIndex >= 0) {\n        const { messageIndex, toolPartIndex } = existing;\n        const targetMessage = result[messageIndex];\n        if (targetMessage && targetMessage.role === 'assistant') {\n          const parts = [...targetMessage.content.parts];\n          const prev = parts[toolPartIndex] as MastraToolInvocationPart & { argsText?: string };\n          if (isToolPart(prev)) {\n            const { argsText: _argsText, ...rest } = prev;\n            parts[toolPartIndex] = {\n              ...rest,\n              toolInvocation: {\n                ...prev.toolInvocation,\n                state: 'call',\n                toolName: chunk.payload.toolName,\n                toolCallId: chunk.payload.toolCallId,\n                args: chunk.payload.args,\n              } as MastraToolInvocation,\n              providerMetadata: chunk.payload.providerMetadata ?? prev.providerMetadata,\n            } as MastraMessagePart;\n            return replaceAt(result, messageIndex, withParts(targetMessage, parts));\n          }\n        }\n      }\n\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') {\n        return appendAssistantMessage(result, `tool-call-${chunk.runId + Date.now()}`, [newPart], metadata);\n      }\n\n      return replaceLast(result, withParts(lastMessage, [...lastMessage.content.parts, newPart]));\n    }\n\n    case 'tool-call-input-streaming-start': {\n      // Create a placeholder tool-invocation part in `partial-call` state with an\n      // empty args buffer; subsequent `tool-call-delta` chunks append JSON\n      // fragments to `argsText` and `tool-call-input-streaming-end` parses them.\n      const lastMessage = result[result.length - 1];\n      const invocation: MastraToolInvocation = {\n        state: 'partial-call',\n        toolCallId: chunk.payload.toolCallId,\n        toolName: chunk.payload.toolName,\n        args: {},\n      };\n      const newPart: MastraToolInvocationPart & { argsText?: string } = {\n        ...makeToolInvocationPart(invocation),\n        argsText: '',\n      };\n\n      if (!lastMessage || lastMessage.role !== 'assistant') {\n        return appendAssistantMessage(\n          result,\n          `tool-call-streaming-${chunk.runId + Date.now()}`,\n          [newPart as MastraMessagePart],\n          metadata,\n        );\n      }\n\n      return replaceLast(result, withParts(lastMessage, [...lastMessage.content.parts, newPart as MastraMessagePart]));\n    }\n\n    case 'tool-call-delta': {\n      // Append the streamed JSON fragment onto the matching tool invocation's\n      // `argsText` buffer. Keep `args` empty/parsed-so-far until the end chunk.\n      const location = locateToolPart(result, chunk.payload.toolCallId, false);\n      if (!location || location.toolPartIndex < 0) return result;\n      const { messageIndex, toolPartIndex } = location;\n      const targetMessage = result[messageIndex];\n      if (!targetMessage || targetMessage.role !== 'assistant') return result;\n\n      const parts = [...targetMessage.content.parts];\n      const toolPart = parts[toolPartIndex] as MastraToolInvocationPart & { argsText?: string };\n      if (!isToolPart(toolPart)) return result;\n\n      const nextArgsText = (toolPart.argsText ?? '') + (chunk.payload.argsTextDelta ?? '');\n      parts[toolPartIndex] = {\n        ...toolPart,\n        argsText: nextArgsText,\n        toolInvocation: {\n          ...toolPart.toolInvocation,\n          state: 'partial-call',\n        } as MastraToolInvocation,\n      } as MastraMessagePart;\n\n      return replaceAt(result, messageIndex, withParts(targetMessage, parts));\n    }\n\n    case 'tool-call-input-streaming-end': {\n      // Finalize the streaming args: parse `argsText` and transition to `call`.\n      // If parsing fails, keep `args: {}` so downstream consumers stay safe.\n      const location = locateToolPart(result, chunk.payload.toolCallId, false);\n      if (!location || location.toolPartIndex < 0) return result;\n      const { messageIndex, toolPartIndex } = location;\n      const targetMessage = result[messageIndex];\n      if (!targetMessage || targetMessage.role !== 'assistant') return result;\n\n      const parts = [...targetMessage.content.parts];\n      const toolPart = parts[toolPartIndex] as MastraToolInvocationPart & { argsText?: string };\n      if (!isToolPart(toolPart)) return result;\n\n      let parsedArgs: Record<string, unknown> = {};\n      const argsText = toolPart.argsText;\n      if (typeof argsText === 'string' && argsText.length > 0) {\n        try {\n          const maybe = JSON.parse(argsText);\n          if (maybe && typeof maybe === 'object' && !Array.isArray(maybe)) {\n            parsedArgs = maybe as Record<string, unknown>;\n          }\n        } catch {\n          parsedArgs = {};\n        }\n      }\n\n      parts[toolPartIndex] = {\n        ...toolPart,\n        toolInvocation: {\n          ...toolPart.toolInvocation,\n          state: 'call',\n          args: parsedArgs,\n        } as MastraToolInvocation,\n      } as MastraMessagePart;\n\n      return replaceAt(result, messageIndex, withParts(targetMessage, parts));\n    }\n\n    case 'tool-output-denied': {\n      const location = locateToolPart(result, chunk.payload.toolCallId, false);\n      if (!location || location.toolPartIndex < 0) return result;\n      const { messageIndex, toolPartIndex } = location;\n      const targetMessage = result[messageIndex];\n      if (!targetMessage || targetMessage.role !== 'assistant') return result;\n\n      const parts = [...targetMessage.content.parts];\n      const toolPart = parts[toolPartIndex];\n      if (!isToolPart(toolPart)) return result;\n\n      parts[toolPartIndex] = {\n        ...toolPart,\n        toolInvocation: {\n          ...toolPart.toolInvocation,\n          state: 'output-denied',\n          toolName: chunk.payload.toolName,\n          args: chunk.payload.args ?? toolPart.toolInvocation.args,\n          approval: chunk.payload.approval,\n        },\n      } as MastraMessagePart;\n\n      return replaceAt(result, messageIndex, withParts(targetMessage, parts));\n    }\n\n    case 'tool-error':\n    case 'tool-result':\n    case 'background-task-completed':\n    case 'background-task-failed': {\n      const isBgTaskEvent = chunk.type === 'background-task-completed' || chunk.type === 'background-task-failed';\n      const location = locateToolPart(result, chunk.payload.toolCallId, isBgTaskEvent);\n      if (!location) return result;\n      const { messageIndex, toolPartIndex } = location;\n      const targetMessage = result[messageIndex];\n      if (!targetMessage || targetMessage.role !== 'assistant') return result;\n\n      const parts = [...targetMessage.content.parts];\n      const toolPart = toolPartIndex >= 0 ? parts[toolPartIndex] : undefined;\n\n      // Narrow the merged-case payload by chunk.type so each branch has typed\n      // access to its specific fields without `as any`.\n      let payloadResult: unknown;\n      let payloadError: unknown;\n      let payloadIsError = false;\n      let payloadProviderMetadata: MastraProviderMetadata | undefined;\n      let payloadCompletedAt: Date | undefined;\n      let payloadTaskId: string | undefined;\n      switch (chunk.type) {\n        case 'tool-result':\n          payloadResult = chunk.payload.result;\n          payloadIsError = Boolean(chunk.payload.isError);\n          payloadProviderMetadata = chunk.payload.providerMetadata as MastraProviderMetadata | undefined;\n          break;\n        case 'tool-error':\n          payloadError = chunk.payload.error;\n          payloadProviderMetadata = chunk.payload.providerMetadata as MastraProviderMetadata | undefined;\n          break;\n        case 'background-task-completed':\n          payloadResult = chunk.payload.result;\n          payloadCompletedAt = chunk.payload.completedAt;\n          payloadTaskId = chunk.payload.taskId;\n          break;\n        case 'background-task-failed':\n          payloadError = chunk.payload.error;\n          payloadCompletedAt = chunk.payload.completedAt;\n          payloadTaskId = chunk.payload.taskId;\n          break;\n      }\n\n      if (toolPart && isToolPart(toolPart)) {\n        const { toolName, toolCallId, args } = toolPart.toolInvocation;\n        // Provider metadata flows through opaquely; cast once at the storage\n        // boundary because the V4 part type pins it to SharedV2ProviderMetadata\n        // (Record<string, Record<string, JSONValue>>) and Mastra payloads are\n        // not constrained to that shape.\n        const providerMeta = (payloadProviderMetadata ??\n          toolPart.providerMetadata) as MastraToolInvocationPart['providerMetadata'];\n\n        const isError = chunk.type === 'tool-error' || chunk.type === 'background-task-failed' || payloadIsError;\n\n        if (isError) {\n          const error =\n            chunk.type === 'tool-error' || chunk.type === 'background-task-failed' ? payloadError : payloadResult;\n          const errorText =\n            typeof error === 'string'\n              ? error\n              : error instanceof Error\n                ? error.message\n                : ((error as { message?: string } | null)?.message ?? String(error));\n\n          parts[toolPartIndex] = {\n            ...toolPart,\n            providerMetadata: providerMeta,\n            toolInvocation: {\n              state: 'output-error',\n              toolCallId,\n              toolName,\n              args,\n              errorText,\n            } as MastraToolInvocation,\n          };\n        } else {\n          const resultObj = payloadResult as { result?: { steps?: unknown }; childMessages?: unknown } | undefined;\n          // A workflow tool-result is a *finalization* event, not a replacement.\n          // The accumulated `WorkflowStreamResult` (steps, status, etc.) was\n          // built up by prior `tool-output` chunks via\n          // `mapWorkflowStreamChunkToWatchResult`. The terminal `tool-result`\n          // payload for dynamic workflows is often just `{ result: <scalar>, runId }`\n          // with no `steps` field, so detecting workflows purely from the new\n          // payload would clobber that state. Also check the tool name and any\n          // previously-accumulated `WorkflowStreamResult`-shaped result.\n          const existingResult =\n            toolPart.toolInvocation.state === 'partial-call' || toolPart.toolInvocation.state === 'result'\n              ? (toolPart.toolInvocation as { result?: unknown }).result\n              : undefined;\n          const existingLooksLikeWorkflow = Boolean(\n            existingResult && typeof existingResult === 'object' && 'steps' in (existingResult as object),\n          );\n          const isWorkflow =\n            Boolean(resultObj?.result?.steps) || toolName?.startsWith('workflow-') || existingLooksLikeWorkflow;\n          const isAgent = chunk.from === 'AGENT';\n          let output: unknown;\n          if (isWorkflow) {\n            // Prefer merging the terminal payload into the accumulated\n            // workflow state so the UI keeps its step history.\n            const accumulated =\n              existingLooksLikeWorkflow && existingResult && typeof existingResult === 'object'\n                ? (existingResult as Record<string, unknown>)\n                : undefined;\n            const payloadWorkflow =\n              resultObj?.result && typeof resultObj.result === 'object'\n                ? (resultObj.result as Record<string, unknown>)\n                : undefined;\n            if (accumulated || payloadWorkflow) {\n              output = {\n                ...(accumulated ?? {}),\n                ...(payloadWorkflow ?? {}),\n                // Preserve `steps` from accumulated state when the terminal\n                // payload doesn't carry them.\n                steps: (payloadWorkflow?.steps as unknown) ?? (accumulated?.steps as unknown) ?? [],\n                status: (payloadWorkflow?.status as unknown) ?? (accumulated?.status as unknown) ?? 'success',\n                // Surface the terminal scalar output without losing history.\n                output: payloadResult,\n              };\n            } else {\n              output = payloadResult;\n            }\n          } else if (isAgent) {\n            const existingOutput =\n              toolPart.toolInvocation.state === 'result' ? toolPart.toolInvocation.result : undefined;\n            const existingChild = (existingOutput as { childMessages?: unknown[] } | undefined)?.childMessages;\n            output = existingOutput\n              ? {\n                  ...(payloadResult as object),\n                  childMessages: existingChild?.length ? existingChild : resultObj?.childMessages,\n                }\n              : payloadResult;\n          } else {\n            output = payloadResult;\n          }\n\n          parts[toolPartIndex] = {\n            ...toolPart,\n            providerMetadata: providerMeta,\n            toolInvocation: {\n              state: 'result',\n              toolCallId,\n              toolName,\n              args,\n              result: output,\n            } as MastraToolInvocation,\n          };\n        }\n      }\n\n      const nextMetadata = mergeBgTaskMetadata(\n        targetMessage.content.metadata as MastraDBMessageMetadata | undefined,\n        metadata.mode,\n        {\n          resetRunningCount: isBgTaskEvent,\n          perTaskEntry:\n            isBgTaskEvent && payloadTaskId\n              ? {\n                  toolCallId: chunk.payload.toolCallId,\n                  completedAt: payloadCompletedAt,\n                  taskId: payloadTaskId,\n                }\n              : undefined,\n        },\n      );\n\n      const nextMessage: MastraDBMessage = {\n        ...targetMessage,\n        content: {\n          ...targetMessage.content,\n          parts,\n          metadata: nextMetadata,\n        },\n      };\n\n      return replaceAt(result, messageIndex, nextMessage);\n    }\n\n    case 'background-task-running': {\n      const location = locateToolPart(result, chunk.payload.toolCallId, true);\n      if (!location) return result;\n      const { messageIndex } = location;\n      const targetMessage = result[messageIndex];\n      if (!targetMessage || targetMessage.role !== 'assistant') return result;\n\n      const nextMetadata = mergeBgTaskMetadata(\n        targetMessage.content.metadata as MastraDBMessageMetadata | undefined,\n        metadata.mode,\n        {\n          perTaskEntry: {\n            toolCallId: chunk.payload.toolCallId,\n            startedAt: chunk.payload.startedAt,\n            taskId: chunk.payload.taskId,\n          },\n        },\n      );\n\n      return replaceAt(result, messageIndex, withMetadata(targetMessage, nextMetadata));\n    }\n\n    case 'tool-output':\n    case 'background-task-output': {\n      const isBgTaskOutput = chunk.type === 'background-task-output';\n      const location = locateToolPart(result, chunk.payload.toolCallId, isBgTaskOutput);\n      if (!location || location.toolPartIndex < 0) return result;\n      const { messageIndex, toolPartIndex } = location;\n      const targetMessage = result[messageIndex];\n      if (!targetMessage || targetMessage.role !== 'assistant') return result;\n\n      const parts = [...targetMessage.content.parts];\n      const toolPart = parts[toolPartIndex];\n      if (!isToolPart(toolPart)) return result;\n\n      const { toolName, toolCallId, args } = toolPart.toolInvocation;\n      const payloadOutput =\n        chunk.type === 'background-task-output' ? chunk.payload.payload.payload.output : chunk.payload.output;\n\n      // Workflow stream output: accumulate into watch-result state\n      if (payloadOutput?.type?.startsWith('workflow-')) {\n        const existingWorkflowState =\n          ((toolPart.toolInvocation as any).result as WorkflowStreamResult<any, any, any, any>) ||\n          ({} as WorkflowStreamResult<any, any, any, any>);\n        const updated = mapWorkflowStreamChunkToWatchResult(existingWorkflowState, payloadOutput);\n\n        parts[toolPartIndex] = {\n          ...toolPart,\n          toolInvocation: {\n            state: 'partial-call',\n            toolCallId,\n            toolName,\n            args,\n            result: updated,\n          } as MastraToolInvocation,\n        };\n      } else if (\n        payloadOutput?.from === 'AGENT' ||\n        (payloadOutput?.from === 'USER' && payloadOutput?.payload?.output?.type?.startsWith('workflow-'))\n      ) {\n        return accumulateAgentChunk(payloadOutput, result, metadata, toolCallId, toolName);\n      } else {\n        const currentResult = (toolPart.toolInvocation as any).result;\n        const existing = Array.isArray(currentResult) ? currentResult : [];\n        parts[toolPartIndex] = {\n          ...toolPart,\n          toolInvocation: {\n            state: 'partial-call',\n            toolCallId,\n            toolName,\n            args,\n            result: [...existing, payloadOutput],\n          } as MastraToolInvocation,\n        };\n      }\n\n      return replaceAt(result, messageIndex, withParts(targetMessage, parts));\n    }\n\n    case 'is-task-complete': {\n      if (chunk.payload.suppressFeedback) return result;\n\n      const feedback = formatStreamCompletionFeedback(\n        {\n          complete: chunk.payload.passed,\n          scorers: chunk.payload.results,\n          totalDuration: chunk.payload.duration,\n          timedOut: chunk.payload.timedOut,\n          completionReason: chunk.payload.reason,\n        },\n        chunk.payload.maxIterationReached,\n      );\n\n      const newMessage = newAssistantMessage(\n        `is-task-complete-${chunk.runId + Date.now()}`,\n        [{ type: 'text', text: feedback } as MastraMessagePart],\n        {\n          ...metadata,\n          completionResult: { passed: chunk.payload.passed },\n        },\n      );\n      return [...result, newMessage];\n    }\n\n    case 'source': {\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') return result;\n\n      const parts = [...lastMessage.content.parts];\n      if (chunk.payload.sourceType === 'url') {\n        // Flat V5 `source-url` shape (see boundary cast policy above). Typed as\n        // the shared `AIV5Type.SourceUrlUIPart` so the literal is shape-checked,\n        // then stored via the storage-boundary cast like the other V5 parts.\n        const sourceUrlPart: AIV5Type.SourceUrlUIPart = {\n          type: 'source-url',\n          sourceId: chunk.payload.id,\n          url: chunk.payload.url || '',\n          title: chunk.payload.title,\n          providerMetadata: chunk.payload.providerMetadata,\n        };\n        parts.push(sourceUrlPart as unknown as MastraMessagePart);\n      } else if (chunk.payload.sourceType === 'document') {\n        parts.push({\n          type: 'source-document',\n          sourceId: chunk.payload.id,\n          mediaType: chunk.payload.mimeType || 'application/octet-stream',\n          title: chunk.payload.title,\n          filename: chunk.payload.filename,\n          providerMetadata: chunk.payload.providerMetadata,\n        } as MastraMessagePart);\n      }\n\n      return replaceLast(result, withParts(lastMessage, parts));\n    }\n\n    case 'file': {\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') return result;\n\n      const parts = [...lastMessage.content.parts];\n\n      let data: string;\n      if (typeof chunk.payload.data === 'string') {\n        data = chunk.payload.base64\n          ? `data:${chunk.payload.mimeType};base64,${chunk.payload.data}`\n          : `data:${chunk.payload.mimeType},${encodeURIComponent(chunk.payload.data)}`;\n      } else {\n        const base64 = uint8ArrayToBase64(chunk.payload.data);\n        data = `data:${chunk.payload.mimeType};base64,${base64}`;\n      }\n\n      parts.push({\n        type: 'file',\n        mimeType: chunk.payload.mimeType,\n        data,\n        providerMetadata: chunk.payload.providerMetadata,\n      } as unknown as MastraMessagePart);\n\n      return replaceLast(result, withParts(lastMessage, parts));\n    }\n\n    case 'tool-call-approval': {\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') return result;\n\n      const existingMeta = (lastMessage.content.metadata as MastraDBMessageMetadata | undefined) ?? {};\n      const lastRequireApproval = existingMeta.mode === 'stream' ? (existingMeta.requireApprovalMetadata ?? {}) : {};\n\n      return replaceLast(result, {\n        ...lastMessage,\n        content: {\n          ...lastMessage.content,\n          metadata: {\n            ...existingMeta,\n            mode: 'stream',\n            requireApprovalMetadata: {\n              ...lastRequireApproval,\n              [chunk.payload.toolName]: {\n                toolCallId: chunk.payload.toolCallId,\n                toolName: chunk.payload.toolName,\n                args: chunk.payload.args as Record<string, unknown>,\n              },\n            },\n          },\n        },\n      });\n    }\n\n    case 'tool-call-suspended':\n    case 'background-task-suspended': {\n      const isBgTaskEvent = chunk.type === 'background-task-suspended';\n      // Narrow merged payloads explicitly. Both shapes carry the fields below.\n      let suspToolCallId: string;\n      let suspToolName: string;\n      let suspArgs: Record<string, unknown>;\n      let suspPayload: unknown;\n      let suspSuspendedAt: Date | undefined;\n      let suspTaskId: string | undefined;\n      if (chunk.type === 'background-task-suspended') {\n        suspToolCallId = chunk.payload.toolCallId;\n        suspToolName = chunk.payload.toolName;\n        suspArgs = chunk.payload.args;\n        suspPayload = chunk.payload.suspendPayload;\n        suspSuspendedAt = chunk.payload.suspendedAt;\n        suspTaskId = chunk.payload.taskId;\n      } else {\n        suspToolCallId = chunk.payload.toolCallId;\n        suspToolName = chunk.payload.toolName;\n        suspArgs = chunk.payload.args as Record<string, unknown>;\n        suspPayload = chunk.payload.suspendPayload;\n      }\n\n      const location = isBgTaskEvent\n        ? locateToolPart(result, suspToolCallId, true)\n        : { messageIndex: result.length - 1 };\n      if (!location) return result;\n      const { messageIndex } = location;\n      const targetMessage = result[messageIndex];\n      if (!targetMessage || targetMessage.role !== 'assistant') return result;\n\n      const existingMeta = (targetMessage.content.metadata as MastraDBMessageMetadata | undefined) ?? {};\n      const lastSuspendedTools = existingMeta.mode === 'stream' ? (existingMeta.suspendedTools ?? {}) : {};\n\n      const nextMetadata = mergeBgTaskMetadata(\n        existingMeta,\n        'stream',\n        {\n          resetRunningCount: isBgTaskEvent,\n          perTaskEntry:\n            isBgTaskEvent && suspTaskId\n              ? {\n                  toolCallId: suspToolCallId,\n                  suspendedAt: suspSuspendedAt,\n                  taskId: suspTaskId,\n                }\n              : undefined,\n        },\n        {\n          suspendedTools: {\n            ...lastSuspendedTools,\n            [suspToolName]: {\n              toolCallId: suspToolCallId,\n              toolName: suspToolName,\n              args: suspArgs,\n              suspendPayload: suspPayload,\n              runId: chunk.runId,\n            },\n          },\n        },\n      );\n\n      return replaceAt(result, messageIndex, withMetadata(targetMessage, nextMetadata));\n    }\n\n    case 'finish':\n    case 'abort': {\n      return finishStreamingAssistantMessage(result);\n    }\n\n    case 'error': {\n      const newMessage = newAssistantMessage(\n        `error-${chunk.runId + Date.now()}`,\n        [\n          {\n            type: 'text',\n            text: typeof chunk.payload.error === 'string' ? chunk.payload.error : JSON.stringify(chunk.payload.error),\n          } as MastraMessagePart,\n        ],\n        {\n          ...metadata,\n          status: 'error',\n        },\n      );\n      return [...result, newMessage];\n    }\n\n    // ----- Rotated response message ids (`step-start.payload.messageId` carries\n    // the id the following step's output is persisted under; processors like\n    // observational memory can rotate it mid-run) -----\n    case 'step-start': {\n      const stepMessageId = typeof chunk.payload?.messageId === 'string' ? chunk.payload.messageId : undefined;\n      if (!stepMessageId) return result;\n\n      const lastMessage = result[result.length - 1];\n      if (!lastMessage || lastMessage.role !== 'assistant') return result;\n      if (result.some(message => message.id === stepMessageId)) return result;\n\n      // Re-key the pending message in place while it only holds `data-*` parts\n      // (they belong to the run, not a persisted row); once model content has\n      // streamed under the previous id, split into a new message instead.\n      const hasModelContent = lastMessage.content.parts.some(part => !String(part.type).startsWith('data-'));\n      if (!hasModelContent) {\n        return replaceLast(result, { ...lastMessage, id: stepMessageId });\n      }\n\n      return appendAssistantMessage(finishStreamingAssistantMessage(result), stepMessageId, [], metadata);\n    }\n\n    // ----- Lifecycle / step / framing chunks (not surfaced on DB messages) -----\n    case 'step-finish':\n    case 'step-output':\n    case 'raw':\n    case 'watch':\n    case 'response-metadata':\n      return result;\n\n    // ----- Goal evaluation signal (feedback is already injected into the\n    // message history by the core goal step; the chunk is a consumer-only\n    // signal and is not surfaced as its own DB message). -----\n    case 'goal':\n      return result;\n\n    // ----- Object chunks (object/object-result are not stored on DB messages) -----\n    case 'object':\n    case 'object-result':\n      return result;\n\n    // ----- Background-task lifecycle markers not folded into messages -----\n    case 'background-task-started':\n    case 'background-task-cancelled':\n    case 'background-task-resumed':\n      return result;\n\n    // ----- Workflow lifecycle passthroughs (handled by mapWorkflowStreamChunkToWatchResult inside tool-output) -----\n    case 'workflow-start':\n    case 'workflow-finish':\n    case 'workflow-canceled':\n    case 'workflow-paused':\n    case 'workflow-step-start':\n    case 'workflow-step-finish':\n    case 'workflow-step-suspended':\n    case 'workflow-step-waiting':\n    case 'workflow-step-output':\n    case 'workflow-step-progress':\n    case 'workflow-step-result':\n      return result;\n\n    // ----- Nested-execution / routing / network passthroughs -----\n    case 'agent-execution-start':\n    case 'agent-execution-approval':\n    case 'agent-execution-suspended':\n    case 'agent-execution-end':\n    case 'agent-execution-abort':\n    case 'tool-execution-start':\n    case 'tool-execution-end':\n    case 'tool-execution-approval':\n    case 'tool-execution-suspended':\n    case 'tool-execution-abort':\n    case 'routing-agent-start':\n    case 'routing-agent-text-delta':\n    case 'routing-agent-text-start':\n    case 'routing-agent-end':\n    case 'routing-agent-abort':\n    case 'workflow-execution-start':\n    case 'workflow-execution-end':\n    case 'workflow-execution-suspended':\n    case 'workflow-execution-abort':\n    case 'network-execution-event-step-finish':\n    case 'network-execution-event-finish':\n    case 'network-validation-start':\n    case 'network-validation-end':\n    case 'network-object':\n    case 'network-object-result':\n    case 'tool-output-denied':\n      return result;\n\n    default:\n      // Exhaustiveness check: any new `ChunkType` variant must be added above.\n      return assertExhaustive(chunk as never, result);\n  }\n};\n\n/**\n * Compile-time exhaustiveness helper. At runtime, returns the conversation\n * unchanged so unexpected chunk variants never throw inside the React stream\n * pump; TypeScript will fail to compile if `ChunkType` ever grows a new branch\n * that isn't enumerated above.\n */\nconst assertExhaustive = (_chunk: never, fallback: MastraDBMessage[]): MastraDBMessage[] => fallback;\n\n// ----- Nested agent-chunk accumulation (mirrors `toUIMessageFromAgent`) -----\n\nconst accumulateAgentChunk = (\n  chunk: AgentChunkType,\n  conversation: MastraDBMessage[],\n  _metadata: MastraDBMessageMetadata,\n  parentToolCallId?: string,\n  parentToolName?: string,\n): MastraDBMessage[] => {\n  const lastMessage = conversation[conversation.length - 1];\n  if (!lastMessage || lastMessage.role !== 'assistant') return conversation;\n\n  const parts = [...lastMessage.content.parts];\n\n  const findToolPartIndex = () =>\n    parts.findIndex(\n      part =>\n        isToolPart(part) &&\n        ((parentToolCallId && part.toolInvocation.toolCallId === parentToolCallId) ||\n          (parentToolName && part.toolInvocation.toolName === parentToolName)),\n    );\n\n  if (chunk.type === 'text-delta') {\n    const agentChunk = chunk.payload as any;\n    const toolPartIndex = findToolPartIndex();\n    if (toolPartIndex === -1) return conversation;\n\n    const toolPart = parts[toolPartIndex] as MastraToolInvocationPart;\n    const existingResult = (toolPart.toolInvocation as any).result || {};\n    const childMessages = existingResult.childMessages || [];\n    const lastChildMessage = childMessages[childMessages.length - 1];\n\n    const textMessage = { type: 'text', content: (lastChildMessage?.content || '') + agentChunk.text };\n    const nextChildren =\n      lastChildMessage?.type === 'text'\n        ? [...childMessages.slice(0, -1), textMessage]\n        : [...childMessages, textMessage];\n\n    parts[toolPartIndex] = {\n      ...toolPart,\n      toolInvocation: {\n        ...toolPart.toolInvocation,\n        result: { ...existingResult, childMessages: nextChildren },\n      } as MastraToolInvocation,\n    };\n  } else if (chunk.type === 'tool-call') {\n    const agentChunk = chunk.payload as any;\n    const toolPartIndex = findToolPartIndex();\n    if (toolPartIndex === -1) return conversation;\n\n    const toolPart = parts[toolPartIndex] as MastraToolInvocationPart;\n    const existingResult = (toolPart.toolInvocation as any).result || {};\n    const childMessages = existingResult.childMessages || [];\n\n    parts[toolPartIndex] = {\n      ...toolPart,\n      toolInvocation: {\n        ...toolPart.toolInvocation,\n        result: {\n          ...existingResult,\n          childMessages: [\n            ...childMessages,\n            {\n              type: 'tool',\n              toolCallId: agentChunk.toolCallId,\n              toolName: agentChunk.toolName,\n              args: agentChunk.args,\n            },\n          ],\n        },\n      } as MastraToolInvocation,\n    };\n  } else if (chunk.type === 'tool-output') {\n    const agentChunk = chunk.payload as any;\n    const toolPartIndex = findToolPartIndex();\n    if (toolPartIndex === -1) return conversation;\n\n    const toolPart = parts[toolPartIndex] as MastraToolInvocationPart;\n    if (agentChunk?.output?.type?.startsWith('workflow-')) {\n      const existingResult = (toolPart.toolInvocation as any).result || {};\n      const childMessages = existingResult.childMessages || [];\n      const lastIndex = childMessages.length - 1;\n      const currentMessage = childMessages[lastIndex];\n      const actualExistingWorkflowState = (currentMessage as any)?.toolOutput || {};\n      const updated = mapWorkflowStreamChunkToWatchResult(actualExistingWorkflowState, agentChunk.output);\n\n      if (lastIndex >= 0 && childMessages[lastIndex]?.type === 'tool') {\n        parts[toolPartIndex] = {\n          ...toolPart,\n          toolInvocation: {\n            ...toolPart.toolInvocation,\n            result: {\n              ...existingResult,\n              childMessages: [\n                ...childMessages.slice(0, -1),\n                {\n                  ...currentMessage,\n                  toolOutput: { ...updated, runId: agentChunk.output.runId },\n                },\n              ],\n            },\n          } as MastraToolInvocation,\n        };\n      }\n    }\n  } else if (chunk.type === 'tool-result') {\n    const agentChunk = chunk.payload as any;\n    const toolPartIndex = findToolPartIndex();\n    if (toolPartIndex === -1) return conversation;\n\n    const toolPart = parts[toolPartIndex] as MastraToolInvocationPart;\n    const existingResult = (toolPart.toolInvocation as any).result || {};\n    const childMessages = existingResult.childMessages || [];\n    const lastIndex = childMessages.length - 1;\n    const isWorkflow = agentChunk?.toolName?.startsWith('workflow-');\n\n    if (lastIndex >= 0 && childMessages[lastIndex]?.type === 'tool') {\n      parts[toolPartIndex] = {\n        ...toolPart,\n        toolInvocation: {\n          ...toolPart.toolInvocation,\n          result: {\n            ...existingResult,\n            childMessages: [\n              ...childMessages.slice(0, -1),\n              {\n                ...childMessages[lastIndex],\n                toolOutput: isWorkflow\n                  ? { ...(agentChunk.result as any)?.result, runId: (agentChunk.result as any)?.runId }\n                  : agentChunk.result,\n              },\n            ],\n          },\n        } as MastraToolInvocation,\n      };\n    }\n  }\n\n  return replaceLast(conversation, withParts(lastMessage, parts));\n};\n\nexport interface AccumulateNetworkChunkArgs {\n  chunk: NetworkChunkType;\n  conversation: MastraDBMessage[];\n  metadata: MastraDBMessageMetadata;\n}\n\n// Network-mode helpers\n// --------------------\n// These mirror the historical `AISdkNetworkTransformer` from the AI-SDK layer,\n// translating `NetworkChunkType` into `MastraDBMessage[]`. The transformer's\n// `MastraUIMessage` model (`{ parts, metadata }`) maps onto `MastraDBMessage`\n// (`content.parts` / `content.metadata`). Text and `dynamic-tool` parts are\n// stored as the same V5-flavored superset of `MastraMessagePart` documented in\n// the boundary-cast policy at the top of this file. This is a temporary bridge\n// to keep network mode rendering until the next major.\n\nconst networkMode = (metadata: MastraDBMessageMetadata): MastraDBMessageMetadata => ({ ...metadata, mode: 'network' });\n\nconst findPartIndex = (parts: MastraMessagePart[], predicate: (part: MastraMessagePart) => boolean): number =>\n  parts.findIndex(predicate);\n\n// `dynamic-tool` is a V5 part type stored via the boundary-cast policy; it is\n// not present in the V4 `MastraMessagePart` union, so match on the raw string.\nconst isDynamicToolPart = (part: MastraMessagePart): boolean => (part as { type: string }).type === 'dynamic-tool';\n\nconst lastAssistant = (conversation: MastraDBMessage[]): MastraDBMessage | undefined => {\n  const last = conversation[conversation.length - 1];\n  return last && last.role === 'assistant' ? last : undefined;\n};\n\n/**\n * Try to parse the buffered routing-agent text as a JSON object. Returns the\n * parsed object on success, or `null` while the buffer is still incomplete or\n * not JSON at all.\n */\nconst tryParseRoutingDecision = (buffered: string): Record<string, unknown> | null => {\n  const trimmed = buffered.trim();\n  if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) return null;\n  try {\n    const parsed = JSON.parse(trimmed);\n    if (parsed && typeof parsed === 'object') {\n      return parsed as Record<string, unknown>;\n    }\n    return null;\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Routing-agent text deltas describe the network's routing decision (often a\n * JSON object such as `{ \"isNetwork\": true, \"agentId\": \"...\", ... }`). The raw\n * payload is never useful in the rendered thread, so we buffer it in\n * message-level metadata, promote it to `routingDecision` when it parses as\n * JSON, and fall back to `routingDecisionText` for non-JSON routing models.\n * No visible text part is produced.\n */\nconst handleRoutingAgentDelta = (\n  chunk: NetworkChunkType,\n  conversation: MastraDBMessage[],\n  metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] => {\n  const delta = (chunk.payload as { text?: string })?.text ?? '';\n  if (!delta) return conversation;\n\n  const lastMessage = lastAssistant(conversation);\n\n  const mergeRoutingMetadata = (existing: MastraDBMessageMetadata): MastraDBMessageMetadata => {\n    const buffered = (existing.routingDecisionBuffer ?? '') + delta;\n    const next: MastraDBMessageMetadata = { ...cloneMetadata(existing), mode: 'network' };\n    const parsed = tryParseRoutingDecision(buffered);\n    if (parsed) {\n      next.routingDecision = parsed;\n      delete next.routingDecisionBuffer;\n      delete next.routingDecisionText;\n    } else {\n      next.routingDecisionBuffer = buffered;\n      next.routingDecisionText = buffered;\n    }\n    return next;\n  };\n\n  if (!lastMessage) {\n    const seed = mergeRoutingMetadata({});\n    return appendAssistantMessage(\n      conversation,\n      `routing-agent-${(chunk.payload as { runId?: string })?.runId ?? 'unknown'}-${Date.now()}`,\n      [],\n      { ...networkMode(metadata), ...seed },\n    );\n  }\n\n  return replaceLast(conversation, withMetadata(lastMessage, mergeRoutingMetadata(lastMessage.content.metadata ?? {})));\n};\n\nconst handleAgentNetworkChunk = (\n  chunk: NetworkChunkType,\n  conversation: MastraDBMessage[],\n  metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] => {\n  if (chunk.type === 'agent-execution-start') {\n    const primitiveId = (chunk.payload as any)?.args?.primitiveId;\n    const runId = (chunk.payload as any).runId;\n    if (!primitiveId || !runId) return conversation;\n\n    const toolPart = {\n      type: 'dynamic-tool',\n      toolName: primitiveId,\n      toolCallId: runId,\n      state: 'input-available',\n      input: (chunk.payload as any).args,\n    } as unknown as MastraMessagePart;\n\n    return appendAssistantMessage(conversation, `agent-execution-start-${runId}-${Date.now()}`, [toolPart], {\n      ...networkMode(metadata),\n      selectionReason: (chunk.payload as any)?.args?.selectionReason || '',\n      agentInput: (chunk.payload as any)?.args?.task,\n      from: 'AGENT',\n    });\n  }\n\n  if (chunk.type === 'agent-execution-end') {\n    const lastMessage = lastAssistant(conversation);\n    if (!lastMessage) return conversation;\n\n    const parts = [...lastMessage.content.parts];\n    const toolPartIndex = findPartIndex(parts, part => isDynamicToolPart(part));\n    if (toolPartIndex !== -1) {\n      const toolPart = parts[toolPartIndex] as any;\n      const currentOutput = toolPart.output as any;\n      parts[toolPartIndex] = {\n        type: 'dynamic-tool',\n        toolName: toolPart.toolName,\n        toolCallId: toolPart.toolCallId,\n        state: 'output-available',\n        input: toolPart.input,\n        output: { ...currentOutput, result: currentOutput?.result || (chunk.payload as any)?.result || '' },\n      } as unknown as MastraMessagePart;\n    }\n\n    return replaceLast(conversation, withParts(lastMessage, parts));\n  }\n\n  if (chunk.type.startsWith('agent-execution-event-')) {\n    const lastMessage = lastAssistant(conversation);\n    if (!lastMessage) return conversation;\n\n    const agentChunk = chunk.payload as any;\n    const parts = [...lastMessage.content.parts];\n    const toolPartIndex = findPartIndex(parts, part => isDynamicToolPart(part));\n    if (toolPartIndex === -1) return conversation;\n    const toolPart = parts[toolPartIndex] as any;\n\n    if (agentChunk.type === 'text-delta') {\n      const childMessages = toolPart?.output?.childMessages || [];\n      const lastChildMessage = childMessages[childMessages.length - 1];\n      const textMessage = { type: 'text', content: (lastChildMessage?.content || '') + agentChunk.payload.text };\n      const nextMessages =\n        lastChildMessage?.type === 'text'\n          ? [...childMessages.slice(0, -1), textMessage]\n          : [...childMessages, textMessage];\n      parts[toolPartIndex] = {\n        ...toolPart,\n        output: { childMessages: nextMessages },\n      } as unknown as MastraMessagePart;\n    } else if (agentChunk.type === 'tool-call') {\n      const childMessages = toolPart?.output?.childMessages || [];\n      parts[toolPartIndex] = {\n        ...toolPart,\n        output: {\n          ...toolPart?.output,\n          childMessages: [\n            ...childMessages,\n            {\n              type: 'tool',\n              toolCallId: agentChunk.payload.toolCallId,\n              toolName: agentChunk.payload.toolName,\n              args: agentChunk.payload.args,\n            },\n          ],\n        },\n      } as unknown as MastraMessagePart;\n    } else if (agentChunk.type === 'tool-output') {\n      if (agentChunk.payload?.output?.type?.startsWith('workflow-')) {\n        const childMessages = toolPart?.output?.childMessages || [];\n        const lastToolIndex = childMessages.length - 1;\n        const currentMessage = childMessages[lastToolIndex];\n        const actualExistingWorkflowState = currentMessage?.toolOutput || {};\n        const updatedWorkflowState = mapWorkflowStreamChunkToWatchResult(\n          actualExistingWorkflowState,\n          agentChunk.payload.output,\n        );\n        if (lastToolIndex >= 0 && childMessages[lastToolIndex]?.type === 'tool') {\n          parts[toolPartIndex] = {\n            ...toolPart,\n            output: {\n              ...toolPart?.output,\n              childMessages: [...childMessages.slice(0, -1), { ...currentMessage, toolOutput: updatedWorkflowState }],\n            },\n          } as unknown as MastraMessagePart;\n        }\n      }\n    } else if (agentChunk.type === 'tool-result') {\n      const childMessages = toolPart?.output?.childMessages || [];\n      const lastToolIndex = childMessages.length - 1;\n      const isWorkflow = Boolean(agentChunk.payload?.result?.result?.steps);\n      if (lastToolIndex >= 0 && childMessages[lastToolIndex]?.type === 'tool') {\n        parts[toolPartIndex] = {\n          ...toolPart,\n          output: {\n            ...toolPart?.output,\n            childMessages: [\n              ...childMessages.slice(0, -1),\n              {\n                ...childMessages[lastToolIndex],\n                toolOutput: isWorkflow ? agentChunk.payload.result.result : agentChunk.payload.result,\n              },\n            ],\n          },\n        } as unknown as MastraMessagePart;\n      }\n    }\n\n    return replaceLast(conversation, withParts(lastMessage, parts));\n  }\n\n  return conversation;\n};\n\nconst handleWorkflowNetworkChunk = (\n  chunk: NetworkChunkType,\n  conversation: MastraDBMessage[],\n  metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] => {\n  if (chunk.type === 'workflow-execution-start') {\n    const primitiveId = (chunk.payload as any)?.args?.primitiveId;\n    const runId = (chunk.payload as any).runId;\n    if (!primitiveId || !runId) return conversation;\n\n    let agentInput: string | object;\n    try {\n      agentInput = JSON.parse((chunk.payload as any)?.args?.prompt);\n    } catch {\n      agentInput = (chunk.payload as any)?.args?.prompt;\n    }\n\n    const toolPart = {\n      type: 'dynamic-tool',\n      toolName: primitiveId,\n      toolCallId: runId,\n      state: 'input-available',\n      input: (chunk.payload as any).args,\n    } as unknown as MastraMessagePart;\n\n    return appendAssistantMessage(conversation, `workflow-start-${runId}-${Date.now()}`, [toolPart], {\n      ...networkMode(metadata),\n      selectionReason: (chunk.payload as any)?.args?.selectionReason || '',\n      from: 'WORKFLOW',\n      agentInput,\n    });\n  }\n\n  if (chunk.type === 'workflow-execution-suspended') {\n    const lastMessage = lastAssistant(conversation);\n    if (!lastMessage) return conversation;\n    const existing = lastMessage.content.metadata?.suspendedTools ?? {};\n    return replaceLast(\n      conversation,\n      withMetadata(lastMessage, {\n        ...cloneMetadata(lastMessage.content.metadata),\n        mode: 'network',\n        suspendedTools: {\n          ...existing,\n          [(chunk.payload as any).toolName]: {\n            toolCallId: (chunk.payload as any).toolCallId,\n            toolName: (chunk.payload as any).toolName,\n            args: (chunk.payload as any).args,\n            suspendPayload: (chunk.payload as any).suspendPayload,\n            runId: (chunk.payload as any).runId,\n          },\n        },\n      }),\n    );\n  }\n\n  if (chunk.type.startsWith('workflow-execution-event-')) {\n    const lastMessage = lastAssistant(conversation);\n    if (!lastMessage) return conversation;\n\n    const parts = [...lastMessage.content.parts];\n    const toolPartIndex = findPartIndex(parts, part => isDynamicToolPart(part));\n    if (toolPartIndex === -1) return conversation;\n    const toolPart = parts[toolPartIndex] as any;\n\n    const existingWorkflowState = (toolPart.output as WorkflowStreamResult<any, any, any, any>) || ({} as any);\n    const updatedWorkflowState = mapWorkflowStreamChunkToWatchResult(existingWorkflowState, chunk.payload as any);\n\n    parts[toolPartIndex] = { ...toolPart, output: updatedWorkflowState } as unknown as MastraMessagePart;\n    return replaceLast(conversation, withParts(lastMessage, parts));\n  }\n\n  return conversation;\n};\n\nconst handleToolNetworkChunk = (\n  chunk: NetworkChunkType,\n  conversation: MastraDBMessage[],\n  metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] => {\n  if (chunk.type === 'tool-execution-start') {\n    const argsData = (chunk.payload as any).args;\n    const nestedArgs = argsData.args || {};\n    const lastMessage = lastAssistant(conversation);\n\n    const toolPart = {\n      type: 'dynamic-tool',\n      toolName: argsData.toolName || 'unknown',\n      toolCallId: argsData.toolCallId || 'unknown',\n      state: 'input-available',\n      input: nestedArgs,\n    } as unknown as MastraMessagePart;\n\n    if (!lastMessage) {\n      return appendAssistantMessage(\n        conversation,\n        `tool-start-${(chunk.payload as any).runId}-${Date.now()}`,\n        [toolPart],\n        {\n          ...networkMode(metadata),\n          selectionReason: metadata.mode === 'network' ? metadata.selectionReason || argsData.selectionReason : '',\n          agentInput: nestedArgs,\n        },\n      );\n    }\n\n    const parts = [...lastMessage.content.parts, toolPart];\n    return replaceLast(conversation, withParts(lastMessage, parts));\n  }\n\n  if (chunk.type === 'tool-execution-approval') {\n    const lastMessage = lastAssistant(conversation);\n    if (!lastMessage) return conversation;\n    const existing = lastMessage.content.metadata?.requireApprovalMetadata ?? {};\n    return replaceLast(\n      conversation,\n      withMetadata(lastMessage, {\n        ...cloneMetadata(lastMessage.content.metadata),\n        mode: 'network',\n        requireApprovalMetadata: {\n          ...existing,\n          [(chunk.payload as any).toolName]: {\n            toolCallId: (chunk.payload as any).toolCallId,\n            toolName: (chunk.payload as any).toolName,\n            args: (chunk.payload as any).args,\n            runId: (chunk.payload as any).runId,\n          },\n        },\n      }),\n    );\n  }\n\n  if (chunk.type === 'tool-execution-suspended') {\n    const lastMessage = lastAssistant(conversation);\n    if (!lastMessage) return conversation;\n    const existing = lastMessage.content.metadata?.suspendedTools ?? {};\n    return replaceLast(\n      conversation,\n      withMetadata(lastMessage, {\n        ...cloneMetadata(lastMessage.content.metadata),\n        mode: 'network',\n        suspendedTools: {\n          ...existing,\n          [(chunk.payload as any).toolName]: {\n            toolCallId: (chunk.payload as any).toolCallId,\n            toolName: (chunk.payload as any).toolName,\n            args: (chunk.payload as any).args,\n            suspendPayload: (chunk.payload as any).suspendPayload,\n            runId: (chunk.payload as any).runId,\n          },\n        },\n      }),\n    );\n  }\n\n  if (chunk.type === 'tool-execution-end') {\n    const lastMessage = lastAssistant(conversation);\n    if (!lastMessage) return conversation;\n\n    const parts = [...lastMessage.content.parts];\n    const toolPartIndex = findPartIndex(\n      parts,\n      part => isDynamicToolPart(part) && (part as any).toolCallId === (chunk.payload as any).toolCallId,\n    );\n    if (toolPartIndex !== -1) {\n      const toolPart = parts[toolPartIndex] as any;\n      const currentOutput = toolPart.output as any;\n      parts[toolPartIndex] = {\n        type: 'dynamic-tool',\n        toolName: toolPart.toolName,\n        toolCallId: toolPart.toolCallId,\n        state: 'output-available',\n        input: toolPart.input,\n        output: currentOutput?.result || (chunk.payload as any)?.result || '',\n      } as unknown as MastraMessagePart;\n    }\n\n    return replaceLast(conversation, withParts(lastMessage, parts));\n  }\n\n  return conversation;\n};\n\n/**\n * Reduce a single network-mode chunk into the running `MastraDBMessage[]`\n * conversation. Ports the historical `AISdkNetworkTransformer` so the playground\n * keeps rendering network badges (routing text, agent/workflow/tool execution,\n * suspensions, approvals, completion feedback) until the next major.\n */\nexport const accumulateNetworkChunk = ({\n  chunk,\n  conversation,\n  metadata,\n}: AccumulateNetworkChunkArgs): MastraDBMessage[] => {\n  const newConversation = [...conversation];\n\n  if (chunk.type === 'routing-agent-text-delta') {\n    return handleRoutingAgentDelta(chunk, newConversation, metadata);\n  }\n\n  if (chunk.type.startsWith('agent-execution-')) {\n    return handleAgentNetworkChunk(chunk, newConversation, metadata);\n  }\n\n  if (chunk.type.startsWith('workflow-execution-')) {\n    return handleWorkflowNetworkChunk(chunk, newConversation, metadata);\n  }\n\n  if (chunk.type.startsWith('tool-execution-')) {\n    return handleToolNetworkChunk(chunk, newConversation, metadata);\n  }\n\n  if (chunk.type === 'network-validation-end') {\n    if ((chunk.payload as any).suppressFeedback) return newConversation;\n\n    const feedback = formatCompletionFeedback(\n      {\n        complete: (chunk.payload as any).passed,\n        scorers: (chunk.payload as any).results,\n        totalDuration: (chunk.payload as any).duration,\n        timedOut: (chunk.payload as any).timedOut,\n        completionReason: (chunk.payload as any).reason,\n      },\n      (chunk.payload as any).maxIterationReached,\n    );\n\n    const textPart = { type: 'text', text: feedback } as unknown as MastraMessagePart;\n    return appendAssistantMessage(\n      newConversation,\n      `network-validation-end-${(chunk.payload as any).runId}-${Date.now()}`,\n      [textPart],\n      {\n        ...networkMode(metadata),\n        completionResult: { passed: (chunk.payload as any).passed },\n      },\n    );\n  }\n\n  if (chunk.type === 'network-execution-event-step-finish') {\n    const lastMessage = lastAssistant(newConversation);\n    if (!lastMessage) return newConversation;\n\n    const agentChunk = chunk.payload as any;\n    const parts = [...lastMessage.content.parts];\n    const textPartIndex = findPartIndex(parts, part => part.type === 'text');\n\n    if (textPartIndex === -1) {\n      parts.push({ type: 'text', text: agentChunk.result, state: 'done' } as unknown as MastraMessagePart);\n      return replaceLast(newConversation, withParts(lastMessage, parts));\n    }\n\n    const textPart = parts[textPartIndex];\n    if (textPart.type === 'text') {\n      parts[textPartIndex] = {\n        ...(textPart as MastraTextPart),\n        state: 'done',\n      } as unknown as MastraMessagePart;\n      return replaceLast(newConversation, withParts(lastMessage, parts));\n    }\n\n    return newConversation;\n  }\n\n  return newConversation;\n};\n\n// Re-export the provider-metadata helper for inspection in tests.\nexport { partProviderMetadata as __partProviderMetadata };\n","import type { MastraDBMessage, MastraMessagePart } from '@mastra/core/agent/message-list';\nimport type { CoreUserMessage } from '@mastra/core/llm';\nimport { encodeFilePartDataForStorage } from '../../agent/signal-data';\n\n/**\n * Convert a CoreUserMessage into a canonical `MastraDBMessage` (`format: 2`).\n *\n * Image and file inputs are emitted as the canonical V4 `file` part shape\n * (`{ type: 'file', mimeType, data }`) — the exact shape memory resolves on\n * reload (see `AIV4Adapter`), so optimistic-send and reload render identically.\n *\n * Handles all CoreUserMessage content types:\n * - String content → single text part\n * - Array content with text/image/file parts → corresponding `MastraMessagePart`s\n */\nconst coreUserMessageToParts = (coreUserMessage: CoreUserMessage): MastraMessagePart[] =>\n  typeof coreUserMessage.content === 'string'\n    ? [{ type: 'text' as const, text: coreUserMessage.content }]\n    : coreUserMessage.content.map((part): MastraMessagePart => {\n        switch (part.type) {\n          case 'text': {\n            return { type: 'text' as const, text: part.text };\n          }\n          case 'image': {\n            const mimeType = part.mimeType ?? 'image/*';\n            return {\n              type: 'file' as const,\n              mimeType,\n              data: encodeFilePartDataForStorage(part.image, mimeType),\n            };\n          }\n          case 'file': {\n            return {\n              type: 'file' as const,\n              mimeType: part.mimeType,\n              data: encodeFilePartDataForStorage(part.data, part.mimeType),\n              ...(part.filename !== undefined ? { filename: part.filename } : {}),\n            };\n          }\n          default: {\n            const exhaustiveCheck: never = part;\n            throw new Error(`Unhandled content part type: ${(exhaustiveCheck as { type: string }).type}`);\n          }\n        }\n      });\n\nconst newUserMessage = (parts: MastraMessagePart[]): MastraDBMessage => ({\n  id: `user-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n  role: 'user',\n  createdAt: new Date(),\n  content: {\n    format: 2,\n    parts,\n  },\n});\n\nexport const fromCoreUserMessageToMastraDBMessage = (coreUserMessage: CoreUserMessage): MastraDBMessage =>\n  newUserMessage(coreUserMessageToParts(coreUserMessage));\n\n/**\n * Merge multiple `CoreUserMessage`s into a single canonical `MastraDBMessage`.\n *\n * A user turn that carries attachments arrives as several `CoreUserMessage`s\n * (one for the text, one per attachment). Memory/reload persists and resolves\n * that whole turn as a single multi-part user message, so the optimistic\n * streaming display must do the same — flatten every message's parts into one\n * `parts` array — to render identically (one bubble, not one per message).\n */\nexport const fromCoreUserMessagesToMastraDBMessage = (coreUserMessages: CoreUserMessage[]): MastraDBMessage =>\n  newUserMessage(coreUserMessages.flatMap(coreUserMessageToParts));\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { TaskItem } from '@mastra/core/signals';\nimport type { ChunkType, DataChunkType } from '@mastra/core/stream';\n\nexport const TASK_TOOL_NAMES = new Set(['task_write', 'task_update', 'task_complete', 'task_check']);\nconst TASK_SIGNAL_ID = 'tasks';\nconst TASK_TAG_NAMES = new Set(['current-task-list', 'task-list-update']);\nconst TASK_STATUSES = new Set(['pending', 'in_progress', 'completed']);\n\ntype DataChunk = Extract<ChunkType, DataChunkType>;\n\nconst isDataChunk = (chunk: ChunkType): chunk is DataChunk =>\n  typeof chunk.type === 'string' && chunk.type.startsWith('data-');\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n  typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isTaskStatus = (value: unknown): value is TaskItem['status'] =>\n  typeof value === 'string' && TASK_STATUSES.has(value);\n\nexport const isTaskItemArray = (value: unknown): value is TaskItem[] =>\n  Array.isArray(value) &&\n  value.every(\n    item =>\n      isRecord(item) &&\n      typeof item.id === 'string' &&\n      typeof item.content === 'string' &&\n      isTaskStatus(item.status) &&\n      typeof item.activeForm === 'string',\n  );\n\nconst isTaskSignal = (value: unknown): boolean => {\n  if (!isRecord(value)) return false;\n  return value.id === TASK_SIGNAL_ID || (typeof value.tagName === 'string' && TASK_TAG_NAMES.has(value.tagName));\n};\n\nconst extractTasksFromSignalData = (data: unknown): TaskItem[] | undefined => {\n  if (!isTaskSignal(data) || !isRecord(data)) return undefined;\n  const metadata = data.metadata;\n  if (!isRecord(metadata)) return undefined;\n  const value = metadata.value;\n  if (!isRecord(value)) return undefined;\n  return isTaskItemArray(value.tasks) ? value.tasks : undefined;\n};\n\nconst parseTasksFromResult = (raw: unknown): TaskItem[] | undefined => {\n  if (isRecord(raw) && isTaskItemArray(raw.tasks)) return raw.tasks;\n\n  if (typeof raw !== 'string') return undefined;\n\n  try {\n    const parsed: unknown = JSON.parse(raw);\n    return isRecord(parsed) && isTaskItemArray(parsed.tasks) ? parsed.tasks : undefined;\n  } catch {\n    return undefined;\n  }\n};\n\nexport const extractTasksFromSignalChunk = (chunk: ChunkType): TaskItem[] | undefined => {\n  if (!isDataChunk(chunk)) return undefined;\n  return extractTasksFromSignalData(chunk.data);\n};\n\nexport const extractTasksFromToolResultChunk = (chunk: ChunkType): TaskItem[] | undefined => {\n  if (chunk.type !== 'tool-result') return undefined;\n  const payload = chunk.payload;\n  if (!isRecord(payload) || typeof payload.toolName !== 'string' || !TASK_TOOL_NAMES.has(payload.toolName)) {\n    return undefined;\n  }\n  return parseTasksFromResult(payload.result);\n};\n\nconst extractTasksFromToolInvocationPart = (part: unknown): TaskItem[] | undefined => {\n  if (!isRecord(part) || part.type !== 'tool-invocation' || !isRecord(part.toolInvocation)) return undefined;\n  const toolInvocation = part.toolInvocation;\n  if (typeof toolInvocation.toolName !== 'string' || !TASK_TOOL_NAMES.has(toolInvocation.toolName)) return undefined;\n  return parseTasksFromResult(toolInvocation.result);\n};\n\nconst extractTasksFromDataPart = (part: unknown): TaskItem[] | undefined => {\n  if (!isRecord(part) || typeof part.type !== 'string' || !part.type.startsWith('data-')) return undefined;\n  return extractTasksFromSignalData(part.data);\n};\n\nconst extractTasksFromSignalMessage = (message: MastraDBMessage): TaskItem[] | undefined => {\n  if (message.role !== 'signal') return undefined;\n  const metadata = message.content?.metadata;\n  if (!isRecord(metadata)) return undefined;\n  return extractTasksFromSignalData(metadata.signal);\n};\n\nexport const extractLatestTasksFromMessages = (messages: MastraDBMessage[]): TaskItem[] => {\n  let latest: TaskItem[] | undefined;\n\n  for (const message of messages) {\n    for (const part of message.content?.parts ?? []) {\n      const toolTasks = extractTasksFromToolInvocationPart(part);\n      if (toolTasks !== undefined) latest = toolTasks;\n    }\n\n    const signalTasks = extractTasksFromSignalMessage(message);\n    if (signalTasks !== undefined) latest = signalTasks;\n\n    for (const part of message.content?.parts ?? []) {\n      const dataTasks = extractTasksFromDataPart(part);\n      if (dataTasks !== undefined) latest = dataTasks;\n    }\n  }\n\n  return latest ?? [];\n};\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\n\ntype RunIdMetadataEntry = { runId?: unknown };\ntype RunIdMetadataSource = Record<string, RunIdMetadataEntry>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === 'object';\n\nconst runIdMetadataKeys = ['pendingToolApprovals', 'requireApprovalMetadata', 'suspendedTools'] as const;\n\nconst isRunIdMetadataSource = (value: unknown): value is RunIdMetadataSource =>\n  isRecord(value) && Object.values(value).every(entry => isRecord(entry));\n\nconst getRunIdMetadataSources = (metadata: unknown): RunIdMetadataSource[] => {\n  if (!isRecord(metadata)) return [];\n\n  const sources: RunIdMetadataSource[] = [];\n  for (const key of runIdMetadataKeys) {\n    const source = metadata[key];\n    if (isRunIdMetadataSource(source)) {\n      sources.push(source);\n    }\n  }\n  return sources;\n};\n\n/**\n * Scan initial DB-shape messages for any pending approvals, suspended tools, or\n * `requireApprovalMetadata` entries and return the first non-empty `runId`.\n *\n * Metadata is read off `message.content.metadata`, the canonical location for\n * MastraDBMessage UX hints.\n */\nexport const extractRunIdFromMessages = (messages: MastraDBMessage[]): string | undefined => {\n  for (const message of messages) {\n    for (const source of getRunIdMetadataSources(message.content?.metadata)) {\n      for (const entry of Object.values(source)) {\n        if (isRecord(entry) && typeof entry.runId === 'string' && entry.runId.length > 0) {\n          return entry.runId;\n        }\n      }\n    }\n  }\n\n  return undefined;\n};\n","import { v4 as uuid } from '@lukeed/uuid';\nimport { MastraClient } from '@mastra/client-js';\nimport type { AIV5Type, MastraDBMessage, MastraToolInvocationPart } from '@mastra/core/agent/message-list';\nimport { AIV5Adapter } from '@mastra/core/agent/message-list';\nimport type { CoreUserMessage } from '@mastra/core/llm';\nimport type { TracingOptions } from '@mastra/core/observability';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { TaskItem } from '@mastra/core/signals';\nimport type { ChunkType, DataChunkType, NetworkChunkType } from '@mastra/core/stream';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n  accumulateChunk,\n  accumulateNetworkChunk,\n  CLIENT_MESSAGE_ID_KEY,\n  finishStreamingAssistantMessage,\n  fromCoreUserMessagesToMastraDBMessage,\n} from '../lib/mastra-db';\nimport type { MastraDBMessageMetadata } from '../lib/mastra-db';\nimport { useMastraClient } from '../mastra-client-context';\nimport {\n  extractLatestTasksFromMessages,\n  extractTasksFromSignalChunk,\n  extractTasksFromToolResultChunk,\n} from './extract-tasks';\nimport { extractRunIdFromMessages } from './extractRunIdFromMessages';\nimport { convertSignalDataToBase64String } from './signal-data';\nimport type { ClientToolsInput, ModelSettings } from './types';\n\nconst extractPendingToolApprovalIdsFromMessages = (messages: MastraDBMessage[]) => {\n  const pendingToolApprovalIds = new Set<string>();\n\n  for (const message of messages) {\n    const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n    if (!metadata) continue;\n\n    const metadataSources = [\n      metadata.pendingToolApprovals,\n      metadata.requireApprovalMetadata,\n      metadata.suspendedTools,\n    ] as Array<Record<string, { toolCallId?: unknown }> | undefined>;\n\n    for (const source of metadataSources) {\n      if (!source || typeof source !== 'object') continue;\n\n      for (const suspensionData of Object.values(source)) {\n        const toolCallId = suspensionData?.toolCallId;\n        if (typeof toolCallId === 'string' && toolCallId.length > 0) {\n          pendingToolApprovalIds.add(toolCallId);\n        }\n      }\n    }\n  }\n\n  return pendingToolApprovalIds;\n};\n\nconst toolCallHasOutput = (parts: MastraDBMessage['content']['parts'], toolCallId: string): boolean =>\n  parts.some(part => {\n    if (part.type !== 'tool-invocation') return false;\n    const invocation = (part as MastraToolInvocationPart).toolInvocation;\n    if (invocation.toolCallId !== toolCallId) return false;\n    return invocation.state === 'result' || (invocation as { result?: unknown }).result != null;\n  });\n\n/**\n * Normalize persisted initial messages back into the stream-friendly shape the\n * UI renders from. Mirrors `main`'s `resolveInitialMessages`:\n *\n * - Converts persisted `pendingToolApprovals` (DB shape) into\n *   `requireApprovalMetadata` (stream shape) so reloaded threads still render\n *   approve/decline buttons, filtering out approvals whose tool already\n *   produced output, and marks the message `mode: 'stream'`.\n * - Drops assistant completion messages flagged `suppressFeedback`, which are\n *   persisted by the supervisor agent but must stay hidden on reload.\n */\nconst resolveInitialMessages = (messages: MastraDBMessage[]): MastraDBMessage[] =>\n  messages\n    .filter(message => {\n      const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n      if (metadata?.completionResult?.suppressFeedback || metadata?.isTaskCompleteResult?.suppressFeedback) {\n        return false;\n      }\n      return true;\n    })\n    .map(message => {\n      const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n\n      // A persisted/refetched thread must never show a stuck \"sending\" bubble\n      // and must never carry the optimistic correlation key: the pending status\n      // and its `clientMessageId` are transient UI state. The `clientMessageId`\n      // can survive into storage (it is sent to the server with the message), so\n      // strip it on every reload regardless of pending status; the rendered row\n      // key falls back to the stable server `id`.\n      const normalizedMessage =\n        metadata && (metadata.status === 'pending' || CLIENT_MESSAGE_ID_KEY in metadata)\n          ? (() => {\n              const { [CLIENT_MESSAGE_ID_KEY]: _omitClientMessageId, ...rest } = metadata;\n              const { status: _omitStatus, ...restWithoutStatus } = rest;\n              return {\n                ...message,\n                content: {\n                  ...message.content,\n                  metadata: metadata.status === 'pending' ? restWithoutStatus : rest,\n                },\n              };\n            })()\n          : message;\n\n      const normalizedMetadata = normalizedMessage.content?.metadata as MastraDBMessageMetadata | undefined;\n      const pendingToolApprovals = normalizedMetadata?.pendingToolApprovals;\n      if (!pendingToolApprovals || typeof pendingToolApprovals !== 'object') {\n        return normalizedMessage;\n      }\n\n      const stillPending = Object.fromEntries(\n        Object.entries(pendingToolApprovals).filter(\n          ([, approval]) =>\n            approval &&\n            typeof approval === 'object' &&\n            typeof approval.toolCallId === 'string' &&\n            !toolCallHasOutput(normalizedMessage.content.parts, approval.toolCallId),\n        ),\n      );\n\n      const { pendingToolApprovals: _omit, ...restMetadata } = normalizedMetadata;\n      const hasStillPending = Object.keys(stillPending).length > 0;\n\n      return {\n        ...normalizedMessage,\n        content: {\n          ...normalizedMessage.content,\n          metadata: {\n            ...restMetadata,\n            mode: 'stream' as const,\n            ...(hasStillPending ? { pendingToolApprovals: stillPending, requireApprovalMetadata: stillPending } : {}),\n          },\n        },\n      };\n    });\n\ntype SignalContinuationOptions = {\n  model?: string;\n  maxSteps?: number;\n  modelSettings?: {\n    frequencyPenalty?: number;\n    presencePenalty?: number;\n    maxRetries?: number;\n    maxOutputTokens?: number;\n    temperature?: number;\n    topK?: number;\n    topP?: number;\n  };\n  instructions?: ModelSettings['instructions'];\n  providerOptions?: ModelSettings['providerOptions'];\n  requireToolApproval?: boolean;\n  tracingOptions?: TracingOptions;\n};\n\ntype ActiveContinuation = {\n  model?: string;\n  requestContext?: RequestContext;\n};\n\nexport interface MastraChatProps {\n  agentId: string;\n  resourceId?: string;\n  threadId?: string;\n  initialMessages?: MastraDBMessage[];\n  /** Persistent request context used for tool approval/decline calls (e.g. agentVersionId). */\n  requestContext?: RequestContext;\n  /**\n   * Client-side tool definitions. Forwarded once to `subscribeToThread` so\n   * the client-js subscription drives the full client-tool execution loop\n   * (execute, emit tool-result, continuation) without any logic in React.\n   */\n  clientTools?: ClientToolsInput;\n  onSignalSent?: (signalId: string, preview: string) => void;\n  onSignalEcho?: (signalId: string) => void;\n  onThreadSignalsUnsupported?: () => void;\n  /**\n   * Use the agent-signals streaming path (sendSignal + subscribeToThread).\n   * Defaults to `false`; set to `true` to opt into thread signals.\n   */\n  enableThreadSignals?: boolean;\n}\n\ninterface SharedArgs {\n  coreUserMessages: CoreUserMessage[];\n  model?: string;\n  requestContext?: RequestContext;\n  threadId?: string;\n  modelSettings?: ModelSettings;\n  signal?: AbortSignal;\n  tracingOptions?: TracingOptions;\n}\n\nexport type SendMessageArgs = { message: string; coreUserMessages?: CoreUserMessage[] } & (\n  | ({ mode: 'generate' } & Omit<GenerateArgs, 'coreUserMessages'>)\n  | ({ mode: 'stream' } & Omit<StreamArgs, 'coreUserMessages'>)\n  | ({ mode: 'network' } & Omit<NetworkArgs, 'coreUserMessages'>)\n  | ({ mode?: undefined } & Omit<StreamArgs, 'coreUserMessages'>)\n);\n\nexport type GenerateArgs = SharedArgs & {\n  onFinish?: (messages: MastraDBMessage[]) => Promise<void>;\n  clientTools?: ClientToolsInput;\n};\n\nexport type StreamArgs = SharedArgs & {\n  onChunk?: (chunk: ChunkType) => Promise<void>;\n  clientTools?: ClientToolsInput;\n  signalId?: string;\n  /**\n   * Client-generated correlation id stamped on the optimistic pending bubble\n   * and the outgoing message metadata so the server echo can reconcile them.\n   */\n  clientMessageId?: string;\n};\n\nexport type NetworkArgs = SharedArgs & {\n  onNetworkChunk?: (chunk: NetworkChunkType) => Promise<void>;\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;\n\nconst getErrorName = (error: unknown) => (isObject(error) && typeof error.name === 'string' ? error.name : undefined);\n\nconst isAbortError = (error: unknown) => getErrorName(error) === 'AbortError';\n\nconst isThreadSignalUnsupportedError = (error: unknown) => {\n  if (!isObject(error)) return false;\n\n  const status = error.status;\n  if (status === 404 || status === 405 || status === 501) {\n    return true;\n  }\n\n  return (\n    status === 400 &&\n    typeof error.message === 'string' &&\n    error.message.includes('No active agent run found for signal target')\n  );\n};\n\ntype DataChunk = Extract<ChunkType, DataChunkType>;\n\nconst isDataChunk = (chunk: ChunkType): chunk is DataChunk =>\n  typeof chunk.type === 'string' && chunk.type.startsWith('data-');\n\n/**\n * Convert AI-SDK v5 UIMessages returned by the server (generate mode) into\n * `MastraDBMessage[]`, stamping the supplied metadata onto each message's\n * `content.metadata`. Private helper — `useChat` never exposes the AI-SDK\n * shape to consumers.\n */\nconst dbFromServerUiMessages = (\n  uiMessages: AIV5Type.UIMessage[],\n  metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] =>\n  uiMessages.map(uiMsg => {\n    const dbMsg = AIV5Adapter.fromUIMessage(uiMsg);\n    return {\n      ...dbMsg,\n      content: {\n        ...dbMsg.content,\n        metadata: {\n          ...(dbMsg.content.metadata ?? {}),\n          ...metadata,\n        },\n      },\n    };\n  });\n\nexport const useChat = ({\n  agentId,\n  resourceId,\n  threadId,\n  initialMessages,\n  requestContext: propsRequestContext,\n  clientTools: hookClientTools,\n  onSignalSent,\n  onSignalEcho,\n  onThreadSignalsUnsupported,\n  enableThreadSignals = false,\n}: MastraChatProps) => {\n  const threadSignalsDisabled = enableThreadSignals === false;\n  const _currentRunId = useRef<string | undefined>(undefined);\n  const _onChunk = useRef<((chunk: ChunkType) => Promise<void>) | undefined>(undefined);\n  const _networkRunId = useRef<string | undefined>(undefined);\n  const _onNetworkChunk = useRef<((chunk: NetworkChunkType) => Promise<void>) | undefined>(undefined);\n  const _activeContinuation = useRef<ActiveContinuation>({ requestContext: propsRequestContext });\n  // Tracks the active stream (untilIdle) request so a subsequent stream() call\n  // can abort the previous one. Without this, a still-open prior stream keeps\n  // its background-task pubsub subscription alive and fans events into a second\n  // concurrent UI consumer, producing duplicate bg-task events and duplicate\n  // continuation turns on the server.\n  const _streamAbortRef = useRef<AbortController | null>(null);\n  const _threadSubscriptionAbortRef = useRef<AbortController | null>(null);\n  const _threadSubscriptionRef = useRef<{ abort?: () => Promise<boolean> | boolean; unsubscribe?: () => void } | null>(\n    null,\n  );\n  const _threadSubscriptionKeyRef = useRef<string | undefined>(undefined);\n  const _threadSubscriptionPromiseRef = useRef<Promise<void> | null>(null);\n  const _threadSignalsUnsupportedRef = useRef(false);\n  const [messages, setMessages] = useState<MastraDBMessage[]>([]);\n  const [tasks, setTasks] = useState<TaskItem[]>([]);\n  const [toolCallApprovals, setToolCallApprovals] = useState<{\n    [toolCallId: string]: { status: 'approved' | 'declined' };\n  }>({});\n  const [networkToolCallApprovals, setNetworkToolCallApprovals] = useState<{\n    [toolName: string]: { status: 'approved' | 'declined' };\n  }>({});\n  const pendingToolApprovalIdsRef = useRef(new Set<string>());\n  const [isAwaitingToolApproval, setIsAwaitingToolApproval] = useState(false);\n\n  const baseClient = useMastraClient();\n  const [isRunning, setIsRunning] = useState(false);\n\n  useEffect(() => {\n    const formattedMessages = resolveInitialMessages(initialMessages ?? []);\n    setMessages(formattedMessages);\n    setTasks(extractLatestTasksFromMessages(formattedMessages));\n    pendingToolApprovalIdsRef.current = extractPendingToolApprovalIdsFromMessages(formattedMessages);\n    setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n    _currentRunId.current = extractRunIdFromMessages(formattedMessages);\n  }, [initialMessages]);\n\n  useEffect(() => {\n    _activeContinuation.current = {\n      ..._activeContinuation.current,\n      requestContext: propsRequestContext,\n    };\n  }, [propsRequestContext]);\n\n  type SignalContentPart =\n    | { type: 'text'; text: string }\n    | { type: 'file'; data: string; mediaType: string; filename?: string };\n  type UserMessageSignalContents = string | SignalContentPart[];\n\n  const normalizeSignalFileData = (data: string | URL | ArrayBuffer | Uint8Array) => {\n    if (data instanceof URL) return data.toString();\n    return convertSignalDataToBase64String(data);\n  };\n\n  const getSignalContents = (coreUserMessages: CoreUserMessage[]): UserMessageSignalContents => {\n    const parts = coreUserMessages.reduce<SignalContentPart[]>((allParts, message) => {\n      if (typeof message.content === 'string') {\n        allParts.push({ type: 'text', text: message.content });\n        return allParts;\n      }\n\n      for (const part of message.content) {\n        if (part.type === 'text') {\n          allParts.push({ type: 'text', text: part.text });\n        } else if (part.type === 'file') {\n          allParts.push({\n            type: 'file',\n            data: normalizeSignalFileData(part.data),\n            mediaType: part.mimeType,\n            ...(part.filename ? { filename: part.filename } : {}),\n          });\n        } else if (part.type === 'image') {\n          allParts.push({\n            type: 'file',\n            data: normalizeSignalFileData(part.image),\n            mediaType: part.mimeType ?? 'image/png',\n          });\n        }\n      }\n\n      return allParts;\n    }, []);\n\n    return parts.length === 1 && parts[0]?.type === 'text' ? parts[0].text : parts;\n  };\n\n  const markThreadSignalsUnsupported = useCallback(() => {\n    _threadSignalsUnsupportedRef.current = true;\n    onThreadSignalsUnsupported?.();\n  }, [onThreadSignalsUnsupported]);\n\n  const getSignalPreview = (coreUserMessages: CoreUserMessage[]) => {\n    const preview = coreUserMessages\n      .flatMap(message => {\n        if (typeof message.content === 'string') {\n          return [message.content];\n        }\n\n        return message.content.map(part => {\n          if (part.type === 'text') return part.text;\n          if (part.type === 'image') return 'Image';\n          return part.filename ? `File: ${part.filename}` : 'File';\n        });\n      })\n      .join(' ')\n      .replace(/\\s+/g, ' ')\n      .trim();\n\n    return preview || 'Attachment';\n  };\n\n  const closeThreadSubscription = useCallback(() => {\n    const subscription = _threadSubscriptionRef.current;\n    if (subscription?.unsubscribe) {\n      subscription.unsubscribe();\n    } else {\n      _threadSubscriptionAbortRef.current?.abort();\n    }\n    _threadSubscriptionRef.current = null;\n    _threadSubscriptionAbortRef.current = null;\n    _threadSubscriptionKeyRef.current = undefined;\n    _threadSubscriptionPromiseRef.current = null;\n  }, []);\n\n  const processStreamChunk = useCallback(\n    async (chunk: ChunkType, onChunk?: (chunk: ChunkType) => Promise<void>) => {\n      setMessages(prev => accumulateChunk({ chunk, conversation: prev, metadata: { mode: 'stream' } }));\n\n      const signalTasks = extractTasksFromSignalChunk(chunk);\n      if (signalTasks !== undefined) setTasks(signalTasks);\n      const toolTasks = extractTasksFromToolResultChunk(chunk);\n      if (toolTasks !== undefined) setTasks(toolTasks);\n\n      if (\n        chunk.type === 'data-user-message' &&\n        isDataChunk(chunk) &&\n        (chunk.data?.type === 'user-message' || chunk.data?.type === 'user') &&\n        typeof chunk.data?.id === 'string'\n      ) {\n        onSignalEcho?.(chunk.data.id);\n      }\n\n      if (chunk.type === 'start') {\n        setIsRunning(true);\n        if ('runId' in chunk && typeof chunk.runId === 'string') {\n          _currentRunId.current = chunk.runId;\n        }\n      }\n\n      if (chunk.type === 'tool-call-approval' || chunk.type === 'tool-call-suspended') {\n        const toolCallId = chunk.payload?.toolCallId;\n        if (typeof toolCallId === 'string') {\n          pendingToolApprovalIdsRef.current.add(toolCallId);\n          setIsAwaitingToolApproval(true);\n        }\n        setIsRunning(false);\n      }\n\n      if (chunk.type === 'finish' || chunk.type === 'abort' || chunk.type === 'error') {\n        pendingToolApprovalIdsRef.current.clear();\n        setIsAwaitingToolApproval(false);\n        setIsRunning(false);\n      }\n\n      void (onChunk ?? _onChunk.current)?.(chunk);\n    },\n    [onSignalEcho],\n  );\n\n  const ensureThreadSubscription = useCallback(\n    async ({ threadId, resourceId }: { threadId: string; resourceId?: string }) => {\n      const subscriptionKey = `${agentId}:${resourceId ?? ''}:${threadId}`;\n      if (_threadSubscriptionKeyRef.current === subscriptionKey && _threadSubscriptionPromiseRef.current) {\n        await _threadSubscriptionPromiseRef.current;\n        return;\n      }\n\n      closeThreadSubscription();\n      const subscriptionAbort = new AbortController();\n      _threadSubscriptionAbortRef.current = subscriptionAbort;\n      _threadSubscriptionKeyRef.current = subscriptionKey;\n\n      // Release the cached subscription state, but only while this attempt\n      // still owns it — a newer attempt cleans up after itself.\n      const releaseSubscriptionRefs = () => {\n        if (_threadSubscriptionAbortRef.current !== subscriptionAbort) return;\n        _threadSubscriptionRef.current = null;\n        _threadSubscriptionAbortRef.current = null;\n        _threadSubscriptionKeyRef.current = undefined;\n        _threadSubscriptionPromiseRef.current = null;\n      };\n\n      const clientWithAbort = new MastraClient({\n        ...baseClient!.options,\n        abortSignal: subscriptionAbort.signal,\n      });\n      const subscriptionAgent = clientWithAbort.getAgent(agentId);\n\n      _threadSubscriptionPromiseRef.current = subscriptionAgent\n        .subscribeToThread({ resourceId, threadId })\n        .then(response => {\n          const subscription = response;\n          if (_threadSubscriptionAbortRef.current !== subscriptionAbort) {\n            subscription.unsubscribe();\n            return;\n          }\n\n          _threadSubscriptionRef.current = subscription;\n          void subscription\n            .processDataStream({\n              onChunk: chunk => processStreamChunk(chunk),\n            })\n            .catch(error => {\n              if (!isAbortError(error)) {\n                console.error('[useChat] Thread subscription failed', error);\n                setIsRunning(false);\n              }\n            })\n            .finally(() => {\n              if (_threadSubscriptionRef.current === subscription) {\n                _threadSubscriptionRef.current = null;\n              }\n              releaseSubscriptionRefs();\n            });\n        })\n        .catch(error => {\n          // Release on every failure so the next call retries with a fresh\n          // fetch instead of re-awaiting this rejected promise. Without this,\n          // an aborted mount-time subscribe strands the channel and the reply\n          // never arrives until reload (issue #18768).\n          releaseSubscriptionRefs();\n\n          if (isThreadSignalUnsupportedError(error)) {\n            markThreadSignalsUnsupported();\n            return;\n          }\n          if (!isAbortError(error)) {\n            console.error('[useChat] Thread subscription failed', error);\n            setIsRunning(false);\n          }\n          throw error;\n        });\n\n      await _threadSubscriptionPromiseRef.current;\n    },\n    [agentId, baseClient, closeThreadSubscription, markThreadSignalsUnsupported, processStreamChunk],\n  );\n\n  useEffect(() => {\n    _threadSignalsUnsupportedRef.current = false;\n    return closeThreadSubscription;\n  }, [agentId, resourceId, threadId, closeThreadSubscription]);\n\n  useEffect(() => {\n    if (!threadId || threadSignalsDisabled) {\n      closeThreadSubscription();\n      return;\n    }\n\n    void ensureThreadSubscription({ threadId, resourceId: resourceId || agentId }).catch(error => {\n      if (!isAbortError(error)) {\n        console.error('[useChat] Thread subscription failed', error);\n      }\n    });\n  }, [agentId, closeThreadSubscription, ensureThreadSubscription, resourceId, threadId, threadSignalsDisabled]);\n\n  const generate = async ({\n    coreUserMessages,\n    model,\n    requestContext,\n    threadId,\n    modelSettings,\n    signal,\n    onFinish,\n    tracingOptions,\n    clientTools,\n  }: GenerateArgs) => {\n    const {\n      frequencyPenalty,\n      presencePenalty,\n      maxRetries,\n      maxTokens,\n      temperature,\n      topK,\n      topP,\n      instructions,\n      providerOptions,\n      maxSteps,\n      requireToolApproval,\n    } = modelSettings || {};\n    const resolvedRequestContext = requestContext ?? propsRequestContext;\n    const resolvedClientTools = clientTools ?? hookClientTools;\n    _activeContinuation.current = {\n      model,\n      requestContext: resolvedRequestContext,\n    };\n    setIsRunning(true);\n\n    const clientWithAbort = new MastraClient({\n      ...baseClient!.options,\n      abortSignal: signal,\n    });\n\n    const agent = clientWithAbort.getAgent(agentId);\n\n    const runId = uuid();\n    _currentRunId.current = runId;\n\n    const response = await agent.generate(coreUserMessages, {\n      model,\n      runId,\n      maxSteps,\n      modelSettings: {\n        frequencyPenalty,\n        presencePenalty,\n        maxRetries,\n        maxOutputTokens: maxTokens,\n        temperature,\n        topK,\n        topP,\n      },\n      instructions,\n      requestContext: resolvedRequestContext,\n      ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n      providerOptions,\n      tracingOptions,\n      requireToolApproval,\n      clientTools: resolvedClientTools,\n    });\n\n    // Check if suspended for tool approval\n    if (response.finishReason === 'suspended' && response.suspendPayload) {\n      const { toolCallId, toolName, args } = response.suspendPayload;\n\n      // Add uiMessages with requireApprovalMetadata so UI shows approval buttons\n      if (response.response?.uiMessages) {\n        const dbMessages = dbFromServerUiMessages(response.response.uiMessages, {\n          mode: 'generate',\n          requireApprovalMetadata: {\n            [toolName]: { toolCallId, toolName, args },\n          },\n        });\n\n        setMessages(prev => [...prev, ...dbMessages]);\n      }\n\n      // Set isRunning to false so approval buttons are enabled\n      // The approval/decline functions will set isRunning to true when clicked\n      setIsRunning(false);\n      return;\n    }\n\n    setIsRunning(false);\n\n    if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n      const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n      void onFinish?.(dbMessages);\n      setMessages(prev => [...prev, ...dbMessages]);\n    }\n  };\n\n  const stream = async ({\n    coreUserMessages,\n    model,\n    requestContext,\n    threadId,\n    onChunk,\n    modelSettings,\n    signal,\n    tracingOptions,\n    clientTools,\n    signalId,\n    clientMessageId,\n  }: StreamArgs) => {\n    const {\n      frequencyPenalty,\n      presencePenalty,\n      maxRetries,\n      maxTokens,\n      temperature,\n      topK,\n      topP,\n      instructions,\n      providerOptions,\n      maxSteps,\n      requireToolApproval,\n    } = modelSettings || {};\n\n    const resolvedRequestContext = requestContext ?? propsRequestContext;\n    const resolvedClientTools = clientTools ?? hookClientTools;\n    const signalContinuationOptions: SignalContinuationOptions = {\n      model,\n      maxSteps,\n      modelSettings: {\n        frequencyPenalty,\n        presencePenalty,\n        maxRetries,\n        maxOutputTokens: maxTokens,\n        temperature,\n        topK,\n        topP,\n      },\n      instructions,\n      providerOptions,\n      requireToolApproval,\n      tracingOptions,\n    };\n    _activeContinuation.current = {\n      model,\n      requestContext: resolvedRequestContext,\n    };\n    setIsRunning(true);\n\n    _streamAbortRef.current?.abort();\n    const internalAbort = new AbortController();\n    _streamAbortRef.current = internalAbort;\n\n    if (signal) {\n      if (signal.aborted) internalAbort.abort();\n      else signal.addEventListener('abort', () => internalAbort.abort(), { once: true });\n    }\n\n    const clientWithAbort = new MastraClient({\n      ...baseClient!.options,\n      abortSignal: internalAbort.signal,\n    });\n\n    const agent = clientWithAbort.getAgent(agentId);\n\n    const streamWithLegacyRoute = async () => {\n      const runId = uuid();\n      const response = await agent.stream(coreUserMessages, {\n        model,\n        runId,\n        maxSteps,\n        untilIdle: true,\n        modelSettings: {\n          frequencyPenalty,\n          presencePenalty,\n          maxRetries,\n          maxOutputTokens: maxTokens,\n          temperature,\n          topK,\n          topP,\n        },\n        instructions,\n        requestContext: resolvedRequestContext,\n        ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n        providerOptions,\n        requireToolApproval,\n        tracingOptions,\n        clientTools: resolvedClientTools,\n      });\n\n      _onChunk.current = onChunk;\n      _currentRunId.current = runId;\n\n      await response.processDataStream({\n        onChunk: chunk => processStreamChunk(chunk, onChunk),\n      });\n\n      if (_streamAbortRef.current === internalAbort) {\n        _streamAbortRef.current = null;\n      }\n      setIsRunning(false);\n    };\n\n    if (!threadId || _threadSignalsUnsupportedRef.current || threadSignalsDisabled) {\n      await streamWithLegacyRoute();\n      return;\n    }\n\n    _onChunk.current = onChunk;\n\n    await ensureThreadSubscription({ threadId, resourceId: resourceId || agentId });\n\n    if (_threadSignalsUnsupportedRef.current) {\n      await streamWithLegacyRoute();\n      return;\n    }\n\n    const resolvedSignalId = signalId ?? uuid();\n    const messageContents = getSignalContents(coreUserMessages);\n    // RequestContext serializes to a plain record via its toJSON(), but the class has no\n    // index signature, so it isn't assignable to the generated `Record<string, unknown>` body type.\n    const requestContextRecord = resolvedRequestContext as Record<string, unknown> | undefined;\n    const streamOptions = {\n      model,\n      maxSteps,\n      modelSettings: {\n        frequencyPenalty,\n        presencePenalty,\n        maxRetries,\n        maxOutputTokens: maxTokens,\n        temperature,\n        topK,\n        topP,\n      },\n      instructions,\n      requestContext: requestContextRecord,\n      providerOptions: providerOptions as any,\n      requireToolApproval,\n      tracingOptions,\n    };\n\n    try {\n      const result = await agent.sendMessage({\n        message: clientMessageId\n          ? { contents: messageContents, metadata: { [CLIENT_MESSAGE_ID_KEY]: clientMessageId } }\n          : messageContents,\n        resourceId: resourceId || agentId,\n        threadId,\n        ifIdle: {\n          streamOptions: {\n            ...signalContinuationOptions,\n            requestContext: requestContextRecord,\n            clientTools: resolvedClientTools,\n          },\n        },\n      });\n      const echoedSignalId =\n        result.signal &&\n        typeof result.signal === 'object' &&\n        'id' in result.signal &&\n        typeof result.signal.id === 'string'\n          ? result.signal.id\n          : resolvedSignalId;\n      onSignalSent?.(echoedSignalId, getSignalPreview(coreUserMessages));\n      if (pendingToolApprovalIdsRef.current.size > 0) {\n        setIsRunning(false);\n      }\n    } catch (error) {\n      if (isThreadSignalUnsupportedError(error)) {\n        onSignalSent?.(resolvedSignalId, getSignalPreview(coreUserMessages));\n        try {\n          await agent.sendSignal({\n            signal: {\n              id: resolvedSignalId,\n              type: 'user-message',\n              contents: messageContents,\n            },\n            resourceId: resourceId || agentId,\n            threadId,\n            ifIdle: { streamOptions },\n          });\n          return;\n        } catch (signalError) {\n          onSignalEcho?.(resolvedSignalId);\n          if (isThreadSignalUnsupportedError(signalError)) {\n            markThreadSignalsUnsupported();\n            setMessages(prev => [...prev, fromCoreUserMessagesToMastraDBMessage(coreUserMessages)]);\n            await streamWithLegacyRoute();\n            return;\n          }\n          throw signalError;\n        }\n      }\n      throw error;\n    }\n\n    if (_streamAbortRef.current === internalAbort) {\n      _streamAbortRef.current = null;\n    }\n  };\n\n  const network = async ({\n    coreUserMessages,\n    model,\n    requestContext,\n    threadId,\n    onNetworkChunk,\n    modelSettings,\n    signal,\n    tracingOptions,\n  }: NetworkArgs) => {\n    const { frequencyPenalty, presencePenalty, maxRetries, maxTokens, temperature, topK, topP, maxSteps } =\n      modelSettings || {};\n\n    const resolvedRequestContext = requestContext ?? propsRequestContext;\n    _activeContinuation.current = {\n      model,\n      requestContext: resolvedRequestContext,\n    };\n    setIsRunning(true);\n\n    const clientWithAbort = new MastraClient({\n      ...baseClient!.options,\n      abortSignal: signal,\n    });\n\n    const agent = clientWithAbort.getAgent(agentId);\n\n    const runId = uuid();\n\n    const response = await agent.network(coreUserMessages, {\n      model,\n      maxSteps,\n      modelSettings: {\n        frequencyPenalty,\n        presencePenalty,\n        maxRetries,\n        maxOutputTokens: maxTokens,\n        temperature,\n        topK,\n        topP,\n      },\n      runId,\n      requestContext: resolvedRequestContext,\n      ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n      tracingOptions,\n    });\n\n    _onNetworkChunk.current = onNetworkChunk;\n    _networkRunId.current = runId;\n\n    // Accumulate network chunks into `messages` as `MastraDBMessage` (temporary\n    // bridge until the next major), while still forwarding chunks to the\n    // consumer for side-effects (OM, working memory, thread list, errors).\n    await response.processDataStream({\n      onChunk: async (chunk: NetworkChunkType) => {\n        setMessages(prev => accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network' } }));\n        void onNetworkChunk?.(chunk);\n      },\n    });\n\n    setMessages(prev => finishStreamingAssistantMessage(prev));\n    setIsRunning(false);\n  };\n\n  const handleCancelRun = () => {\n    _streamAbortRef.current?.abort();\n    _streamAbortRef.current = null;\n    const threadSubscription = _threadSubscriptionRef.current;\n    void Promise.resolve(threadSubscription?.abort?.()).catch(error => {\n      console.error('[useChat] Failed to abort thread subscription', error);\n    });\n    closeThreadSubscription();\n    setMessages(prev => finishStreamingAssistantMessage(prev));\n    pendingToolApprovalIdsRef.current.clear();\n    setIsAwaitingToolApproval(false);\n    setIsRunning(false);\n    _currentRunId.current = undefined;\n    _onChunk.current = undefined;\n    _networkRunId.current = undefined;\n    _onNetworkChunk.current = undefined;\n    _activeContinuation.current = {};\n  };\n\n  const approveToolCall = async (toolCallId: string, resumeData?: unknown) => {\n    const onChunk = _onChunk.current;\n    const currentRunId = _currentRunId.current;\n    const continuation = _activeContinuation.current;\n\n    if (!currentRunId)\n      return console.info('[approveToolCall] approveToolCall can only be called after a stream has started');\n\n    setIsRunning(true);\n    setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'approved' } }));\n\n    const agent = baseClient.getAgent(agentId);\n    if (_threadSubscriptionKeyRef.current && threadId) {\n      try {\n        await agent.sendToolApproval({\n          resourceId: resourceId || agentId,\n          threadId,\n          toolCallId,\n          approved: true,\n          ...(continuation.model !== undefined ? { streamOptions: { model: continuation.model } } : {}),\n          ...(resumeData !== undefined ? { resumeData } : {}),\n          requestContext: continuation.requestContext,\n        });\n        pendingToolApprovalIdsRef.current.delete(toolCallId);\n        setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n        setIsRunning(false);\n      } catch (error) {\n        setToolCallApprovals(prev => {\n          const next = { ...prev };\n          delete next[toolCallId];\n          return next;\n        });\n        setIsRunning(false);\n        throw error;\n      }\n      return;\n    }\n\n    try {\n      const response =\n        resumeData !== undefined\n          ? await agent.resumeStream(resumeData as Parameters<typeof agent.resumeStream>[0], {\n              runId: currentRunId,\n              toolCallId,\n              ...continuation,\n            })\n          : await agent.approveToolCall({\n              runId: currentRunId,\n              toolCallId,\n              ...continuation,\n            });\n\n      await response.processDataStream({\n        onChunk: async (chunk: ChunkType) => {\n          await processStreamChunk(chunk, onChunk);\n        },\n      });\n      setIsRunning(false);\n    } catch (error) {\n      setToolCallApprovals(prev => {\n        const next = { ...prev };\n        delete next[toolCallId];\n        return next;\n      });\n      setIsRunning(false);\n      throw error;\n    }\n  };\n\n  const declineToolCall = async (toolCallId: string) => {\n    const onChunk = _onChunk.current;\n    const currentRunId = _currentRunId.current;\n    const continuation = _activeContinuation.current;\n\n    if (!currentRunId)\n      return console.info('[declineToolCall] declineToolCall can only be called after a stream has started');\n\n    setIsRunning(true);\n    setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'declined' } }));\n    const agent = baseClient.getAgent(agentId);\n    if (_threadSubscriptionKeyRef.current && threadId) {\n      try {\n        await agent.sendToolApproval({\n          resourceId: resourceId || agentId,\n          threadId,\n          toolCallId,\n          approved: false,\n          ...(continuation.model !== undefined ? { streamOptions: { model: continuation.model } } : {}),\n          requestContext: continuation.requestContext,\n        });\n        pendingToolApprovalIdsRef.current.delete(toolCallId);\n        setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n        setIsRunning(false);\n      } catch (error) {\n        setToolCallApprovals(prev => {\n          const next = { ...prev };\n          delete next[toolCallId];\n          return next;\n        });\n        setIsRunning(false);\n        throw error;\n      }\n      return;\n    }\n\n    const response = await agent.declineToolCall({\n      runId: currentRunId,\n      toolCallId,\n      ...continuation,\n    });\n\n    await response.processDataStream({\n      onChunk: async (chunk: ChunkType) => {\n        await processStreamChunk(chunk, onChunk);\n      },\n    });\n    setIsRunning(false);\n  };\n\n  const approveToolCallGenerate = async (toolCallId: string) => {\n    const currentRunId = _currentRunId.current;\n    const continuation = _activeContinuation.current;\n\n    if (!currentRunId)\n      return console.info(\n        '[approveToolCallGenerate] approveToolCallGenerate can only be called after a generate has started',\n      );\n\n    setIsRunning(true);\n    setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'approved' } }));\n\n    const agent = baseClient.getAgent(agentId);\n    const response = await agent.approveToolCallGenerate({\n      runId: currentRunId,\n      toolCallId,\n      ...continuation,\n    });\n\n    if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n      const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n      setMessages(prev => [...prev, ...dbMessages]);\n    }\n\n    setIsRunning(false);\n  };\n\n  const declineToolCallGenerate = async (toolCallId: string) => {\n    const currentRunId = _currentRunId.current;\n    const continuation = _activeContinuation.current;\n\n    if (!currentRunId)\n      return console.info(\n        '[declineToolCallGenerate] declineToolCallGenerate can only be called after a generate has started',\n      );\n\n    setIsRunning(true);\n    setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'declined' } }));\n\n    const agent = baseClient.getAgent(agentId);\n    const response = await agent.declineToolCallGenerate({\n      runId: currentRunId,\n      toolCallId,\n      ...continuation,\n    });\n\n    if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n      const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n      setMessages(prev => [...prev, ...dbMessages]);\n    }\n\n    setIsRunning(false);\n  };\n\n  const approveNetworkToolCall = async (toolName: string, runId?: string) => {\n    const onNetworkChunk = _onNetworkChunk.current;\n    const networkRunId = runId || _networkRunId.current;\n    const continuation = _activeContinuation.current;\n\n    if (!networkRunId)\n      return console.info(\n        '[approveNetworkToolCall] approveNetworkToolCall can only be called after a network stream has started',\n      );\n\n    setIsRunning(true);\n    setNetworkToolCallApprovals(prev => ({\n      ...prev,\n      [runId ? `${runId}-${toolName}` : toolName]: { status: 'approved' },\n    }));\n\n    const agent = baseClient.getAgent(agentId);\n    const response = await agent.approveNetworkToolCall({\n      runId: networkRunId,\n      ...continuation,\n    });\n\n    await response.processDataStream({\n      onChunk: async (chunk: NetworkChunkType) => {\n        setMessages(prev => accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network' } }));\n        void onNetworkChunk?.(chunk);\n      },\n    });\n\n    setMessages(prev => finishStreamingAssistantMessage(prev));\n    setIsRunning(false);\n  };\n\n  const declineNetworkToolCall = async (toolName: string, runId?: string) => {\n    const onNetworkChunk = _onNetworkChunk.current;\n    const networkRunId = runId || _networkRunId.current;\n    const continuation = _activeContinuation.current;\n\n    if (!networkRunId)\n      return console.info(\n        '[declineNetworkToolCall] declineNetworkToolCall can only be called after a network stream has started',\n      );\n\n    setIsRunning(true);\n    setNetworkToolCallApprovals(prev => ({\n      ...prev,\n      [runId ? `${runId}-${toolName}` : toolName]: { status: 'declined' },\n    }));\n\n    const agent = baseClient.getAgent(agentId);\n    const response = await agent.declineNetworkToolCall({\n      runId: networkRunId,\n      ...continuation,\n    });\n\n    await response.processDataStream({\n      onChunk: async (chunk: NetworkChunkType) => {\n        setMessages(prev => accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network' } }));\n        void onNetworkChunk?.(chunk);\n      },\n    });\n\n    setMessages(prev => finishStreamingAssistantMessage(prev));\n    setIsRunning(false);\n  };\n\n  const sendMessage = async ({ mode = 'stream', ...args }: SendMessageArgs) => {\n    const nextMessage: Omit<CoreUserMessage, 'id'> = { role: 'user', content: [{ type: 'text', text: args.message }] };\n    const coreUserMessages = [nextMessage];\n\n    if (args.coreUserMessages) {\n      coreUserMessages.push(...args.coreUserMessages);\n    }\n\n    // The whole user turn (text + any attachments) is merged into a single\n    // optimistic message so streaming renders one bubble, matching how\n    // memory/reload resolves the persisted multi-part user message.\n    const dbUserMessage = fromCoreUserMessagesToMastraDBMessage(coreUserMessages);\n    const clientSetId =\n      mode === 'stream' && args.threadId && !_threadSignalsUnsupportedRef.current && !threadSignalsDisabled\n        ? `client-set-${uuid()}`\n        : undefined;\n    const signalId = clientSetId;\n    const clientMessageId = clientSetId;\n\n    if (signalId) {\n      // Signal path: append the user turn optimistically as `pending` with a\n      // visibly client-owned id. The server echo can replace the final message\n      // id while the matching client id reconciles the pending bubble.\n      const metadata: MastraDBMessageMetadata = {\n        ...dbUserMessage.content.metadata,\n        mode: 'stream',\n        status: 'pending',\n        [CLIENT_MESSAGE_ID_KEY]: clientMessageId,\n      };\n      const pendingMessage = { ...dbUserMessage, id: clientSetId, content: { ...dbUserMessage.content, metadata } };\n      setMessages(s => [...s, pendingMessage]);\n    } else {\n      setMessages(s => [...s, dbUserMessage]);\n    }\n\n    try {\n      if (mode === 'generate') {\n        await generate({ ...args, coreUserMessages });\n      } else if (mode === 'stream') {\n        await stream({ ...args, coreUserMessages, signalId, clientMessageId });\n      } else if (mode === 'network') {\n        await network({ ...args, coreUserMessages });\n      }\n    } catch (error) {\n      // A failed send (subscription setup, request, or stream) must not leave\n      // the chat stranded in a \"running\" state until reload (issue #18768).\n      setIsRunning(false);\n      throw error;\n    }\n  };\n\n  return {\n    setMessages,\n    sendMessage,\n    isRunning,\n    isAwaitingToolApproval,\n    messages,\n    tasks,\n    approveToolCall,\n    declineToolCall,\n    approveToolCallGenerate,\n    declineToolCallGenerate,\n    cancelRun: handleCancelRun,\n    toolCallApprovals,\n    approveNetworkToolCall,\n    declineNetworkToolCall,\n    networkToolCallApprovals,\n  };\n};\n","import { useState, useCallback, useRef } from 'react';\n\n/**\n * Represents the state of a mutation operation.\n * Mimics the essential return type of react-query's useMutation.\n */\nexport interface MutationState<TData, TError extends Error, TVariables> {\n  /** Execute the mutation without waiting for the result */\n  mutate: (variables: TVariables) => void;\n  /** Execute the mutation and return a promise with the result */\n  mutateAsync: (variables: TVariables) => Promise<TData>;\n  /** Whether the mutation is currently executing */\n  isPending: boolean;\n  /** Whether the mutation completed successfully */\n  isSuccess: boolean;\n  /** Whether the mutation failed with an error */\n  isError: boolean;\n  /** The error if the mutation failed, null otherwise */\n  error: TError | null;\n  /** The data returned by the mutation if successful */\n  data: TData | undefined;\n  /** Reset the mutation state to initial values */\n  reset: () => void;\n}\n\n/**\n * Internal helper hook that provides mutation-like functionality without react-query.\n * Tracks pending, success, and error states for async operations.\n */\nexport function useMutation<TData, TError extends Error, TVariables>(\n  mutationFn: (variables: TVariables) => Promise<TData>,\n): MutationState<TData, TError, TVariables> {\n  const [isPending, setIsPending] = useState(false);\n  const [isSuccess, setIsSuccess] = useState(false);\n  const [isError, setIsError] = useState(false);\n  const [error, setError] = useState<TError | null>(null);\n  const [data, setData] = useState<TData | undefined>(undefined);\n\n  const mutationFnRef = useRef(mutationFn);\n  mutationFnRef.current = mutationFn;\n\n  const reset = useCallback(() => {\n    setIsPending(false);\n    setIsSuccess(false);\n    setIsError(false);\n    setError(null);\n    setData(undefined);\n  }, []);\n\n  const mutateAsync = useCallback(async (variables: TVariables): Promise<TData> => {\n    setIsPending(true);\n    setIsSuccess(false);\n    setIsError(false);\n    setError(null);\n\n    try {\n      const result = await mutationFnRef.current(variables);\n      setData(result);\n      setIsSuccess(true);\n      return result;\n    } catch (err) {\n      const typedError = err as TError;\n      setError(typedError);\n      setIsError(true);\n      throw err;\n    } finally {\n      setIsPending(false);\n    }\n  }, []);\n\n  const mutate = useCallback(\n    (variables: TVariables) => {\n      mutateAsync(variables).catch(() => {\n        // Error is already captured in state\n      });\n    },\n    [mutateAsync],\n  );\n\n  return {\n    mutate,\n    mutateAsync,\n    isPending,\n    isSuccess,\n    isError,\n    error,\n    data,\n    reset,\n  };\n}\n","import type { StreamVNextChunkType } from '@mastra/client-js';\nimport { useState, useRef, useEffect, useCallback } from 'react';\nimport { mapWorkflowStreamChunkToWatchResult } from '../lib/mastra-db';\nimport { useMutation } from '../lib/use-mutation';\nimport { useMastraClient } from '../mastra-client-context';\nimport type {\n  UseStreamWorkflowParams,\n  WorkflowStreamResult,\n  StreamWorkflowParams,\n  ObserveWorkflowStreamParams,\n  ResumeWorkflowStreamParams,\n  TimeTravelWorkflowStreamParams,\n} from './types';\n\n/**\n * Hook for streaming workflow execution with support for observing, resuming, and time-travel.\n *\n * @example\n * ```tsx\n * const {\n *   streamWorkflow,\n *   streamResult,\n *   isStreaming,\n *   observeWorkflowStream,\n *   closeStreamsAndReset,\n *   resumeWorkflowStream,\n *   timeTravelWorkflowStream,\n * } = useStreamWorkflow({\n *   debugMode: true,\n *   tracingOptions: { enabled: true },\n *   onError: (error, defaultMessage) => console.error(defaultMessage, error),\n * });\n *\n * // Start streaming a workflow\n * await streamWorkflow.mutateAsync({\n *   workflowId: 'my-workflow',\n *   runId: 'run-123',\n *   inputData: { key: 'value' },\n *   requestContext: {},\n * });\n * ```\n */\nexport function useStreamWorkflow({ debugMode, tracingOptions, onError }: UseStreamWorkflowParams) {\n  const client = useMastraClient();\n  const [streamResult, setStreamResult] = useState<WorkflowStreamResult>({} as WorkflowStreamResult);\n  const [isStreaming, setIsStreaming] = useState(false);\n  const readerRef = useRef<ReadableStreamDefaultReader<StreamVNextChunkType> | null>(null);\n  const observerRef = useRef<ReadableStreamDefaultReader<StreamVNextChunkType> | null>(null);\n  const resumeStreamRef = useRef<ReadableStreamDefaultReader<StreamVNextChunkType> | null>(null);\n  const timeTravelStreamRef = useRef<ReadableStreamDefaultReader<StreamVNextChunkType> | null>(null);\n  const isMountedRef = useRef(true);\n\n  // Cleanup on unmount\n  useEffect(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n      if (readerRef.current) {\n        try {\n          readerRef.current.releaseLock();\n        } catch {\n          // Reader might already be released, ignore the error\n        }\n        readerRef.current = null;\n      }\n      if (observerRef.current) {\n        try {\n          observerRef.current.releaseLock();\n        } catch {\n          // Reader might already be released, ignore the error\n        }\n        observerRef.current = null;\n      }\n      if (resumeStreamRef.current) {\n        try {\n          resumeStreamRef.current.releaseLock();\n        } catch {\n          // Reader might already be released, ignore the error\n        }\n        resumeStreamRef.current = null;\n      }\n      if (timeTravelStreamRef.current) {\n        try {\n          timeTravelStreamRef.current.releaseLock();\n        } catch {\n          // Reader might already be released, ignore the error\n        }\n        timeTravelStreamRef.current = null;\n      }\n    };\n  }, []);\n\n  const handleStreamError = useCallback(\n    (err: unknown, defaultMessage: string, setStreamingState?: (isStreaming: boolean) => void) => {\n      // Expected error during cleanup - safe to ignore\n      if (err instanceof TypeError) {\n        return;\n      }\n      const error = err instanceof Error ? err : new Error(defaultMessage);\n      onError?.(error, defaultMessage);\n      setStreamingState?.(false);\n    },\n    [onError],\n  );\n\n  const handleWorkflowFinish = useCallback((value: StreamVNextChunkType) => {\n    if (value.type === 'workflow-finish') {\n      const streamStatus = value.payload?.workflowStatus;\n      const metadata = value.payload?.metadata;\n      setStreamResult(prev => ({\n        ...prev,\n        status: streamStatus,\n      }));\n      if (streamStatus === 'failed') {\n        throw new Error(metadata?.errorMessage || 'Workflow execution failed');\n      }\n      // Tripwire status is not an error - it's handled separately in the UI\n      // Don't throw an error for tripwire status\n    }\n  }, []);\n\n  const streamWorkflow = useMutation<void, Error, StreamWorkflowParams>(\n    async ({ workflowId, runId, inputData, initialState, requestContext: playgroundRequestContext, perStep }) => {\n      // Clean up any existing reader before starting new stream\n      if (readerRef.current) {\n        readerRef.current.releaseLock();\n      }\n\n      if (!isMountedRef.current) return;\n\n      setIsStreaming(true);\n      setStreamResult({ input: inputData } as WorkflowStreamResult);\n      const workflow = client.getWorkflow(workflowId);\n      const run = await workflow.createRun({ runId });\n      const stream = await run.stream({\n        inputData,\n        initialState,\n        requestContext: playgroundRequestContext,\n        closeOnSuspend: true,\n        tracingOptions,\n        perStep: perStep ?? debugMode,\n      });\n\n      if (!stream) {\n        return handleStreamError(new Error('No stream returned'), 'No stream returned', setIsStreaming);\n      }\n\n      // Get a reader from the ReadableStream and store it in ref\n      const reader = stream.getReader();\n      readerRef.current = reader;\n\n      try {\n        while (true) {\n          if (!isMountedRef.current) break;\n\n          const { done, value } = await reader.read();\n          if (done) break;\n\n          // Only update state if component is still mounted\n          if (isMountedRef.current) {\n            setStreamResult(prev => {\n              const newResult = mapWorkflowStreamChunkToWatchResult(prev, value);\n              return newResult;\n            });\n\n            if (value.type === 'workflow-step-start') {\n              setIsStreaming(true);\n            }\n\n            if (value.type === 'workflow-step-suspended') {\n              setIsStreaming(false);\n            }\n\n            if (value.type === 'workflow-finish') {\n              handleWorkflowFinish(value);\n            }\n          }\n        }\n      } catch (err) {\n        handleStreamError(err, 'Error streaming workflow');\n      } finally {\n        if (isMountedRef.current) {\n          setIsStreaming(false);\n        }\n        if (readerRef.current) {\n          readerRef.current.releaseLock();\n          readerRef.current = null;\n        }\n      }\n    },\n  );\n\n  const observeWorkflowStream = useMutation<void, Error, ObserveWorkflowStreamParams>(\n    async ({ workflowId, runId, storeRunResult }) => {\n      // Clean up any existing reader before starting new stream\n      if (observerRef.current) {\n        observerRef.current.releaseLock();\n      }\n\n      if (!isMountedRef.current) return;\n\n      setIsStreaming(true);\n\n      setStreamResult((storeRunResult || {}) as WorkflowStreamResult);\n      if (storeRunResult?.status === 'suspended') {\n        setIsStreaming(false);\n        return;\n      }\n      const workflow = client.getWorkflow(workflowId);\n      const run = await workflow.createRun({ runId });\n      const stream = await run.observeStream();\n\n      if (!stream) {\n        return handleStreamError(new Error('No stream returned'), 'No stream returned', setIsStreaming);\n      }\n\n      // Get a reader from the ReadableStream and store it in ref\n      const reader = stream.getReader();\n      observerRef.current = reader;\n\n      try {\n        while (true) {\n          if (!isMountedRef.current) break;\n\n          const { done, value } = await reader.read();\n          if (done) break;\n\n          // Only update state if component is still mounted\n          if (isMountedRef.current) {\n            setStreamResult(prev => {\n              const newResult = mapWorkflowStreamChunkToWatchResult(prev, value);\n              return newResult;\n            });\n\n            if (value.type === 'workflow-step-start') {\n              setIsStreaming(true);\n            }\n\n            if (value.type === 'workflow-step-suspended') {\n              setIsStreaming(false);\n            }\n\n            if (value.type === 'workflow-finish') {\n              handleWorkflowFinish(value);\n            }\n          }\n        }\n      } catch (err) {\n        handleStreamError(err, 'Error observing workflow');\n      } finally {\n        if (isMountedRef.current) {\n          setIsStreaming(false);\n        }\n        if (observerRef.current) {\n          observerRef.current.releaseLock();\n          observerRef.current = null;\n        }\n      }\n    },\n  );\n\n  const resumeWorkflowStream = useMutation<void, Error, ResumeWorkflowStreamParams>(\n    async ({ workflowId, runId, step, resumeData, requestContext: playgroundRequestContext, perStep }) => {\n      // Clean up any existing reader before starting new stream\n      if (resumeStreamRef.current) {\n        resumeStreamRef.current.releaseLock();\n      }\n\n      if (!isMountedRef.current) return;\n\n      setIsStreaming(true);\n      const workflow = client.getWorkflow(workflowId);\n      const run = await workflow.createRun({ runId });\n      const stream = await run.resumeStream({\n        step,\n        resumeData,\n        requestContext: playgroundRequestContext,\n        tracingOptions,\n        perStep: perStep ?? debugMode,\n      });\n\n      if (!stream) {\n        return handleStreamError(new Error('No stream returned'), 'No stream returned', setIsStreaming);\n      }\n\n      // Get a reader from the ReadableStream and store it in ref\n      const reader = stream.getReader();\n      resumeStreamRef.current = reader;\n\n      try {\n        while (true) {\n          if (!isMountedRef.current) break;\n\n          const { done, value } = await reader.read();\n          if (done) break;\n\n          // Only update state if component is still mounted\n          if (isMountedRef.current) {\n            setStreamResult(prev => {\n              const newResult = mapWorkflowStreamChunkToWatchResult(prev, value);\n              return newResult;\n            });\n\n            if (value.type === 'workflow-step-start') {\n              setIsStreaming(true);\n            }\n\n            if (value.type === 'workflow-step-suspended') {\n              setIsStreaming(false);\n            }\n\n            if (value.type === 'workflow-finish') {\n              handleWorkflowFinish(value);\n            }\n          }\n        }\n      } catch (err) {\n        handleStreamError(err, 'Error resuming workflow stream');\n      } finally {\n        if (isMountedRef.current) {\n          setIsStreaming(false);\n        }\n        if (resumeStreamRef.current) {\n          resumeStreamRef.current.releaseLock();\n          resumeStreamRef.current = null;\n        }\n      }\n    },\n  );\n\n  const timeTravelWorkflowStream = useMutation<void, Error, TimeTravelWorkflowStreamParams>(\n    async ({ workflowId, requestContext: playgroundRequestContext, runId, perStep, ...params }) => {\n      // Clean up any existing reader before starting new stream\n      if (timeTravelStreamRef.current) {\n        timeTravelStreamRef.current.releaseLock();\n      }\n\n      if (!isMountedRef.current) return;\n\n      setIsStreaming(true);\n      const workflow = client.getWorkflow(workflowId);\n      const run = await workflow.createRun({ runId });\n      const stream = await run.timeTravelStream({\n        ...params,\n        perStep: perStep ?? debugMode,\n        requestContext: playgroundRequestContext,\n        tracingOptions,\n      });\n\n      if (!stream) {\n        return handleStreamError(new Error('No stream returned'), 'No stream returned', setIsStreaming);\n      }\n\n      // Get a reader from the ReadableStream and store it in ref\n      const reader = stream.getReader();\n      timeTravelStreamRef.current = reader;\n\n      try {\n        while (true) {\n          if (!isMountedRef.current) break;\n\n          const { done, value } = await reader.read();\n          if (done) break;\n\n          // Only update state if component is still mounted\n          if (isMountedRef.current) {\n            setStreamResult(prev => {\n              const newResult = mapWorkflowStreamChunkToWatchResult(prev, value);\n              return newResult;\n            });\n\n            if (value.type === 'workflow-step-start') {\n              setIsStreaming(true);\n            }\n\n            if (value.type === 'workflow-step-suspended') {\n              setIsStreaming(false);\n            }\n\n            if (value.type === 'workflow-finish') {\n              handleWorkflowFinish(value);\n            }\n          }\n        }\n      } catch (err) {\n        handleStreamError(err, 'Error time traveling workflow stream');\n      } finally {\n        if (isMountedRef.current) {\n          setIsStreaming(false);\n        }\n        if (timeTravelStreamRef.current) {\n          timeTravelStreamRef.current.releaseLock();\n          timeTravelStreamRef.current = null;\n        }\n      }\n    },\n  );\n\n  const closeStreamsAndReset = useCallback(() => {\n    setIsStreaming(false);\n    setStreamResult({} as WorkflowStreamResult);\n    if (readerRef.current) {\n      try {\n        readerRef.current.releaseLock();\n      } catch {\n        // Reader might already be released, ignore the error\n      }\n      readerRef.current = null;\n    }\n    if (observerRef.current) {\n      try {\n        observerRef.current.releaseLock();\n      } catch {\n        // Reader might already be released, ignore the error\n      }\n      observerRef.current = null;\n    }\n    if (resumeStreamRef.current) {\n      try {\n        resumeStreamRef.current.releaseLock();\n      } catch {\n        // Reader might already be released, ignore the error\n      }\n      resumeStreamRef.current = null;\n    }\n    if (timeTravelStreamRef.current) {\n      try {\n        timeTravelStreamRef.current.releaseLock();\n      } catch {\n        // Reader might already be released, ignore the error\n      }\n      timeTravelStreamRef.current = null;\n    }\n  }, []);\n\n  return {\n    streamWorkflow,\n    streamResult,\n    isStreaming,\n    observeWorkflowStream,\n    closeStreamsAndReset,\n    resumeWorkflowStream,\n    timeTravelWorkflowStream,\n  };\n}\n","import { useMutation } from '../lib/use-mutation';\nimport { useMastraClient } from '../mastra-client-context';\nimport type {\n  CreateWorkflowRunParams,\n  CreateWorkflowRunResult,\n  CancelWorkflowRunParams,\n  CancelWorkflowRunResult,\n} from './types';\n\nexport { useStreamWorkflow } from './use-stream-workflow';\n\n/**\n * Hook for creating workflow runs.\n * Returns a mutation for creating a new workflow run.\n *\n * @example\n * ```tsx\n * const createWorkflowRun = useCreateWorkflowRun();\n *\n * // Create a run\n * const { runId } = await createWorkflowRun.mutateAsync({\n *   workflowId: 'my-workflow'\n * });\n * ```\n */\nexport function useCreateWorkflowRun() {\n  const client = useMastraClient();\n\n  return useMutation<CreateWorkflowRunResult, Error, CreateWorkflowRunParams>(async ({ workflowId, prevRunId }) => {\n    try {\n      const workflow = client.getWorkflow(workflowId);\n      const { runId: newRunId } = await workflow.createRun({ runId: prevRunId });\n      return { runId: newRunId };\n    } catch (error) {\n      console.error('Error creating workflow run:', error);\n      throw error;\n    }\n  });\n}\n\n/**\n * Hook for canceling workflow runs.\n * Returns a mutation for canceling a running workflow.\n *\n * @example\n * ```tsx\n * const cancelWorkflowRun = useCancelWorkflowRun();\n *\n * // Cancel a run\n * await cancelWorkflowRun.mutateAsync({\n *   workflowId: 'my-workflow',\n *   runId: 'run-123'\n * });\n * ```\n */\nexport function useCancelWorkflowRun() {\n  const client = useMastraClient();\n\n  return useMutation<CancelWorkflowRunResult, Error, CancelWorkflowRunParams>(async ({ workflowId, runId }) => {\n    try {\n      const workflow = client.getWorkflow(workflowId);\n      const run = await workflow.createRun({ runId });\n      return run.cancelRun();\n    } catch (error) {\n      console.error('Error canceling workflow run:', error);\n      throw error;\n    }\n  });\n}\n","import { memo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { ResolvedWorkflowStep, WorkflowStepRenderers } from './types';\n\nexport interface WorkflowStepFactoryProps<\n  TStep extends ResolvedWorkflowStep = ResolvedWorkflowStep,\n> extends WorkflowStepRenderers<TStep> {\n  step: TStep;\n}\n\nconst renderUnknown = <TStep extends ResolvedWorkflowStep>(\n  step: TStep,\n  UnknownStep?: WorkflowStepRenderers<TStep>['UnknownStep'],\n): ReactNode => UnknownStep?.(step) ?? null;\n\nconst WorkflowStepFactoryComponent = <TStep extends ResolvedWorkflowStep>({\n  step,\n  Step,\n  MapStep,\n  AgentStep,\n  ToolStep,\n  ForEachStep,\n  ParallelStep,\n  Conditional,\n  LoopStep,\n  SleepStep,\n  SleepUntilStep,\n  NestedWorkflowStep,\n  UnknownStep,\n}: WorkflowStepFactoryProps<TStep>) => {\n  switch (step.kind) {\n    case 'step':\n      return <>{Step?.(step as Extract<TStep, { kind: 'step' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'map-step':\n      return <>{MapStep?.(step as Extract<TStep, { kind: 'map-step' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'agent-step':\n      return <>{AgentStep?.(step as Extract<TStep, { kind: 'agent-step' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'tool-step':\n      return <>{ToolStep?.(step as Extract<TStep, { kind: 'tool-step' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'foreach-step':\n      return <>{ForEachStep?.(step as Extract<TStep, { kind: 'foreach-step' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'parallel-step':\n      return (\n        <>{ParallelStep?.(step as Extract<TStep, { kind: 'parallel-step' }>) ?? renderUnknown(step, UnknownStep)}</>\n      );\n    case 'conditional':\n      return <>{Conditional?.(step as Extract<TStep, { kind: 'conditional' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'loop-step':\n      return <>{LoopStep?.(step as Extract<TStep, { kind: 'loop-step' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'sleep-step':\n      return <>{SleepStep?.(step as Extract<TStep, { kind: 'sleep-step' }>) ?? renderUnknown(step, UnknownStep)}</>;\n    case 'sleep-until-step':\n      return (\n        <>\n          {SleepUntilStep?.(step as Extract<TStep, { kind: 'sleep-until-step' }>) ?? renderUnknown(step, UnknownStep)}\n        </>\n      );\n    case 'nested-workflow-step':\n      return (\n        <>\n          {NestedWorkflowStep?.(step as Extract<TStep, { kind: 'nested-workflow-step' }>) ??\n            renderUnknown(step, UnknownStep)}\n        </>\n      );\n    default:\n      return <>{renderUnknown(step, UnknownStep)}</>;\n  }\n};\n\nexport const WorkflowStepFactory = memo(WorkflowStepFactoryComponent) as typeof WorkflowStepFactoryComponent;\n","export async function recordMicrophoneToFile(onFinish: (file: File) => void) {\n  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n  const mediaRecorder = new MediaRecorder(stream);\n\n  let chunks: BlobPart[] = [];\n\n  mediaRecorder.ondataavailable = e => {\n    chunks.push(e.data);\n  };\n\n  mediaRecorder.onstop = () => {\n    const blob = new Blob(chunks, { type: 'audio/webm' });\n    const file = new File([blob], `recording-${Date.now()}.webm`, {\n      type: 'audio/webm',\n      lastModified: Date.now(),\n    });\n\n    stream.getTracks().forEach(track => track.stop());\n    onFinish(file);\n  };\n\n  return mediaRecorder;\n}\n","export async function playStreamWithWebAudio(stream: ReadableStream, onEnded?: () => void) {\n  const audioContext = new window.AudioContext();\n\n  const reader = stream.getReader();\n  const chunks = [];\n\n  try {\n    // Read all chunks\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      chunks.push(value);\n    }\n\n    // Combine chunks into single ArrayBuffer\n    const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n    const combinedBuffer = new Uint8Array(totalLength);\n    let offset = 0;\n\n    for (const chunk of chunks) {\n      combinedBuffer.set(chunk, offset);\n      offset += chunk.length;\n    }\n\n    // Decode and play\n    const audioBuffer = await audioContext.decodeAudioData(combinedBuffer.buffer);\n    const source = audioContext.createBufferSource();\n    source.buffer = audioBuffer;\n    source.onended = onEnded ?? null;\n    source.connect(audioContext.destination);\n    source.start();\n\n    return () => {\n      source.onended = null;\n      source.stop();\n      void audioContext.close();\n    };\n  } catch (error) {\n    await reader.cancel().catch(() => undefined);\n    await audioContext.close().catch(() => undefined);\n    throw error;\n  } finally {\n    reader.releaseLock();\n  }\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useEffect, useRef, useState } from 'react';\nimport { useMastraClient } from '../mastra-client-context';\nimport { recordMicrophoneToFile } from './record-mic-to-file';\n\ntype Agent = ReturnType<MastraClient['getAgent']>;\ntype VoiceRequestContext = Parameters<Agent['voice']['getSpeakers']>[0];\n\nexport interface SpeechRecognitionState {\n  isListening: boolean;\n  transcript: string;\n  error: string | null;\n}\n\nexport interface UseSpeechRecognitionArgs {\n  language?: string;\n  agentId?: string;\n  requestContext?: VoiceRequestContext;\n}\n\ntype SpeechRecognitionResult = SpeechRecognitionState & {\n  start: () => void;\n  stop: () => void;\n};\n\nexport const useSpeechRecognition = ({\n  language = 'en-US',\n  agentId,\n  requestContext,\n}: UseSpeechRecognitionArgs): SpeechRecognitionResult => {\n  const client = useMastraClient();\n  const [agent, setAgent] = useState<Agent | null>(null);\n\n  useEffect(() => {\n    let cancelled = false;\n\n    if (!agentId) {\n      setAgent(null);\n      return () => {\n        cancelled = true;\n      };\n    }\n\n    const agent = client.getAgent(agentId);\n\n    const check = async () => {\n      try {\n        const speakers = await agent.voice.getSpeakers(requestContext);\n        if (!cancelled) {\n          setAgent(speakers.length > 0 ? agent : null);\n        }\n      } catch {\n        if (!cancelled) {\n          setAgent(null);\n        }\n      }\n    };\n\n    void check();\n\n    return () => {\n      cancelled = true;\n    };\n  }, [agentId, client, requestContext]);\n\n  const browserSpeechRecognition = useBrowserSpeechRecognition({ language });\n  const mastraSpeechRecognition = useMastraSpeechToText({ agent, language });\n\n  if (!agent) {\n    return browserSpeechRecognition;\n  }\n\n  return mastraSpeechRecognition;\n};\n\nconst useBrowserSpeechRecognition = ({ language = 'en-US' }: { language?: string }): SpeechRecognitionResult => {\n  const speechRecognitionRef = useRef<any>(null);\n  const [state, setState] = useState<SpeechRecognitionState>({\n    isListening: false,\n    transcript: '',\n    error: null,\n  });\n\n  const start = () => {\n    if (!speechRecognitionRef.current) return;\n    speechRecognitionRef.current.start();\n  };\n\n  const stop = () => {\n    if (!speechRecognitionRef.current) return;\n    speechRecognitionRef.current.stop();\n  };\n\n  useEffect(() => {\n    if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) {\n      setState(prev => ({ ...prev, error: 'Speech Recognition not supported in this browser' }));\n      return;\n    }\n\n    const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n    const recognition = new SpeechRecognition();\n    speechRecognitionRef.current = recognition;\n\n    recognition.continuous = true;\n    recognition.lang = language;\n\n    recognition.onstart = () => {\n      setState(prev => ({ ...prev, isListening: true, error: null }));\n    };\n\n    recognition.onresult = (event: any) => {\n      let finalTranscript = '';\n\n      for (let i = event.resultIndex; i < event.results.length; i++) {\n        const transcript = event.results[i][0].transcript;\n        if (event.results[i].isFinal) {\n          finalTranscript += transcript + ' ';\n        }\n      }\n\n      setState(prev => ({ ...prev, transcript: finalTranscript }));\n    };\n\n    recognition.onerror = (event: any) => {\n      setState(prev => ({ ...prev, error: `Error: ${event.error}` }));\n    };\n\n    recognition.onend = () => setState(prev => ({ ...prev, isListening: false }));\n\n    return () => {\n      try {\n        recognition.stop();\n      } catch {\n        // ignore: recognition may not be running\n      }\n      recognition.onstart = null;\n      recognition.onresult = null;\n      recognition.onerror = null;\n      recognition.onend = null;\n      speechRecognitionRef.current = null;\n    };\n  }, [language]);\n\n  return {\n    ...state,\n    start,\n    stop,\n  };\n};\n\nconst useMastraSpeechToText = ({\n  agent,\n  language,\n}: {\n  agent: Agent | null;\n  language: string;\n}): SpeechRecognitionResult => {\n  const [state, setState] = useState<SpeechRecognitionState>({\n    isListening: false,\n    transcript: '',\n    error: null,\n  });\n  const recorderRef = useRef<MediaRecorder | null>(null);\n  const sessionRef = useRef(0);\n  const startInFlightRef = useRef(false);\n\n  useEffect(() => {\n    return () => {\n      sessionRef.current += 1;\n      startInFlightRef.current = false;\n      recorderRef.current?.stop();\n      recorderRef.current = null;\n    };\n  }, [agent]);\n\n  const handleFinish = (session: number) => (file: File) => {\n    if (!agent || session !== sessionRef.current) return;\n\n    recorderRef.current = null;\n    setState(prev => ({ ...prev, isListening: false }));\n\n    void agent.voice\n      .listen(file, { language })\n      .then(res => {\n        if (session !== sessionRef.current) return;\n        setState(prev => ({ ...prev, transcript: res.text, error: null }));\n      })\n      .catch(error => {\n        if (session !== sessionRef.current) return;\n        const message = error instanceof Error ? error.message : 'Failed to transcribe speech';\n        setState(prev => ({ ...prev, error: message }));\n      });\n  };\n\n  const start = () => {\n    if (!agent || startInFlightRef.current || recorderRef.current) return;\n\n    startInFlightRef.current = true;\n    // Bump the session here (not in stop()) so a normal stop's onstop callback\n    // still matches sessionRef.current. Only a new start (or unmount) should\n    // invalidate a prior in-flight recording's result.\n    // See: https://github.com/mastra-ai/mastra/issues/19980\n    sessionRef.current += 1;\n    const session = sessionRef.current;\n\n    void recordMicrophoneToFile(handleFinish(session))\n      .then(recorder => {\n        startInFlightRef.current = false;\n        if (session !== sessionRef.current) {\n          try {\n            recorder.stop();\n          } catch {\n            // ignore: recorder was never started\n          }\n          return;\n        }\n        recorderRef.current = recorder;\n        setState(prev => ({ ...prev, isListening: true, error: null }));\n        recorder.start();\n      })\n      .catch(error => {\n        startInFlightRef.current = false;\n        if (session !== sessionRef.current) return;\n        const message = error instanceof Error ? error.message : 'Failed to start speech recording';\n        setState(prev => ({ ...prev, isListening: false, error: message }));\n      });\n  };\n\n  const stop = () => {\n    if (recorderRef.current) {\n      // An active recording — its session was fixed at start() time and hasn't\n      // changed, so its own onstop/handleFinish will complete normally.\n      recorderRef.current.stop();\n      recorderRef.current = null;\n    } else if (startInFlightRef.current) {\n      // No recorder yet but a start() is still in-flight. Invalidate the\n      // session so that start's resolution knows to abort (stop the recorder\n      // instead of assigning/starting it) rather than silently proceeding.\n      sessionRef.current += 1;\n    }\n    // Otherwise the hook is idle, or a finished recording's transcription is\n    // still in flight — bumping the session then would silently discard the\n    // transcript (the same failure class as #19980, in a narrower window).\n    startInFlightRef.current = false;\n    setState(prev => ({ ...prev, isListening: false }));\n  };\n\n  return {\n    ...state,\n    start,\n    stop,\n  };\n};\n"],"mappings":"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"}