{"version":3,"sources":["../../src/harness/display-state-scheduler.ts","../../src/harness/tools.ts","../../src/harness/types.ts","../../src/harness/harness.ts"],"names":["cloned","createTool","z","answer","result","RequestContext","Agent","createWorkspaceTools","durationMs","getTransformedToolPayload","hasTransformedToolPayload","createSignal","toStandardSchema","Workspace","Mastra","randomUUID","mastraDBMessageToSignal","safeStringify"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { HarnessDisplayState, HarnessDisplayStateListener, HarnessEvent } from './types';\n\nexport const DEFAULT_DISPLAY_STATE_SUBSCRIPTION_OPTIONS = {\n  windowMs: 250,\n  maxWaitMs: 500,\n} as const;\n\nexport const CRITICAL_DISPLAY_STATE_EVENT_TYPES: ReadonlySet<HarnessEvent['type']> = new Set([\n  'agent_start',\n  'agent_end',\n  'error',\n  'tool_approval_required',\n  'tool_suspended',\n  'ask_question',\n  'plan_approval_required',\n  'plan_approved',\n  'thread_changed',\n  'thread_created',\n  'thread_deleted',\n  'mode_changed',\n  'model_changed',\n  'subagent_model_changed',\n  'state_changed',\n  'tool_input_end',\n  'tool_end',\n  'subagent_end',\n]);\n\nfunction cloneValue(value: unknown, seen = new WeakMap<object, unknown>()): unknown {\n  if (value === null || typeof value !== 'object') {\n    return value;\n  }\n\n  if (value instanceof Date) {\n    return new Date(value.getTime());\n  }\n\n  if (seen.has(value)) {\n    return seen.get(value);\n  }\n\n  if (Array.isArray(value)) {\n    const cloned: unknown[] = [];\n    seen.set(value, cloned);\n    for (const item of value) {\n      cloned.push(cloneValue(item, seen));\n    }\n    return cloned;\n  }\n\n  if (value instanceof Map) {\n    const cloned = new Map<unknown, unknown>();\n    seen.set(value, cloned);\n    for (const [key, mapValue] of value) {\n      cloned.set(cloneValue(key, seen), cloneValue(mapValue, seen));\n    }\n    return cloned;\n  }\n\n  if (value instanceof Set) {\n    const cloned = new Set<unknown>();\n    seen.set(value, cloned);\n    for (const item of value) {\n      cloned.add(cloneValue(item, seen));\n    }\n    return cloned;\n  }\n\n  const cloned: Record<PropertyKey, unknown> = {};\n  seen.set(value, cloned);\n  for (const key of Reflect.ownKeys(value)) {\n    cloned[key] = cloneValue((value as Record<PropertyKey, unknown>)[key], seen);\n  }\n  return cloned;\n}\n\nfunction cloneUnknown<T>(value: T): T {\n  return cloneValue(value) as T;\n}\n\nfunction cloneDisplayState(state: HarnessDisplayState): HarnessDisplayState {\n  return {\n    ...state,\n    currentMessage: state.currentMessage\n      ? {\n          ...state.currentMessage,\n          createdAt: new Date(state.currentMessage.createdAt.getTime()),\n          content: state.currentMessage.content.map(part => cloneUnknown(part)),\n        }\n      : null,\n    tokenUsage: { ...state.tokenUsage },\n    activeTools: new Map(\n      Array.from(state.activeTools, ([id, tool]) => [\n        id,\n        {\n          ...tool,\n          args: cloneUnknown(tool.args),\n          result: cloneUnknown(tool.result),\n        },\n      ]),\n    ),\n    toolInputBuffers: new Map(Array.from(state.toolInputBuffers, ([id, buffer]) => [id, { ...buffer }])),\n    pendingApproval: state.pendingApproval\n      ? { ...state.pendingApproval, args: cloneUnknown(state.pendingApproval.args) }\n      : null,\n    pendingSuspension: state.pendingSuspension\n      ? {\n          ...state.pendingSuspension,\n          args: cloneUnknown(state.pendingSuspension.args),\n          suspendPayload: cloneUnknown(state.pendingSuspension.suspendPayload),\n        }\n      : null,\n    pendingQuestion: state.pendingQuestion\n      ? {\n          ...state.pendingQuestion,\n          options: state.pendingQuestion.options?.map(option => cloneUnknown(option)),\n        }\n      : null,\n    pendingPlanApproval: state.pendingPlanApproval ? { ...state.pendingPlanApproval } : null,\n    activeSubagents: new Map(\n      Array.from(state.activeSubagents, ([id, subagent]) => [\n        id,\n        {\n          ...subagent,\n          toolCalls: subagent.toolCalls.map(toolCall => cloneUnknown(toolCall)),\n        },\n      ]),\n    ),\n    omProgress: {\n      ...state.omProgress,\n      buffered: {\n        observations: { ...state.omProgress.buffered.observations },\n        reflection: { ...state.omProgress.buffered.reflection },\n      },\n    },\n    modifiedFiles: new Map(\n      Array.from(state.modifiedFiles, ([path, modifiedFile]) => [\n        path,\n        {\n          ...modifiedFile,\n          firstModified: new Date(modifiedFile.firstModified.getTime()),\n          operations: [...modifiedFile.operations],\n        },\n      ]),\n    ),\n    tasks: state.tasks.map(task => cloneUnknown(task)),\n    previousTasks: state.previousTasks.map(task => cloneUnknown(task)),\n  };\n}\n\nexport class DisplayStateScheduler {\n  private disposed = false;\n  private pendingState: HarnessDisplayState | null = null;\n  private windowTimer: ReturnType<typeof setTimeout> | null = null;\n  private maxWaitTimer: ReturnType<typeof setTimeout> | null = null;\n\n  constructor(\n    private readonly listener: HarnessDisplayStateListener,\n    private readonly windowMs: number,\n    private readonly maxWaitMs: number,\n  ) {}\n\n  notify(state: HarnessDisplayState, isCritical: boolean): void {\n    if (this.disposed) return;\n\n    if (isCritical) {\n      this.flush(state);\n      return;\n    }\n\n    this.pendingState = state;\n\n    if (this.windowTimer) {\n      clearTimeout(this.windowTimer);\n    }\n    this.windowTimer = setTimeout(() => this.flushPending(), this.windowMs);\n\n    if (!this.maxWaitTimer) {\n      this.maxWaitTimer = setTimeout(() => this.flushPending(), this.maxWaitMs);\n    }\n  }\n\n  dispose(): void {\n    this.disposed = true;\n    this.pendingState = null;\n    this.clearTimers();\n  }\n\n  private flushPending(): void {\n    if (!this.pendingState) return;\n    this.flush(this.pendingState);\n  }\n\n  private flush(state: HarnessDisplayState): void {\n    if (this.disposed) return;\n\n    this.pendingState = null;\n    this.clearTimers();\n\n    try {\n      const result = this.listener(cloneDisplayState(state));\n      if (result && typeof result === 'object' && 'catch' in result && typeof result.catch === 'function') {\n        (result as Promise<void>).catch(err => console.error('Error in harness display state listener:', err));\n      }\n    } catch (err) {\n      console.error('Error in harness display state listener:', err);\n    }\n  }\n\n  private clearTimers(): void {\n    if (this.windowTimer) {\n      clearTimeout(this.windowTimer);\n    }\n    if (this.maxWaitTimer) {\n      clearTimeout(this.maxWaitTimer);\n    }\n    this.windowTimer = null;\n    this.maxWaitTimer = null;\n  }\n}\n","import { z } from 'zod/v4';\n\nimport { Agent } from '../agent';\nimport type { ToolsInput, ToolsetsInput } from '../agent/types';\nimport type { MastraLanguageModel } from '../llm/model/shared.types';\nimport { RequestContext } from '../request-context';\nimport { createTool } from '../tools/tool';\nimport { createWorkspaceTools } from '../workspace/tools/tools';\n\nimport type { HarnessQuestionAnswer, HarnessRequestContext, HarnessSubagent } from './types';\n\nlet questionCounter = 0;\nlet planCounter = 0;\n\nconst FORKED_SUBAGENT_NESTING_NOTICE =\n  'Do not call the `subagent` tool. You are currently running inside a forked subagent, and this is the maximum allowed subagent nesting level. Further subagent calls will return an error. Answer the task directly using the conversation history and the other tools available to you.';\n\nconst FORKED_SUBAGENT_TASK_NOTICE =\n  'Do not call `task_write`, `task_update`, `task_complete`, or `task_check` inside a forked subagent. Forked subagents keep the parent task-tool schemas for prompt-cache stability, but the parent agent owns the visible task list. Track forked subagent work in your final answer instead.';\n\n/**\n * Converts the user's answer into the text returned to the model after the `ask_user`\n * tool resumes. Free-text and single-select prompts already produce a single string,\n * while multi-select prompts return an array of selected labels that must be flattened\n * before the tool result is added back into the generation context.\n *\n * The formatter intentionally keeps the model-facing output compact by joining\n * multi-select answers with commas. This mirrors the old single-answer behavior while\n * still preserving every selected option in a readable form.\n */\nfunction formatQuestionAnswer(answer: HarnessQuestionAnswer): string {\n  return Array.isArray(answer) ? answer.join(', ') : answer;\n}\n\n/**\n * Built-in harness tool: ask the user a question and wait for their response.\n *\n * The tool supports three prompt shapes. Omitting `options` asks an open-ended\n * free-text question. Providing `options` without `selectionMode` asks the UI to\n * render a single-select prompt for backwards compatibility. Providing\n * `selectionMode: 'multi_select'` lets the UI return multiple selected option labels\n * as a string array through `respondToQuestion()`.\n *\n * During normal harness execution the tool emits an `ask_question` event, registers a\n * resolver, and pauses until the UI answers. When the tool is executed without harness\n * callbacks, it returns a readable fallback prompt so non-UI execution paths still\n * expose the question and available choices to the model.\n */\nexport const askUserTool = createTool({\n  id: 'ask_user',\n  description:\n    'Ask the user a question and wait for their response. Use this when you need clarification, want to validate assumptions, or need the user to make a decision between options. Provide options for structured choices (2-4 options), or omit them for open-ended questions. Use selectionMode to choose whether the user can pick one option or multiple options.',\n  inputSchema: z.object({\n    question: z.string().min(1).describe('The question to ask the user. Should be clear and specific.'),\n    options: z\n      .array(\n        z.object({\n          label: z.string().describe('Short display text for this option (1-5 words)'),\n          description: z.string().optional().describe('Explanation of what this option means'),\n        }),\n      )\n      .optional()\n      .describe('Optional choices. If provided, shows a selection list. If omitted, shows a free-text input.'),\n    selectionMode: z\n      .enum(['single_select', 'multi_select'])\n      .optional()\n      .describe(\n        'Controls how many provided options the user can select. Defaults to single_select when options are provided. Requires options.',\n      ),\n  }),\n  execute: async ({ question, options, selectionMode }, context) => {\n    try {\n      const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n      const resolvedSelectionMode = options?.length ? (selectionMode ?? 'single_select') : undefined;\n\n      if (selectionMode && !options?.length) {\n        return {\n          content: 'Failed to ask user: selectionMode requires options.',\n          isError: true,\n        };\n      }\n\n      if (!harnessCtx?.emitEvent || !harnessCtx?.registerQuestion) {\n        return {\n          content: `[Question for user]: ${question}${\n            options?.length ? '\\nOptions: ' + options.map(o => o.label).join(', ') : ''\n          }${resolvedSelectionMode ? '\\nSelection mode: ' + resolvedSelectionMode : ''}`,\n          isError: false,\n        };\n      }\n\n      const questionId = `q_${++questionCounter}_${Date.now()}`;\n\n      const answer = await new Promise<HarnessQuestionAnswer>((resolve, reject) => {\n        const signal = harnessCtx.abortSignal;\n        if (signal?.aborted) {\n          reject(new DOMException('Aborted', 'AbortError'));\n          return;\n        }\n        const onAbort = () => reject(new DOMException('Aborted', 'AbortError'));\n        signal?.addEventListener('abort', onAbort, { once: true });\n\n        harnessCtx.registerQuestion!({\n          questionId,\n          resolve: answer => {\n            signal?.removeEventListener('abort', onAbort);\n            resolve(answer);\n          },\n        });\n\n        harnessCtx.emitEvent!({\n          type: 'ask_question',\n          questionId,\n          question,\n          options,\n          selectionMode: resolvedSelectionMode,\n        });\n      });\n\n      return { content: `User answered: ${formatQuestionAnswer(answer)}`, isError: false };\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : 'Unknown error';\n      return { content: `Failed to ask user: ${msg}`, isError: true };\n    }\n  },\n});\n\n/**\n * Built-in harness tool: submit a plan for user review.\n * The plan renders in the UI with approve/reject options.\n * On approval, the harness switches to the default mode.\n */\nexport const submitPlanTool = createTool({\n  id: 'submit_plan',\n  description:\n    'Submit a completed implementation plan for user review. The plan will be rendered as markdown and the user can approve, reject, or request changes. Use this when your exploration is complete and you have a concrete plan ready for review. On approval, the system automatically switches to the default mode so you can implement.',\n  inputSchema: z.object({\n    title: z.string().optional().describe(\"Short title for the plan (e.g., 'Add dark mode toggle')\"),\n    plan: z\n      .string()\n      .min(1)\n      .describe('The full plan content in markdown format. Should include Overview, Steps, and Verification sections.'),\n  }),\n  execute: async ({ title, plan }, context) => {\n    try {\n      const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n\n      if (!harnessCtx?.emitEvent || !harnessCtx?.registerPlanApproval) {\n        return {\n          content: `[Plan submitted for review]\\n\\nTitle: ${title || 'Implementation Plan'}\\n\\n${plan}`,\n          isError: false,\n        };\n      }\n\n      const planId = `plan_${++planCounter}_${Date.now()}`;\n\n      const result = await new Promise<{ action: 'approved' | 'rejected'; feedback?: string }>((resolve, reject) => {\n        const signal = harnessCtx.abortSignal;\n        if (signal?.aborted) {\n          reject(new DOMException('Aborted', 'AbortError'));\n          return;\n        }\n        const onAbort = () => reject(new DOMException('Aborted', 'AbortError'));\n        signal?.addEventListener('abort', onAbort, { once: true });\n\n        harnessCtx.registerPlanApproval!({\n          planId,\n          resolve: res => {\n            signal?.removeEventListener('abort', onAbort);\n            resolve(res);\n          },\n        });\n\n        harnessCtx.emitEvent!({\n          type: 'plan_approval_required',\n          planId,\n          title: title || 'Implementation Plan',\n          plan,\n        });\n      });\n\n      if (result.action === 'approved') {\n        return {\n          content: 'Plan approved. Proceed with implementation following the approved plan.',\n          isError: false,\n        };\n      }\n\n      const feedback = result.feedback ? `\\n\\nUser feedback: ${result.feedback}` : '';\n      return {\n        content: `Plan was not approved. The user wants revisions.${feedback}\\n\\nPlease revise the plan based on the feedback and submit again with submit_plan.`,\n        isError: false,\n      };\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : 'Unknown error';\n      return { content: `Failed to submit plan: ${msg}`, isError: true };\n    }\n  },\n});\n\n// =============================================================================\n// Task Tools\n// =============================================================================\n\nconst taskIdSchema = z\n  .string()\n  .min(1)\n  .describe(\"Stable task identifier (for example, 'task_investigate_tests'). Keep this unchanged across updates.\");\n\nconst taskItemInputSchema = z.object({\n  id: taskIdSchema.optional(),\n  content: z.string().min(1).describe(\"Task description in imperative form (e.g., 'Fix authentication bug')\"),\n  status: z.enum(['pending', 'in_progress', 'completed']).describe('Current task status'),\n  activeForm: z\n    .string()\n    .min(1)\n    .describe(\"Present continuous form shown during execution (e.g., 'Fixing authentication bug')\"),\n});\n\nconst taskItemSchema = taskItemInputSchema.extend({\n  id: taskIdSchema,\n});\n\nexport type TaskItemInput = z.infer<typeof taskItemInputSchema>;\nexport type TaskItem = z.infer<typeof taskItemSchema>;\nexport type TaskItemSnapshot = TaskItem;\n\nconst taskToolResultSchema = z.object({\n  content: z.string(),\n  tasks: z.array(taskItemSchema),\n  isError: z.boolean(),\n});\n\nconst taskCheckSummarySchema = z.object({\n  total: z.number().int().nonnegative(),\n  completed: z.number().int().nonnegative(),\n  inProgress: z.number().int().nonnegative(),\n  pending: z.number().int().nonnegative(),\n  incomplete: z.number().int().nonnegative(),\n  hasTasks: z.boolean(),\n  allCompleted: z.boolean(),\n});\n\nconst taskCheckResultSchema = taskToolResultSchema.extend({\n  summary: taskCheckSummarySchema,\n  incompleteTasks: z.array(taskItemSchema),\n});\n\nexport type TaskCheckSummary = z.infer<typeof taskCheckSummarySchema>;\nexport type TaskCheckResult = z.infer<typeof taskCheckResultSchema>;\ntype TaskToolResult = z.infer<typeof taskToolResultSchema>;\n\nconst TASK_ID_SLUG_MAX_LENGTH = 48;\n\nfunction slugifyTaskContent(content: string): string {\n  let slug = '';\n  let pendingSeparator = false;\n\n  for (const char of content.toLowerCase()) {\n    const code = char.charCodeAt(0);\n    const isAsciiLetter = code >= 97 && code <= 122;\n    const isDigit = code >= 48 && code <= 57;\n\n    if (isAsciiLetter || isDigit) {\n      if (pendingSeparator && slug.length > 0 && slug.length < TASK_ID_SLUG_MAX_LENGTH) {\n        slug += '_';\n      }\n      if (slug.length >= TASK_ID_SLUG_MAX_LENGTH) break;\n      slug += char;\n      pendingSeparator = false;\n      continue;\n    }\n\n    pendingSeparator = slug.length > 0;\n  }\n\n  return slug;\n}\n\nfunction createDeterministicTaskId(task: TaskItemInput, occurrence: number): string {\n  const slug = slugifyTaskContent(task.content);\n  const suffix = occurrence > 1 ? `_${occurrence}` : '';\n  return `task_${slug || 'item'}${suffix}`;\n}\n\nfunction makeUniqueTaskId(id: string, usedIds: Set<string>, reservedIds: Set<string> = new Set()): string {\n  if (!usedIds.has(id) && !reservedIds.has(id)) return id;\n\n  let suffix = 2;\n  let nextId = `${id}_${suffix}`;\n  while (usedIds.has(nextId) || reservedIds.has(nextId)) {\n    suffix += 1;\n    nextId = `${id}_${suffix}`;\n  }\n  return nextId;\n}\n\nexport function assignTaskIds(tasks: TaskItemInput[], previousTasks: TaskItemSnapshot[] = []): TaskItemSnapshot[] {\n  const usedIds = new Set<string>();\n  const contentOccurrences = new Map<string, number>();\n  const omittedContentCounts = new Map<string, number>();\n  const explicitTaskIds = new Set(tasks.map(task => task.id).filter((id): id is string => Boolean(id)));\n  const reusablePreviousIds = new Map<number, string>();\n\n  for (const task of tasks) {\n    if (!task.id) {\n      omittedContentCounts.set(task.content, (omittedContentCounts.get(task.content) ?? 0) + 1);\n    }\n  }\n\n  tasks.forEach((task, index) => {\n    if (task.id || omittedContentCounts.get(task.content) !== 1) return;\n\n    const previousMatches = previousTasks.filter(\n      previous => previous.content === task.content && !explicitTaskIds.has(previous.id),\n    );\n    if (previousMatches.length === 1) {\n      reusablePreviousIds.set(index, previousMatches[0]!.id);\n    }\n  });\n\n  const reservedIds = new Set([...explicitTaskIds, ...reusablePreviousIds.values()]);\n\n  return tasks.map((task, index) => {\n    const contentOccurrence = (contentOccurrences.get(task.content) ?? 0) + 1;\n    contentOccurrences.set(task.content, contentOccurrence);\n\n    const fallbackId = createDeterministicTaskId(task, contentOccurrence);\n    const reusablePreviousId = reusablePreviousIds.get(index);\n\n    // If the model repeats an explicit ID in the same write, keep the first one\n    // and mint/reuse a stable fallback for the duplicate instead of failing the whole list.\n    const requestedId = task.id && !usedIds.has(task.id) ? task.id : undefined;\n    const id =\n      requestedId ??\n      (reusablePreviousId && !usedIds.has(reusablePreviousId)\n        ? reusablePreviousId\n        : makeUniqueTaskId(fallbackId, usedIds, reservedIds));\n    usedIds.add(id);\n\n    return {\n      id,\n      content: task.content,\n      status: task.status,\n      activeForm: task.activeForm,\n    };\n  });\n}\n\nfunction getTasksFromState(state: unknown): TaskItemSnapshot[] {\n  const typedState = state as {\n    tasks?: TaskItemInput[];\n  };\n\n  // Older task snapshots may not include IDs. Recreate deterministic IDs as a compatibility fallback;\n  // current storage/schema integrations should persist IDs so explicit model-chosen IDs survive replay.\n  return assignTaskIds(typedState?.tasks || []);\n}\n\nfunction getCurrentTasks(harnessCtx: HarnessRequestContext<Record<string, unknown>> | undefined): TaskItemSnapshot[] {\n  const state = harnessCtx?.getState ? harnessCtx.getState() : harnessCtx?.state;\n  return getTasksFromState(state);\n}\n\nasync function readTasks(harnessCtx: HarnessRequestContext<Record<string, unknown>>): Promise<TaskItemSnapshot[]> {\n  if (harnessCtx.updateState) {\n    return harnessCtx.updateState(state => ({\n      result: getTasksFromState(state),\n    }));\n  }\n\n  return getCurrentTasks(harnessCtx);\n}\n\nfunction formatTaskListResult(tasks: TaskItemSnapshot[]): string {\n  const completed = tasks.filter(t => t.status === 'completed').length;\n  const inProgress = tasks.find(t => t.status === 'in_progress');\n  const total = tasks.length;\n\n  let summary = `Tasks updated: [${completed}/${total} completed]`;\n  if (inProgress) {\n    summary += `\\nCurrently: ${inProgress.activeForm} (${inProgress.id})`;\n  }\n  if (tasks.length > 0) {\n    summary += `\\nTask IDs:\\n${tasks.map(t => `- ${t.id}: ${t.content} (${t.status})`).join('\\n')}`;\n  }\n\n  return summary;\n}\n\nfunction summarizeTaskCheck(tasks: TaskItemSnapshot[]): {\n  summary: TaskCheckSummary;\n  inProgressTasks: TaskItemSnapshot[];\n  pendingTasks: TaskItemSnapshot[];\n  incompleteTasks: TaskItemSnapshot[];\n} {\n  const completedTasks = tasks.filter(task => task.status === 'completed');\n  const inProgressTasks = tasks.filter(task => task.status === 'in_progress');\n  const pendingTasks = tasks.filter(task => task.status === 'pending');\n  const incompleteTasks = [...inProgressTasks, ...pendingTasks];\n\n  return {\n    summary: {\n      total: tasks.length,\n      completed: completedTasks.length,\n      inProgress: inProgressTasks.length,\n      pending: pendingTasks.length,\n      incomplete: incompleteTasks.length,\n      hasTasks: tasks.length > 0,\n      allCompleted: tasks.length > 0 && incompleteTasks.length === 0,\n    },\n    inProgressTasks,\n    pendingTasks,\n    incompleteTasks,\n  };\n}\n\nfunction formatTaskCheckResult(taskCheck: ReturnType<typeof summarizeTaskCheck>): string {\n  const { summary, inProgressTasks, pendingTasks } = taskCheck;\n\n  if (!summary.hasTasks) {\n    return 'No tasks found. Consider using task_write to create a task list for complex work.';\n  }\n\n  let response = `Task Status: [${summary.completed}/${summary.total} completed]\\n`;\n  response += `- Completed: ${summary.completed}\\n`;\n  response += `- In Progress: ${summary.inProgress}\\n`;\n  response += `- Pending: ${summary.pending}\\n`;\n  response += `\\nAll tasks completed: ${summary.allCompleted ? 'YES' : 'NO'}`;\n\n  if (!summary.allCompleted) {\n    response += '\\n\\nIncomplete tasks:';\n    if (inProgressTasks.length > 0) {\n      response += '\\n\\nIn Progress:';\n      inProgressTasks.forEach(t => {\n        response += `\\n- ${t.id}: ${t.content}`;\n      });\n    }\n    if (pendingTasks.length > 0) {\n      response += '\\n\\nPending:';\n      pendingTasks.forEach(t => {\n        response += `\\n- ${t.id}: ${t.content}`;\n      });\n    }\n    response += '\\n\\nContinue working on these tasks before ending.';\n  }\n\n  return response;\n}\n\nfunction hasMultipleInProgress(tasks: TaskItemSnapshot[]): boolean {\n  return tasks.filter(task => task.status === 'in_progress').length > 1;\n}\n\nfunction multipleInProgressError(tasks: TaskItemSnapshot[]): TaskToolResult {\n  return {\n    content: 'Only one task can be in_progress at a time.',\n    tasks,\n    isError: true,\n  };\n}\n\nfunction demoteExtraInProgress(tasks: TaskItemSnapshot[], preferredIndex?: number): TaskItemSnapshot[] {\n  const inProgressIndices = tasks.reduce<number[]>((acc, t, i) => {\n    if (t.status === 'in_progress') acc.push(i);\n    return acc;\n  }, []);\n  if (inProgressIndices.length <= 1) return tasks;\n  const keepIndex =\n    preferredIndex !== undefined && inProgressIndices.includes(preferredIndex)\n      ? preferredIndex\n      : inProgressIndices[inProgressIndices.length - 1]!;\n  return tasks.map((t, i) =>\n    t.status === 'in_progress' && i !== keepIndex ? { ...t, status: 'pending' as const } : t,\n  );\n}\n\nasync function writeTasks(\n  harnessCtx: HarnessRequestContext<Record<string, unknown>> | undefined,\n  tasks: TaskItemSnapshot[],\n): Promise<void> {\n  if (!harnessCtx) return;\n\n  await harnessCtx.setState({ tasks });\n\n  harnessCtx.emitEvent?.({\n    type: 'task_updated',\n    tasks,\n  });\n}\n\nasync function mutateTasks(\n  harnessCtx: HarnessRequestContext<Record<string, unknown>>,\n  mutation: (currentTasks: TaskItemSnapshot[]) => TaskToolResult,\n): Promise<TaskToolResult> {\n  if (harnessCtx.updateState) {\n    return harnessCtx.updateState(state => {\n      const result = mutation(getTasksFromState(state));\n      return {\n        result,\n        updates: result.isError ? undefined : { tasks: result.tasks },\n        events: result.isError\n          ? undefined\n          : [\n              {\n                type: 'task_updated' as const,\n                tasks: result.tasks,\n              },\n            ],\n      };\n    });\n  }\n\n  // Compatibility path for third-party HarnessRequestContext objects created\n  // before updateState existed. Core Harness contexts always provide updateState.\n  const result = mutation(getCurrentTasks(harnessCtx));\n  if (!result.isError) {\n    await writeTasks(harnessCtx, result.tasks);\n  }\n  return result;\n}\n\nfunction formatAvailableTaskIds(tasks: TaskItemSnapshot[]): string {\n  if (tasks.length === 0) return 'No tasks are currently tracked.';\n  return `Available task IDs:\\n${tasks.map(t => `- ${t.id}: ${t.content} (${t.status})`).join('\\n')}`;\n}\n\n/**\n * Built-in harness tool: manage a structured task list for the coding session.\n * Full-replacement semantics: each call replaces the entire task list.\n * Prefer task_update or task_complete for changing existing tasks by ID.\n */\nexport const taskWriteTool = createTool({\n  id: 'task_write',\n  description: `Create and manage a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n\nUsage:\n- Use this to create the initial task list or replace the whole list after replanning\n- Pass the FULL task list each time this tool is called (replaces the previous list)\n- Each task has: id (stable identifier), content (imperative), status (pending, in_progress, or completed), activeForm (present continuous)\n- IDs must be unique. If duplicate explicit IDs are provided, the duplicate task is returned with a generated fallback ID\n- Keep task IDs stable across updates. If omitted, IDs are generated and returned in the tool result\n- When an ID is omitted while rewriting an existing list, one unambiguous matching task may reuse an existing ID\n- Prefer single-task update tools when they are available\n- Mark tasks in_progress BEFORE starting work (only ONE at a time)\n- Mark tasks completed IMMEDIATELY after finishing\n- Use this for multi-step tasks requiring 3+ distinct actions\n\nStates:\n- pending: Not yet started\n- in_progress: Currently working on (limit to ONE)\n- completed: Finished successfully`,\n  inputSchema: z.object({\n    tasks: z.array(taskItemInputSchema).describe('The complete updated task list'),\n  }),\n  outputSchema: taskToolResultSchema,\n  execute: async ({ tasks }, context) => {\n    try {\n      const harnessCtx = context?.requestContext?.get('harness') as\n        | HarnessRequestContext<Record<string, unknown>>\n        | undefined;\n      if (!harnessCtx) {\n        return {\n          content: 'Unable to update task list (no harness context)',\n          tasks: [],\n          isError: true,\n        };\n      }\n\n      return await mutateTasks(harnessCtx, currentTasks => {\n        const normalizedTasks = assignTaskIds(tasks, currentTasks);\n        if (hasMultipleInProgress(normalizedTasks)) {\n          return multipleInProgressError(currentTasks);\n        }\n\n        return {\n          content: formatTaskListResult(normalizedTasks),\n          tasks: normalizedTasks,\n          isError: false,\n        };\n      });\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : 'Unknown error';\n      return {\n        content: `Failed to update tasks: ${msg}`,\n        tasks: [],\n        isError: true,\n      };\n    }\n  },\n});\n\n/**\n * Built-in harness tool: update one tracked task by stable ID.\n */\nexport const taskUpdateTool = createTool({\n  id: 'task_update',\n  description: `Update one task in the current task list by stable ID. Use this for targeted changes to one existing task.\n\nUsage:\n- Provide the task ID returned by the task-list tools\n- Include only the fields that changed\n- Use status to move a task between pending, in_progress, and completed\n- Use task_complete when only marking a task completed\n- If the ID is unknown, the tool returns an error with available task IDs`,\n  inputSchema: z\n    .object({\n      id: taskIdSchema,\n      content: z.string().min(1).optional().describe('New task description in imperative form'),\n      status: z.enum(['pending', 'in_progress', 'completed']).optional().describe('New task status'),\n      activeForm: z.string().min(1).optional().describe('New present continuous form shown during execution'),\n    })\n    .refine(input => input.content !== undefined || input.status !== undefined || input.activeForm !== undefined, {\n      message: 'Provide at least one field to update.',\n    }),\n  outputSchema: taskToolResultSchema,\n  execute: async ({ id, content, status, activeForm }, context) => {\n    try {\n      const harnessCtx = context?.requestContext?.get('harness') as\n        | HarnessRequestContext<Record<string, unknown>>\n        | undefined;\n      if (!harnessCtx) {\n        return {\n          content: 'Unable to update task list (no harness context)',\n          tasks: [],\n          isError: true,\n        };\n      }\n\n      return await mutateTasks(harnessCtx, tasks => {\n        const taskIndex = tasks.findIndex(task => task.id === id);\n        if (taskIndex === -1) {\n          return {\n            content: `Task not found: ${id}\\n\\n${formatAvailableTaskIds(tasks)}`,\n            tasks,\n            isError: true,\n          };\n        }\n\n        const updatedTasks = demoteExtraInProgress(\n          tasks.map((task, index) =>\n            index === taskIndex\n              ? {\n                  ...task,\n                  ...(content !== undefined ? { content } : {}),\n                  ...(status !== undefined ? { status } : {}),\n                  ...(activeForm !== undefined ? { activeForm } : {}),\n                }\n              : task,\n          ),\n          taskIndex,\n        );\n\n        return {\n          content: formatTaskListResult(updatedTasks),\n          tasks: updatedTasks,\n          isError: false,\n        };\n      });\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : 'Unknown error';\n      return {\n        content: `Failed to update task: ${msg}`,\n        tasks: [],\n        isError: true,\n      };\n    }\n  },\n});\n\n/**\n * Built-in harness tool: mark one tracked task completed by stable ID.\n */\nexport const taskCompleteTool = createTool({\n  id: 'task_complete',\n  description: `Mark one task completed by stable ID. Use this when one tracked task is finished.\n\nUsage:\n- Provide the task ID returned by the task-list tools\n- If the ID is unknown, the tool returns an error with available task IDs`,\n  inputSchema: z.object({\n    id: taskIdSchema,\n  }),\n  outputSchema: taskToolResultSchema,\n  execute: async ({ id }, context) => {\n    try {\n      const harnessCtx = context?.requestContext?.get('harness') as\n        | HarnessRequestContext<Record<string, unknown>>\n        | undefined;\n      if (!harnessCtx) {\n        return {\n          content: 'Unable to update task list (no harness context)',\n          tasks: [],\n          isError: true,\n        };\n      }\n\n      return await mutateTasks(harnessCtx, tasks => {\n        const taskIndex = tasks.findIndex(task => task.id === id);\n        if (taskIndex === -1) {\n          return {\n            content: `Task not found: ${id}\\n\\n${formatAvailableTaskIds(tasks)}`,\n            tasks,\n            isError: true,\n          };\n        }\n\n        const updatedTasks = tasks.map((task, index) =>\n          index === taskIndex\n            ? {\n                ...task,\n                status: 'completed' as const,\n              }\n            : task,\n        );\n\n        return {\n          content: formatTaskListResult(updatedTasks),\n          tasks: updatedTasks,\n          isError: false,\n        };\n      });\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : 'Unknown error';\n      return {\n        content: `Failed to complete task: ${msg}`,\n        tasks: [],\n        isError: true,\n      };\n    }\n  },\n});\n\n/**\n * Built-in harness tool: check the completion status of the current task list.\n * Helps the agent determine if all tasks are completed before ending work.\n */\nexport const taskCheckTool = createTool({\n  id: 'task_check',\n  description: `Check the completion status of your current task list. Use this before finishing tracked work to ensure all tasks are completed.\n\nReturns:\n- Human-readable content summary with task counts and incomplete task IDs\n- Structured task list snapshot with stable IDs\n- summary object with total, completed, inProgress, pending, incomplete, hasTasks, and allCompleted\n- incompleteTasks array for tasks that still need work\n\nsummary.allCompleted is true only when at least one tracked task exists and every tracked task is completed. If no tasks exist, summary.hasTasks is false and summary.allCompleted is false.`,\n  inputSchema: z.object({}), // No input needed\n  outputSchema: taskCheckResultSchema,\n  execute: async ({}, context) => {\n    try {\n      const harnessCtx = context?.requestContext?.get('harness') as\n        | HarnessRequestContext<Record<string, unknown>>\n        | undefined;\n\n      if (!harnessCtx) {\n        const emptyCheck = summarizeTaskCheck([]);\n        return {\n          content: 'Unable to access task list (no harness context)',\n          tasks: [],\n          summary: emptyCheck.summary,\n          incompleteTasks: emptyCheck.incompleteTasks,\n          isError: true,\n        };\n      }\n\n      // Queue behind pending task mutations when the Harness transaction helper is available.\n      const tasks = await readTasks(harnessCtx);\n      const taskCheck = summarizeTaskCheck(tasks);\n\n      return {\n        content: formatTaskCheckResult(taskCheck),\n        tasks,\n        summary: taskCheck.summary,\n        incompleteTasks: taskCheck.incompleteTasks,\n        isError: false,\n      };\n    } catch (error) {\n      const msg = error instanceof Error ? error.message : 'Unknown error';\n      const emptyCheck = summarizeTaskCheck([]);\n      return {\n        content: `Failed to check tasks: ${msg}`,\n        tasks: [],\n        summary: emptyCheck.summary,\n        incompleteTasks: emptyCheck.incompleteTasks,\n        isError: true,\n      };\n    }\n  },\n});\n\n// =============================================================================\n// Subagent Tool\n// =============================================================================\n\nexport interface CreateSubagentToolOptions {\n  subagents: HarnessSubagent[];\n  resolveModel: (modelId: string) => MastraLanguageModel;\n  /** Resolved harness tools (already evaluated from DynamicArgument) */\n  harnessTools?: ToolsInput;\n  /** Fallback model ID when subagent definition has no defaultModelId */\n  fallbackModelId?: string;\n  /** Returns the parent model ID for display when a subagent call is forked. */\n  getParentModelId?: () => string;\n  /**\n   * Returns the parent Agent that owns the current run. Invoked when a\n   * subagent call is forked so the fork can reuse the parent's\n   * instructions, tools, and model to preserve prompt-cache prefix.\n   */\n  getParentAgent?: () => Agent | undefined;\n  /**\n   * Clones the parent thread so a forked subagent can run on a copy\n   * without polluting the parent conversation. Typically delegates to\n   * `Harness.cloneThread`. Returns the new thread metadata.\n   */\n  cloneThreadForFork?: (opts: {\n    sourceThreadId: string;\n    resourceId?: string;\n    title?: string;\n  }) => Promise<{ id: string; resourceId: string }>;\n  /**\n   * Resolves the toolsets the parent agent runs with for the current request.\n   * When set, forked subagents inherit the parent's toolsets so harness-injected\n   * tools like `ask_user` / `submit_plan` / user-configured harness tools remain\n   * available inside the fork. The `subagent` entry is preserved for prompt-cache\n   * stability, but its runtime execute function is patched to block recursion.\n   */\n  getParentToolsets?: (requestContext?: RequestContext) => Promise<ToolsetsInput | undefined>;\n}\n\n/**\n * Creates a `subagent` tool from registered subagent definitions.\n * The tool spawns a fresh Agent per invocation with constrained tools,\n * streams the response, and forwards events to the harness.\n */\nexport function createSubagentTool(opts: CreateSubagentToolOptions) {\n  const { subagents, resolveModel, harnessTools, fallbackModelId } = opts;\n\n  const subagentIds = subagents.map(s => s.id);\n\n  const typeDescriptions = subagents.map(s => `- **${s.id}** (${s.name}): ${s.description}`).join('\\n');\n\n  return createTool({\n    id: 'subagent',\n    description: `Delegate a focused task to a specialized subagent. The subagent runs independently with a constrained toolset, then returns its findings as text.\n\nAvailable agent types:\n${typeDescriptions}\n\nBy default the subagent runs in its own context — it does NOT see the parent conversation history. Write a clear, self-contained task description.\n\nSet \\`forked: true\\` for context-dependent parallel work that needs the parent conversation, prior tool results, or the parent tool environment. Omit it for self-contained delegation. A forked subagent reuses the parent agent's instructions and tools so the prompt prefix stays cache-friendly.\n\nUse this tool when:\n- You want to run multiple investigations in parallel\n- The task is self-contained and can be delegated`,\n    inputSchema: z.object({\n      agentType: z.enum(subagentIds as [string, ...string[]]).describe('Type of subagent to spawn'),\n      task: z\n        .string()\n        .describe(\n          'Clear, self-contained description of what the subagent should do. For non-forked subagents include all relevant context — the subagent cannot see the parent conversation.',\n        ),\n      modelId: z\n        .string()\n        .optional()\n        .describe(\n          \"Optional model ID override for this task. Ignored when `forked: true` (the parent agent's model is used).\",\n        ),\n      forked: z\n        .boolean()\n        .optional()\n        .describe(\n          \"If true, fork the parent conversation: clone the parent thread and run with the parent agent's instructions/tools so prompt cache is preserved. Requires memory to be configured on the Harness. Defaults to the subagent definition's `forked` setting.\",\n        ),\n    }),\n    execute: async (input, context) => {\n      const { agentType, modelId, forked } = input;\n      let { task } = input;\n      const displayTask = task;\n      const definition = subagents.find(s => s.id === agentType);\n      if (!definition) {\n        return {\n          content: `Unknown agent type: ${agentType}. Valid types: ${subagentIds.join(', ')}`,\n          isError: true,\n        };\n      }\n\n      const harnessCtx = context?.requestContext?.get('harness') as HarnessRequestContext | undefined;\n      const emitEvent = harnessCtx?.emitEvent;\n      const abortSignal = harnessCtx?.abortSignal;\n      const toolCallId = context?.agent?.toolCallId ?? 'unknown';\n      const workspace = context?.workspace;\n\n      const runAsForked = forked ?? definition.forked ?? false;\n\n      // Per-invocation state produced by either the forked or non-forked setup path.\n      let subagentToRun: Agent;\n      let resolvedModelId: string;\n      let subagentRequestContext: RequestContext | undefined;\n      let streamMemory: { thread: string; resource?: string } | undefined;\n      let streamMaxSteps: number | undefined;\n      let streamStopWhen: HarnessSubagent['stopWhen'];\n      let streamPrepareStep: ((args: { tools?: Record<string, unknown> }) => { activeTools: string[] }) | undefined;\n      let forkedToolsets: ToolsetsInput | undefined;\n\n      if (runAsForked) {\n        // Forked path: reuse the parent agent + a clone of the parent thread so the\n        // request prefix (system prompt + tool schemas + history) stays identical and\n        // the prompt cache hits. The subagent definition's instructions/tools/model\n        // are intentionally ignored in this path.\n        const parentAgent = opts.getParentAgent?.();\n        if (!parentAgent) {\n          return {\n            content: 'Forked subagent requires a parent agent. None is configured on this Harness.',\n            isError: true,\n          };\n        }\n        const parentThreadId = harnessCtx?.threadId;\n        if (!parentThreadId) {\n          return {\n            content: 'Forked subagent requires an active parent thread; none is set on the Harness.',\n            isError: true,\n          };\n        }\n        if (!opts.cloneThreadForFork) {\n          return {\n            content:\n              'Forked subagent requires memory to be configured on the Harness so the parent thread can be cloned.',\n            isError: true,\n          };\n        }\n\n        // The parent stream batches message saves through a debounced save\n        // queue (see SaveQueueManager). If we clone straight away, the parent's\n        // user message (and the assistant turn that produced this tool call)\n        // are still in-memory, not in the store — and the clone ends up empty.\n        // Drain the queue first so the fork actually carries the prior\n        // conversation.\n        await context?.agent?.flushMessages?.().catch(() => {\n          // Non-fatal: a failed flush just means the fork may be missing the\n          // very latest turn. Still proceed with the clone.\n        });\n\n        let forkedThread: { id: string; resourceId: string };\n        try {\n          forkedThread = await opts.cloneThreadForFork({\n            sourceThreadId: parentThreadId,\n            resourceId: harnessCtx?.resourceId,\n            title: `Fork: ${definition.name} subagent`,\n          });\n        } catch (err) {\n          return {\n            content: `Failed to clone parent thread for forked subagent: ${err instanceof Error ? err.message : String(err)}`,\n            isError: true,\n          };\n        }\n\n        subagentToRun = parentAgent;\n        // Display value only; forked runs use the parent agent's configured model.\n        resolvedModelId = opts.getParentModelId?.() || 'parent-agent';\n        task = `${task}\\n\\n${FORKED_SUBAGENT_NESTING_NOTICE}\\n\\n${FORKED_SUBAGENT_TASK_NOTICE}`;\n        streamMemory = { thread: forkedThread.id, resource: forkedThread.resourceId };\n        // Allow a recovery step if the forked model accidentally calls the\n        // inherited-but-disabled `subagent` tool. Without this, the single-step\n        // default can return only the stub tool result instead of the answer.\n        streamMaxSteps = 1000;\n        streamStopWhen = undefined;\n        streamPrepareStep = undefined;\n\n        if (context?.requestContext) {\n          subagentRequestContext = new RequestContext(context.requestContext.entries());\n          if (harnessCtx) {\n            // Point at the fork so inherited tools (recall, browser, OM, memory writes, etc.)\n            // operate on the cloned thread instead of the active parent thread.\n            subagentRequestContext.set('harness', {\n              ...harnessCtx,\n              threadId: forkedThread.id,\n              resourceId: forkedThread.resourceId,\n            });\n          }\n        }\n\n        // Inherit the parent's toolsets with the fork request context so tools that\n        // close over request-scoped state use the cloned thread/resource. Preserve\n        // `subagent` in the tool schema to keep the prompt-cache prefix stable, but\n        // patch its runtime execute function so nested forks fail gracefully.\n        const inheritedToolsets = await opts.getParentToolsets?.(subagentRequestContext);\n        if (inheritedToolsets) {\n          forkedToolsets = {};\n          for (const [setName, setTools] of Object.entries(inheritedToolsets)) {\n            const patched: ToolsInput = {};\n            for (const [toolId, tool] of Object.entries(setTools as ToolsInput)) {\n              if (toolId === 'subagent') {\n                patched[toolId] = patchSubagentToolForFork(tool);\n              } else if (isForkedTaskToolId(toolId)) {\n                patched[toolId] = patchTaskToolForFork(tool, toolId);\n              } else {\n                patched[toolId] = tool;\n              }\n            }\n            forkedToolsets[setName] = patched;\n          }\n        }\n      } else {\n        // Non-forked path: fresh Agent with the subagent's own instructions/tools/model.\n        // Merge tools: subagent's own tools + filtered harness tools\n        const mergedTools: ToolsInput = { ...definition.tools };\n        if (definition.allowedHarnessTools && harnessTools) {\n          for (const toolId of definition.allowedHarnessTools) {\n            if (harnessTools[toolId] && !mergedTools[toolId]) {\n              mergedTools[toolId] = harnessTools[toolId];\n            }\n          }\n        }\n\n        // Resolve model: explicit arg → harness setting → subagent default → fallback\n        const harnessModelId = harnessCtx?.getSubagentModelId?.({ agentType }) ?? undefined;\n        const maybeModelId = modelId ?? harnessModelId ?? definition.defaultModelId ?? fallbackModelId;\n        if (!maybeModelId) {\n          return { content: 'No model ID available for subagent. Configure defaultModelId.', isError: true };\n        }\n        resolvedModelId = maybeModelId;\n\n        let model: MastraLanguageModel;\n        try {\n          model = resolveModel(resolvedModelId);\n        } catch (err) {\n          return {\n            content: `Failed to resolve model \"${resolvedModelId}\": ${err instanceof Error ? err.message : String(err)}`,\n            isError: true,\n          };\n        }\n\n        subagentToRun = new Agent({\n          id: `subagent-${definition.id}`,\n          name: `${definition.name} Subagent`,\n          instructions: definition.instructions,\n          model,\n          tools: mergedTools,\n          workspace,\n        });\n\n        // Only resolve workspace tool names when an allowlist is configured,\n        // avoiding unnecessary createWorkspaceTools overhead for subagents\n        // that don't restrict workspace tools.\n        const allowedWs = definition.allowedWorkspaceTools ? new Set(definition.allowedWorkspaceTools) : undefined;\n        const allWorkspaceToolNames =\n          workspace && allowedWs\n            ? new Set(\n                Object.keys(\n                  await createWorkspaceTools(workspace, {\n                    requestContext: context?.requestContext ?? {},\n                    workspace,\n                  }),\n                ),\n              )\n            : undefined;\n\n        streamMaxSteps = definition.maxSteps ?? (definition.stopWhen ? undefined : 50);\n        streamStopWhen = definition.stopWhen;\n        streamPrepareStep =\n          allowedWs && allWorkspaceToolNames\n            ? ({ tools }) => ({\n                activeTools: Object.keys(tools ?? {}).filter(k => !allWorkspaceToolNames.has(k) || allowedWs!.has(k)),\n              })\n            : undefined;\n\n        // Build a request context for the subagent that inherits sandbox paths\n        // and harness state but strips threadId/resourceId so the subagent\n        // doesn't trigger OM enrichment on the parent's memory thread.\n        if (context?.requestContext) {\n          subagentRequestContext = new RequestContext(context.requestContext.entries());\n          if (harnessCtx) {\n            subagentRequestContext.set('harness', { ...harnessCtx, threadId: null, resourceId: '' });\n          }\n        }\n      }\n\n      const startTime = Date.now();\n\n      emitEvent?.({\n        type: 'subagent_start',\n        toolCallId,\n        agentType,\n        task: displayTask,\n        modelId: resolvedModelId,\n        forked: runAsForked,\n      });\n\n      let partialText = '';\n\n      try {\n        const response = await subagentToRun.stream(task, {\n          maxSteps: streamMaxSteps,\n          stopWhen: streamStopWhen,\n          abortSignal,\n          requireToolApproval: false,\n          requestContext: subagentRequestContext,\n          ...(streamMemory && { memory: streamMemory }),\n          ...(forkedToolsets && { toolsets: forkedToolsets }),\n          ...(context?.tracingContext && { tracingContext: context.tracingContext }),\n          prepareStep: streamPrepareStep,\n        });\n\n        for await (const chunk of response.fullStream) {\n          switch (chunk.type) {\n            case 'text-delta':\n              partialText += chunk.payload.text;\n              emitEvent?.({\n                type: 'subagent_text_delta',\n                toolCallId,\n                agentType,\n                textDelta: chunk.payload.text,\n              });\n              break;\n\n            case 'tool-call':\n              if (!(runAsForked && chunk.payload.toolName === 'subagent')) {\n                emitEvent?.({\n                  type: 'subagent_tool_start',\n                  toolCallId,\n                  agentType,\n                  subToolName: chunk.payload.toolName,\n                  subToolArgs: chunk.payload.args,\n                });\n              }\n              break;\n\n            case 'tool-result': {\n              const isErr = chunk.payload.isError ?? false;\n              if (!(runAsForked && chunk.payload.toolName === 'subagent')) {\n                emitEvent?.({\n                  type: 'subagent_tool_end',\n                  toolCallId,\n                  agentType,\n                  subToolName: chunk.payload.toolName,\n                  subToolResult: chunk.payload.result,\n                  isError: isErr,\n                });\n              }\n              break;\n            }\n          }\n        }\n\n        if (abortSignal?.aborted) {\n          const durationMs = Date.now() - startTime;\n          const abortResult = partialText\n            ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n            : '[Aborted by user]';\n\n          emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n          // Intentionally do NOT append `<subagent-meta />` to model-facing\n          // content: when the parent model can see the tag in a tool result\n          // it sometimes echoes the literal markup back into its own assistant\n          // text on the next turn. Live UIs get model/duration/tool data from\n          // the structured `subagent_*` events emitted above; history UIs read\n          // the persisted `tool_call.args.modelId`. Older persisted threads\n          // that still carry the tag are handled by `parseSubagentMeta` for\n          // backward compatibility.\n          return { content: abortResult, isError: false };\n        }\n\n        const fullOutput = await response.getFullOutput();\n        const resultText = fullOutput.text || partialText;\n\n        const durationMs = Date.now() - startTime;\n        emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: resultText, isError: false, durationMs });\n\n        return { content: resultText, isError: false };\n      } catch (err) {\n        const isAbort =\n          err instanceof Error &&\n          (err.name === 'AbortError' || err.message?.includes('abort') || err.message?.includes('cancel'));\n        const durationMs = Date.now() - startTime;\n\n        if (isAbort) {\n          const abortResult = partialText\n            ? `[Aborted by user]\\n\\nPartial output:\\n${partialText}`\n            : '[Aborted by user]';\n\n          emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: abortResult, isError: false, durationMs });\n\n          return { content: abortResult, isError: false };\n        }\n\n        const message = err instanceof Error ? err.message : String(err);\n        emitEvent?.({ type: 'subagent_end', toolCallId, agentType, result: message, isError: true, durationMs });\n\n        return { content: `Subagent \"${definition.name}\" failed: ${message}`, isError: true };\n      }\n    },\n  });\n}\n\n/**\n * Returns a copy of the parent's `subagent` tool with `execute` replaced by a\n * stub that refuses to dispatch a nested fork.\n *\n * Why patch instead of remove or replace wholesale:\n *  - Forked subagents reuse the parent Agent's `stream()` so the LLM request\n *    prefix (system prompt + tool list + tool schemas + tool descriptions)\n *    matches the parent byte-for-byte. This is what makes prompt-cache hits\n *    possible inside a fork, which is the whole reason forked mode exists.\n *  - Removing the `subagent` entry from the inherited toolset, or replacing\n *    its description / parameters with anything else, perturbs that prefix\n *    and invalidates the cache.\n *  - Replacing only `execute` is invisible to the LLM (execute lives in the\n *    runtime, not in the request payload) but lets us reject recursive\n *    invocations cleanly at runtime.\n *\n * The stub returns a tool-level error result with a clear human-readable\n * recovery instruction. This does not fail the outer subagent run; the model\n * receives the tool error and can continue with a direct answer.\n */\nfunction patchSubagentToolForFork(tool: unknown): any {\n  const stubExecute = async () => ({\n    content: FORKED_SUBAGENT_NESTING_NOTICE,\n    isError: true,\n  });\n  // Spread preserves id / description / inputSchema / parameters / outputSchema\n  // / providerOptions / strict / requireApproval / etc. on whatever shape the\n  // tool came in as (Mastra `Tool` instance, AI SDK v4/v5 `tool({ ... })`\n  // object, provider-defined tool). `Object.assign` on a fresh object keeps\n  // own enumerable props; that is enough for the toolset-merge layer to\n  // serialize the same schema/description into the model request.\n  return Object.assign({}, tool as Record<string, unknown>, { execute: stubExecute });\n}\n\nfunction isForkedTaskToolId(toolId: string): boolean {\n  return toolId === 'task_write' || toolId === 'task_update' || toolId === 'task_complete' || toolId === 'task_check';\n}\n\nfunction patchTaskToolForFork(tool: unknown, toolId: string): any {\n  const stubExecute = async () => {\n    const baseResult = {\n      content: FORKED_SUBAGENT_TASK_NOTICE,\n      tasks: [],\n      isError: true,\n    };\n\n    if (toolId === 'task_check') {\n      const taskCheck = summarizeTaskCheck([]);\n      return {\n        ...baseResult,\n        summary: taskCheck.summary,\n        incompleteTasks: taskCheck.incompleteTasks,\n      };\n    }\n\n    return baseResult;\n  };\n\n  return Object.assign({}, tool as Record<string, unknown>, { execute: stubExecute });\n}\n\n/**\n * Parse subagent metadata from a tool result string.\n *\n * Older persisted threads may have an internal `<subagent-meta />` tag\n * appended to the subagent tool result content (carrying modelId / durationMs\n * / sub-tool-call summary, used by history-render UIs to reconstruct the\n * subagent activity box when live events aren't available).\n *\n * New runs no longer append the tag — the metadata leaked into model context\n * and could be echoed back as visible assistant text — but this parser is\n * retained so existing threads continue to render cleanly. It also strips the\n * tag so callers never display it to users.\n *\n * Returns the cleaned text plus any parsed metadata.\n */\nexport function parseSubagentMeta(content: string): {\n  text: string;\n  modelId?: string;\n  durationMs?: number;\n  toolCalls?: Array<{ name: string; isError: boolean }>;\n} {\n  const match = content.match(/\\n<subagent-meta modelId=\"([^\"]*)\" durationMs=\"(\\d+)\" tools=\"([^\"]*)\" \\/>$/);\n  if (!match) return { text: content };\n\n  const text = content.slice(0, match.index!);\n  const modelId = match[1];\n  const durationMs = parseInt(match[2]!, 10);\n  const toolCalls = match[3]\n    ? match[3]\n        .split(',')\n        .filter(Boolean)\n        .map(entry => {\n          const [name, status] = entry.split(':');\n          return { name: name!, isError: status === 'err' };\n        })\n    : [];\n\n  return { text, modelId, durationMs, toolCalls };\n}\n","import type { Agent } from '../agent';\nimport type { AgentInstructions, ToolsInput } from '../agent/types';\nimport type { MastraBrowser } from '../browser/browser';\nimport type { PubSub } from '../events/pubsub';\nimport type { MastraLanguageModel } from '../llm/model/shared.types';\nimport type { LoopOptions } from '../loop/types';\nimport type { MastraMemory } from '../memory/memory';\nimport type { ObservabilityEntrypoint } from '../observability/types/core';\nimport type { PublicSchema } from '../schema';\nimport type { MastraCompositeStore } from '../storage/base';\nimport type { DynamicArgument } from '../types';\nimport type { Workspace, WorkspaceConfig, WorkspaceStatus } from '../workspace';\nimport type { TaskItemSnapshot } from './tools';\n\n// =============================================================================\n// Heartbeat Handlers\n// =============================================================================\n\n/**\n * A periodic task that the Harness runs on a timer.\n * Heartbeat handlers start during `init()` and are cleaned up on `stopHeartbeats()`.\n */\nexport interface HeartbeatHandler {\n  /** Unique identifier for this handler (used for dedup and logging) */\n  id: string;\n  /** Interval in milliseconds between invocations */\n  intervalMs: number;\n  /** The function to run on each tick */\n  handler: () => void | Promise<void>;\n  /** Whether to run the handler immediately on start (default: true) */\n  immediate?: boolean;\n  /** Called when the handler is removed or all heartbeats are stopped */\n  shutdown?: () => void | Promise<void>;\n}\n\n// =============================================================================\n// Harness Configuration\n// ===================\n\n/**\n * Configuration for a single agent mode within the harness.\n * Each mode represents a different \"personality\" or capability set.\n */\nexport interface HarnessMode<TState> {\n  /** Unique identifier for this mode (e.g., \"plan\", \"build\", \"review\") */\n  id: string;\n\n  /** Human-readable name for display */\n  name?: string;\n\n  /** Whether this is the default mode when harness starts */\n  default?: boolean;\n\n  /**\n   * Default model ID for this mode (e.g., \"anthropic/claude-sonnet-4-20250514\").\n   * Used when no per-mode model has been explicitly selected.\n   */\n  defaultModelId?: string;\n\n  /** Hex color for the mode indicator (e.g., \"#7c3aed\") */\n  color?: string;\n\n  /**\n   * The agent for this mode.\n   * Can be a static Agent or a function that receives harness state.\n   */\n  agent: Agent | ((state: TState) => Agent);\n}\n\n// =============================================================================\n// Subagents\n// =============================================================================\n\n/**\n * Definition of a subagent that the Harness can spawn via the built-in `subagent` tool.\n * Each subagent runs as a fresh Agent with constrained tools and its own instructions.\n */\nexport interface HarnessSubagent {\n  /** Unique identifier for this subagent type (e.g., \"explore\", \"plan\", \"execute\") */\n  id: string;\n\n  /** Human-readable name shown in tool output (e.g., \"Explore\") */\n  name: string;\n\n  /** Description of what this subagent does (used in auto-generated tool description) */\n  description: string;\n\n  /**\n   * Instructions that guide the agent's behavior. Can be a string, array of strings, system message object,\n   * array of system messages, or a function that returns any of these types dynamically.\n   */\n  instructions: DynamicArgument<AgentInstructions>;\n\n  /** Tools this subagent has direct access to */\n  tools?: ToolsInput;\n\n  /**\n   * Tool IDs to pull from the harness's shared `tools` config.\n   * Merged with `tools` above — allows subagents to use a subset of harness tools.\n   */\n  allowedHarnessTools?: string[];\n\n  /** Default model ID for this subagent type (e.g., \"anthropic/claude-sonnet-4-20250514\") */\n  defaultModelId?: string;\n\n  /** Optional maximum number of steps for this subagent's execution loop */\n  maxSteps?: number;\n\n  /** Optional stop condition for this subagent's execution loop */\n  stopWhen?: LoopOptions['stopWhen'];\n\n  /**\n   * Workspace tool keys (after any renames) the model is allowed to call.\n   * When set, workspace tools not in this list are hidden via `prepareStep`.\n   * Non-workspace tools are never affected. When omitted, all workspace\n   * tools are visible.\n   */\n  allowedWorkspaceTools?: string[];\n\n  /**\n   * Default \"forked\" mode for this subagent type. When `true`, invocations\n   * inherit the parent agent's conversation context: the parent thread is\n   * cloned and the subagent runs on the fork with the parent agent's\n   * instructions and tools, preserving prompt-cache prefix.\n   *\n   * The parent's `instructions`, `tools`, `allowedHarnessTools`,\n   * `allowedWorkspaceTools`, and `defaultModelId` fields on the definition\n   * are ignored when a run is forked — the parent agent is used as-is.\n   *\n   * Callers can override per-invocation by passing `forked` in the tool\n   * input. Forked subagents require memory to be configured on the Harness.\n   *\n   * @default false\n   */\n  forked?: boolean;\n}\n\n/**\n * State data type for the Harness generic parameter.\n */\nexport type HarnessStateSchema<T> = T;\n\n/**\n * Configuration for creating a Harness instance.\n */\n/**\n * Identifiers for the built-in harness tools that can be selectively disabled.\n */\nexport type BuiltinToolId =\n  | 'ask_user'\n  | 'submit_plan'\n  | 'task_write'\n  | 'task_update'\n  | 'task_complete'\n  | 'task_check'\n  | 'subagent';\n\nexport interface HarnessConfig<TState = {}> {\n  /** Unique identifier for this harness instance */\n  id: string;\n\n  /**\n   * Resource ID for grouping threads (e.g., project identifier).\n   * Threads are scoped to this resource ID.\n   */\n  resourceId?: string;\n\n  /** Storage backend for persistence (threads, messages, state) */\n  storage?: MastraCompositeStore;\n\n  /** Schema defining the shape of harness state (Zod, JSON Schema, Standard Schema, etc.) */\n  stateSchema?: PublicSchema<TState, any>;\n\n  /** Initial state values (must conform to schema) */\n  initialState?: Partial<TState>;\n\n  /** Memory configuration (shared across all modes) */\n  memory?: DynamicArgument<MastraMemory>;\n\n  /** Available agent modes */\n  modes: HarnessMode<TState>[];\n\n  /**\n   * Tools available to all agents across all modes.\n   * Can be a static tools object or a dynamic function that receives\n   * the request context and returns tools per-request.\n   */\n  tools?: DynamicArgument<ToolsInput | undefined>;\n\n  /**\n   * Workspace configuration.\n   * Accepts a pre-constructed Workspace instance, a WorkspaceConfig for\n   * Harness to construct internally, or a dynamic factory function that\n   * receives the request context and returns a Workspace per-request.\n   */\n  workspace?: DynamicArgument<Workspace | undefined> | WorkspaceConfig;\n\n  /**\n   * Browser automation configuration.\n   * Accepts a pre-constructed MastraBrowser instance or a dynamic factory\n   * function that receives the request context and returns a browser per-request.\n   * Propagated to mode agents that don't have their own browser configured.\n   */\n  browser?: DynamicArgument<MastraBrowser | undefined>;\n\n  /**\n   * Periodic heartbeat handlers started during `init()`.\n   * Use for background tasks like gateway sync, cache refresh, etc.\n   */\n  heartbeatHandlers?: HeartbeatHandler[];\n\n  /**\n   * Custom ID generator for Harness-managed IDs such as threads and mode-run identifiers.\n   * Defaults to a timestamp + random string generator.\n   */\n  idGenerator?: () => string;\n\n  /**\n   * Custom auth checker for model providers.\n   * Lets the app layer provide additional auth sources (e.g., OAuth tokens)\n   * beyond the default env var check from the provider registry.\n   */\n  modelAuthChecker?: ModelAuthChecker;\n\n  /**\n   * Provides per-model use counts for `listAvailableModels()` sorting/display.\n   * Lets the app layer track and report how often each model has been used.\n   */\n  modelUseCountProvider?: ModelUseCountProvider;\n\n  /**\n   * Callback invoked when a model is selected via switchModel().\n   * Lets the app layer track and persist model usage for ranking.\n   */\n  modelUseCountTracker?: ModelUseCountTracker;\n\n  /**\n   * Optional catalog hook for additional models (e.g., user-defined custom providers).\n   * Returned entries are merged into `listAvailableModels()`.\n   */\n  customModelCatalogProvider?: CustomModelCatalogProvider;\n\n  /**\n   * Subagent definitions. The Harness auto-creates a `subagent` built-in tool\n   * that parent agents can call to spawn focused subagents.\n   */\n  subagents?: HarnessSubagent[];\n\n  /**\n   * Converts a model ID string (e.g., \"anthropic/claude-sonnet-4-20250514\") to a\n   * language model instance. Used by subagents and OM model resolution.\n   */\n  resolveModel?: (modelId: string) => MastraLanguageModel;\n\n  /**\n   * Observational Memory configuration defaults.\n   * The Harness auto-manages OM state (model IDs, thresholds) internally\n   * and provides accessors that Memory's dynamic model functions can close over.\n   */\n  omConfig?: HarnessOMConfig;\n\n  /**\n   * Built-in tool IDs to disable.\n   * Any tool listed here will be excluded from the `harnessBuiltIn` toolset.\n   * Valid values: 'ask_user', 'submit_plan', 'task_write', 'task_update',\n   * 'task_complete', 'task_check', 'subagent'.\n   */\n  disableBuiltinTools?: BuiltinToolId[];\n\n  /**\n   * Maps tool names to permission categories.\n   * Used by the permission system to resolve category-level policies.\n   * If not provided, all tools default to the \"other\" category.\n   */\n  toolCategoryResolver?: (toolName: string) => ToolCategory | null;\n\n  /**\n   * PubSub instance used by the internal Mastra instance and mode agents.\n   */\n  pubsub?: PubSub;\n\n  /**\n   * Optional thread locking callbacks.\n   * Called during selectOrCreateThread, createThread, and switchThread\n   * to prevent concurrent access to the same thread from multiple processes.\n   * `acquire` should throw if the lock is held by another process.\n   */\n  threadLock?: {\n    acquire: (threadId: string) => void | Promise<void>;\n    release: (threadId: string) => void | Promise<void>;\n  };\n\n  /**\n   * Observability entrypoint for tracing, scoring, and feedback.\n   * When provided, the internal Mastra instance is configured with this\n   * observability backend so that agent runs produce trace spans.\n   */\n  observability?: ObservabilityEntrypoint;\n}\n\n/**\n * Default configuration for Observational Memory.\n * These values are used when harness state doesn't have explicit OM values\n * (e.g., fresh thread with no persisted OM settings).\n */\nexport interface HarnessOMConfig {\n  /** Default model ID for the observer agent */\n  defaultObserverModelId?: string;\n  /** Default model ID for the reflector agent */\n  defaultReflectorModelId?: string;\n  /** Default observation threshold in tokens */\n  defaultObservationThreshold?: number;\n  /** Default reflection threshold in tokens */\n  defaultReflectionThreshold?: number;\n}\n\n// =============================================================================\n// Permissions\n// =============================================================================\n\n/**\n * Tool category for permission grouping.\n * Consumers define how tool names map to categories via `toolCategoryResolver`.\n */\nexport type ToolCategory = 'read' | 'edit' | 'execute' | 'mcp' | 'other';\n\n/**\n * Permission policy for a tool or category.\n */\nexport type PermissionPolicy = 'allow' | 'ask' | 'deny';\n\n/**\n * Permission rules for controlling tool approval behavior.\n * Per-tool overrides take precedence over category policies.\n */\nexport interface PermissionRules {\n  categories: Partial<Record<ToolCategory, PermissionPolicy>>;\n  tools: Partial<Record<string, PermissionPolicy>>;\n}\n\n// =============================================================================\n// Model Discovery\n// =============================================================================\n\n/**\n * Auth status for a model's provider.\n */\nexport interface ModelAuthStatus {\n  hasAuth: boolean;\n  apiKeyEnvVar?: string;\n}\n\n/**\n * Info about an available model from the provider registry.\n */\nexport interface AvailableModel {\n  /** Full model ID (e.g., \"anthropic/claude-sonnet-4-20250514\") */\n  id: string;\n  /** Provider prefix (e.g., \"anthropic\") */\n  provider: string;\n  /** Model name without provider prefix */\n  modelName: string;\n  /** Whether the provider has valid authentication */\n  hasApiKey: boolean;\n  /** Environment variable for the provider's API key */\n  apiKeyEnvVar?: string;\n  /** Number of times this model has been used (from external tracking) */\n  useCount: number;\n}\n\n/**\n * Additional model entries supplied by the app layer.\n */\nexport type CustomAvailableModel = Omit<AvailableModel, 'useCount'>;\n\n/**\n * Provides additional model catalog entries for `listAvailableModels()`.\n */\nexport type CustomModelCatalogProvider = () => CustomAvailableModel[] | Promise<CustomAvailableModel[]>;\n\n/**\n * Custom auth checker for model providers.\n * Called by `getCurrentModelAuthStatus()` and `listAvailableModels()` to determine\n * whether a provider has valid authentication beyond just env var checks\n * (e.g., OAuth tokens, stored credentials).\n *\n * Return `true` if the provider is authenticated, `false` if not,\n * or `undefined` to fall back to the default env var check.\n */\nexport type ModelAuthChecker = (provider: string) => boolean | undefined;\n\n/**\n * Provides per-model use counts for sorting in `listAvailableModels()`.\n * Return a map of model ID → use count.\n */\nexport type ModelUseCountProvider = () => Record<string, number>;\n\n/**\n * Callback invoked when a model is selected via switchModel().\n * Lets the app layer track and persist model usage for ranking.\n */\nexport type ModelUseCountTracker = (modelId: string) => void;\n\n// =============================================================================\n// Harness State\n// =============================================================================\n\n/**\n * Thread metadata stored in the harness.\n */\nexport interface HarnessThread {\n  id: string;\n  resourceId: string;\n  title?: string;\n  createdAt: Date;\n  updatedAt: Date;\n  tokenUsage?: TokenUsage;\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * Session info for the current harness instance.\n */\nexport interface HarnessSession {\n  currentThreadId: string | null;\n  currentModeId: string;\n  threads: HarnessThread[];\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\n/**\n * Token usage statistics from the model.\n */\nexport interface TokenUsage {\n  promptTokens: number;\n  completionTokens: number;\n  totalTokens: number;\n  reasoningTokens?: number;\n  cachedInputTokens?: number;\n  cacheCreationInputTokens?: number;\n  raw?: unknown;\n}\n\n/** Creates a zero-initialized TokenUsage object. */\nexport function createEmptyTokenUsage(): TokenUsage {\n  return {\n    promptTokens: 0,\n    completionTokens: 0,\n    totalTokens: 0,\n    cachedInputTokens: 0,\n    cacheCreationInputTokens: 0,\n  };\n}\n\n// =============================================================================\n// Observational Memory Progress\n// =============================================================================\n\n/**\n * Status of the Observational Memory system.\n */\nexport type OMStatus = 'idle' | 'observing' | 'reflecting';\n\n/**\n * Status of a buffered OM operation (observation or reflection).\n */\nexport type OMBufferedStatus = 'idle' | 'running' | 'complete';\n\n/**\n * Full progress state for Observational Memory.\n * Maintained by the Harness and exposed via `HarnessDisplayState`.\n */\nexport interface OMProgressState {\n  status: OMStatus;\n  // Active window tokens/thresholds (from om_status events)\n  pendingTokens: number;\n  threshold: number;\n  thresholdPercent: number;\n  observationTokens: number;\n  reflectionThreshold: number;\n  reflectionThresholdPercent: number;\n  // Buffered state (from om_status events)\n  buffered: {\n    observations: {\n      status: OMBufferedStatus;\n      chunks: number;\n      messageTokens: number;\n      projectedMessageRemoval: number;\n      observationTokens: number;\n    };\n    reflection: {\n      status: OMBufferedStatus;\n      inputObservationTokens: number;\n      observationTokens: number;\n    };\n  };\n  generationCount: number;\n  stepNumber: number;\n  cycleId?: string;\n  startTime?: number;\n  /** Observation tokens before reflection compression (set on om_reflection_start) */\n  preReflectionTokens: number;\n}\n\n// =============================================================================\n// Display State\n// =============================================================================\n\n/**\n * State of an active tool execution, tracked by the Harness for UI consumption.\n */\nexport interface ActiveToolState {\n  name: string;\n  args: unknown;\n  status: 'streaming_input' | 'running' | 'completed' | 'error';\n  partialResult?: string;\n  result?: unknown;\n  isError?: boolean;\n  shellOutput?: string;\n}\n\n/**\n * State of an active subagent execution, tracked by the Harness for UI consumption.\n */\nexport interface ActiveSubagentState {\n  agentType: string;\n  displayName?: string;\n  task: string;\n  modelId?: string;\n  forked?: boolean;\n  toolCalls: Array<{ name: string; isError: boolean }>;\n  textDelta: string;\n  status: 'running' | 'completed' | 'error';\n  durationMs?: number;\n  result?: string;\n}\n\nexport type HarnessSubagentHistoryEntry = Omit<ActiveSubagentState, 'status'>;\n\n/**\n * Controls whether an `ask_user` prompt accepts one choice or multiple choices.\n *\n * `single_select` is the default for prompts that provide options, preserving the\n * original one-answer behavior. `multi_select` tells the UI that the user may choose\n * more than one option and return those selections as an array.\n */\nexport type HarnessQuestionSelectionMode = 'single_select' | 'multi_select';\n\n/**\n * A structured choice rendered by the UI for an `ask_user` prompt.\n *\n * The label is the value returned to the model when the option is selected. The\n * optional description gives the UI more context without changing the answer value.\n */\nexport interface HarnessQuestionOption {\n  label: string;\n  description?: string;\n}\n\n/**\n * Answer shape accepted by `respondToQuestion()` for pending `ask_user` prompts.\n *\n * Free-text and single-select prompts resolve with a string. Multi-select prompts\n * resolve with a string array containing each selected option label.\n */\nexport type HarnessQuestionAnswer = string | string[];\n\n/**\n * Canonical display state maintained by the Harness.\n *\n * This is the single source of truth for *what to display*.\n * Any UI (TUI, web, desktop) can subscribe to snapshots of this state\n * instead of interpreting 35+ raw event types.\n *\n * The Harness updates this state alongside every event emission,\n * then emits a `display_state_changed` event so UIs can react.\n */\nexport interface HarnessDisplayState {\n  // ── Agent lifecycle ──────────────────────────────────────────────────\n  /** Whether an agent operation is currently in progress */\n  isRunning: boolean;\n\n  // ── Current streaming message ────────────────────────────────────────\n  /** The message currently being streamed (null when idle) */\n  currentMessage: HarnessMessage | null;\n\n  // ── Token usage ──────────────────────────────────────────────────────\n  /** Cumulative token usage for the current thread */\n  tokenUsage: TokenUsage;\n\n  // ── Tool execution tracking ──────────────────────────────────────────\n  /** Active tool executions keyed by toolCallId */\n  activeTools: Map<string, ActiveToolState>;\n\n  // ── Streaming tool input ─────────────────────────────────────────────\n  /** Partial JSON buffers for tools whose arguments are being streamed */\n  toolInputBuffers: Map<string, { text: string; toolName: string }>;\n\n  // ── Tool approval ────────────────────────────────────────────────────\n  /** A tool awaiting user approval (null when no approval pending) */\n  pendingApproval: {\n    toolCallId: string;\n    toolName: string;\n    args: unknown;\n  } | null;\n\n  // ── Tool suspension ─────────────────────────────────────────────────\n  /** A tool awaiting resume data after calling suspend() (null when none) */\n  pendingSuspension: {\n    toolCallId: string;\n    toolName: string;\n    args: unknown;\n    suspendPayload: unknown;\n    resumeSchema?: string;\n  } | null;\n\n  // ── Interactive prompts ──────────────────────────────────────────────\n  /** A question from the agent awaiting user answer (null when none) */\n  pendingQuestion: {\n    questionId: string;\n    question: string;\n    options?: HarnessQuestionOption[];\n    selectionMode?: HarnessQuestionSelectionMode;\n  } | null;\n\n  /** A plan awaiting user approval (null when none) */\n  pendingPlanApproval: {\n    planId: string;\n    title?: string;\n    plan: string;\n  } | null;\n\n  // ── Subagent tracking ────────────────────────────────────────────────\n  /** Active subagent executions keyed by parent toolCallId */\n  activeSubagents: Map<string, ActiveSubagentState>;\n\n  // ── Observational Memory ─────────────────────────────────────────────\n  /** Full OM progress state (status, tokens, thresholds, buffered) */\n  omProgress: OMProgressState;\n\n  /** Whether message buffering is currently running */\n  bufferingMessages: boolean;\n\n  /** Whether observation buffering is currently running */\n  bufferingObservations: boolean;\n\n  // ── File modifications ───────────────────────────────────────────────\n  /** Files modified by tool executions (for /diff and similar features) */\n  modifiedFiles: Map<string, { operations: string[]; firstModified: Date }>;\n\n  // ── Tasks ────────────────────────────────────────────────────────────\n  /** Current task list (from task tools) */\n  tasks: TaskItemSnapshot[];\n\n  /** Previous task list snapshot (for diff detection) */\n  previousTasks: TaskItemSnapshot[];\n}\n\n/**\n * Creates the default/initial `HarnessDisplayState`.\n */\nexport function defaultDisplayState(): HarnessDisplayState {\n  return {\n    isRunning: false,\n    currentMessage: null,\n    tokenUsage: createEmptyTokenUsage(),\n    activeTools: new Map(),\n    toolInputBuffers: new Map(),\n    pendingApproval: null,\n    pendingSuspension: null,\n    pendingQuestion: null,\n    pendingPlanApproval: null,\n    activeSubagents: new Map(),\n    omProgress: defaultOMProgressState(),\n    bufferingMessages: false,\n    bufferingObservations: false,\n    modifiedFiles: new Map(),\n    tasks: [],\n    previousTasks: [],\n  };\n}\n\n/**\n * Creates the default OM progress state.\n */\nexport function defaultOMProgressState(): OMProgressState {\n  return {\n    status: 'idle',\n    pendingTokens: 0,\n    threshold: 30000,\n    thresholdPercent: 0,\n    observationTokens: 0,\n    reflectionThreshold: 40000,\n    reflectionThresholdPercent: 0,\n    buffered: {\n      observations: {\n        status: 'idle',\n        chunks: 0,\n        messageTokens: 0,\n        projectedMessageRemoval: 0,\n        observationTokens: 0,\n      },\n      reflection: {\n        status: 'idle',\n        inputObservationTokens: 0,\n        observationTokens: 0,\n      },\n    },\n    generationCount: 0,\n    stepNumber: 0,\n    preReflectionTokens: 0,\n  };\n}\n\n// =============================================================================\n// Events\n// =============================================================================\n\n/**\n * Events emitted by the harness that UIs can subscribe to.\n */\nexport type HarnessEvent =\n  | { type: 'mode_changed'; modeId: string; previousModeId: string }\n  | { type: 'model_changed'; modelId: string; scope?: 'global' | 'thread' | 'mode'; modeId?: string }\n  | { type: 'thread_changed'; threadId: string; previousThreadId: string | null }\n  | { type: 'thread_created'; thread: HarnessThread }\n  | { type: 'thread_deleted'; threadId: string }\n  | { type: 'state_changed'; state: Record<string, unknown>; changedKeys: string[] }\n  | { type: 'agent_start' }\n  | { type: 'agent_end'; reason?: 'complete' | 'aborted' | 'error' | 'suspended' }\n  | { type: 'message_start'; message: HarnessMessage }\n  | { type: 'message_update'; message: HarnessMessage }\n  | { type: 'message_end'; message: HarnessMessage }\n  | { type: 'tool_start'; toolCallId: string; toolName: string; args: unknown }\n  | { type: 'tool_approval_required'; toolCallId: string; toolName: string; args: unknown }\n  | {\n      type: 'tool_suspended';\n      toolCallId: string;\n      toolName: string;\n      args: unknown;\n      suspendPayload: unknown;\n      resumeSchema?: string;\n    }\n  | { type: 'tool_update'; toolCallId: string; partialResult: unknown }\n  | {\n      type: 'tool_end';\n      toolCallId: string;\n      result: unknown;\n      isError: boolean;\n      providerMetadata?: Record<string, unknown>;\n    }\n  | { type: 'tool_input_start'; toolCallId: string; toolName: string }\n  | { type: 'tool_input_delta'; toolCallId: string; argsTextDelta: string; toolName?: string }\n  | { type: 'tool_input_end'; toolCallId: string }\n  | { type: 'shell_output'; toolCallId: string; output: string; stream: 'stdout' | 'stderr' }\n  | { type: 'usage_update'; usage: TokenUsage }\n  | { type: 'info'; message: string }\n  | { type: 'error'; error: Error; errorType?: string; retryable?: boolean; retryDelay?: number }\n  | { type: 'follow_up_queued'; count: number }\n  | { type: 'workspace_status_changed'; status: WorkspaceStatus; error?: Error }\n  | { type: 'workspace_ready'; workspaceId: string; workspaceName: string }\n  | { type: 'workspace_error'; error: Error }\n  | {\n      type: 'om_status';\n      windows: {\n        active: {\n          messages: { tokens: number; threshold: number };\n          observations: { tokens: number; threshold: number };\n        };\n        buffered: {\n          observations: {\n            status: 'idle' | 'running' | 'complete';\n            chunks: number;\n            messageTokens: number;\n            projectedMessageRemoval: number;\n            observationTokens: number;\n          };\n          reflection: {\n            status: 'idle' | 'running' | 'complete';\n            inputObservationTokens: number;\n            observationTokens: number;\n          };\n        };\n      };\n      recordId: string;\n      threadId: string;\n      stepNumber: number;\n      generationCount: number;\n    }\n  | {\n      type: 'om_observation_start';\n      cycleId: string;\n      operationType: 'observation' | 'reflection';\n      tokensToObserve: number;\n    }\n  | {\n      type: 'om_observation_end';\n      cycleId: string;\n      durationMs: number;\n      tokensObserved: number;\n      observationTokens: number;\n      observations?: string;\n      currentTask?: string;\n      suggestedResponse?: string;\n    }\n  | { type: 'om_observation_failed'; cycleId: string; error: string; durationMs: number }\n  | { type: 'om_reflection_start'; cycleId: string; tokensToReflect: number }\n  | {\n      type: 'om_reflection_end';\n      cycleId: string;\n      durationMs: number;\n      compressedTokens: number;\n      observations?: string;\n    }\n  | { type: 'om_reflection_failed'; cycleId: string; error: string; durationMs: number }\n  | { type: 'om_model_changed'; role: 'observer' | 'reflector'; modelId: string }\n  | {\n      type: 'om_buffering_start';\n      cycleId: string;\n      operationType: 'observation' | 'reflection';\n      tokensToBuffer: number;\n    }\n  | {\n      type: 'om_buffering_end';\n      cycleId: string;\n      operationType: 'observation' | 'reflection';\n      tokensBuffered: number;\n      bufferedTokens: number;\n      observations?: string;\n    }\n  | {\n      type: 'om_buffering_failed';\n      cycleId: string;\n      operationType: 'observation' | 'reflection';\n      error: string;\n    }\n  | {\n      type: 'om_activation';\n      cycleId: string;\n      operationType: 'observation' | 'reflection';\n      chunksActivated: number;\n      tokensActivated: number;\n      observationTokens: number;\n      messagesActivated: number;\n      generationCount: number;\n      triggeredBy?: 'threshold' | 'ttl' | 'provider_change';\n      lastActivityAt?: number;\n      ttlExpiredMs?: number;\n      activateAfterIdle?: number;\n      previousModel?: string;\n      currentModel?: string;\n    }\n  | { type: 'om_thread_title_updated'; cycleId: string; threadId: string; oldTitle?: string; newTitle: string }\n  | { type: 'sandbox_access_request'; questionId: string; path: string; reason: string }\n  | {\n      type: 'ask_question';\n      questionId: string;\n      question: string;\n      options?: HarnessQuestionOption[];\n      selectionMode?: HarnessQuestionSelectionMode;\n    }\n  | {\n      type: 'plan_approval_required';\n      planId: string;\n      title: string;\n      plan: string;\n    }\n  | { type: 'plan_approved' }\n  | { type: 'subagent_start'; toolCallId: string; agentType: string; task: string; modelId: string; forked?: boolean }\n  | { type: 'subagent_text_delta'; toolCallId: string; agentType: string; textDelta: string }\n  | {\n      type: 'subagent_tool_start';\n      toolCallId: string;\n      agentType: string;\n      subToolName: string;\n      subToolArgs: unknown;\n    }\n  | {\n      type: 'subagent_tool_end';\n      toolCallId: string;\n      agentType: string;\n      subToolName: string;\n      subToolResult: unknown;\n      isError: boolean;\n    }\n  | {\n      type: 'subagent_end';\n      toolCallId: string;\n      agentType: string;\n      result: string;\n      isError: boolean;\n      durationMs: number;\n    }\n  | { type: 'subagent_model_changed'; modelId: string; scope: 'global' | 'thread'; agentType?: string }\n  | {\n      type: 'task_updated';\n      tasks: TaskItemSnapshot[];\n    }\n  | { type: 'display_state_changed'; displayState: HarnessDisplayState };\n\n/**\n * Listener function for harness events.\n */\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise<void>;\n\n/**\n * Listener function for coalesced harness display state snapshots.\n */\nexport type HarnessDisplayStateListener = (displayState: HarnessDisplayState) => void | Promise<void>;\n\nexport interface HarnessDisplayStateSubscriptionOptions {\n  /**\n   * Minimum quiet window before non-critical display state callbacks.\n   *\n   * @default 250\n   */\n  windowMs?: number;\n\n  /**\n   * Maximum time a pending display state snapshot may wait while updates continue.\n   *\n   * @default 500\n   */\n  maxWaitMs?: number;\n}\n\n// =============================================================================\n// Messages\n// =============================================================================\n\n/**\n * Simplified message type for UI consumption.\n * Maps from Mastra's internal message format.\n */\nexport interface HarnessMessage {\n  id: string;\n  role: 'user' | 'assistant' | 'system';\n  content: HarnessMessageContent[];\n  createdAt: Date;\n  stopReason?: 'complete' | 'tool_use' | 'aborted' | 'error';\n  errorMessage?: string;\n}\n\nexport type HarnessMessageContent =\n  | { type: 'text'; text: string }\n  | { type: 'thinking'; thinking: string }\n  | { type: 'tool_call'; id: string; name: string; args: unknown }\n  | {\n      type: 'tool_result';\n      id: string;\n      name: string;\n      result: unknown;\n      isError: boolean;\n      providerMetadata?: Record<string, unknown>;\n    }\n  | {\n      type: 'system_reminder';\n      message: string;\n      reminderType?: string;\n      path?: string;\n      precedesMessageId?: string;\n      gapText?: string;\n      gapMs?: number;\n      timestamp?: string;\n      goalMaxTurns?: number;\n      judgeModelId?: string;\n    }\n  | { type: 'image'; data: string; mimeType: string }\n  | { type: 'file'; data: string; mediaType: string; filename?: string }\n  | {\n      type: 'om_observation_start';\n      tokensToObserve: number;\n      operationType?: 'observation' | 'reflection';\n    }\n  | {\n      type: 'om_observation_end';\n      tokensObserved: number;\n      observationTokens: number;\n      durationMs: number;\n      operationType?: 'observation' | 'reflection';\n      observations?: string;\n      currentTask?: string;\n      suggestedResponse?: string;\n    }\n  | {\n      type: 'om_observation_failed';\n      error: string;\n      tokensAttempted?: number;\n      operationType?: 'observation' | 'reflection';\n    }\n  | { type: 'om_thread_title_updated'; threadId: string; oldTitle?: string; newTitle: string };\n\n// =============================================================================\n// Request Context\n// =============================================================================\n\n/**\n * Harness-specific context set on the RequestContext under the 'harness' key.\n * Tools can access harness state and methods through requestContext.get('harness').\n */\nexport interface HarnessRequestContext<TState = unknown> {\n  /** The harness instance ID */\n  harnessId: string;\n\n  /** Current harness state (read-only snapshot) */\n  state: TState;\n\n  /** Get the current harness state (live, not snapshot) */\n  getState: () => TState;\n\n  /** Update harness state */\n  setState: (updates: Partial<TState>) => Promise<void>;\n\n  /** Update harness state from the latest state snapshot in a serialized transaction */\n  updateState?: <TResult>(\n    updater: (state: Readonly<TState>) =>\n      | {\n          updates?: Partial<TState>;\n          events?: HarnessEvent[];\n          result: TResult;\n        }\n      | Promise<{\n          updates?: Partial<TState>;\n          events?: HarnessEvent[];\n          result: TResult;\n        }>,\n  ) => Promise<TResult>;\n\n  /** Current thread ID */\n  threadId: string | null;\n\n  /** Current resource ID */\n  resourceId: string;\n\n  /** Current mode ID */\n  modeId: string;\n\n  /** Abort signal for the current operation */\n  abortSignal?: AbortSignal;\n\n  /** Workspace instance (if configured on the Harness) */\n  workspace?: Workspace;\n\n  /** Emit a harness event (used by tools to forward events) */\n  emitEvent?: (event: HarnessEvent) => void;\n\n  /** Register a pending question resolver (used by ask_user tools) */\n  registerQuestion?: (params: { questionId: string; resolve: (answer: HarnessQuestionAnswer) => void }) => void;\n\n  /** Register a pending plan approval resolver (used by submit_plan tools) */\n  registerPlanApproval?: (params: {\n    planId: string;\n    resolve: (result: { action: 'approved' | 'rejected'; feedback?: string }) => void;\n  }) => void;\n\n  /** Get the configured subagent model ID for a specific agent type */\n  getSubagentModelId?: (params?: { agentType?: string }) => string | null;\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { Agent } from '../agent';\nimport type { MastraDBMessage } from '../agent/message-list/state/types';\nimport { createSignal, mastraDBMessageToSignal } from '../agent/signals';\nimport type { AgentSignalContents, AgentSignalInput } from '../agent/signals';\nimport type { AgentThreadSubscription, ToolsInput, ToolsetsInput } from '../agent/types';\nimport type { MastraBrowser } from '../browser/browser';\nimport { Mastra } from '../mastra';\nimport type { MastraMemory } from '../memory/memory';\nimport type { StorageThreadType } from '../memory/types';\nimport type { TracingContext, TracingOptions } from '../observability';\nimport { RequestContext } from '../request-context';\nimport { toStandardSchema } from '../schema';\nimport type { StandardSchemaWithJSON } from '../schema';\nimport type { MemoryStorage } from '../storage/domains/memory/base';\nimport type { ObservationalMemoryRecord } from '../storage/types';\nimport { getTransformedToolPayload, hasTransformedToolPayload } from '../tools/payload-transform';\nimport type { ToolPayloadTransformPhase } from '../tools/types';\nimport { safeStringify } from '../utils';\nimport { Workspace } from '../workspace/workspace';\nimport type { WorkspaceConfig } from '../workspace/workspace';\n\nimport {\n  CRITICAL_DISPLAY_STATE_EVENT_TYPES,\n  DEFAULT_DISPLAY_STATE_SUBSCRIPTION_OPTIONS,\n  DisplayStateScheduler,\n} from './display-state-scheduler';\nimport {\n  askUserTool,\n  createSubagentTool,\n  submitPlanTool,\n  taskCheckTool,\n  taskCompleteTool,\n  taskUpdateTool,\n  taskWriteTool,\n} from './tools';\nimport type { TaskItemSnapshot } from './tools';\nimport { createEmptyTokenUsage, defaultDisplayState, defaultOMProgressState } from './types';\nimport type {\n  AvailableModel,\n  HeartbeatHandler,\n  HarnessConfig,\n  HarnessDisplayState,\n  HarnessDisplayStateListener,\n  HarnessDisplayStateSubscriptionOptions,\n  HarnessEvent,\n  HarnessEventListener,\n  HarnessMessage,\n  HarnessMessageContent,\n  HarnessMode,\n  HarnessQuestionAnswer,\n  HarnessRequestContext,\n  HarnessSession,\n  HarnessThread,\n  ModelAuthStatus,\n  PermissionPolicy,\n  PermissionRules,\n  TokenUsage,\n  ToolCategory,\n} from './types';\n\ntype HarnessStreamState = {\n  currentMessage: HarnessMessage;\n  isSuspended: boolean;\n  textContentById: Map<string, { index: number; text: string }>;\n  thinkingContentById: Map<string, { index: number; text: string }>;\n};\n\nfunction getUsageNumber(usage: Record<string, unknown>, key: string): number | undefined {\n  const value = usage[key];\n  if (typeof value === 'number' && Number.isFinite(value)) {\n    return value;\n  }\n  if (typeof value === 'string' && value.trim() !== '') {\n    const numericValue = Number(value);\n    if (Number.isFinite(numericValue)) {\n      return numericValue;\n    }\n  }\n  return undefined;\n}\n\nfunction addOptionalUsageField(\n  usage: TokenUsage,\n  key: keyof Pick<TokenUsage, 'reasoningTokens' | 'cachedInputTokens' | 'cacheCreationInputTokens'>,\n  value: number | undefined,\n): void {\n  if (value !== undefined) {\n    usage[key] = (usage[key] ?? 0) + value;\n  }\n}\n\nfunction getDisplayTransform(metadata: unknown, phase: ToolPayloadTransformPhase, fallback: unknown) {\n  const transform = getTransformedToolPayload(metadata, 'display', phase);\n  return hasTransformedToolPayload(transform) ? transform.transformed : fallback;\n}\n\nfunction getStringValue(value: unknown): string | undefined {\n  return typeof value === 'string' ? value : undefined;\n}\n\nfunction getRecordValue(value: unknown): Record<string, unknown> | undefined {\n  return value && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction signalContentsToHarnessContent(contents: AgentSignalContents): HarnessMessageContent[] {\n  if (typeof contents === 'string') return [{ type: 'text', text: contents }];\n  return contents.flatMap((part): HarnessMessageContent[] => {\n    if (part.type === 'text') {\n      return [{ type: 'text', text: part.text }];\n    }\n    if (typeof part.data !== 'string') return [];\n    if (part.mediaType.startsWith('image/')) {\n      return [{ type: 'image', data: part.data, mimeType: part.mediaType }];\n    }\n    return [\n      {\n        type: 'file',\n        data: part.data,\n        mediaType: part.mediaType,\n        filename: part.filename,\n      },\n    ];\n  });\n}\n\nfunction toSystemReminderContent(\n  payload: Record<string, unknown>,\n): Extract<HarnessMessageContent, { type: 'system_reminder' }> | undefined {\n  const attributes = getRecordValue(payload.attributes);\n  const metadata = getRecordValue(payload.metadata);\n  const message = getStringValue(payload.contents);\n  if (message === undefined) return undefined;\n\n  return {\n    type: 'system_reminder',\n    message,\n    reminderType:\n      getStringValue(payload.reminderType) ?? getStringValue(attributes?.type) ?? getStringValue(payload.type),\n    path: getStringValue(payload.path) ?? getStringValue(attributes?.path),\n    precedesMessageId: getStringValue(payload.precedesMessageId) ?? getStringValue(attributes?.precedesMessageId),\n    gapText: getStringValue(payload.gapText) ?? getStringValue(attributes?.gapText),\n    gapMs:\n      typeof payload.gapMs === 'number'\n        ? payload.gapMs\n        : typeof attributes?.gapMs === 'number'\n          ? attributes.gapMs\n          : undefined,\n    timestamp: getStringValue(payload.timestamp) ?? getStringValue(attributes?.timestamp),\n    goalMaxTurns:\n      typeof payload.goalMaxTurns === 'number'\n        ? payload.goalMaxTurns\n        : typeof metadata?.goalMaxTurns === 'number'\n          ? metadata.goalMaxTurns\n          : undefined,\n    judgeModelId: getStringValue(payload.judgeModelId) ?? getStringValue(metadata?.judgeModelId),\n  };\n}\n\nfunction toUserSignalMessage(payload: Record<string, unknown>): HarnessMessage | undefined {\n  const id = getStringValue(payload.id);\n  const rawContents = payload.contents;\n  if (!id || rawContents === undefined) return undefined;\n\n  const signal = createSignal({\n    id,\n    type: 'user-message',\n    contents: rawContents as AgentSignalContents,\n    createdAt: getStringValue(payload.createdAt),\n  });\n  const content = signalContentsToHarnessContent(signal.contents);\n  if (content.length === 0) return undefined;\n\n  return {\n    id: signal.id,\n    role: 'user',\n    content,\n    createdAt: signal.createdAt,\n  };\n}\n\n/**\n * The Harness orchestrates multiple agent modes, shared state, memory, and storage.\n * It's the core abstraction that a TUI (or other UI) controls.\n *\n * @example\n * ```ts\n * const harness = new Harness({\n *   id: \"my-coding-agent\",\n *   storage: new LibSQLStore({ url: \"file:./data.db\" }),\n *   stateSchema: z.object({\n *     currentModelId: z.string().optional(),\n *   }),\n *   modes: [\n *     { id: \"plan\", name: \"Plan\", default: true, agent: planAgent },\n *     { id: \"build\", name: \"Build\", agent: buildAgent },\n *   ],\n * })\n *\n * harness.subscribe((event) => {\n *   if (event.type === \"message_update\") renderMessage(event.message)\n * })\n *\n * await harness.init()\n * await harness.sendMessage({ content: \"Hello!\" })\n * ```\n */\nexport class Harness<TState = {}> {\n  readonly id: string;\n\n  private config: HarnessConfig<TState>;\n  private stateSchema: StandardSchemaWithJSON | undefined;\n  private state: TState;\n  private currentModeId: string;\n  private currentThreadId: string | null = null;\n  private resourceId: string;\n  private defaultResourceId: string;\n  private listeners: HarnessEventListener[] = [];\n  private displayStateSchedulers = new Set<DisplayStateScheduler>();\n  private abortController: AbortController | null = null;\n  private abortRequested: boolean = false;\n  private currentRunId: string | null = null;\n  private currentTraceId: string | null = null;\n  private currentOperationId: number = 0;\n  private agentThreadSubscription: AgentThreadSubscription<any> | null = null;\n  private agentThreadSubscriptionKey: string | null = null;\n  private followUpQueue: Array<{ content: string; requestContext?: RequestContext }> = [];\n  private pendingApprovalResolve:\n    | ((params: { decision: 'approve' | 'decline'; requestContext?: RequestContext }) => void)\n    | null = null;\n  private pendingApprovalToolName: string | null = null;\n  private pendingSuspensionRunId: string | null = null;\n  private pendingSuspensionToolCallId: string | null = null;\n  private pendingQuestions = new Map<string, (answer: HarnessQuestionAnswer) => void>();\n  private pendingPlanApprovals = new Map<\n    string,\n    (result: { action: 'approved' | 'rejected'; feedback?: string }) => void\n  >();\n  private workspace: Workspace | undefined = undefined;\n  private workspaceFn:\n    | ((ctx: { requestContext: RequestContext }) => Promise<Workspace | undefined> | Workspace | undefined)\n    | undefined = undefined;\n  private workspaceInitialized = false;\n  private browser: MastraBrowser | undefined = undefined;\n  private browserFn:\n    | ((ctx: { requestContext: RequestContext }) => Promise<MastraBrowser | undefined> | MastraBrowser | undefined)\n    | undefined = undefined;\n  private heartbeatTimers = new Map<string, { timer: NodeJS.Timeout; shutdown?: () => void | Promise<void> }>();\n  private tokenUsage: TokenUsage = createEmptyTokenUsage();\n  private sessionGrantedCategories = new Set<string>();\n  private sessionGrantedTools = new Set<string>();\n  private displayState: HarnessDisplayState = defaultDisplayState();\n  private stateUpdateQueue: Promise<void> = Promise.resolve();\n  #internalMastra: Mastra | undefined = undefined;\n\n  constructor(config: HarnessConfig<TState>) {\n    this.id = config.id;\n    this.config = config;\n    this.resourceId = config.resourceId ?? config.id;\n    this.defaultResourceId = this.resourceId;\n\n    // Convert PublicSchema to StandardSchemaWithJSON at the boundary\n    this.stateSchema = config.stateSchema ? toStandardSchema(config.stateSchema) : undefined;\n\n    // Initialize state from schema defaults + initial state\n    this.state = {\n      ...this.getSchemaDefaults(),\n      ...config.initialState,\n    } as TState;\n\n    // Find default mode\n    const defaultMode = config.modes.find(m => m.default) ?? config.modes[0];\n    if (!defaultMode) {\n      throw new Error('Harness requires at least one agent mode');\n    }\n    this.currentModeId = defaultMode.id;\n\n    // Store workspace: pre-built instance, dynamic factory, or config (constructed in init())\n    if (config.workspace instanceof Workspace) {\n      this.workspace = config.workspace;\n    } else if (typeof config.workspace === 'function') {\n      this.workspaceFn = config.workspace;\n    }\n\n    // Store browser: pre-built instance or dynamic factory\n    if (config.browser && typeof config.browser !== 'function') {\n      this.browser = config.browser;\n    } else if (typeof config.browser === 'function') {\n      this.browserFn = config.browser;\n    }\n\n    // Seed model from mode default if not set\n    const currentModel = (this.state as any).currentModelId;\n    if (!currentModel && defaultMode.defaultModelId) {\n      void this.setState({ currentModelId: defaultMode.defaultModelId } as unknown as Partial<TState>);\n    }\n  }\n\n  // ===========================================================================\n  // Accessors\n  // ===========================================================================\n\n  /**\n   * Access the internal Mastra instance.\n   * Available after `init()` when storage is configured.\n   * Useful for scorer registration, observability access, and eval tooling.\n   */\n  getMastra(): Mastra | undefined {\n    return this.#internalMastra;\n  }\n\n  /**\n   * Sets or updates the harness-level browser and propagates it to static mode agents.\n   */\n  setBrowser(browser: MastraBrowser | undefined): void {\n    this.browser = browser;\n    this.browserFn = undefined;\n\n    for (const mode of this.config.modes) {\n      const agent = typeof mode.agent === 'function' ? null : mode.agent;\n      if (!agent || agent.hasOwnBrowser()) continue;\n      agent.setBrowser(browser);\n    }\n  }\n\n  // ===========================================================================\n  // Initialization\n  // ===========================================================================\n\n  /**\n   * Initialize the harness — loads storage and workspace.\n   * Must be called before using the harness.\n   */\n  async init(): Promise<void> {\n    // Create an internal Mastra instance so agents have access to storage\n    // (required for tool approval snapshot persistence/resume).\n    // We init storage through Mastra's proxied storage so augmentWithInit\n    // tracks it and won't double-init.\n    if (this.config.storage) {\n      this.#internalMastra = new Mastra({\n        logger: false,\n        storage: this.config.storage,\n        ...(this.config.pubsub ? { pubsub: this.config.pubsub } : {}),\n        ...(this.config.observability ? { observability: this.config.observability } : {}),\n      });\n      await this.#internalMastra.getStorage()!.init();\n    }\n\n    // Initialize workspace if configured (skip for dynamic factory — resolved per-request)\n    if (this.config.workspace && !this.workspaceInitialized && !this.workspaceFn) {\n      try {\n        if (!this.workspace) {\n          this.workspace = new Workspace(this.config.workspace as WorkspaceConfig);\n        }\n\n        this.emit({ type: 'workspace_status_changed', status: 'initializing' });\n        await this.workspace.init();\n        this.workspaceInitialized = true;\n\n        this.emit({ type: 'workspace_status_changed', status: 'ready' });\n        this.emit({\n          type: 'workspace_ready',\n          workspaceId: this.workspace.id,\n          workspaceName: this.workspace.name,\n        });\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error(String(error));\n        this.workspace = undefined;\n        this.workspaceInitialized = false;\n\n        this.emit({ type: 'workspace_status_changed', status: 'error', error: err });\n        this.emit({ type: 'workspace_error', error: err });\n      }\n    }\n\n    // Propagate harness-level Mastra, memory, workspace, browser, and pubsub to mode agents (after workspace init)\n    for (const mode of this.config.modes) {\n      const agent = typeof mode.agent === 'function' ? null : mode.agent;\n      if (!agent) continue;\n      this.propagateRuntimeServicesToAgent(agent);\n    }\n\n    this.startHeartbeats();\n  }\n\n  /**\n   * Select the most recent thread, or create one if none exist.\n   */\n  async selectOrCreateThread(): Promise<HarnessThread> {\n    const threads = await this.listThreads();\n\n    if (threads.length === 0) {\n      return await this.createThread();\n    }\n\n    const sortedThreads = [...threads].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime());\n    const mostRecent = sortedThreads[0]!;\n    await this.config.threadLock?.acquire(mostRecent.id);\n    this.currentThreadId = mostRecent.id;\n    await this.loadThreadMetadata();\n    await this.ensureCurrentAgentThreadSubscription();\n\n    return mostRecent;\n  }\n\n  private async getMemoryStorage(): Promise<MemoryStorage> {\n    if (!this.config.storage) {\n      throw new Error('Storage is not configured on this Harness');\n    }\n    const memoryStorage = await this.config.storage.getStore('memory');\n    if (!memoryStorage) {\n      throw new Error('Storage does not have a memory domain configured');\n    }\n    return memoryStorage;\n  }\n\n  // ===========================================================================\n  // State Management\n  // ===========================================================================\n\n  /**\n   * Get current harness state (read-only snapshot).\n   */\n  getState(): Readonly<TState> {\n    return { ...this.state };\n  }\n\n  private async applyStateUpdates(updates: Partial<TState>): Promise<void> {\n    const changedKeys = Object.keys(updates);\n    const newState = { ...this.state, ...updates };\n\n    if (this.stateSchema) {\n      const result = await this.stateSchema['~standard'].validate(newState);\n      if (result.issues) {\n        const messages = result.issues.map(i => i.message).join('; ');\n        throw new Error(`Invalid state update: ${messages}`);\n      }\n      this.state = result.value as TState;\n    } else {\n      this.state = newState as TState;\n    }\n\n    this.emit({ type: 'state_changed', state: this.state as Record<string, unknown>, changedKeys });\n  }\n\n  /**\n   * Update harness state. Validates against schema if provided.\n   * Emits state_changed event.\n   */\n  async setState(updates: Partial<TState>): Promise<void> {\n    const run = this.stateUpdateQueue.then(() => this.applyStateUpdates(updates));\n    this.stateUpdateQueue = run.then(\n      () => undefined,\n      () => undefined,\n    );\n    return run;\n  }\n\n  private async updateState<TResult>(\n    updater: (\n      state: Readonly<TState>,\n    ) =>\n      | { updates?: Partial<TState>; events?: HarnessEvent[]; result: TResult }\n      | Promise<{ updates?: Partial<TState>; events?: HarnessEvent[]; result: TResult }>,\n  ): Promise<TResult> {\n    const run = this.stateUpdateQueue.then(async () => {\n      const update = await updater(this.getState());\n      if (update.updates && Object.keys(update.updates).length > 0) {\n        await this.applyStateUpdates(update.updates);\n      }\n      for (const event of update.events ?? []) {\n        this.emit(event);\n      }\n      return update.result;\n    });\n\n    this.stateUpdateQueue = run.then(\n      () => undefined,\n      () => undefined,\n    );\n    return run;\n  }\n\n  private getSchemaDefaults(): Partial<TState> {\n    if (!this.stateSchema) return {};\n\n    const defaults: Record<string, unknown> = {};\n\n    try {\n      // Extract defaults from the JSON Schema representation\n      const jsonSchema = this.stateSchema['~standard'].jsonSchema.output({ target: 'draft-07' }) as {\n        properties?: Record<string, { default?: unknown }>;\n      };\n      if (jsonSchema?.properties) {\n        for (const [key, prop] of Object.entries(jsonSchema.properties)) {\n          if (prop.default !== undefined) {\n            defaults[key] = prop.default;\n          }\n        }\n      }\n    } catch {\n      // Schema doesn't support JSON Schema extraction — skip defaults\n    }\n\n    return defaults as Partial<TState>;\n  }\n\n  // ===========================================================================\n  // Mode Management\n  // ===========================================================================\n\n  listModes(): HarnessMode<TState>[] {\n    return this.config.modes;\n  }\n\n  getCurrentModeId(): string {\n    return this.currentModeId;\n  }\n\n  getCurrentMode(): HarnessMode<TState> {\n    const mode = this.config.modes.find(m => m.id === this.currentModeId);\n    if (!mode) {\n      throw new Error(`Mode not found: ${this.currentModeId}`);\n    }\n    return mode;\n  }\n\n  /**\n   * Switch to a different mode.\n   * Aborts any in-progress generation and switches to the mode's default model.\n   */\n  async switchMode({ modeId }: { modeId: string }): Promise<void> {\n    const mode = this.config.modes.find(m => m.id === modeId);\n    if (!mode) {\n      throw new Error(`Mode not found: ${modeId}`);\n    }\n\n    this.abort();\n\n    // Save current model to the outgoing mode before switching\n    const currentModelId = this.getCurrentModelId();\n    if (currentModelId) {\n      await this.setThreadSetting({ key: `modeModelId_${this.currentModeId}`, value: currentModelId });\n    }\n\n    const previousModeId = this.currentModeId;\n    this.currentModeId = modeId;\n\n    await this.setThreadSetting({ key: 'currentModeId', value: modeId });\n\n    // Load the incoming mode's model\n    const modeModelId = await this.loadModeModelId(modeId);\n    if (modeModelId) {\n      void this.setState({ currentModelId: modeModelId } as unknown as Partial<TState>);\n      this.emit({ type: 'model_changed', modelId: modeModelId } as HarnessEvent);\n    }\n\n    this.emit({ type: 'mode_changed', modeId, previousModeId });\n    await this.ensureCurrentAgentThreadSubscription();\n  }\n\n  /**\n   * Load the stored model ID for a specific mode.\n   * Falls back to: thread metadata -> mode's defaultModelId -> current model.\n   */\n  private async loadModeModelId(modeId: string): Promise<string | null> {\n    if (this.currentThreadId && this.config.storage) {\n      try {\n        const memoryStorage = await this.getMemoryStorage();\n        const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n        const meta = thread?.metadata as Record<string, unknown> | undefined;\n        const stored = meta?.[`modeModelId_${modeId}`] as string | undefined;\n        if (stored) return stored;\n      } catch {\n        // Fall through to defaults\n      }\n    }\n\n    const mode = this.config.modes.find(m => m.id === modeId);\n    if (mode?.defaultModelId) return mode.defaultModelId;\n\n    return null;\n  }\n\n  private propagateRuntimeServicesToAgent(agent: Agent): Agent {\n    const alreadyHasMastra = !!agent.getMastraInstance();\n    const workspaceForAgents = this.workspaceFn ?? this.workspace;\n    const browserForAgents = this.browserFn ?? this.browser;\n\n    if (this.config.memory && !agent.hasOwnMemory()) {\n      agent.__setMemory(this.config.memory);\n    }\n    if (workspaceForAgents && !agent.hasOwnWorkspace()) {\n      agent.__setWorkspace(workspaceForAgents);\n    }\n    if (browserForAgents && !agent.hasOwnBrowser()) {\n      agent.setBrowser(browserForAgents as MastraBrowser);\n    }\n    if (this.config.pubsub && !agent.hasOwnPubSub()) {\n      agent.__setPubSub(this.config.pubsub);\n    }\n\n    if (this.#internalMastra && !alreadyHasMastra) {\n      this.#internalMastra.addAgent(agent);\n    }\n\n    return agent;\n  }\n\n  /**\n   * Get the agent for the current mode.\n   */\n  private getCurrentAgent(): Agent {\n    const mode = this.getCurrentMode();\n    const agent = typeof mode.agent === 'function' ? mode.agent(this.state) : mode.agent;\n    return this.propagateRuntimeServicesToAgent(agent);\n  }\n\n  /**\n   * Get a short display name from the current model ID.\n   */\n  getModelName(): string {\n    const modelId = this.getCurrentModelId();\n    if (!modelId || modelId === 'unknown') return modelId || 'unknown';\n    const parts = modelId.split('/');\n    return parts[parts.length - 1] || modelId;\n  }\n\n  /**\n   * Get the full model ID (e.g., \"anthropic/claude-sonnet-4\").\n   */\n  getFullModelId(): string {\n    return this.getCurrentModelId();\n  }\n\n  /**\n   * Switch to a different model at runtime.\n   */\n  async switchModel({\n    modelId,\n    scope = 'thread',\n    modeId,\n  }: {\n    modelId: string;\n    scope?: 'global' | 'thread';\n    modeId?: string;\n  }): Promise<void> {\n    const targetModeId = modeId ?? this.currentModeId;\n\n    if (targetModeId === this.currentModeId) {\n      void this.setState({ currentModelId: modelId } as unknown as Partial<TState>);\n    }\n\n    if (scope === 'thread') {\n      await this.setThreadSetting({ key: `modeModelId_${targetModeId}`, value: modelId });\n    }\n\n    try {\n      await Promise.resolve(this.config.modelUseCountTracker?.(modelId));\n    } catch (error) {\n      console.error('Failed to track model usage count', error);\n    }\n\n    this.emit({ type: 'model_changed', modelId, scope, modeId: targetModeId } as HarnessEvent);\n  }\n\n  getCurrentModelId(): string {\n    const state = this.getState() as { currentModelId?: string };\n    return state.currentModelId ?? '';\n  }\n\n  hasModelSelected(): boolean {\n    return this.getCurrentModelId() !== '';\n  }\n\n  /**\n   * Check if the current model's provider has authentication configured.\n   * Uses the provider registry's `apiKeyEnvVar` and the optional `modelAuthChecker` hook.\n   */\n  async getCurrentModelAuthStatus(): Promise<ModelAuthStatus> {\n    const modelId = this.getCurrentModelId();\n\n    try {\n      const availableModels = await this.listAvailableModels();\n      const currentModel = availableModels.find(model => model.id === modelId);\n      if (currentModel) {\n        if (currentModel.hasApiKey) {\n          return { hasAuth: true };\n        }\n        return { hasAuth: false, apiKeyEnvVar: currentModel.apiKeyEnvVar };\n      }\n    } catch {\n      // Ignore catalog lookup errors and fall through to provider-based checks.\n    }\n\n    const provider = modelId.split('/')[0];\n    if (!provider) return { hasAuth: true };\n\n    if (this.config.modelAuthChecker) {\n      const result = this.config.modelAuthChecker(provider);\n      if (result === true) return { hasAuth: true };\n      if (result === false) {\n        const apiKeyEnvVar = await this.getProviderApiKeyEnvVar(provider);\n        return { hasAuth: false, apiKeyEnvVar };\n      }\n    }\n\n    try {\n      const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n      const registry = PROVIDER_REGISTRY as Record<string, { apiKeyEnvVar?: string | string[] }>;\n      const providerConfig = registry[provider];\n      const envVars = providerConfig?.apiKeyEnvVar;\n      const apiKeyEnvVar = Array.isArray(envVars) ? envVars[0] : envVars;\n      if (apiKeyEnvVar && process.env[apiKeyEnvVar]) {\n        return { hasAuth: true };\n      }\n      return { hasAuth: false, apiKeyEnvVar: apiKeyEnvVar || undefined };\n    } catch {\n      return { hasAuth: true };\n    }\n  }\n\n  /**\n   * Get all available models from the provider registry with auth status.\n   * Uses the optional `modelAuthChecker`, `modelUseCountProvider`, and\n   * `customModelCatalogProvider` hooks.\n   */\n  async listAvailableModels(): Promise<AvailableModel[]> {\n    try {\n      const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n\n      if (!PROVIDER_REGISTRY) return [];\n\n      const registry = PROVIDER_REGISTRY as Record<\n        string,\n        { models?: string[]; name?: string; apiKeyEnvVar?: string | string[] }\n      >;\n      const providers = Object.keys(registry);\n      const useCounts = this.config.modelUseCountProvider?.() ?? {};\n      const modelsById = new Map<string, AvailableModel>();\n\n      const upsertModel = (model: Omit<AvailableModel, 'useCount'>): void => {\n        if (!model.id || !model.provider || !model.modelName) return;\n        modelsById.set(model.id, {\n          ...model,\n          useCount: useCounts[model.id] ?? 0,\n        });\n      };\n\n      for (const provider of providers) {\n        const providerConfig = registry[provider];\n        const envVars = providerConfig?.apiKeyEnvVar;\n        const apiKeyEnvVar = Array.isArray(envVars) ? envVars[0] : envVars;\n        const hasEnvKey = apiKeyEnvVar ? !!process.env[apiKeyEnvVar] : false;\n\n        let hasApiKey = hasEnvKey;\n        if (!hasApiKey && this.config.modelAuthChecker) {\n          const customAuth = this.config.modelAuthChecker(provider);\n          if (customAuth === true) hasApiKey = true;\n        }\n\n        if (providerConfig?.models && Array.isArray(providerConfig.models)) {\n          for (const modelName of providerConfig.models) {\n            upsertModel({\n              id: `${provider}/${modelName}`,\n              provider,\n              modelName,\n              hasApiKey,\n              apiKeyEnvVar: apiKeyEnvVar || undefined,\n            });\n          }\n        }\n      }\n\n      if (this.config.customModelCatalogProvider) {\n        try {\n          const customModels = await Promise.resolve(this.config.customModelCatalogProvider());\n          for (const model of customModels) {\n            upsertModel({\n              id: model.id,\n              provider: model.provider,\n              modelName: model.modelName,\n              hasApiKey: model.hasApiKey,\n              apiKeyEnvVar: model.apiKeyEnvVar,\n            });\n          }\n        } catch (error) {\n          console.warn('Failed to load custom available models:', error);\n        }\n      }\n\n      return [...modelsById.values()];\n    } catch (error) {\n      console.warn('Failed to load available models:', error);\n      return [];\n    }\n  }\n\n  private async getProviderApiKeyEnvVar(provider: string): Promise<string | undefined> {\n    try {\n      const { PROVIDER_REGISTRY } = await import('../llm/model/provider-registry.js');\n      const registry = PROVIDER_REGISTRY as Record<string, { apiKeyEnvVar?: string | string[] }>;\n      const envVars = registry[provider]?.apiKeyEnvVar;\n      return Array.isArray(envVars) ? envVars[0] : envVars;\n    } catch {\n      return undefined;\n    }\n  }\n\n  // ===========================================================================\n  // Thread Management\n  // ===========================================================================\n\n  getCurrentThreadId(): string | null {\n    return this.currentThreadId;\n  }\n\n  getResourceId(): string {\n    return this.resourceId;\n  }\n\n  async getResolvedMemory(): Promise<MastraMemory | null> {\n    if (!this.config.memory) return null;\n    return this.resolveMemory();\n  }\n\n  setResourceId({ resourceId }: { resourceId: string }): void {\n    this.cleanupAgentThreadSubscription();\n    this.resourceId = resourceId;\n    this.currentThreadId = null;\n  }\n\n  getDefaultResourceId(): string {\n    return this.defaultResourceId;\n  }\n\n  async getKnownResourceIds(): Promise<string[]> {\n    const threads = await this.listThreads({ allResources: true });\n    const ids = new Set(threads.map(t => t.resourceId));\n    return [...ids].sort();\n  }\n\n  async createThread({ title }: { title?: string } = {}): Promise<HarnessThread> {\n    this.cleanupAgentThreadSubscription();\n    const now = new Date();\n    const thread: HarnessThread = {\n      id: this.generateId(),\n      resourceId: this.resourceId,\n      title: title || '',\n      createdAt: now,\n      updatedAt: now,\n    };\n\n    const currentStateModel = (this.state as any).currentModelId;\n    const currentMode = this.getCurrentMode();\n    const modelId = currentStateModel || currentMode.defaultModelId;\n\n    const metadata: Record<string, unknown> = {};\n    if (modelId) {\n      metadata.currentModelId = modelId;\n      metadata[`modeModelId_${this.currentModeId}`] = modelId;\n    }\n\n    // Auto-tag with projectPath from state so threads are scoped to the working directory\n    const projectPath = (this.state as any).projectPath;\n    if (projectPath) {\n      metadata.projectPath = projectPath;\n    }\n\n    // Acquire lock on new thread before releasing old one.\n    // If acquire fails, attempt to re-acquire the old lock before rethrowing.\n    const oldThreadId = this.currentThreadId;\n    if (this.config.threadLock) {\n      try {\n        await this.config.threadLock.acquire(thread.id);\n      } catch (err) {\n        if (oldThreadId) {\n          try {\n            await this.config.threadLock.acquire(oldThreadId);\n          } catch {\n            // Best-effort re-acquire; original error is more important\n          }\n        }\n        throw err;\n      }\n      if (oldThreadId) {\n        await this.config.threadLock.release(oldThreadId);\n      }\n    }\n\n    if (this.config.storage) {\n      const memoryStorage = await this.getMemoryStorage();\n      try {\n        await memoryStorage.saveThread({\n          thread: {\n            id: thread.id,\n            resourceId: thread.resourceId,\n            title: thread.title!,\n            createdAt: thread.createdAt,\n            updatedAt: thread.updatedAt,\n            metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n          },\n        });\n      } catch (err) {\n        // saveThread failed after lock was swapped; restore previous lock state\n        let reacquired = false;\n        if (this.config.threadLock) {\n          try {\n            await this.config.threadLock.release(thread.id);\n          } catch {\n            // Best-effort release of new thread lock\n          }\n          if (oldThreadId) {\n            try {\n              await this.config.threadLock.acquire(oldThreadId);\n              reacquired = true;\n            } catch {\n              // Re-acquire failed; no lock is held\n            }\n          }\n        }\n        this.currentThreadId = reacquired ? oldThreadId : null;\n        throw err;\n      }\n    }\n\n    this.currentThreadId = thread.id;\n\n    if (modelId && !currentStateModel) {\n      void this.setState({ currentModelId: modelId } as unknown as Partial<TState>);\n    }\n\n    this.tokenUsage = createEmptyTokenUsage();\n    this.emit({ type: 'thread_created', thread });\n    await this.ensureCurrentAgentThreadSubscription();\n\n    return thread;\n  }\n\n  /**\n   * Returns a memory accessor with thread and message management methods.\n   */\n  get memory() {\n    return {\n      createThread: this.createThread.bind(this),\n      switchThread: this.switchThread.bind(this),\n      listThreads: this.listThreads.bind(this),\n      renameThread: this.renameThread.bind(this),\n      deleteThread: this.deleteThread.bind(this),\n    };\n  }\n\n  private async deleteThread({ threadId }: { threadId: string }): Promise<void> {\n    if (!this.config.storage) return;\n\n    const memoryStorage = await this.getMemoryStorage();\n    const thread = await memoryStorage.getThreadById({ threadId });\n    if (!thread) {\n      throw new Error(`Thread not found: ${threadId}`);\n    }\n\n    const isDeletingCurrentThread = this.currentThreadId === threadId;\n\n    await memoryStorage.deleteThread({ threadId });\n\n    if (isDeletingCurrentThread) {\n      try {\n        await this.config.threadLock?.release(threadId);\n      } catch {\n        // Lock release failed; proceed with state cleanup regardless\n      }\n      this.cleanupAgentThreadSubscription();\n      this.currentThreadId = null;\n      this.tokenUsage = createEmptyTokenUsage();\n    }\n\n    this.emit({ type: 'thread_deleted', threadId });\n  }\n\n  async renameThread({ title }: { title: string }): Promise<void> {\n    if (!this.currentThreadId || !this.config.storage) return;\n\n    const memoryStorage = await this.getMemoryStorage();\n    const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n    if (thread) {\n      await memoryStorage.saveThread({\n        thread: { ...thread, title, updatedAt: new Date() },\n      });\n    }\n  }\n\n  async cloneThread({\n    sourceThreadId,\n    title,\n    resourceId,\n  }: {\n    sourceThreadId?: string;\n    title?: string;\n    resourceId?: string;\n  } = {}): Promise<HarnessThread> {\n    const sourceId = sourceThreadId ?? this.currentThreadId;\n    if (!sourceId) {\n      throw new Error('No source thread to clone');\n    }\n    if (!this.config.memory) {\n      throw new Error('Memory is not configured on this Harness');\n    }\n\n    const memory = await this.resolveMemory();\n\n    const result = await memory.cloneThread({\n      sourceThreadId: sourceId,\n      resourceId: resourceId ?? this.resourceId,\n      title,\n    });\n\n    const clonedThread: HarnessThread = {\n      id: result.thread.id,\n      resourceId: result.thread.resourceId,\n      title: result.thread.title ?? 'Cloned Thread',\n      createdAt: result.thread.createdAt,\n      updatedAt: result.thread.updatedAt,\n      metadata: result.thread.metadata,\n    };\n\n    // Acquire lock on new thread before releasing old one\n    const oldThreadId = this.currentThreadId;\n    if (this.config.threadLock) {\n      try {\n        await this.config.threadLock.acquire(clonedThread.id);\n      } catch (err) {\n        if (oldThreadId) {\n          try {\n            await this.config.threadLock.acquire(oldThreadId);\n          } catch {\n            // Best-effort re-acquire; original error is more important\n          }\n        }\n        throw err;\n      }\n      if (oldThreadId) {\n        await this.config.threadLock.release(oldThreadId);\n      }\n    }\n\n    this.cleanupAgentThreadSubscription();\n    this.currentThreadId = clonedThread.id;\n    await this.loadThreadMetadata();\n    this.tokenUsage = createEmptyTokenUsage();\n    this.emit({ type: 'thread_created', thread: clonedThread });\n    await this.ensureCurrentAgentThreadSubscription();\n\n    return clonedThread;\n  }\n\n  async switchThread({ threadId }: { threadId: string }): Promise<void> {\n    this.abort();\n    this.cleanupAgentThreadSubscription();\n\n    // Acquire lock on new thread before releasing old one.\n    // Lock operations must be adjacent (no intermediate awaits) so callers\n    // can rely on a single microtask tick to observe both acquire and release.\n    await this.config.threadLock?.acquire(threadId);\n    const previousThreadId = this.currentThreadId;\n    if (previousThreadId) {\n      await this.config.threadLock?.release(previousThreadId);\n    }\n\n    if (this.config.storage) {\n      const memoryStorage = await this.getMemoryStorage();\n      const thread = await memoryStorage.getThreadById({ threadId });\n      if (!thread) {\n        throw new Error(`Thread not found: ${threadId}`);\n      }\n    }\n\n    this.currentThreadId = threadId;\n\n    await this.loadThreadMetadata();\n\n    this.emit({ type: 'thread_changed', threadId, previousThreadId });\n    await this.ensureCurrentAgentThreadSubscription();\n  }\n\n  async listThreads(options?: {\n    allResources?: boolean;\n    /**\n     * Include forked subagent fork threads. Defaults to false: forks are\n     * transient clones used by the runtime and should not show up in user-facing\n     * thread lists / pickers / startup flows. Set to true for admin / debug\n     * tooling that needs to see every thread.\n     */\n    includeForkedSubagents?: boolean;\n  }): Promise<HarnessThread[]> {\n    if (!this.config.storage) return [];\n\n    const memoryStorage = await this.getMemoryStorage();\n    const filter: { resourceId?: string } | undefined = options?.allResources\n      ? undefined\n      : { resourceId: this.resourceId };\n\n    const result = await memoryStorage.listThreads({ filter, perPage: false });\n\n    const threads = options?.includeForkedSubagents\n      ? result.threads\n      : result.threads.filter(thread => {\n          const metadata = thread.metadata as Record<string, unknown> | undefined;\n          return metadata?.forkedSubagent !== true;\n        });\n\n    return threads.map((thread: StorageThreadType) => ({\n      id: thread.id,\n      resourceId: thread.resourceId,\n      title: thread.title,\n      createdAt: thread.createdAt,\n      updatedAt: thread.updatedAt,\n      metadata: thread.metadata,\n    }));\n  }\n\n  async setThreadSetting({ key, value }: { key: string; value: unknown }): Promise<void> {\n    if (!this.currentThreadId || !this.config.storage) return;\n\n    try {\n      const memoryStorage = await this.getMemoryStorage();\n      const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n      if (thread) {\n        await memoryStorage.saveThread({\n          thread: {\n            ...thread,\n            metadata: { ...thread.metadata, [key]: value },\n            updatedAt: new Date(),\n          },\n        });\n      }\n    } catch {\n      // Settings persistence is not critical\n    }\n  }\n\n  private async deleteThreadSetting({ key }: { key: string }): Promise<void> {\n    if (!this.currentThreadId || !this.config.storage) return;\n\n    try {\n      const memoryStorage = await this.getMemoryStorage();\n      const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n      if (thread && thread.metadata) {\n        const metadata = { ...thread.metadata };\n        delete metadata[key];\n        await memoryStorage.saveThread({\n          thread: {\n            ...thread,\n            metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n            updatedAt: new Date(),\n          },\n        });\n      }\n    } catch {\n      // Settings removal is not critical\n    }\n  }\n\n  private async loadThreadMetadata(): Promise<void> {\n    if (!this.currentThreadId || !this.config.storage) {\n      this.tokenUsage = createEmptyTokenUsage();\n      return;\n    }\n\n    try {\n      const memoryStorage = await this.getMemoryStorage();\n      const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n\n      // Load token usage\n      const savedUsage = thread?.metadata?.tokenUsage as typeof this.tokenUsage | undefined;\n      if (savedUsage) {\n        this.tokenUsage = {\n          ...createEmptyTokenUsage(),\n          ...savedUsage,\n          promptTokens: savedUsage.promptTokens ?? 0,\n          completionTokens: savedUsage.completionTokens ?? 0,\n          totalTokens: savedUsage.totalTokens ?? 0,\n          cachedInputTokens: savedUsage.cachedInputTokens ?? 0,\n          cacheCreationInputTokens: savedUsage.cacheCreationInputTokens ?? 0,\n        };\n      } else {\n        this.tokenUsage = createEmptyTokenUsage();\n      }\n\n      const meta = thread?.metadata as Record<string, unknown> | undefined;\n      const updates: Record<string, unknown> = {};\n\n      // Restore the saved mode FIRST so we resolve currentModelId for the\n      // correct mode. Otherwise we'd look up modeModelId_<defaultMode> first\n      // and then never overwrite it when the saved mode has no per-mode\n      // override persisted (e.g. user only ever used the mode's default\n      // model), leaving the wrong mode's model active on restart.\n      let previousModeIdForEmit: string | undefined;\n      if (meta?.currentModeId) {\n        const savedModeId = meta.currentModeId as string;\n        const modeExists = this.config.modes.some(m => m.id === savedModeId);\n        if (modeExists && savedModeId !== this.currentModeId) {\n          previousModeIdForEmit = this.currentModeId;\n          this.currentModeId = savedModeId;\n        }\n      }\n\n      // Resolve the model for the (now-restored) current mode.\n      // Order: per-mode thread metadata → mode's defaultModelId → legacy\n      // global currentModelId (set by createThread).\n      const modeModelKey = `modeModelId_${this.currentModeId}`;\n      if (meta?.[modeModelKey]) {\n        updates.currentModelId = meta[modeModelKey];\n      } else {\n        const currentMode = this.config.modes.find(m => m.id === this.currentModeId);\n        if (currentMode?.defaultModelId) {\n          updates.currentModelId = currentMode.defaultModelId;\n        } else if (meta?.currentModelId) {\n          updates.currentModelId = meta.currentModelId;\n        }\n      }\n\n      if (previousModeIdForEmit !== undefined) {\n        this.emit({\n          type: 'mode_changed',\n          modeId: this.currentModeId,\n          previousModeId: previousModeIdForEmit,\n        });\n      }\n\n      // Restore observer/reflector model IDs\n      if (meta?.observerModelId) {\n        updates.observerModelId = meta.observerModelId;\n      }\n      if (meta?.reflectorModelId) {\n        updates.reflectorModelId = meta.reflectorModelId;\n      }\n      const hasObservationThreshold = typeof meta?.observationThreshold === 'number';\n      const hasReflectionThreshold = typeof meta?.reflectionThreshold === 'number';\n\n      if (hasObservationThreshold) {\n        updates.observationThreshold = meta.observationThreshold;\n      }\n      if (hasReflectionThreshold) {\n        updates.reflectionThreshold = meta.reflectionThreshold;\n      }\n\n      if (Object.keys(updates).length > 0) {\n        await this.setState(updates as unknown as Partial<TState>);\n      }\n\n      if (!hasObservationThreshold) {\n        const observationThreshold = this.getObservationThreshold();\n        if (observationThreshold !== undefined) {\n          await this.setThreadSetting({ key: 'observationThreshold', value: observationThreshold });\n        }\n      }\n      if (!hasReflectionThreshold) {\n        const reflectionThreshold = this.getReflectionThreshold();\n        if (reflectionThreshold !== undefined) {\n          await this.setThreadSetting({ key: 'reflectionThreshold', value: reflectionThreshold });\n        }\n      }\n    } catch {\n      this.tokenUsage = createEmptyTokenUsage();\n    }\n  }\n\n  // ===========================================================================\n  // Observational Memory\n  // ===========================================================================\n\n  /**\n   * Load observational memory progress for the current thread.\n   * Reads the OM record and recent messages to reconstruct status,\n   * then emits an `om_status` event for the UI.\n   */\n  async loadOMProgress(): Promise<void> {\n    if (!this.currentThreadId) return;\n\n    try {\n      const memoryStorage = await this.getMemoryStorage();\n      const record = await memoryStorage.getObservationalMemory(this.currentThreadId, this.resourceId);\n\n      if (!record) return;\n\n      const config = record.config as\n        | {\n            observationThreshold?: number | { min: number; max: number };\n            reflectionThreshold?: number | { min: number; max: number };\n          }\n        | undefined;\n\n      const getThreshold = (val: number | { min: number; max: number } | undefined, fallback: number): number => {\n        if (!val) return fallback;\n        if (typeof val === 'number') return val;\n        return val.max;\n      };\n\n      let observationThreshold = getThreshold(config?.observationThreshold, 30_000);\n      let reflectionThreshold = getThreshold(config?.reflectionThreshold, 40_000);\n\n      let messageTokens = record.pendingMessageTokens ?? 0;\n      let observationTokens = record.observationTokenCount ?? 0;\n      let bufferedObs = {\n        status: 'idle' as 'idle' | 'running' | 'complete',\n        chunks: 0,\n        messageTokens: 0,\n        projectedMessageRemoval: 0,\n        observationTokens: 0,\n      };\n      let bufferedRef = {\n        status: 'idle' as 'idle' | 'running' | 'complete',\n        inputObservationTokens: 0,\n        observationTokens: 0,\n      };\n      let generationCount = 0;\n      let stepNumber = 0;\n\n      const messagesResult = await memoryStorage.listMessages({\n        threadId: this.currentThreadId,\n        perPage: 70,\n        page: 0,\n        orderBy: { field: 'createdAt', direction: 'DESC' },\n      });\n      const messages = messagesResult.messages;\n      let foundStatus = false;\n      for (const msg of messages) {\n        if (msg.role !== 'assistant') continue;\n        const content = msg.content as { parts?: Array<{ type?: string; data?: Record<string, unknown> }> } | string;\n        if (typeof content === 'string' || !content?.parts) continue;\n\n        for (let i = content.parts.length - 1; i >= 0; i--) {\n          const part = content.parts[i] as { type?: string; data?: Record<string, unknown> };\n          if (part.type === 'data-om-status' && part.data?.windows) {\n            const w = part.data.windows as Record<string, Record<string, Record<string, unknown>>>;\n            messageTokens = (w.active?.messages?.tokens as number) ?? messageTokens;\n            observationTokens = (w.active?.observations?.tokens as number) ?? observationTokens;\n            const msgThresh = w.active?.messages?.threshold as number | undefined;\n            const obsThresh = w.active?.observations?.threshold as number | undefined;\n            if (msgThresh) observationThreshold = msgThresh;\n            if (obsThresh) reflectionThreshold = obsThresh;\n            const bo = w.buffered?.observations as Record<string, unknown> | undefined;\n            if (bo) {\n              bufferedObs = {\n                status: (bo.status as 'idle' | 'running' | 'complete') ?? 'idle',\n                chunks: (bo.chunks as number) ?? 0,\n                messageTokens: (bo.messageTokens as number) ?? 0,\n                projectedMessageRemoval: (bo.projectedMessageRemoval as number) ?? 0,\n                observationTokens: (bo.observationTokens as number) ?? 0,\n              };\n            }\n            const br = w.buffered?.reflection as Record<string, unknown> | undefined;\n            if (br) {\n              bufferedRef = {\n                status: (br.status as 'idle' | 'running' | 'complete') ?? 'idle',\n                inputObservationTokens: (br.inputObservationTokens as number) ?? 0,\n                observationTokens: (br.observationTokens as number) ?? 0,\n              };\n            }\n            generationCount = (part.data.generationCount as number) ?? 0;\n            stepNumber = (part.data.stepNumber as number) ?? 0;\n            foundStatus = true;\n            break;\n          }\n        }\n        if (foundStatus) break;\n      }\n\n      this.emit({\n        type: 'om_status',\n        windows: {\n          active: {\n            messages: { tokens: messageTokens, threshold: observationThreshold },\n            observations: { tokens: observationTokens, threshold: reflectionThreshold },\n          },\n          buffered: { observations: bufferedObs, reflection: bufferedRef },\n        },\n        recordId: record.id ?? '',\n        threadId: this.currentThreadId,\n        stepNumber,\n        generationCount,\n      });\n    } catch {\n      // OM not available or not initialized — that's fine\n    }\n  }\n\n  async getObservationalMemoryRecord(): Promise<ObservationalMemoryRecord | null> {\n    if (!this.currentThreadId) return null;\n\n    try {\n      const memoryStorage = await this.getMemoryStorage();\n      return await memoryStorage.getObservationalMemory(this.currentThreadId, this.resourceId);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Returns the observer model ID from state, falling back to omConfig defaults.\n   */\n  getObserverModelId(): string | undefined {\n    return (this.state as any).observerModelId ?? this.config.omConfig?.defaultObserverModelId;\n  }\n\n  /**\n   * Returns the reflector model ID from state, falling back to omConfig defaults.\n   */\n  getReflectorModelId(): string | undefined {\n    return (this.state as any).reflectorModelId ?? this.config.omConfig?.defaultReflectorModelId;\n  }\n\n  /**\n   * Returns the observation threshold from state, falling back to omConfig defaults.\n   */\n  getObservationThreshold(): number | undefined {\n    return (this.state as any).observationThreshold ?? this.config.omConfig?.defaultObservationThreshold;\n  }\n\n  /**\n   * Returns the reflection threshold from state, falling back to omConfig defaults.\n   */\n  getReflectionThreshold(): number | undefined {\n    return (this.state as any).reflectionThreshold ?? this.config.omConfig?.defaultReflectionThreshold;\n  }\n\n  /**\n   * Resolves the observer model ID to a language model instance via `resolveModel`.\n   */\n  getResolvedObserverModel() {\n    const modelId = this.getObserverModelId();\n    if (!modelId || !this.config.resolveModel) return undefined;\n    return this.config.resolveModel(modelId);\n  }\n\n  /**\n   * Resolves the reflector model ID to a language model instance via `resolveModel`.\n   */\n  getResolvedReflectorModel() {\n    const modelId = this.getReflectorModelId();\n    if (!modelId || !this.config.resolveModel) return undefined;\n    return this.config.resolveModel(modelId);\n  }\n\n  /**\n   * Switch the Observer model.\n   */\n  async switchObserverModel({ modelId }: { modelId: string }): Promise<void> {\n    void this.setState({ observerModelId: modelId } as unknown as Partial<TState>);\n    await this.setThreadSetting({ key: 'observerModelId', value: modelId });\n    this.emit({ type: 'om_model_changed', role: 'observer', modelId } as HarnessEvent);\n  }\n\n  /**\n   * Switch the Reflector model.\n   */\n  async switchReflectorModel({ modelId }: { modelId: string }): Promise<void> {\n    void this.setState({ reflectorModelId: modelId } as unknown as Partial<TState>);\n    await this.setThreadSetting({ key: 'reflectorModelId', value: modelId });\n    this.emit({ type: 'om_model_changed', role: 'reflector', modelId } as HarnessEvent);\n  }\n\n  // ===========================================================================\n  // Subagent Model Management\n  // ===========================================================================\n\n  getSubagentModelId({ agentType }: { agentType?: string } = {}): string | null {\n    const state = this.state as Record<string, unknown>;\n    if (agentType) {\n      const perType = state[`subagentModelId_${agentType}`];\n      if (typeof perType === 'string') return perType;\n    }\n    const global = state.subagentModelId;\n    return typeof global === 'string' ? global : null;\n  }\n\n  async setSubagentModelId({ modelId, agentType }: { modelId: string; agentType?: string }): Promise<void> {\n    const key = agentType ? `subagentModelId_${agentType}` : 'subagentModelId';\n    void this.setState({ [key]: modelId } as unknown as Partial<TState>);\n    await this.setThreadSetting({ key, value: modelId });\n    this.emit({ type: 'subagent_model_changed', modelId, scope: 'thread', agentType } as HarnessEvent);\n  }\n\n  // ===========================================================================\n  // Permissions\n  // ===========================================================================\n\n  grantSessionCategory({ category }: { category: ToolCategory }): void {\n    this.sessionGrantedCategories.add(category);\n  }\n\n  grantSessionTool({ toolName }: { toolName: string }): void {\n    this.sessionGrantedTools.add(toolName);\n  }\n\n  getSessionGrants(): { categories: ToolCategory[]; tools: string[] } {\n    return {\n      categories: [...this.sessionGrantedCategories] as ToolCategory[],\n      tools: [...this.sessionGrantedTools],\n    };\n  }\n\n  getToolCategory({ toolName }: { toolName: string }): ToolCategory | null {\n    return this.config.toolCategoryResolver?.(toolName) ?? null;\n  }\n\n  setPermissionForCategory({ category, policy }: { category: ToolCategory; policy: PermissionPolicy }): void {\n    const rules = this.getPermissionRules();\n    rules.categories[category] = policy;\n    void this.setState({ permissionRules: rules } as unknown as Partial<TState>);\n  }\n\n  setPermissionForTool({ toolName, policy }: { toolName: string; policy: PermissionPolicy }): void {\n    const rules = this.getPermissionRules();\n    rules.tools[toolName] = policy;\n    void this.setState({ permissionRules: rules } as unknown as Partial<TState>);\n  }\n\n  getPermissionRules(): PermissionRules {\n    const state = this.state as Record<string, unknown>;\n    const rules = state.permissionRules as PermissionRules | undefined;\n    return rules ?? { categories: {}, tools: {} };\n  }\n\n  /**\n   * Resolve whether a tool call should be auto-approved, denied, or asked.\n   * Resolution chain: per-tool deny → yolo → per-tool policy → session tool grant →\n   * session category grant → category policy → \"ask\"\n   */\n  private resolveToolApproval(toolName: string): PermissionPolicy {\n    const state = this.state as Record<string, unknown>;\n    const rules = this.getPermissionRules();\n\n    const toolPolicy = rules.tools[toolName];\n    if (toolPolicy === 'deny') return 'deny';\n\n    if (state.yolo === true) return 'allow';\n\n    if (toolPolicy) return toolPolicy;\n\n    if (this.sessionGrantedTools.has(toolName)) return 'allow';\n\n    const category = this.getToolCategory({ toolName });\n    if (category) {\n      if (this.sessionGrantedCategories.has(category)) return 'allow';\n      const categoryPolicy = rules.categories[category];\n      if (categoryPolicy) return categoryPolicy;\n    }\n\n    return 'ask';\n  }\n\n  // ===========================================================================\n  // Message Handling\n  // ===========================================================================\n\n  private cleanupAgentThreadSubscription(): void {\n    this.agentThreadSubscription?.abort();\n    this.agentThreadSubscription?.unsubscribe();\n    this.agentThreadSubscription = null;\n    this.agentThreadSubscriptionKey = null;\n    this.currentRunId = null;\n    this.currentTraceId = null;\n    this.abortController = null;\n    this.abortRequested = false;\n  }\n\n  private getAgentThreadSubscriptionKey(agent: Agent, threadId: string): string {\n    return `${agent.id}:${this.resourceId}:${threadId}`;\n  }\n\n  private async ensureAgentThreadSubscription(agent: Agent, threadId: string): Promise<void> {\n    const key = this.getAgentThreadSubscriptionKey(agent, threadId);\n    if (this.agentThreadSubscriptionKey === key && this.agentThreadSubscription) return;\n\n    this.cleanupAgentThreadSubscription();\n    const subscription = await agent.subscribeToThread({ resourceId: this.resourceId, threadId });\n    this.agentThreadSubscription = subscription;\n    this.agentThreadSubscriptionKey = key;\n    void this.processSubscribedThreadStream(subscription);\n  }\n\n  private async ensureCurrentAgentThreadSubscription(): Promise<void> {\n    if (!this.currentThreadId) return;\n    await this.ensureAgentThreadSubscription(this.getCurrentAgent(), this.currentThreadId);\n  }\n\n  private async drainFollowUpQueue(options?: { tracingContext?: TracingContext; tracingOptions?: TracingOptions }) {\n    if (this.followUpQueue.length === 0) return;\n\n    const next = this.followUpQueue.shift()!;\n    await this.sendMessage({\n      content: next.content,\n      requestContext: next.requestContext,\n      tracingContext: options?.tracingContext,\n      tracingOptions: options?.tracingOptions,\n    });\n  }\n\n  private isActiveAgentThreadSubscription(subscription: AgentThreadSubscription<any>): boolean {\n    return this.agentThreadSubscription === subscription;\n  }\n\n  private async finishSubscribedStreamRun({\n    suspended,\n    error,\n    aborted,\n  }: {\n    suspended?: boolean;\n    error?: boolean;\n    aborted?: boolean;\n  }): Promise<void> {\n    const reason = error ? 'error' : suspended ? 'suspended' : aborted || this.abortRequested ? 'aborted' : 'complete';\n    this.emit({ type: 'agent_end', reason });\n    this.currentRunId = null;\n    this.currentTraceId = null;\n    this.abortController = null;\n    this.abortRequested = false;\n    await this.drainFollowUpQueue();\n  }\n\n  private async handleSubscribedStreamError(error: unknown): Promise<void> {\n    if (error instanceof Error && error.name === 'AbortError') {\n      this.emit({ type: 'agent_end', reason: 'aborted' });\n    } else {\n      this.emit({ type: 'error', error: error instanceof Error ? error : new Error(String(error)) });\n      this.emit({ type: 'agent_end', reason: 'error' });\n    }\n    this.agentThreadSubscription?.unsubscribe();\n    this.agentThreadSubscription = null;\n    this.agentThreadSubscriptionKey = null;\n    this.currentRunId = null;\n    this.currentTraceId = null;\n    this.abortController = null;\n    this.abortRequested = false;\n    await this.drainFollowUpQueue();\n  }\n\n  private async processSubscribedThreadStream(subscription: AgentThreadSubscription<any>): Promise<void> {\n    const requestContext = await this.buildRequestContext();\n    let currentRun: HarnessStreamState | undefined;\n    let lastFinishedRunId: string | null = null;\n\n    try {\n      for await (const chunk of subscription.stream) {\n        if (!this.isActiveAgentThreadSubscription(subscription)) {\n          subscription.unsubscribe();\n          break;\n        }\n\n        const chunkRunId = 'runId' in chunk ? chunk.runId : null;\n        if (lastFinishedRunId && chunkRunId === lastFinishedRunId) {\n          continue;\n        }\n\n        if (!currentRun) {\n          currentRun = this.createStreamState();\n          this.currentOperationId += 1;\n          this.abortController ??= new AbortController();\n          this.currentRunId = subscription.activeRunId() ?? ('runId' in chunk ? chunk.runId : null);\n          this.currentTraceId = null;\n          this.emit({ type: 'agent_start' });\n        }\n\n        if (chunk.type === 'start') {\n          continue;\n        }\n\n        try {\n          const streamResult = await this.processStreamChunk(currentRun, chunk, requestContext);\n          if (\n            streamResult ||\n            chunk.type === 'finish' ||\n            chunk.type === 'error' ||\n            chunk.type === 'abort' ||\n            chunk.type === 'tool-call-suspended'\n          ) {\n            const finishedRunId: string | null = chunkRunId ?? this.currentRunId;\n            await this.finishSubscribedStreamRun({\n              suspended:\n                chunk.type === 'tool-call-suspended' ||\n                (streamResult ?? this.finishStreamState(currentRun)).suspended ||\n                undefined,\n              error: chunk.type === 'error',\n              aborted: chunk.type === 'abort',\n            });\n            lastFinishedRunId = finishedRunId;\n            currentRun = undefined;\n          }\n        } catch (error) {\n          await this.handleSubscribedStreamError(error);\n          currentRun = undefined;\n        }\n      }\n    } catch (error) {\n      if (this.isActiveAgentThreadSubscription(subscription)) {\n        await this.handleSubscribedStreamError(error);\n      }\n    }\n  }\n\n  /**\n   * Send a signal to the current agent/thread.\n   */\n  sendSignal(\n    input:\n      | AgentSignalInput\n      | {\n          content: AgentSignalContents;\n          tracingContext?: TracingContext;\n          tracingOptions?: TracingOptions;\n          requestContext?: RequestContext;\n        },\n  ): { id: string; type: AgentSignalInput['type']; accepted: Promise<{ accepted: true; runId: string }> } {\n    const { tracingContext, tracingOptions, requestContext: requestContextInput } = 'content' in input ? input : {};\n    const signal = createSignal('content' in input ? { type: 'user-message', contents: input.content } : input);\n    const accepted = Promise.resolve().then(async () => {\n      if (!this.currentThreadId) {\n        const thread = await this.createThread();\n        this.currentThreadId = thread.id;\n      }\n\n      const agent = this.getCurrentAgent();\n      await this.ensureAgentThreadSubscription(agent, this.currentThreadId);\n\n      if (this.agentThreadSubscription?.activeRunId()) {\n        const result = agent.sendSignal(signal, {\n          resourceId: this.resourceId,\n          threadId: this.currentThreadId,\n        });\n        return { accepted: result.accepted, runId: result.runId };\n      }\n\n      this.abortRequested = false;\n      this.abortController ??= new AbortController();\n      const requestContext = await this.buildRequestContext(requestContextInput);\n      const isYolo = (this.state as Record<string, unknown>).yolo === true;\n      const streamOptions: Record<string, unknown> = {\n        memory: { thread: this.currentThreadId, resource: this.resourceId },\n        abortSignal: this.abortController.signal,\n        requestContext,\n        maxSteps: 1000,\n        savePerStep: false,\n        requireToolApproval: !isYolo,\n        modelSettings: { temperature: 1 },\n        ...(tracingContext && { tracingContext }),\n        ...(tracingOptions && { tracingOptions }),\n      };\n      streamOptions.toolsets = await this.buildToolsets(requestContext);\n\n      const result = agent.sendSignal(signal, {\n        resourceId: this.resourceId,\n        threadId: this.currentThreadId,\n        ifIdle: { streamOptions: streamOptions as any },\n      });\n      return { accepted: result.accepted, runId: result.runId };\n    });\n\n    return { id: signal.id, type: signal.type, accepted };\n  }\n\n  /**\n   * Send a message to the current agent.\n   * Streams the response and emits events.\n   */\n  async sendMessage({\n    content,\n    files,\n    tracingContext,\n    tracingOptions,\n    requestContext: requestContextInput,\n  }: {\n    content: string;\n    files?: Array<{ data: string; mediaType: string; filename?: string }>;\n    tracingContext?: TracingContext;\n    tracingOptions?: TracingOptions;\n    requestContext?: RequestContext;\n  }): Promise<void> {\n    let messageInput: AgentSignalContents = content;\n    if (files?.length) {\n      const fileParts = files.map(f => {\n        const isText = f.mediaType.startsWith('text/') || f.mediaType === 'application/json';\n        if (isText) {\n          let textContent = f.data;\n          const base64Match = f.data.match(/^data:[^;]*;base64,(.*)$/);\n          if (base64Match) {\n            try {\n              textContent = Buffer.from(base64Match[1]!, 'base64').toString('utf-8');\n            } catch {\n              // Fall through with raw data\n            }\n          }\n          const label = f.filename ? `[File: ${f.filename}]` : '[Attached file]';\n          return { type: 'text' as const, text: `${label}\\n\\`\\`\\`\\n${textContent}\\n\\`\\`\\`` };\n        }\n        return {\n          type: 'file' as const,\n          data: f.data,\n          mediaType: f.mediaType,\n          ...(f.filename ? { filename: f.filename } : {}),\n        };\n      });\n      messageInput = [{ type: 'text', text: content }, ...fileParts];\n    }\n\n    const wasActive = this.isCurrentThreadStreamActive();\n    let emittedAgentEnd = false;\n    const unsubscribeAgentEnd = wasActive\n      ? undefined\n      : this.subscribe(event => {\n          if (event.type === 'agent_end') emittedAgentEnd = true;\n        });\n    const signal = this.sendSignal({\n      content: messageInput,\n      tracingContext,\n      tracingOptions,\n      requestContext: requestContextInput,\n    });\n    await signal.accepted;\n    if (!wasActive) {\n      await new Promise(resolve => setTimeout(resolve, 0));\n      await this.waitForCurrentThreadStreamIdle();\n      unsubscribeAgentEnd?.();\n      if (!emittedAgentEnd && !this.pendingSuspensionRunId) {\n        this.emit({ type: 'agent_end', reason: 'complete' });\n      }\n    }\n    return;\n  }\n\n  async listMessages(options?: { limit?: number }): Promise<HarnessMessage[]> {\n    if (!this.currentThreadId) return [];\n    return this.listMessagesForThread({ threadId: this.currentThreadId, limit: options?.limit });\n  }\n\n  async saveSystemReminderMessage({\n    message,\n    reminderType,\n    role = 'user',\n    metadata,\n  }: {\n    message: string;\n    reminderType: string;\n    role?: 'user' | 'assistant' | 'system';\n    metadata?: Record<string, unknown>;\n  }): Promise<HarnessMessage | null> {\n    if (!this.currentThreadId || !this.config.storage) return null;\n\n    const memoryStorage = await this.getMemoryStorage();\n    const dbMessage = {\n      id: randomUUID(),\n      role,\n      threadId: this.currentThreadId,\n      resourceId: this.resourceId,\n      createdAt: new Date(),\n      content: {\n        format: 2 as const,\n        parts: [],\n        content: '',\n        metadata: {\n          systemReminder: {\n            type: reminderType,\n            message,\n            ...metadata,\n          },\n        },\n      },\n    };\n\n    const result = await memoryStorage.saveMessages({ messages: [dbMessage] });\n    const saved = result.messages[0] ?? dbMessage;\n    return this.convertToHarnessMessage(saved);\n  }\n\n  async listMessagesForThread({ threadId, limit }: { threadId: string; limit?: number }): Promise<HarnessMessage[]> {\n    if (!this.config.storage) return [];\n\n    const memoryStorage = await this.getMemoryStorage();\n\n    if (limit) {\n      const result = await memoryStorage.listMessages({\n        threadId,\n        perPage: limit,\n        page: 0,\n        orderBy: { field: 'createdAt', direction: 'DESC' },\n      });\n      return result.messages.map(msg => this.convertToHarnessMessage(msg)).reverse();\n    }\n\n    const result = await memoryStorage.listMessages({ threadId, perPage: false });\n    return result.messages.map(msg => this.convertToHarnessMessage(msg));\n  }\n\n  async getFirstUserMessageForThread({ threadId }: { threadId: string }): Promise<HarnessMessage | null> {\n    const messages = await this.getFirstUserMessagesForThreads({ threadIds: [threadId] });\n    return messages.get(threadId) ?? null;\n  }\n\n  async getFirstUserMessagesForThreads({ threadIds }: { threadIds: string[] }): Promise<Map<string, HarnessMessage>> {\n    if (!this.config.storage || threadIds.length === 0) return new Map();\n\n    const memoryStorage = await this.getMemoryStorage();\n    const result = await memoryStorage.listMessages({\n      threadId: threadIds,\n      perPage: false,\n      orderBy: { field: 'createdAt', direction: 'ASC' },\n    });\n\n    const firstUserMessages = new Map<string, HarnessMessage>();\n    for (const message of result.messages) {\n      if (message.role !== 'user' || !message.threadId || firstUserMessages.has(message.threadId)) continue;\n      firstUserMessages.set(message.threadId, this.convertToHarnessMessage(message));\n\n      if (firstUserMessages.size === threadIds.length) {\n        break;\n      }\n    }\n\n    return firstUserMessages;\n  }\n\n  private convertToHarnessMessage(msg: {\n    id: string;\n    role: 'user' | 'assistant' | 'system' | 'signal';\n    createdAt: Date;\n    content: {\n      content?: string;\n      parts: Array<{\n        type: string;\n        text?: string;\n        reasoning?: string;\n        toolCallId?: string;\n        toolName?: string;\n        args?: unknown;\n        result?: unknown;\n        isError?: boolean;\n        toolInvocation?: {\n          state: string;\n          toolCallId: string;\n          toolName: string;\n          args?: unknown;\n          result?: unknown;\n          isError?: boolean;\n        };\n        [key: string]: unknown;\n      }>;\n      metadata?: Record<string, unknown>;\n    };\n  }): HarnessMessage {\n    const content: HarnessMessageContent[] = [];\n    const systemReminder = getRecordValue(msg.content.metadata?.systemReminder);\n\n    if (systemReminder && typeof systemReminder.type === 'string') {\n      const reminder = toSystemReminderContent({\n        ...systemReminder,\n        contents: typeof systemReminder.message === 'string' ? systemReminder.message : '',\n        reminderType: systemReminder.type,\n      });\n      if (reminder) {\n        content.push(reminder);\n      }\n\n      return {\n        id: msg.id,\n        role: msg.role === 'signal' ? 'user' : msg.role,\n        content,\n        createdAt: msg.createdAt,\n      };\n    }\n\n    if (msg.role === 'signal') {\n      const signal = mastraDBMessageToSignal(msg as MastraDBMessage);\n\n      if (signal.type === 'user-message') {\n        const signalContent = signalContentsToHarnessContent(signal.contents);\n        if (signalContent.length > 0) {\n          return {\n            id: msg.id,\n            role: 'user',\n            content: signalContent,\n            createdAt: msg.createdAt,\n          };\n        }\n      }\n\n      if (signal.type === 'system-reminder') {\n        const reminder = toSystemReminderContent({\n          type: signal.type,\n          contents:\n            typeof signal.contents === 'string'\n              ? signal.contents\n              : signal.contents\n                  .filter((p): p is { type: 'text'; text: string } => p.type === 'text')\n                  .map(p => p.text)\n                  .join('\\n'),\n          attributes: signal.attributes ?? msg.content.metadata,\n          metadata: signal.metadata,\n        });\n        if (reminder) {\n          content.push(reminder);\n        }\n\n        return {\n          id: msg.id,\n          role: 'user',\n          content,\n          createdAt: msg.createdAt,\n        };\n      }\n    }\n\n    for (const part of msg.content.parts) {\n      switch (part.type) {\n        case 'text':\n          if (part.text) {\n            content.push({ type: 'text', text: part.text });\n          }\n          break;\n        case 'reasoning':\n          if (part.reasoning) {\n            content.push({ type: 'thinking', thinking: part.reasoning });\n          }\n          break;\n        case 'tool-invocation':\n          if (part.toolInvocation) {\n            const inv = part.toolInvocation;\n            content.push({ type: 'tool_call', id: inv.toolCallId, name: inv.toolName, args: inv.args });\n            if (inv.state === 'result' && inv.result !== undefined) {\n              const partProviderMetadata = part.providerMetadata as Record<string, unknown> | undefined;\n              content.push({\n                type: 'tool_result',\n                id: inv.toolCallId,\n                name: inv.toolName,\n                result: inv.result,\n                isError: inv.isError ?? false,\n                ...(partProviderMetadata ? { providerMetadata: partProviderMetadata } : {}),\n              });\n            }\n          } else if (part.toolCallId && part.toolName) {\n            content.push({ type: 'tool_call', id: part.toolCallId, name: part.toolName, args: part.args });\n          }\n          break;\n        case 'tool-call':\n          if (part.toolCallId && part.toolName) {\n            content.push({ type: 'tool_call', id: part.toolCallId, name: part.toolName, args: part.args });\n          }\n          break;\n        case 'tool-result':\n          if (part.toolCallId && part.toolName) {\n            const resultProviderMetadata = part.providerMetadata as Record<string, unknown> | undefined;\n            content.push({\n              type: 'tool_result',\n              id: part.toolCallId,\n              name: part.toolName,\n              result: part.result,\n              isError: part.isError ?? false,\n              ...(resultProviderMetadata ? { providerMetadata: resultProviderMetadata } : {}),\n            });\n          }\n          break;\n        case 'data-om-observation-start': {\n          const data = (part as { data?: Record<string, unknown> }).data ?? {};\n          content.push({\n            type: 'om_observation_start',\n            tokensToObserve: (data.tokensToObserve as number) ?? 0,\n            operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n          });\n          break;\n        }\n        case 'data-om-observation-end': {\n          const data = (part as { data?: Record<string, unknown> }).data ?? {};\n          content.push({\n            type: 'om_observation_end',\n            tokensObserved: (data.tokensObserved as number) ?? 0,\n            observationTokens: (data.observationTokens as number) ?? 0,\n            durationMs: (data.durationMs as number) ?? 0,\n            operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n            observations: (data.observations as string) ?? undefined,\n            currentTask: (data.currentTask as string) ?? undefined,\n            suggestedResponse: (data.suggestedResponse as string) ?? undefined,\n          });\n          break;\n        }\n        case 'data-om-observation-failed': {\n          const data = (part as { data?: Record<string, unknown> }).data ?? {};\n          content.push({\n            type: 'om_observation_failed',\n            error: (data.error as string) ?? 'Unknown error',\n            tokensAttempted: (data.tokensAttempted as number) ?? 0,\n            operationType: (data.operationType as 'observation' | 'reflection') ?? 'observation',\n          });\n          break;\n        }\n        case 'data-user-message': {\n          const data = (part as { data?: Record<string, unknown> }).data ?? {};\n          const message = toUserSignalMessage(data);\n          if (message) {\n            content.push(...message.content);\n          }\n          break;\n        }\n        case 'data-system-reminder': {\n          const data = (part as { data?: Record<string, unknown> }).data ?? {};\n          const reminder = toSystemReminderContent(data);\n          if (reminder) {\n            content.push(reminder);\n          }\n          break;\n        }\n        case 'file':\n          if (typeof part.data !== 'string') {\n            console.warn('[Harness] Skipping file part with non-string data:', typeof part.data);\n            break;\n          }\n          content.push({\n            type: 'file',\n            data: part.data,\n            mediaType:\n              (part as { mediaType?: string }).mediaType ??\n              (part as { mimeType?: string }).mimeType ??\n              'application/octet-stream',\n            ...((part as { filename?: string }).filename ? { filename: (part as { filename?: string }).filename } : {}),\n          });\n          break;\n        case 'image': {\n          const imgData =\n            typeof part.data === 'string'\n              ? part.data\n              : typeof (part as { image?: string }).image === 'string'\n                ? (part as { image?: string }).image!\n                : '';\n          content.push({\n            type: 'image',\n            data: imgData,\n            mimeType:\n              (part as { mimeType?: string }).mimeType ?? (part as { mediaType?: string }).mediaType ?? 'image/png',\n          });\n          break;\n        }\n        case 'data-om-thread-update': {\n          const data = (part as { data?: Record<string, unknown> }).data ?? {};\n          if (data.newTitle) {\n            content.push({\n              type: 'om_thread_title_updated',\n              threadId: (data.threadId as string) ?? '',\n              oldTitle: (data.oldTitle as string) ?? undefined,\n              newTitle: data.newTitle as string,\n            });\n          }\n          break;\n        }\n        // Skip other part types (step-start, data-om-status, etc.)\n      }\n    }\n\n    return { id: msg.id, role: msg.role === 'signal' ? 'user' : msg.role, content, createdAt: msg.createdAt };\n  }\n\n  /**\n   * Process a stream response (shared between sendMessage and tool approval).\n   */\n  private createStreamState(): HarnessStreamState {\n    return {\n      currentMessage: {\n        id: this.generateId(),\n        role: 'assistant',\n        content: [],\n        createdAt: new Date(),\n      },\n      isSuspended: false,\n      textContentById: new Map<string, { index: number; text: string }>(),\n      thinkingContentById: new Map<string, { index: number; text: string }>(),\n    };\n  }\n\n  private abortForOmFailure({ operationType, stage, error }: { operationType: string; stage: string; error: string }) {\n    this.emit({\n      type: 'error',\n      error: new Error(`Observational memory ${operationType} ${stage} failed: ${error}`),\n    });\n    this.abort();\n  }\n\n  private async processStream(\n    response: { fullStream: AsyncIterable<any> },\n    requestContextInput?: RequestContext,\n  ): Promise<{ message: HarnessMessage; suspended?: boolean } | undefined> {\n    const state = this.createStreamState();\n    const requestContext = await this.buildRequestContext(requestContextInput);\n    this.currentOperationId += 1;\n    this.emit({ type: 'agent_start' });\n\n    let result: { message: HarnessMessage; suspended?: boolean } | undefined;\n    let error = false;\n    let aborted = false;\n\n    for await (const chunk of response.fullStream) {\n      result = await this.processStreamChunk(state, chunk, requestContext);\n      if (chunk.type === 'error') {\n        error = true;\n      }\n      if (chunk.type === 'abort') {\n        aborted = true;\n      }\n      if (\n        result ||\n        chunk.type === 'finish' ||\n        chunk.type === 'error' ||\n        chunk.type === 'abort' ||\n        chunk.type === 'tool-call-suspended' ||\n        this.abortRequested\n      ) {\n        result ??= this.finishStreamState(state);\n        break;\n      }\n    }\n\n    result ??= this.finishStreamState(state);\n    this.emit({\n      type: 'agent_end',\n      reason: error\n        ? 'error'\n        : result.suspended\n          ? 'suspended'\n          : aborted || this.abortRequested\n            ? 'aborted'\n            : 'complete',\n    });\n\n    this.currentRunId = null;\n    this.currentTraceId = null;\n    this.abortController = null;\n    this.abortRequested = false;\n    await this.drainFollowUpQueue();\n\n    return result;\n  }\n\n  private async processStreamChunk(\n    state: HarnessStreamState,\n    chunk: any,\n    requestContext: RequestContext,\n  ): Promise<{ message: HarnessMessage; suspended?: boolean } | undefined> {\n    if ('runId' in chunk && chunk.runId) {\n      this.currentRunId = chunk.runId;\n    }\n\n    switch (chunk.type) {\n      case 'text-start': {\n        const textIndex = state.currentMessage.content.length;\n        state.currentMessage.content.push({ type: 'text', text: '' });\n        state.textContentById.set(chunk.payload.id, { index: textIndex, text: '' });\n        this.emit({ type: 'message_start', message: { ...state.currentMessage } });\n        break;\n      }\n\n      case 'text-delta': {\n        const textState = state.textContentById.get(chunk.payload.id);\n        if (textState) {\n          textState.text += chunk.payload.text;\n          const textContent = state.currentMessage.content[textState.index];\n          if (textContent && textContent.type === 'text') {\n            textContent.text = textState.text;\n          }\n          this.emit({ type: 'message_update', message: { ...state.currentMessage } });\n        }\n        break;\n      }\n\n      case 'reasoning-start': {\n        const thinkingIndex = state.currentMessage.content.length;\n        state.currentMessage.content.push({ type: 'thinking', thinking: '' });\n        state.thinkingContentById.set(chunk.payload.id, { index: thinkingIndex, text: '' });\n        this.emit({ type: 'message_update', message: { ...state.currentMessage } });\n        break;\n      }\n\n      case 'reasoning-delta': {\n        const thinkingState = state.thinkingContentById.get(chunk.payload.id);\n        if (thinkingState) {\n          thinkingState.text += chunk.payload.text;\n          const thinkingContent = state.currentMessage.content[thinkingState.index];\n          if (thinkingContent && thinkingContent.type === 'thinking') {\n            thinkingContent.thinking = thinkingState.text;\n          }\n          this.emit({ type: 'message_update', message: { ...state.currentMessage } });\n        }\n        break;\n      }\n\n      case 'tool-call-input-streaming-start': {\n        const { toolCallId, toolName } = chunk.payload;\n        this.emit({ type: 'tool_input_start', toolCallId, toolName });\n        break;\n      }\n\n      case 'tool-call-delta': {\n        const { toolCallId, argsTextDelta, toolName } = chunk.payload;\n        const transform = getTransformedToolPayload(chunk.metadata, 'display', 'input-delta');\n        if (!transform?.suppress) {\n          this.emit({\n            type: 'tool_input_delta',\n            toolCallId,\n            argsTextDelta: hasTransformedToolPayload(transform) ? transform.transformed : argsTextDelta,\n            toolName,\n          });\n        }\n        break;\n      }\n\n      case 'tool-call-input-streaming-end': {\n        const { toolCallId } = chunk.payload;\n        this.emit({ type: 'tool_input_end', toolCallId });\n        break;\n      }\n\n      case 'tool-call': {\n        const toolCall = chunk.payload;\n        const args = getDisplayTransform(chunk.metadata, 'input-available', toolCall.args);\n        state.currentMessage.content.push({\n          type: 'tool_call',\n          id: toolCall.toolCallId,\n          name: toolCall.toolName,\n          args,\n        });\n        this.emit({\n          type: 'tool_start',\n          toolCallId: toolCall.toolCallId,\n          toolName: toolCall.toolName,\n          args,\n        });\n        this.emit({ type: 'message_update', message: { ...state.currentMessage } });\n        break;\n      }\n\n      case 'tool-result': {\n        const toolResult = chunk.payload;\n        const providerMetadata = toolResult.providerMetadata as Record<string, unknown> | undefined;\n        const result = getDisplayTransform(chunk.metadata, 'output-available', toolResult.result);\n        state.currentMessage.content.push({\n          type: 'tool_result',\n          id: toolResult.toolCallId,\n          name: toolResult.toolName,\n          result,\n          isError: toolResult.isError ?? false,\n          ...(providerMetadata ? { providerMetadata } : {}),\n        });\n        this.emit({\n          type: 'tool_end',\n          toolCallId: toolResult.toolCallId,\n          result,\n          isError: toolResult.isError ?? false,\n          ...(providerMetadata ? { providerMetadata } : {}),\n        });\n        this.emit({ type: 'message_update', message: { ...state.currentMessage } });\n        break;\n      }\n\n      case 'tool-error': {\n        const toolError = chunk.payload;\n        this.emit({\n          type: 'tool_end',\n          toolCallId: toolError.toolCallId,\n          result: getDisplayTransform(chunk.metadata, 'error', toolError.error),\n          isError: true,\n        });\n        break;\n      }\n\n      case 'tool-call-approval': {\n        const toolCallId = chunk.payload.toolCallId;\n        const toolName = chunk.payload.toolName;\n        const approvalTransform = getTransformedToolPayload(chunk.metadata, 'display', 'approval');\n        const toolArgs = hasTransformedToolPayload(approvalTransform)\n          ? approvalTransform.transformed\n          : getDisplayTransform(chunk.metadata, 'input-available', chunk.payload.args);\n\n        const policy = this.resolveToolApproval(toolName);\n\n        if (policy === 'allow') {\n          await this.handleToolApprove({ toolCallId, requestContext });\n          break;\n        }\n\n        if (policy === 'deny') {\n          await this.handleToolDecline({ toolCallId, requestContext });\n          break;\n        }\n\n        this.pendingApprovalToolName = toolName;\n        this.emit({ type: 'tool_approval_required', toolCallId, toolName, args: toolArgs });\n\n        const approval = await new Promise<{ decision: 'approve' | 'decline'; requestContext?: RequestContext }>(\n          resolve => {\n            this.pendingApprovalResolve = resolve;\n          },\n        );\n        this.pendingApprovalToolName = null;\n\n        if (approval.decision === 'approve') {\n          await this.handleToolApprove({ toolCallId, requestContext: approval.requestContext ?? requestContext });\n        } else {\n          await this.handleToolDecline({ toolCallId, requestContext: approval.requestContext ?? requestContext });\n        }\n        break;\n      }\n\n      case 'tool-call-suspended': {\n        const suspToolCallId = chunk.payload.toolCallId;\n        const suspToolName = chunk.payload.toolName;\n        const suspArgs = getDisplayTransform(chunk.metadata, 'input-available', chunk.payload.args);\n        const suspPayload = getDisplayTransform(chunk.metadata, 'suspend', chunk.payload.suspendPayload);\n        const suspResumeSchema = chunk.payload.resumeSchema;\n\n        this.emit({\n          type: 'tool_suspended',\n          toolCallId: suspToolCallId,\n          toolName: suspToolName,\n          args: suspArgs,\n          suspendPayload: suspPayload,\n          resumeSchema: suspResumeSchema,\n        });\n\n        this.pendingSuspensionRunId = this.currentRunId;\n        this.pendingSuspensionToolCallId = suspToolCallId;\n\n        state.isSuspended = true;\n        break;\n      }\n\n      case 'error': {\n        const streamError =\n          chunk.payload.error instanceof Error ? chunk.payload.error : new Error(String(chunk.payload.error));\n        this.emit({ type: 'error', error: streamError });\n        break;\n      }\n\n      case 'step-finish': {\n        const usage = chunk.payload?.output?.usage;\n        if (usage) {\n          const usageRecord = usage as Record<string, unknown>;\n          const promptTokens =\n            getUsageNumber(usageRecord, 'promptTokens') ?? getUsageNumber(usageRecord, 'inputTokens') ?? 0;\n          const completionTokens =\n            getUsageNumber(usageRecord, 'completionTokens') ?? getUsageNumber(usageRecord, 'outputTokens') ?? 0;\n          const totalTokens = getUsageNumber(usageRecord, 'totalTokens') ?? promptTokens + completionTokens;\n          const stepUsage: TokenUsage = {\n            promptTokens,\n            completionTokens,\n            totalTokens,\n          };\n          addOptionalUsageField(stepUsage, 'reasoningTokens', getUsageNumber(usageRecord, 'reasoningTokens'));\n          addOptionalUsageField(stepUsage, 'cachedInputTokens', getUsageNumber(usageRecord, 'cachedInputTokens'));\n          addOptionalUsageField(\n            stepUsage,\n            'cacheCreationInputTokens',\n            getUsageNumber(usageRecord, 'cacheCreationInputTokens'),\n          );\n          if (usageRecord.raw !== undefined) {\n            stepUsage.raw = usageRecord.raw;\n          }\n\n          this.tokenUsage.promptTokens += promptTokens;\n          this.tokenUsage.completionTokens += completionTokens;\n          this.tokenUsage.totalTokens += totalTokens;\n          addOptionalUsageField(this.tokenUsage, 'reasoningTokens', stepUsage.reasoningTokens);\n          addOptionalUsageField(this.tokenUsage, 'cachedInputTokens', stepUsage.cachedInputTokens);\n          addOptionalUsageField(this.tokenUsage, 'cacheCreationInputTokens', stepUsage.cacheCreationInputTokens);\n          if (stepUsage.raw !== undefined) {\n            this.tokenUsage.raw = stepUsage.raw;\n          }\n\n          this.persistTokenUsage().catch(() => {});\n          this.emit({ type: 'usage_update', usage: stepUsage });\n        }\n        break;\n      }\n\n      case 'finish': {\n        const finishReason = chunk.payload.stepResult?.reason;\n        if (finishReason === 'stop' || finishReason === 'end-turn') {\n          state.currentMessage.stopReason = 'complete';\n        } else if (finishReason === 'tool-calls') {\n          state.currentMessage.stopReason = 'tool_use';\n        } else {\n          state.currentMessage.stopReason = 'complete';\n        }\n        break;\n      }\n\n      // Observational Memory data parts\n      // NOTE: OM data parts arrive as { type, data: { ... } } — NOT { type, payload }\n      case 'data-om-status': {\n        const d = (chunk as any).data as Record<string, any> | undefined;\n        if (d?.windows) {\n          const w = d.windows;\n          const active = w.active ?? {};\n          const msgs = active.messages ?? {};\n          const obs = active.observations ?? {};\n          const buffObs = w.buffered?.observations ?? {};\n          const buffRef = w.buffered?.reflection ?? {};\n\n          this.emit({\n            type: 'om_status',\n            windows: {\n              active: {\n                messages: { tokens: msgs.tokens ?? 0, threshold: msgs.threshold ?? 0 },\n                observations: { tokens: obs.tokens ?? 0, threshold: obs.threshold ?? 0 },\n              },\n              buffered: {\n                observations: {\n                  status: buffObs.status ?? 'idle',\n                  chunks: buffObs.chunks ?? 0,\n                  messageTokens: buffObs.messageTokens ?? 0,\n                  projectedMessageRemoval: buffObs.projectedMessageRemoval ?? 0,\n                  observationTokens: buffObs.observationTokens ?? 0,\n                },\n                reflection: {\n                  status: buffRef.status ?? 'idle',\n                  inputObservationTokens: buffRef.inputObservationTokens ?? 0,\n                  observationTokens: buffRef.observationTokens ?? 0,\n                },\n              },\n            },\n            recordId: d.recordId ?? '',\n            threadId: d.threadId ?? '',\n            stepNumber: d.stepNumber ?? 0,\n            generationCount: d.generationCount ?? 0,\n          });\n        }\n        break;\n      }\n      case 'data-om-observation-start': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload && payload.cycleId) {\n          if (payload.operationType === 'observation') {\n            this.emit({\n              type: 'om_observation_start',\n              cycleId: payload.cycleId,\n              operationType: payload.operationType,\n              tokensToObserve: payload.tokensToObserve ?? 0,\n            });\n          } else if (payload.operationType === 'reflection') {\n            this.emit({\n              type: 'om_reflection_start',\n              cycleId: payload.cycleId,\n              tokensToReflect: payload.tokensToObserve ?? 0,\n            });\n          }\n        }\n        break;\n      }\n      case 'data-om-observation-end': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload && payload.cycleId) {\n          if (payload.operationType === 'reflection') {\n            this.emit({\n              type: 'om_reflection_end',\n              cycleId: payload.cycleId,\n              durationMs: payload.durationMs ?? 0,\n              compressedTokens: payload.observationTokens ?? 0,\n              observations: payload.observations,\n            });\n          } else {\n            this.emit({\n              type: 'om_observation_end',\n              cycleId: payload.cycleId,\n              durationMs: payload.durationMs ?? 0,\n              tokensObserved: payload.tokensObserved ?? 0,\n              observationTokens: payload.observationTokens ?? 0,\n              observations: payload.observations,\n              currentTask: payload.currentTask,\n              suggestedResponse: payload.suggestedResponse,\n            });\n          }\n        }\n        break;\n      }\n      case 'data-om-observation-failed': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload) {\n          const operationType = payload.operationType === 'reflection' ? 'reflection' : 'observation';\n          const error = payload.error ?? 'Unknown error';\n\n          if (operationType === 'reflection') {\n            this.emit({\n              type: 'om_reflection_failed',\n              cycleId: payload.cycleId ?? 'unknown',\n              error,\n              durationMs: payload.durationMs ?? 0,\n            });\n          } else {\n            this.emit({\n              type: 'om_observation_failed',\n              cycleId: payload.cycleId ?? 'unknown',\n              error,\n              durationMs: payload.durationMs ?? 0,\n            });\n          }\n\n          this.abortForOmFailure({ operationType, stage: 'run', error });\n          return { message: state.currentMessage };\n        }\n        break;\n      }\n      // Async buffering lifecycle\n      case 'data-om-buffering-start': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload && payload.cycleId) {\n          this.emit({\n            type: 'om_buffering_start',\n            cycleId: payload.cycleId,\n            operationType: payload.operationType ?? 'observation',\n            tokensToBuffer: payload.tokensToBuffer ?? 0,\n          });\n        }\n        break;\n      }\n      case 'data-om-buffering-end': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload && payload.cycleId) {\n          this.emit({\n            type: 'om_buffering_end',\n            cycleId: payload.cycleId,\n            operationType: payload.operationType ?? 'observation',\n            tokensBuffered: payload.tokensBuffered ?? 0,\n            bufferedTokens: payload.bufferedTokens ?? 0,\n            observations: payload.observations,\n          });\n        }\n        break;\n      }\n      case 'data-om-buffering-failed': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload) {\n          const operationType = payload.operationType ?? 'observation';\n          const error = payload.error ?? 'Unknown error';\n\n          this.emit({\n            type: 'om_buffering_failed',\n            cycleId: payload.cycleId,\n            operationType,\n            error,\n          });\n\n          this.abortForOmFailure({ operationType, stage: 'buffering', error });\n          return { message: state.currentMessage };\n        }\n        break;\n      }\n      case 'data-user-message': {\n        const payload = (chunk as any).data as Record<string, unknown> | undefined;\n        const message = payload ? toUserSignalMessage(payload) : undefined;\n        if (message) {\n          if (state.currentMessage.content.length > 0) {\n            state.currentMessage.stopReason ??= 'complete';\n            this.emit({ type: 'message_end', message: { ...state.currentMessage } });\n            state.currentMessage = {\n              id: this.generateId(),\n              role: 'assistant',\n              content: [],\n              createdAt: new Date(),\n            };\n            state.textContentById.clear();\n            state.thinkingContentById.clear();\n          }\n          this.emit({ type: 'message_start', message });\n          this.emit({ type: 'message_end', message });\n        }\n        break;\n      }\n      case 'data-system-reminder': {\n        const payload = (chunk as any).data as Record<string, unknown> | undefined;\n        const reminder = payload ? toSystemReminderContent(payload) : undefined;\n        if (reminder) {\n          state.currentMessage.content.push(reminder);\n          this.emit({ type: 'message_update', message: state.currentMessage });\n        }\n        break;\n      }\n      case 'data-om-activation': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload && payload.cycleId) {\n          this.emit({\n            type: 'om_activation',\n            cycleId: payload.cycleId,\n            operationType: payload.operationType ?? 'observation',\n            chunksActivated: payload.chunksActivated ?? 0,\n            tokensActivated: payload.tokensActivated ?? 0,\n            observationTokens: payload.observationTokens ?? 0,\n            messagesActivated: payload.messagesActivated ?? 0,\n            generationCount: payload.generationCount ?? 0,\n            triggeredBy: payload.triggeredBy,\n            lastActivityAt: payload.lastActivityAt,\n            ttlExpiredMs: payload.ttlExpiredMs,\n            activateAfterIdle:\n              typeof payload.config?.activateAfterIdle === 'number' ? payload.config.activateAfterIdle : undefined,\n            previousModel: payload.previousModel,\n            currentModel: payload.currentModel,\n          });\n        }\n        break;\n      }\n      case 'data-om-thread-update': {\n        const payload = (chunk as any).data as Record<string, any> | undefined;\n        if (payload && payload.newTitle) {\n          this.emit({\n            type: 'om_thread_title_updated',\n            cycleId: payload.cycleId ?? 'unknown',\n            threadId: payload.threadId ?? this.currentThreadId ?? 'unknown',\n            oldTitle: payload.oldTitle,\n            newTitle: payload.newTitle,\n          });\n        }\n        break;\n      }\n\n      // Sandbox streaming data chunks (from workspace execute_command tool)\n      case 'data-sandbox-stdout': {\n        const d = (chunk as any).data as Record<string, any> | undefined;\n        if (d?.output && d?.toolCallId) {\n          this.emit({ type: 'shell_output', toolCallId: d.toolCallId, output: d.output, stream: 'stdout' });\n        }\n        break;\n      }\n      case 'data-sandbox-stderr': {\n        const d = (chunk as any).data as Record<string, any> | undefined;\n        if (d?.output && d?.toolCallId) {\n          this.emit({ type: 'shell_output', toolCallId: d.toolCallId, output: d.output, stream: 'stderr' });\n        }\n        break;\n      }\n\n      default:\n        break;\n    }\n  }\n\n  private finishStreamState(state: HarnessStreamState): { message: HarnessMessage; suspended?: boolean } {\n    this.emit({ type: 'message_end', message: state.currentMessage });\n    return { message: state.currentMessage, suspended: state.isSuspended || undefined };\n  }\n\n  // ===========================================================================\n  // Control\n  // ===========================================================================\n\n  /**\n   * Abort the current operation.\n   */\n  abort(): void {\n    this.abortRequested = true;\n    try {\n      this.agentThreadSubscription?.abort();\n    } catch {}\n    if (this.abortController) {\n      try {\n        this.abortController.abort();\n      } catch {}\n      this.abortController = null;\n    }\n  }\n\n  /**\n   * Steer the agent mid-stream: aborts current run and sends a new message.\n   */\n  async steer({ content, requestContext }: { content: string; requestContext?: RequestContext }): Promise<void> {\n    this.abort();\n    this.followUpQueue = [];\n    await this.sendMessage({ content, requestContext });\n  }\n\n  /**\n   * Queue a follow-up message to be processed after the current operation completes.\n   */\n  async followUp({ content, requestContext }: { content: string; requestContext?: RequestContext }): Promise<void> {\n    if (this.isRunning()) {\n      this.followUpQueue.push({ content, requestContext });\n      this.emit({ type: 'follow_up_queued', count: this.followUpQueue.length });\n    } else {\n      await this.sendMessage({ content, requestContext });\n    }\n  }\n\n  getFollowUpCount(): number {\n    return this.followUpQueue.length;\n  }\n\n  isRunning(): boolean {\n    return this.abortController !== null;\n  }\n\n  getCurrentRunId(): string | null {\n    return this.agentThreadSubscription?.activeRunId() ?? this.currentRunId;\n  }\n\n  isCurrentThreadStreamActive(): boolean {\n    return (\n      this.agentThreadSubscription?.activeRunId() !== null && this.agentThreadSubscription?.activeRunId() !== undefined\n    );\n  }\n\n  /**\n   * Resolve once the current thread's stream is fully idle.\n   *\n   * After `abort()` is called the run's status can still be `'running'` for a\n   * few microtasks while the underlying model stream finalizes. Callers that\n   * need to send a fresh signal after an abort (e.g. plan approval → mode\n   * switch → trigger reminder) should await this before calling `sendSignal`\n   * to avoid the new signal being queued onto the dying run, which would then\n   * be drained with the previous run's already-aborted abortSignal.\n   */\n  private async waitForCurrentThreadStreamIdle(): Promise<void> {\n    while (this.isCurrentThreadStreamActive() || this.currentRunId !== null) {\n      await new Promise(resolve => setTimeout(resolve, 0));\n    }\n  }\n\n  getCurrentTraceId(): string | null {\n    return this.currentTraceId;\n  }\n\n  private getSubagentDisplayName(agentType: string): string | undefined {\n    return this.config.subagents?.find(subagent => subagent.id === agentType)?.name;\n  }\n\n  // ===========================================================================\n  // Display State\n  // ===========================================================================\n\n  /**\n   * Returns a read-only snapshot of the canonical display state.\n   * UIs should use this to render instead of building up state from raw events.\n   */\n  getDisplayState(): Readonly<HarnessDisplayState> {\n    return this.displayState;\n  }\n\n  /**\n   * Restore task display state after a UI replays persisted task tool history.\n   * This updates the Harness-owned display snapshot without emitting a live\n   * `task_updated` event, since no task tool just ran.\n   */\n  restoreDisplayTasks(tasks: TaskItemSnapshot[]): void {\n    this.displayState.previousTasks = [...this.displayState.tasks];\n    this.displayState.tasks = [...tasks];\n    this.dispatchDisplayStateChanged(false);\n  }\n\n  /**\n   * Reset display state fields that are scoped to a thread.\n   * Called on thread switch/creation.\n   */\n  private resetThreadDisplayState(): void {\n    this.displayState.activeTools = new Map();\n    this.displayState.toolInputBuffers = new Map();\n    this.displayState.pendingApproval = null;\n    this.displayState.pendingSuspension = null;\n    this.displayState.pendingQuestion = null;\n    this.displayState.pendingPlanApproval = null;\n    this.displayState.activeSubagents = new Map();\n    this.displayState.currentMessage = null;\n    this.displayState.modifiedFiles = new Map();\n    this.displayState.tasks = [];\n    this.displayState.previousTasks = [];\n    this.displayState.omProgress = defaultOMProgressState();\n    this.displayState.bufferingMessages = false;\n    this.displayState.bufferingObservations = false;\n  }\n\n  /**\n   * Respond to a pending tool approval from the UI.\n   * \"always_allow_category\" grants the tool's category for the rest of the session, then approves.\n   */\n  respondToToolApproval({\n    decision,\n    requestContext,\n  }: {\n    decision: 'approve' | 'decline' | 'always_allow_category';\n    requestContext?: RequestContext;\n  }): void {\n    if (!this.pendingApprovalResolve) return;\n\n    if (decision === 'always_allow_category') {\n      const tn = this.pendingApprovalToolName;\n      if (tn) {\n        const category = this.getToolCategory({ toolName: tn });\n        if (category) {\n          this.grantSessionCategory({ category });\n        }\n      }\n      this.pendingApprovalResolve({ decision: 'approve', requestContext });\n    } else {\n      this.pendingApprovalResolve({ decision, requestContext });\n    }\n    this.pendingApprovalResolve = null;\n  }\n\n  /**\n   * Respond to a pending tool suspension from the UI.\n   * Provides resume data so the suspended tool can continue execution.\n   */\n  async respondToToolSuspension({\n    resumeData,\n    requestContext,\n  }: {\n    resumeData: any;\n    requestContext?: RequestContext;\n  }): Promise<void> {\n    if (!this.pendingSuspensionRunId) return;\n\n    try {\n      await this.handleToolResume({\n        resumeData,\n        requestContext,\n      });\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n      this.emit({ type: 'error', error: err });\n      this.emit({ type: 'agent_end', reason: 'error' });\n    }\n  }\n\n  // ===========================================================================\n  // Question & Plan Approval\n  // ===========================================================================\n\n  /**\n   * Register a pending question resolver.\n   * Called by agent tools (e.g., ask_user) to pause execution until the UI responds.\n   */\n  registerQuestion({\n    questionId,\n    resolve,\n  }: {\n    questionId: string;\n    resolve: (answer: HarnessQuestionAnswer) => void;\n  }): void {\n    this.pendingQuestions.set(questionId, resolve);\n  }\n\n  /**\n   * Resolve a pending question with the user's answer.\n   * Called by the UI when the user responds to a question dialog.\n   */\n  respondToQuestion({ questionId, answer }: { questionId: string; answer: HarnessQuestionAnswer }): void {\n    const resolve = this.pendingQuestions.get(questionId);\n    if (resolve) {\n      this.pendingQuestions.delete(questionId);\n      resolve(answer);\n    }\n  }\n\n  /**\n   * Register a pending plan approval resolver.\n   * Called by agent tools (e.g., submit_plan) to pause execution until approval.\n   */\n  registerPlanApproval({\n    planId,\n    resolve,\n  }: {\n    planId: string;\n    resolve: (result: { action: 'approved' | 'rejected'; feedback?: string }) => void;\n  }): void {\n    this.pendingPlanApprovals.set(planId, resolve);\n  }\n\n  /**\n   * Respond to a pending plan approval.\n   * On approval: resolves the suspended plan tool, then switches to the default mode.\n   * On rejection: resolves with feedback (stays in current mode).\n   */\n  async respondToPlanApproval({\n    planId,\n    response,\n  }: {\n    planId: string;\n    response: { action: 'approved' | 'rejected'; feedback?: string };\n  }): Promise<void> {\n    const resolve = this.pendingPlanApprovals.get(planId);\n    if (!resolve) return;\n\n    this.pendingPlanApprovals.delete(planId);\n    resolve(response);\n\n    if (response.action === 'approved') {\n      const defaultMode = this.config.modes.find(m => m.default) ?? this.config.modes[0];\n      if (defaultMode && defaultMode.id !== this.currentModeId) {\n        await new Promise(resolveTimeout => setTimeout(resolveTimeout, 0));\n        await this.switchMode({ modeId: defaultMode.id });\n        // switchMode aborts the in-flight run but does not wait for it to\n        // finalize. If the caller (e.g. mastracode's plan-approval handler)\n        // immediately fires a system-reminder signal, that signal can land in\n        // the dying run's pending queue and later get drained with the run's\n        // already-aborted abortSignal — manifesting as a hang where the agent\n        // never resumes after \"The user has approved the plan, begin\n        // executing.\". Waiting for the stream to be fully idle here ensures\n        // the next sendSignal() always starts a fresh run.\n        await this.waitForCurrentThreadStreamIdle();\n      }\n    }\n  }\n\n  private async handleToolApprove({\n    toolCallId,\n    requestContext: requestContextInput,\n  }: {\n    toolCallId?: string;\n    requestContext?: RequestContext;\n  }): Promise<void> {\n    if (!this.currentRunId) {\n      throw new Error('No active run to approve tool call for');\n    }\n\n    const agent = this.getCurrentAgent();\n\n    if (!this.abortController) {\n      this.abortController = new AbortController();\n    }\n\n    const requestContext = await this.buildRequestContext(requestContextInput);\n    const isYolo = (this.state as Record<string, unknown>).yolo === true;\n    await agent.approveToolCall({\n      runId: this.currentRunId,\n      toolCallId,\n      requireToolApproval: !isYolo,\n      memory: this.currentThreadId ? { thread: this.currentThreadId, resource: this.resourceId } : undefined,\n      abortSignal: this.abortController.signal,\n      requestContext,\n      toolsets: await this.buildToolsets(requestContext),\n    });\n  }\n\n  private async handleToolDecline({\n    toolCallId,\n    requestContext: requestContextInput,\n  }: {\n    toolCallId?: string;\n    requestContext?: RequestContext;\n  }): Promise<void> {\n    if (!this.currentRunId) {\n      throw new Error('No active run to decline tool call for');\n    }\n\n    const agent = this.getCurrentAgent();\n    if (!this.abortController) {\n      this.abortController = new AbortController();\n    }\n\n    const requestContext = await this.buildRequestContext(requestContextInput);\n    const isYolo = (this.state as Record<string, unknown>).yolo === true;\n    await agent.declineToolCall({\n      runId: this.currentRunId,\n      toolCallId,\n      requireToolApproval: !isYolo,\n      memory: this.currentThreadId ? { thread: this.currentThreadId, resource: this.resourceId } : undefined,\n      abortSignal: this.abortController.signal,\n      requestContext,\n      toolsets: await this.buildToolsets(requestContext),\n    });\n  }\n\n  private async handleToolResume({\n    resumeData,\n    requestContext: requestContextInput,\n  }: {\n    resumeData: any;\n    requestContext?: RequestContext;\n  }): Promise<void> {\n    if (!this.pendingSuspensionRunId) {\n      throw new Error('No active suspension to resume');\n    }\n\n    const agent = this.getCurrentAgent();\n\n    if (!this.abortController) {\n      this.abortController = new AbortController();\n    }\n\n    const requestContext = await this.buildRequestContext(requestContextInput);\n    const isYolo = (this.state as Record<string, unknown>).yolo === true;\n    const output = await agent.resumeStream(resumeData, {\n      runId: this.pendingSuspensionRunId,\n      toolCallId: this.pendingSuspensionToolCallId ?? undefined,\n      requireToolApproval: !isYolo,\n      memory: this.currentThreadId ? { thread: this.currentThreadId, resource: this.resourceId } : undefined,\n      abortSignal: this.abortController.signal,\n      requestContext,\n      toolsets: await this.buildToolsets(requestContext),\n    });\n    await this.processStream(output, requestContext);\n\n    this.pendingSuspensionRunId = null;\n    this.pendingSuspensionToolCallId = null;\n  }\n\n  // ===========================================================================\n  // Event System\n  // ===========================================================================\n\n  /**\n   * Subscribe to harness events. Returns an unsubscribe function.\n   */\n  subscribe(listener: HarnessEventListener): () => void {\n    this.listeners.push(listener);\n    return () => {\n      const index = this.listeners.indexOf(listener);\n      if (index !== -1) {\n        this.listeners.splice(index, 1);\n      }\n    };\n  }\n\n  /**\n   * Subscribe to coalesced display state snapshots.\n   *\n   * Use this for UI rendering paths that only need the latest display state.\n   * Raw event consumers should continue to use `subscribe()`.\n   */\n  subscribeDisplayState(\n    listener: HarnessDisplayStateListener,\n    options: HarnessDisplayStateSubscriptionOptions = {},\n  ): () => void {\n    const scheduler = new DisplayStateScheduler(\n      listener,\n      options.windowMs ?? DEFAULT_DISPLAY_STATE_SUBSCRIPTION_OPTIONS.windowMs,\n      options.maxWaitMs ?? DEFAULT_DISPLAY_STATE_SUBSCRIPTION_OPTIONS.maxWaitMs,\n    );\n    this.displayStateSchedulers.add(scheduler);\n\n    return () => {\n      this.displayStateSchedulers.delete(scheduler);\n      scheduler.dispose();\n    };\n  }\n\n  private emit(event: HarnessEvent): void {\n    // Update display state based on the event (before dispatching to listeners)\n    this.applyDisplayStateUpdate(event);\n\n    this.dispatchToListeners(event);\n\n    if (event.type !== 'display_state_changed') {\n      const isCritical = CRITICAL_DISPLAY_STATE_EVENT_TYPES.has(event.type);\n      this.dispatchDisplayStateChanged(isCritical);\n    }\n  }\n\n  private dispatchDisplayStateChanged(isCritical: boolean): void {\n    // After every event, emit display_state_changed so UIs that prefer a single\n    // subscribe-and-render pattern can do so. We dispatch directly to listeners\n    // (not through emit()) to avoid infinite recursion.\n    this.dispatchToListeners({\n      type: 'display_state_changed',\n      displayState: this.displayState,\n    });\n\n    if (this.displayStateSchedulers.size > 0) {\n      for (const scheduler of Array.from(this.displayStateSchedulers)) {\n        scheduler.notify(this.displayState, isCritical);\n      }\n    }\n  }\n\n  private dispatchToListeners(event: HarnessEvent): void {\n    for (const listener of this.listeners) {\n      try {\n        const result = listener(event);\n        if (result && typeof result === 'object' && 'catch' in result) {\n          (result as Promise<void>).catch(err => console.error('Error in harness event listener:', err));\n        }\n      } catch (err) {\n        console.error('Error in harness event listener:', err);\n      }\n    }\n  }\n\n  /**\n   * Apply a display state update based on an incoming event.\n   * This is the centralized state machine that keeps HarnessDisplayState in sync\n   * with every event the Harness emits.\n   */\n  private applyDisplayStateUpdate(event: HarnessEvent): void {\n    const ds = this.displayState;\n\n    switch (event.type) {\n      // ── Agent lifecycle ────────────────────────────────────────────────\n      case 'agent_start':\n        ds.isRunning = true;\n        ds.activeTools = new Map();\n        ds.toolInputBuffers = new Map();\n        ds.currentMessage = null;\n        ds.pendingApproval = null;\n        ds.pendingSuspension = null;\n        break;\n\n      case 'agent_end':\n        ds.isRunning = false;\n        ds.pendingApproval = null;\n        if (event.reason !== 'suspended') {\n          ds.pendingSuspension = null;\n        }\n        ds.pendingQuestion = null;\n        ds.pendingPlanApproval = null;\n        // Mark any still-running tools as errored (handles abort mid-run)\n        for (const [, tool] of ds.activeTools) {\n          if (tool.status === 'running' || tool.status === 'streaming_input') {\n            tool.status = 'error';\n          }\n        }\n        ds.activeSubagents = new Map();\n        break;\n\n      // ── Message streaming ──────────────────────────────────────────────\n      case 'message_start':\n        ds.currentMessage = event.message;\n        break;\n\n      case 'message_update':\n        ds.currentMessage = event.message;\n        break;\n\n      case 'message_end':\n        ds.currentMessage = event.message;\n        break;\n\n      // ── Tool lifecycle ─────────────────────────────────────────────────\n      case 'tool_input_start': {\n        ds.toolInputBuffers.set(event.toolCallId, { text: '', toolName: event.toolName });\n        const existing = ds.activeTools.get(event.toolCallId);\n        if (existing) {\n          existing.status = 'streaming_input';\n        } else {\n          ds.activeTools.set(event.toolCallId, {\n            name: event.toolName,\n            args: {},\n            status: 'streaming_input',\n          });\n        }\n        break;\n      }\n\n      case 'tool_input_delta': {\n        const buf = ds.toolInputBuffers.get(event.toolCallId);\n        if (buf) {\n          buf.text += event.argsTextDelta;\n        }\n        break;\n      }\n\n      case 'tool_input_end':\n        ds.toolInputBuffers.delete(event.toolCallId);\n        break;\n\n      case 'tool_start': {\n        const existingTool = ds.activeTools.get(event.toolCallId);\n        if (existingTool) {\n          existingTool.name = event.toolName;\n          existingTool.args = event.args;\n          existingTool.status = 'running';\n        } else {\n          ds.activeTools.set(event.toolCallId, {\n            name: event.toolName,\n            args: event.args,\n            status: 'running',\n          });\n        }\n        break;\n      }\n\n      case 'tool_update': {\n        const tool = ds.activeTools.get(event.toolCallId);\n        if (tool) {\n          tool.partialResult =\n            typeof event.partialResult === 'string' ? event.partialResult : safeStringify(event.partialResult);\n        }\n        break;\n      }\n\n      case 'tool_end': {\n        const endedTool = ds.activeTools.get(event.toolCallId);\n        if (endedTool) {\n          endedTool.status = event.isError ? 'error' : 'completed';\n          endedTool.result = event.result;\n          endedTool.isError = event.isError;\n        }\n        // Track file modifications\n        if (!event.isError) {\n          const FILE_TOOLS = ['string_replace_lsp', 'write_file', 'ast_smart_edit'];\n          const toolState = ds.activeTools.get(event.toolCallId);\n          if (toolState && FILE_TOOLS.includes(toolState.name)) {\n            const toolArgs = toolState.args as Record<string, unknown>;\n            const filePath = toolArgs?.path as string;\n            if (filePath) {\n              const existing = ds.modifiedFiles.get(filePath);\n              if (existing) {\n                existing.operations.push(toolState.name);\n              } else {\n                ds.modifiedFiles.set(filePath, {\n                  operations: [toolState.name],\n                  firstModified: new Date(),\n                });\n              }\n            }\n          }\n        }\n        break;\n      }\n\n      case 'shell_output': {\n        const shellTool = ds.activeTools.get(event.toolCallId);\n        if (shellTool) {\n          shellTool.shellOutput = (shellTool.shellOutput ?? '') + event.output;\n        }\n        break;\n      }\n\n      case 'tool_approval_required':\n        ds.pendingApproval = {\n          toolCallId: event.toolCallId,\n          toolName: event.toolName,\n          args: event.args,\n        };\n        break;\n\n      case 'tool_suspended':\n        ds.pendingSuspension = {\n          toolCallId: event.toolCallId,\n          toolName: event.toolName,\n          args: event.args,\n          suspendPayload: event.suspendPayload,\n          resumeSchema: event.resumeSchema,\n        };\n        break;\n\n      // ── Interactive prompts ────────────────────────────────────────────\n      case 'ask_question':\n        ds.pendingQuestion = {\n          questionId: event.questionId,\n          question: event.question,\n          options: event.options,\n          selectionMode: event.selectionMode,\n        };\n        break;\n\n      case 'plan_approval_required':\n        ds.pendingPlanApproval = {\n          planId: event.planId,\n          title: event.title,\n          plan: event.plan,\n        };\n        break;\n\n      case 'plan_approved':\n        ds.pendingPlanApproval = null;\n        break;\n\n      // ── Subagent tracking ──────────────────────────────────────────────\n      case 'subagent_start': {\n        const displayName = this.getSubagentDisplayName(event.agentType);\n        ds.activeSubagents.set(event.toolCallId, {\n          agentType: event.agentType,\n          ...(displayName !== undefined ? { displayName } : {}),\n          task: event.task,\n          modelId: event.modelId,\n          forked: event.forked,\n          toolCalls: [],\n          textDelta: '',\n          status: 'running',\n        });\n        break;\n      }\n\n      case 'subagent_text_delta': {\n        const sub = ds.activeSubagents.get(event.toolCallId);\n        if (sub) {\n          sub.textDelta += event.textDelta;\n        }\n        break;\n      }\n\n      case 'subagent_tool_start': {\n        const subAgent = ds.activeSubagents.get(event.toolCallId);\n        if (subAgent) {\n          subAgent.toolCalls.push({ name: event.subToolName, isError: false });\n        }\n        break;\n      }\n\n      case 'subagent_tool_end': {\n        const subTool = ds.activeSubagents.get(event.toolCallId);\n        if (subTool) {\n          const tc = subTool.toolCalls.find(t => t.name === event.subToolName && !t.isError);\n          if (tc) {\n            tc.isError = event.isError;\n          }\n        }\n        break;\n      }\n\n      case 'subagent_end': {\n        const endedSub = ds.activeSubagents.get(event.toolCallId);\n        if (endedSub) {\n          endedSub.status = event.isError ? 'error' : 'completed';\n          endedSub.durationMs = event.durationMs;\n          endedSub.result = event.result;\n        }\n        break;\n      }\n\n      // ── Observational Memory ───────────────────────────────────────────\n      case 'om_status': {\n        const w = event.windows;\n        ds.omProgress.pendingTokens = w.active.messages.tokens;\n        ds.omProgress.threshold = w.active.messages.threshold;\n        ds.omProgress.thresholdPercent =\n          w.active.messages.threshold > 0 ? (w.active.messages.tokens / w.active.messages.threshold) * 100 : 0;\n        ds.omProgress.observationTokens = w.active.observations.tokens;\n        ds.omProgress.reflectionThreshold = w.active.observations.threshold;\n        ds.omProgress.reflectionThresholdPercent =\n          w.active.observations.threshold > 0\n            ? (w.active.observations.tokens / w.active.observations.threshold) * 100\n            : 0;\n        ds.omProgress.buffered = {\n          observations: { ...w.buffered.observations },\n          reflection: { ...w.buffered.reflection },\n        };\n        ds.omProgress.generationCount = event.generationCount;\n        ds.omProgress.stepNumber = event.stepNumber;\n        // Drive buffering animation flags from status fields\n        ds.bufferingMessages = w.buffered.observations.status === 'running';\n        ds.bufferingObservations = w.buffered.reflection.status === 'running';\n        break;\n      }\n\n      case 'om_observation_start':\n        ds.omProgress.status = 'observing';\n        ds.omProgress.cycleId = event.cycleId;\n        ds.omProgress.startTime = Date.now();\n        break;\n\n      case 'om_observation_end':\n        ds.omProgress.status = 'idle';\n        ds.omProgress.cycleId = undefined;\n        ds.omProgress.startTime = undefined;\n        ds.omProgress.observationTokens = event.observationTokens;\n        // Messages have been observed — reset pending tokens\n        ds.omProgress.pendingTokens = 0;\n        ds.omProgress.thresholdPercent = 0;\n        break;\n\n      case 'om_observation_failed':\n        ds.omProgress.status = 'idle';\n        ds.omProgress.cycleId = undefined;\n        ds.omProgress.startTime = undefined;\n        break;\n\n      case 'om_reflection_start':\n        ds.omProgress.status = 'reflecting';\n        ds.omProgress.cycleId = event.cycleId;\n        ds.omProgress.startTime = Date.now();\n        ds.omProgress.preReflectionTokens = ds.omProgress.observationTokens;\n        ds.omProgress.observationTokens = event.tokensToReflect;\n        ds.omProgress.reflectionThresholdPercent =\n          ds.omProgress.reflectionThreshold > 0 ? (event.tokensToReflect / ds.omProgress.reflectionThreshold) * 100 : 0;\n        break;\n\n      case 'om_reflection_end':\n        ds.omProgress.status = 'idle';\n        ds.omProgress.cycleId = undefined;\n        ds.omProgress.startTime = undefined;\n        ds.omProgress.observationTokens = event.compressedTokens;\n        ds.omProgress.reflectionThresholdPercent =\n          ds.omProgress.reflectionThreshold > 0\n            ? (event.compressedTokens / ds.omProgress.reflectionThreshold) * 100\n            : 0;\n        break;\n\n      case 'om_reflection_failed':\n        ds.omProgress.status = 'idle';\n        ds.omProgress.cycleId = undefined;\n        ds.omProgress.startTime = undefined;\n        break;\n\n      case 'om_buffering_start':\n        if (event.operationType === 'observation') {\n          ds.bufferingMessages = true;\n        } else {\n          ds.bufferingObservations = true;\n        }\n        break;\n\n      case 'om_buffering_end':\n        if (event.operationType === 'observation') {\n          ds.bufferingMessages = false;\n        } else {\n          ds.bufferingObservations = false;\n        }\n        break;\n\n      case 'om_buffering_failed':\n        if (event.operationType === 'observation') {\n          ds.bufferingMessages = false;\n        } else {\n          ds.bufferingObservations = false;\n        }\n        break;\n\n      case 'om_activation':\n        if (event.operationType === 'observation') {\n          ds.bufferingMessages = false;\n        } else {\n          ds.bufferingObservations = false;\n        }\n        break;\n\n      // ── Token usage ────────────────────────────────────────────────────\n      case 'usage_update':\n        ds.tokenUsage = { ...this.tokenUsage };\n        break;\n\n      // ── Tasks ──────────────────────────────────────────────────────────\n      case 'task_updated':\n        ds.previousTasks = [...ds.tasks];\n        ds.tasks = event.tasks;\n        break;\n\n      // ── Thread lifecycle ───────────────────────────────────────────────\n      case 'thread_changed':\n        this.resetThreadDisplayState();\n        ds.tokenUsage = { ...this.tokenUsage };\n        break;\n\n      case 'thread_created':\n        this.resetThreadDisplayState();\n        ds.tokenUsage = createEmptyTokenUsage();\n        break;\n\n      case 'thread_deleted':\n        if (!this.currentThreadId) {\n          this.resetThreadDisplayState();\n          ds.tokenUsage = createEmptyTokenUsage();\n        }\n        break;\n\n      // ── State changes (for OM threshold overrides) ──────────────────────\n      case 'state_changed': {\n        const keys = event.changedKeys;\n        if (keys.includes('observationThreshold')) {\n          const value = (event.state as Record<string, unknown>).observationThreshold;\n          if (typeof value === 'number') {\n            ds.omProgress.threshold = value;\n            ds.omProgress.thresholdPercent = value > 0 ? (ds.omProgress.pendingTokens / value) * 100 : 0;\n          }\n        }\n        if (keys.includes('reflectionThreshold')) {\n          const value = (event.state as Record<string, unknown>).reflectionThreshold;\n          if (typeof value === 'number') {\n            ds.omProgress.reflectionThreshold = value;\n            ds.omProgress.reflectionThresholdPercent = value > 0 ? (ds.omProgress.observationTokens / value) * 100 : 0;\n          }\n        }\n        break;\n      }\n\n      default:\n        break;\n    }\n  }\n\n  // ===========================================================================\n  // Runtime Context\n  // ===========================================================================\n\n  /**\n   * Build the toolsets object that includes built-in harness tools (ask_user, submit_plan,\n   * and optionally subagent) plus any user-configured tools.\n   * Used by sendMessage, handleToolApprove, and handleToolDecline.\n   */\n  private async buildToolsets(requestContext: RequestContext): Promise<ToolsetsInput> {\n    const builtInTools: ToolsInput = {\n      ask_user: askUserTool,\n      submit_plan: submitPlanTool,\n      task_write: taskWriteTool,\n      task_update: taskUpdateTool,\n      task_complete: taskCompleteTool,\n      task_check: taskCheckTool,\n    };\n\n    // Resolve user-configured harness tools (needed for both the harness toolset and subagent allowedHarnessTools)\n    let resolvedHarnessTools: ToolsInput | undefined = undefined;\n    if (this.config.tools) {\n      const tools =\n        typeof this.config.tools === 'function' ? await this.config.tools({ requestContext }) : this.config.tools;\n      if (tools) {\n        resolvedHarnessTools = { ...tools };\n      }\n    }\n\n    // Auto-create subagent tool if subagent definitions are configured\n    if (this.config.subagents?.length && this.config.resolveModel) {\n      const currentMode = this.getCurrentMode();\n      const hasMemory = Boolean(this.config.memory);\n      builtInTools.subagent = createSubagentTool({\n        subagents: this.config.subagents,\n        resolveModel: this.config.resolveModel,\n        harnessTools: resolvedHarnessTools,\n        fallbackModelId: currentMode?.defaultModelId,\n        getParentModelId: () => this.getCurrentModelId(),\n        // Resolved lazily so forked subagents see the current mode's agent\n        // even if the mode switches between tool-call scheduling and execution.\n        getParentAgent: () => {\n          try {\n            return this.getCurrentAgent();\n          } catch {\n            return undefined;\n          }\n        },\n        // Only wired up when memory is configured. Clones at the memory layer\n        // (not via Harness.cloneThread) so the parent thread stays the active\n        // thread while the forked subagent runs on the clone.\n        //\n        // The clone is tagged with `forkedSubagent: true` + `parentThreadId` so\n        // that thread pickers / startup flows can hide transient fork threads —\n        // see `listThreads` (filtered by default).\n        cloneThreadForFork: hasMemory\n          ? async ({ sourceThreadId, resourceId, title }) => {\n              const memory = await this.resolveMemory();\n              const result = await memory.cloneThread({\n                sourceThreadId,\n                resourceId: resourceId ?? this.resourceId,\n                title,\n                metadata: {\n                  forkedSubagent: true,\n                  parentThreadId: sourceThreadId,\n                },\n              });\n              return { id: result.thread.id, resourceId: result.thread.resourceId };\n            }\n          : undefined,\n        // Forks inherit the parent's toolsets verbatim so harness-injected\n        // tools (`ask_user`, `submit_plan`, user-configured harness tools, etc.)\n        // remain available inside the fork. The `subagent` entry itself is\n        // deliberately kept — its schema/description are part of the parent's\n        // prompt-cache prefix, and stripping it would invalidate the cache.\n        // Recursive forking is blocked at runtime instead: see the patched\n        // `subagent` execute that the forked tool path installs in `tools.ts`.\n        getParentToolsets: forkRequestContext => this.buildToolsets(forkRequestContext ?? requestContext),\n      });\n    }\n\n    // Remove any explicitly disabled built-in tools\n    if (this.config.disableBuiltinTools?.length) {\n      for (const toolId of this.config.disableBuiltinTools) {\n        delete builtInTools[toolId];\n      }\n    }\n\n    const permissionRules = this.getPermissionRules();\n    for (const [toolId, policy] of Object.entries(permissionRules.tools)) {\n      if (policy === 'deny') {\n        delete builtInTools[toolId];\n        delete resolvedHarnessTools?.[toolId];\n      }\n    }\n\n    if (resolvedHarnessTools) {\n      return { harnessBuiltIn: builtInTools, harness: resolvedHarnessTools };\n    }\n    return { harnessBuiltIn: builtInTools };\n  }\n\n  /**\n   * Build request context for agent execution.\n   * Tools can access harness state via requestContext.get('harness').\n   */\n  private async buildRequestContext(requestContext?: RequestContext): Promise<RequestContext> {\n    requestContext ??= new RequestContext();\n    const harnessContext: HarnessRequestContext<Readonly<TState>> = {\n      harnessId: this.id,\n      state: this.getState(),\n      getState: () => this.getState(),\n      setState: updates => this.setState(updates),\n      updateState: updater => this.updateState(updater),\n      threadId: this.currentThreadId,\n      resourceId: this.resourceId,\n      modeId: this.currentModeId,\n      abortSignal: this.abortController?.signal,\n      workspace: this.workspace,\n      emitEvent: event => this.emit(event),\n      registerQuestion: params => this.registerQuestion(params),\n      registerPlanApproval: params => this.registerPlanApproval(params),\n      getSubagentModelId: params => this.getSubagentModelId(params),\n    };\n\n    requestContext.set('harness', harnessContext);\n\n    if (this.workspaceFn) {\n      const resolved = await Promise.resolve(this.workspaceFn({ requestContext }));\n      harnessContext.workspace = resolved;\n      // Cache for getWorkspace() so callers outside request flow (e.g. /skills) can access it\n      this.workspace = resolved;\n    }\n\n    return requestContext;\n  }\n\n  /**\n   * Resolve memory from config — handles both static instances and dynamic factory functions.\n   */\n  private async resolveMemory(): Promise<MastraMemory> {\n    const mem = this.config.memory;\n    if (!mem) {\n      throw new Error('Memory is not configured on this Harness');\n    }\n    if (typeof mem !== 'function') {\n      return mem;\n    }\n    const requestContext = await this.buildRequestContext();\n    const resolved = await Promise.resolve(mem({ requestContext }));\n    if (!resolved) {\n      throw new Error('Dynamic memory factory returned empty value');\n    }\n    return resolved;\n  }\n\n  // ===========================================================================\n  // Token Usage\n  // ===========================================================================\n\n  getTokenUsage(): TokenUsage {\n    return { ...this.tokenUsage };\n  }\n\n  private async persistTokenUsage(): Promise<void> {\n    if (!this.currentThreadId || !this.config.storage) return;\n\n    try {\n      const memoryStorage = await this.getMemoryStorage();\n      const thread = await memoryStorage.getThreadById({ threadId: this.currentThreadId });\n      if (thread) {\n        await memoryStorage.saveThread({\n          thread: {\n            ...thread,\n            metadata: { ...thread.metadata, tokenUsage: this.tokenUsage },\n            updatedAt: new Date(),\n          },\n        });\n      }\n    } catch {\n      // Token persistence is not critical\n    }\n  }\n\n  // ===========================================================================\n  // Workspace\n  // ===========================================================================\n\n  getWorkspace(): Workspace | undefined {\n    return this.workspace;\n  }\n\n  /**\n   * Eagerly resolve the workspace. For dynamic workspaces (factory function),\n   * this triggers resolution and caches the result so getWorkspace() returns it.\n   * Useful for code paths outside the request flow (e.g. slash commands).\n   */\n  async resolveWorkspace({\n    requestContext,\n  }: {\n    requestContext?: RequestContext;\n  } = {}): Promise<Workspace | undefined> {\n    if (this.workspace) return this.workspace;\n    if (this.workspaceFn) {\n      // buildRequestContext resolves the workspace and caches it on this.workspace\n      await this.buildRequestContext(requestContext);\n      return this.workspace;\n    }\n    return undefined;\n  }\n\n  hasWorkspace(): boolean {\n    return this.config.workspace !== undefined;\n  }\n\n  isWorkspaceReady(): boolean {\n    if (this.workspaceFn) return true;\n    return this.workspaceInitialized && this.workspace !== undefined;\n  }\n\n  async destroyWorkspace(): Promise<void> {\n    if (this.workspaceFn) return;\n    if (this.workspace && this.workspaceInitialized) {\n      try {\n        this.emit({ type: 'workspace_status_changed', status: 'destroying' });\n        await this.workspace.destroy();\n        this.emit({ type: 'workspace_status_changed', status: 'destroyed' });\n      } catch (error) {\n        console.warn('Workspace destroy failed:', error);\n      } finally {\n        this.workspaceInitialized = false;\n      }\n    }\n  }\n\n  // ===========================================================================\n  // Heartbeat Handlers\n  // ===========================================================================\n\n  private startHeartbeats(): void {\n    const handlers = this.config.heartbeatHandlers;\n    if (!handlers?.length) return;\n\n    for (const hb of handlers) {\n      if (this.heartbeatTimers.has(hb.id)) continue;\n\n      const run = async () => {\n        try {\n          await hb.handler();\n        } catch (error) {\n          console.error(`[Heartbeat:${hb.id}] failed:`, error);\n        }\n      };\n\n      if (hb.immediate !== false) {\n        void run();\n      }\n\n      const timer = setInterval(run, hb.intervalMs);\n      timer.unref();\n      this.heartbeatTimers.set(hb.id, { timer, shutdown: hb.shutdown });\n    }\n  }\n\n  registerHeartbeat(handler: HeartbeatHandler): void {\n    void this.removeHeartbeat({ id: handler.id });\n\n    const run = async () => {\n      try {\n        await handler.handler();\n      } catch (error) {\n        console.error(`[Heartbeat:${handler.id}] failed:`, error);\n      }\n    };\n\n    if (handler.immediate !== false) {\n      void run();\n    }\n\n    const timer = setInterval(run, handler.intervalMs);\n    timer.unref();\n    this.heartbeatTimers.set(handler.id, { timer, shutdown: handler.shutdown });\n  }\n\n  async removeHeartbeat({ id }: { id: string }): Promise<void> {\n    const entry = this.heartbeatTimers.get(id);\n    if (entry) {\n      clearInterval(entry.timer);\n      this.heartbeatTimers.delete(id);\n      try {\n        await entry.shutdown?.();\n      } catch (error) {\n        console.error(`[Heartbeat:${id}] shutdown failed:`, error);\n      }\n    }\n  }\n\n  async stopHeartbeats(): Promise<void> {\n    const entries = [...this.heartbeatTimers.entries()];\n    this.heartbeatTimers.clear();\n\n    for (const [id, entry] of entries) {\n      clearInterval(entry.timer);\n      try {\n        await entry.shutdown?.();\n      } catch (error) {\n        console.error(`[Heartbeat:${id}] shutdown failed:`, error);\n      }\n    }\n  }\n\n  // ===========================================================================\n  // Lifecycle\n  // ===========================================================================\n\n  async destroy(): Promise<void> {\n    this.cleanupAgentThreadSubscription();\n    for (const scheduler of this.displayStateSchedulers) {\n      scheduler.dispose();\n    }\n    this.displayStateSchedulers.clear();\n    await this.stopHeartbeats();\n    await this.destroyWorkspace();\n  }\n\n  // ===========================================================================\n  // Session\n  // ===========================================================================\n\n  async getSession(): Promise<HarnessSession> {\n    return {\n      currentThreadId: this.currentThreadId,\n      currentModeId: this.currentModeId,\n      threads: await this.listThreads(),\n    };\n  }\n\n  // ===========================================================================\n  // Utilities\n  // ===========================================================================\n\n  private generateId(): string {\n    if (this.config.idGenerator) {\n      return this.config.idGenerator();\n    }\n    return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n  }\n}\n"]}