{"version":3,"sources":["../../src/harness/types.ts","../../src/harness/session.ts","../../src/harness/tools.ts","../../src/harness/harness.ts"],"names":["toStandardSchema","safeStringify","createTool","z","RequestContext","Agent","createWorkspaceTools","durationMs","summarizeTaskCheck","getServerSideFallbackInfo","addOptionalUsageField","getTransformedToolPayload","hasTransformedToolPayload","createSignal","Workspace","Mastra","getErrorFromUnknown","result","modeModelKey","randomUUID","mastraDBMessageToSignal","askUserTool","submitPlanTool","taskWriteTool","taskUpdateTool","taskCompleteTool","taskCheckTool"],"mappings":"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","file":"index.cjs","sourcesContent":["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 { MastraModelGatewayInterface } from '../llm/model/gateways';\nimport type { MastraModelConfig } 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 { GoalEvaluationPayload } from '../stream/types';\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;\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;\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 */\ninterface HarnessModeBase {\n /** Unique within `HarnessConfig.modes`. Validated at construction. */\n id: string;\n\n name?: string;\n\n /** bootstrap model default when a session enters this mode. */\n defaultModelId?: string;\n\n /** Surfaced in mode pickers / Studio UI. Free text. */\n description?: string;\n\n /**\n * Layered above the backing agent's own instructions for the duration\n * of this mode. Plain text by design — modes carve operating profile,\n * not full system-message overrides.\n */\n instructions?: string;\n\n /** @deprecated Use HarnessConfig.agent as the shared backing agent. */\n agent?: Agent;\n\n /** @deprecated Prefer metadata.default. */\n default?: boolean;\n\n /**\n * Optional plan→build target. When `submit_plan` runs in this mode, the\n * registered `PendingResume` freezes this value as `transitionModeId`.\n * On approval, the session flips to this mode\n * idempotently (§5.1, §5.7). If unset, plan approval resumes with no\n * mode change. Must reference another mode's `id`.\n */\n transitionsTo?: string;\n\n /**\n * Arbitrary user-defined metadata. `metadata.default === true` is a\n * reserved harness hint for choosing the default mode when `defaultModeId`\n * is unset; all other metadata is pass-through and unvalidated. Use for UI\n * affordances like display color, icon, display name overrides, or any\n * per-mode configuration that isn't part of the harness's own contract.\n *\n * Surfaced verbatim on `getCurrentMode()` and `listModes()`.\n */\n metadata?: Record;\n}\n\ntype HarnessModeToolOverrides =\n | {\n /**\n * The tool set this mode runs with. **Replaces** the backing agent's\n * tools — the agent's own tools are hidden for the duration of the\n * mode. Mutually exclusive with `additionalTools`.\n */\n tools?: ToolsInput;\n additionalTools?: never;\n }\n | {\n tools?: never;\n /**\n * Tools layered on top of the backing agent's tools. The agent's tools\n * stay; these are added. Mutually exclusive with `tools`.\n */\n additionalTools?: ToolsInput;\n };\n\nexport type HarnessMode = HarnessModeBase & HarnessModeToolOverrides;\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;\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;\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 {\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;\n\n /** Initial state values (must conform to schema) */\n initialState?: Partial;\n\n /** Memory configuration (shared across all modes) */\n memory?: DynamicArgument;\n\n /** Available agent modes */\n modes: HarnessMode[];\n\n /** Shared backing agent that each mode forks and decorates. */\n agent?: Agent;\n\n /** Default mode to enter when a thread has no persisted mode. */\n defaultModeId?: string;\n\n instructions?: string;\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;\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 | 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;\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 * Model gateways registered on Harness' internal Mastra instance.\n * Apps that need gateway-backed model resolution should provide `resolveModel`.\n */\n gateways?: MastraModelGatewayInterface[];\n\n /**\n * Converts a model ID string (e.g., \"anthropic/claude-sonnet-4-20250514\") to a\n * language model instance for Harness-managed observer, reflector, and subagent models.\n */\n resolveModel?: (modelId: string) => MastraModelConfig;\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;\n release: (threadId: string) => void | Promise;\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>;\n tools: Partial>;\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;\n\n/**\n * Provides additional model catalog entries for `listAvailableModels()`.\n */\nexport type CustomModelCatalogProvider = () => CustomAvailableModel[] | Promise;\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;\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;\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;\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 // ── Follow-up queue ──────────────────────────────────────────────────\n /** Number of follow-up messages queued locally by the Harness */\n queuedFollowUps: number;\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;\n\n // ── Streaming tool input ─────────────────────────────────────────────\n /** Partial JSON buffers for tools whose arguments are being streamed */\n toolInputBuffers: Map;\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 /**\n * Tools awaiting resume data after calling suspend(), keyed by toolCallId.\n * Multiple tools can be parked at once (e.g. parallel `ask_user` prompts), so\n * resuming one leaves the others intact for the UI to keep rendering.\n */\n pendingSuspensions: Map<\n string,\n {\n toolCallId: string;\n toolName: string;\n args: unknown;\n suspendPayload: unknown;\n resumeSchema?: string;\n }\n >;\n\n // ── Subagent tracking ────────────────────────────────────────────────\n /** Active subagent executions keyed by parent toolCallId */\n activeSubagents: Map;\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;\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 queuedFollowUps: 0,\n tokenUsage: createEmptyTokenUsage(),\n activeTools: new Map(),\n toolInputBuffers: new Map(),\n pendingApproval: null,\n pendingSuspensions: new Map(),\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; 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;\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; runId?: string }\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: '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 | {\n type: 'goal_evaluation';\n payload: GoalEvaluationPayload;\n }\n | { type: 'display_state_changed'; displayState: HarnessDisplayState };\n\n/**\n * Listener function for harness events.\n */\nexport type HarnessEventListener = (event: HarnessEvent) => void | Promise;\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 attributes?: Record;\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;\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 goalEvaluation?: GoalEvaluationPayload;\n }\n | {\n type: 'state_signal';\n id?: string;\n stateId: string;\n mode: 'snapshot' | 'delta';\n cacheKey?: string;\n version?: number;\n message: string;\n }\n | {\n type: 'reactive_signal';\n id?: string;\n tagName: string;\n message: string;\n attributes?: Record;\n metadata?: Record;\n }\n | {\n type: 'notification_summary';\n id?: string;\n message: string;\n pending: number;\n bySource: Record;\n byPriority: Record;\n notificationIds: string[];\n }\n | {\n type: 'notification';\n id?: string;\n notificationId?: string;\n message: string;\n source?: string;\n kind?: string;\n priority?: string;\n status?: string;\n attributes?: Record;\n metadata?: Record;\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 */\n/**\n * Snapshot of the session-owned values exposed to request-context consumers.\n * Plain data captured per request; mutating it does not affect the Session.\n */\nexport type HarnessRequestStateUpdateResult = {\n updates?: Partial;\n events?: HarnessEvent[];\n result: TResult;\n};\n\nexport type HarnessRequestStateUpdater = (\n state: Readonly,\n) => HarnessRequestStateUpdateResult | Promise>;\n\nexport interface HarnessRequestState {\n /** Get the current session-owned harness state (live, not request-context snapshot). */\n get: () => Readonly;\n /** Update session-owned harness state. */\n set: (updates: Partial) => Promise;\n /** Update session-owned harness state from the latest snapshot in a serialized transaction. */\n update: (updater: HarnessRequestStateUpdater) => Promise;\n}\n\nexport interface HarnessRequestSession {\n /** Currently-selected mode ID */\n modeId: string;\n /** Currently-selected model ID ('' when none selected yet) */\n modelId: string;\n /** Live session-owned harness state accessors. */\n state: HarnessRequestState;\n}\n\nexport interface HarnessRequestContext {\n /** The harness instance ID */\n harnessId: string;\n\n /**\n * Current harness state (read-only snapshot captured when the request context is built).\n * @deprecated Prefer `session.state.get()` for live state reads.\n */\n state: Readonly;\n\n /**\n * Get the current harness state (live, not snapshot).\n * @deprecated Prefer `session.state.get()`.\n */\n getState: () => Readonly;\n\n /**\n * Update harness state.\n * @deprecated Prefer `session.state.set(...)`.\n */\n setState: (updates: Partial) => Promise;\n\n /**\n * Update harness state from the latest state snapshot in a serialized transaction.\n * @deprecated Prefer `session.state.update(...)`.\n */\n updateState?: (updater: HarnessRequestStateUpdater) => Promise;\n\n /** Current thread ID */\n threadId: string | null;\n\n /** Current resource ID */\n resourceId: string;\n\n /**\n * Snapshot of the relevant session-owned values for this request.\n * Plain data (not the live Session); read-only at the point of use.\n */\n session: HarnessRequestSession;\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 /** Get the configured subagent model ID for a specific agent type */\n getSubagentModelId?: (params?: { agentType?: string }) => string | null;\n}\n","import type { Agent } from '../agent';\nimport type { AgentThreadSubscription } from '../agent/types';\nimport type { RequestContext } from '../request-context';\nimport { toStandardSchema } from '../schema';\nimport type { PublicSchema, StandardSchemaWithJSON } from '../schema';\nimport { safeStringify } from '../utils';\nimport type { TaskItemSnapshot } from './tools';\nimport { createEmptyTokenUsage, defaultDisplayState, defaultOMProgressState } from './types';\nimport type {\n HarnessDisplayState,\n HarnessEvent,\n HarnessMessage,\n HarnessMode,\n HarnessRequestState,\n HarnessRequestStateUpdater,\n HarnessThread,\n TokenUsage,\n ToolCategory,\n} from './types';\n\n/**\n * Minimal persistence surface the Session uses to read and write per-thread\n * settings (mode id, per-mode model id, …). The Harness backs this with thread\n * metadata; when no storage is configured it is absent and the Session keeps\n * its state purely in memory.\n */\nexport interface ThreadSettingsStore {\n /** Read a setting for the active thread, or undefined when unset/unavailable. */\n get(key: string): Promise;\n /** Persist a setting for the active thread (no-op when storage is unavailable). */\n set(key: string, value: unknown): Promise;\n}\n\n/** Usage fields that are summed across steps when present on a step's usage. */\ntype OptionalUsageField = 'reasoningTokens' | 'cachedInputTokens' | 'cacheCreationInputTokens';\n\nfunction addOptionalUsageField(usage: TokenUsage, key: OptionalUsageField, value: number | undefined): void {\n if (value !== undefined) {\n usage[key] = (usage[key] ?? 0) + value;\n }\n}\n\n/** Persisted thread-setting key for the currently-selected mode. */\nconst MODE_ID_KEY = 'currentModeId';\n/** Persisted thread-setting key prefix for a mode's last-used model. */\nconst modeModelKey = (modeId: string) => `modeModelId_${modeId}`;\n\n/**\n * Owns the session's identity: the memory `resourceId` and the active\n * `threadId` this session reads and writes under. Together they form the memory\n * binding (`{ thread, resource }`) every run uses. In a multi-user host one\n * Harness serves many sessions, so this identity — \"whose session is this, and\n * which thread is it on\" — belongs to the Session, not the Harness.\n *\n * `defaultResourceId` is the resourceId the session started with; switching to a\n * different resource (e.g. impersonation, or browsing another user's threads)\n * updates the current resourceId while the default is retained so the session\n * can return to its own identity.\n *\n * The active thread the session is bound to lives on {@link SessionThread}, not\n * here — identity is the stable \"who\", the thread is the navigational \"where\".\n */\nexport class SessionIdentity {\n /** The memory resourceId the session currently reads/writes under. */\n #resourceId: string;\n /** The resourceId the session started with, retained across resource switches. */\n readonly #defaultResourceId: string;\n\n constructor({ resourceId }: { resourceId: string }) {\n this.#resourceId = resourceId;\n this.#defaultResourceId = resourceId;\n }\n\n /** The resourceId the session currently reads/writes under. */\n getResourceId(): string {\n return this.#resourceId;\n }\n\n /** The resourceId the session started with. */\n getDefaultResourceId(): string {\n return this.#defaultResourceId;\n }\n\n /** Point the session at a different resourceId (the default is unchanged). */\n setResourceId({ resourceId }: { resourceId: string }): void {\n this.#resourceId = resourceId;\n }\n}\n\n/**\n * The shared-host storage surface the Session's thread domain leverages to read\n * and write threads. The Harness backs this with its memory storage (mapping raw\n * storage rows to {@link HarnessThread}/{@link HarnessMessage}); when no storage\n * is configured the handle is absent and the data methods degrade gracefully\n * (empty lists, undefined settings, no-op writes).\n *\n * This is a gateway to shared infrastructure — not a callback into Harness\n * orchestration. The Session owns the thread-domain logic; the host owns the DB.\n */\nexport interface ThreadDataStore {\n /** List threads for a resource (or all resources), already mapped + filtered of forked subagents unless asked. */\n listThreads(input: { resourceId?: string; includeForkedSubagents?: boolean }): Promise;\n /** Fetch a single thread by id, or null when it doesn't exist. */\n getById(input: { threadId: string }): Promise;\n /** List messages for a thread, newest-`limit` (returned oldest-first) or all. */\n listMessages(input: { threadId: string; limit?: number }): Promise;\n /** The first user message for each given thread id. */\n firstUserMessages(input: { threadIds: string[] }): Promise>;\n /** Read a value from a thread's metadata. */\n getMetadata(input: { threadId: string; key: string }): Promise;\n /** Write a value into a thread's metadata. */\n setMetadata(input: { threadId: string; key: string; value: unknown }): Promise;\n /** Delete a value from a thread's metadata. */\n deleteMetadata(input: { threadId: string; key: string }): Promise;\n}\n\n/**\n * Owns the session's thread domain: the navigational binding (which thread the\n * session is currently on) plus the data reads/queries scoped to it. `null`\n * until the session is bound (a thread is created, switched to, or reacquired on\n * startup); switching/deleting updates it.\n *\n * In the multi-user model each session has its own current thread and reads its\n * own threads, while the Harness host shares storage, the thread lock, and the\n * event bus. So the binding + data queries are per-session and live here; the\n * session leverages the host's storage via an injected {@link ThreadDataStore}.\n * Lifecycle *transitions* (create/switch/clone/delete) remain host machinery\n * because they drive the shared event bus and rebind the shared agent stream.\n */\nexport class SessionThread {\n /** The active thread id, or null when the session is not bound to a thread. */\n #threadId: string | null = null;\n /** Gateway to the host's shared thread storage, injected via {@link connect}. */\n #store: ThreadDataStore | undefined;\n /** Reads the session's current resourceId (sibling identity state). */\n readonly #getResourceId: () => string;\n\n constructor(getResourceId: () => string) {\n this.#getResourceId = getResourceId;\n }\n\n /**\n * Attach the shared-host storage gateway the thread domain reads/writes\n * through. The Harness calls this once storage is available; without it the\n * data methods degrade gracefully.\n */\n connect(store: ThreadDataStore | undefined): void {\n this.#store = store;\n }\n\n /** The active thread id, or null when the session is not bound to a thread. */\n getId(): string | null {\n return this.#threadId;\n }\n\n /** Whether the session is currently bound to a thread. */\n isSet(): boolean {\n return this.#threadId !== null;\n }\n\n /** The active thread id, throwing when the session is not bound to a thread. */\n requireId(): string {\n if (this.#threadId === null) {\n throw new Error('No active thread on this session');\n }\n return this.#threadId;\n }\n\n /** Bind the session to a thread. */\n set({ threadId }: { threadId: string }): void {\n this.#threadId = threadId;\n }\n\n /** Clear the session's thread binding. */\n clear(): void {\n this.#threadId = null;\n }\n\n // ---------------------------------------------------------------------------\n // Data domain: reads/queries scoped to this session, backed by host storage.\n // ---------------------------------------------------------------------------\n\n /** List this session's threads (its own resource by default, or all resources). */\n async list(options?: { allResources?: boolean; includeForkedSubagents?: boolean }): Promise {\n if (!this.#store) return [];\n return this.#store.listThreads({\n resourceId: options?.allResources ? undefined : this.#getResourceId(),\n includeForkedSubagents: options?.includeForkedSubagents,\n });\n }\n\n /** Fetch a single thread by id, or null when it doesn't exist / no storage. */\n async getById({ threadId }: { threadId: string }): Promise {\n if (!this.#store) return null;\n return this.#store.getById({ threadId });\n }\n\n /** List messages for a thread (newest-`limit`, returned oldest-first), or all. */\n async listMessages({ threadId, limit }: { threadId: string; limit?: number }): Promise {\n if (!this.#store) return [];\n return this.#store.listMessages({ threadId, limit });\n }\n\n /** List messages for the session's active thread (empty when not bound). */\n async listActiveMessages({ limit }: { limit?: number } = {}): Promise {\n if (this.#threadId === null) return [];\n return this.listMessages({ threadId: this.#threadId, limit });\n }\n\n /** The first user message for a single thread, or null. */\n async firstUserMessage({ threadId }: { threadId: string }): Promise {\n const messages = await this.firstUserMessages({ threadIds: [threadId] });\n return messages.get(threadId) ?? null;\n }\n\n /** The first user message for each given thread id. */\n async firstUserMessages({ threadIds }: { threadIds: string[] }): Promise> {\n if (!this.#store || threadIds.length === 0) return new Map();\n return this.#store.firstUserMessages({ threadIds });\n }\n\n /** Read a setting (metadata value) for the active thread. */\n async getSetting({ key }: { key: string }): Promise {\n if (!this.#store || this.#threadId === null) return undefined;\n return this.#store.getMetadata({ threadId: this.#threadId, key });\n }\n\n /** Persist a setting (metadata value) for the active thread. */\n async setSetting({ key, value }: { key: string; value: unknown }): Promise {\n if (!this.#store || this.#threadId === null) return;\n await this.#store.setMetadata({ threadId: this.#threadId, key, value });\n }\n\n /** Delete a setting (metadata value) for the active thread. */\n async deleteSetting({ key }: { key: string }): Promise {\n if (!this.#store || this.#threadId === null) return;\n await this.#store.deleteMetadata({ threadId: this.#threadId, key });\n }\n}\n\n/**\n * Owns the session's live subscription to the active thread's agent event\n * stream. A subscription is created per `(agent, resource, thread)` and reused\n * while that triple is unchanged (tracked by {@link key}); switching threads or\n * agents tears the old one down and opens a new one.\n *\n * The Session owns the subscription *handle* and its dedup key plus the\n * mechanical lifecycle (reuse check, teardown, identity check, run-id read).\n * The Harness still owns *how* a subscription is produced (calling the agent)\n * and *how* its stream is consumed, passing the resolved handle in via\n * {@link attach}.\n */\nexport class SessionStream {\n /** The live subscription to the active thread, or null when none is open. */\n #subscription: AgentThreadSubscription | null = null;\n /** Dedup key (`agentId:resourceId:threadId`) for the open subscription, or null. */\n #key: string | null = null;\n\n /** Build the dedup key identifying a subscription to `threadId` for `agent`. */\n static keyFor({ agent, resourceId, threadId }: { agent: Agent; resourceId: string; threadId: string }): string {\n return `${agent.id}:${resourceId}:${threadId}`;\n }\n\n /** Whether the open subscription already targets `key` (so it can be reused). */\n matches({ key }: { key: string }): boolean {\n return this.#key === key && this.#subscription !== null;\n }\n\n /** Adopt `subscription` as the live one, recording its dedup `key`. */\n attach({ subscription, key }: { subscription: AgentThreadSubscription; key: string }): void {\n this.#subscription = subscription;\n this.#key = key;\n }\n\n /** Whether a subscription is currently open. */\n isOpen(): boolean {\n return this.#subscription !== null;\n }\n\n /** Whether `subscription` is the one currently adopted (identity check). */\n isCurrent({ subscription }: { subscription: AgentThreadSubscription }): boolean {\n return this.#subscription === subscription;\n }\n\n /** The run id the live subscription reports as active, or null when none/idle. */\n activeRunId(): string | null {\n return this.#subscription?.activeRunId() ?? null;\n }\n\n /** Whether the live subscription currently has a run in flight. */\n isActive(): boolean {\n return this.activeRunId() !== null;\n }\n\n /** Abort the live subscription's in-flight run, if any. Swallows errors. */\n abort(): void {\n try {\n this.#subscription?.abort();\n } catch {}\n }\n\n /** Detach the live subscription without aborting (e.g. on stream error). */\n detach(): void {\n this.#subscription?.unsubscribe();\n this.#subscription = null;\n this.#key = null;\n }\n\n /** Fully tear down the live subscription: abort, unsubscribe, and clear. */\n cleanup(): void {\n this.#subscription?.abort();\n this.#subscription?.unsubscribe();\n this.#subscription = null;\n this.#key = null;\n }\n}\n\n/** A tool call parked awaiting a resume, keyed in {@link SessionSuspensions}. */\nexport interface PendingSuspension {\n /** The run id to resume when this tool call is answered. */\n runId: string;\n /** The suspended tool's name (e.g. `ask_user`, `submit_plan`). */\n toolName: string;\n}\n\n/**\n * Owns the session's parked tool suspensions: tool calls paused via the native\n * tool-suspension primitive (e.g. `ask_user` / `request_access` / `submit_plan`)\n * that are awaiting a resume, keyed by `toolCallId`. Each entry records the run\n * id to resume and the tool name. A Map (rather than single fields) lets several\n * tools — e.g. parallel `ask_user` calls in one step — stay suspended and be\n * resumed independently.\n *\n * This is the resume *data* the Harness reads to drive a resume. The richer\n * per-suspension UI snapshot lives on the Harness display state; the Session\n * owns only what's needed to resume.\n */\nexport class SessionSuspensions {\n /** Parked tool calls awaiting a resume, keyed by `toolCallId`. */\n readonly #pending = new Map();\n\n /** Park `toolCallId` as awaiting a resume on `runId` for `toolName`. */\n register({ toolCallId, runId, toolName }: { toolCallId: string; runId: string; toolName: string }): void {\n this.#pending.set(toolCallId, { runId, toolName });\n }\n\n /** The parked suspension for `toolCallId`, or undefined when none. */\n get({ toolCallId }: { toolCallId: string }): PendingSuspension | undefined {\n return this.#pending.get(toolCallId);\n }\n\n /** Whether `toolCallId` is currently parked. */\n has({ toolCallId }: { toolCallId: string }): boolean {\n return this.#pending.has(toolCallId);\n }\n\n /** Drop `toolCallId` from the parked set (e.g. once resumed). */\n delete({ toolCallId }: { toolCallId: string }): void {\n this.#pending.delete(toolCallId);\n }\n\n /** Drop all parked suspensions (e.g. on abort or thread switch). */\n clear(): void {\n this.#pending.clear();\n }\n\n /** Whether any tool calls are parked awaiting a resume. */\n hasPending(): boolean {\n return this.#pending.size > 0;\n }\n\n /**\n * Resolve which parked suspension to act on. With an explicit `toolCallId` it\n * must match a parked suspension; without one it returns the single parked\n * suspension (or undefined when there are zero or several).\n */\n resolveToolCallId(toolCallId?: string): string | undefined {\n if (toolCallId) {\n return this.#pending.has(toolCallId) ? toolCallId : undefined;\n }\n if (this.#pending.size === 1) {\n return this.#pending.keys().next().value;\n }\n return undefined;\n }\n}\n\n/** A message queued to send once the active run finishes, held in {@link SessionFollowUps}. */\nexport interface FollowUp {\n /** The message text to send. */\n content: string;\n /** Optional request context to apply when the queued message is sent. */\n requestContext?: RequestContext;\n}\n\n/**\n * Owns the session's follow-up queue: messages a user submits while a run is in\n * progress, held FIFO until the active run finishes and the queue is drained.\n *\n * This owns the queue *data* (enqueue/dequeue/requeue/clear/count). The Harness\n * still drives draining — sending each message and emitting `follow_up_queued`\n * as the count changes — and keeps the display-state mirror (`queuedFollowUps`).\n */\nexport class SessionFollowUps {\n /** Messages waiting to be sent after the current run, in arrival order. */\n #queue: FollowUp[] = [];\n\n /** Number of messages currently queued. */\n count(): number {\n return this.#queue.length;\n }\n\n /** Whether the queue is empty. */\n isEmpty(): boolean {\n return this.#queue.length === 0;\n }\n\n /** Append a follow-up to the back of the queue. */\n enqueue(followUp: FollowUp): void {\n this.#queue.push(followUp);\n }\n\n /** Remove and return the next follow-up, or undefined when empty. */\n dequeue(): FollowUp | undefined {\n return this.#queue.shift();\n }\n\n /** Put a follow-up back at the front (e.g. when draining it failed). */\n requeue(followUp: FollowUp): void {\n this.#queue.unshift(followUp);\n }\n\n /** Drop all queued follow-ups (e.g. on steer or thread switch). */\n clear(): void {\n this.#queue = [];\n }\n}\n\n/** The decision a user returns to resolve a parked tool-approval gate. */\nexport interface ApprovalDecision {\n /** Whether to run the gated tool or reject it. */\n decision: 'approve' | 'decline';\n /** Optional request context to apply when the gated tool resumes. */\n requestContext?: RequestContext;\n}\n\n/**\n * A user's response to a parked approval. `always_allow_category` approves the\n * tool and additionally grants its category for the rest of the session.\n */\nexport interface ApprovalResponse {\n decision: 'approve' | 'decline' | 'always_allow_category';\n requestContext?: RequestContext;\n}\n\n/**\n * Owns the session's interactive tool-approval gate: when a tool requires user\n * approval, the run parks on a promise here until the UI responds approve or\n * decline. Holds the pending resolver and the name of the tool being gated.\n *\n * At most one approval is in flight at a time. The Session owns the gate\n * mechanics (arm / resolve / clear); the Harness still maps a decision to its\n * effects (running vs declining the tool, and any \"always allow\" grant), since\n * those touch config-derived tool categories.\n */\nexport class SessionApproval {\n /** Resolver for the parked approval promise, or null when nothing is gated. */\n #resolve: ((decision: ApprovalDecision) => void) | null = null;\n /** Name of the tool currently awaiting approval, or null when none. */\n #toolName: string | null = null;\n\n /**\n * Park a new approval for `toolName` and return a promise that resolves once\n * {@link resolve} is called with the user's decision. The caller awaits this\n * while the run is suspended on the gate.\n */\n arm({ toolName }: { toolName: string }): Promise {\n this.#toolName = toolName;\n return new Promise(resolve => {\n this.#resolve = resolve;\n });\n }\n\n /** Whether an approval is currently parked awaiting a decision. */\n isArmed(): boolean {\n return this.#resolve !== null;\n }\n\n /**\n * Apply a user's {@link ApprovalResponse} to the parked gate. A no-op when\n * nothing is armed. `always_allow_category` runs `onAlwaysAllow` with the\n * gated tool name (so the caller can grant the tool's category — a lookup that\n * needs Harness config) and then approves; `approve`/`decline` resolve as-is.\n */\n respond({\n decision,\n requestContext,\n onAlwaysAllow,\n }: ApprovalResponse & { onAlwaysAllow?: (toolName: string) => void }): void {\n if (!this.isArmed()) return;\n\n if (decision === 'always_allow_category' && this.#toolName) {\n onAlwaysAllow?.(this.#toolName);\n }\n\n const resolved: ApprovalDecision = {\n decision: decision === 'decline' ? 'decline' : 'approve',\n requestContext,\n };\n this.#resolve?.(resolved);\n this.#resolve = null;\n this.#toolName = null;\n }\n\n /**\n * Release a parked gate without a user decision — used when the run is\n * aborted. Resolves the awaiting producer as a `decline` so the gated tool is\n * rejected (not run) and the run can finalize. A no-op when nothing is armed.\n */\n cancel(): void {\n if (!this.isArmed()) return;\n this.#resolve?.({ decision: 'decline' });\n this.#resolve = null;\n this.#toolName = null;\n }\n\n /** Clear the gated tool name once a parked approval has been consumed. */\n clearToolName(): void {\n this.#toolName = null;\n }\n}\n\n/**\n * Owns the session's transient run identity and abort control: the id of the\n * run currently streaming on the active thread, its trace id, a monotonic\n * operation counter bumped each time a new operation starts, and the\n * AbortController/abort-requested flag governing cancellation. All of this is\n * per-run scratch state — it is never persisted and resets between runs.\n *\n * The live agent subscription itself lives on {@link SessionStream}\n * (`session.stream`); this holds the last run id observed on a chunk so callers\n * have a stable value once the subscription has settled.\n */\nexport class SessionRun {\n /** Id of the run currently streaming on the active thread, or null when idle. */\n #runId: string | null = null;\n /** Trace id for the current run, or null when unset. */\n #traceId: string | null = null;\n /** Monotonic counter bumped at the start of each operation. */\n #operationId = 0;\n /** Controller whose signal cancels the active run; null when no run is armed. */\n #abortController: AbortController | null = null;\n /** Whether an abort has been requested for the current run. */\n #abortRequested = false;\n\n /** The current run id (null when idle). */\n getRunId(): string | null {\n return this.#runId;\n }\n\n /** Set the current run id. */\n setRunId({ runId }: { runId: string | null }): void {\n this.#runId = runId;\n }\n\n /** The current trace id (null when unset). */\n getTraceId(): string | null {\n return this.#traceId;\n }\n\n /** Set the current trace id. */\n setTraceId({ traceId }: { traceId: string | null }): void {\n this.#traceId = traceId;\n }\n\n /**\n * Clear all run state (run id, trace id, abort controller + requested flag)\n * when a run ends or is reset. Does not touch the operation counter.\n */\n reset(): void {\n this.#runId = null;\n this.#traceId = null;\n this.#abortController = null;\n this.#abortRequested = false;\n }\n\n /** Bump and return the operation counter at the start of a new operation. */\n nextOperation(): number {\n this.#operationId += 1;\n return this.#operationId;\n }\n\n /**\n * Lazily create (if needed) and return the AbortController for the current\n * run. Callers pass its `.signal` into the underlying stream.\n */\n ensureAbortController(): AbortController {\n this.#abortController ??= new AbortController();\n return this.#abortController;\n }\n\n /** Signal for the current run's AbortController, or undefined when none is armed. */\n getAbortSignal(): AbortSignal | undefined {\n return this.#abortController?.signal;\n }\n\n /**\n * Whether a run is currently in progress. A run is armed with an\n * AbortController for its duration, so the presence of one is what \"running\"\n * means; this is the semantic accessor callers should use.\n */\n isRunning(): boolean {\n return this.#abortController !== null;\n }\n\n /**\n * Whether an AbortController is currently armed. Equivalent to\n * {@link isRunning} today; kept for callers that assert on the controller's\n * lifecycle specifically (e.g. that it was cleared after an abort).\n */\n hasAbortController(): boolean {\n return this.#abortController !== null;\n }\n\n /** Clear the abort-requested flag at the start of a fresh run. */\n clearAbortRequested(): void {\n this.#abortRequested = false;\n }\n\n /** Whether an abort has been requested for the current run. */\n isAbortRequested(): boolean {\n return this.#abortRequested;\n }\n\n /**\n * Request an abort: mark the run as aborting and fire the AbortController (if\n * armed), then drop the controller. Leaves the requested flag set so the\n * run-end path can resolve its reason as 'aborted'; {@link reset} clears it.\n */\n requestAbort(): void {\n this.#abortRequested = true;\n if (this.#abortController) {\n try {\n this.#abortController.abort();\n } catch {}\n this.#abortController = null;\n }\n }\n}\n\n/**\n * Owns the session's currently-selected model. Source of truth for \"which model\n * is active\", plus the per-mode model memory persisted to the thread-settings\n * store (so each mode remembers the model it was last used with).\n */\nexport class SessionModel {\n #id = '';\n readonly #store: () => ThreadSettingsStore | undefined;\n\n constructor(store: () => ThreadSettingsStore | undefined) {\n this.#store = store;\n }\n\n /** The currently-selected model id ('' when none selected yet). */\n get(): string {\n return this.#id;\n }\n\n /** Whether a model is currently selected. */\n hasSelection(): boolean {\n return this.#id !== '';\n }\n\n /** Set the in-memory selected model id (no persistence). */\n set({ modelId }: { modelId: string }): void {\n this.#id = modelId;\n }\n\n /** Persist `modelId` as the last-used model for `modeId`. */\n async saveForMode({ modeId, modelId }: { modeId: string; modelId: string }): Promise {\n await this.#store()?.set(modeModelKey(modeId), modelId);\n }\n\n /**\n * Resolve the model for `modeId`: the persisted per-mode model if present,\n * else `defaultModelId`, else null.\n */\n async resolveForMode({\n modeId,\n defaultModelId,\n }: {\n modeId: string;\n defaultModelId?: string;\n }): Promise {\n const stored = (await this.#store()?.get(modeModelKey(modeId))) as string | undefined;\n if (stored) return stored;\n return defaultModelId ?? null;\n }\n}\n\n/**\n * Owns the session's currently-selected mode and the logic for switching modes.\n * Holds the active mode id and runs the version-guarded switch sequence —\n * persisting the selection and coordinating the per-mode model with\n * {@link SessionModel}. The Harness still owns the mode *definitions*\n * (`config.modes`); this owns \"which mode is active\" and how a switch unfolds.\n */\nexport class SessionMode {\n /** Id of the currently-selected mode. Empty until the Harness resolves its default mode. */\n #id = '';\n /**\n * Monotonically increasing counter bumped on each switch. A slower in-flight\n * switch detects it was superseded by a newer one and bails.\n */\n #switchVersion = 0;\n readonly #store: () => ThreadSettingsStore | undefined;\n readonly #model: SessionModel;\n /**\n * Resolves a mode id to its full definition. Injected by the Harness via\n * {@link setResolver}, since the mode *catalog* (`config.modes`) is host config.\n */\n #resolveMode: ((modeId: string) => HarnessMode | null) | undefined;\n\n constructor(store: () => ThreadSettingsStore | undefined, model: SessionModel) {\n this.#store = store;\n this.#model = model;\n }\n\n /**\n * Attach the resolver that maps a mode id to its definition. The Harness owns\n * the mode catalog (`config.modes`) and injects this once.\n */\n setResolver(resolve: (modeId: string) => HarnessMode | null): void {\n this.#resolveMode = resolve;\n }\n\n /** The currently-selected mode id. */\n get(): string {\n return this.#id;\n }\n\n /**\n * Resolve the currently-selected mode id to its full definition against the\n * host's mode catalog. Throws if the selected mode id isn't in the catalog.\n */\n resolve(): HarnessMode {\n const mode = this.#resolveMode?.(this.#id) ?? null;\n if (!mode) {\n throw new Error(`Mode not found: ${this.#id}`);\n }\n return mode;\n }\n\n /** Set the currently-selected mode id (on default resolution or hydration). */\n set({ modeId }: { modeId: string }): void {\n this.#id = modeId;\n }\n\n /**\n * Switch to `modeId`, coordinating the selected model and persistence.\n *\n * The Harness handles aborting in-flight work and emitting events; this owns\n * the version-guarded sequence: remember the outgoing mode's model, persist\n * the new mode, then resolve and apply the incoming mode's model. A newer\n * switch starting mid-flight supersedes this one, which then bails.\n *\n * Returns the resolved model id for the new mode (or null), so the caller can\n * emit `model_changed` after applying it.\n */\n async switch({\n modeId,\n defaultModelId,\n }: {\n modeId: string;\n defaultModelId?: string;\n }): Promise<{ modelId: string | null }> {\n const previousModeId = this.#id;\n const previousModelId = this.#model.get();\n const version = ++this.#switchVersion;\n this.#id = modeId;\n\n // Remember the outgoing mode's model before moving on.\n if (previousModelId) {\n await this.#model.saveForMode({ modeId: previousModeId, modelId: previousModelId });\n }\n if (this.#switchVersion !== version) return { modelId: null };\n\n await this.#store()?.set(MODE_ID_KEY, modeId);\n if (this.#switchVersion !== version) return { modelId: null };\n\n const modelId = await this.#model.resolveForMode({ modeId, defaultModelId });\n if (this.#switchVersion !== version) return { modelId: null };\n if (modelId) {\n this.#model.set({ modelId });\n }\n return { modelId };\n }\n}\n\ntype SessionStateUpdater = HarnessRequestStateUpdater;\n\ninterface SessionStateOptions {\n initialState?: Partial;\n stateSchema?: PublicSchema;\n emit?: (event: HarnessEvent) => void;\n}\n\n/**\n * Owns the live Harness state for a single Session.\n *\n * Reads return shallow snapshots, writes are serialized through a promise queue,\n * and validated updates emit the same `state_changed` event the Harness used to\n * emit when it owned state directly.\n */\nclass SessionState {\n #state: TState;\n #updateQueue: Promise = Promise.resolve();\n readonly #schema: StandardSchemaWithJSON | undefined;\n readonly #emit: ((event: HarnessEvent) => void) | undefined;\n\n constructor({ initialState, stateSchema, emit }: SessionStateOptions) {\n this.#schema = stateSchema ? toStandardSchema(stateSchema) : undefined;\n this.#state = {\n ...this.getSchemaDefaults(),\n ...(initialState as Record | undefined),\n } as TState;\n this.#emit = emit;\n }\n\n get(): Readonly {\n return { ...(this.#state as Record) } as TState;\n }\n\n private getSchemaDefaults(): Partial {\n if (!this.#schema) return {};\n\n const defaults: Record = {};\n\n try {\n // Extract defaults from the JSON Schema representation.\n const jsonSchema = this.#schema['~standard'].jsonSchema.output({ target: 'draft-07' }) as {\n properties?: Record;\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;\n }\n\n private async apply(updates: Partial): Promise {\n const changedKeys = Object.keys(updates as Record);\n const newState = { ...(this.#state as Record), ...(updates as Record) };\n\n if (this.#schema) {\n const result = await this.#schema['~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.get() as Record, changedKeys });\n }\n\n set(updates: Partial): Promise {\n const updateSnapshot = { ...(updates as Record) } as Partial;\n const run = this.#updateQueue.then(() => this.apply(updateSnapshot));\n this.#updateQueue = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }\n\n update(updater: SessionStateUpdater): Promise {\n const run = this.#updateQueue.then(async () => {\n const update = await updater(this.get());\n if (update.updates && Object.keys(update.updates as Record).length > 0) {\n await this.apply(update.updates);\n }\n for (const event of update.events ?? []) {\n this.#emit?.(event);\n }\n return update.result;\n });\n\n this.#updateQueue = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n }\n}\n\n/**\n * A Harness session owns the per-conversation runtime state that today lives\n * flattened on the {@link Harness} instance. This class is the seam we extract\n * that state into, one concern at a time, so the Harness can eventually own a\n * `Session` rather than the state itself.\n *\n * Currently owns:\n * - the live Harness state (`session.state`): schema-validated snapshots and\n * serialized updates that emit `state_changed`. `Harness.getState()` /\n * `Harness.setState()` are compatibility wrappers over this domain.\n * - session-scoped permission grants — the \"allow for this session\" approvals a\n * user makes when a tool or tool category is gated behind the permission check.\n * - the live token-usage counter for the active thread. The Session holds the\n * in-memory running tally; the Harness remains responsible for persisting it\n * to (and hydrating it from) thread metadata, because usage is thread-scoped.\n * - the currently-selected mode (`session.mode`) and model (`session.model`).\n * The Session is the source of truth for which mode/model is active and owns\n * the mode-switch sequence and per-mode model memory. The Harness still owns\n * the mode *definitions* (`config.modes`).\n * - transient run identity and abort control (`session.run`): the current run\n * id, trace id, monotonic operation counter, and the AbortController/\n * abort-requested flag. This is per-run scratch state and is never persisted.\n * - the live agent thread subscription (`session.stream`): the open\n * subscription to the active thread's event stream and its dedup key. The\n * Harness still produces the subscription (calling the agent) and consumes its\n * stream; the Session owns the handle and its lifecycle.\n * - the parked tool suspensions (`session.suspensions`): tool calls paused via\n * the native tool-suspension primitive awaiting a resume, keyed by toolCallId.\n * The Session owns the resume data; the Harness keeps the richer per-suspension\n * UI snapshot on its display state.\n * - the follow-up queue (`session.followUps`): messages a user submits while a\n * run is in progress, held FIFO until the run finishes. The Session owns the\n * queue; the Harness drives draining and keeps the `queuedFollowUps` display\n * mirror.\n * - the interactive tool-approval gate (`session.approval`): when a tool needs\n * user approval, the run parks on a promise here until the UI responds. The\n * Session owns the gate; the Harness maps the decision to its effects (run vs\n * decline, any \"always allow\" grant), which touch config-derived categories.\n *\n * It also exposes a couple of accessors that compose `run` and `stream`:\n * {@link getCurrentRunId} (the active run id, preferring the live subscription)\n * and {@link abortRun} (abort the live run and mark it aborting).\n *\n * Mode/model persistence is thread-scoped, so the Session writes through a\n * {@link ThreadSettingsStore} the Harness backs with thread metadata; when no\n * storage is configured the store is absent and state stays in memory.\n */\n/**\n * Owns the session's canonical display state — the projection a UI renders from\n * instead of folding raw events itself. The Session holds the snapshot and the\n * reducer ({@link apply}) that keeps it in sync with every Harness event; the\n * Harness still owns the event bus and dispatches `display_state_changed` to\n * listeners after applying.\n *\n * The reducer needs a few read-only host/session facts it doesn't own: the live\n * token-usage tally, a subagent display-name lookup (Harness config), and the\n * active thread id (to decide whether a `thread_deleted` clears the view). Those\n * are injected at construction so the reducer stays self-contained.\n */\nexport class SessionDisplayState {\n #state: HarnessDisplayState = defaultDisplayState();\n\n constructor(\n private readonly deps: {\n /** The session's live token-usage tally, mirrored into the view on usage/thread events. */\n getTokenUsage: () => TokenUsage;\n /** Resolve a subagent's display name from Harness config, or undefined when unnamed. */\n getSubagentDisplayName: (agentType: string) => string | undefined;\n /** The active thread id, used to gate `thread_deleted` resets. */\n getThreadId: () => string | null;\n /** Clear the session's follow-up queue when thread-scoped display state resets. */\n clearFollowUps: () => void;\n },\n ) {}\n\n /**\n * A read-only snapshot of the canonical display state. UIs should render from\n * this instead of building state up from raw events.\n */\n get(): Readonly {\n return this.#state;\n }\n\n /**\n * Drop the display mirror of every parked tool suspension. Used on abort,\n * which abandons the run's parked suspensions; the caller dispatches\n * `display_state_changed`.\n */\n clearPendingSuspensions(): void {\n this.#state.pendingSuspensions.clear();\n }\n\n /**\n * Clear the modified-files tally without touching the rest of the snapshot.\n * Used after a clone, which starts the cloned thread with a clean working set\n * while the surrounding UI reset handles tasks/tools explicitly.\n */\n clearModifiedFiles(): void {\n this.#state.modifiedFiles.clear();\n }\n\n /**\n * Drop the display mirror of a single parked tool suspension once it has been\n * resumed, so the UI stops rendering only the resolved prompt while any other\n * parked suspensions stay visible.\n */\n deletePendingSuspension(toolCallId: string): void {\n this.#state.pendingSuspensions.delete(toolCallId);\n }\n\n /**\n * Restore task display state after a UI replays persisted task-tool history.\n * Updates the snapshot without emitting a live `task_updated` event, since no\n * task tool just ran. The caller dispatches `display_state_changed`.\n */\n restoreTasks(tasks: TaskItemSnapshot[]): void {\n this.#state.previousTasks = [...this.#state.tasks];\n this.#state.tasks = [...tasks];\n }\n\n /**\n * Reset display fields scoped to a thread. Called on thread switch/creation.\n * Also clears the session's follow-up queue (mirrored by `queuedFollowUps`).\n */\n resetThread(): void {\n const ds = this.#state;\n ds.activeTools = new Map();\n ds.toolInputBuffers = new Map();\n ds.pendingApproval = null;\n ds.pendingSuspensions = new Map();\n ds.activeSubagents = new Map();\n ds.currentMessage = null;\n this.deps.clearFollowUps();\n ds.queuedFollowUps = 0;\n ds.modifiedFiles = new Map();\n ds.tasks = [];\n ds.previousTasks = [];\n ds.omProgress = defaultOMProgressState();\n ds.bufferingMessages = false;\n ds.bufferingObservations = false;\n }\n\n /**\n * Apply a display-state update based on an incoming event. The centralized\n * state machine that keeps {@link HarnessDisplayState} in sync with every\n * event the Harness emits.\n */\n apply(event: HarnessEvent): void {\n const ds = this.#state;\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 // Parked tool suspensions are intentionally NOT cleared here: resuming\n // one parked tool restarts the run (a fresh agent_start) and the other\n // parallel prompts must stay rendered until they are resolved.\n break;\n\n case 'agent_end':\n ds.isRunning = false;\n ds.pendingApproval = null;\n // A suspended run keeps its pending tool suspensions alive so the UI can\n // still render the prompts (e.g. `ask_user`, which pauses via the native\n // tool-suspension primitive). When the run ends for any other reason the\n // parked suspensions are abandoned, so clear them all.\n if (event.reason !== 'suspended') {\n ds.pendingSuspensions.clear();\n }\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;\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.pendingSuspensions.set(event.toolCallId, {\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 // ── Subagent tracking ──────────────────────────────────────────────\n case 'subagent_start': {\n const displayName = this.deps.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.deps.getTokenUsage();\n break;\n\n // ── Tasks ──────────────────────────────────────────────────────────\n case 'task_updated':\n ds.previousTasks = [...ds.tasks];\n ds.tasks = event.tasks;\n break;\n\n // ── Follow-up queue ────────────────────────────────────────────────\n case 'follow_up_queued':\n ds.queuedFollowUps = event.count;\n break;\n\n // ── Thread lifecycle ───────────────────────────────────────────────\n case 'thread_changed':\n this.resetThread();\n ds.tokenUsage = this.deps.getTokenUsage();\n break;\n\n case 'thread_created':\n this.resetThread();\n ds.tokenUsage = createEmptyTokenUsage();\n break;\n\n case 'thread_deleted':\n if (!this.deps.getThreadId()) {\n this.resetThread();\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).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).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\nexport class Session {\n /** Tool categories the user has granted \"allow\" for the lifetime of this session. */\n readonly #grantedCategories = new Set();\n /** Individual tool names the user has granted \"allow\" for the lifetime of this session. */\n readonly #grantedTools = new Set();\n /** Running token-usage tally for the active thread. */\n #tokenUsage: TokenUsage = createEmptyTokenUsage();\n /** Thread-settings persistence handle, injected by the Harness via {@link setStore}. */\n #store: ThreadSettingsStore | undefined;\n /** Resolves a tool name to its category, injected by the Harness via {@link setCategoryResolver} (the category map is Harness config). */\n #resolveCategory: ((toolName: string) => ToolCategory | null) | undefined;\n /** Resolves a subagent's display name from Harness config, injected via {@link setSubagentNameResolver}. */\n #resolveSubagentName: ((agentType: string) => string | undefined) | undefined;\n /** The session's currently-selected model (source of truth) + per-mode memory. */\n readonly model = new SessionModel(() => this.#store);\n /** The session's currently-selected mode and switch sequence. */\n readonly mode = new SessionMode(() => this.#store, this.model);\n /** Transient run identity (run id, trace id, operation counter) for the active run. */\n readonly run = new SessionRun();\n /** Live subscription to the active thread's agent event stream. */\n readonly stream = new SessionStream();\n /** Tool calls parked awaiting a resume (the resume data, keyed by toolCallId). */\n readonly suspensions = new SessionSuspensions();\n /** Messages queued to send after the active run finishes. */\n readonly followUps = new SessionFollowUps();\n /** The interactive tool-approval gate the current run parks on. */\n readonly approval = new SessionApproval();\n /** The session's identity: the memory resourceId it reads/writes under. */\n readonly identity: SessionIdentity;\n /** The session's thread domain: current binding + reads scoped to it. */\n readonly thread: SessionThread;\n /** The canonical display state a UI renders, plus the reducer that maintains it. */\n readonly displayState: SessionDisplayState;\n /** The session-owned Harness state domain. */\n readonly state: HarnessRequestState;\n\n constructor({ resourceId, state }: { resourceId: string; state?: SessionStateOptions }) {\n this.identity = new SessionIdentity({ resourceId });\n this.thread = new SessionThread(() => this.identity.getResourceId());\n this.displayState = new SessionDisplayState({\n getTokenUsage: () => this.getTokenUsage(),\n getSubagentDisplayName: agentType => this.#resolveSubagentName?.(agentType),\n getThreadId: () => this.thread.getId(),\n clearFollowUps: () => this.followUps.clear(),\n });\n this.state = new SessionState(state ?? { initialState: {} as TState });\n }\n\n /**\n * Attach the thread-settings store the Session persists mode/model through.\n * The Harness calls this once storage is available; without it, mode/model\n * state lives purely in memory.\n */\n setStore(store: ThreadSettingsStore | undefined): void {\n this.#store = store;\n }\n\n /**\n * Attach the tool→category resolver used when a user picks \"always allow\n * category\". The category map is Harness config, so the Harness injects this\n * once; without it, an \"always_allow_category\" decision simply approves.\n */\n setCategoryResolver(resolveCategory: (toolName: string) => ToolCategory | null): void {\n this.#resolveCategory = resolveCategory;\n }\n\n /**\n * Attach the subagent display-name resolver the display-state reducer uses to\n * label active subagents. The subagent catalog is Harness config, so the\n * Harness injects this once; without it, subagents render without a name.\n */\n setSubagentNameResolver(resolveSubagentName: (agentType: string) => string | undefined): void {\n this.#resolveSubagentName = resolveSubagentName;\n }\n\n /**\n * The id of the run currently active on this session: the live subscription's\n * active run id when it is streaming, falling back to the last run id the run\n * tracker observed. Null when the session is idle.\n */\n getCurrentRunId(): string | null {\n return this.stream.activeRunId() ?? this.run.getRunId();\n }\n\n /**\n * Abort the session's active run: drop any parked tool suspensions, abort the\n * live subscription's in-flight run, and mark the run as aborting so the\n * run-end path resolves its reason as 'aborted'.\n *\n * Dropping the parked suspensions matters because a run sitting in a tool\n * `suspend()` (e.g. `ask_user` / `request_access`) is not actively streaming,\n * so aborting the controller alone would leave it orphaned. The Harness still\n * clears its own display-state mirror of those suspensions separately.\n *\n * Releasing a parked tool-approval gate matters for the same reason: a run\n * awaiting `approval.arm()` is not streaming, so we resolve it as a decline so\n * the gated tool is rejected and the run can finalize rather than hang.\n */\n abortRun(): void {\n this.suspensions.clear();\n this.approval.cancel();\n this.stream.abort();\n this.run.requestAbort();\n }\n\n /**\n * Respond to the parked tool-approval gate with the user's decision. A no-op\n * when nothing is awaiting approval. \"always_allow_category\" grants the gated\n * tool's category for the rest of the session (resolved via the injected\n * {@link setCategoryResolver}) and then approves; \"approve\"/\"decline\" release\n * the run as-is.\n */\n respondToToolApproval({\n decision,\n requestContext,\n }: {\n decision: 'approve' | 'decline' | 'always_allow_category';\n requestContext?: RequestContext;\n }): void {\n this.approval.respond({\n decision,\n requestContext,\n onAlwaysAllow: toolName => {\n const category = this.#resolveCategory?.(toolName);\n if (category) this.grantCategory(category);\n },\n });\n }\n\n /** Grant a tool category \"allow\" for the remainder of the session. */\n grantCategory(category: ToolCategory): void {\n this.#grantedCategories.add(category);\n }\n\n /** Grant an individual tool \"allow\" for the remainder of the session. */\n grantTool(toolName: string): void {\n this.#grantedTools.add(toolName);\n }\n\n /** Whether the given tool category has been granted for the session. */\n hasCategoryGrant(category: ToolCategory): boolean {\n return this.#grantedCategories.has(category);\n }\n\n /** Whether the given tool has been granted for the session. */\n hasToolGrant(toolName: string): boolean {\n return this.#grantedTools.has(toolName);\n }\n\n /** Snapshot of all session-scoped grants. */\n getGrants(): { categories: ToolCategory[]; tools: string[] } {\n return {\n categories: [...this.#grantedCategories] as ToolCategory[],\n tools: [...this.#grantedTools],\n };\n }\n\n /** A copy of the running token-usage tally for the active thread. */\n getTokenUsage(): TokenUsage {\n return { ...this.#tokenUsage };\n }\n\n /**\n * Replace the running tally, e.g. when hydrating from persisted thread\n * metadata on thread switch.\n */\n setTokenUsage(usage: TokenUsage): void {\n this.#tokenUsage = { ...usage };\n }\n\n /** Reset the running tally to zero, e.g. on a new/empty thread. */\n resetTokenUsage(): void {\n this.#tokenUsage = createEmptyTokenUsage();\n }\n\n /** Fold a single step's usage into the running tally. */\n addUsage(stepUsage: TokenUsage): void {\n this.#tokenUsage.promptTokens += stepUsage.promptTokens;\n this.#tokenUsage.completionTokens += stepUsage.completionTokens;\n this.#tokenUsage.totalTokens += stepUsage.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}\n","import { z } from 'zod/v4';\n\nimport { Agent } from '../agent';\nimport type { ToolsInput, ToolsetsInput } from '../agent/types';\nimport type { MastraModelConfig } from '../llm/model/shared.types';\nimport { RequestContext } from '../request-context';\nimport { askUserTool } from '../tools/builtin/ask-user';\nimport { submitPlanTool } from '../tools/builtin/submit-plan';\nimport { summarizeTaskCheck } from '../tools/builtin/task-tools';\nimport { createTool } from '../tools/tool';\nimport { createWorkspaceTools } from '../workspace/tools/tools';\n\nimport type { HarnessRequestContext, HarnessSubagent } from './types';\n\n// `ask_user` is an agent-agnostic built-in tool. It is defined in\n// `../tools/builtin/ask-user` and re-exported here so the Harness toolset and\n// existing imports keep referencing the same tool object (preserving toolset\n// identity and the prompt-cache prefix). It pauses via the native tool\n// suspension primitive rather than any harness-specific request context.\nexport { askUserTool };\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// `submit_plan` is an agent-agnostic built-in tool. It is defined in\n// `../tools/builtin/submit-plan` and re-exported here so the Harness toolset and\n// existing imports keep referencing the same tool object (preserving toolset\n// identity and the prompt-cache prefix). It pauses via the native tool\n// suspension primitive rather than any harness-specific request context; the\n// Harness layers its plan→default mode switch on top of the approval in its own\n// `respondToToolSuspension` handling.\nexport { submitPlanTool };\n\n// =============================================================================\n// Task Tools\n// =============================================================================\n//\n// The four task tools are agent-agnostic built-ins defined in\n// `../tools/builtin/task-tools`. They persist the task list through the agent\n// state-signal lane (see `../tools/builtin/task-state-processor`) and no longer\n// depend on the Harness request context. They are re-exported here so the\n// Harness toolset and existing imports keep referencing the same tool objects\n// (preserving toolset identity and the prompt-cache prefix).\nexport {\n taskWriteTool,\n taskUpdateTool,\n taskCompleteTool,\n taskCheckTool,\n assignTaskIds,\n summarizeTaskCheck,\n} from '../tools/builtin/task-tools';\nexport type {\n TaskItem,\n TaskItemInput,\n TaskItemSnapshot,\n TaskCheckResult,\n TaskCheckSummary,\n} from '../tools/builtin/task-tools';\nexport { TaskStateProcessor } from '../tools/builtin/task-state-processor';\n\n// =============================================================================\n// Subagent Tool\n// =============================================================================\n\nexport interface CreateSubagentToolOptions {\n subagents: HarnessSubagent[];\n resolveModel: (modelId: string) => MastraModelConfig;\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;\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 }) => { 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: MastraModelConfig;\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 `` 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, { 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, { execute: stubExecute });\n}\n\n/**\n * Parse subagent metadata from a tool result string.\n *\n * Older persisted threads may have an internal `` 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$/);\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 { randomUUID } from 'node:crypto';\n\nimport { Agent } from '../agent';\nimport type { MastraDBMessage } from '../agent/message-list/state/types';\nimport { createSignal, mastraDBMessageToSignal } from '../agent/signals';\nimport type { AgentSignalAttributes, AgentSignalContents, AgentSignalInput } from '../agent/signals';\nimport type {\n AgentInstructions,\n AgentThreadSubscription,\n SendAgentNotificationSignalOptions,\n SendAgentNotificationSignalResult,\n ToolsInput,\n ToolsetsInput,\n} from '../agent/types';\nimport type { MastraBrowser } from '../browser/browser';\nimport { getErrorFromUnknown } from '../error';\nimport { getServerSideFallbackInfo } from '../llm/model/server-side-fallback';\nimport { Mastra } from '../mastra';\nimport type { MastraMemory } from '../memory/memory';\nimport type { StorageThreadType } from '../memory/types';\nimport type { SendNotificationSignalInput } from '../notifications';\nimport type { TracingContext, TracingOptions } from '../observability';\nimport { RequestContext } from '../request-context';\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 { Workspace } from '../workspace/workspace';\nimport type { WorkspaceConfig } from '../workspace/workspace';\n\nimport { Session, SessionStream } from './session';\nimport type { ThreadDataStore } from './session';\nimport {\n askUserTool,\n createSubagentTool,\n submitPlanTool,\n taskCheckTool,\n taskCompleteTool,\n taskUpdateTool,\n taskWriteTool,\n} from './tools';\nimport { createEmptyTokenUsage } from './types';\nimport type {\n AvailableModel,\n HeartbeatHandler,\n HarnessConfig,\n HarnessEvent,\n HarnessEventListener,\n HarnessMessage,\n HarnessMessageContent,\n HarnessMode,\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 lastFinishedMessage?: HarnessMessage;\n isSuspended: boolean;\n textContentById: Map;\n thinkingContentById: Map;\n /**\n * Set when a stream ends on a non-success finish reason (e.g. `content-filter`,\n * `error`, `length`). Carries the user-facing message so the run finalizes\n * into an explicit terminal error state instead of silently completing.\n */\n terminalError?: string;\n};\n\nfunction validateModes(modes: HarnessMode[]): void {\n const modeIds = new Set();\n\n for (const mode of modes) {\n if (modeIds.has(mode.id)) {\n throw new Error(`Duplicate mode id \"${mode.id}\" found when creating the Harness`);\n }\n\n modeIds.add(mode.id);\n\n const modeRecord = mode as unknown as { id: string; tools?: unknown; additionalTools?: unknown };\n if (modeRecord.tools && modeRecord.additionalTools) {\n throw new Error(\n `Mode \"${modeRecord.id}\" cannot set both \"tools\" and \"additionalTools\" - choose replace OR augment`,\n );\n }\n }\n\n for (const mode of modes) {\n if (mode.transitionsTo === mode.id) {\n throw new Error(`Mode \"${mode.id}\" transitionsTo cannot reference itself`);\n }\n if (mode.transitionsTo && !modeIds.has(mode.transitionsTo)) {\n throw new Error(`Mode \"${mode.id}\" transitionsTo references unknown mode \"${mode.transitionsTo}\"`);\n }\n }\n}\n\ntype HarnessSendNotificationSignalOptions = {\n ifActive?: SendAgentNotificationSignalOptions['ifActive'];\n ifIdle?: SendAgentNotificationSignalOptions['ifIdle'];\n tracingContext?: TracingContext;\n tracingOptions?: TracingOptions;\n requestContext?: RequestContext;\n};\n\n/**\n * Build a user-facing message for a non-success stream finish reason.\n *\n * Anthropic's classifier blocks / model refusals (e.g. `claude-fable-5`) surface\n * through the AI SDK as a `content-filter` finish reason, with details on\n * `providerMetadata.anthropic.stopDetails`. Without explicit handling these\n * runs end on an empty assistant message with no error, so the run appears to\n * silently stop. Returning a message here lets the harness finalize the run\n * into an explicit terminal error state.\n */\nexport function describeNonSuccessFinishReason(reason: string, providerMetadata: unknown): string | undefined {\n switch (reason) {\n case 'content-filter': {\n const stopDetails = (providerMetadata as { anthropic?: { stopDetails?: Record } } | undefined)\n ?.anthropic?.stopDetails;\n const explanation =\n stopDetails && typeof stopDetails.explanation === 'string' ? stopDetails.explanation : undefined;\n const category = stopDetails && typeof stopDetails.category === 'string' ? stopDetails.category : undefined;\n const detail = explanation ?? (category ? `category: ${category}` : undefined);\n return detail ? `The model stopped on a content filter (${detail}).` : 'The model stopped on a content filter.';\n }\n case 'error':\n return 'The model stream ended with an error before producing a final response.';\n case 'length':\n return 'The model stopped because it reached its maximum output length before finishing.';\n default:\n return undefined;\n }\n}\n\n/**\n * The Anthropic model that `claude-fable-5` runs are automatically retried on\n * server-side when fable-5's safety classifiers block a turn. See\n * {@link buildFableFallbackProviderOptions}.\n */\nconst FABLE_FALLBACK_MODEL = 'claude-opus-4-8';\n\n/**\n * Step budget applied to every harness-driven agent run.\n *\n * This MUST be passed to both the initial stream and `resumeStream`: when a run\n * suspends on an interactive tool (e.g. `ask_user`) and then resumes, the\n * resumed call merges over the agent's *default* options, whose `maxSteps` is\n * small (~5). Without re-supplying this budget the resumed run is silently\n * capped and ends with `reason:\"complete\"` after a few steps — the agent stops\n * mid-task even though it promised to continue. See {@link buildSharedRunOptions}.\n */\nconst HARNESS_MAX_STEPS = 1000;\n\n/**\n * Returns Anthropic `providerOptions` that enable a server-side fallback to\n * {@link FABLE_FALLBACK_MODEL} when the active model is `claude-fable-5`, and\n * `undefined` otherwise.\n *\n * fable-5 can have a turn blocked server-side by its safety classifiers. With\n * a fallback configured, Anthropic transparently retries the blocked turn on\n * the fallback model and returns that model's answer instead of refusing. If\n * the whole chain refuses, the run still ends on a `content-filter` finish\n * reason, which is handled as a terminal error.\n *\n * The match is suffix-based so it covers `anthropic/claude-fable-5`, a bare\n * `claude-fable-5`, and any pack/provider-prefixed form.\n */\nexport function buildFableFallbackProviderOptions(\n modelId: string,\n): { anthropic: { fallbacks: { model: string }[] } } | undefined {\n if (!/(^|\\/)claude-fable-5$/.test(modelId)) {\n return undefined;\n }\n return { anthropic: { fallbacks: [{ model: FABLE_FALLBACK_MODEL }] } };\n}\n\n/**\n * Build a user-facing notice when a turn was served by an Anthropic\n * server-side fallback model instead of the primary model.\n *\n * When the primary model's safety classifiers decline a turn and a fallback\n * chain is configured (see {@link buildFableFallbackProviderOptions}), the API\n * transparently retries on the fallback model and reports this via\n * `fallback_message` entries in `providerMetadata.anthropic.iterations`.\n * Without a notice the user has no way to tell that the response did not come\n * from the model they selected.\n */\nexport function describeServerSideFallback(providerMetadata: unknown): string | undefined {\n const fallback = getServerSideFallbackInfo(providerMetadata);\n if (!fallback) {\n return undefined;\n }\n return fallback.model\n ? `The selected model declined this turn; the response was generated by fallback model ${fallback.model}.`\n : 'The selected model declined this turn; the response was generated by a fallback model.';\n}\n\nfunction getUsageNumber(usage: Record, 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,\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 | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? (value as Record) : 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,\n): Extract | undefined {\n const attributes = getRecordValue(payload.attributes);\n const metadata = getRecordValue(payload.metadata);\n const message = signalContentsToText(payload.contents);\n if (!message) 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 goalEvaluation: getRecordValue(metadata?.goalEvaluation) as\n | Extract['goalEvaluation']\n | undefined,\n };\n}\n\nfunction toUserSignalMessage(payload: Record): 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',\n tagName: 'user',\n contents: rawContents as AgentSignalContents,\n attributes: getRecordValue(payload.attributes) as AgentSignalInput['attributes'],\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 attributes: signal.attributes,\n };\n}\n\nfunction signalContentsToText(contents: unknown): string {\n if (typeof contents === 'string') return contents;\n if (!Array.isArray(contents)) return '';\n return contents\n .filter((part): part is { type: 'text'; text: string } => getRecordValue(part)?.type === 'text')\n .map(part => part.text)\n .join('\\n');\n}\n\nfunction toStateSignalContent(\n payload: Record,\n): Extract | undefined {\n const stateMetadata = getRecordValue(getRecordValue(payload.metadata)?.state);\n const stateId = getStringValue(stateMetadata?.id) ?? getStringValue(payload.tagName) ?? 'state';\n\n return {\n type: 'state_signal',\n id: getStringValue(payload.id),\n stateId,\n mode: stateMetadata?.mode === 'delta' ? 'delta' : 'snapshot',\n cacheKey: getStringValue(stateMetadata?.cacheKey),\n version: typeof stateMetadata?.version === 'number' ? stateMetadata.version : undefined,\n message: signalContentsToText(payload.contents),\n };\n}\n\nfunction toNotificationSummaryContent(\n payload: Record,\n): Extract | undefined {\n const metadataSummary = getRecordValue(getRecordValue(payload.metadata)?.notificationSummary);\n const bySource = getRecordValue(metadataSummary?.bySource) ?? {};\n const byPriority = getRecordValue(metadataSummary?.byPriority) ?? {};\n const notificationIds = Array.isArray(metadataSummary?.notificationIds)\n ? metadataSummary.notificationIds.filter((id): id is string => typeof id === 'string')\n : [];\n const pending = typeof metadataSummary?.pending === 'number' ? metadataSummary.pending : undefined;\n\n return {\n type: 'notification_summary',\n id: getStringValue(payload.id),\n message: signalContentsToText(payload.contents),\n pending: pending ?? notificationIds.length,\n bySource: Object.fromEntries(\n Object.entries(bySource).filter((entry): entry is [string, number] => typeof entry[1] === 'number'),\n ),\n byPriority: Object.fromEntries(\n Object.entries(byPriority).filter((entry): entry is [string, number] => typeof entry[1] === 'number'),\n ),\n notificationIds,\n };\n}\n\nfunction toReactiveSignalContent(\n payload: Record,\n): Extract | undefined {\n const tagName = getStringValue(payload.tagName);\n if (!tagName) return undefined;\n\n return {\n type: 'reactive_signal',\n id: getStringValue(payload.id),\n tagName,\n message: signalContentsToText(payload.contents),\n attributes: getRecordValue(payload.attributes),\n metadata: getRecordValue(payload.metadata),\n };\n}\n\nfunction toNotificationContent(\n payload: Record,\n): Extract | undefined {\n const attributes = getRecordValue(payload.attributes) ?? {};\n const metadata = getRecordValue(payload.metadata) ?? {};\n const notificationMetadata = getRecordValue(metadata.notification);\n const message = signalContentsToText(payload.contents);\n if (!message) return undefined;\n\n return {\n type: 'notification',\n id: getStringValue(payload.id),\n notificationId: getStringValue(attributes.id) ?? getStringValue(notificationMetadata?.recordId),\n message,\n source: getStringValue(attributes.source) ?? getStringValue(notificationMetadata?.source),\n kind:\n getStringValue(attributes.kind) ?? getStringValue(attributes.type) ?? getStringValue(notificationMetadata?.kind),\n priority: getStringValue(attributes.priority) ?? getStringValue(notificationMetadata?.priority),\n status: getStringValue(attributes.status) ?? getStringValue(notificationMetadata?.status),\n attributes,\n metadata,\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 {\n readonly id: string;\n\n private config: HarnessConfig;\n private listeners: HarnessEventListener[] = [];\n private workspace: Workspace | undefined = undefined;\n private workspaceFn:\n | ((ctx: {\n requestContext: RequestContext;\n mastra?: Mastra;\n }) => Promise | 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)\n | undefined = undefined;\n private heartbeatTimers = new Map void | Promise }>();\n readonly #session: Session;\n private availableModelsCache: AvailableModel[] | null = null;\n private availableModelsCacheTime: number = 0;\n readonly #instructions?: string;\n #internalMastra: Mastra | undefined = undefined;\n #legacyAgentMode: Record> = {};\n\n constructor(config: HarnessConfig) {\n validateModes(config.modes);\n\n this.id = config.id;\n this.config = config;\n this.#instructions = config.instructions;\n\n this.#session = new Session({\n resourceId: config.resourceId ?? config.id,\n state: {\n initialState: config.initialState,\n stateSchema: config.stateSchema,\n emit: event => this.emit(event),\n },\n });\n\n const defaultMode = config.defaultModeId\n ? config.modes.find(mode => mode.id === config.defaultModeId)\n : (config.modes.find(mode => mode.default || mode.metadata?.default === true) ?? config.modes[0]);\n if (!defaultMode) {\n throw new Error(\n config.defaultModeId\n ? `Default mode not found: ${config.defaultModeId}`\n : 'Harness requires at least one agent mode',\n );\n }\n this.#session.mode.set({ modeId: defaultMode.id });\n this.#session.setStore({\n get: key => this.#session.thread.getSetting({ key }),\n set: (key, value) => this.#session.thread.setSetting({ key, value }),\n });\n this.#session.setCategoryResolver(toolName => this.getToolCategory({ toolName }));\n this.#session.setSubagentNameResolver(agentType => this.getSubagentDisplayName(agentType));\n this.#session.mode.setResolver(modeId => this.config.modes.find(m => m.id === modeId) ?? null);\n this.#session.thread.connect(this.createThreadDataStore());\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 the selected model: an explicit initialState.currentModelId wins,\n // otherwise fall back to the default mode's model. The model lives on the\n // session, not in persisted state, so initialState.currentModelId is read\n // here as a construction-time input only.\n const initialModelId = (config.initialState as { currentModelId?: string } | undefined)?.currentModelId;\n if (initialModelId) {\n this.#session.model.set({ modelId: initialModelId });\n } else if (defaultMode.defaultModelId) {\n this.#session.model.set({ modelId: defaultMode.defaultModelId });\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 * The current harness session. Owns per-session runtime state such as\n * session-scoped permission grants. Prefer `harness.session.*` over the\n * (removed) re-exposed grant helpers on the Harness.\n */\n get session(): Session {\n return this.#session;\n }\n\n /**\n * Sets or updates the harness-level browser and propagates it to mode agents.\n */\n setBrowser(browser: MastraBrowser | undefined): void {\n this.browser = browser;\n this.browserFn = undefined;\n\n // Collect unique agents: shared backing agent + any deprecated mode.agent\n // instances so all receive the browser (signal providers may be attached to\n // any of them).\n const agents = new Set>();\n if (this.config.agent) {\n agents.add(this.config.agent);\n }\n for (const mode of this.config.modes) {\n if (mode.agent || !this.config.agent) {\n agents.add(this.getAgentForMode(mode));\n }\n }\n for (const agent of agents) {\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 {\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 const enabledGateways = this.config.gateways?.filter(gateway => gateway.shouldEnable?.() ?? true);\n const gateways = enabledGateways?.length\n ? Object.fromEntries(enabledGateways.map(gateway => [gateway.id, gateway]))\n : undefined;\n\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 ...(gateways ? { gateways } : {}),\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 = getErrorFromUnknown(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\n // to the agent(s) that back each mode (after workspace init).\n // Collect unique agents: shared backing agent + any deprecated mode.agent\n // instances so all receive runtime services.\n const agents = new Set>();\n if (this.config.agent) {\n agents.add(this.config.agent);\n }\n for (const mode of this.config.modes) {\n if (mode.agent || !this.config.agent) {\n agents.add(this.getAgentForMode(mode));\n }\n }\n for (const agent of agents) {\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 {\n const threads = await this.#session.thread.list();\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.#session.thread.set({ threadId: mostRecent.id });\n await this.loadThreadMetadata();\n await this.ensureCurrentAgentThreadSubscription();\n\n return mostRecent;\n }\n\n private async getMemoryStorage(): Promise {\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 * The shared-host storage gateway the Session's thread domain reads/writes\n * through. The Session owns the thread-domain logic; this adapter just maps\n * raw storage rows to Harness types — it does not call back into Session.\n */\n private createThreadDataStore(): ThreadDataStore {\n return {\n listThreads: ({ resourceId, includeForkedSubagents }) =>\n this.queryThreads({ resourceId, includeForkedSubagents }),\n getById: ({ threadId }) => this.queryThreadById({ threadId }),\n listMessages: ({ threadId, limit }) => this.queryThreadMessages({ threadId, limit }),\n firstUserMessages: ({ threadIds }) => this.queryFirstUserMessages({ threadIds }),\n getMetadata: ({ threadId, key }) => this.readThreadMetadataValue({ threadId, key }),\n setMetadata: ({ threadId, key, value }) => this.writeThreadMetadataValue({ threadId, key, value }),\n deleteMetadata: ({ threadId, key }) => this.removeThreadMetadataValue({ threadId, key }),\n };\n }\n\n private async readThreadMetadataValue({ threadId, key }: { threadId: string; key: string }): Promise {\n if (!this.config.storage) return undefined;\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\n const metadata = thread?.metadata as Record | undefined;\n return metadata?.[key];\n } catch {\n // Settings reads are not critical\n return undefined;\n }\n }\n\n private async writeThreadMetadataValue({\n threadId,\n key,\n value,\n }: {\n threadId: string;\n key: string;\n value: unknown;\n }): Promise {\n if (!this.config.storage) return;\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: { ...thread, metadata: { ...thread.metadata, [key]: value }, updatedAt: new Date() },\n });\n }\n } catch {\n // Settings persistence is not critical\n }\n }\n\n private async removeThreadMetadataValue({ threadId, key }: { threadId: string; key: string }): Promise {\n if (!this.config.storage) return;\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\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 queryThreadById({ threadId }: { threadId: string }): Promise {\n if (!this.config.storage) return null;\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\n if (!thread) return null;\n return {\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 private async queryThreads({\n resourceId,\n includeForkedSubagents,\n }: {\n resourceId?: string;\n includeForkedSubagents?: boolean;\n }): Promise {\n if (!this.config.storage) return [];\n\n const memoryStorage = await this.getMemoryStorage();\n const filter: { resourceId?: string } | undefined = resourceId === undefined ? undefined : { resourceId };\n\n const result = await memoryStorage.listThreads({ filter, perPage: false });\n\n const threads = includeForkedSubagents\n ? result.threads\n : result.threads.filter(thread => {\n const metadata = thread.metadata as Record | 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 private async queryThreadMessages({\n threadId,\n limit,\n }: {\n threadId: string;\n limit?: number;\n }): Promise {\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 private async queryFirstUserMessages({ threadIds }: { threadIds: string[] }): Promise> {\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();\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 // ===========================================================================\n // State Management\n // ===========================================================================\n\n /**\n * Get current harness state (read-only snapshot).\n * @deprecated Prefer `harness.session.state.get()`.\n */\n getState(): Readonly {\n return this.#session.state.get();\n }\n\n /**\n * Update harness state. Validates against schema if provided.\n * Emits state_changed event.\n * @deprecated Prefer `harness.session.state.set(...)`.\n */\n async setState(updates: Partial): Promise {\n return this.#session.state.set(updates);\n }\n\n private async updateState(\n updater: (\n state: Readonly,\n ) =>\n | { updates?: Partial; events?: HarnessEvent[]; result: TResult }\n | Promise<{ updates?: Partial; events?: HarnessEvent[]; result: TResult }>,\n ): Promise {\n return this.#session.state.update(updater);\n }\n\n // ===========================================================================\n // Mode Management\n // ===========================================================================\n\n listModes(): HarnessMode[] {\n return this.config.modes;\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 {\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 const previousModeId = this.#session.mode.get();\n\n // Emit the mode change immediately so UIs can update without waiting for\n // the storage round-trips inside session.mode.switch().\n this.emit({ type: 'mode_changed', modeId, previousModeId });\n\n // The session owns the version-guarded switch sequence: remember the\n // outgoing mode's model, persist the new mode, then resolve and apply the\n // incoming mode's model. It returns the resolved model (or null if a newer\n // switch superseded this one) so we can emit model_changed.\n const { modelId } = await this.#session.mode.switch({ modeId, defaultModelId: mode.defaultModelId });\n if (modelId) {\n this.emit({ type: 'model_changed', modelId } as HarnessEvent);\n }\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 private getAgentForMode(mode: HarnessMode): Agent {\n // Deprecated per-mode agent — use directly, no forking.\n if (mode.agent) {\n if (!this.#legacyAgentMode[mode.id]) {\n this.#legacyAgentMode[mode.id] = mode.agent;\n }\n return this.#legacyAgentMode[mode.id]!;\n }\n\n // Shared backing agent — reuse the single instance.\n // The harness never mutates the agent's own instructions or tools.\n // Mode instructions are passed at call time via buildAgentMessageStreamOptions;\n // mode tools are resolved at execution time via buildToolsets.\n if (this.config.agent) {\n return this.config.agent;\n }\n\n // No backing agent — construct one per mode (cached).\n if (!this.#legacyAgentMode[mode.id]) {\n if (!mode.defaultModelId) {\n throw new Error(`Mode ${mode.id} requires a defaultModelId when no backing agent is configured`);\n }\n\n const instructions = [this.#instructions ?? '', mode.instructions].filter(Boolean).join('\\n');\n const modeTools = {\n ...mode.tools,\n ...mode.additionalTools,\n };\n\n const model = this.config.resolveModel ? this.config.resolveModel(mode.defaultModelId) : mode.defaultModelId;\n this.#legacyAgentMode[mode.id] = new Agent({\n id: `${this.id}-agent`,\n name: `Harness ${this.id} agent`,\n model,\n instructions,\n tools: modeTools,\n });\n }\n return this.#legacyAgentMode[mode.id]!;\n }\n\n /**\n * Resolve the combined instructions for the current mode: harness-level\n * instructions + mode-specific instructions. Passed at call time via\n * `buildAgentMessageStreamOptions` so the agent's own instructions are\n * never mutated.\n */\n private resolveCurrentModeInstructions(): string | undefined {\n const mode = this.#session.mode.resolve();\n const combined = [this.#instructions ?? '', mode?.instructions ?? ''].filter(Boolean).join('\\n');\n return combined || undefined;\n }\n\n /**\n * Convert AgentInstructions (string | string[] | system message objects) to\n * a plain string for combining with mode instructions.\n */\n private instructionsToString(instructions: AgentInstructions): string {\n if (typeof instructions === 'string') return instructions;\n if (Array.isArray(instructions)) {\n return instructions\n .map(msg => (typeof msg === 'string' ? msg : typeof msg.content === 'string' ? msg.content : ''))\n .filter(Boolean)\n .join('\\n\\n');\n }\n return typeof instructions.content === 'string' ? instructions.content : '';\n }\n\n /**\n * Get the agent for the current mode.\n */\n /**\n * Resolve the Agent backing the current mode, with runtime services (storage,\n * pubsub, telemetry) propagated. Public so consumers like MastraCode's\n * GoalManager can drive the agent's native objective methods\n * (`setObjective`/`getObjective`/`clearObjective`/`updateObjectiveOptions`),\n * which read/write the durable `threadState` `'goal'` slot.\n */\n getCurrentAgent(): Agent {\n const mode = this.#session.mode.resolve();\n\n return this.propagateRuntimeServicesToAgent(this.getAgentForMode(mode));\n }\n\n /**\n * Get a short display name from the current model ID.\n */\n getModelName(): string {\n const modelId = this.#session.model.get();\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.#session.model.get();\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 {\n const targetModeId = modeId ?? this.#session.mode.get();\n\n if (targetModeId === this.#session.mode.get()) {\n this.#session.model.set({ modelId });\n }\n\n if (scope === 'thread') {\n await this.#session.model.saveForMode({ modeId: targetModeId, 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 /**\n * Check if the current model's provider has authentication configured.\n * Uses app-provided catalog/auth hooks; Harness does not resolve gateway auth itself.\n */\n async getCurrentModelAuthStatus(): Promise {\n const modelId = this.#session.model.get();\n if (!modelId) return { hasAuth: true };\n\n try {\n const availableModels = await this.listAvailableModels();\n const currentModel = availableModels.find(model => model.id === modelId);\n if (currentModel) {\n return {\n hasAuth: currentModel.hasApiKey,\n apiKeyEnvVar: currentModel.hasApiKey ? undefined : currentModel.apiKeyEnvVar,\n };\n }\n } catch {\n // Ignore catalog lookup errors and fall through to provider-based checks.\n }\n\n const provider = modelId.split('/', 1)[0];\n if (this.config.modelAuthChecker && provider) {\n const result = this.config.modelAuthChecker(provider);\n if (result !== undefined) return { hasAuth: result };\n }\n\n return { hasAuth: true };\n }\n\n /**\n * Get available models from the app-provided catalog hook with use counts applied.\n */\n async listAvailableModels(): Promise {\n const now = Date.now();\n if (this.availableModelsCache && now - this.availableModelsCacheTime < 10_000) {\n return this.availableModelsCache;\n }\n\n const useCounts = this.config.modelUseCountProvider?.() ?? {};\n const modelsById = new Map();\n\n const upsertModel = (model: Omit): 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 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 available models:', error);\n }\n }\n\n const result = [...modelsById.values()];\n this.availableModelsCache = result;\n this.availableModelsCacheTime = Date.now();\n return result;\n }\n\n invalidateAvailableModelsCache(): void {\n this.availableModelsCache = null;\n this.availableModelsCacheTime = 0;\n }\n\n // ===========================================================================\n // Thread Management\n // ===========================================================================\n\n async getResolvedMemory(): Promise {\n if (!this.config.memory) return null;\n return this.resolveMemory();\n }\n\n /**\n * Point the session at a different memory resourceId. The resourceId itself\n * lives on the session (`session.identity`); the Harness orchestrates the\n * surrounding teardown — dropping the current thread subscription and clearing\n * the active thread — since those are Harness-owned.\n */\n setResourceId({ resourceId }: { resourceId: string }): void {\n this.cleanupAgentThreadSubscription();\n this.#session.identity.setResourceId({ resourceId });\n this.#session.thread.clear();\n }\n\n async getKnownResourceIds(): Promise {\n const threads = await this.#session.thread.list({ 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 {\n this.cleanupAgentThreadSubscription();\n const now = new Date();\n const thread: HarnessThread = {\n id: this.generateId(),\n resourceId: this.#session.identity.getResourceId(),\n title: title || '',\n createdAt: now,\n updatedAt: now,\n };\n\n const currentStateModel = this.#session.model.get();\n const currentMode = this.#session.mode.resolve();\n const modelId = currentStateModel || currentMode.defaultModelId;\n\n const metadata: Record = {};\n if (modelId) {\n metadata.currentModelId = modelId;\n metadata[`modeModelId_${this.#session.mode.get()}`] = modelId;\n }\n\n // Auto-tag with projectPath from state so threads are scoped to the working directory\n const projectPath = (this.#session.state.get() 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.#session.thread.getId();\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 if (reacquired && oldThreadId) {\n this.#session.thread.set({ threadId: oldThreadId });\n } else {\n this.#session.thread.clear();\n }\n throw err;\n }\n }\n\n this.#session.thread.set({ threadId: thread.id });\n\n if (modelId && !currentStateModel) {\n this.#session.model.set({ modelId });\n }\n\n this.#session.resetTokenUsage();\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: (options?: { allResources?: boolean; includeForkedSubagents?: boolean }) =>\n this.#session.thread.list(options),\n renameThread: this.renameThread.bind(this),\n deleteThread: this.deleteThread.bind(this),\n };\n }\n\n private async deleteThread({ threadId }: { threadId: string }): Promise {\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.#session.thread.getId() === 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.#session.thread.clear();\n this.#session.resetTokenUsage();\n }\n\n this.emit({ type: 'thread_deleted', threadId });\n }\n\n async renameThread({ title }: { title: string }): Promise {\n const threadId = this.#session.thread.getId();\n if (!threadId || !this.config.storage) return;\n\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\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 {\n const sourceId = sourceThreadId ?? this.#session.thread.getId();\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.#session.identity.getResourceId(),\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.#session.thread.getId();\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.#session.thread.set({ threadId: clonedThread.id });\n await this.loadThreadMetadata();\n this.#session.resetTokenUsage();\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 {\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.#session.thread.getId();\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.#session.thread.set({ threadId });\n\n await this.loadThreadMetadata();\n\n this.emit({ type: 'thread_changed', threadId, previousThreadId });\n await this.ensureCurrentAgentThreadSubscription();\n }\n\n private async loadThreadMetadata(): Promise {\n const threadId = this.#session.thread.getId();\n if (!threadId || !this.config.storage) {\n this.#session.resetTokenUsage();\n return;\n }\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\n\n // Load token usage\n const savedUsage = thread?.metadata?.tokenUsage as TokenUsage | undefined;\n if (savedUsage) {\n this.#session.setTokenUsage({\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.#session.resetTokenUsage();\n }\n\n const meta = thread?.metadata as Record | undefined;\n const updates: Record = {};\n\n // Restore the saved mode FIRST so we resolve currentModelId for the\n // correct mode. Otherwise we'd look up modeModelId_ 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.#session.mode.get()) {\n previousModeIdForEmit = this.#session.mode.get();\n this.#session.mode.set({ modeId: savedModeId });\n }\n }\n\n // Resolve the model for the (now-restored) current mode and apply it to\n // the session (source of truth for the selected model).\n // Order: per-mode thread metadata → mode's defaultModelId → legacy\n // global currentModelId (set by createThread).\n const currentModeId = this.#session.mode.get();\n const modeModelKey = `modeModelId_${currentModeId}`;\n if (meta?.[modeModelKey]) {\n this.#session.model.set({ modelId: meta[modeModelKey] as string });\n } else {\n const currentMode = this.config.modes.find(m => m.id === currentModeId);\n if (currentMode?.defaultModelId) {\n this.#session.model.set({ modelId: currentMode.defaultModelId });\n } else if (meta?.currentModelId) {\n this.#session.model.set({ modelId: meta.currentModelId as string });\n }\n }\n\n if (previousModeIdForEmit !== undefined) {\n this.emit({\n type: 'mode_changed',\n modeId: this.#session.mode.get(),\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);\n }\n\n if (!hasObservationThreshold) {\n const observationThreshold = this.getObservationThreshold();\n if (observationThreshold !== undefined) {\n await this.#session.thread.setSetting({ key: 'observationThreshold', value: observationThreshold });\n }\n }\n if (!hasReflectionThreshold) {\n const reflectionThreshold = this.getReflectionThreshold();\n if (reflectionThreshold !== undefined) {\n await this.#session.thread.setSetting({ key: 'reflectionThreshold', value: reflectionThreshold });\n }\n }\n } catch {\n this.#session.resetTokenUsage();\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 {\n const threadId = this.#session.thread.getId();\n if (!threadId) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const record = await memoryStorage.getObservationalMemory(threadId, this.#session.identity.getResourceId());\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,\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;\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 };\n if (part.type === 'data-om-status' && part.data?.windows) {\n const w = part.data.windows as Record>>;\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 | 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 | 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,\n stepNumber,\n generationCount,\n });\n } catch {\n // OM not available or not initialized — that's fine\n }\n }\n\n async getObservationalMemoryRecord(): Promise {\n if (!this.#session.thread.getId()) return null;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n return await memoryStorage.getObservationalMemory(\n this.#session.thread.getId(),\n this.#session.identity.getResourceId(),\n );\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.#session.state.get() 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.#session.state.get() 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.#session.state.get() 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.#session.state.get() as any).reflectionThreshold ?? this.config.omConfig?.defaultReflectionThreshold;\n }\n\n /**\n * Resolves the observer model ID to a language model instance via the configured resolver.\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 the configured resolver.\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 {\n void this.setState({ observerModelId: modelId } as unknown as Partial);\n await this.#session.thread.setSetting({ 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 {\n void this.setState({ reflectorModelId: modelId } as unknown as Partial);\n await this.#session.thread.setSetting({ 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.#session.state.get() as Record;\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 {\n const key = agentType ? `subagentModelId_${agentType}` : 'subagentModelId';\n void this.setState({ [key]: modelId } as unknown as Partial);\n await this.#session.thread.setSetting({ key, value: modelId });\n this.emit({ type: 'subagent_model_changed', modelId, scope: 'thread', agentType } as HarnessEvent);\n }\n\n // ===========================================================================\n // Permissions\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);\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);\n }\n\n getPermissionRules(): PermissionRules {\n const state = this.#session.state.get() as Record;\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.#session.state.get() as Record;\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.#session.hasToolGrant(toolName)) return 'allow';\n\n const category = this.getToolCategory({ toolName });\n if (category) {\n if (this.#session.hasCategoryGrant(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.#session.stream.cleanup();\n this.#session.run.reset();\n }\n\n private async ensureAgentThreadSubscription(agent: Agent, threadId: string): Promise {\n const key = SessionStream.keyFor({ agent, resourceId: this.#session.identity.getResourceId(), threadId });\n if (this.#session.stream.matches({ key })) return;\n\n this.cleanupAgentThreadSubscription();\n const subscription = await agent.subscribeToThread({\n resourceId: this.#session.identity.getResourceId(),\n threadId,\n });\n this.#session.stream.attach({ subscription, key });\n void this.processSubscribedThreadStream(subscription);\n }\n\n private async ensureCurrentAgentThreadSubscription(): Promise {\n const threadId = this.#session.thread.getId();\n if (!threadId) return;\n await this.ensureAgentThreadSubscription(this.getCurrentAgent(), threadId);\n }\n\n private createMessageInput({\n content,\n files,\n }: {\n content: string;\n files?: Array<{ data: string; mediaType: string; filename?: string }>;\n }): AgentSignalContents {\n if (!files?.length) return content;\n\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 const maxBacktickRun = Math.max(0, ...Array.from(textContent.matchAll(/`+/g), match => match[0].length));\n const fence = '`'.repeat(Math.max(3, maxBacktickRun + 1));\n return { type: 'text' as const, text: `${label}\\n${fence}\\n${textContent}\\n${fence}` };\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\n return [{ type: 'text', text: content }, ...fileParts];\n }\n\n private async buildAgentMessageStreamOptions({\n requestContext: requestContextInput,\n tracingContext,\n tracingOptions,\n }: {\n requestContext?: RequestContext;\n tracingContext?: TracingContext;\n tracingOptions?: TracingOptions;\n }): Promise> {\n if (!this.#session.thread.getId()) {\n throw new Error('Cannot build stream options without a current thread');\n }\n\n this.#session.run.clearAbortRequested();\n const requestContext = await this.buildRequestContext(requestContextInput);\n // Resolve mode-aware instructions at call time so the agent's own\n // instructions are never mutated by the harness.\n // When mode/harness instructions exist, combine them with the agent's\n // own instructions so dynamic instructions (e.g. AGENTS.md, project\n // context) aren't lost — the agent treats options.instructions as a\n // full override.\n let callTimeInstructions: string | undefined;\n if (this.config.agent) {\n const modeInstructions = this.resolveCurrentModeInstructions();\n if (modeInstructions) {\n const agent = this.getCurrentAgent();\n const agentInstructions = await agent.getInstructions({ requestContext });\n const agentStr = this.instructionsToString(agentInstructions);\n callTimeInstructions = [agentStr, modeInstructions].filter(Boolean).join('\\n') || undefined;\n }\n // When no mode instructions, don't pass instructions — the agent\n // uses its own getInstructions() naturally.\n }\n\n const streamOptions: Record = {\n ...this.buildSharedRunOptions(),\n memory: { thread: this.#session.thread.getId(), resource: this.#session.identity.getResourceId() },\n abortSignal: this.#session.run.ensureAbortController().signal,\n requestContext,\n ...(tracingContext && { tracingContext }),\n ...(tracingOptions && { tracingOptions }),\n ...(callTimeInstructions && { instructions: callTimeInstructions }),\n };\n streamOptions.toolsets = await this.buildToolsets(requestContext);\n\n return streamOptions;\n }\n\n /**\n * Options that every harness-driven agent run must carry — the initial stream\n * AND every `resumeStream`. Centralized so the two paths can't drift: a\n * missing `maxSteps` on resume silently caps the resumed run at the agent's\n * small default and ends it mid-task (see {@link HARNESS_MAX_STEPS}).\n */\n private buildSharedRunOptions(): Record {\n const isYolo = (this.#session.state.get() as Record).yolo === true;\n const shared: Record = {\n maxSteps: HARNESS_MAX_STEPS,\n savePerStep: false,\n requireToolApproval: !isYolo,\n modelSettings: { temperature: 1 },\n };\n\n // Auto-enable Anthropic server-side fallbacks for fable-5 so a classifier\n // block is transparently retried on the fallback model instead of failing.\n const fableFallback = buildFableFallbackProviderOptions(this.#session.model.get());\n if (fableFallback) {\n shared.providerOptions = { anthropic: { ...fableFallback.anthropic } };\n }\n\n return shared;\n }\n\n private async drainFollowUpQueue(options?: {\n tracingContext?: TracingContext;\n tracingOptions?: TracingOptions;\n }): Promise {\n if (this.#session.followUps.isEmpty()) return false;\n\n const next = this.#session.followUps.dequeue()!;\n const threadId = this.#session.thread.getId();\n try {\n if (this.#session.stream.isOpen() && threadId) {\n const agent = this.getCurrentAgent();\n const streamOptions = await this.buildAgentMessageStreamOptions({\n requestContext: next.requestContext,\n tracingContext: options?.tracingContext,\n tracingOptions: options?.tracingOptions,\n });\n const result = agent.queueMessage(this.createMessageInput({ content: next.content }), {\n resourceId: this.#session.identity.getResourceId(),\n threadId,\n ifIdle: { streamOptions: streamOptions as any },\n });\n this.emit({ type: 'follow_up_queued', count: this.#session.followUps.count(), runId: result.runId });\n } else {\n this.emit({ type: 'follow_up_queued', count: this.#session.followUps.count() });\n await this.sendMessage({\n content: next.content,\n requestContext: next.requestContext,\n tracingContext: options?.tracingContext,\n tracingOptions: options?.tracingOptions,\n });\n }\n return true;\n } catch (error) {\n this.#session.followUps.requeue(next);\n this.emit({ type: 'follow_up_queued', count: this.#session.followUps.count() });\n throw error;\n }\n }\n\n private async finishSubscribedStreamRun({\n suspended,\n error,\n aborted,\n }: {\n suspended?: boolean;\n error?: boolean;\n aborted?: boolean;\n }): Promise {\n const reason = error\n ? 'error'\n : suspended\n ? 'suspended'\n : aborted || this.#session.run.isAbortRequested()\n ? 'aborted'\n : 'complete';\n this.emit({ type: 'agent_end', reason });\n this.#session.run.reset();\n await this.drainFollowUpQueue();\n }\n\n private async handleSubscribedStreamError(error: unknown): Promise {\n if (error instanceof Error && error.name === 'AbortError') {\n this.emit({ type: 'agent_end', reason: 'aborted' });\n } else {\n this.emit({ type: 'error', error: getErrorFromUnknown(error) });\n this.emit({ type: 'agent_end', reason: 'error' });\n }\n this.#session.stream.detach();\n this.#session.run.reset();\n await this.drainFollowUpQueue();\n }\n\n private async processSubscribedThreadStream(subscription: AgentThreadSubscription): Promise {\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.#session.stream.isCurrent({ 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.#session.run.nextOperation();\n this.#session.run.ensureAbortController();\n this.#session.run.setRunId({ runId: subscription.activeRunId() ?? ('runId' in chunk ? chunk.runId : null) });\n this.#session.run.setTraceId({ traceId: 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.#session.run.getRunId();\n const suspended =\n chunk.type === 'tool-call-suspended' ||\n (streamResult ?? this.finishStreamState(currentRun)).suspended ||\n undefined;\n const aborted = chunk.type === 'abort';\n // A non-success terminal finish reason (e.g. a `claude-fable-5`\n // content-filter refusal) is surfaced as an explicit error so the\n // run never silently stops without a visible terminal state.\n let isError = chunk.type === 'error';\n if (\n currentRun.terminalError &&\n !isError &&\n !aborted &&\n !this.#session.run.isAbortRequested() &&\n !suspended\n ) {\n isError = true;\n this.emit({ type: 'error', error: new Error(currentRun.terminalError) });\n }\n await this.finishSubscribedStreamRun({\n suspended,\n error: isError,\n aborted,\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.#session.stream.isCurrent({ 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 ifActive?: { attributes?: AgentSignalAttributes };\n ifIdle?: { attributes?: AgentSignalAttributes };\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 ifActive = 'content' in input ? input.ifActive : undefined;\n const ifIdle = 'content' in input ? input.ifIdle : undefined;\n const signal = createSignal(\n 'content' in input ? { type: 'user', tagName: 'user', contents: input.content } : input,\n );\n const accepted = Promise.resolve().then(async () => {\n if (!this.#session.thread.getId()) {\n const thread = await this.createThread();\n this.#session.thread.set({ threadId: thread.id });\n }\n const threadId = this.#session.thread.getId()!;\n\n const agent = this.getCurrentAgent();\n await this.ensureAgentThreadSubscription(agent, threadId);\n\n if (this.#session.run.getRunId() && this.#session.stream.activeRunId()) {\n const result = agent.sendSignal(signal, {\n resourceId: this.#session.identity.getResourceId(),\n threadId,\n ifActive,\n ifIdle,\n });\n return { accepted: result.accepted, runId: result.runId };\n }\n\n const streamOptions = await this.buildAgentMessageStreamOptions({\n requestContext: requestContextInput,\n tracingContext,\n tracingOptions,\n });\n\n const result = agent.sendSignal(signal, {\n resourceId: this.#session.identity.getResourceId(),\n threadId,\n ifActive,\n ifIdle: { ...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 notification signal to the current agent/thread.\n */\n async sendNotificationSignal(\n input: SendNotificationSignalInput,\n options: HarnessSendNotificationSignalOptions = {},\n ): Promise {\n const { ifActive, ifIdle, requestContext: requestContextInput, tracingContext, tracingOptions } = options;\n if (!this.#session.thread.getId()) {\n const thread = await this.createThread();\n this.#session.thread.set({ threadId: thread.id });\n }\n const threadId = this.#session.thread.getId()!;\n\n const agent = this.getCurrentAgent();\n await this.ensureAgentThreadSubscription(agent, threadId);\n\n if (this.#session.run.getRunId() && this.#session.stream.activeRunId()) {\n return agent.sendNotificationSignal(input, {\n resourceId: this.#session.identity.getResourceId(),\n threadId,\n ifActive,\n ifIdle,\n });\n }\n\n const streamOptions = await this.buildAgentMessageStreamOptions({\n requestContext: requestContextInput,\n tracingContext,\n tracingOptions,\n });\n\n return agent.sendNotificationSignal(input, {\n resourceId: this.#session.identity.getResourceId(),\n threadId,\n ifActive,\n ifIdle: { ...ifIdle, streamOptions: streamOptions as any },\n });\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 {\n const messageInput = this.createMessageInput({ content, files });\n\n const wasActive = this.#session.stream.isActive();\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.#session.suspensions.hasPending()) {\n this.emit({ type: 'agent_end', reason: 'complete' });\n }\n }\n return;\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;\n }): Promise {\n const threadId = this.#session.thread.getId();\n if (!threadId || !this.config.storage) return null;\n\n const memoryStorage = await this.getMemoryStorage();\n const dbMessage = {\n id: randomUUID(),\n role,\n threadId,\n resourceId: this.#session.identity.getResourceId(),\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 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;\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') {\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 attributes: signal.attributes,\n };\n }\n }\n\n if (signal.type === 'state') {\n const stateSignal = toStateSignalContent({\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n contents: signal.contents,\n metadata: signal.metadata,\n });\n if (stateSignal) {\n content.push(stateSignal);\n }\n\n return {\n id: msg.id,\n role: 'user',\n content,\n createdAt: msg.createdAt,\n };\n }\n\n if (signal.type === 'reactive' && signal.tagName === 'system-reminder') {\n const reminder = toSystemReminderContent({\n type: signal.type,\n contents: signalContentsToText(signal.contents),\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 if (signal.type === 'notification' && signal.tagName === 'notification-summary') {\n const notificationSummary = toNotificationSummaryContent({\n id: signal.id,\n contents: signal.contents,\n attributes: signal.attributes,\n metadata: signal.metadata,\n });\n if (notificationSummary) {\n content.push(notificationSummary);\n }\n\n return {\n id: msg.id,\n role: 'user',\n content,\n createdAt: msg.createdAt,\n };\n }\n\n if (signal.type === 'notification' && signal.tagName === 'notification') {\n const notification = toNotificationContent({\n id: signal.id,\n contents: signal.contents,\n attributes: signal.attributes,\n metadata: signal.metadata,\n });\n if (notification) {\n content.push(notification);\n }\n\n return {\n id: msg.id,\n role: 'user',\n content,\n createdAt: msg.createdAt,\n };\n }\n\n if (signal.type === 'reactive') {\n const reactiveSignal = toReactiveSignalContent({\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n contents: signal.contents,\n attributes: signal.attributes,\n metadata: signal.metadata,\n });\n if (reactiveSignal) {\n content.push(reactiveSignal);\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 | 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 | 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 }).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 }).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 }).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-signal': {\n const data = (part as { data?: Record }).data ?? {};\n if (data.type === 'state') {\n const stateSignal = toStateSignalContent(data);\n if (stateSignal) content.push(stateSignal);\n } else if (data.type === 'reactive' && data.tagName === 'system-reminder') {\n const reminder = toSystemReminderContent(data);\n if (reminder) content.push(reminder);\n } else if (data.type === 'notification' && data.tagName === 'notification-summary') {\n const notificationSummary = toNotificationSummaryContent(data);\n if (notificationSummary) content.push(notificationSummary);\n } else if (data.type === 'notification' && data.tagName === 'notification') {\n const notification = toNotificationContent(data);\n if (notification) content.push(notification);\n } else if (data.type === 'reactive') {\n const reactiveSignal = toReactiveSignalContent(data);\n if (reactiveSignal) content.push(reactiveSignal);\n }\n break;\n }\n case 'data-user-message': {\n const data = (part as { data?: Record }).data ?? {};\n const message = toUserSignalMessage(data);\n if (message) {\n content.push(...message.content);\n }\n break;\n }\n // Back-compat: persisted streams may still contain data-system-reminder parts\n case 'data-system-reminder': {\n const data = (part as { data?: Record }).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 }).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 private createEmptyAssistantMessage(): HarnessMessage {\n return {\n id: this.generateId(),\n role: 'assistant',\n content: [],\n createdAt: new Date(),\n };\n }\n\n private hasCurrentMessageContent(state: HarnessStreamState): boolean {\n return state.currentMessage.content.length > 0 || Boolean(state.currentMessage.stopReason);\n }\n\n private finishCurrentMessageAndRotate(state: HarnessStreamState): void {\n if (!this.hasCurrentMessageContent(state)) return;\n this.emit({ type: 'message_end', message: state.currentMessage });\n state.lastFinishedMessage = state.currentMessage;\n state.currentMessage = this.createEmptyAssistantMessage();\n state.textContentById.clear();\n state.thinkingContentById.clear();\n }\n\n /**\n * Process a stream response (shared between sendMessage and tool approval).\n */\n private createStreamState(): HarnessStreamState {\n return {\n currentMessage: this.createEmptyAssistantMessage(),\n isSuspended: false,\n textContentById: new Map(),\n thinkingContentById: new Map(),\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 },\n requestContextInput?: RequestContext,\n ): Promise<{ message: HarnessMessage; suspended?: boolean } | undefined> {\n const state = this.createStreamState();\n const requestContext = await this.buildRequestContext(requestContextInput);\n this.#session.run.nextOperation();\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.#session.run.isAbortRequested()\n ) {\n result ??= this.finishStreamState(state);\n break;\n }\n }\n\n result ??= this.finishStreamState(state);\n\n // A non-success terminal finish reason (e.g. a `claude-fable-5`\n // content-filter refusal) is surfaced as an explicit error so the run never\n // silently stops without a visible terminal state.\n if (state.terminalError && !error && !aborted && !this.#session.run.isAbortRequested() && !result.suspended) {\n error = true;\n this.emit({ type: 'error', error: new Error(state.terminalError) });\n }\n\n this.emit({\n type: 'agent_end',\n reason: error\n ? 'error'\n : result.suspended\n ? 'suspended'\n : aborted || this.#session.run.isAbortRequested()\n ? 'aborted'\n : 'complete',\n });\n\n this.#session.run.reset();\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.#session.run.setRunId({ runId: 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 | 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 const approvalPromise = this.#session.approval.arm({ toolName });\n this.emit({ type: 'tool_approval_required', toolCallId, toolName, args: toolArgs });\n\n const approval = await approvalPromise;\n this.#session.approval.clearToolName();\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 const suspRunId = this.#session.run.getRunId();\n if (suspRunId) {\n this.#session.suspensions.register({\n toolCallId: suspToolCallId,\n runId: suspRunId,\n toolName: suspToolName,\n });\n }\n state.isSuspended = true;\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 break;\n }\n\n case 'error': {\n const streamError = getErrorFromUnknown(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;\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.#session.addUsage(stepUsage);\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 const finishProviderMetadata = chunk.payload?.metadata?.providerMetadata ?? chunk.payload?.providerMetadata;\n // A server-side fallback means the turn was answered by a different\n // model than the one the user selected (e.g. fable-5 declined and the\n // fallback served the response). Surface that, otherwise the\n // substitution is invisible.\n const fallbackNotice = describeServerSideFallback(finishProviderMetadata);\n if (fallbackNotice) {\n this.emit({ type: 'info', message: fallbackNotice });\n }\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 // Non-success terminal reasons (e.g. `content-filter` from a\n // `claude-fable-5` refusal, `error`, or `length`) must surface as an\n // explicit terminal error rather than a silent `complete`. Otherwise\n // the run ends with no final message and no error, leaving the user\n // unable to tell whether it completed, failed, or is still active.\n const errorMessage = describeNonSuccessFinishReason(finishReason, finishProviderMetadata);\n if (errorMessage) {\n state.currentMessage.stopReason = 'error';\n state.currentMessage.errorMessage = errorMessage;\n state.terminalError = errorMessage;\n } else {\n state.currentMessage.stopReason = 'complete';\n }\n }\n break;\n }\n\n case 'goal': {\n // In-loop goal evaluation marks a boundary between assistant attempts.\n // Close the current assistant message before rendering the judge result\n // so a continuation starts a fresh message instead of overwriting the\n // previous attempt in streaming UIs.\n this.finishCurrentMessageAndRotate(state);\n // Forward the payload so consumers (the TUI's judge display) can render\n // judge progress and the decision.\n this.emit({ type: 'goal_evaluation', payload: chunk.payload });\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 | 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 | 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 | 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 | 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 | 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 | 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 | 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-signal': {\n const payload = (chunk as any).data as Record | undefined;\n if (payload?.type === 'state') {\n const stateSignal = toStateSignalContent(payload);\n if (stateSignal) {\n state.currentMessage.content.push(stateSignal);\n this.emit({ type: 'message_update', message: state.currentMessage });\n }\n } else if (payload?.type === 'reactive' && payload.tagName === 'system-reminder') {\n const reminder = toSystemReminderContent(payload);\n if (reminder) {\n state.currentMessage.content.push(reminder);\n this.emit({ type: 'message_update', message: state.currentMessage });\n }\n } else if (payload?.type === 'notification' && payload.tagName === 'notification-summary') {\n const notificationSummary = toNotificationSummaryContent(payload);\n if (notificationSummary) {\n state.currentMessage.content.push(notificationSummary);\n this.emit({ type: 'message_update', message: state.currentMessage });\n }\n } else if (payload?.type === 'notification' && payload.tagName === 'notification') {\n const notification = toNotificationContent(payload);\n if (notification) {\n state.currentMessage.content.push(notification);\n this.emit({ type: 'message_update', message: state.currentMessage });\n }\n } else if (payload?.type === 'reactive') {\n const reactiveSignal = toReactiveSignalContent(payload);\n if (reactiveSignal) {\n state.currentMessage.content.push(reactiveSignal);\n this.emit({ type: 'message_update', message: state.currentMessage });\n }\n }\n break;\n }\n case 'data-user-message': {\n const payload = (chunk as any).data as Record | 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 // Back-compat: persisted streams may still contain data-system-reminder parts\n case 'data-system-reminder': {\n const payload = (chunk as any).data as Record | 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 | 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 | 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.#session.thread.getId() ?? '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 | 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 | 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 if (this.hasCurrentMessageContent(state) || !state.lastFinishedMessage) {\n this.emit({ type: 'message_end', message: state.currentMessage });\n return { message: state.currentMessage, suspended: state.isSuspended || undefined };\n }\n\n return { message: state.lastFinishedMessage, suspended: state.isSuspended || undefined };\n }\n\n // ===========================================================================\n // Control\n // ===========================================================================\n\n /**\n * Abort the current operation.\n */\n abort(): void {\n // session.abortRun() drops the parked tool suspensions (so a run sitting in\n // a tool suspend() like ask_user / request_access isn't left orphaned),\n // aborts the live subscription, and marks the run as aborting. The Harness\n // owns the display-state mirror of those suspensions, so clear it here too.\n const hadPendingSuspensions = this.#session.displayState.get().pendingSuspensions.size > 0;\n this.#session.displayState.clearPendingSuspensions();\n this.#session.abortRun();\n // Clearing the suspension mirror is a direct mutation, so it doesn't flow\n // through emit()'s display-state reducer. Notify subscribers explicitly when\n // we actually removed something, otherwise stale suspension UI can linger.\n if (hadPendingSuspensions) {\n this.dispatchDisplayStateChanged();\n }\n }\n\n /**\n * Detach from the current thread's event stream without switching to another\n * thread. Used by the TUI `/new` command to stop receiving cross-process\n * events from the old thread while the new thread creation is deferred until\n * the first user message.\n *\n * The current thread ID is preserved so that {@link createThread} can still\n * release the thread lock (when configured) for the previous thread.\n */\n detachFromCurrentThread(): void {\n this.abort();\n this.cleanupAgentThreadSubscription();\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 {\n this.abort();\n this.#session.followUps.clear();\n this.emit({ type: 'follow_up_queued', count: 0 });\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 {\n if (this.#session.run.isRunning()) {\n this.#session.followUps.enqueue({ content, requestContext });\n this.emit({ type: 'follow_up_queued', count: this.#session.followUps.count() });\n } else {\n await this.sendMessage({ content, requestContext });\n }\n }\n\n /**\n * True when one or more tools are parked awaiting a resume (e.g. ask_user /\n * request_access suspensions). A suspended run nulls the AbortController, so\n * isRunning() returns false even though the run is still pending — callers that\n * need to know whether the harness is awaiting user input (e.g. to allow abort)\n * should check this too.\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 {\n while (this.#session.stream.isActive() || this.#session.run.getRunId() !== null) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n\n private getSubagentDisplayName(agentType: string): string | undefined {\n return this.config.subagents?.find(subagent => subagent.id === agentType)?.name;\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 * `toolCallId` selects which suspended tool to resume — required when more than\n * one tool is suspended concurrently (e.g. parallel `ask_user` calls, see issue\n * #13642). When omitted it resolves to the sole pending suspension.\n */\n async respondToToolSuspension({\n resumeData,\n toolCallId,\n requestContext,\n }: {\n resumeData: any;\n toolCallId?: string;\n requestContext?: RequestContext;\n }): Promise {\n const resolvedToolCallId = this.#session.suspensions.resolveToolCallId(toolCallId);\n if (!resolvedToolCallId) return;\n\n const suspension = this.#session.suspensions.get({ toolCallId: resolvedToolCallId });\n\n try {\n // `submit_plan` resumes carry a plan-approval decision. Approval additionally\n // switches the Harness from its planning mode to its default execution mode, so\n // it is handled separately from a plain tool resume. Non-Harness consumers skip\n // this entirely and resume the tool directly via agent.resumeStream.\n if (suspension?.toolName === 'submit_plan') {\n await this.handlePlanApprovalResume({\n toolCallId: resolvedToolCallId,\n response: resumeData as { action: 'approved' | 'rejected'; feedback?: string },\n requestContext,\n });\n return;\n }\n\n await this.handleToolResume({\n resumeData,\n toolCallId: resolvedToolCallId,\n requestContext,\n });\n } catch (error) {\n const err = getErrorFromUnknown(error);\n this.emit({ type: 'error', error: err });\n this.emit({ type: 'agent_end', reason: 'error' });\n }\n }\n\n // ===========================================================================\n // Plan Approval\n // ===========================================================================\n\n /**\n * Respond to a suspended `submit_plan` tool call.\n *\n * `submit_plan` is an agent-agnostic tool that pauses via the native tool-suspension\n * primitive. The Harness layers its planning UX on top of that generic pause here:\n *\n * - On **rejection**, the plan-mode run is resumed with the feedback so the agent can\n * revise and submit again. This is an ordinary tool resume.\n * - On **approval**, the parked plan-mode suspension is abandoned and the Harness\n * switches to its default (execution) mode. switchMode aborts the plan-mode run, so\n * there is no point resuming it first; the next signal/message drives the fresh\n * default-mode run. The model still sees the \"approved\" tool result on the rebuilt\n * message history when the default-mode run starts.\n *\n * Non-Harness consumers (a plain Agent in Studio or a customer app) instead resume the\n * tool directly via `agent.resumeStream({ action, feedback })` — no modes involved.\n */\n private async handlePlanApprovalResume({\n toolCallId,\n response,\n requestContext,\n }: {\n toolCallId: string;\n response: { action: 'approved' | 'rejected'; feedback?: string };\n requestContext?: RequestContext;\n }): Promise {\n if (response.action === 'rejected') {\n await this.handleToolResume({ resumeData: response, toolCallId, requestContext });\n return;\n }\n\n // Approved: drop the parked suspension (its run is about to be aborted by the mode\n // switch) and move to the default execution mode.\n this.#session.suspensions.delete({ toolCallId });\n\n const currentMode = this.#session.mode.resolve();\n const transitionModeId =\n currentMode.transitionsTo ??\n this.config.defaultModeId ??\n this.config.modes.find(mode => mode.default || mode.metadata?.default === true)?.id ??\n this.config.modes[0]?.id;\n\n const transitionMode = this.listModes().find(mode => mode.id === transitionModeId);\n if (transitionMode && transitionMode.id !== this.#session.mode.get()) {\n await new Promise(resolveTimeout => setTimeout(resolveTimeout, 0));\n await this.switchMode({ modeId: transitionMode.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 private async handleToolApprove({\n toolCallId,\n requestContext: requestContextInput,\n }: {\n toolCallId?: string;\n requestContext?: RequestContext;\n }): Promise {\n const runId = this.#session.run.getRunId();\n if (!runId) {\n throw new Error('No active run to approve tool call for');\n }\n\n const agent = this.getCurrentAgent();\n\n const requestContext = await this.buildRequestContext(requestContextInput);\n const isYolo = (this.#session.state.get() as Record).yolo === true;\n const threadId = this.#session.thread.getId();\n await agent.approveToolCall({\n runId,\n toolCallId,\n requireToolApproval: !isYolo,\n memory: threadId ? { thread: threadId, resource: this.#session.identity.getResourceId() } : undefined,\n abortSignal: this.#session.run.ensureAbortController().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 {\n const runId = this.#session.run.getRunId();\n if (!runId) {\n throw new Error('No active run to decline tool call for');\n }\n\n const agent = this.getCurrentAgent();\n\n const requestContext = await this.buildRequestContext(requestContextInput);\n const isYolo = (this.#session.state.get() as Record).yolo === true;\n const threadId = this.#session.thread.getId();\n await agent.declineToolCall({\n runId,\n toolCallId,\n requireToolApproval: !isYolo,\n memory: threadId ? { thread: threadId, resource: this.#session.identity.getResourceId() } : undefined,\n abortSignal: this.#session.run.ensureAbortController().signal,\n requestContext,\n toolsets: await this.buildToolsets(requestContext),\n });\n }\n\n private async handleToolResume({\n resumeData,\n toolCallId,\n requestContext: requestContextInput,\n }: {\n resumeData: any;\n toolCallId: string;\n requestContext?: RequestContext;\n }): Promise {\n const suspension = this.#session.suspensions.get({ toolCallId });\n if (!suspension) {\n throw new Error('No active suspension to resume');\n }\n\n const agent = this.getCurrentAgent();\n\n // Remove before resuming so a re-suspend during the resumed run can re-register\n // the same toolCallId without being clobbered by this cleanup. Drop the matching\n // display-state entry too so the UI stops rendering only the resolved prompt\n // while any other parked suspensions stay visible.\n this.#session.suspensions.delete({ toolCallId });\n this.#session.displayState.deletePendingSuspension(toolCallId);\n\n const requestContext = await this.buildRequestContext(requestContextInput);\n const threadId = this.#session.thread.getId();\n\n const output = await agent.resumeStream(resumeData, {\n // Re-supply the shared run budget (maxSteps, etc). Without it the resumed\n // run merges over the agent's small default maxSteps and stops mid-task.\n ...this.buildSharedRunOptions(),\n runId: suspension.runId,\n toolCallId,\n memory: threadId ? { thread: threadId, resource: this.#session.identity.getResourceId() } : undefined,\n abortSignal: this.#session.run.ensureAbortController().signal,\n requestContext,\n toolsets: await this.buildToolsets(requestContext),\n });\n\n await this.processStream(output, requestContext);\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 private emit(event: HarnessEvent): void {\n // The Session owns the display-state reducer; fold the event into the\n // canonical snapshot before dispatching to listeners. The Harness still owns\n // the event bus (listeners) and the display_state_changed fan-out.\n this.#session.displayState.apply(event);\n\n this.dispatchToListeners(event);\n\n if (event.type !== 'display_state_changed') {\n this.dispatchDisplayStateChanged();\n }\n }\n\n private dispatchDisplayStateChanged(): 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.#session.displayState.get(),\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).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 // 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 {\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.#session.mode.resolve();\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.#session.model.get(),\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.#session.identity.getResourceId(),\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 const result: ToolsetsInput = { harnessBuiltIn: builtInTools };\n if (resolvedHarnessTools) {\n result.harness = resolvedHarnessTools;\n }\n\n // When using a shared backing agent, mode-specific tool overrides are\n // delivered through toolsets (not baked into the agent) so the agent's\n // own tools (including signal-provider tools) are never lost.\n //\n // Note: both `mode.tools` and `mode.additionalTools` are added as a\n // toolset (augment). True \"replace\" semantics (masking the agent's own\n // tools) would require per-run tool filtering in the Agent, which isn't\n // supported yet. validateModes() already prevents setting both on the\n // same mode.\n if (this.config.agent) {\n const currentMode = this.#session.mode.resolve();\n const modeTools = currentMode.tools ?? currentMode.additionalTools;\n if (modeTools) {\n result.modeTools = modeTools;\n }\n }\n\n return result;\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 {\n requestContext ??= new RequestContext();\n const harnessContext: HarnessRequestContext = {\n harnessId: this.id,\n state: this.#session.state.get(),\n getState: () => this.#session.state.get(),\n setState: updates => this.#session.state.set(updates),\n updateState: updater => this.#session.state.update(updater),\n threadId: this.#session.thread.getId(),\n resourceId: this.#session.identity.getResourceId(),\n session: {\n modeId: this.#session.mode.get(),\n modelId: this.#session.model.get(),\n state: {\n get: () => this.#session.state.get(),\n set: updates => this.#session.state.set(updates),\n update: updater => this.#session.state.update(updater),\n },\n },\n abortSignal: this.#session.run.getAbortSignal(),\n workspace: this.workspace,\n emitEvent: event => this.emit(event),\n getSubagentModelId: params => this.getSubagentModelId(params),\n };\n\n requestContext.set('harness', harnessContext);\n\n if (this.workspaceFn) {\n // Pass the internal Mastra instance so the workspace factory can dedupe\n // against the registered workspace (getWorkspaceById). Without it, a\n // dynamic factory would build a *separate* Workspace/filesystem instance\n // from the one the agent resolves and registers — leaving harness-side\n // tools (e.g. request_access) mutating a different filesystem than the\n // agent's workspace tools (e.g. view) read from.\n const resolved = await Promise.resolve(this.workspaceFn({ requestContext, mastra: this.#internalMastra }));\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 {\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 private async persistTokenUsage(): Promise {\n const threadId = this.#session.thread.getId();\n if (!threadId || !this.config.storage) return;\n\n try {\n const memoryStorage = await this.getMemoryStorage();\n const thread = await memoryStorage.getThreadById({ threadId });\n if (thread) {\n await memoryStorage.saveThread({\n thread: {\n ...thread,\n metadata: { ...thread.metadata, tokenUsage: this.#session.getTokenUsage() },\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 {\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 {\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 {\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 {\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 {\n this.cleanupAgentThreadSubscription();\n await this.stopHeartbeats();\n await this.destroyWorkspace();\n }\n\n // ===========================================================================\n // Session\n // ===========================================================================\n\n async getSession(): Promise {\n return {\n currentThreadId: this.#session.thread.getId(),\n currentModeId: this.#session.mode.get(),\n threads: await this.#session.thread.list(),\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"]}