@ai-sdk/harness 1.0.76 → 1.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/errors/harness-capability-unsupported-error.ts","../../src/errors/harness-error.ts","../../src/agent/harness-agent.ts","../../src/agent/internal/lifecycle-state-validation.ts","../../src/v1/harness-v1-tool-filtering.ts","../../src/agent/internal/to-harness-stream.ts","../../src/agent/internal/run-prompt.ts","../../src/agent/internal/harness-stream-text-result.ts","../../src/agent/internal/translate-stream-part.ts","../../src/agent/internal/strip-work-dir.ts","../../src/agent/internal/turn-telemetry.ts","../../src/agent/internal/permission-mode.ts","../../src/utils/bridge-diagnostics.ts","../../src/utils/sandbox-channel.ts","../../src/agent/harness-agent-session.ts","../../src/agent/harness-agent-tool-approval-continuation.ts","../../src/agent/harness-agent-tool-result-continuation.ts","../../src/agent/internal/bootstrap-recipe.ts","../../src/agent/internal/sandbox-bootstrap.ts","../../src/agent/internal/resolve-observability.ts","../../src/agent/internal/tool-filtering.ts","../../src/agent/prepare-harness-sandbox-template.ts","../../src/agent/prepare-sandbox-for-harness.ts","../../src/errors/harness-sandbox-authentication-error.ts","../../src/agent/get-harness-error-message.ts","../../src/agent/observability/file-reporter.ts","../../src/agent/observability/trace-tree-reporter.ts"],"sourcesContent":["import { AISDKError } from '@ai-sdk/provider';\nimport { HarnessError } from './harness-error';\n\nconst name = 'AI_HarnessCapabilityUnsupportedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Thrown when a caller asks the harness to do something the adapter (or the\n * supplied sandbox) does not support, e.g. requesting manual compaction from\n * an adapter that only auto-compacts, or invoking `getPortEndpoint` on a\n * sandbox that does not expose one.\n *\n * The caller supplies the full human-readable message. Optional `harnessId`\n * is recorded as structured context for tooling.\n */\nexport class HarnessCapabilityUnsupportedError extends HarnessError {\n private readonly [symbol] = true;\n\n readonly harnessId?: string;\n\n constructor({\n message,\n harnessId,\n cause,\n }: {\n message: string;\n harnessId?: string;\n cause?: unknown;\n }) {\n super({ message, cause });\n Object.defineProperty(this, 'name', { value: name });\n this.harnessId = harnessId;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessCapabilityUnsupportedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_HarnessError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Base error type for failures originating in or signalled by a harness\n * adapter. Specific failure modes (e.g. unsupported capability) extend this\n * class.\n */\nexport class HarnessError extends AISDKError {\n private readonly [symbol] = true;\n\n constructor({ message, cause }: { message: string; cause?: unknown }) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is HarnessError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { HarnessCapabilityUnsupportedError } from '../errors/harness-capability-unsupported-error';\nimport type {\n HarnessV1Bootstrap,\n HarnessV1BuiltinToolFiltering,\n HarnessV1JSONSchema,\n HarnessV1NetworkSandboxSession,\n HarnessV1ResponseFormat,\n} from '../v1';\nimport {\n asArray,\n asSchema,\n generateId,\n type Context,\n type ModelMessage,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport type {\n Agent,\n AgentCallParameters,\n AgentStreamParameters,\n GenerateTextResult,\n OutputInterface as Output,\n ReasoningFileOutput,\n ReasoningOutput,\n StopCondition,\n StreamTextResult,\n} from 'ai';\nimport type {\n HarnessAgentSandboxConfig,\n HarnessAgentSettings,\n} from './harness-agent-settings';\nimport type { HarnessAllTools } from './harness-agent-tool-types';\nimport { HarnessAgentSession } from './harness-agent-session';\nimport type {\n HarnessAgentAdapter,\n HarnessAgentContinueTurnState,\n HarnessAgentPermissionMode,\n HarnessAgentPrompt,\n HarnessAgentResumeSessionState,\n HarnessAgentToolSpec,\n} from './harness-agent-types';\nimport {\n collectHarnessAgentToolApprovalContinuations,\n type HarnessAgentToolApprovalContinuation,\n} from './harness-agent-tool-approval-continuation';\nimport {\n collectHarnessAgentToolResultContinuations,\n type HarnessAgentToolResultContinuation,\n} from './harness-agent-tool-result-continuation';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n createSandboxBootstrapPlan,\n ensureSandboxDirectory,\n resolveSessionWorkDir,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\nimport { buildObservability } from './internal/resolve-observability';\nimport { validateLifecycleStateData } from './internal/lifecycle-state-validation';\nimport {\n permissionModeNeedsBuiltinSupport,\n resolvePermissionMode,\n} from './internal/permission-mode';\nimport { resolveHarnessAgentToolFiltering } from './internal/tool-filtering';\n\nexport type { HarnessAllTools } from './harness-agent-tool-types';\n\n/**\n * Required `session` extension on every `HarnessAgent.generate` /\n * `HarnessAgent.stream` call. The agent operates exclusively on the\n * `HarnessAgentSession` the caller passes in — it owns no session\n * state of its own.\n */\nexport interface HarnessAgentCallExtensions {\n /**\n * Active session returned by `agent.createSession(...)`. Drives the\n * underlying harness adapter for this turn.\n */\n session: HarnessAgentSession;\n}\n\n/**\n * AI SDK `Agent` implementation that drives a third-party agent runtime\n * through a harness adapter (Claude Code, Codex, …).\n *\n * Behaviour summary:\n * - **Stateless definition.** Construct once at module scope. The agent\n * holds the harness adapter, the merged tool surface, the sandbox\n * provider and other config — never a live session. Per-call data\n * (prompt, abort signal, the `HarnessAgentSession`) lives on\n * `generate()` / `stream()`.\n * - **Explicit sessions.** Callers spawn sessions with\n * `agent.createSession(...)`, pass the returned\n * `HarnessAgentSession` on every `generate` / `stream`, and end it via\n * `session.detach()`, `session.stop()`, or `session.destroy()`.\n * - **Cross-process resume.** `createSession({ sessionId, resumeFrom })`\n * resumes from state previously returned by `session.detach()` or\n * `session.stop()`. The framework validates `resumeFrom` against the\n * harness's `lifecycleStateSchema` before handing it to the adapter.\n * `createSession({ sessionId, continueFrom })` resumes from state returned\n * by `session.suspendTurn()` before `continueStream()` /\n * `continueGenerate()`.\n * - **Host tool execution.** User tools passed in `settings.tools` are\n * executed on the host whenever the underlying runtime calls them;\n * the result is fed back to the harness via `submitToolResult`.\n * Adapter builtin tools (e.g. Claude Code's `Bash`) pass through\n * untouched.\n * - **Sandbox propagation.** On `createSession`, the agent uses a\n * caller-provided network sandbox session when present; otherwise it calls\n * the configured provider's `createSession()` (or `resumeSession()`). It\n * passes the selected session into `doStart`. Its `restricted()` view (a tool-safe\n * `Experimental_SandboxSession`) is handed to user-tool `execute()` calls\n * via `experimental_sandbox`. Caller-provided sandboxes remain owned by the\n * caller and are not stopped or destroyed by the harness layer.\n */\nexport class HarnessAgent<\n THarness extends HarnessAgentAdapter<any> = HarnessAgentAdapter,\n TUserTools extends ToolSet = {},\n RUNTIME_CONTEXT extends Context = Context,\n OUTPUT extends Output = never,\n> implements Agent<\n never,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n> {\n readonly version = 'agent-v1' as const;\n readonly id: string | undefined;\n\n /**\n * Merged tool set exposed to AI SDK consumers: harness builtins +\n * user-defined tools, with user tools overriding builtins on key\n * collision. Built once at construction time so the typed surface is\n * stable across calls.\n */\n readonly tools: HarnessAllTools<THarness, TUserTools>;\n\n private readonly settings: HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n private readonly stopConditions: Array<\n StopCondition<HarnessAllTools<THarness, TUserTools>, RUNTIME_CONTEXT>\n >;\n private readonly sandboxConfig: HarnessAgentSandboxConfig;\n private readonly activeUserTools: TUserTools;\n private readonly builtinToolFiltering:\n | HarnessV1BuiltinToolFiltering\n | undefined;\n private readonly permissionMode: HarnessAgentPermissionMode;\n\n constructor(\n settings: HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT\n >,\n ) {\n const sandboxConfig = resolveSandboxConfig(settings);\n validateSandboxBootstrapSettings(sandboxConfig);\n this.settings = settings;\n this.stopConditions =\n settings.stopWhen == null ? [] : asArray(settings.stopWhen);\n this.sandboxConfig = sandboxConfig;\n this.id = settings.id;\n const userTools = settings.tools ?? ({} as TUserTools);\n this.permissionMode = resolvePermissionMode({\n permissionMode: settings.permissionMode,\n });\n const tools = {\n ...settings.harness.builtinTools,\n ...userTools,\n } as HarnessAllTools<THarness, TUserTools>;\n const toolFiltering = resolveHarnessAgentToolFiltering({\n harness: settings.harness,\n userTools,\n allTools: tools,\n activeTools: settings.activeTools,\n inactiveTools: settings.inactiveTools,\n });\n this.activeUserTools = toolFiltering.activeUserTools;\n this.builtinToolFiltering = toolFiltering.builtinToolFiltering;\n if (\n Object.keys(settings.harness.builtinTools).length > 0 &&\n permissionModeNeedsBuiltinSupport({\n permissionMode: this.permissionMode,\n }) &&\n settings.harness.supportsBuiltinToolApprovals !== true\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message: `Harness '${settings.harness.harnessId}' does not support built-in tool approval requests; use permissionMode: 'allow-all'.`,\n harnessId: settings.harness.harnessId,\n });\n }\n this.tools = tools;\n }\n\n /** Identifier of the harness backing this agent. */\n get harnessId(): string {\n return this.settings.harness.harnessId;\n }\n\n /**\n * Start a fresh session, or resume from state previously returned by\n * `session.detach()` or `session.stop()`. The returned\n * `HarnessAgentSession` must be passed to subsequent `generate` / `stream`\n * calls; end it with `session.detach()`, `session.stop()`, or\n * `session.destroy()`.\n */\n async createSession(options?: {\n /**\n * Optional stable identifier for the underlying sandbox/session.\n * When omitted the agent generates one. Supply the original\n * `session.sessionId` together with `resumeFrom` to reattach a\n * previously ended session across processes.\n */\n sessionId?: string;\n /**\n * Resume payload returned by a prior `session.detach()` or\n * `session.stop()`. Must be accompanied by the original `sessionId`; the\n * framework validates it against `harness.lifecycleStateSchema` before\n * handing it to the adapter.\n */\n resumeFrom?: HarnessAgentResumeSessionState;\n /**\n * Continuation payload returned by a prior `session.suspendTurn()`. Must be\n * accompanied by the original `sessionId`; the framework validates it before\n * handing it to the adapter.\n */\n continueFrom?: HarnessAgentContinueTurnState;\n /**\n * Existing network sandbox session to run the harness in. When provided,\n * the caller retains ownership of the sandbox lifecycle.\n */\n sandboxSession?: HarnessV1NetworkSandboxSession;\n abortSignal?: AbortSignal;\n }): Promise<HarnessAgentSession> {\n const sessionId = options?.sessionId ?? generateId();\n const resumeFrom = options?.resumeFrom;\n const continueFrom = options?.continueFrom;\n const providedSandboxSession = options?.sandboxSession;\n const abortSignal = options?.abortSignal;\n const harness = this.settings.harness;\n const sandboxProvider = this.settings.sandbox;\n const ownsSandboxLifecycle = providedSandboxSession == null;\n\n if (resumeFrom != null && continueFrom != null) {\n throw new Error(\n 'HarnessAgent.createSession: pass either `resumeFrom` or `continueFrom`, not both.',\n );\n }\n\n let validatedResumeFrom: HarnessAgentResumeSessionState | undefined;\n if (resumeFrom != null) {\n validatedResumeFrom = await validateLifecycleStateData({\n harness,\n state: resumeFrom,\n expectedType: 'resume-session',\n });\n }\n\n let validatedContinueFrom: HarnessAgentContinueTurnState | undefined;\n if (continueFrom != null) {\n validatedContinueFrom = await validateLifecycleStateData({\n harness,\n state: continueFrom,\n expectedType: 'continue-turn',\n });\n }\n\n const effectiveContinueFrom =\n validatedContinueFrom ?? validatedResumeFrom?.continueFrom;\n const isResumedSession =\n validatedResumeFrom != null || effectiveContinueFrom != null;\n\n // Acquires the concrete sandbox session, either by starting fresh and then\n // creating a post-bootstrap snapshot, or by reusing a previously created\n // snapshot based on the bootstrap-based hashes.\n let sandboxSession: HarnessV1NetworkSandboxSession;\n let sessionWorkDir: string;\n if (providedSandboxSession != null) {\n sandboxSession = providedSandboxSession;\n sessionWorkDir = resolveSessionWorkDir({\n defaultWorkingDirectory: sandboxSession.defaultWorkingDirectory,\n harnessId: harness.harnessId,\n sessionId,\n workDir: this.sandboxConfig.workDir,\n });\n\n const recipe = await harness.getBootstrap?.({ abortSignal });\n if (recipe != null) {\n const recipeIdentity = await hashHarnessBootstrap(recipe);\n try {\n await applyBootstrapRecipe({\n session: sandboxSession.restricted(),\n recipe,\n identity: recipeIdentity,\n defaultWorkingDirectory: sandboxSession.defaultWorkingDirectory,\n abortSignal,\n });\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n }\n } else {\n if (sandboxProvider == null) {\n throw new Error(\n 'HarnessAgent.createSession: configure `sandbox` on HarnessAgent or pass `sandboxSession` to createSession().',\n );\n }\n\n if (isResumedSession) {\n if (sandboxProvider.resumeSession == null) {\n throw new HarnessCapabilityUnsupportedError({\n message: `Sandbox provider '${sandboxProvider.providerId}' does not support resume.`,\n harnessId: harness.harnessId,\n });\n }\n sandboxSession = await sandboxProvider.resumeSession({\n sessionId,\n abortSignal,\n });\n sessionWorkDir = resolveSessionWorkDir({\n defaultWorkingDirectory: sandboxSession.defaultWorkingDirectory,\n harnessId: harness.harnessId,\n sessionId,\n workDir: this.sandboxConfig.workDir,\n });\n } else {\n // The logic in this clause applies the bootstrap plan, including both the harness\n // bootstrap recipe and agent specific sandbox configuration.\n // The logic matches largely what `prepareHarnessSandboxTemplate()` and\n // `prepareSandboxForHarness()` do, so they will have to remain aligned.\n let recipe: HarnessV1Bootstrap | undefined;\n if (harness.getBootstrap != null) {\n recipe = await harness.getBootstrap({ abortSignal });\n }\n\n // Defines the hashes based on both harness bootstrap recipe and\n // consumer-defined onBootstrap callback.\n const sandboxBootstrapPlan = await createSandboxBootstrapPlan({\n recipe,\n settings: this.sandboxConfig,\n });\n\n sandboxSession = await sandboxProvider.createSession({\n sessionId,\n abortSignal,\n identity: sandboxBootstrapPlan.identity,\n onFirstCreate: sandboxBootstrapPlan.onFirstCreate,\n });\n sessionWorkDir = resolveSessionWorkDir({\n defaultWorkingDirectory: sandboxSession.defaultWorkingDirectory,\n harnessId: harness.harnessId,\n sessionId,\n workDir: sandboxBootstrapPlan.workDir,\n });\n\n // In case the sandbox session was created with a custom sandbox, or in\n // case the sandbox provider doesn't respect `onFirstCreate`, we still\n // have to ensure the harness bootstrap recipe has run. In the common\n // scenario, this will be a cheap no-op based on just a marker check.\n if (\n sandboxBootstrapPlan.recipe != null &&\n sandboxBootstrapPlan.recipeIdentity != null\n ) {\n try {\n await applyBootstrapRecipe({\n session: sandboxSession.restricted(),\n recipe: sandboxBootstrapPlan.recipe,\n identity: sandboxBootstrapPlan.recipeIdentity,\n defaultWorkingDirectory: sandboxSession.defaultWorkingDirectory,\n abortSignal,\n });\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n }\n }\n }\n\n try {\n await ensureSandboxDirectory({\n session: sandboxSession,\n workDir: sessionWorkDir,\n abortSignal,\n });\n if (this.sandboxConfig.onSession != null) {\n await this.sandboxConfig.onSession({\n session: sandboxSession.restricted(),\n sessionWorkDir,\n abortSignal,\n });\n }\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n\n try {\n const baseStartOptions = {\n sessionId,\n skills: this.settings.skills,\n resumeFrom: validatedResumeFrom,\n continueFrom: effectiveContinueFrom,\n permissionMode: this.permissionMode,\n builtinToolFiltering: this.builtinToolFiltering,\n abortSignal,\n observability: buildObservability({ settings: this.settings }),\n };\n const underlyingSession = await harness.doStart({\n ...baseStartOptions,\n sandboxSession,\n sessionWorkDir,\n });\n return new HarnessAgentSession({\n sessionId,\n harness,\n underlyingSession,\n sandboxSession,\n ownsSandboxLifecycle,\n sessionWorkDir,\n toolApproval: this.settings.toolApproval,\n pendingToolApprovals: effectiveContinueFrom?.pendingToolApprovals,\n pendingToolResults: effectiveContinueFrom?.pendingToolResults,\n turnState:\n effectiveContinueFrom == null\n ? 'idle'\n : effectiveContinueFrom.pendingToolApprovals != null &&\n effectiveContinueFrom.pendingToolApprovals.length > 0\n ? 'awaiting-approval'\n : effectiveContinueFrom.pendingToolResults != null &&\n effectiveContinueFrom.pendingToolResults.length > 0\n ? 'awaiting-tool-result'\n : 'suspended',\n });\n } catch (error) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw error;\n }\n }\n\n async generate(\n options: AgentCallParameters<\n never,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions,\n ): Promise<\n GenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const turnInput = this._resolveTurnInput(options);\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n const { result, done } = this._startTurn({\n session: options.session,\n turnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n await done;\n return this._toGenerateResult(result);\n }\n\n async stream(\n options: AgentStreamParameters<\n never,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions,\n ): Promise<\n StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const turnInput = this._resolveTurnInput(options);\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n const { result } = this._startTurn({\n session: options.session,\n turnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n return result;\n }\n\n /**\n * Continue the in-flight turn **without a new prompt**, draining it like\n * {@link generate}. Used after `createSession({ continueFrom })` to finish\n * consuming a turn that crossed a process boundary.\n */\n async continueGenerate(options: {\n session: HarnessAgentSession;\n toolApprovalContinuations?: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations?: readonly HarnessAgentToolResultContinuation[];\n abortSignal?: AbortSignal;\n }): Promise<\n GenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n\n const { result, done } = this._startTurn({\n session: options.session,\n turnInput: {\n mode: 'continue',\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n await done;\n return this._toGenerateResult(result);\n }\n\n /**\n * Continue the in-flight turn **without a new prompt**, streaming its events\n * like {@link stream}. Used to keep consuming a turn that is still running\n * (or finished) in the runtime after a process boundary — the workflow slice\n * loop calls this on every slice after the first. Routes through the adapter's\n * `doContinueTurn`; what it can guarantee (lossless attach vs. lossy rerun)\n * follows from how the adapter resumed the session.\n */\n async continueStream(options: {\n session: HarnessAgentSession;\n toolApprovalContinuations?: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations?: readonly HarnessAgentToolResultContinuation[];\n abortSignal?: AbortSignal;\n }): Promise<\n StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n\n const { result } = this._startTurn({\n session: options.session,\n turnInput: {\n mode: 'continue',\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n return result;\n }\n\n // ─── Internals ──────────────────────────────────────────────────────\n\n private _startTurn(input: {\n session: HarnessAgentSession;\n turnInput:\n | { mode: 'prompt'; prompt: HarnessAgentPrompt }\n | {\n mode: 'continue';\n toolApprovalContinuations: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations: readonly HarnessAgentToolResultContinuation[];\n };\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n }): {\n result: StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n done: Promise<void>;\n } {\n if (input.turnInput.mode === 'continue') {\n return input.session.continueTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n instructions: this.settings.instructions,\n tools: this.tools,\n activeTools: this.activeUserTools,\n toolSpecs: this._toToolSpecs(),\n builtinToolFiltering: this.builtinToolFiltering,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat: input.responseFormat,\n output: this.settings.output,\n telemetry: this.settings.telemetry,\n stopConditions: this.stopConditions,\n toolApprovalContinuations: input.turnInput.toolApprovalContinuations,\n toolResultContinuations: input.turnInput.toolResultContinuations,\n });\n }\n\n return input.session.promptTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n prompt: input.turnInput.prompt,\n instructions: this.settings.instructions,\n tools: this.tools,\n activeTools: this.activeUserTools,\n toolSpecs: this._toToolSpecs(),\n builtinToolFiltering: this.builtinToolFiltering,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat: input.responseFormat,\n output: this.settings.output,\n telemetry: this.settings.telemetry,\n stopConditions: this.stopConditions,\n });\n }\n\n /*\n * Reduce AI SDK input to the single user message the harness should run\n * for this turn. The harness session owns prior-turn state (system\n * prompt, assistant turns, tool results) — we never replay it. A bare\n * string is forwarded as-is; a message array is collapsed to its last\n * `role: 'user'` entry. Inputs whose only messages are non-user (system,\n * assistant, tool) have no fresh user input and are rejected.\n */\n private _resolveTurnInput(options: {\n prompt?: string | ModelMessage[];\n messages?: ModelMessage[];\n }):\n | { mode: 'prompt'; prompt: HarnessAgentPrompt }\n | {\n mode: 'continue';\n toolApprovalContinuations: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations: readonly HarnessAgentToolResultContinuation[];\n } {\n if (typeof options.prompt === 'string') {\n return { mode: 'prompt', prompt: options.prompt };\n }\n const messages = Array.isArray(options.prompt)\n ? options.prompt\n : options.messages;\n if (Array.isArray(messages)) {\n const toolApprovalContinuations =\n collectHarnessAgentToolApprovalContinuations({ messages });\n const toolResultContinuations =\n collectHarnessAgentToolResultContinuations({ messages });\n if (\n toolApprovalContinuations.length > 0 ||\n toolResultContinuations.length > 0\n ) {\n return {\n mode: 'continue',\n toolApprovalContinuations,\n toolResultContinuations,\n };\n }\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role === 'user')\n return { mode: 'prompt', prompt: message };\n }\n throw new Error(\n 'HarnessAgent: messages must contain at least one `role: \"user\"` entry.',\n );\n }\n throw new Error('HarnessAgent: either `prompt` or `messages` is required.');\n }\n\n /*\n * Wire-format projection of user-defined tools only. Harness builtins are\n * executed by the runtime and the bridge already knows about them — we\n * never re-declare them over the wire.\n */\n private _toToolSpecs(): HarnessAgentToolSpec[] {\n const specs: HarnessAgentToolSpec[] = [];\n for (const [name, tool] of Object.entries(\n this.activeUserTools as Record<string, unknown>,\n )) {\n const t = tool as {\n description?: string;\n inputSchema?: unknown;\n };\n let inputSchema: HarnessAgentToolSpec['inputSchema'];\n if (t.inputSchema != null) {\n try {\n inputSchema = asSchema(\n t.inputSchema as Parameters<typeof asSchema>[0],\n ).jsonSchema as HarnessAgentToolSpec['inputSchema'];\n } catch {\n // tools without a usable schema are still forwarded by name\n }\n }\n specs.push({ name, description: t.description, inputSchema });\n }\n return specs;\n }\n\n private async _toGenerateResult(\n streamResult: StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >,\n ): Promise<\n GenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n // The stream is already drained by the time generate() calls this helper\n // (done has resolved). `steps` is the single source of truth the result\n // derives everything else from, mirroring core's `generateText` result.\n const [steps, usage, responseMessages, output] = await Promise.all([\n streamResult.steps,\n streamResult.usage,\n streamResult.responseMessages,\n this.settings.output == null\n ? Promise.resolve(undefined as never)\n : streamResult.output,\n ]);\n\n return new HarnessGenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({ steps, usage, responseMessages, output });\n }\n\n private async _resolveResponseFormat(): Promise<\n HarnessV1ResponseFormat | undefined\n > {\n const responseFormat = await this.settings.output?.responseFormat;\n if (responseFormat == null || responseFormat.type === 'text') {\n return responseFormat == null ? undefined : { type: 'text' };\n }\n return {\n type: 'json',\n ...(responseFormat.schema == null\n ? {}\n : { schema: responseFormat.schema as HarnessV1JSONSchema }),\n ...(responseFormat.name == null ? {} : { name: responseFormat.name }),\n ...(responseFormat.description == null\n ? {}\n : { description: responseFormat.description }),\n };\n }\n}\n\n/*\n * `GenerateTextResult` view over a drained `streamText` run. Non-deprecated\n * members derive from `steps` (the single source of truth), and the deprecated\n * members are exposed as getters that delegate to `finalStep` / `usage`.\n * Implementing the deprecated members as getters — rather than assigning them\n * in an object literal — keeps construction free of deprecated-property usage,\n * matching how core's `generateText` builds its result.\n */\nclass HarnessGenerateTextResult<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> implements GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n readonly steps: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['steps'];\n readonly usage: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['usage'];\n readonly responseMessages: GenerateTextResult<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT\n >['responseMessages'];\n readonly output: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['output'];\n\n constructor(options: {\n steps: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['steps'];\n usage: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['usage'];\n responseMessages: GenerateTextResult<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT\n >['responseMessages'];\n output: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['output'];\n }) {\n this.steps = options.steps;\n this.usage = options.usage;\n this.responseMessages = options.responseMessages;\n this.output = options.output;\n }\n\n get finalStep() {\n return this.steps.at(-1)!;\n }\n\n get content() {\n return this.steps.flatMap(step => step.content);\n }\n\n get text() {\n return this.finalStep.text;\n }\n\n get files() {\n return this.steps.flatMap(step => step.files);\n }\n\n get sources() {\n return this.steps.flatMap(step => step.sources);\n }\n\n get toolCalls() {\n return this.steps.flatMap(step => step.toolCalls);\n }\n\n get staticToolCalls() {\n return this.steps.flatMap(step => step.staticToolCalls);\n }\n\n get dynamicToolCalls() {\n return this.steps.flatMap(step => step.dynamicToolCalls);\n }\n\n get toolResults() {\n return this.steps.flatMap(step => step.toolResults);\n }\n\n get staticToolResults() {\n return this.steps.flatMap(step => step.staticToolResults);\n }\n\n get dynamicToolResults() {\n return this.steps.flatMap(step => step.dynamicToolResults);\n }\n\n get finishReason() {\n return this.finalStep.finishReason;\n }\n\n get rawFinishReason() {\n return this.finalStep.rawFinishReason;\n }\n\n get warnings() {\n return this.steps.flatMap(step => step.warnings ?? []);\n }\n\n get reasoning() {\n return this.finalStep.content.filter(\n (part): part is ReasoningOutput | ReasoningFileOutput =>\n part.type === 'reasoning' || part.type === 'reasoning-file',\n );\n }\n\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n\n get totalUsage() {\n return this.usage;\n }\n\n get request() {\n return this.finalStep.request;\n }\n\n get response() {\n return this.finalStep.response;\n }\n\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n}\n\nfunction resolveSandboxConfig(\n settings: Pick<HarnessAgentSettings, 'sandboxConfig' | 'onSandboxSession'>,\n): HarnessAgentSandboxConfig {\n if (settings.onSandboxSession != null) {\n console.warn(\n 'HarnessAgent: `onSandboxSession` is deprecated. Use `sandboxConfig.onSession` instead.',\n );\n }\n\n return {\n ...settings.sandboxConfig,\n ...(settings.sandboxConfig?.onSession == null &&\n settings.onSandboxSession != null\n ? { onSession: settings.onSandboxSession }\n : {}),\n };\n}\n\nasync function cleanupAfterStartFailure(input: {\n sandboxSession: HarnessV1NetworkSandboxSession;\n ownsSandboxLifecycle: boolean;\n}): Promise<void> {\n if (!input.ownsSandboxLifecycle) return;\n await Promise.resolve(input.sandboxSession.stop()).catch(() => {});\n}\n","import { safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { HarnessError } from '../../errors/harness-error';\nimport type { HarnessV1, HarnessV1LifecycleState } from '../../v1';\n\n/**\n * Validate a lifecycle state against the harness's contract:\n * - `type` must match the lifecycle method that will consume it.\n * - `specificationVersion` must be `'harness-v1'`.\n * - `harnessId` must match the harness producing/consuming the payload.\n * - When the harness declares a `lifecycleStateSchema`, `data` is parsed\n * against it.\n *\n * Returns the payload with `data` replaced by the parsed value when a\n * schema is present, so callers downstream see a canonical shape.\n */\nexport async function validateLifecycleStateData<\n STATE extends HarnessV1LifecycleState,\n>(input: {\n harness: HarnessV1;\n state: STATE;\n expectedType: STATE['type'];\n}): Promise<STATE> {\n const { harness, state } = input;\n if (state.type !== input.expectedType) {\n throw new HarnessError({\n message: `Lifecycle state has unexpected type '${state.type}'; expected '${input.expectedType}'.`,\n });\n }\n if (state.specificationVersion !== 'harness-v1') {\n throw new HarnessError({\n message: `Lifecycle state has unexpected specificationVersion '${state.specificationVersion}'; expected 'harness-v1'.`,\n });\n }\n if (state.harnessId !== harness.harnessId) {\n throw new HarnessError({\n message: `Lifecycle state was produced by harness '${state.harnessId}' but this agent uses '${harness.harnessId}'.`,\n });\n }\n if (\n state.type === 'resume-session' &&\n 'pendingToolApprovals' in state &&\n state.pendingToolApprovals !== undefined\n ) {\n throw new HarnessError({\n message:\n 'Resume session state cannot contain pending tool approvals; unfinished turns must be stored as `continueFrom`.',\n });\n }\n if (\n state.type === 'resume-session' &&\n 'pendingToolResults' in state &&\n state.pendingToolResults !== undefined\n ) {\n throw new HarnessError({\n message:\n 'Resume session state cannot contain pending tool results; unfinished turns must be stored as `continueFrom`.',\n });\n }\n\n const data =\n harness.lifecycleStateSchema == null\n ? state.data\n : await (async () => {\n const result = await safeValidateTypes({\n value: state.data,\n schema: harness.lifecycleStateSchema!,\n });\n if (!result.success) {\n throw new HarnessError({\n message: `Lifecycle state failed schema validation for harness '${harness.harnessId}': ${result.error.message}`,\n cause: result.error,\n });\n }\n return result.value as STATE['data'];\n })();\n\n if (state.type === 'resume-session') {\n const continueFrom =\n state.continueFrom == null\n ? undefined\n : await validateLifecycleStateData({\n harness,\n state: state.continueFrom,\n expectedType: 'continue-turn',\n });\n\n return {\n type: state.type,\n harnessId: state.harnessId,\n specificationVersion: state.specificationVersion,\n data,\n ...(continueFrom !== undefined ? { continueFrom } : {}),\n } as STATE;\n }\n\n return {\n type: state.type,\n harnessId: state.harnessId,\n specificationVersion: state.specificationVersion,\n data,\n ...(state.pendingToolApprovals !== undefined\n ? { pendingToolApprovals: state.pendingToolApprovals }\n : {}),\n ...(state.pendingToolResults !== undefined\n ? { pendingToolResults: state.pendingToolResults }\n : {}),\n } as STATE;\n}\n","export type HarnessV1BuiltinToolFiltering =\n | {\n mode: 'allow';\n toolNames: string[];\n }\n | {\n mode: 'deny';\n toolNames: string[];\n };\n\nexport function isHarnessV1BuiltinToolIncluded(input: {\n toolName: string;\n toolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n}): boolean {\n if (input.toolFiltering == null) return true;\n return input.toolFiltering.mode === 'allow'\n ? input.toolFiltering.toolNames.includes(input.toolName)\n : !input.toolFiltering.toolNames.includes(input.toolName);\n}\n\nexport function getHarnessV1BuiltinToolFilteringDenialReason(input: {\n toolName: string;\n}): string {\n return `Tool '${input.toolName}' is inactive due to the HarnessAgent tool filtering policy.`;\n}\n","import type { HarnessV1PromptControl } from '../../v1/harness-v1-prompt-control';\nimport type { HarnessV1StreamPart } from '../../v1/harness-v1-stream-part';\n\n/**\n * Bridge an adapter's emit-based event surface into a pull-based\n * `ReadableStream<HarnessV1StreamPart>`.\n *\n * Adapters implement `doPromptTurn` / `doContinueTurn` against an `emit` callback\n * because that is the natural shape when wrapping an SDK that itself produces\n * events. Consumers (notably `HarnessAgent`) prefer a stream because that is\n * the idiomatic AI SDK shape. This helper converts the former into the latter\n * and is agnostic to which turn entry point produced the control surface — the\n * caller supplies an `invoke` thunk that wires `emit` into either method.\n *\n * Lifetime:\n * 1. Calls `invoke(emit)` immediately (which runs `doPromptTurn`/`doContinueTurn`).\n * 2. Every `emit(part)` becomes a stream chunk.\n * 3. When `control.done` resolves, the stream closes — this includes a\n * graceful `doSuspendTurn`, which resolves `done` cleanly after draining.\n * 4. When `control.done` rejects, an `{ type: 'error', error }` part is\n * enqueued and the stream is then closed normally. The rejection is\n * surfaced to consumers as a discriminated-union event rather than as\n * a stream error so iteration code does not need a separate try/catch\n * around the consumer loop.\n * 5. The supplied `abortSignal` (if any) aborts the underlying turn and\n * closes the stream.\n *\n * The returned `control` is the same object the adapter produced and is\n * intended for use by the consumer to submit tool results / approvals /\n * user messages back into the in-flight turn.\n */\nexport async function toHarnessStream(options: {\n invoke: (\n emit: (event: HarnessV1StreamPart) => void,\n ) => PromiseLike<HarnessV1PromptControl>;\n}): Promise<{\n stream: ReadableStream<HarnessV1StreamPart>;\n control: HarnessV1PromptControl;\n}> {\n let controller!: ReadableStreamDefaultController<HarnessV1StreamPart>;\n let closed = false;\n\n const stream = new ReadableStream<HarnessV1StreamPart>({\n start(c) {\n controller = c;\n },\n });\n\n const safeEnqueue = (part: HarnessV1StreamPart) => {\n if (closed) return;\n controller.enqueue(part);\n };\n\n const safeClose = () => {\n if (closed) return;\n closed = true;\n controller.close();\n };\n\n const control = await options.invoke(safeEnqueue);\n\n Promise.resolve(control.done)\n .then(\n () => safeClose(),\n (err: unknown) => {\n safeEnqueue({ type: 'error', error: err });\n safeClose();\n },\n )\n // Belt-and-suspenders: any throw inside the handlers themselves should\n // not become an unhandled rejection.\n .catch(() => {});\n\n return { stream, control };\n}\n","import {\n getHarnessV1BuiltinToolFilteringDenialReason,\n isHarnessV1BuiltinToolIncluded,\n type HarnessV1,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1PendingToolApproval,\n type HarnessV1PendingToolResult,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResponseFormat,\n type HarnessV1Session,\n type HarnessV1StreamPart,\n type HarnessV1ToolSpec,\n} from '../../v1';\nimport { toHarnessStream } from './to-harness-stream';\nimport {\n executeTool,\n generateId,\n isExecutableTool,\n safeParseJSON,\n type Context,\n type Experimental_SandboxSession as SandboxSession,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport {\n getErrorMessage,\n type LanguageModelV4FinishReason,\n type LanguageModelV4ToolCall,\n type LanguageModelV4Usage,\n} from '@ai-sdk/provider';\nimport { parseToolCall } from 'ai/internal';\nimport type {\n ContentPart,\n OutputInterface as Output,\n ProviderMetadata,\n StepResult,\n StopCondition,\n TelemetryOptions,\n TextStreamPart,\n} from 'ai';\nimport type { HarnessAgentToolApprovalContinuation } from '../harness-agent-tool-approval-continuation';\nimport type { HarnessAgentToolResultContinuation } from '../harness-agent-tool-result-continuation';\nimport type { HarnessAgentToolApprovalConfiguration } from '../harness-agent-settings';\nimport { HarnessStreamTextResult } from './harness-stream-text-result';\nimport { translateStreamPart } from './translate-stream-part';\nimport { stripWorkDir } from './strip-work-dir';\nimport {\n createTurnTelemetry,\n type TurnContentPart,\n type TurnTelemetry,\n} from './turn-telemetry';\nimport { resolveCustomToolApproval } from './permission-mode';\nimport { logBridgeError } from '../../utils/bridge-diagnostics';\nimport { pinSandboxChannelEventCheckpoint } from '../../utils/sandbox-channel';\n\n/**\n * Drive one prompt turn end-to-end:\n * - call `session.doPromptTurn` via `toHarnessStream`\n * - translate harness events to AI SDK `TextStreamPart`s and push into the\n * result object\n * - execute host-side user tools when their `tool-call` events arrive and\n * submit results back to the harness\n * - close the result when the harness signals `finish` (or on error)\n *\n * Returns the result synchronously after the stream is wired up; callers\n * await its `PromiseLike` accessors to observe completion.\n */\nexport function runPrompt<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n>(input: {\n harness: HarnessV1;\n session: HarnessV1Session;\n /**\n * Turn entry point. `'prompt'` (default) starts a new turn from `prompt`;\n * `'continue'` continues the in-flight turn via `doContinueTurn` and ignores\n * `prompt`.\n */\n mode?: 'prompt' | 'continue';\n /** Required for `mode: 'prompt'`; absent for `mode: 'continue'`. */\n prompt?: HarnessV1Prompt;\n instructions: string | undefined;\n tools: TOOLS;\n activeTools?: ToolSet;\n toolSpecs: HarnessV1ToolSpec[];\n builtinToolFiltering?: HarnessV1BuiltinToolFiltering | undefined;\n sandboxSession: SandboxSession;\n sessionWorkDir: string;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat?: HarnessV1ResponseFormat | undefined;\n output?: OUTPUT | undefined;\n telemetry?: TelemetryOptions | undefined;\n stopConditions?: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApproval?: HarnessAgentToolApprovalConfiguration | undefined;\n pendingToolApprovals?: readonly HarnessV1PendingToolApproval[];\n pendingToolResults?: readonly HarnessV1PendingToolResult[];\n toolApprovalContinuations?:\n | readonly HarnessAgentToolApprovalContinuation[]\n | undefined;\n toolResultContinuations?:\n | readonly HarnessAgentToolResultContinuation[]\n | undefined;\n onPendingToolApproval?: (approval: HarnessV1PendingToolApproval) => void;\n onToolApprovalSettled?: (approvalId: string) => void;\n onPendingToolResult?: (pendingResult: HarnessV1PendingToolResult) => void;\n onToolResultSettled?: (toolCallId: string) => void;\n onTurnFinished?: () => void;\n onTurnFailed?: () => void;\n /**\n * Reports that the adapter stream closed because the host intentionally\n * suspended the still-running turn at a workflow slice boundary.\n */\n isTurnSuspending?: () => boolean;\n onStopConditionMet?: () => Promise<void>;\n}): {\n result: HarnessStreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n done: Promise<void>;\n} {\n const result = new HarnessStreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n tools: input.tools,\n runtimeContext: input.runtimeContext,\n // toolsContext is not configurable for harnesses; pass undefined cast.\n toolsContext: undefined as never,\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n output: input.output,\n });\n const pendingToolApprovals = input.pendingToolApprovals ?? [];\n const pendingToolResults = input.pendingToolResults ?? [];\n const onPendingToolApproval = input.onPendingToolApproval ?? (() => {});\n const onToolApprovalSettled = input.onToolApprovalSettled ?? (() => {});\n const onPendingToolResult = input.onPendingToolResult ?? (() => {});\n const onToolResultSettled = input.onToolResultSettled ?? (() => {});\n const activeTools = input.activeTools ?? input.tools;\n\n const telemetry = createTurnTelemetry({\n telemetry: input.telemetry,\n harnessId: input.harness.harnessId,\n modelId: input.session.modelId,\n instructions: input.instructions,\n promptText: input.prompt != null ? promptToText(input.prompt) : '',\n runtimeContext: input.runtimeContext,\n });\n\n /*\n * Settle a failed turn. When the caller's own `abortSignal` has fired, the\n * failure is a user-initiated stop, not an error: surface it as an `abort`\n * stream part — matching `streamText`'s abort contract — so\n * `toUIMessageStream` consumers observe an `abort` chunk and\n * `isAborted: true` instead of a spurious `onError`. Every other failure\n * stays a real `error` part. Both outcomes notify `onTurnFailed` so the\n * session's turn tracking returns to idle and the session stays usable,\n * unless the turn is being suspended for a future continuation.\n */\n const settleFailure = (err: unknown) => {\n if (!input.isTurnSuspending?.()) {\n input.onTurnFailed?.();\n }\n if (input.abortSignal?.aborted) {\n result.abort({\n error: err,\n ...(input.abortSignal.reason !== undefined\n ? { reason: getErrorMessage(input.abortSignal.reason) }\n : {}),\n });\n return;\n }\n result.fail(err);\n };\n\n const done = (async () => {\n let bridge: Awaited<ReturnType<typeof toHarnessStream>>;\n try {\n bridge = await toHarnessStream({\n invoke:\n input.mode === 'continue'\n ? emit =>\n input.session.doContinueTurn({\n responseFormat: input.responseFormat,\n tools: input.toolSpecs,\n instructions: input.instructions,\n abortSignal: input.abortSignal,\n emit,\n })\n : emit => {\n if (input.prompt == null) {\n throw new Error(\n 'runPrompt: `prompt` is required for mode \"prompt\".',\n );\n }\n return input.session.doPromptTurn({\n prompt: input.prompt,\n responseFormat: input.responseFormat,\n tools: input.toolSpecs,\n instructions: input.instructions,\n abortSignal: input.abortSignal,\n emit,\n });\n },\n });\n } catch (err) {\n await telemetry.error(err);\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'failed to start harness turn',\n error: err,\n });\n settleFailure(err);\n return;\n }\n\n const { stream, control } = bridge;\n const reader = stream.getReader();\n const toolCallsByToolCallId = new Map<string, ToolCallTextStreamPart>();\n const rawToolCallsByToolCallId = new Map<\n string,\n Extract<HarnessV1StreamPart, { type: 'tool-call' }>\n >();\n /*\n * Host results are echoed back as `tool-result` events too, so the event\n * alone cannot say who ran the tool — classify by the originating\n * `tool-call`. Only an explicit `true` counts: `LanguageModelV4ToolCall`\n * defines an omitted flag as client-executed. A call missing from the map\n * arrived in an earlier slice, where nothing here can classify it.\n */\n const translateOptions = {\n isProviderExecuted: (toolCallId: string): boolean => {\n const rawToolCall = rawToolCallsByToolCallId.get(toolCallId);\n return rawToolCall == null || rawToolCall.providerExecuted === true;\n },\n };\n const pendingApprovalsByApprovalId = new Map(\n pendingToolApprovals.map(approval => [approval.approvalId, approval]),\n );\n const pendingApprovalsByToolCallId = new Map(\n pendingToolApprovals.map(approval => [approval.toolCallId, approval]),\n );\n const continuationsByApprovalId = new Map(\n (input.toolApprovalContinuations ?? []).map(continuation => [\n continuation.approvalResponse.approvalId,\n continuation,\n ]),\n );\n const pendingResultsByToolCallId = new Map(\n pendingToolResults.map(pendingResult => [\n pendingResult.toolCallId,\n pendingResult,\n ]),\n );\n const continuationsByToolCallId = new Map(\n (input.toolResultContinuations ?? []).map(continuation => [\n continuation.toolCallId,\n continuation,\n ]),\n );\n const settledHostToolCallIds = new Set<string>();\n let closingResumedStep = false;\n let pendingStopBoundary:\n | {\n finishReason: LanguageModelV4FinishReason;\n usage: LanguageModelV4Usage;\n releaseCheckpoint: (() => void) | undefined;\n }\n | undefined;\n let finalFinish:\n | Extract<HarnessV1StreamPart, { type: 'finish' }>\n | undefined;\n const completedSteps: Array<StepResult<TOOLS, RUNTIME_CONTEXT>> = [];\n const outstandingHostToolExecutions: Promise<void>[] = [];\n const startHostToolExecution = (execution: Promise<void>): void => {\n outstandingHostToolExecutions.push(execution);\n // The execution is joined at the next step boundary. Attach a rejection\n // handler immediately so failures cannot become unhandled in the\n // meantime; awaiting the original promise still propagates the failure.\n void execution.catch(() => {});\n };\n const waitForOutstandingHostToolExecutions = async (): Promise<void> => {\n if (outstandingHostToolExecutions.length === 0) return;\n const executions = outstandingHostToolExecutions.splice(0);\n const results = await Promise.allSettled(executions);\n const failedExecution = results.find(\n result => result.status === 'rejected',\n );\n if (failedExecution != null) {\n throw failedExecution.reason;\n }\n };\n const releasePendingStopBoundary = (): void => {\n pendingStopBoundary?.releaseCheckpoint?.();\n pendingStopBoundary = undefined;\n };\n\n // Accumulate the model's output content per step so telemetry can record\n // `gen_ai.output.messages` and reporters can log what was actually said.\n let stepText = '';\n let stepReasoning = '';\n let stepToolCalls: TurnContentPart[] = [];\n const buildStepContent = (): TurnContentPart[] => {\n const parts: TurnContentPart[] = [];\n if (stepText) parts.push({ type: 'text', text: stepText });\n if (stepReasoning) parts.push({ type: 'reasoning', text: stepReasoning });\n parts.push(...stepToolCalls);\n return parts;\n };\n const resetStepContent = (): void => {\n stepText = '';\n stepReasoning = '';\n stepToolCalls = [];\n };\n const zeroUsage: LanguageModelV4Usage = {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n };\n const toolCallsFinishReason: LanguageModelV4FinishReason = {\n unified: 'tool-calls',\n raw: undefined,\n };\n const completeStep = async (input: {\n finishReason: LanguageModelV4FinishReason;\n usage: LanguageModelV4Usage;\n providerMetadata: ProviderMetadata | undefined;\n }): Promise<StepResult<TOOLS, RUNTIME_CONTEXT>> => {\n await telemetry.stepFinish({\n finishReason: input.finishReason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n content: buildStepContent(),\n });\n resetStepContent();\n const step = result.finishStep({\n finishReason: input.finishReason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n warnings: [],\n });\n completedSteps.push(step);\n return step;\n };\n const finishForHostInputPause = async (options: {\n completeCurrentStep: boolean;\n }): Promise<void> => {\n await waitForOutstandingHostToolExecutions();\n if (options.completeCurrentStep) {\n await completeStep({\n finishReason: toolCallsFinishReason,\n usage: zeroUsage,\n providerMetadata: undefined,\n });\n }\n await telemetry.end({\n finishReason: toolCallsFinishReason,\n usage: zeroUsage,\n });\n await result.finish();\n };\n const enqueueApprovalRequest = (approval: {\n approvalId: string;\n toolCall: ToolCallTextStreamPart;\n isAutomatic?: boolean;\n }): void => {\n result.enqueue({\n type: 'tool-approval-request',\n approvalId: approval.approvalId,\n toolCall: approval.toolCall,\n ...(approval.isAutomatic !== undefined\n ? { isAutomatic: approval.isAutomatic }\n : {}),\n } as TextStreamPart<TOOLS>);\n };\n const enqueueAutomaticApprovalResponse = (input: {\n approvalId: string;\n toolCall: ToolCallTextStreamPart;\n approved: boolean;\n reason?: string;\n providerExecuted?: boolean;\n }): void => {\n result.enqueue({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n toolCall: input.toolCall,\n approved: input.approved,\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(input.providerExecuted !== undefined\n ? { providerExecuted: input.providerExecuted }\n : {}),\n } as TextStreamPart<TOOLS>);\n };\n const enqueueApprovalResponse = (\n approval: HarnessV1PendingToolApproval,\n continuation: HarnessAgentToolApprovalContinuation,\n ): void => {\n result.enqueueContinuation({\n type: 'tool-approval-response',\n approvalId: approval.approvalId,\n toolCall: continuation.toolCall,\n approved: continuation.approvalResponse.approved,\n ...(continuation.approvalResponse.reason !== undefined\n ? { reason: continuation.approvalResponse.reason }\n : {}),\n ...(approval.providerExecuted !== undefined\n ? { providerExecuted: approval.providerExecuted }\n : {}),\n } as TextStreamPart<TOOLS>);\n };\n const recordPendingToolResult = (options: {\n toolCall: Extract<HarnessV1StreamPart, { type: 'tool-call' }>;\n }): HarnessV1PendingToolResult => {\n const pendingResult =\n pendingResultsByToolCallId.get(options.toolCall.toolCallId) ??\n ({\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: options.toolCall.input,\n } satisfies HarnessV1PendingToolResult);\n pendingResultsByToolCallId.set(pendingResult.toolCallId, pendingResult);\n onPendingToolResult(pendingResult);\n return pendingResult;\n };\n const processPendingToolResultContinuation = async (\n pendingResult: HarnessV1PendingToolResult,\n continuation: HarnessAgentToolResultContinuation,\n ): Promise<void> => {\n onToolResultSettled(pendingResult.toolCallId);\n pendingResultsByToolCallId.delete(pendingResult.toolCallId);\n settledHostToolCallIds.add(pendingResult.toolCallId);\n await control.submitToolResult({\n toolCallId: pendingResult.toolCallId,\n output: continuation.output,\n isError: continuation.isError,\n });\n };\n const enqueueHostToolOutcome = (options: {\n toolCall: HarnessAgentToolApprovalContinuation['toolCall'];\n outcome: HostToolOutcome;\n }): void => {\n if (options.outcome.ok) {\n const stripped = stripWorkDir(\n {\n type: 'tool-result',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n result: options.outcome.output as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n },\n input.sessionWorkDir,\n ) as Extract<HarnessV1StreamPart, { type: 'tool-result' }>;\n result.enqueueContinuation({\n type: 'tool-result',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: options.toolCall.input,\n output: stripped.result,\n } as TextStreamPart<TOOLS>);\n return;\n }\n\n result.enqueueContinuation({\n type: 'tool-error',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: options.toolCall.input,\n error: options.outcome.error,\n } as TextStreamPart<TOOLS>);\n };\n const processPendingApprovalContinuation = async (\n approval: HarnessV1PendingToolApproval,\n continuation: HarnessAgentToolApprovalContinuation,\n ): Promise<'continued' | 'awaiting-tool-result'> => {\n enqueueApprovalResponse(approval, continuation);\n onToolApprovalSettled(approval.approvalId);\n pendingApprovalsByApprovalId.delete(approval.approvalId);\n pendingApprovalsByToolCallId.delete(approval.toolCallId);\n settledHostToolCallIds.add(approval.toolCallId);\n\n if (approval.kind === 'builtin') {\n if (control.submitToolApproval == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted a built-in tool approval request but does not support approval responses.`,\n );\n }\n await control.submitToolApproval({\n approvalId: approval.approvalId,\n approved: continuation.approvalResponse.approved,\n reason: continuation.approvalResponse.reason,\n });\n return 'continued';\n }\n\n if (!continuation.approvalResponse.approved) {\n await control.submitToolResult({\n toolCallId: approval.toolCallId,\n output: {\n type: 'execution-denied',\n reason: continuation.approvalResponse.reason,\n },\n });\n return 'continued';\n }\n\n const rawToolCall =\n rawToolCallsByToolCallId.get(approval.toolCallId) ??\n ({\n type: 'tool-call',\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n input: approval.input,\n } satisfies Extract<HarnessV1StreamPart, { type: 'tool-call' }>);\n\n await telemetry.start(input.session.modelId);\n await telemetry.toolStart({\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n input: rawToolCall.input,\n });\n const execution = await maybeExecuteHostTool({\n event: rawToolCall,\n tools: activeTools,\n wrappedExecuteTool: telemetry.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n control,\n onPreliminaryResult: preliminaryOutput => {\n const stripped = stripWorkDir(\n {\n type: 'tool-result',\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n result: preliminaryOutput as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n },\n input.sessionWorkDir,\n ) as Extract<HarnessV1StreamPart, { type: 'tool-result' }>;\n result.enqueue({\n type: 'tool-result',\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n input: undefined,\n output: stripped.result,\n preliminary: true,\n } as TextStreamPart<TOOLS>);\n },\n });\n if (!execution.executed) {\n recordPendingToolResult({ toolCall: rawToolCall });\n await finishForHostInputPause({ completeCurrentStep: false });\n return 'awaiting-tool-result';\n }\n enqueueHostToolOutcome({\n toolCall: continuation.toolCall,\n outcome: execution.outcome,\n });\n await telemetry.toolEnd(rawToolCall.toolCallId, execution.outcome);\n return 'continued';\n };\n\n try {\n for (const approval of pendingToolApprovals) {\n const continuation = continuationsByApprovalId.get(approval.approvalId);\n if (continuation != null) {\n const outcome = await processPendingApprovalContinuation(\n approval,\n continuation,\n );\n if (outcome === 'awaiting-tool-result') return;\n closingResumedStep = true;\n }\n }\n for (const pendingResult of pendingToolResults) {\n const continuation = continuationsByToolCallId.get(\n pendingResult.toolCallId,\n );\n if (continuation != null) {\n await processPendingToolResultContinuation(\n pendingResult,\n continuation,\n );\n closingResumedStep = true;\n }\n }\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n releasePendingStopBoundary();\n break;\n }\n if (value == null) continue;\n\n if (pendingStopBoundary != null) {\n if (value.type === 'finish') {\n releasePendingStopBoundary();\n } else if (\n (\n await Promise.all(\n input.stopConditions!.map(condition =>\n condition({ steps: completedSteps }),\n ),\n )\n ).some(Boolean)\n ) {\n await input.onStopConditionMet?.();\n const { finishReason, usage } = pendingStopBoundary;\n releasePendingStopBoundary();\n await telemetry.end({ finishReason, usage });\n await result.finish();\n return;\n } else {\n releasePendingStopBoundary();\n }\n }\n\n // Begin the operation span on stream-start, using the runtime-resolved\n // model the adapter reports (falling back to the session's model).\n if (value.type === 'stream-start') {\n await telemetry.start(value.modelId ?? input.session.modelId);\n }\n\n // Open a step span lazily before the first content of each step.\n if (\n value.type !== 'stream-start' &&\n value.type !== 'finish-step' &&\n value.type !== 'finish' &&\n value.type !== 'error'\n ) {\n await telemetry.ensureStepOpen();\n }\n\n /*\n * Strip the session working-directory prefix for everything the\n * consumer sees. The original `value` is kept intact for host tool\n * execution below — the tools need the absolute path to resolve\n * against the sandbox root, so the strip is display-only.\n */\n const displayValue = stripWorkDir(value, input.sessionWorkDir);\n const settledHostInputReplay =\n (displayValue.type === 'tool-call' ||\n displayValue.type === 'tool-result' ||\n displayValue.type === 'tool-approval-request') &&\n settledHostToolCallIds.has(displayValue.toolCallId);\n\n if (settledHostInputReplay) {\n continue;\n }\n\n if (displayValue.type === 'finish-step' && closingResumedStep) {\n closingResumedStep = false;\n resetStepContent();\n result.discardCurrentStepContent();\n continue;\n }\n\n if (displayValue.type === 'tool-approval-request') {\n const toolCall = toolCallsByToolCallId.get(displayValue.toolCallId);\n if (toolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted approval request '${displayValue.approvalId}' for unknown tool call '${displayValue.toolCallId}'.`,\n );\n }\n const rawToolCall = rawToolCallsByToolCallId.get(\n displayValue.toolCallId,\n );\n const toolName = rawToolCall?.toolName ?? toolCall.toolName;\n if (\n !isHarnessV1BuiltinToolIncluded({\n toolName,\n toolFiltering: input.builtinToolFiltering,\n })\n ) {\n if (control.submitToolApproval == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted a built-in tool approval request but does not support approval responses.`,\n );\n }\n await control.submitToolApproval({\n approvalId: displayValue.approvalId,\n approved: false,\n reason: getHarnessV1BuiltinToolFilteringDenialReason({\n toolName,\n }),\n });\n continue;\n }\n }\n\n /*\n * Settle failures before the translate-and-forward step below: the\n * translated `error` part must not reach the consumer stream, or the\n * turn surfaces BOTH a forwarded `error` part and the settle-owned\n * terminal part (an `abort` part for user stops via `settleFailure`,\n * or a second `error` part from `fail`).\n */\n if (value.type === 'error' && displayValue.type === 'error') {\n await waitForOutstandingHostToolExecutions();\n // Telemetry and stderr diagnostics keep the raw error (absolute\n // paths help debugging); the consumer-facing settle uses the\n // workDir-stripped one, like every other forwarded part.\n await telemetry.error(value.error);\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'harness stream error',\n error: value.error,\n });\n settleFailure(displayValue.error);\n return;\n }\n\n // Forward to consumer as soon as possible.\n for (const part of translateStreamPart<TOOLS>(\n displayValue,\n translateOptions,\n )) {\n result.enqueue(part);\n }\n\n // Tool-call validation lives here (not in translateStreamPart) because\n // schema parsing is async and needs the merged tool set in scope.\n if (displayValue.type === 'tool-call') {\n const parsed = await validateToolCall<TOOLS>({\n event: displayValue,\n tools: input.tools,\n });\n const parsedToolCall = asToolCallTextStreamPart({ part: parsed });\n rawToolCallsByToolCallId.set(displayValue.toolCallId, displayValue);\n toolCallsByToolCallId.set(displayValue.toolCallId, parsedToolCall);\n result.enqueue(parsed);\n }\n\n // Accumulate output content for telemetry / reporters.\n if (value.type === 'text-delta') {\n stepText += value.delta;\n } else if (value.type === 'reasoning-delta') {\n stepReasoning += value.delta;\n }\n\n // Telemetry: a tool execution begins on its `tool-call`.\n if (value.type === 'tool-call') {\n stepToolCalls.push({\n type: 'tool-call',\n toolCallId: value.toolCallId,\n toolName: value.toolName,\n input: value.input,\n });\n await telemetry.toolStart({\n toolCallId: value.toolCallId,\n toolName: value.toolName,\n input: value.input,\n });\n }\n\n // Telemetry: close a tool span when its provider-executed result lands.\n if (value.type === 'tool-result') {\n await telemetry.toolEnd(\n value.toolCallId,\n value.isError\n ? { ok: false, error: value.result }\n : { ok: true, output: value.result },\n );\n }\n\n if (value.type === 'tool-approval-request') {\n const toolCall = toolCallsByToolCallId.get(value.toolCallId);\n if (toolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted approval request '${value.approvalId}' for unknown tool call '${value.toolCallId}'.`,\n );\n }\n\n const rawToolCall = rawToolCallsByToolCallId.get(value.toolCallId);\n const pendingApproval =\n pendingApprovalsByApprovalId.get(value.approvalId) ??\n ({\n approvalId: value.approvalId,\n toolCallId: value.toolCallId,\n toolName: toolCall.toolName,\n input: rawToolCall?.input ?? JSON.stringify(toolCall.input),\n kind: 'builtin',\n providerExecuted: rawToolCall?.providerExecuted ?? true,\n ...(rawToolCall?.nativeName !== undefined\n ? { nativeName: rawToolCall.nativeName }\n : {}),\n } satisfies HarnessV1PendingToolApproval);\n pendingApprovalsByApprovalId.set(\n pendingApproval.approvalId,\n pendingApproval,\n );\n pendingApprovalsByToolCallId.set(\n pendingApproval.toolCallId,\n pendingApproval,\n );\n\n const continuation = continuationsByApprovalId.get(\n pendingApproval.approvalId,\n );\n if (continuation != null) {\n const outcome = await processPendingApprovalContinuation(\n pendingApproval,\n continuation,\n );\n if (outcome === 'awaiting-tool-result') return;\n closingResumedStep = true;\n continue;\n }\n\n onPendingToolApproval(pendingApproval);\n enqueueApprovalRequest({\n approvalId: pendingApproval.approvalId,\n toolCall,\n });\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n\n // Drive step boundaries.\n if (value.type === 'finish-step') {\n await waitForOutstandingHostToolExecutions();\n await completeStep({\n finishReason: value.finishReason,\n usage: value.usage,\n providerMetadata: value.harnessMetadata,\n });\n if (input.stopConditions != null && input.stopConditions.length > 0) {\n pendingStopBoundary = {\n finishReason: value.finishReason,\n usage: value.usage,\n releaseCheckpoint: pinSandboxChannelEventCheckpoint(value),\n };\n }\n }\n\n if (value.type === 'finish') {\n await waitForOutstandingHostToolExecutions();\n finalFinish = value;\n await telemetry.end({\n finishReason: value.finishReason,\n usage: value.totalUsage,\n });\n }\n\n // Execute host-side tools when the harness asks for one.\n if (value.type === 'tool-call' && !value.providerExecuted) {\n const toolCall = value;\n const parsedToolCall = toolCallsByToolCallId.get(toolCall.toolCallId);\n if (parsedToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not find parsed tool call '${toolCall.toolCallId}' for custom tool approval.`,\n );\n }\n if (!hasTool({ tools: activeTools, toolName: toolCall.toolName })) {\n const output = {\n type: 'execution-denied',\n reason: getHarnessV1BuiltinToolFilteringDenialReason({\n toolName: toolCall.toolName,\n }),\n };\n await control.submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n await telemetry.toolEnd(toolCall.toolCallId, { ok: true, output });\n continue;\n }\n const customToolApprovalDecision = resolveCustomToolApproval({\n toolName: toolCall.toolName,\n toolApproval: input.toolApproval,\n });\n if (customToolApprovalDecision.type === 'deny') {\n const approvalId = generateId();\n enqueueApprovalRequest({\n approvalId,\n toolCall: parsedToolCall,\n isAutomatic: true,\n });\n enqueueAutomaticApprovalResponse({\n approvalId,\n toolCall: parsedToolCall,\n approved: false,\n reason: customToolApprovalDecision.reason,\n providerExecuted: false,\n });\n const output = {\n type: 'execution-denied',\n reason: customToolApprovalDecision.reason,\n };\n await control.submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n await telemetry.toolEnd(toolCall.toolCallId, { ok: true, output });\n continue;\n }\n const pendingApproval =\n pendingApprovalsByToolCallId.get(toolCall.toolCallId) ??\n (customToolApprovalDecision.type === 'request'\n ? ({\n approvalId: generateId(),\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n kind: 'custom',\n providerExecuted: false,\n ...(toolCall.nativeName !== undefined\n ? { nativeName: toolCall.nativeName }\n : {}),\n } satisfies HarnessV1PendingToolApproval)\n : undefined);\n if (pendingApproval != null) {\n pendingApprovalsByApprovalId.set(\n pendingApproval.approvalId,\n pendingApproval,\n );\n pendingApprovalsByToolCallId.set(\n pendingApproval.toolCallId,\n pendingApproval,\n );\n const continuation = continuationsByApprovalId.get(\n pendingApproval.approvalId,\n );\n if (continuation != null) {\n const outcome = await processPendingApprovalContinuation(\n pendingApproval,\n continuation,\n );\n if (outcome === 'awaiting-tool-result') return;\n closingResumedStep = true;\n continue;\n }\n const pendingParsedToolCall = toolCallsByToolCallId.get(\n pendingApproval.toolCallId,\n );\n if (pendingParsedToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not find parsed tool call '${pendingApproval.toolCallId}' for approval request '${pendingApproval.approvalId}'.`,\n );\n }\n onPendingToolApproval(pendingApproval);\n enqueueApprovalRequest({\n approvalId: pendingApproval.approvalId,\n toolCall: pendingParsedToolCall,\n });\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n if (!isExecutableTool(activeTools[toolCall.toolName])) {\n recordPendingToolResult({ toolCall });\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n startHostToolExecution(\n (async () => {\n const execution = await maybeExecuteHostTool({\n event: toolCall,\n tools: activeTools,\n wrappedExecuteTool: telemetry.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n control,\n onPreliminaryResult: preliminaryOutput => {\n /*\n * Project a `yield`ed value as a preliminary AI SDK\n * `tool-result` part. Unlike the final result — which is\n * submitted to the runtime, echoed back as a `tool-result`\n * event, and stripped on its way through the loop above —\n * preliminary values never reach the runtime, so strip the\n * working directory here to match the final result's projection.\n */\n const stripped = stripWorkDir(\n {\n type: 'tool-result',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n result: preliminaryOutput as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n },\n input.sessionWorkDir,\n ) as Extract<HarnessV1StreamPart, { type: 'tool-result' }>;\n result.enqueue({\n type: 'tool-result',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: undefined,\n output: stripped.result,\n preliminary: true,\n } as TextStreamPart<TOOLS>);\n },\n });\n if (!execution.executed) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not execute host tool '${toolCall.toolName}'.`,\n );\n }\n await telemetry.toolEnd(toolCall.toolCallId, execution.outcome);\n })(),\n );\n }\n }\n await waitForOutstandingHostToolExecutions();\n const isTurnSuspending = input.isTurnSuspending?.() === true;\n if (isTurnSuspending) {\n if (finalFinish == null) {\n /*\n * A timed slice may stop in the middle of a model step. Its partial\n * content remains in the bridge replay log for the next slice, but it\n * cannot form a valid StepResult in this slice because no finish-step\n * has arrived yet.\n */\n result.discardCurrentStepContent();\n }\n } else if (finalFinish != null) {\n input.onTurnFinished?.();\n } else {\n input.onTurnFailed?.();\n }\n await result.finish(\n finalFinish\n ? {\n finishReason: finalFinish.finishReason,\n totalUsage: finalFinish.totalUsage,\n providerMetadata: finalFinish.harnessMetadata,\n }\n : undefined,\n );\n } catch (err) {\n try {\n await waitForOutstandingHostToolExecutions();\n } catch {\n // Preserve the error that stopped the reader loop.\n }\n await telemetry.error(err);\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'harness turn failed',\n error: err,\n });\n settleFailure(err);\n } finally {\n releasePendingStopBoundary();\n reader.releaseLock();\n }\n })();\n\n // Swallow the loop's rejection at the top level — failures are observable\n // via the result's `fullStream` `error` part and rejected promise\n // accessors. We do not want the orphan promise to become an unhandled\n // rejection.\n done.catch(() => {});\n\n return { result, done };\n}\n\ntype HostToolOutcome =\n | { ok: true; output: unknown }\n | { ok: false; error: unknown };\n\ntype HostToolExecution =\n | { executed: false }\n | { executed: true; outcome: HostToolOutcome };\n\nfunction asToolCallTextStreamPart<TOOLS extends ToolSet>(input: {\n part: TextStreamPart<TOOLS>;\n}): ToolCallTextStreamPart {\n if (input.part.type !== 'tool-call') {\n throw new Error(\n `Expected parsed tool-call stream part, got '${input.part.type}'.`,\n );\n }\n return input.part as ToolCallTextStreamPart;\n}\n\ntype ToolCallTextStreamPart = {\n readonly type: 'tool-call';\n readonly toolCallId: string;\n readonly toolName: string;\n readonly input: unknown;\n readonly providerExecuted?: boolean;\n readonly providerMetadata?: unknown;\n readonly dynamic?: boolean;\n readonly invalid?: boolean;\n readonly error?: unknown;\n readonly title?: string;\n};\n\nfunction hasTool(input: { tools: ToolSet; toolName: string }): boolean {\n return Object.prototype.hasOwnProperty.call(input.tools, input.toolName);\n}\n\nasync function maybeExecuteHostTool<TOOLS extends ToolSet>(input: {\n event: { toolCallId: string; toolName: string; input: string };\n tools: TOOLS;\n wrappedExecuteTool: TurnTelemetry['executeTool'];\n sandboxSession: SandboxSession;\n abortSignal: AbortSignal | undefined;\n control: HarnessV1PromptControl;\n /**\n * Called for each value a generator `execute` `yield`s before its last. The\n * caller surfaces these as preliminary `tool-result` parts on the consumer\n * stream. Never called for a plain (non-generator) `execute`.\n */\n onPreliminaryResult: (output: unknown) => void;\n}): Promise<HostToolExecution> {\n const tool = input.tools[input.event.toolName];\n\n if (!isExecutableTool(tool)) return { executed: false };\n\n const parsed = await safeParseJSON({ text: input.event.input });\n const args = parsed.success ? parsed.value : input.event.input;\n\n try {\n /*\n * Normalize the tool's return value through `executeTool`, the same helper\n * the non-harness AI SDK uses, so generator `execute` functions behave\n * identically here: each `yield`ed value arrives as a `preliminary` part\n * and the last `yield` is re-emitted as the `final` part; a plain value or\n * Promise arrives as a single `final` part. The underlying runtimes accept\n * exactly one tool result per call, so only the final value is submitted\n * back to the model — preliminary values are surfaced to the consumer\n * stream alone, matching how the AI SDK treats `onPreliminaryToolResult`.\n */\n const output = await input.wrappedExecuteTool({\n toolCallId: input.event.toolCallId,\n execute: async () => {\n let output: unknown;\n const stream = executeTool({\n tool,\n input: args as never,\n options: {\n toolCallId: input.event.toolCallId,\n messages: [],\n abortSignal: input.abortSignal,\n context: undefined as never,\n experimental_sandbox: input.sandboxSession,\n },\n });\n for await (const part of stream) {\n if (part.type === 'preliminary') {\n input.onPreliminaryResult(part.output);\n } else {\n output = part.output;\n }\n }\n return output;\n },\n });\n\n await input.control.submitToolResult({\n toolCallId: input.event.toolCallId,\n output,\n });\n return { executed: true, outcome: { ok: true, output } };\n } catch (err) {\n await input.control.submitToolResult({\n toolCallId: input.event.toolCallId,\n output: { error: String(err) },\n isError: true,\n });\n return { executed: true, outcome: { ok: false, error: err } };\n }\n}\n\n/*\n * Validate an inbound `tool-call` event against the merged tool set's schema\n * using the AI SDK's canonical `parseToolCall`. Returns an AI SDK `tool-call`\n * stream part with parsed input on success, or a `dynamic + invalid: true`\n * part on failure (unknown tool, schema mismatch, malformed JSON).\n *\n * The harness `tool-call` event is structurally a `LanguageModelV4ToolCall`\n * (plus an optional harness-only `nativeName`). `providerExecuted` already\n * lives on the V4 type — `true` for adapter builtins (Claude Code's `Bash`,\n * Codex's `shell`), false/undefined for host tools — and is passed through\n * to the AI SDK part by `parseToolCall`.\n */\nexport async function validateToolCall<TOOLS extends ToolSet>(args: {\n event: Extract<HarnessV1StreamPart, { type: 'tool-call' }>;\n tools: TOOLS;\n}): Promise<TextStreamPart<TOOLS>> {\n const { event, tools } = args;\n const toolCall: LanguageModelV4ToolCall = {\n type: 'tool-call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.input,\n ...(event.providerExecuted !== undefined\n ? { providerExecuted: event.providerExecuted }\n : {}),\n ...(event.dynamic !== undefined ? { dynamic: event.dynamic } : {}),\n ...(event.providerMetadata !== undefined\n ? { providerMetadata: event.providerMetadata }\n : {}),\n };\n\n const parsed = await parseToolCall<TOOLS>({\n toolCall,\n tools,\n repairToolCall: undefined,\n refineToolInput: undefined,\n instructions: undefined,\n messages: [],\n });\n\n return parsed as TextStreamPart<TOOLS>;\n}\n\n/** Best-effort plain text of the turn's prompt, for telemetry input messages. */\nfunction promptToText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const content = (prompt as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .filter(\n (part): part is { type: 'text'; text: string } =>\n typeof part === 'object' &&\n part != null &&\n (part as { type?: unknown }).type === 'text',\n )\n .map(part => part.text)\n .join('');\n }\n return '';\n}\n\n// keep import bound so unused-but-needed type stays cited\nexport type _ContentPartMarker<T extends ToolSet> = ContentPart<T>;\n","import {\n DelayedPromise,\n generateId,\n type AssistantModelMessage,\n type Context,\n type ToolModelMessage,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport {\n addLanguageModelUsage,\n asLanguageModelUsage,\n createAsyncIterableStream,\n createNullLanguageModelUsage,\n DefaultStepResult,\n toResponseMessages,\n} from 'ai/internal';\nimport type {\n LanguageModelV4FinishReason,\n LanguageModelV4Usage,\n} from '@ai-sdk/provider';\nimport {\n createUIMessageStreamResponse,\n toUIMessageStream as toUIMessageStreamHelper,\n type CallWarning,\n type ContentPart,\n type FinishReason,\n type InferUIMessageChunk,\n type InferGenerateOutput,\n type InferStreamOutput,\n type LanguageModelUsage,\n type OutputInterface as Output,\n type ProviderMetadata,\n type StepResult,\n type StreamTextResult,\n type TextStreamPart,\n type UIMessage,\n type UIMessageStreamOptions,\n} from 'ai';\n\ntype StreamProp<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n KEY extends keyof StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>,\n> = Awaited<StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>[KEY]>;\n\ntype InferElementOutput<OUTPUT extends Output> =\n OUTPUT extends Output<any, any, infer ELEMENT> ? ELEMENT : never;\n\ntype EnrichedStreamPart<TOOLS extends ToolSet, PARTIAL_OUTPUT> = {\n part: TextStreamPart<TOOLS>;\n partialOutput: PARTIAL_OUTPUT | undefined;\n};\n\n/**\n * Concrete `StreamTextResult` implementation backed by a single\n * harness prompt turn.\n *\n * Wraps a `ReadableStream<TextStreamPart<TOOLS>>` that the calling\n * driver pushes events into. Every `PromiseLike` accessor is backed by a\n * `DelayedPromise` so the AI SDK consumer surface stays identical to\n * `streamText`'s — consumers can `await result.text` or iterate\n * `result.fullStream`, in either order.\n *\n * Each `finish-step` boundary in the driver translates to a `StepResult`\n * built via `DefaultStepResult`. Step content is accumulated as\n * `ContentPart[]` and fed straight to `DefaultStepResult`, which derives\n * `text`, `toolCalls`, `toolResults`, `reasoning`, etc. via its getters.\n *\n * The Node.js response helpers (`pipeUIMessageStreamToResponse`,\n * `pipeTextStreamToResponse`, `toTextStreamResponse`) are not implemented yet\n * and throw a clear error.\n */\nexport class HarnessStreamTextResult<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> implements StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n // Delayed promises backing every PromiseLike accessor. Each is typed\n // against the corresponding `StreamTextResult` property so the public\n // surface stays in lockstep with AI SDK's interface as it evolves.\n private readonly _content = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'content'>\n >();\n private readonly _text = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'text'>\n >();\n private readonly _reasoning = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'reasoning'>\n >();\n private readonly _reasoningText = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'reasoningText'>\n >();\n private readonly _files = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'files'>\n >();\n private readonly _sources = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'sources'>\n >();\n private readonly _toolCalls = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'toolCalls'>\n >();\n private readonly _staticToolCalls = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'staticToolCalls'>\n >();\n private readonly _dynamicToolCalls = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'dynamicToolCalls'>\n >();\n private readonly _toolResults = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'toolResults'>\n >();\n private readonly _staticToolResults = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'staticToolResults'>\n >();\n private readonly _dynamicToolResults = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'dynamicToolResults'>\n >();\n private readonly _finishReason = new DelayedPromise<FinishReason>();\n private readonly _rawFinishReason = new DelayedPromise<string | undefined>();\n private readonly _usage = new DelayedPromise<LanguageModelUsage>();\n private readonly _warnings = new DelayedPromise<CallWarning[] | undefined>();\n private readonly _steps = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'steps'>\n >();\n private readonly _finalStep = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'finalStep'>\n >();\n private readonly _request = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'request'>\n >();\n private readonly _response = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'response'>\n >();\n private readonly _responseMessages = new DelayedPromise<\n Array<AssistantModelMessage | ToolModelMessage>\n >();\n private readonly _providerMetadata = new DelayedPromise<\n ProviderMetadata | undefined\n >();\n\n // The driver pushes parts into this controller; consumers read via `stream`.\n private readonly fullStreamController: ReadableStreamDefaultController<\n TextStreamPart<TOOLS>\n >;\n private baseStream: ReadableStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n >;\n\n private readonly stepsBuffer: StepResult<TOOLS, RUNTIME_CONTEXT>[] = [];\n private currentStepContent: ContentPart<TOOLS>[] = [];\n private currentStepWarnings: CallWarning[] = [];\n private stepNumber = 0;\n private stepStarted = false;\n\n private readonly tools: TOOLS;\n private readonly runtimeContext: RUNTIME_CONTEXT;\n private readonly toolsContext: never;\n private readonly providerName: string;\n private readonly modelId: string;\n private readonly outputSpecification: OUTPUT | undefined;\n\n // Accumulators that span the whole turn.\n private accumulatedUsage: LanguageModelUsage = createNullLanguageModelUsage();\n private finalProviderMetadata: ProviderMetadata | undefined = undefined;\n private finalFinishReason: FinishReason = 'other';\n private finalRawFinishReason: string | undefined = undefined;\n private aggregateWarnings: CallWarning[] = [];\n private settled = false;\n\n constructor(options: {\n tools: TOOLS;\n runtimeContext: RUNTIME_CONTEXT;\n toolsContext: never;\n harnessId: string;\n sessionId: string;\n output: OUTPUT | undefined;\n }) {\n this.tools = options.tools;\n this.runtimeContext = options.runtimeContext;\n this.toolsContext = options.toolsContext;\n this.providerName = `harness:${options.harnessId}`;\n this.modelId = options.sessionId;\n this.outputSpecification = options.output;\n\n let controllerRef!: ReadableStreamDefaultController<TextStreamPart<TOOLS>>;\n const baseStream = new ReadableStream<TextStreamPart<TOOLS>>({\n start(c) {\n controllerRef = c;\n // Send the message-level start event as the first part, mirroring\n // `streamText`. Downstream UI message stream consumers depend on it:\n // `toUIMessageStream`'s persistence mode injects the response message\n // id into this part (it never synthesizes one), so without it\n // `useChat` clients keep a locally generated assistant message id\n // that diverges from the id the server persists under.\n c.enqueue({ type: 'start' });\n },\n });\n this.fullStreamController = controllerRef;\n\n this.baseStream =\n options.output == null\n ? baseStream.pipeThrough(\n new TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n >({\n transform(part, controller) {\n controller.enqueue({ part, partialOutput: undefined });\n },\n }),\n )\n : baseStream.pipeThrough(createOutputTransformStream(options.output));\n }\n\n // ─── Writer-side methods used by the driver ────────────────────────\n\n /**\n * Push a translated `TextStreamPart` into `fullStream` and accumulate it\n * into the current step's content array where applicable.\n */\n enqueue(part: TextStreamPart<TOOLS>): void {\n this.startStep();\n this.fullStreamController.enqueue(part);\n this.appendToCurrentStepContent(part);\n }\n\n /**\n * Push a continuation input into the consumer stream without attributing it\n * to the next model step. Approval responses and client tool results arrive\n * between model calls and therefore must not create or alter a StepResult.\n */\n enqueueContinuation(part: TextStreamPart<TOOLS>): void {\n this.fullStreamController.enqueue(part);\n }\n\n /**\n * Drop content replayed while a suspended host-input pause closes its\n * already-recorded model step.\n */\n discardCurrentStepContent(): void {\n this.currentStepContent = [];\n this.currentStepWarnings = [];\n this.stepStarted = false;\n }\n\n /**\n * Mark the end of a step. Builds a `StepResult` from the accumulated\n * content and records it in the steps array. Accepts the V4-shaped\n * finish reason / usage the harness emits and normalizes to AI SDK's\n * flat shape internally.\n */\n finishStep(input: {\n finishReason: LanguageModelV4FinishReason;\n usage: LanguageModelV4Usage;\n providerMetadata: ProviderMetadata | undefined;\n warnings: CallWarning[];\n }): StepResult<TOOLS, RUNTIME_CONTEXT> {\n this.startStep();\n\n const normalizedUsage = asLanguageModelUsage(input.usage);\n const finishReason = input.finishReason.unified;\n const rawFinishReason = input.finishReason.raw;\n\n const step = new DefaultStepResult<TOOLS, RUNTIME_CONTEXT>({\n callId: generateId(),\n stepNumber: this.stepNumber,\n provider: this.providerName,\n modelId: this.modelId,\n runtimeContext: this.runtimeContext,\n toolsContext: this.toolsContext,\n content: this.currentStepContent,\n finishReason,\n rawFinishReason,\n usage: normalizedUsage,\n performance: createEmptyPerformance(),\n warnings: input.warnings.length > 0 ? input.warnings : undefined,\n request: {},\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n messages: [],\n },\n providerMetadata: input.providerMetadata,\n });\n this.stepsBuffer.push(step);\n\n // Forward an AI SDK finish-step event so consumers reading fullStream\n // see step boundaries.\n this.fullStreamController.enqueue({\n type: 'finish-step',\n finishReason,\n rawFinishReason,\n usage: normalizedUsage,\n providerMetadata: input.providerMetadata,\n response: step.response,\n performance: createEmptyPerformance(),\n } as TextStreamPart<TOOLS>);\n\n this.accumulatedUsage = addLanguageModelUsage(\n this.accumulatedUsage,\n normalizedUsage,\n );\n this.finalFinishReason = finishReason;\n this.finalRawFinishReason = rawFinishReason;\n this.finalProviderMetadata = input.providerMetadata;\n if (input.warnings.length > 0)\n this.aggregateWarnings.push(...input.warnings);\n\n this.stepNumber += 1;\n this.currentStepContent = [];\n this.currentStepWarnings = [];\n this.stepStarted = false;\n\n return step;\n }\n\n private startStep(): void {\n if (this.stepStarted) return;\n\n this.stepStarted = true;\n this.fullStreamController.enqueue({\n type: 'start-step',\n request: {},\n warnings: this.currentStepWarnings,\n } as TextStreamPart<TOOLS>);\n }\n\n /**\n * Resolve every delayed promise and close `fullStream`. Idempotent.\n */\n async finish(input?: {\n finishReason: LanguageModelV4FinishReason;\n totalUsage: LanguageModelV4Usage;\n providerMetadata: ProviderMetadata | undefined;\n }): Promise<void> {\n if (this.settled) return;\n\n /*\n * Do not flush trailing content that has not been captured by a\n * `finish-step`. A terminal `finish` closes the turn but is not a semantic\n * step boundary, so buffered content indicates an invalid harness stream.\n */\n if (this.currentStepContent.length > 0) {\n this.fail(\n new Error(\n 'HarnessAgent: received terminal finish with unclosed step content. Harness adapters must emit `finish-step` before `finish`.',\n ),\n );\n return;\n }\n\n if (input != null) {\n this.finalFinishReason = input.finishReason.unified;\n this.finalRawFinishReason = input.finishReason.raw;\n this.finalProviderMetadata = input.providerMetadata;\n this.accumulatedUsage = asLanguageModelUsage(input.totalUsage);\n }\n\n this.settled = true;\n\n const finalStep =\n this.stepsBuffer.length > 0\n ? this.stepsBuffer[this.stepsBuffer.length - 1]!\n : new DefaultStepResult<TOOLS, RUNTIME_CONTEXT>({\n callId: generateId(),\n stepNumber: 0,\n provider: this.providerName,\n modelId: this.modelId,\n runtimeContext: this.runtimeContext,\n toolsContext: this.toolsContext,\n content: [],\n finishReason: this.finalFinishReason,\n rawFinishReason: this.finalRawFinishReason,\n usage: createNullLanguageModelUsage(),\n performance: createEmptyPerformance(),\n warnings: undefined,\n request: {},\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n messages: [],\n },\n providerMetadata: undefined,\n });\n\n const aggregatedContent = this.stepsBuffer.flatMap(s => s.content);\n\n this._content.resolve(\n aggregatedContent as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'content'\n >,\n );\n this._text.resolve(finalStep.text);\n // Reasoning content parts are not yet derived from harness events; the\n // foundation surfaces an empty array. Adapters that emit reasoning\n // deltas can be wired up to produce real reasoning content in a later\n // pass.\n this._reasoning.resolve(\n [] as StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'reasoning'>,\n );\n this._reasoningText.resolve(undefined);\n this._files.resolve(this.stepsBuffer.flatMap(s => s.files));\n this._sources.resolve(this.stepsBuffer.flatMap(s => s.sources));\n this._toolCalls.resolve(\n this.stepsBuffer.flatMap(s => s.toolCalls) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'toolCalls'\n >,\n );\n this._staticToolCalls.resolve(\n this.stepsBuffer.flatMap(s => s.staticToolCalls) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'staticToolCalls'\n >,\n );\n this._dynamicToolCalls.resolve(\n this.stepsBuffer.flatMap(s => s.dynamicToolCalls) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'dynamicToolCalls'\n >,\n );\n this._toolResults.resolve(\n this.stepsBuffer.flatMap(s => s.toolResults) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'toolResults'\n >,\n );\n this._staticToolResults.resolve(\n this.stepsBuffer.flatMap(s => s.staticToolResults) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'staticToolResults'\n >,\n );\n this._dynamicToolResults.resolve(\n this.stepsBuffer.flatMap(s => s.dynamicToolResults) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'dynamicToolResults'\n >,\n );\n this._finishReason.resolve(this.finalFinishReason);\n this._rawFinishReason.resolve(this.finalRawFinishReason);\n this._usage.resolve(this.accumulatedUsage);\n this._warnings.resolve(\n this.aggregateWarnings.length > 0 ? this.aggregateWarnings : undefined,\n );\n this._steps.resolve(this.stepsBuffer);\n this._finalStep.resolve(finalStep);\n this._request.resolve(finalStep.request);\n this._response.resolve(finalStep.response);\n this._providerMetadata.resolve(this.finalProviderMetadata);\n\n const responseMessages = await toResponseMessages<TOOLS>({\n content: aggregatedContent,\n tools: this.tools,\n });\n this._responseMessages.resolve(responseMessages);\n\n // Forward AI SDK finish event before closing.\n this.fullStreamController.enqueue({\n type: 'finish',\n finishReason: this.finalFinishReason,\n rawFinishReason: this.finalRawFinishReason,\n totalUsage: this.accumulatedUsage,\n providerMetadata: this.finalProviderMetadata,\n } as TextStreamPart<TOOLS>);\n\n this.fullStreamController.close();\n }\n\n /**\n * Settle the turn as user-aborted: emit a final `abort` part — matching\n * `streamText`'s abort contract — and close the stream, instead of\n * surfacing an `error` part. `toUIMessageStream` consumers then observe\n * an `abort` chunk (and `isAborted: true`) rather than a spurious\n * `onError`. The delayed promise accessors still reject with the\n * underlying abort error so awaiting consumers do not hang. Idempotent.\n */\n abort(input: { error: unknown; reason?: string }): void {\n if (this.settled) return;\n this.settled = true;\n this.fullStreamController.enqueue({\n type: 'abort',\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n } as TextStreamPart<TOOLS>);\n this.fullStreamController.close();\n this.rejectDelayedPromises(input.error);\n }\n\n /**\n * Surface a fatal error as a stream `error` part + reject every delayed\n * promise so awaiting consumers stop hanging. Idempotent.\n */\n fail(error: unknown): void {\n if (this.settled) return;\n this.settled = true;\n this.fullStreamController.enqueue({\n type: 'error',\n error,\n } as TextStreamPart<TOOLS>);\n this.fullStreamController.close();\n this.rejectDelayedPromises(error);\n }\n\n private rejectDelayedPromises(error: unknown): void {\n for (const dp of [\n this._content,\n this._text,\n this._reasoning,\n this._reasoningText,\n this._files,\n this._sources,\n this._toolCalls,\n this._staticToolCalls,\n this._dynamicToolCalls,\n this._toolResults,\n this._staticToolResults,\n this._dynamicToolResults,\n this._finishReason,\n this._rawFinishReason,\n this._usage,\n this._warnings,\n this._steps,\n this._finalStep,\n this._request,\n this._response,\n this._responseMessages,\n this._providerMetadata,\n ]) {\n try {\n (dp as DelayedPromise<unknown>).reject(error);\n } catch {\n // ignore double-rejection\n }\n }\n }\n\n // ─── Reader-side public surface (StreamTextResult contract) ────────\n\n private teeStream(): ReadableStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n > {\n const [stream, remainingStream] = this.baseStream.tee();\n this.baseStream = remainingStream;\n return stream;\n }\n\n get stream(): AsyncIterableStream<TextStreamPart<TOOLS>> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>,\n TextStreamPart<TOOLS>\n >({\n transform({ part }, controller) {\n controller.enqueue(part);\n },\n }),\n ),\n ) as AsyncIterableStream<TextStreamPart<TOOLS>>;\n }\n\n get fullStream(): AsyncIterableStream<TextStreamPart<TOOLS>> {\n return this.stream;\n }\n\n get textStream(): AsyncIterableStream<string> {\n return createAsyncIterableStream(\n this.stream.pipeThrough(\n new TransformStream<TextStreamPart<TOOLS>, string>({\n transform(part, controller) {\n if (part.type === 'text-delta') {\n controller.enqueue(part.text);\n }\n },\n }),\n ),\n ) as AsyncIterableStream<string>;\n }\n\n get content() {\n return this._content.promise;\n }\n get text() {\n return this._text.promise;\n }\n get reasoning() {\n return this._reasoning.promise;\n }\n get reasoningText() {\n return this._reasoningText.promise;\n }\n get files() {\n return this._files.promise;\n }\n get sources() {\n return this._sources.promise;\n }\n get toolCalls() {\n return this._toolCalls.promise;\n }\n get staticToolCalls() {\n return this._staticToolCalls.promise;\n }\n get dynamicToolCalls() {\n return this._dynamicToolCalls.promise;\n }\n get toolResults() {\n return this._toolResults.promise;\n }\n get staticToolResults() {\n return this._staticToolResults.promise;\n }\n get dynamicToolResults() {\n return this._dynamicToolResults.promise;\n }\n get finishReason() {\n return this._finishReason.promise;\n }\n get rawFinishReason() {\n return this._rawFinishReason.promise;\n }\n get usage() {\n return this._usage.promise;\n }\n get totalUsage() {\n return this._usage.promise;\n }\n get warnings() {\n return this._warnings.promise;\n }\n get steps() {\n return this._steps.promise;\n }\n get finalStep() {\n return this._finalStep.promise;\n }\n get request() {\n return this._request.promise;\n }\n get response() {\n return this._response.promise;\n }\n get responseMessages() {\n return this._responseMessages.promise;\n }\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n\n get experimental_partialOutputStream(): AsyncIterableStream<\n InferStreamOutput<OUTPUT>\n > {\n return this.partialOutputStream;\n }\n\n get partialOutputStream(): AsyncIterableStream<InferStreamOutput<OUTPUT>> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>,\n InferStreamOutput<OUTPUT>\n >({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n },\n }),\n ),\n ) as AsyncIterableStream<InferStreamOutput<OUTPUT>>;\n }\n\n get elementStream(): AsyncIterableStream<InferElementOutput<OUTPUT>> {\n const transform = this.outputSpecification?.createElementStreamTransform();\n if (transform == null) {\n throw notSupportedYet(\n `element streams in ${this.outputSpecification?.name ?? 'text'} mode`,\n );\n }\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(transform),\n ) as AsyncIterableStream<InferElementOutput<OUTPUT>>;\n }\n\n get output(): Promise<InferGenerateOutput<OUTPUT>> {\n return this.finalStep.then(step => {\n if (this.outputSpecification == null) {\n throw notSupportedYet('structured output');\n }\n return this.outputSpecification.parseCompleteOutput(\n { text: step.text },\n {\n response: step.response,\n usage: step.usage,\n finishReason: step.finishReason,\n },\n );\n });\n }\n\n async consumeStream(): Promise<void> {\n const reader = this.fullStream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) return;\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n toUIMessageStream<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n }: UIMessageStreamOptions<UI_MESSAGE> = {}): AsyncIterableStream<\n InferUIMessageChunk<UI_MESSAGE>\n > {\n return createAsyncIterableStream(\n toUIMessageStreamHelper<TOOLS, UI_MESSAGE>({\n stream: this.stream,\n tools: this.tools,\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n }),\n ) as AsyncIterableStream<InferUIMessageChunk<UI_MESSAGE>>;\n }\n\n pipeUIMessageStreamToResponse(): never {\n throw notSupportedYet('pipeUIMessageStreamToResponse');\n }\n\n pipeTextStreamToResponse(): never {\n throw notSupportedYet('pipeTextStreamToResponse');\n }\n\n toUIMessageStreamResponse<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n ...init\n }: ResponseInit & {\n consumeSseStream?: (options: {\n stream: ReadableStream<string>;\n }) => PromiseLike<void> | void;\n } & UIMessageStreamOptions<UI_MESSAGE> = {}): Response {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream<UI_MESSAGE>({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n }),\n ...init,\n });\n }\n\n toTextStreamResponse(): never {\n throw notSupportedYet('toTextStreamResponse');\n }\n\n // ─── Helpers ────────────────────────────────────────────────────────\n\n private appendToCurrentStepContent(part: TextStreamPart<TOOLS>): void {\n switch (part.type) {\n case 'text-delta': {\n // Coalesce contiguous text-deltas with the same id into one text part.\n const last =\n this.currentStepContent[this.currentStepContent.length - 1];\n if (last && last.type === 'text') {\n (last as { text: string }).text += part.text;\n } else {\n this.currentStepContent.push({\n type: 'text',\n text: part.text,\n } as ContentPart<TOOLS>);\n }\n return;\n }\n case 'tool-call':\n case 'tool-approval-request':\n case 'tool-approval-response':\n case 'tool-result':\n case 'tool-error':\n this.currentStepContent.push({\n ...(part as object),\n } as ContentPart<TOOLS>);\n return;\n default:\n // text-start/end, reasoning-*, raw, error, finish-step, finish are\n // not directly stored as ContentParts. (Reasoning content parts\n // would belong here; we omit them for v0.)\n return;\n }\n }\n}\n\nfunction createOutputTransformStream<\n TOOLS extends ToolSet,\n OUTPUT extends Output,\n>(\n output: OUTPUT,\n): TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n> {\n let firstTextChunkId: string | undefined;\n let text = '';\n let textChunk = '';\n let textProviderMetadata: ProviderMetadata | undefined;\n let lastPublishedValue = '';\n\n const publishTextChunk = (options: {\n controller: TransformStreamDefaultController<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n >;\n partialOutput?: InferStreamOutput<OUTPUT>;\n }): void => {\n options.controller.enqueue({\n part: {\n type: 'text-delta',\n id: firstTextChunkId!,\n text: textChunk,\n providerMetadata: textProviderMetadata,\n },\n partialOutput: options.partialOutput,\n });\n textChunk = '';\n };\n\n return new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type === 'finish-step' && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n\n if (\n chunk.type !== 'text-delta' &&\n chunk.type !== 'text-start' &&\n chunk.type !== 'text-end'\n ) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-start') {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-end') {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n text += chunk.text;\n textChunk += chunk.text;\n textProviderMetadata = chunk.providerMetadata ?? textProviderMetadata;\n\n if (chunk.text.length === 0 && chunk.providerMetadata != null) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n const result = await output.parsePartialOutput({ text });\n if (result === undefined) {\n return;\n }\n\n const currentValue =\n typeof result.partial === 'string'\n ? result.partial\n : JSON.stringify(result.partial);\n if (currentValue !== lastPublishedValue) {\n publishTextChunk({\n controller,\n partialOutput: result.partial,\n });\n lastPublishedValue = currentValue;\n }\n },\n });\n}\n\nfunction createEmptyPerformance(): StepResult<ToolSet, Context>['performance'] {\n return {\n effectiveOutputTokensPerSecond: 0,\n outputTokensPerSecond: undefined,\n inputTokensPerSecond: undefined,\n effectiveTotalTokensPerSecond: 0,\n stepTimeMs: 0,\n responseTimeMs: 0,\n toolExecutionMs: {},\n timeToFirstOutputMs: undefined,\n };\n}\n\nfunction notSupportedYet(feature: string): Error {\n return new Error(\n `HarnessAgent: ${feature} is not implemented yet. Track the foundation review for follow-up.`,\n );\n}\n\n// Re-declare `AsyncIterableStream` locally to avoid pulling AI SDK's internal\n// async-iterable-stream helper. ReadableStreams already implement the\n// async-iterator contract in modern runtimes; we expose them under the same\n// nominal type AI SDK does.\ntype AsyncIterableStream<T> = ReadableStream<T> & AsyncIterable<T>;\n","import type { HarnessV1StreamPart } from '../../v1';\nimport type { TextStreamPart } from 'ai';\nimport { generateId, type ToolSet } from '@ai-sdk/provider-utils';\n\n/**\n * Translate one event from the harness wire format to the AI SDK\n * `TextStreamPart` shape consumed by `streamText` callers.\n *\n * Most variants are close to the identity function — V4 primitives\n * (`LanguageModelV4ToolCall`, `LanguageModelV4ToolResult`,\n * `LanguageModelV4ToolApprovalRequest`, `LanguageModelV4FinishReason`,\n * `LanguageModelV4Usage`) flow through unchanged. The adapters are:\n * - `harnessMetadata` → `providerMetadata`\n * - tool-call events are not translated here — validation against the\n * merged tool set is async and handled by `validateToolCall` in\n * `run-prompt.ts`\n * - a failed `tool-result` from a provider-executed tool becomes a\n * `tool-error` (see `isProviderExecuted`)\n * - the harness `raw` part is forwarded as the AI SDK `raw` part\n *\n * Returns an array of zero or more AI SDK parts. Most harness events project\n * to a single AI SDK part; `file-change` fans out into a synthetic\n * dynamic + provider-executed `tool-call` / `tool-result` pair so the event\n * is observable in `streamText`-style flows without a new stream-part type\n * needing first-class AI SDK support. Events with no consumer-facing AI SDK\n * equivalent (`stream-start`, `finish-step`, `finish` — consumed internally)\n * return an empty array.\n */\nexport function translateStreamPart<TOOLS extends ToolSet>(\n event: HarnessV1StreamPart,\n options: {\n /**\n * Whether the tool call that produced this event ran inside the harness\n * runtime. Host tools travel the same `tool-result` events and their\n * failures are echoed back with `isError`, so the event alone cannot say\n * who ran the tool — only the originating `tool-call` can, and correlating\n * the two is the caller's job. Omit the callback to treat every failure as\n * provider-executed.\n */\n isProviderExecuted?: (toolCallId: string) => boolean;\n } = {},\n): ReadonlyArray<TextStreamPart<TOOLS>> {\n switch (event.type) {\n case 'stream-start':\n // The agent emits its own `start` part as the first chunk of the\n // stream (see `HarnessStreamTextResult`); the harness-level start\n // signal is consumed internally.\n return [];\n\n case 'text-start':\n return [\n {\n type: 'text-start',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'text-delta':\n return [\n {\n type: 'text-delta',\n id: event.id,\n text: event.delta,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'text-end':\n return [\n {\n type: 'text-end',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'reasoning-start':\n return [\n {\n type: 'reasoning-start',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'reasoning-delta':\n return [\n {\n type: 'reasoning-delta',\n id: event.id,\n text: event.delta,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'reasoning-end':\n return [\n {\n type: 'reasoning-end',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'tool-call':\n // Tool-call validation is async (it parses input against the tool's\n // schema) and lives in `run-prompt.ts` where the merged tool set is in\n // scope. The translator returns nothing here — the run-prompt loop\n // handles the emission.\n return [];\n\n case 'tool-approval-request':\n return [];\n\n case 'tool-result':\n if (\n event.isError === true &&\n (options.isProviderExecuted?.(event.toolCallId) ?? true)\n ) {\n /*\n * `providerExecuted` decides whether the message survives:\n * `toUIMessageChunk` forwards the real error text only for\n * provider-executed errors, and replaces every other one with the\n * generic `onError` string.\n */\n return [\n {\n type: 'tool-error',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: undefined,\n error: event.result,\n providerExecuted: true,\n ...(event.dynamic !== undefined ? { dynamic: event.dynamic } : {}),\n ...(event.providerMetadata !== undefined\n ? { providerMetadata: event.providerMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n }\n\n return [\n {\n type: 'tool-result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: undefined,\n output: event.result,\n ...(event.preliminary !== undefined\n ? { preliminary: event.preliminary }\n : {}),\n ...(event.dynamic !== undefined ? { dynamic: event.dynamic } : {}),\n ...(event.providerMetadata !== undefined\n ? { providerMetadata: event.providerMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'file-change': {\n /*\n * `file-change` has no first-class AI SDK stream-part equivalent.\n * Project it as a synthetic dynamic + provider-executed tool-call /\n * tool-result pair under the reserved name `fileChange` so the event\n * is visible to `streamText`-style consumers. `dynamic: true` keeps it\n * out of typed-tool lookups; `providerExecuted: true` signals the\n * runtime already executed it and the host should not dispatch.\n */\n const toolCallId = `harness-file-change-${generateId()}`;\n const payload = { event: event.event, path: event.path };\n return [\n {\n type: 'tool-call',\n toolCallId,\n toolName: 'fileChange',\n input: payload,\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n {\n type: 'tool-result',\n toolCallId,\n toolName: 'fileChange',\n input: payload,\n output: payload,\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n }\n\n case 'compaction': {\n /*\n * Like `file-change`, compaction has no first-class AI SDK stream-part\n * equivalent. Project it as a synthetic dynamic + provider-executed\n * tool-call / tool-result pair under the reserved name `compaction`, so\n * the event is visible to `streamText`-style consumers. Compaction takes\n * no input, so the call input is empty; the metadata rides on the result\n * output. `dynamic: true` keeps it out of typed-tool lookups;\n * `providerExecuted: true` signals the runtime already performed it.\n */\n const toolCallId = `harness-compaction-${generateId()}`;\n const output = {\n trigger: event.trigger,\n summary: event.summary,\n ...(event.tokensBefore !== undefined\n ? { tokensBefore: event.tokensBefore }\n : {}),\n ...(event.tokensAfter !== undefined\n ? { tokensAfter: event.tokensAfter }\n : {}),\n };\n return [\n {\n type: 'tool-call',\n toolCallId,\n toolName: 'compaction',\n input: {},\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n {\n type: 'tool-result',\n toolCallId,\n toolName: 'compaction',\n input: {},\n output,\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n }\n\n case 'error':\n return [{ type: 'error', error: event.error } as TextStreamPart<TOOLS>];\n\n case 'raw':\n return [\n { type: 'raw', rawValue: event.rawValue } as TextStreamPart<TOOLS>,\n ];\n\n case 'finish-step':\n case 'finish':\n // finish-step / finish are consumed by the agent's result builder, not\n // forwarded directly. The agent emits AI SDK `finish-step` / `finish`\n // parts itself once it has assembled the surrounding step / response\n // metadata.\n return [];\n }\n}\n","import type { HarnessV1StreamPart } from '../../v1';\n\n/**\n * Remove the session working-directory prefix from path-bearing fields of a\n * stream event, returning a new event for display to consumers.\n *\n * Harness adapters run the agent in a per-session working directory that is a\n * subdirectory of the sandbox root, and the agent's tools use absolute paths so\n * they resolve against the root regardless of where the runtime process\n * operates. The absolute paths are correct but noisy in a UI, so this strips\n * the prefix for the consumer-facing projection only.\n *\n * Blanket prefix replacement (rather than rewriting known path fields) is used\n * deliberately: `tool-result` results are free-form text — command stdout, grep\n * output — where paths can appear anywhere and field-aware rewriting is\n * impossible. The prefix is long and contains the session id, so it is unique\n * enough that replacing every occurrence is safe.\n */\nexport function stripWorkDir(\n part: HarnessV1StreamPart,\n sessionWorkDir: string,\n): HarnessV1StreamPart {\n if (sessionWorkDir.length === 0) return part;\n\n switch (part.type) {\n case 'tool-call':\n return { ...part, input: stripString(part.input, sessionWorkDir) };\n case 'tool-result':\n return {\n ...part,\n result: stripDeep(part.result, sessionWorkDir) as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n };\n case 'file-change':\n return { ...part, path: stripString(part.path, sessionWorkDir) };\n default:\n return part;\n }\n}\n\n/**\n * Replace occurrences of the working directory in a string. A reference to the\n * directory followed by a separator becomes workspace-relative\n * (`/work/dir/src/a.ts` → `src/a.ts`); a bare reference to the directory itself\n * becomes `.`.\n */\nfunction stripString(value: string, workDir: string): string {\n return value.split(`${workDir}/`).join('').split(workDir).join('.');\n}\n\n/**\n * Recursively strip the working directory from every string nested in an\n * arbitrary JSON-like value. Non-string leaves are returned unchanged.\n */\nfunction stripDeep(value: unknown, workDir: string): unknown {\n if (typeof value === 'string') return stripString(value, workDir);\n if (Array.isArray(value)) return value.map(item => stripDeep(item, workDir));\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n out[key] = stripDeep(val, workDir);\n }\n return out;\n }\n return value;\n}\n","import { generateId, type ModelMessage } from '@ai-sdk/provider-utils';\nimport { createTelemetryDispatcher } from 'ai/internal';\nimport type { LanguageModelUsage, TelemetryOptions } from 'ai';\n\n/*\n * Drives AI SDK's pluggable `Telemetry` lifecycle from a harness turn.\n *\n * A harness turn is not a `streamText` call — it has no language model, prompt\n * standardization, or sampling settings — but the AI SDK telemetry contract is\n * shaped around `generateText`/`streamText` events, and `@ai-sdk/otel` (the\n * main integration) only produces spans when the full lifecycle fires. So we\n * map the turn onto that contract: turn = operation, each `finish-step` = a\n * step boundary, tool-calls = tool executions, `finish` = operation end. The\n * model-call-only event fields the harness has no value for (sampling params,\n * standardized prompt) are left `undefined` / cast; the fields the integrations\n * actually read (`callId`, `operationId`, `provider`, `modelId`, `messages`,\n * `toolCall`, `usage`, `finishReason`) carry real values.\n *\n * Telemetry is opt-in: the framework only drives it when `settings.telemetry`\n * is set (the dispatcher then also honours globally-registered integrations).\n */\n\ntype Dispatcher = ReturnType<typeof createTelemetryDispatcher>;\ntype EventArg<K extends keyof Dispatcher> = Dispatcher[K] extends\n | ((event: infer E) => unknown)\n | undefined\n ? E\n : never;\n\n/**\n * An output content part accumulated over a step — the model's assistant turn.\n * Shaped for the gen_ai output-message conventions `@ai-sdk/otel` reads.\n */\nexport type TurnContentPart =\n | { type: 'text'; text: string }\n | { type: 'reasoning'; text: string }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown };\n\nexport interface TurnTelemetry {\n /**\n * Begin the operation span. Called on `stream-start`, optionally with the\n * model the runtime resolved to (overriding the session's configured id).\n * Idempotent — the first call wins.\n */\n start(modelId?: string): Promise<void>;\n /** Open a step span lazily, before the first content of a step. */\n ensureStepOpen(): Promise<void>;\n /** Close the current step (on a harness `finish-step`). */\n stepFinish(info: {\n finishReason: unknown;\n usage: unknown;\n providerMetadata?: unknown;\n /** The model's output content for this step (text/reasoning/tool-calls). */\n content?: TurnContentPart[];\n }): Promise<void>;\n /** A tool execution began (on a `tool-call`). */\n toolStart(call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n }): Promise<void>;\n /** Execute a host tool through each telemetry integration's context wrapper. */\n executeTool<T>(input: {\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): Promise<T>;\n /**\n * A tool execution completed (on its `tool-result` or after host execution).\n * Idempotent per `toolCallId` — the first caller wins, so provider-executed\n * and host-executed paths can both call it without double-counting.\n */\n toolEnd(\n toolCallId: string,\n output: { ok: true; output: unknown } | { ok: false; error: unknown },\n ): Promise<void>;\n /** The turn ended (on a harness `finish`). */\n end(info: { finishReason: unknown; usage: unknown }): Promise<void>;\n /** The turn failed. */\n error(err: unknown): Promise<void>;\n}\n\nconst NOOP: TurnTelemetry = {\n async start() {},\n async ensureStepOpen() {},\n async stepFinish() {},\n async toolStart() {},\n async executeTool({ execute }) {\n return await execute();\n },\n async toolEnd() {},\n async end() {},\n async error() {},\n};\n\nfunction normalizeFinishReason(finishReason: unknown): unknown {\n if (\n finishReason != null &&\n typeof finishReason === 'object' &&\n 'unified' in finishReason\n ) {\n return (finishReason as { unified: unknown }).unified;\n }\n\n return finishReason;\n}\n\nfunction addTokenCounts(\n tokenCount1: number | undefined,\n tokenCount2: number | undefined,\n): number | undefined {\n return tokenCount1 == null && tokenCount2 == null\n ? undefined\n : (tokenCount1 ?? 0) + (tokenCount2 ?? 0);\n}\n\nfunction normalizeUsage(usage: unknown): LanguageModelUsage | unknown {\n if (\n usage == null ||\n typeof usage !== 'object' ||\n !('inputTokens' in usage) ||\n !('outputTokens' in usage)\n ) {\n return usage;\n }\n\n const inputTokens = (usage as { inputTokens: unknown }).inputTokens;\n const outputTokens = (usage as { outputTokens: unknown }).outputTokens;\n\n if (\n inputTokens == null ||\n typeof inputTokens !== 'object' ||\n outputTokens == null ||\n typeof outputTokens !== 'object'\n ) {\n return usage;\n }\n\n const input = inputTokens as Record<string, number | undefined>;\n const output = outputTokens as Record<string, number | undefined>;\n\n return {\n inputTokens: input.total,\n inputTokenDetails: {\n noCacheTokens: input.noCache,\n cacheReadTokens: input.cacheRead,\n cacheWriteTokens: input.cacheWrite,\n },\n outputTokens: output.total,\n outputTokenDetails: {\n textTokens: output.text,\n reasoningTokens: output.reasoning,\n },\n totalTokens: addTokenCounts(input.total, output.total),\n raw: (usage as { raw?: LanguageModelUsage['raw'] }).raw,\n };\n}\n\nexport function createTurnTelemetry(opts: {\n telemetry: TelemetryOptions | undefined;\n harnessId: string;\n modelId: string | undefined;\n instructions: string | undefined;\n promptText: string;\n runtimeContext: unknown;\n}): TurnTelemetry {\n // Opt-in: with no telemetry settings we do no work and construct no events.\n if (opts.telemetry == null) return NOOP;\n\n const dispatcher = createTelemetryDispatcher({ telemetry: opts.telemetry });\n\n const callId = generateId();\n const provider = opts.harnessId;\n // The configured session model; `start(modelId)` may override it with the\n // model the runtime actually resolved to.\n let modelId = opts.modelId ?? '';\n const runtimeContext = opts.runtimeContext;\n const inputMessages: ModelMessage[] = [\n { role: 'user', content: opts.promptText },\n ];\n\n let started = false;\n let stepOpen = false;\n let stepNumber = 0;\n let ended = false;\n let finalStepText = '';\n let finalStepReasoning: Array<{ text: string }> = [];\n let finalStepProviderMetadata: unknown;\n let outputToolCalls: Array<{\n type: 'tool-call';\n toolCallId: string;\n toolName: string;\n input: unknown;\n }> = [];\n /** Tool calls started in the current turn and not yet ended. */\n const openTools = new Map<\n string,\n { toolCallId: string; toolName: string; input: unknown }\n >();\n\n const cast = <K extends keyof Dispatcher>(event: unknown): EventArg<K> =>\n event as EventArg<K>;\n\n // onStart — open the operation (root) span. Deferred until `start()` so the\n // runtime-resolved model can be attached to the operation span + trace label.\n const fireStart = async (): Promise<void> => {\n if (started) return;\n started = true;\n await dispatcher.onStart?.(\n cast<'onStart'>({\n callId,\n operationId: 'ai.harness',\n provider,\n modelId,\n tools: undefined,\n toolChoice: undefined,\n activeTools: undefined,\n maxRetries: 0,\n timeout: undefined,\n headers: undefined,\n providerOptions: undefined,\n output: undefined,\n toolsContext: undefined,\n runtimeContext,\n instructions: opts.instructions,\n messages: inputMessages,\n }),\n );\n };\n\n const start = async (overrideModelId?: string): Promise<void> => {\n if (started) return;\n if (overrideModelId) modelId = overrideModelId;\n await fireStart();\n };\n\n const ensureStepOpen = async (): Promise<void> => {\n if (!started) await fireStart();\n if (stepOpen || ended) return;\n stepOpen = true;\n await dispatcher.onStepStart?.(\n cast<'onStepStart'>({\n callId,\n provider,\n modelId,\n stepNumber,\n tools: undefined,\n toolChoice: undefined,\n activeTools: undefined,\n steps: new Array(stepNumber),\n providerOptions: undefined,\n output: undefined,\n runtimeContext,\n messages: inputMessages,\n }),\n );\n // Open the inference (language-model call) span — the gen_ai home for the\n // step's input and (on end) output messages.\n await dispatcher.onLanguageModelCallStart?.(\n cast<'onLanguageModelCallStart'>({\n callId,\n provider,\n modelId,\n messages: inputMessages,\n tools: undefined,\n }),\n );\n };\n\n /** Close the inference span with the step's output content. */\n const inferenceEnd = async (info: {\n finishReason: unknown;\n usage: unknown;\n content: TurnContentPart[];\n providerMetadata?: unknown;\n }): Promise<void> => {\n const finishReason = normalizeFinishReason(info.finishReason);\n const usage = normalizeUsage(info.usage);\n\n await dispatcher.onLanguageModelCallEnd?.(\n cast<'onLanguageModelCallEnd'>({\n callId,\n finishReason,\n responseId: callId,\n usage,\n content: info.content,\n ...(info.providerMetadata != null\n ? { providerMetadata: info.providerMetadata }\n : {}),\n performance: {\n responseTimeMs: undefined,\n timeToFirstOutputMs: undefined,\n timeBetweenOutputChunksMs: undefined,\n },\n }),\n );\n };\n\n const recordOutputContent = (content: TurnContentPart[]): void => {\n finalStepText = '';\n finalStepReasoning = [];\n\n for (const part of content) {\n if (part.type === 'text') {\n finalStepText += part.text;\n } else if (part.type === 'reasoning') {\n finalStepReasoning.push({ text: part.text });\n } else if (part.type === 'tool-call') {\n outputToolCalls.push(part);\n }\n }\n };\n\n const closeOpenTools = async (): Promise<void> => {\n for (const call of openTools.values()) {\n await dispatcher.onToolExecutionEnd?.(\n cast<'onToolExecutionEnd'>({\n callId,\n toolExecutionMs: 0,\n messages: [],\n toolCall: {\n type: 'tool-call',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n dynamic: true,\n },\n toolContext: undefined,\n toolOutput: { type: 'error', error: new Error('tool span unclosed') },\n }),\n );\n }\n openTools.clear();\n };\n\n return {\n start,\n ensureStepOpen,\n\n async stepFinish(info) {\n if (!stepOpen) return;\n const content = info.content ?? [];\n const finishReason = normalizeFinishReason(info.finishReason);\n const usage = normalizeUsage(info.usage);\n recordOutputContent(content);\n finalStepProviderMetadata = info.providerMetadata;\n await closeOpenTools();\n await inferenceEnd({\n finishReason,\n usage,\n content,\n providerMetadata: info.providerMetadata,\n });\n await dispatcher.onStepEnd?.(\n cast<'onStepEnd'>({\n callId,\n stepNumber,\n finishReason,\n usage,\n providerMetadata: info.providerMetadata,\n content,\n response: {\n id: callId,\n modelId,\n timestamp: new Date(0),\n messages: [],\n },\n }),\n );\n stepOpen = false;\n stepNumber += 1;\n },\n\n async toolStart(call) {\n await ensureStepOpen();\n if (openTools.has(call.toolCallId)) return;\n openTools.set(call.toolCallId, call);\n await dispatcher.onToolExecutionStart?.(\n cast<'onToolExecutionStart'>({\n callId,\n messages: [],\n toolCall: {\n type: 'tool-call',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n dynamic: true,\n },\n toolContext: undefined,\n }),\n );\n },\n\n async executeTool({ toolCallId, execute }) {\n if (dispatcher.executeTool == null) return await execute();\n return await dispatcher.executeTool({ callId, toolCallId, execute });\n },\n\n async toolEnd(toolCallId, output) {\n const call = openTools.get(toolCallId);\n const normalizedOutput = output.ok\n ? { type: 'tool-result' as const, output: output.output }\n : { type: 'error' as const, error: output.error };\n if (call == null) return;\n openTools.delete(toolCallId);\n await dispatcher.onToolExecutionEnd?.(\n cast<'onToolExecutionEnd'>({\n callId,\n toolExecutionMs: 0,\n messages: [],\n toolCall: {\n type: 'tool-call',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n dynamic: true,\n },\n toolContext: undefined,\n toolOutput: normalizedOutput,\n }),\n );\n },\n\n async end(info) {\n if (ended) return;\n const finishReason = normalizeFinishReason(info.finishReason);\n const usage = normalizeUsage(info.usage);\n if (!started) await fireStart();\n if (stepOpen) {\n await closeOpenTools();\n await inferenceEnd({\n finishReason,\n usage,\n content: [],\n });\n await dispatcher.onStepEnd?.(\n cast<'onStepEnd'>({\n callId,\n stepNumber,\n finishReason,\n usage,\n providerMetadata: undefined,\n content: [],\n response: {\n id: callId,\n modelId,\n timestamp: new Date(0),\n messages: [],\n },\n }),\n );\n stepOpen = false;\n }\n ended = true;\n await dispatcher.onEnd?.(\n cast<'onEnd'>({\n callId,\n operationId: 'ai.harness',\n finishReason,\n usage,\n totalUsage: usage,\n content: [],\n text: finalStepText,\n finalStep: {\n reasoning: finalStepReasoning,\n providerMetadata: finalStepProviderMetadata,\n },\n toolCalls: outputToolCalls,\n files: [],\n steps: new Array(stepNumber),\n response: {\n id: callId,\n modelId,\n timestamp: new Date(0),\n messages: [],\n },\n runtimeContext,\n }),\n );\n },\n\n async error(err) {\n if (ended) return;\n if (!started) await fireStart();\n await closeOpenTools();\n ended = true;\n await dispatcher.onError?.(err);\n },\n };\n}\n","import type { ToolApprovalStatus } from 'ai';\nimport type { HarnessV1PermissionMode } from '../../v1';\nimport type { HarnessAgentToolApprovalConfiguration } from '../harness-agent-settings';\n\nexport const DEFAULT_PERMISSION_MODE: HarnessV1PermissionMode =\n 'allow-all' as const;\n\nexport function resolvePermissionMode(input: {\n permissionMode: HarnessV1PermissionMode | undefined;\n}): HarnessV1PermissionMode {\n return input.permissionMode ?? DEFAULT_PERMISSION_MODE;\n}\n\nexport function permissionModeNeedsBuiltinSupport(input: {\n permissionMode: HarnessV1PermissionMode;\n}): boolean {\n return input.permissionMode !== 'allow-all';\n}\n\nexport type CustomToolApprovalDecision =\n | { readonly type: 'allow'; readonly reason?: string }\n | { readonly type: 'deny'; readonly reason?: string }\n | { readonly type: 'request' };\n\nexport function resolveCustomToolApproval(input: {\n toolName: string;\n toolApproval: HarnessAgentToolApprovalConfiguration | undefined;\n}): CustomToolApprovalDecision {\n const status = normalizeToolApprovalStatus({\n status: input.toolApproval?.[input.toolName],\n });\n\n switch (status.type) {\n case 'not-applicable':\n case 'approved':\n return { type: 'allow', reason: status.reason };\n case 'denied':\n return { type: 'deny', reason: status.reason };\n case 'user-approval':\n return { type: 'request' };\n }\n}\n\nfunction normalizeToolApprovalStatus(input: {\n status: ToolApprovalStatus | undefined;\n}): Exclude<ToolApprovalStatus, string | undefined> {\n if (input.status === undefined) return { type: 'not-applicable' };\n if (typeof input.status === 'string') return { type: input.status };\n return input.status;\n}\n","import type { Experimental_SandboxProcess } from '@ai-sdk/provider-utils';\n\nconst DEFAULT_TAIL_LIMIT = 20;\n\ntype BridgeProcessStreamName = 'stdout' | 'stderr';\n\ntype SerializedError = {\n name?: string;\n message: string;\n stack?: string;\n};\n\nfunction isSerializedError(error: unknown): error is SerializedError {\n return (\n typeof error === 'object' &&\n error != null &&\n typeof (error as { message?: unknown }).message === 'string'\n );\n}\n\nfunction stringifyUnknown(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function formatBridgeError(error: unknown): string {\n if (error instanceof Error) {\n return error.stack ?? `${error.name}: ${error.message}`;\n }\n if (isSerializedError(error)) {\n return (\n error.stack ?? `${error.name ? `${error.name}: ` : ''}${error.message}`\n );\n }\n return stringifyUnknown(error);\n}\n\nfunction writeToStderr(line: string): void {\n try {\n process.stderr.write(line);\n } catch {}\n}\n\nexport function logBridgeError({\n harnessId,\n sessionId,\n context,\n error,\n write = writeToStderr,\n}: {\n harnessId: string;\n sessionId?: string;\n context?: string;\n error: unknown;\n write?: (line: string) => void;\n}): void {\n const prefix = `[harness:${harnessId}:error${\n sessionId ? ` session=${sessionId}` : ''\n }]`;\n const message = context\n ? `${context}: ${formatBridgeError(error)}`\n : formatBridgeError(error);\n for (const line of message.split('\\n')) {\n if (line.trim().length > 0) {\n write(`${prefix} ${line}\\n`);\n }\n }\n}\n\nexport function createBridgeErrorHandler({\n harnessId,\n sessionId,\n}: {\n harnessId: string;\n sessionId?: string;\n}): (event: { type: 'error'; error: unknown }) => void {\n return event => {\n logBridgeError({\n harnessId,\n sessionId,\n context: 'bridge emitted an error frame',\n error: event.error,\n });\n };\n}\n\nexport async function createBridgeStartupError({\n message,\n proc,\n stdoutTail,\n stderrTail,\n stderrDone,\n}: {\n message: string;\n proc: Experimental_SandboxProcess;\n stdoutTail: string[];\n stderrTail: string[];\n stderrDone?: Promise<void>;\n}): Promise<Error> {\n if (stderrDone) {\n await Promise.race([stderrDone, sleep(250)]).catch(() => {});\n }\n\n let exitStatus = '';\n try {\n const result = (await Promise.race([\n proc.wait(),\n sleep(250).then(() => undefined),\n ])) as { exitCode?: number } | undefined;\n if (result?.exitCode !== undefined) {\n exitStatus = ` Exit code: ${result.exitCode}.`;\n }\n } catch {}\n\n const details: string[] = [];\n if (stdoutTail.length > 0) {\n details.push(`stdout:\\n${stdoutTail.join('\\n')}`);\n }\n if (stderrTail.length > 0) {\n details.push(`stderr:\\n${stderrTail.join('\\n')}`);\n }\n\n return new Error(\n `${message}${exitStatus}${\n details.length > 0 ? `\\n\\n${details.join('\\n\\n')}` : ''\n }`,\n );\n}\n\nexport async function forwardBridgeProcessStream({\n stream,\n streamName,\n source = 'bridge',\n collectTail,\n tailLimit = DEFAULT_TAIL_LIMIT,\n}: {\n stream: ReadableStream<Uint8Array>;\n streamName: BridgeProcessStreamName;\n source?: string;\n collectTail?: string[];\n tailLimit?: number;\n}): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n const decoder = lineDecoder();\n while (true) {\n const { value, done } = await reader.read();\n const lines = done ? decoder.flush() : value ? decoder.push(value) : [];\n for (const line of lines) {\n recordTail({ lines: collectTail, line, limit: tailLimit });\n writeToStderr(`[harness:${source}:${streamName}] ${line}\\n`);\n }\n if (done) return;\n }\n } catch {}\n}\n\nexport async function drainBridgeProcessStream(\n stream: ReadableStream<Uint8Array>,\n): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done } = await reader.read();\n if (done) return;\n }\n } catch {}\n}\n\nfunction recordTail({\n lines,\n line,\n limit,\n}: {\n lines: string[] | undefined;\n line: string;\n limit: number;\n}): void {\n if (!lines) return;\n lines.push(line);\n while (lines.length > limit) lines.shift();\n}\n\nfunction lineDecoder() {\n let buffer = '';\n return {\n push(chunk: string): string[] {\n buffer += chunk;\n const lines: string[] = [];\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) !== -1) {\n const raw = buffer.slice(0, nl);\n buffer = buffer.slice(nl + 1);\n const line = raw.replace(/\\r$/, '').trim();\n if (line.length > 0) lines.push(line);\n }\n return lines;\n },\n flush(): string[] {\n const line = buffer.replace(/\\r$/, '').trim();\n buffer = '';\n return line.length > 0 ? [line] : [];\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import {\n safeParseJSON,\n safeValidateTypes,\n type FlexibleSchema,\n} from '@ai-sdk/provider-utils';\nimport type { WebSocket } from 'ws';\n\n/**\n * Diagnostic event surfaced by {@link SandboxChannel} during its connection\n * lifecycle. Silent unless a consumer wires `onDebug`. Reconnects are otherwise\n * invisible — the channel reconnects transparently and the in-flight turn keeps\n * streaming.\n */\nexport type SandboxChannelDebugEvent =\n | { event: 'reconnect-attempt'; attempt: number; lastSeenEventId: number }\n | { event: 'reconnected'; attempt: number; lastSeenEventId: number }\n | {\n event: 'reconnect-failed';\n attempts: number;\n lastSeenEventId: number;\n cause: unknown;\n };\n\nexport interface SandboxChannelReconnectOptions {\n /** Give up reconnecting after this many milliseconds. Default 30_000. */\n readonly maxElapsedMs?: number;\n /** First backoff delay. Default 50. */\n readonly initialDelayMs?: number;\n /** Backoff ceiling. Default 2_000. */\n readonly maxDelayMs?: number;\n}\n\nexport interface SandboxChannelOptions<TOut> {\n /**\n * Open a fresh WebSocket to the bridge and resolve once it is ready to carry\n * frames (i.e. after any adapter-specific handshake such as Claude Code's\n * `bridge-hello`). Called once by {@link SandboxChannel.open} and again on\n * every transient reconnect. Must reject if the connection cannot be\n * established.\n */\n connect: () => Promise<WebSocket>;\n\n /** Schema validating inbound (bridge → host) frames. */\n outboundSchema: FlexibleSchema<TOut>;\n\n reconnect?: SandboxChannelReconnectOptions;\n\n onDebug?: (event: SandboxChannelDebugEvent) => void;\n\n /**\n * Sink for forwarded bridge diagnostics — `sandbox-log` (captured\n * console lines) and `debug-event` (structured) frames. When set, these\n * frame types are routed here instead of the per-type listener dispatch, so\n * they never reach the consumer's stream. Typed to the diagnostic members of\n * `TOut`, so it is a no-op union for channels whose protocol has none.\n */\n onDiagnostic?: (\n event: Extract<TOut, { type: 'sandbox-log' | 'debug-event' }>,\n ) => void;\n\n onBridgeError?: (event: Extract<TOut, { type: 'error' }>) => void;\n\n /**\n * Seed the host-side cursor before the first connect. Pass the\n * `lastSeenEventId` persisted from a prior process so the bridge replays only\n * events past it when this channel opens with `{ resume: true }` — the\n * cross-process attach handshake. Defaults to `0` (fresh session).\n */\n initialLastSeenEventId?: number;\n}\n\ntype EventTypeOf<TOut extends { type: string }> = TOut['type'];\n\ntype Listener<TOut extends { type: string }, T extends EventTypeOf<TOut>> = (\n event: Extract<TOut, { type: T }>,\n) => void;\n\n/*\n * The agent and utilities entrypoints bundle this module separately. A global\n * symbol lets the agent recognize metadata attached by the channel's bundle\n * copy, while the non-enumerable property leaves protocol payloads unchanged.\n */\nconst sandboxChannelEventCheckpointSymbol = Symbol.for(\n 'vercel.ai.harness.sandboxChannelEventCheckpoint',\n);\n\ntype SandboxChannelEventCheckpoint = {\n pin: () => () => void;\n};\n\nexport function pinSandboxChannelEventCheckpoint(\n event: unknown,\n): (() => void) | undefined {\n if (event == null || typeof event !== 'object') return undefined;\n return (\n event as {\n [sandboxChannelEventCheckpointSymbol]?: SandboxChannelEventCheckpoint;\n }\n )[sandboxChannelEventCheckpointSymbol]?.pin();\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise(resolve => {\n const t = setTimeout(resolve, ms);\n (t as { unref?: () => void }).unref?.();\n });\n\n/**\n * Host-side typed wrapper around the bridge WebSocket connection.\n *\n * Buffers inbound messages until a listener for their type is registered, so\n * callers that subscribe asynchronously do not miss early frames. Inbound\n * dispatch is serialised through a promise chain so a `close` event that\n * arrives on the same microtask as the final `finish` message does not fire\n * close handlers until the message has been dispatched.\n *\n * Survives transient disconnects. The bridge keeps running and\n * accumulates events in an in-memory log keyed by a monotonic `seq`; on an\n * unexpected socket drop this channel re-invokes `connect`, re-wires the new\n * socket, and asks the bridge to replay everything past `lastSeenEventId`. The\n * in-flight turn never observes the blip — `onClose` fires only after a\n * host-initiated close or once the reconnect budget is exhausted.\n */\nexport class SandboxChannel<\n TOut extends { type: string },\n TIn extends { type: string } = { type: string },\n> {\n private readonly listeners = new Map<\n EventTypeOf<TOut>,\n Set<Listener<TOut, EventTypeOf<TOut>>>\n >();\n private readonly buffered = new Map<EventTypeOf<TOut>, TOut[]>();\n private readonly onCloseHandlers = new Set<\n (code: number, reason: string) => void\n >();\n\n private readonly connectThunk: () => Promise<WebSocket>;\n private readonly outboundSchema: FlexibleSchema<TOut>;\n private readonly onDebug:\n | ((event: SandboxChannelDebugEvent) => void)\n | undefined;\n private readonly onDiagnostic:\n | ((event: Extract<TOut, { type: 'sandbox-log' | 'debug-event' }>) => void)\n | undefined;\n private readonly onBridgeError:\n | ((event: Extract<TOut, { type: 'error' }>) => void)\n | undefined;\n private readonly maxElapsedMs: number;\n private readonly initialDelayMs: number;\n private readonly maxDelayMs: number;\n\n private ws: WebSocket | undefined;\n private connected = false;\n /** Host has begun teardown; suppresses reconnect so a bridge-side close finalises. */\n private closing = false;\n /**\n * Host has gracefully suspended (slice boundary). Inbound frames are ignored\n * from this point so the cursor stops advancing exactly at the last delivered\n * event — the bridge keeps the turn running and the not-yet-delivered tail is\n * replayed to the next process on `resume`.\n */\n private suspended = false;\n private pinnedSuspensionCursor:\n | { eventId: number; token: object }\n | undefined;\n /** Channel is fully torn down; `send` throws and `onClose` has fired. */\n private terminal = false;\n private _lastSeenEventId = 0;\n private readonly pendingSends: string[] = [];\n private dispatchChain: Promise<void> = Promise.resolve();\n\n constructor(options: SandboxChannelOptions<TOut>) {\n this.connectThunk = options.connect;\n this.outboundSchema = options.outboundSchema;\n this.onDebug = options.onDebug;\n this.onDiagnostic = options.onDiagnostic;\n this.onBridgeError = options.onBridgeError;\n this.maxElapsedMs = options.reconnect?.maxElapsedMs ?? 30_000;\n this.initialDelayMs = options.reconnect?.initialDelayMs ?? 50;\n this.maxDelayMs = options.reconnect?.maxDelayMs ?? 2_000;\n this._lastSeenEventId = options.initialLastSeenEventId ?? 0;\n }\n\n /**\n * Highest bridge event `seq` this channel has observed. Persist it (e.g. via\n * the adapter's resume handle) so a future process can seed\n * {@link SandboxChannelOptions.initialLastSeenEventId} and attach.\n */\n get lastSeenEventId(): number {\n return this._lastSeenEventId;\n }\n\n /**\n * Establish the initial connection. A single attempt — startup failures\n * reject so the caller can fail `doStart` cleanly. Reconnect retries apply\n * only to drops after a successful open.\n *\n * Pass `{ resume: true }` to attach to a bridge that is already mid-session:\n * after the socket opens, the channel sends `{ type: 'resume', lastSeenEventId }`\n * so the bridge replays everything past the seeded cursor. This is the\n * cross-process attach handshake — identical to what a transient reconnect\n * does, but triggered by the initial open from a new process.\n */\n async open(opts?: { resume?: boolean }): Promise<void> {\n if (this.terminal) {\n throw new Error('SandboxChannel: cannot open a closed channel.');\n }\n const ws = await this.connectThunk();\n this.wire(ws);\n this.ws = ws;\n this.connected = true;\n if (opts?.resume) {\n this.rawSend(\n JSON.stringify({\n type: 'resume',\n lastSeenEventId: this._lastSeenEventId,\n }),\n );\n }\n }\n\n on<T extends EventTypeOf<TOut>>(\n type: T,\n listener: Listener<TOut, T>,\n ): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n\n const buffered = this.buffered.get(type);\n if (buffered) {\n this.buffered.delete(type);\n for (const event of buffered) {\n listener(event as Extract<TOut, { type: T }>);\n }\n }\n\n return () => {\n set!.delete(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n };\n }\n\n onClose(handler: (code: number, reason: string) => void): void {\n this.onCloseHandlers.add(handler);\n }\n\n send(message: TIn): void {\n if (this.terminal) {\n throw new Error(\n `SandboxChannel: cannot send ${message.type} — channel is closed.`,\n );\n }\n this.rawSend(JSON.stringify(message));\n }\n\n /**\n * Mark that the host is tearing the session down. The next socket close is\n * then treated as terminal rather than triggering a reconnect. Call before\n * sending a `stop` / `destroy` message whose completion closes the bridge\n * socket.\n */\n beginClose(): void {\n this.closing = true;\n }\n\n close(): void {\n if (this.terminal) return;\n this.closing = true;\n try {\n this.ws?.close();\n } catch {\n // best-effort\n }\n this.enqueue(() => this.finalizeClose(1000, 'closed'));\n }\n\n /**\n * Gracefully suspend at a slice boundary: stop processing inbound frames\n * (so the cursor freezes at the last delivered event), drain any frames\n * already queued for dispatch, then close the socket and finalise with the\n * close reason `'suspended'`. Resolves with the final `lastSeenEventId`.\n *\n * The bridge keeps the in-flight turn running (a host socket close never\n * aborts it) and accumulates events past the cursor for the next process to\n * `resume`. Unlike {@link close}, the consumer's active turn is wound down\n * cleanly — adapters distinguish a suspend from an unexpected drop via the\n * `'suspended'` close reason and resolve `done` successfully. When an event\n * checkpoint is pinned, the returned cursor points to that event so any\n * already-dispatched tail is replayed by the next process.\n */\n suspend(): Promise<number> {\n return new Promise<number>(resolve => {\n const pinnedSuspensionCursor = this.pinnedSuspensionCursor?.eventId;\n if (this.terminal) {\n resolve(pinnedSuspensionCursor ?? this._lastSeenEventId);\n return;\n }\n // Stop counting/dispatching further inbound frames immediately, and\n // suppress reconnect so the socket close finalises.\n this.suspended = true;\n this.closing = true;\n this.onClose(() =>\n resolve(pinnedSuspensionCursor ?? this._lastSeenEventId),\n );\n // Queue the close behind any already-dispatched frames so everything\n // delivered to the consumer is reflected in the final cursor.\n this.enqueue(() => {\n try {\n this.ws?.close();\n } catch {\n // best-effort\n }\n this.finalizeClose(1000, 'suspended');\n });\n });\n }\n\n isClosed(): boolean {\n return this.terminal;\n }\n\n // ─── internals ──────────────────────────────────────────────────────\n\n private wire(ws: WebSocket): void {\n let dropped = false;\n const onDrop = (code: number, reason: string) => {\n if (dropped) return;\n dropped = true;\n if (ws !== this.ws) return;\n this.connected = false;\n if (this.closing) {\n this.enqueue(() => this.finalizeClose(code, reason));\n } else {\n this.enqueue(() => this.reconnectLoop());\n }\n };\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n // Once suspended, ignore further frames so the cursor freezes exactly at\n // the last delivered event (the bridge replays the rest to the next slice).\n if (this.suspended) return;\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n this.enqueue(() => this.handleIncoming(text));\n });\n ws.on('close', (code: number, reason: Buffer) =>\n onDrop(code, reason?.toString?.('utf8') ?? ''),\n );\n ws.on('error', () => onDrop(1006, 'socket error'));\n }\n\n private async reconnectLoop(): Promise<void> {\n if (this.terminal || this.closing) return;\n const start = Date.now();\n let attempt = 0;\n let delay = this.initialDelayMs;\n while (!this.terminal && !this.closing) {\n attempt++;\n this.onDebug?.({\n event: 'reconnect-attempt',\n attempt,\n lastSeenEventId: this._lastSeenEventId,\n });\n try {\n const ws = await this.connectThunk();\n if (this.terminal || this.closing) {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n return;\n }\n this.wire(ws);\n this.ws = ws;\n this.connected = true;\n // Ask the bridge to replay everything we have not seen, then flush any\n // host → bridge frames produced while we were disconnected.\n this.rawSend(\n JSON.stringify({\n type: 'resume',\n lastSeenEventId: this._lastSeenEventId,\n }),\n );\n this.flushPending();\n this.onDebug?.({\n event: 'reconnected',\n attempt,\n lastSeenEventId: this._lastSeenEventId,\n });\n return;\n } catch (cause) {\n if (Date.now() - start >= this.maxElapsedMs) {\n this.finalizeClose(1006, 'reconnect failed');\n this.onDebug?.({\n event: 'reconnect-failed',\n attempts: attempt,\n lastSeenEventId: this._lastSeenEventId,\n cause,\n });\n return;\n }\n await sleep(delay);\n delay = Math.min(delay * 1.5, this.maxDelayMs);\n }\n }\n }\n\n private rawSend(text: string): void {\n if (this.connected && this.ws) {\n this.ws.send(text);\n } else {\n this.pendingSends.push(text);\n }\n }\n\n private flushPending(): void {\n if (!this.connected || !this.ws) return;\n const queued = this.pendingSends.splice(0);\n for (const text of queued) this.ws.send(text);\n }\n\n private enqueue(work: () => void | Promise<void>): void {\n this.dispatchChain = this.dispatchChain.then(work);\n }\n\n private async handleIncoming(text: string): Promise<void> {\n const raw = await safeParseJSON({ text });\n let seq: number | undefined;\n if (\n raw.success &&\n raw.value != null &&\n typeof raw.value === 'object' &&\n typeof (raw.value as { seq?: unknown }).seq === 'number'\n ) {\n seq = (raw.value as { seq: number }).seq;\n }\n\n const validated = await safeValidateTypes({\n value: raw.success ? raw.value : undefined,\n schema: this.outboundSchema,\n });\n if (validated.success) {\n if (seq !== undefined) {\n this.attachEventCheckpoint({ event: validated.value, eventId: seq });\n }\n this.dispatch(validated.value);\n } else {\n this.dispatch({\n type: 'error',\n error: validated.error,\n } as unknown as TOut);\n }\n\n if (seq !== undefined && seq > this._lastSeenEventId) {\n this._lastSeenEventId = seq;\n }\n }\n\n private dispatch(message: TOut): void {\n // Diagnostics are routed to their own sink and never enter the\n // per-type listener/buffer path, so they stay off the consumer stream.\n if (message.type === 'sandbox-log' || message.type === 'debug-event') {\n this.onDiagnostic?.(\n message as Extract<TOut, { type: 'sandbox-log' | 'debug-event' }>,\n );\n return;\n }\n if (message.type === 'error') {\n this.onBridgeError?.(message as Extract<TOut, { type: 'error' }>);\n }\n const type = message.type as EventTypeOf<TOut>;\n const set = this.listeners.get(type);\n if (!set || set.size === 0) {\n let bucket = this.buffered.get(type);\n if (!bucket) {\n bucket = [];\n this.buffered.set(type, bucket);\n }\n bucket.push(message);\n return;\n }\n for (const listener of set) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n\n private attachEventCheckpoint(options: {\n event: TOut;\n eventId: number;\n }): void {\n if (!Object.isExtensible(options.event)) return;\n Object.defineProperty(options.event, sandboxChannelEventCheckpointSymbol, {\n value: {\n pin: () => {\n const token = {};\n this.pinnedSuspensionCursor = { eventId: options.eventId, token };\n return () => {\n if (this.pinnedSuspensionCursor?.token === token) {\n this.pinnedSuspensionCursor = undefined;\n }\n };\n },\n } satisfies SandboxChannelEventCheckpoint,\n });\n }\n\n private finalizeClose(code: number, reason: string): void {\n if (this.terminal) return;\n this.terminal = true;\n this.connected = false;\n for (const h of this.onCloseHandlers) h(code, reason);\n }\n}\n","import type { Context, ToolSet } from '@ai-sdk/provider-utils';\nimport type {\n OutputInterface as Output,\n StopCondition,\n StreamTextResult,\n TelemetryOptions,\n} from 'ai';\nimport type { HarnessAgentToolApprovalConfiguration } from './harness-agent-settings';\nimport type {\n HarnessV1BuiltinToolFiltering,\n HarnessV1NetworkSandboxSession,\n HarnessV1ResponseFormat,\n} from '../v1';\nimport type {\n HarnessAgentAdapter,\n HarnessAgentAdapterSession,\n HarnessAgentContinueTurnState,\n HarnessAgentPendingToolApproval,\n HarnessAgentPendingToolResult,\n HarnessAgentPrompt,\n HarnessAgentResumeSessionState,\n HarnessAgentToolSpec,\n} from './harness-agent-types';\nimport type { HarnessAgentToolApprovalContinuation } from './harness-agent-tool-approval-continuation';\nimport type { HarnessAgentToolResultContinuation } from './harness-agent-tool-result-continuation';\nimport { validateLifecycleStateData } from './internal/lifecycle-state-validation';\nimport { runPrompt } from './internal/run-prompt';\n\ntype HarnessAgentTurnResult<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> = {\n result: StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n done: Promise<void>;\n};\n\ntype HarnessAgentSessionState = 'active' | 'detached' | 'stopped' | 'destroyed';\n\ntype HarnessAgentTurnState =\n | 'idle'\n | 'running'\n | 'awaiting-approval'\n | 'awaiting-tool-result'\n | 'suspended';\n\n/**\n * Live harness session held by the caller.\n *\n * Created by {@link import('./harness-agent').HarnessAgent.createSession}.\n * Owns the underlying adapter session and the network sandbox session.\n *\n * Pass the instance back to `agent.generate` / `agent.stream` on every\n * call; end the local handle with `detach()`, `stop()`, or `destroy()`.\n *\n * After any lifecycle method has resolved, the session is unusable — any\n * subsequent `generate`/`stream` call against it throws.\n */\nexport class HarnessAgentSession {\n /**\n * Stable identifier the harness adapter saw in `doStart`. The same\n * string callers persist when they intend to resume the session in a\n * future process.\n */\n readonly sessionId: string;\n\n private readonly harness: HarnessAgentAdapter;\n private readonly sessionWorkDir: string;\n private readonly ownsSandboxLifecycle: boolean;\n private underlyingSession: HarnessAgentAdapterSession | undefined;\n private sandboxSession: HarnessV1NetworkSandboxSession | undefined;\n private readonly toolApproval:\n | HarnessAgentToolApprovalConfiguration\n | undefined;\n private readonly pendingToolApprovals = new Map<\n string,\n HarnessAgentPendingToolApproval\n >();\n private readonly pendingToolResults = new Map<\n string,\n HarnessAgentPendingToolResult\n >();\n private sessionState: HarnessAgentSessionState = 'active';\n private turnState: HarnessAgentTurnState;\n private turnSequence = 0;\n private activeTurnSequence = 0;\n private suspendedTurnState:\n | Promise<HarnessAgentContinueTurnState>\n | undefined;\n\n /**\n * Whether this session was created from `resumeFrom` or `continueFrom`.\n * Captured at construction so it survives lifecycle cleanup.\n */\n readonly isResume: boolean;\n\n constructor(options: {\n sessionId: string;\n harness: HarnessAgentAdapter;\n underlyingSession: HarnessAgentAdapterSession;\n sandboxSession: HarnessV1NetworkSandboxSession;\n ownsSandboxLifecycle?: boolean;\n sessionWorkDir: string;\n toolApproval: HarnessAgentToolApprovalConfiguration | undefined;\n pendingToolApprovals?: readonly HarnessAgentPendingToolApproval[];\n pendingToolResults?: readonly HarnessAgentPendingToolResult[];\n turnState?: HarnessAgentTurnState;\n }) {\n this.sessionId = options.sessionId;\n this.harness = options.harness;\n this.underlyingSession = options.underlyingSession;\n this.sandboxSession = options.sandboxSession;\n this.ownsSandboxLifecycle = options.ownsSandboxLifecycle ?? true;\n this.sessionWorkDir = options.sessionWorkDir;\n this.toolApproval = options.toolApproval;\n for (const approval of options.pendingToolApprovals ?? []) {\n this.pendingToolApprovals.set(approval.approvalId, approval);\n }\n for (const pendingResult of options.pendingToolResults ?? []) {\n this.pendingToolResults.set(pendingResult.toolCallId, pendingResult);\n }\n this.turnState =\n options.turnState ??\n (this.pendingToolApprovals.size > 0\n ? 'awaiting-approval'\n : this.pendingToolResults.size > 0\n ? 'awaiting-tool-result'\n : 'idle');\n this.isResume = options.underlyingSession.isResume;\n }\n\n /**\n * Active network sandbox session.\n *\n * @internal — accessed by session turn and lifecycle drivers.\n */\n getSandboxSession(): HarnessV1NetworkSandboxSession {\n if (this.sessionState !== 'active' || this.sandboxSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} has ended and cannot be reused.`,\n );\n }\n return this.sandboxSession;\n }\n\n /**\n * Working directory the agent runs in for this session. Used to strip the\n * prefix from absolute paths in stream events before they reach consumers.\n *\n * @internal — accessed by session turn drivers.\n */\n getSessionWorkDir(): string {\n return this.sessionWorkDir;\n }\n\n hasUnfinishedTurn(): boolean {\n return this.turnState !== 'idle';\n }\n\n promptTurn<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n >(options: {\n prompt: HarnessAgentPrompt;\n instructions: string | undefined;\n tools: TOOLS;\n activeTools: ToolSet;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n output: OUTPUT | undefined;\n telemetry: TelemetryOptions | undefined;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requirePromptableTurn();\n const sandboxSession = this.getSandboxSession();\n const turnId = this.startTrackedTurn();\n try {\n const turn = runPrompt<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n harness: this.harness,\n session,\n prompt: options.prompt,\n instructions: options.instructions,\n tools: options.tools,\n activeTools: options.activeTools,\n toolSpecs: options.toolSpecs,\n builtinToolFiltering: options.builtinToolFiltering,\n sandboxSession: sandboxSession.restricted(),\n sessionWorkDir: this.sessionWorkDir,\n runtimeContext: options.runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat: options.responseFormat,\n output: options.output,\n telemetry: options.telemetry,\n stopConditions: options.stopConditions,\n toolApproval: this.toolApproval,\n pendingToolApprovals: this.getPendingToolApprovals(),\n pendingToolResults: this.getPendingToolResults(),\n onPendingToolApproval: approval => {\n this.pendingToolApprovals.set(approval.approvalId, approval);\n this.markAwaitingApprovalIfActive();\n },\n onToolApprovalSettled: approvalId => {\n this.pendingToolApprovals.delete(approvalId);\n },\n onPendingToolResult: pendingResult => {\n this.pendingToolResults.set(pendingResult.toolCallId, pendingResult);\n this.markAwaitingToolResultIfActive();\n },\n onToolResultSettled: toolCallId => {\n this.pendingToolResults.delete(toolCallId);\n },\n onTurnFinished: () => {\n this.finishTrackedTurn({ turnId });\n },\n onTurnFailed: () => {\n this.finishTrackedTurn({ turnId });\n },\n isTurnSuspending: () =>\n this.activeTurnSequence === turnId && this.suspendedTurnState != null,\n onStopConditionMet: () =>\n this.captureStopConditionBoundary({ session, turnId }),\n });\n return turn;\n } catch (error) {\n this.finishTrackedTurn({ turnId });\n throw error;\n }\n }\n\n continueTurn<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n >(options: {\n instructions: string | undefined;\n tools: TOOLS;\n activeTools: ToolSet;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n output: OUTPUT | undefined;\n telemetry: TelemetryOptions | undefined;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApprovalContinuations?:\n | readonly HarnessAgentToolApprovalContinuation[]\n | undefined;\n toolResultContinuations?:\n | readonly HarnessAgentToolResultContinuation[]\n | undefined;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requireContinuableTurn();\n const sandboxSession = this.getSandboxSession();\n const turnId = this.startTrackedTurn();\n try {\n const turn = runPrompt<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n harness: this.harness,\n session,\n mode: 'continue',\n instructions: options.instructions,\n tools: options.tools,\n activeTools: options.activeTools,\n toolSpecs: options.toolSpecs,\n builtinToolFiltering: options.builtinToolFiltering,\n sandboxSession: sandboxSession.restricted(),\n sessionWorkDir: this.sessionWorkDir,\n runtimeContext: options.runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat: options.responseFormat,\n output: options.output,\n telemetry: options.telemetry,\n stopConditions: options.stopConditions,\n toolApproval: this.toolApproval,\n pendingToolApprovals: this.getPendingToolApprovals(),\n pendingToolResults: this.getPendingToolResults(),\n toolApprovalContinuations: options.toolApprovalContinuations,\n toolResultContinuations: options.toolResultContinuations,\n onPendingToolApproval: approval => {\n this.pendingToolApprovals.set(approval.approvalId, approval);\n this.markAwaitingApprovalIfActive();\n },\n onToolApprovalSettled: approvalId => {\n this.pendingToolApprovals.delete(approvalId);\n },\n onPendingToolResult: pendingResult => {\n this.pendingToolResults.set(pendingResult.toolCallId, pendingResult);\n this.markAwaitingToolResultIfActive();\n },\n onToolResultSettled: toolCallId => {\n this.pendingToolResults.delete(toolCallId);\n },\n onTurnFinished: () => {\n this.finishTrackedTurn({ turnId });\n },\n onTurnFailed: () => {\n this.finishTrackedTurn({ turnId });\n },\n isTurnSuspending: () =>\n this.activeTurnSequence === turnId && this.suspendedTurnState != null,\n onStopConditionMet: () =>\n this.captureStopConditionBoundary({ session, turnId }),\n });\n return turn;\n } catch (error) {\n this.finishTrackedTurn({ turnId });\n throw error;\n }\n }\n\n /**\n * Ask the underlying runtime to compact its context. The runtime performs\n * the compaction itself; when it completes, a `compaction` part appears on\n * the active (or next) turn's stream. Safe to call between turns for\n * runtimes whose compaction is session-scoped (e.g. Pi).\n *\n * Throws `HarnessCapabilityUnsupportedError` for harnesses that cannot\n * trigger compaction manually (e.g. Codex, which still auto-compacts under\n * the hood). Throws if the session has ended.\n */\n async compact(customInstructions?: string): Promise<void> {\n await this.requireReusableSession().doCompact(customInstructions);\n }\n\n /**\n * Park the session, returning a payload the caller can persist and later\n * pass to `agent.createSession({ sessionId, resumeFrom })` to reconnect.\n * The runtime and sandbox keep running; this local session handle becomes\n * unusable.\n */\n async detach(): Promise<HarnessAgentResumeSessionState> {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} is not active and cannot be detached.`,\n );\n }\n const session = this.underlyingSession;\n try {\n if (this.turnState !== 'idle') {\n return this.toResumeStateWithContinuation({\n continueFrom: await this.suspendCurrentTurn({ session }),\n });\n }\n const raw = await session.doDetach();\n const validated = await validateLifecycleStateData({\n harness: this.harness,\n state: raw,\n expectedType: 'resume-session',\n });\n return validated;\n } finally {\n this.endLocalHandle({ sessionState: 'detached' });\n }\n }\n\n /**\n * Persist enough state to resume later, then stop the runtime and any\n * harness-owned sandbox.\n * Returns the resume state for a future\n * `agent.createSession({ sessionId, resumeFrom })` call.\n */\n async stop(): Promise<HarnessAgentResumeSessionState> {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} is not active and cannot be stopped.`,\n );\n }\n const session = this.underlyingSession;\n const sandboxSession = this.getSandboxSession();\n try {\n if (this.turnState !== 'idle') {\n return this.toResumeStateWithContinuation({\n continueFrom: await this.suspendCurrentTurn({ session }),\n });\n }\n const raw = await session.doStop();\n const validated = await validateLifecycleStateData({\n harness: this.harness,\n state: raw,\n expectedType: 'resume-session',\n });\n return validated;\n } finally {\n this.endLocalHandle({ sessionState: 'stopped' });\n if (this.ownsSandboxLifecycle) {\n await Promise.resolve(sandboxSession.stop()).catch(() => {});\n }\n }\n }\n\n /**\n * Stop the runtime and discard resumability. A harness-owned sandbox is\n * destroyed when supported; otherwise it is stopped.\n */\n async destroy(): Promise<void> {\n if (this.sessionState !== 'active') return;\n const session = this.underlyingSession;\n const sandboxSession = this.getSandboxSession();\n this.endLocalHandle({ sessionState: 'destroyed' });\n if (session != null) {\n await Promise.resolve(session.doDestroy()).catch(() => {});\n }\n if (!this.ownsSandboxLifecycle) return;\n await Promise.resolve(\n sandboxSession.destroy?.() ?? sandboxSession.stop(),\n ).catch(() => {});\n }\n\n /**\n * Gracefully freeze the active turn at the slice boundary and return the\n * continuation payload, **leaving the sandbox/runtime running** so the next\n * process can continue. Resolves once the in-flight `stream()` /\n * `continueStream()` has cleanly wound down at a precise cursor (see\n * `doSuspendTurn`).\n *\n * After this call the session is detached. This in-process handle no\n * longer drives turns; a future slice creates a fresh session from the\n * returned state. The sandbox is **not** stopped because bridge-backed\n * adapters may still have a live bridge.\n */\n async suspendTurn(): Promise<HarnessAgentContinueTurnState> {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} is not active and cannot be suspended.`,\n );\n }\n if (this.turnState === 'idle') {\n throw new Error(\n `Harness session ${this.sessionId} has no unfinished turn to suspend.`,\n );\n }\n const session = this.underlyingSession;\n try {\n return await this.suspendCurrentTurn({ session });\n } finally {\n this.endLocalHandle({ sessionState: 'detached' });\n }\n }\n\n private getPendingToolApprovals(): readonly HarnessAgentPendingToolApproval[] {\n return Array.from(this.pendingToolApprovals.values());\n }\n\n private getPendingToolResults(): readonly HarnessAgentPendingToolResult[] {\n return Array.from(this.pendingToolResults.values());\n }\n\n private addPendingToolState(\n state: HarnessAgentContinueTurnState,\n ): HarnessAgentContinueTurnState {\n const pendingToolApprovals = this.getPendingToolApprovals();\n const pendingToolResults = this.getPendingToolResults();\n if (pendingToolApprovals.length === 0 && pendingToolResults.length === 0) {\n return {\n type: state.type,\n harnessId: state.harnessId,\n specificationVersion: state.specificationVersion,\n data: state.data,\n };\n }\n return {\n ...state,\n ...(pendingToolApprovals.length > 0 ? { pendingToolApprovals } : {}),\n ...(pendingToolResults.length > 0 ? { pendingToolResults } : {}),\n };\n }\n\n private async suspendCurrentTurn(options: {\n session: HarnessAgentAdapterSession;\n }): Promise<HarnessAgentContinueTurnState> {\n this.suspendedTurnState ??= (async () => {\n const raw = await options.session.doSuspendTurn();\n const validated = await validateLifecycleStateData({\n harness: this.harness,\n state: raw,\n expectedType: 'continue-turn',\n });\n return this.addPendingToolState(validated);\n })();\n const state = await this.suspendedTurnState;\n this.turnState = 'suspended';\n return state;\n }\n\n private async captureStopConditionBoundary(options: {\n session: HarnessAgentAdapterSession;\n turnId: number;\n }): Promise<void> {\n if (\n this.sessionState !== 'active' ||\n this.activeTurnSequence !== options.turnId\n ) {\n return;\n }\n await this.suspendCurrentTurn({ session: options.session });\n }\n\n private toResumeStateWithContinuation(options: {\n continueFrom: HarnessAgentContinueTurnState;\n }): HarnessAgentResumeSessionState {\n const { continueFrom } = options;\n return {\n type: 'resume-session',\n harnessId: continueFrom.harnessId,\n specificationVersion: continueFrom.specificationVersion,\n data: continueFrom.data,\n continueFrom,\n };\n }\n\n private requirePromptableTurn(): void {\n if (this.turnState === 'idle') return;\n if (this.turnState === 'running') {\n throw new Error(\n `Harness session ${this.sessionId} already has a turn in progress.`,\n );\n }\n throw new Error(\n `Harness session ${this.sessionId} has an unfinished turn and must be continued before accepting a new prompt.`,\n );\n }\n\n private requireContinuableTurn(): void {\n if (\n this.turnState === 'awaiting-approval' ||\n this.turnState === 'awaiting-tool-result' ||\n this.turnState === 'suspended'\n ) {\n return;\n }\n if (this.turnState === 'running') {\n throw new Error(\n `Harness session ${this.sessionId} already has a turn in progress.`,\n );\n }\n throw new Error(\n `Harness session ${this.sessionId} has no unfinished turn to continue.`,\n );\n }\n\n private markAwaitingApprovalIfActive(): void {\n if (this.sessionState === 'active') {\n this.turnState = 'awaiting-approval';\n }\n }\n\n private markAwaitingToolResultIfActive(): void {\n if (this.sessionState === 'active') {\n this.turnState = 'awaiting-tool-result';\n }\n }\n\n private startTrackedTurn(): number {\n const turnId = ++this.turnSequence;\n this.activeTurnSequence = turnId;\n this.suspendedTurnState = undefined;\n this.turnState = 'running';\n return turnId;\n }\n\n private finishTrackedTurn(options: { turnId: number }): void {\n if (this.sessionState !== 'active') return;\n if (this.activeTurnSequence !== options.turnId) return;\n this.pendingToolApprovals.clear();\n this.pendingToolResults.clear();\n this.suspendedTurnState = undefined;\n this.turnState = 'idle';\n }\n\n private endLocalHandle(options: {\n sessionState: Exclude<HarnessAgentSessionState, 'active'>;\n }): void {\n this.sessionState = options.sessionState;\n this.underlyingSession = undefined;\n this.sandboxSession = undefined;\n }\n\n private requireReusableSession(): HarnessAgentAdapterSession {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} has ended and cannot be reused.`,\n );\n }\n return this.underlyingSession;\n }\n}\n","import { HarnessError } from '../errors/harness-error';\nimport type {\n ModelMessage,\n ToolApprovalRequest,\n ToolApprovalResponse,\n} from '@ai-sdk/provider-utils';\n\nexport type HarnessAgentToolApprovalContinuation = {\n readonly approvalResponse: ToolApprovalResponse;\n readonly toolCall: {\n readonly type: 'tool-call';\n readonly toolCallId: string;\n readonly toolName: string;\n readonly input: unknown;\n readonly providerExecuted?: boolean;\n };\n};\n\n/**\n * Extract approval decisions that should continue a suspended harness turn.\n *\n * AI SDK clients send approval decisions as a trailing `role: \"tool\"` message\n * containing `tool-approval-response` parts. The response only carries the\n * approval id, so the harness has to recover the matching approval request\n * locally to find the original tool call before it can resume the paused turn.\n * Responses that already have a tool result are ignored, because those\n * approvals were already consumed by a prior continuation.\n */\nexport function collectHarnessAgentToolApprovalContinuations(input: {\n messages: readonly ModelMessage[];\n}): readonly HarnessAgentToolApprovalContinuation[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n const toolCallsByToolCallId = new Map<\n string,\n HarnessAgentToolApprovalContinuation['toolCall']\n >();\n const approvalRequestsByApprovalId = new Map<string, ToolApprovalRequest>();\n for (const message of input.messages) {\n if (message.role !== 'assistant' || typeof message.content === 'string') {\n continue;\n }\n for (const part of message.content) {\n if (part.type === 'tool-call') {\n toolCallsByToolCallId.set(part.toolCallId, {\n type: 'tool-call',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted !== undefined\n ? { providerExecuted: part.providerExecuted }\n : {}),\n });\n } else if (part.type === 'tool-approval-request') {\n approvalRequestsByApprovalId.set(part.approvalId, part);\n }\n }\n }\n\n const toolResultIds = new Set<string>();\n for (const part of lastMessage.content) {\n if (part.type === 'tool-result') {\n toolResultIds.add(part.toolCallId);\n }\n }\n\n const continuations: HarnessAgentToolApprovalContinuation[] = [];\n for (const part of lastMessage.content) {\n if (part.type !== 'tool-approval-response') continue;\n\n const approvalRequest = approvalRequestsByApprovalId.get(part.approvalId);\n if (approvalRequest == null) {\n throw new HarnessError({\n message: `Tool approval response '${part.approvalId}' does not match a prior tool approval request.`,\n });\n }\n if (toolResultIds.has(approvalRequest.toolCallId)) continue;\n\n const toolCall = toolCallsByToolCallId.get(approvalRequest.toolCallId);\n if (toolCall == null) {\n throw new HarnessError({\n message: `Tool approval request '${approvalRequest.approvalId}' references unknown tool call '${approvalRequest.toolCallId}'.`,\n });\n }\n\n continuations.push({\n approvalResponse: part,\n toolCall,\n });\n }\n\n return continuations;\n}\n","import type { ModelMessage, ToolResultOutput } from '@ai-sdk/provider-utils';\n\nexport type HarnessAgentToolResultContinuation = {\n readonly toolCallId: string;\n readonly output: unknown;\n readonly isError?: boolean;\n};\n\n/**\n * Extract client-provided tool results from the trailing tool message and\n * convert AI SDK model-output wrappers back into values a harness runtime can\n * return from its pending host-tool invocation.\n */\nexport function collectHarnessAgentToolResultContinuations(input: {\n messages: readonly ModelMessage[];\n}): readonly HarnessAgentToolResultContinuation[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n return lastMessage.content\n .filter(part => part.type === 'tool-result')\n .map(part =>\n toToolResultContinuation({\n toolCallId: part.toolCallId,\n output: part.output,\n }),\n );\n}\n\nfunction toToolResultContinuation(input: {\n toolCallId: string;\n output: ToolResultOutput;\n}): HarnessAgentToolResultContinuation {\n switch (input.output.type) {\n case 'text':\n case 'json':\n return {\n toolCallId: input.toolCallId,\n output: input.output.value,\n };\n case 'error-text':\n case 'error-json':\n return {\n toolCallId: input.toolCallId,\n output: input.output.value,\n isError: true,\n };\n case 'execution-denied':\n return {\n toolCallId: input.toolCallId,\n output: {\n type: input.output.type,\n reason: input.output.reason,\n },\n };\n case 'content':\n return {\n toolCallId: input.toolCallId,\n output: input.output,\n };\n }\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessV1Bootstrap } from '../../v1';\n\n/**\n * Version of the bootstrap recipe shape itself. Bump to force every existing\n * snapshot/marker to be invalidated regardless of recipe content.\n */\nexport const BOOTSTRAP_SCHEMA_VERSION = 1;\n\n/**\n * Deterministic 16-char hex identity derived from the recipe's content\n * (harnessId, bootstrapDir, file paths + contents, commands, schema version).\n * Two adapters with equivalent recipes produce the same identity; any\n * content change produces a different identity.\n *\n * Used by sandbox providers as part of the persistent sandbox name so\n * recipe changes automatically invalidate snapshots.\n */\nexport async function hashHarnessBootstrap(\n recipe: HarnessV1Bootstrap,\n): Promise<string> {\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n const pushString = (value: string) => {\n chunks.push(encoder.encode(value));\n chunks.push(encoder.encode('\\0'));\n };\n\n pushString(recipe.harnessId);\n pushString(recipe.bootstrapDir);\n\n const sortedFiles = [...recipe.files].sort((a, b) =>\n a.path.localeCompare(b.path),\n );\n for (const file of sortedFiles) {\n pushString(file.path);\n pushString(file.content);\n }\n\n pushString(JSON.stringify(recipe.commands));\n pushString(String(BOOTSTRAP_SCHEMA_VERSION));\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n const digest = await crypto.subtle.digest('SHA-256', buffer);\n const bytes = new Uint8Array(digest);\n let hex = '';\n for (let i = 0; i < 8; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n\n/**\n * Absolute path of the marker file the framework writes after a recipe runs\n * successfully. Presence of this path inside the sandbox indicates the recipe\n * with the matching `identity` has already been applied.\n */\nexport function bootstrapMarkerPath({\n recipe,\n identity,\n defaultWorkingDirectory,\n}: {\n recipe: HarnessV1Bootstrap;\n identity: string;\n defaultWorkingDirectory: string;\n}): string {\n return posix.join(\n resolveBootstrapPath({\n path: recipe.bootstrapDir,\n defaultWorkingDirectory,\n }),\n `.bootstrap-${identity}.ok`,\n );\n}\n\n/**\n * Apply a bootstrap recipe to a sandbox session idempotently. Reads the\n * marker file; if it exists, returns immediately. Otherwise creates the\n * bootstrap directory, writes the recipe's files, runs its commands\n * sequentially, and writes the marker on success.\n *\n * Safe to call multiple times. For sandboxes that already contain the\n * recipe (resumed from snapshot, reused across sessions, or applied by\n * an earlier process) this is a single fast read.\n */\nexport async function applyBootstrapRecipe({\n session,\n recipe,\n identity,\n defaultWorkingDirectory,\n abortSignal,\n}: {\n session: SandboxSession;\n recipe: HarnessV1Bootstrap;\n identity: string;\n defaultWorkingDirectory: string;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const markerPath = bootstrapMarkerPath({\n recipe,\n identity,\n defaultWorkingDirectory,\n });\n\n const existingMarker = await session.readTextFile({\n path: markerPath,\n abortSignal,\n });\n if (existingMarker !== null) {\n return;\n }\n\n const bootstrapDir = resolveBootstrapPath({\n path: recipe.bootstrapDir,\n defaultWorkingDirectory,\n });\n const mkdirResult = await session.run({\n command: 'mkdir -p \"$BOOTSTRAP_DIR\"',\n workingDirectory: defaultWorkingDirectory,\n env: { BOOTSTRAP_DIR: bootstrapDir },\n abortSignal,\n });\n if (mkdirResult.exitCode !== 0) {\n throw new Error(\n `Failed to create bootstrap directory for harness '${recipe.harnessId}' (exit ${mkdirResult.exitCode}): ${bootstrapDir}\\n${mkdirResult.stderr || mkdirResult.stdout}`,\n );\n }\n\n for (const file of recipe.files) {\n await session.writeTextFile({\n path: resolveBootstrapPath({\n path: file.path,\n defaultWorkingDirectory,\n }),\n content: file.content,\n abortSignal,\n });\n }\n\n for (const cmd of recipe.commands) {\n const result = await session.run({\n command: cmd.command,\n workingDirectory: bootstrapDir,\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Bootstrap command failed for harness '${recipe.harnessId}' (exit ${result.exitCode}): ${cmd.command}\\n${result.stderr || result.stdout}`,\n );\n }\n }\n\n await session.writeTextFile({\n path: markerPath,\n content: '',\n abortSignal,\n });\n}\n\nfunction resolveBootstrapPath({\n path,\n defaultWorkingDirectory,\n}: {\n path: string;\n defaultWorkingDirectory: string;\n}): string {\n return posix.isAbsolute(path)\n ? path\n : posix.resolve(defaultWorkingDirectory, path);\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessV1Bootstrap } from '../../v1';\nimport type { HarnessAgentSandboxConfig } from '../harness-agent-settings';\nimport { applyBootstrapRecipe, hashHarnessBootstrap } from './bootstrap-recipe';\n\nconst SANDBOX_BOOTSTRAP_IDENTITY_VERSION = 1;\n\ntype SandboxBootstrapSettings = Omit<HarnessAgentSandboxConfig, 'onSession'>;\n\nexport type SandboxBootstrapPlan = {\n readonly recipe?: HarnessV1Bootstrap;\n readonly recipeIdentity?: string;\n readonly identity?: string;\n readonly workDir?: string;\n readonly onFirstCreate?: (\n session: SandboxSession,\n opts: { abortSignal?: AbortSignal },\n ) => Promise<void>;\n};\n\nexport function validateSandboxBootstrapSettings(\n settings: SandboxBootstrapSettings,\n): void {\n if ((settings.onBootstrap == null) !== (settings.bootstrapHash == null)) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.onBootstrap` and `sandboxConfig.bootstrapHash` must be provided together.',\n );\n }\n\n if (settings.workDir != null) {\n normalizeSandboxWorkDir(settings.workDir);\n }\n}\n\nexport function normalizeSandboxWorkDir(workDir: string): string {\n if (workDir.length === 0) {\n throw new Error('HarnessAgent: `sandboxConfig.workDir` must not be empty.');\n }\n if (workDir.includes('\\0')) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.workDir` must not contain NUL.',\n );\n }\n if (workDir.includes('\\\\')) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.workDir` must use POSIX path separators.',\n );\n }\n if (posix.isAbsolute(workDir)) {\n throw new Error('HarnessAgent: `sandboxConfig.workDir` must be relative.');\n }\n\n const normalized = posix.normalize(workDir);\n if (\n normalized === '.' ||\n normalized === '..' ||\n normalized.startsWith('../')\n ) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.workDir` must stay inside the sandbox default working directory.',\n );\n }\n return normalized;\n}\n\nexport function resolveSessionWorkDir({\n defaultWorkingDirectory,\n harnessId,\n sessionId,\n workDir,\n}: {\n readonly defaultWorkingDirectory: string;\n readonly harnessId: string;\n readonly sessionId: string;\n readonly workDir?: string;\n}): string {\n return joinSandboxPath({\n base: defaultWorkingDirectory,\n path: workDir ?? `${harnessId}-${sessionId}`,\n });\n}\n\nexport async function createSandboxBootstrapPlan({\n recipe,\n settings,\n}: {\n readonly recipe?: HarnessV1Bootstrap;\n readonly settings: SandboxBootstrapSettings;\n}): Promise<SandboxBootstrapPlan> {\n const workDir =\n settings.workDir == null\n ? undefined\n : normalizeSandboxWorkDir(settings.workDir);\n const recipeIdentity =\n recipe == null ? undefined : await hashHarnessBootstrap(recipe);\n const hasCallerBootstrap = settings.onBootstrap != null;\n const needsCombinedIdentity =\n hasCallerBootstrap || (recipeIdentity != null && workDir != null);\n const identity =\n needsCombinedIdentity && (recipeIdentity != null || hasCallerBootstrap)\n ? await hashSandboxBootstrapIdentity({\n recipeIdentity,\n bootstrapHash: settings.bootstrapHash,\n workDir,\n })\n : recipeIdentity;\n\n return {\n ...(recipe != null ? { recipe } : {}),\n ...(recipeIdentity != null ? { recipeIdentity } : {}),\n ...(identity != null ? { identity } : {}),\n ...(workDir != null ? { workDir } : {}),\n ...(recipe != null || settings.onBootstrap != null\n ? {\n onFirstCreate: (session, opts) =>\n runSandboxBootstrap({\n session,\n recipe,\n recipeIdentity,\n workDir,\n onBootstrap: settings.onBootstrap,\n abortSignal: opts.abortSignal,\n }),\n }\n : {}),\n };\n}\n\nexport async function runSandboxBootstrap({\n session,\n recipe,\n recipeIdentity,\n workDir,\n onBootstrap,\n defaultWorkingDirectory,\n abortSignal,\n}: {\n readonly session: SandboxSession;\n readonly recipe?: HarnessV1Bootstrap;\n readonly recipeIdentity?: string;\n readonly workDir?: string;\n readonly onBootstrap?: SandboxBootstrapSettings['onBootstrap'];\n readonly defaultWorkingDirectory?: string;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n if (recipe == null && onBootstrap == null) return;\n\n const resolvedDefaultWorkingDirectory =\n defaultWorkingDirectory ??\n (await resolveDefaultWorkingDirectory({\n session,\n abortSignal,\n }));\n\n if (recipe != null && recipeIdentity != null) {\n await applyBootstrapRecipe({\n session,\n recipe,\n identity: recipeIdentity,\n defaultWorkingDirectory: resolvedDefaultWorkingDirectory,\n abortSignal,\n });\n }\n\n if (onBootstrap == null) return;\n\n const bootstrapWorkDir =\n workDir == null\n ? resolvedDefaultWorkingDirectory\n : joinSandboxPath({\n base: resolvedDefaultWorkingDirectory,\n path: workDir,\n });\n\n await ensureSandboxDirectory({\n session,\n workDir: bootstrapWorkDir,\n abortSignal,\n });\n await onBootstrap({ session, workDir: bootstrapWorkDir, abortSignal });\n}\n\nexport async function resolveDefaultWorkingDirectory({\n session,\n abortSignal,\n}: {\n readonly session: SandboxSession;\n readonly abortSignal?: AbortSignal;\n}): Promise<string> {\n const result = await session.run({\n command: 'pwd',\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to resolve sandbox default working directory (exit ${result.exitCode}): ${result.stderr || result.stdout}`,\n );\n }\n\n const cwd = result.stdout.trim();\n if (!posix.isAbsolute(cwd)) {\n throw new Error(\n `Failed to resolve sandbox default working directory: expected an absolute path, got ${JSON.stringify(cwd)}.`,\n );\n }\n return cwd === '/' ? cwd : cwd.replace(/\\/+$/, '');\n}\n\nexport async function ensureSandboxDirectory({\n session,\n workDir,\n abortSignal,\n}: {\n readonly session: SandboxSession;\n readonly workDir: string;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n const result = await session.run({\n command: 'mkdir -p \"$WORK_DIR\"',\n env: { WORK_DIR: workDir },\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to create sandbox work directory ${workDir} (exit ${result.exitCode}): ${result.stderr || result.stdout}`,\n );\n }\n}\n\nasync function hashSandboxBootstrapIdentity({\n recipeIdentity,\n bootstrapHash,\n workDir,\n}: {\n readonly recipeIdentity?: string;\n readonly bootstrapHash?: string;\n readonly workDir?: string;\n}): Promise<string> {\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n const pushString = (value: string) => {\n chunks.push(encoder.encode(value));\n chunks.push(encoder.encode('\\0'));\n };\n\n pushString(String(SANDBOX_BOOTSTRAP_IDENTITY_VERSION));\n pushString(recipeIdentity ?? '');\n pushString(bootstrapHash ?? '');\n pushString(workDir ?? '');\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n const digest = await crypto.subtle.digest('SHA-256', buffer);\n const bytes = new Uint8Array(digest);\n let hex = '';\n for (let i = 0; i < 8; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n\nfunction joinSandboxPath({\n base,\n path,\n}: {\n readonly base: string;\n readonly path: string;\n}): string {\n return posix.join(base, path);\n}\n","import { asArray } from '@ai-sdk/provider-utils';\nimport type { Telemetry } from 'ai';\nimport type { HarnessV1Diagnostic, HarnessV1Observability } from '../../v1';\nimport type {\n HarnessDebugConfig,\n HarnessDebugLevel,\n HarnessDiagnostic,\n HarnessDiagnosticConsumer,\n} from '../observability/types';\nimport type { HarnessAgentSettings } from '../harness-agent-settings';\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\nfunction parseList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * Resolve the effective debug config from explicit settings with env-var\n * fallbacks. `HARNESS_DEBUG*` only fill fields the consumer left unset — code is\n * always authoritative.\n */\nexport function resolveDebugConfig(\n debug: HarnessDebugConfig | undefined,\n env: Record<string, string | undefined> = process.env,\n): {\n enabled: boolean;\n level: HarnessDebugLevel;\n subsystems: string[] | undefined;\n} {\n const enabled =\n debug?.enabled ?? ENV_TRUTHY.has((env.HARNESS_DEBUG ?? '').toLowerCase());\n const level =\n debug?.level ??\n (env.HARNESS_DEBUG_LEVEL as HarnessDebugLevel | undefined) ??\n 'debug';\n const subsystems = debug?.subsystems\n ? [...debug.subsystems]\n : parseList(env.HARNESS_DEBUG_SUBSYSTEMS);\n return { enabled, level, subsystems };\n}\n\n/**\n * Map an adapter-emitted `HarnessV1Diagnostic` to the host-facing\n * `HarnessDiagnostic` (the external/telemetry surface). Identity-shaped today,\n * but an explicit boundary so the emission and consumption types can diverge.\n */\nfunction toHarnessDiagnostic(d: HarnessV1Diagnostic): HarnessDiagnostic {\n return {\n level: d.level,\n message: d.message,\n subsystem: d.subsystem,\n kind: d.kind,\n source: d.source,\n stream: d.stream,\n attrs: d.attrs,\n error: d.error,\n sessionId: d.sessionId,\n timestamp: d.timestamp,\n };\n}\n\nfunction formatForStderr(d: HarnessDiagnostic): string {\n const parts = [`[harness:${d.level}]`, d.subsystem, d.message].filter(\n Boolean,\n );\n let line = parts.join(' ');\n if (d.error) {\n line += ` (${d.error.name ?? 'Error'}: ${d.error.message})`;\n }\n return `${line}\\n`;\n}\n\n/**\n * Build the per-session observability handle the framework hands to `doStart`.\n * Returns `undefined` when diagnostics are disabled. When enabled, the `report`\n * sink maps each adapter-emitted `HarnessV1Diagnostic` to the host\n * `HarnessDiagnostic` and fans it out, non-lossy, to: the `HARNESS_DEBUG` stderr\n * default, the consumer's `onLog`, and any telemetry integration that\n * implements `ingestDiagnostic`. Adapters normalize their own source (bridge\n * wire frames, host logs) into `HarnessV1Diagnostic` before calling `report`.\n */\nexport function buildObservability(options: {\n settings: Pick<\n HarnessAgentSettings<any, any>,\n 'debug' | 'onLog' | 'telemetry'\n >;\n}): HarnessV1Observability | undefined {\n const resolved = resolveDebugConfig(options.settings.debug);\n if (!resolved.enabled) return undefined;\n\n const onLog = options.settings.onLog;\n const integrations = options.settings.telemetry?.integrations\n ? asArray(options.settings.telemetry.integrations)\n : [];\n const diagnosticConsumers = integrations.filter(\n (integration): integration is Telemetry & HarnessDiagnosticConsumer =>\n typeof (integration as HarnessDiagnosticConsumer).ingestDiagnostic ===\n 'function',\n );\n\n const report = (emitted: HarnessV1Diagnostic): void => {\n const diagnostic = toHarnessDiagnostic(emitted);\n try {\n process.stderr.write(formatForStderr(diagnostic));\n } catch {\n // Never let the stderr default break the turn.\n }\n onLog?.(diagnostic);\n for (const consumer of diagnosticConsumers) {\n consumer.ingestDiagnostic?.(diagnostic);\n }\n };\n\n return {\n debug: {\n enabled: true,\n level: resolved.level,\n ...(resolved.subsystems ? { subsystems: resolved.subsystems } : {}),\n },\n report,\n };\n}\n","import { HarnessCapabilityUnsupportedError } from '../../errors/harness-capability-unsupported-error';\nimport type { HarnessV1, HarnessV1BuiltinToolFiltering } from '../../v1';\nimport { NoSuchToolError, type ActiveTools } from 'ai';\nimport type { ToolSet } from '@ai-sdk/provider-utils';\n\nexport type ResolvedHarnessAgentToolFiltering<TUserTools extends ToolSet> = {\n readonly activeUserTools: TUserTools;\n readonly builtinToolFiltering?: HarnessV1BuiltinToolFiltering;\n};\n\nexport function resolveHarnessAgentToolFiltering<\n TAllTools extends ToolSet,\n TUserTools extends ToolSet,\n>(input: {\n harness: HarnessV1;\n userTools: TUserTools;\n allTools: TAllTools;\n activeTools: ActiveTools<TAllTools>;\n inactiveTools: ActiveTools<TAllTools>;\n}): ResolvedHarnessAgentToolFiltering<TUserTools> {\n if (input.activeTools !== undefined && input.inactiveTools !== undefined) {\n throw new Error(\n 'HarnessAgent: pass either `activeTools` or `inactiveTools`, not both.',\n );\n }\n\n const allToolNames = Object.keys(input.allTools);\n const activeTools = dedupeToolNames({ toolNames: input.activeTools });\n const inactiveTools = dedupeToolNames({ toolNames: input.inactiveTools });\n validateToolNames({\n requestedToolNames: activeTools ?? inactiveTools,\n availableToolNames: allToolNames,\n });\n\n const userToolNames = Object.keys(input.userTools);\n const activeUserToolNames =\n activeTools != null\n ? userToolNames.filter(name => activeTools.includes(name))\n : inactiveTools != null\n ? userToolNames.filter(name => !inactiveTools.includes(name))\n : userToolNames;\n\n const builtinToolNames = Object.keys(input.harness.builtinTools);\n const disabledBuiltinToolNames =\n activeTools != null\n ? builtinToolNames.filter(name => !activeTools.includes(name))\n : inactiveTools != null\n ? builtinToolNames.filter(name => inactiveTools.includes(name))\n : [];\n\n const builtinToolFiltering =\n disabledBuiltinToolNames.length > 0\n ? activeTools != null\n ? {\n mode: 'allow' as const,\n toolNames: builtinToolNames.filter(name =>\n activeTools.includes(name),\n ),\n }\n : { mode: 'deny' as const, toolNames: disabledBuiltinToolNames }\n : undefined;\n\n if (\n builtinToolFiltering != null &&\n input.harness.supportsBuiltinToolFiltering !== true &&\n input.harness.supportsBuiltinToolApprovals !== true\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message: `Harness '${input.harness.harnessId}' does not support built-in tool filtering controls.`,\n harnessId: input.harness.harnessId,\n });\n }\n\n return {\n activeUserTools: filterToolSet({\n tools: input.userTools,\n toolNames: activeUserToolNames,\n }),\n ...(builtinToolFiltering != null ? { builtinToolFiltering } : {}),\n };\n}\n\nfunction dedupeToolNames(input: {\n toolNames: ReadonlyArray<string> | undefined;\n}): ReadonlyArray<string> | undefined {\n return input.toolNames == null\n ? undefined\n : Array.from(new Set(input.toolNames));\n}\n\nfunction validateToolNames(input: {\n requestedToolNames: ReadonlyArray<string> | undefined;\n availableToolNames: ReadonlyArray<string>;\n}): void {\n if (input.requestedToolNames == null) return;\n for (const toolName of input.requestedToolNames) {\n if (!input.availableToolNames.includes(toolName)) {\n throw new NoSuchToolError({\n toolName,\n availableTools: [...input.availableToolNames],\n });\n }\n }\n}\n\nfunction filterToolSet<TUserTools extends ToolSet>(input: {\n tools: TUserTools;\n toolNames: ReadonlyArray<string>;\n}): TUserTools {\n const allowed = new Set(input.toolNames);\n return Object.fromEntries(\n Object.entries(input.tools).filter(([name]) => allowed.has(name)),\n ) as TUserTools;\n}\n","import type { HarnessV1Bootstrap, HarnessV1SandboxProvider } from '../v1';\nimport type { HarnessAgentAdapter } from './harness-agent-types';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport { applyBootstrapRecipe } from './internal/bootstrap-recipe';\nimport {\n createSandboxBootstrapPlan,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\n\ntype SandboxBootstrapSettings = Omit<HarnessAgentSandboxConfig, 'onSession'>;\n\n/**\n * Prepare a harness's sandbox template without running an agent. Idempotent: if\n * the template already exists (snapshot present, or marker on a non-snapshot\n * provider), this resolves quickly.\n *\n * Use from a CI/deploy script to amortize the first-session cost so production\n * sessions always resume from snapshot. For adapters without a bootstrap\n * recipe (no `getBootstrap`) this is a no-op.\n *\n * The temporary network sandbox session created during preparation is stopped\n * before the function resolves; the snapshot/template state persists in the\n * provider's native storage (for Vercel: as the `currentSnapshotId` of the\n * named template sandbox).\n */\nexport async function prepareHarnessSandboxTemplate(options: {\n readonly harness: HarnessAgentAdapter;\n readonly sandboxProvider: HarnessV1SandboxProvider;\n readonly sandboxConfig?: SandboxBootstrapSettings;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n const sandboxConfig = options.sandboxConfig ?? {};\n validateSandboxBootstrapSettings(sandboxConfig);\n\n const { harness, sandboxProvider, abortSignal } = options;\n\n let recipe: HarnessV1Bootstrap | undefined;\n if (harness.getBootstrap != null) {\n recipe = await harness.getBootstrap({ abortSignal });\n }\n\n const bootstrapPlan = await createSandboxBootstrapPlan({\n recipe,\n settings: sandboxConfig,\n });\n if (bootstrapPlan.identity == null || bootstrapPlan.onFirstCreate == null) {\n return;\n }\n\n const sandboxSession = await sandboxProvider.createSession({\n abortSignal,\n identity: bootstrapPlan.identity,\n onFirstCreate: bootstrapPlan.onFirstCreate,\n });\n\n // Unlike `prepareSandboxForHarness()` and `HarnessAgent.createSession()`, this function\n // does not apply the agent-specific sandbox config, since the function is meant as a\n // general harness utility, not for a concrete agent.\n try {\n if (bootstrapPlan.recipe != null && bootstrapPlan.recipeIdentity != null) {\n await applyBootstrapRecipe({\n session: sandboxSession.restricted(),\n recipe: bootstrapPlan.recipe,\n identity: bootstrapPlan.recipeIdentity,\n defaultWorkingDirectory: sandboxSession.defaultWorkingDirectory,\n abortSignal,\n });\n }\n } finally {\n await Promise.resolve(sandboxSession.stop()).catch(() => {});\n }\n}\n\n/** @deprecated Use `prepareHarnessSandboxTemplate` instead. */\nexport const prewarmHarness = prepareHarnessSandboxTemplate;\n","import type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport type { HarnessAgentAdapter } from './harness-agent-types';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n normalizeSandboxWorkDir,\n resolveDefaultWorkingDirectory,\n runSandboxBootstrap,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\n\nconst PREPARED_SANDBOX_IDENTITY_VERSION = 1;\n\nexport type PrepareSandboxForHarnessResult = {\n readonly identity?: string;\n readonly recipeIdentities: Record<string, string>;\n readonly skippedHarnessIds: ReadonlyArray<string>;\n};\n\n/**\n * Apply one or more harness bootstrap recipes to an existing sandbox session.\n *\n * Use this when a sandbox provider or caller wants to prepare a reusable\n * sandbox template, image, or snapshot before creating live harness sessions.\n *\n * The function writes each adapter's bridge/bootstrap files, runs its install\n * commands, and then returns a deterministic identity derived from the applied\n * recipes and optional sandbox bootstrap configuration. Providers can use that\n * identity as the cache key for the prepared artifact.\n *\n * This function only mutates the supplied sandbox; the caller is responsible for\n * committing, snapshotting, or otherwise persisting that modified filesystem.\n * When a later `HarnessAgent` session uses a sandbox created from the persisted\n * artifact, the adapter recomputes the same recipe identity and the existing\n * bootstrap marker makes the bootstrap logic a no-op.\n *\n * Repeated harness IDs are prepared once. When multiple adapters use the same\n * ID, the last adapter in `harnesses` is used.\n */\nexport async function prepareSandboxForHarness(options: {\n readonly session: SandboxSession;\n readonly harnesses: ReadonlyArray<HarnessAgentAdapter>;\n readonly sandboxConfig?: HarnessAgentSandboxConfig;\n readonly abortSignal?: AbortSignal;\n}): Promise<PrepareSandboxForHarnessResult> {\n const sandboxConfig = options.sandboxConfig ?? {};\n validateSandboxBootstrapSettings(sandboxConfig);\n\n if (options.harnesses.length === 0) {\n throw new Error(\n 'prepareSandboxForHarness: at least one harness must be provided.',\n );\n }\n\n const harnesses = [\n ...new Map(\n options.harnesses.map(harness => [harness.harnessId, harness]),\n ).values(),\n ].sort((a, b) => a.harnessId.localeCompare(b.harnessId));\n\n const workDir =\n sandboxConfig.workDir == null\n ? undefined\n : normalizeSandboxWorkDir(sandboxConfig.workDir);\n const recipeIdentities: Record<string, string> = {};\n const skippedHarnessIds: string[] = [];\n let defaultWorkingDirectory: string | undefined;\n\n for (const harness of harnesses) {\n const recipe = await harness.getBootstrap?.({\n abortSignal: options.abortSignal,\n });\n if (recipe == null) {\n skippedHarnessIds.push(harness.harnessId);\n continue;\n }\n\n const recipeIdentity = await hashHarnessBootstrap(recipe);\n recipeIdentities[harness.harnessId] = recipeIdentity;\n defaultWorkingDirectory ??= await resolveDefaultWorkingDirectory({\n session: options.session,\n abortSignal: options.abortSignal,\n });\n await applyBootstrapRecipe({\n session: options.session,\n recipe,\n identity: recipeIdentity,\n defaultWorkingDirectory,\n abortSignal: options.abortSignal,\n });\n }\n\n if (sandboxConfig.onBootstrap != null) {\n await runSandboxBootstrap({\n session: options.session,\n workDir,\n onBootstrap: sandboxConfig.onBootstrap,\n defaultWorkingDirectory,\n abortSignal: options.abortSignal,\n });\n }\n\n const identity = await resolvePreparedSandboxIdentity({\n recipeIdentities,\n bootstrapHash: sandboxConfig.bootstrapHash,\n workDir,\n });\n\n return {\n ...(identity != null ? { identity } : {}),\n recipeIdentities,\n skippedHarnessIds,\n };\n}\n\nasync function resolvePreparedSandboxIdentity({\n recipeIdentities,\n bootstrapHash,\n workDir,\n}: {\n readonly recipeIdentities: Record<string, string>;\n readonly bootstrapHash?: string;\n readonly workDir?: string;\n}): Promise<string | undefined> {\n const entries = Object.entries(recipeIdentities).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n if (entries.length === 0 && bootstrapHash == null) {\n return undefined;\n }\n\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n const pushString = (value: string) => {\n chunks.push(encoder.encode(value));\n chunks.push(encoder.encode('\\0'));\n };\n\n pushString(String(PREPARED_SANDBOX_IDENTITY_VERSION));\n pushString(workDir ?? '');\n pushString(bootstrapHash ?? '');\n\n for (const [harnessId, identity] of entries) {\n pushString(harnessId);\n pushString(identity);\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n const digest = await crypto.subtle.digest('SHA-256', buffer);\n const bytes = new Uint8Array(digest);\n let hex = '';\n for (let i = 0; i < 8; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { HarnessError } from './harness-error';\n\nconst name = 'AI_HarnessSandboxAuthenticationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Thrown when a sandbox provider cannot authenticate or authorize the\n * operation needed to create or resume a harness sandbox. Providers should\n * preserve the underlying SDK failure as `cause` and supply a message that\n * explains how the consumer can configure credentials.\n */\nexport class HarnessSandboxAuthenticationError extends HarnessError {\n private readonly [symbol] = true;\n\n readonly sandboxProviderId: string;\n\n constructor({\n message,\n sandboxProviderId,\n cause,\n }: {\n message: string;\n sandboxProviderId: string;\n cause?: unknown;\n }) {\n super({ message, cause });\n Object.defineProperty(this, 'name', { value: name });\n this.sandboxProviderId = sandboxProviderId;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessSandboxAuthenticationError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { HarnessCapabilityUnsupportedError } from '../errors/harness-capability-unsupported-error';\nimport { HarnessError } from '../errors/harness-error';\nimport { HarnessSandboxAuthenticationError } from '../errors/harness-sandbox-authentication-error';\n\nconst defaultErrorMessage = 'An error occurred.';\n\n/**\n * Returns a client-safe message for errors produced by the harness runtime.\n * Messages from explicitly reviewed harness error types are preserved. All\n * other errors are masked so provider, sandbox, and server details are not\n * exposed to clients by default.\n */\nexport function getHarnessErrorMessage(error: unknown): string {\n if (\n HarnessCapabilityUnsupportedError.isInstance(error) ||\n HarnessSandboxAuthenticationError.isInstance(error) ||\n (HarnessError.isInstance(error) && error.name === 'AI_HarnessError')\n ) {\n return error.message;\n }\n\n return defaultErrorMessage;\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport type { Telemetry } from 'ai';\nimport type { HarnessDiagnostic, HarnessDiagnosticConsumer } from './types';\n\n/**\n * A harness observability reporter that writes a unified, non-lossy\n * `events.jsonl` containing **both** the telemetry span lifecycle (turn / step\n * / tool) **and** the forwarded bridge diagnostics (console lines + structured\n * events). It is a single object registered in `telemetry.integrations`: the\n * framework drives its `Telemetry` methods for spans and calls\n * `ingestDiagnostic` for diagnostics.\n *\n * No external collector or OTel setup required — this is the AI-SDK-idiomatic\n * replacement for the original SDK's host-side artifact files.\n */\nexport interface FileReporterOptions {\n /** Directory for `events.jsonl` (created if absent). */\n dir: string;\n /**\n * Buffer a turn's records in memory and write them only if the turn produced\n * an error (an `error`-level diagnostic, a failed tool, or an error finish).\n * Default false (write everything).\n */\n failOnly?: boolean;\n /** File name within `dir`. Default `events.jsonl`. */\n fileName?: string;\n}\n\ntype Record_ = { ts: number } & Record<string, unknown>;\n\nexport type FileReporter = Telemetry & HarnessDiagnosticConsumer;\n\nexport function createFileReporter(options: FileReporterOptions): FileReporter {\n const fileName = options.fileName ?? 'events.jsonl';\n const path = `${options.dir}/${fileName}`;\n const failOnly = options.failOnly ?? false;\n\n // Per-turn buffers, keyed by the telemetry callId. Diagnostics (which carry a\n // sessionId, not a callId) attach to the most recently started, open turn.\n const turns = new Map<string, { lines: Record_[]; errored: boolean }>();\n let lastOpenCallId: string | undefined;\n let dirReady = false;\n\n const bucketFor = (callId: string) => {\n let bucket = turns.get(callId);\n if (!bucket) {\n bucket = { lines: [], errored: false };\n turns.set(callId, bucket);\n }\n return bucket;\n };\n\n const record = (callId: string | undefined, rec: Record_): void => {\n const id = callId ?? lastOpenCallId;\n if (id == null) {\n // No active turn — write standalone (best-effort).\n flushLines([rec]);\n return;\n }\n bucketFor(id).lines.push(rec);\n };\n\n const flushLines = (lines: Record_[]): void => {\n if (lines.length === 0) return;\n try {\n if (!dirReady) {\n mkdirSync(options.dir, { recursive: true });\n dirReady = true;\n }\n appendFileSync(path, lines.map(l => JSON.stringify(l)).join('\\n') + '\\n');\n } catch {\n // Best-effort: never let observability break a turn.\n }\n };\n\n const finishTurn = (callId: string): void => {\n const bucket = turns.get(callId);\n if (!bucket) return;\n turns.delete(callId);\n if (lastOpenCallId === callId) lastOpenCallId = undefined;\n if (failOnly && !bucket.errored) return;\n flushLines(bucket.lines);\n };\n\n return {\n onStart(event) {\n const e = event as {\n callId: string;\n operationId?: string;\n modelId?: string;\n provider?: string;\n messages?: unknown;\n instructions?: unknown;\n recordInputs?: boolean;\n };\n lastOpenCallId = e.callId;\n record(e.callId, {\n ts: Date.now(),\n kind: 'turn-start',\n callId: e.callId,\n operationId: e.operationId,\n provider: e.provider,\n modelId: e.modelId,\n // Input prompt, unless the consumer opted out via `recordInputs: false`.\n ...(e.recordInputs === false\n ? {}\n : { input: { messages: e.messages, instructions: e.instructions } }),\n });\n },\n onStepStart(event) {\n const e = event as { callId: string; stepNumber?: number };\n record(e.callId, {\n ts: Date.now(),\n kind: 'step-start',\n callId: e.callId,\n step: e.stepNumber,\n });\n },\n onToolExecutionStart(event) {\n const e = event as {\n callId: string;\n toolCall: { toolName: string; toolCallId: string; input: unknown };\n };\n record(e.callId, {\n ts: Date.now(),\n kind: 'tool-start',\n callId: e.callId,\n toolName: e.toolCall.toolName,\n toolCallId: e.toolCall.toolCallId,\n input: e.toolCall.input,\n });\n },\n onToolExecutionEnd(event) {\n const e = event as {\n callId: string;\n toolCall: { toolCallId: string };\n toolOutput: { type: string; output?: unknown; error?: unknown };\n };\n const isError = e.toolOutput.type === 'error';\n if (isError) bucketFor(e.callId).errored = true;\n record(e.callId, {\n ts: Date.now(),\n kind: 'tool-end',\n callId: e.callId,\n toolCallId: e.toolCall.toolCallId,\n isError,\n output: isError ? e.toolOutput.error : e.toolOutput.output,\n });\n },\n onStepFinish(event) {\n const e = event as {\n callId: string;\n usage?: unknown;\n content?: unknown[];\n recordOutputs?: boolean;\n };\n record(e.callId, {\n ts: Date.now(),\n kind: 'step-finish',\n callId: e.callId,\n usage: e.usage,\n // The model's output content, unless `recordOutputs: false`.\n ...(e.recordOutputs === false || e.content == null\n ? {}\n : { output: e.content }),\n });\n },\n onEnd(event) {\n const e = event as {\n callId: string;\n finishReason?: unknown;\n usage?: unknown;\n totalUsage?: unknown;\n };\n record(e.callId, {\n ts: Date.now(),\n kind: 'turn-finish',\n callId: e.callId,\n finishReason: e.finishReason,\n usage: e.totalUsage ?? e.usage,\n });\n finishTurn(e.callId);\n },\n onError(error) {\n if (lastOpenCallId != null) bucketFor(lastOpenCallId).errored = true;\n record(lastOpenCallId, {\n ts: Date.now(),\n kind: 'error',\n error:\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n });\n },\n ingestDiagnostic(diagnostic: HarnessDiagnostic) {\n if (diagnostic.level === 'error' && lastOpenCallId != null) {\n bucketFor(lastOpenCallId).errored = true;\n }\n record(lastOpenCallId, {\n ts: diagnostic.timestamp,\n kind: 'diagnostic',\n diagnostic,\n });\n },\n };\n}\n","import type { Telemetry } from 'ai';\n\n/**\n * A harness observability reporter that renders an ASCII trace tree of a\n * turn's span lifecycle (turn → steps → tools) to a stream at turn end. It is a\n * `Telemetry` integration — register it in `telemetry.integrations`. Useful for\n * zero-setup local debugging when no OTel collector is wired up; a real OTel\n * backend (via `@ai-sdk/otel`) is a strict superset.\n */\nexport interface TraceTreeReporterOptions {\n /** Where to write the rendered tree. Default `process.stderr.write`. */\n write?: (chunk: string) => void;\n}\n\ntype Node = {\n label: string;\n startMs: number;\n endMs?: number;\n children: Node[];\n};\n\nexport function createTraceTreeReporter(\n options: TraceTreeReporterOptions = {},\n): Telemetry {\n const write =\n options.write ?? ((chunk: string) => void process.stderr.write(chunk));\n\n type TurnState = {\n root: Node;\n step?: Node;\n tools: Map<string, Node>;\n };\n const turns = new Map<string, TurnState>();\n\n const render = (node: Node, depth: number): string => {\n const indent = ' '.repeat(depth);\n const dur =\n node.endMs != null\n ? `${Math.max(0, Math.round(node.endMs - node.startMs))}ms`\n : '(open)';\n let out = `${indent}- ${node.label} ${dur}\\n`;\n for (const child of node.children) out += render(child, depth + 1);\n return out;\n };\n\n return {\n onStart(event) {\n const e = event as {\n callId: string;\n operationId?: string;\n modelId?: string;\n };\n turns.set(e.callId, {\n root: {\n label: `${e.operationId ?? 'turn'}${e.modelId ? ` ${e.modelId}` : ''}`,\n startMs: Date.now(),\n children: [],\n },\n tools: new Map(),\n });\n },\n onStepStart(event) {\n const e = event as { callId: string; stepNumber?: number };\n const turn = turns.get(e.callId);\n if (!turn) return;\n const step: Node = {\n label: `step ${(e.stepNumber ?? turn.root.children.length) + 1}`,\n startMs: Date.now(),\n children: [],\n };\n turn.step = step;\n turn.root.children.push(step);\n },\n onToolExecutionStart(event) {\n const e = event as {\n callId: string;\n toolCall: { toolName: string; toolCallId: string };\n };\n const turn = turns.get(e.callId);\n const parent = turn?.step ?? turn?.root;\n if (!turn || !parent) return;\n const node: Node = {\n label: `tool ${e.toolCall.toolName}`,\n startMs: Date.now(),\n children: [],\n };\n turn.tools.set(e.toolCall.toolCallId, node);\n parent.children.push(node);\n },\n onToolExecutionEnd(event) {\n const e = event as {\n callId: string;\n toolCall: { toolCallId: string };\n toolOutput: { type: string };\n };\n const node = turns.get(e.callId)?.tools.get(e.toolCall.toolCallId);\n if (!node) return;\n node.endMs = Date.now();\n if (e.toolOutput.type === 'error') node.label += ' [error]';\n },\n onStepFinish(event) {\n const e = event as { callId: string };\n const turn = turns.get(e.callId);\n if (turn?.step) {\n turn.step.endMs = Date.now();\n turn.step = undefined;\n }\n },\n onEnd(event) {\n const e = event as { callId: string };\n const turn = turns.get(e.callId);\n if (!turn) return;\n turn.root.endMs = Date.now();\n turns.delete(e.callId);\n try {\n write(`\\n${render(turn.root, 0)}`);\n } catch {\n // Never let rendering break the turn.\n }\n },\n };\n}\n"],"mappings":"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","names":["AISDKError","name","marker","symbol","_a","_b","AISDKError","asArray","generateId","generateId","safeParseJSON","_a","_b","generateId","_a","_b","generateId","_a","_b","_a","_a","_b","safeValidateTypes","_a","_a","_b","_c","_d","_e","_f","_g","result","input","done","generateId","safeParseJSON","output","_a","_b","posix","posix","_a","_b","name","_a","asArray","_b","generateId","name","_a","_a","_b","AISDKError","name","marker","symbol","_a","_b","AISDKError","_a","_b","_a","e"]}
1
+ {"version":3,"sources":["../../src/errors/harness-capability-unsupported-error.ts","../../src/errors/harness-error.ts","../../src/agent/harness-agent.ts","../../src/agent/internal/lifecycle-state-validation.ts","../../src/v1/harness-v1-tool-filtering.ts","../../src/agent/internal/to-harness-stream.ts","../../src/agent/internal/run-prompt.ts","../../src/agent/internal/harness-stream-text-result.ts","../../src/agent/internal/translate-stream-part.ts","../../src/agent/internal/strip-work-dir.ts","../../src/agent/internal/turn-telemetry.ts","../../src/agent/internal/permission-mode.ts","../../src/utils/bridge-diagnostics.ts","../../src/utils/sandbox-channel.ts","../../src/utils/get-restricted-sandbox-session.ts","../../src/agent/harness-agent-session.ts","../../src/agent/harness-agent-tool-approval-continuation.ts","../../src/agent/harness-agent-tool-result-continuation.ts","../../src/agent/internal/bootstrap-recipe.ts","../../src/agent/internal/sandbox-bootstrap.ts","../../src/utils/resolve-sandbox-default-working-directory.ts","../../src/agent/internal/resolve-observability.ts","../../src/agent/internal/tool-filtering.ts","../../src/agent/prepare-harness-sandbox-template.ts","../../src/agent/prepare-sandbox-for-harness.ts","../../src/errors/harness-sandbox-authentication-error.ts","../../src/agent/get-harness-error-message.ts","../../src/agent/observability/file-reporter.ts","../../src/agent/observability/trace-tree-reporter.ts"],"sourcesContent":["import { AISDKError } from '@ai-sdk/provider';\nimport { HarnessError } from './harness-error';\n\nconst name = 'AI_HarnessCapabilityUnsupportedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Thrown when a caller asks the harness to do something the adapter (or the\n * supplied sandbox) does not support, e.g. requesting manual compaction from\n * an adapter that only auto-compacts, or invoking `getPortEndpoint` on a\n * sandbox that does not expose one.\n *\n * The caller supplies the full human-readable message. Optional `harnessId`\n * is recorded as structured context for tooling.\n */\nexport class HarnessCapabilityUnsupportedError extends HarnessError {\n private readonly [symbol] = true;\n\n readonly harnessId?: string;\n\n constructor({\n message,\n harnessId,\n cause,\n }: {\n message: string;\n harnessId?: string;\n cause?: unknown;\n }) {\n super({ message, cause });\n Object.defineProperty(this, 'name', { value: name });\n this.harnessId = harnessId;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessCapabilityUnsupportedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from '@ai-sdk/provider';\n\nconst name = 'AI_HarnessError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Base error type for failures originating in or signalled by a harness\n * adapter. Specific failure modes (e.g. unsupported capability) extend this\n * class.\n */\nexport class HarnessError extends AISDKError {\n private readonly [symbol] = true;\n\n constructor({ message, cause }: { message: string; cause?: unknown }) {\n super({ name, message, cause });\n }\n\n static isInstance(error: unknown): error is HarnessError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { HarnessCapabilityUnsupportedError } from '../errors/harness-capability-unsupported-error';\nimport type {\n HarnessV1Bootstrap,\n HarnessV1BuiltinToolFiltering,\n HarnessV1JSONSchema,\n HarnessV1NetworkSandboxSession,\n HarnessV1ResponseFormat,\n} from '../v1';\nimport {\n asArray,\n asSchema,\n generateId,\n type Context,\n type Experimental_SandboxSession as SandboxSession,\n type ModelMessage,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport type {\n Agent,\n AgentCallParameters,\n AgentStreamParameters,\n GenerateTextResult,\n OutputInterface as Output,\n ReasoningFileOutput,\n ReasoningOutput,\n StopCondition,\n StreamTextResult,\n} from 'ai';\nimport type {\n HarnessAgentSandboxConfig,\n HarnessAgentSettings,\n} from './harness-agent-settings';\nimport type { HarnessAllTools } from './harness-agent-tool-types';\nimport { HarnessAgentSession } from './harness-agent-session';\nimport type {\n HarnessAgentAdapter,\n HarnessAgentContinueTurnState,\n HarnessAgentPermissionMode,\n HarnessAgentPrompt,\n HarnessAgentResumeSessionState,\n HarnessAgentToolSpec,\n} from './harness-agent-types';\nimport {\n collectHarnessAgentToolApprovalContinuations,\n type HarnessAgentToolApprovalContinuation,\n} from './harness-agent-tool-approval-continuation';\nimport {\n collectHarnessAgentToolResultContinuations,\n type HarnessAgentToolResultContinuation,\n} from './harness-agent-tool-result-continuation';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n createSandboxBootstrapPlan,\n ensureSandboxDirectory,\n resolveSessionWorkDir,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\nimport { buildObservability } from './internal/resolve-observability';\nimport { validateLifecycleStateData } from './internal/lifecycle-state-validation';\nimport {\n permissionModeNeedsBuiltinSupport,\n resolvePermissionMode,\n} from './internal/permission-mode';\nimport { resolveHarnessAgentToolFiltering } from './internal/tool-filtering';\nimport { resolveSandboxDefaultWorkingDirectory } from '../utils/resolve-sandbox-default-working-directory';\nimport { getRestrictedSandboxSession } from '../utils/get-restricted-sandbox-session';\n\nexport type { HarnessAllTools } from './harness-agent-tool-types';\n\n/**\n * Required `session` extension on every `HarnessAgent.generate` /\n * `HarnessAgent.stream` call. The agent operates exclusively on the\n * `HarnessAgentSession` the caller passes in — it owns no session\n * state of its own.\n */\nexport interface HarnessAgentCallExtensions {\n /**\n * Active session returned by `agent.createSession(...)`. Drives the\n * underlying harness adapter for this turn.\n */\n session: HarnessAgentSession;\n}\n\n/**\n * AI SDK `Agent` implementation that drives a third-party agent runtime\n * through a harness adapter (Claude Code, Codex, …).\n *\n * Behaviour summary:\n * - **Stateless definition.** Construct once at module scope. The agent\n * holds the harness adapter, the merged tool surface, the sandbox\n * provider and other config — never a live session. Per-call data\n * (prompt, abort signal, the `HarnessAgentSession`) lives on\n * `generate()` / `stream()`.\n * - **Explicit sessions.** Callers spawn sessions with\n * `agent.createSession(...)`, pass the returned\n * `HarnessAgentSession` on every `generate` / `stream`, and end it via\n * `session.detach()`, `session.stop()`, or `session.destroy()`.\n * - **Cross-process resume.** `createSession({ sessionId, resumeFrom })`\n * resumes from state previously returned by `session.detach()` or\n * `session.stop()`. The framework validates `resumeFrom` against the\n * harness's `lifecycleStateSchema` before handing it to the adapter.\n * `createSession({ sessionId, continueFrom })` resumes from state returned\n * by `session.suspendTurn()` before `continueStream()` /\n * `continueGenerate()`.\n * - **Host tool execution.** User tools passed in `settings.tools` are\n * executed on the host whenever the underlying runtime calls them;\n * the result is fed back to the harness via `submitToolResult`.\n * Adapter builtin tools (e.g. Claude Code's `Bash`) pass through\n * untouched.\n * - **Sandbox propagation.** On `createSession`, the agent uses a\n * caller-provided network or basic sandbox session when present; otherwise\n * it calls the configured provider's `createSession()` (or\n * `resumeSession()`). It passes the selected session into `doStart`. A\n * tool-safe `SandboxSession` is handed to user-tool\n * `execute()` calls via `experimental_sandbox`. Caller-provided sandboxes\n * remain owned by the caller and are not stopped or destroyed by the\n * harness layer.\n */\nexport class HarnessAgent<\n THarness extends HarnessAgentAdapter<any> = HarnessAgentAdapter,\n TUserTools extends ToolSet = {},\n RUNTIME_CONTEXT extends Context = Context,\n OUTPUT extends Output = never,\n> implements Agent<\n never,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n> {\n readonly version = 'agent-v1' as const;\n readonly id: string | undefined;\n\n /**\n * Merged tool set exposed to AI SDK consumers: harness builtins +\n * user-defined tools, with user tools overriding builtins on key\n * collision. Built once at construction time so the typed surface is\n * stable across calls.\n */\n readonly tools: HarnessAllTools<THarness, TUserTools>;\n\n private readonly settings: HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n private readonly stopConditions: Array<\n StopCondition<HarnessAllTools<THarness, TUserTools>, RUNTIME_CONTEXT>\n >;\n private readonly sandboxConfig: HarnessAgentSandboxConfig;\n private readonly activeUserTools: TUserTools;\n private readonly builtinToolFiltering:\n | HarnessV1BuiltinToolFiltering\n | undefined;\n private readonly permissionMode: HarnessAgentPermissionMode;\n\n constructor(\n settings: HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT\n >,\n ) {\n const sandboxConfig = resolveSandboxConfig(settings);\n validateSandboxBootstrapSettings(sandboxConfig);\n this.settings = settings;\n this.stopConditions =\n settings.stopWhen == null ? [] : asArray(settings.stopWhen);\n this.sandboxConfig = sandboxConfig;\n this.id = settings.id;\n const userTools = settings.tools ?? ({} as TUserTools);\n this.permissionMode = resolvePermissionMode({\n permissionMode: settings.permissionMode,\n });\n const tools = {\n ...settings.harness.builtinTools,\n ...userTools,\n } as HarnessAllTools<THarness, TUserTools>;\n const toolFiltering = resolveHarnessAgentToolFiltering({\n harness: settings.harness,\n userTools,\n allTools: tools,\n activeTools: settings.activeTools,\n inactiveTools: settings.inactiveTools,\n });\n this.activeUserTools = toolFiltering.activeUserTools;\n this.builtinToolFiltering = toolFiltering.builtinToolFiltering;\n if (\n Object.keys(settings.harness.builtinTools).length > 0 &&\n permissionModeNeedsBuiltinSupport({\n permissionMode: this.permissionMode,\n }) &&\n settings.harness.supportsBuiltinToolApprovals !== true\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message: `Harness '${settings.harness.harnessId}' does not support built-in tool approval requests; use permissionMode: 'allow-all'.`,\n harnessId: settings.harness.harnessId,\n });\n }\n this.tools = tools;\n }\n\n /** Identifier of the harness backing this agent. */\n get harnessId(): string {\n return this.settings.harness.harnessId;\n }\n\n /**\n * Start a fresh session, or resume from state previously returned by\n * `session.detach()` or `session.stop()`. The returned\n * `HarnessAgentSession` must be passed to subsequent `generate` / `stream`\n * calls; end it with `session.detach()`, `session.stop()`, or\n * `session.destroy()`.\n */\n async createSession(options?: {\n /**\n * Optional stable identifier for the underlying sandbox/session.\n * When omitted the agent generates one. Supply the original\n * `session.sessionId` together with `resumeFrom` to reattach a\n * previously ended session across processes.\n */\n sessionId?: string;\n /**\n * Resume payload returned by a prior `session.detach()` or\n * `session.stop()`. Must be accompanied by the original `sessionId`; the\n * framework validates it against `harness.lifecycleStateSchema` before\n * handing it to the adapter.\n */\n resumeFrom?: HarnessAgentResumeSessionState;\n /**\n * Continuation payload returned by a prior `session.suspendTurn()`. Must be\n * accompanied by the original `sessionId`; the framework validates it before\n * handing it to the adapter.\n */\n continueFrom?: HarnessAgentContinueTurnState;\n /**\n * Existing sandbox session to run the harness in. When provided, the\n * caller retains ownership of the sandbox lifecycle.\n */\n sandboxSession?: HarnessV1NetworkSandboxSession | SandboxSession;\n abortSignal?: AbortSignal;\n }): Promise<HarnessAgentSession> {\n const sessionId = options?.sessionId ?? generateId();\n const resumeFrom = options?.resumeFrom;\n const continueFrom = options?.continueFrom;\n const providedSandboxSession = options?.sandboxSession;\n const abortSignal = options?.abortSignal;\n const harness = this.settings.harness;\n const sandboxProvider = this.settings.sandbox;\n const ownsSandboxLifecycle = providedSandboxSession == null;\n\n if (resumeFrom != null && continueFrom != null) {\n throw new Error(\n 'HarnessAgent.createSession: pass either `resumeFrom` or `continueFrom`, not both.',\n );\n }\n\n let validatedResumeFrom: HarnessAgentResumeSessionState | undefined;\n if (resumeFrom != null) {\n validatedResumeFrom = await validateLifecycleStateData({\n harness,\n state: resumeFrom,\n expectedType: 'resume-session',\n });\n }\n\n let validatedContinueFrom: HarnessAgentContinueTurnState | undefined;\n if (continueFrom != null) {\n validatedContinueFrom = await validateLifecycleStateData({\n harness,\n state: continueFrom,\n expectedType: 'continue-turn',\n });\n }\n\n const effectiveContinueFrom =\n validatedContinueFrom ?? validatedResumeFrom?.continueFrom;\n const isResumedSession =\n validatedResumeFrom != null || effectiveContinueFrom != null;\n\n // Acquires the concrete sandbox session, either by starting fresh and then\n // creating a post-bootstrap snapshot, or by reusing a previously created\n // snapshot based on the bootstrap-based hashes.\n let sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n let sessionWorkDir: string;\n if (providedSandboxSession != null) {\n sandboxSession = providedSandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const defaultWorkingDirectory =\n await resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal,\n });\n sessionWorkDir = resolveSessionWorkDir({\n defaultWorkingDirectory,\n harnessId: harness.harnessId,\n sessionId,\n workDir: this.sandboxConfig.workDir,\n });\n\n const recipe = await harness.getBootstrap?.({ abortSignal });\n if (recipe != null) {\n const recipeIdentity = await hashHarnessBootstrap(recipe);\n try {\n await applyBootstrapRecipe({\n session: toolSafeSandboxSession,\n recipe,\n identity: recipeIdentity,\n defaultWorkingDirectory,\n abortSignal,\n });\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n }\n } else {\n if (sandboxProvider == null) {\n throw new Error(\n 'HarnessAgent.createSession: configure `sandbox` on HarnessAgent or pass `sandboxSession` to createSession().',\n );\n }\n\n if (isResumedSession) {\n if (sandboxProvider.resumeSession == null) {\n throw new HarnessCapabilityUnsupportedError({\n message: `Sandbox provider '${sandboxProvider.providerId}' does not support resume.`,\n harnessId: harness.harnessId,\n });\n }\n const resumedSandboxSession = await sandboxProvider.resumeSession({\n sessionId,\n abortSignal,\n });\n sandboxSession = resumedSandboxSession;\n sessionWorkDir = resolveSessionWorkDir({\n defaultWorkingDirectory:\n resumedSandboxSession.defaultWorkingDirectory,\n harnessId: harness.harnessId,\n sessionId,\n workDir: this.sandboxConfig.workDir,\n });\n } else {\n // The logic in this clause applies the bootstrap plan, including both the harness\n // bootstrap recipe and agent specific sandbox configuration.\n // The logic matches largely what `prepareHarnessSandboxTemplate()` and\n // `prepareSandboxForHarness()` do, so they will have to remain aligned.\n let recipe: HarnessV1Bootstrap | undefined;\n if (harness.getBootstrap != null) {\n recipe = await harness.getBootstrap({ abortSignal });\n }\n\n // Defines the hashes based on both harness bootstrap recipe and\n // consumer-defined onBootstrap callback.\n const sandboxBootstrapPlan = await createSandboxBootstrapPlan({\n recipe,\n settings: this.sandboxConfig,\n });\n\n const createdSandboxSession = await sandboxProvider.createSession({\n sessionId,\n abortSignal,\n identity: sandboxBootstrapPlan.identity,\n onFirstCreate: sandboxBootstrapPlan.onFirstCreate,\n });\n sandboxSession = createdSandboxSession;\n sessionWorkDir = resolveSessionWorkDir({\n defaultWorkingDirectory:\n createdSandboxSession.defaultWorkingDirectory,\n harnessId: harness.harnessId,\n sessionId,\n workDir: sandboxBootstrapPlan.workDir,\n });\n\n // In case the sandbox session was created with a custom sandbox, or in\n // case the sandbox provider doesn't respect `onFirstCreate`, we still\n // have to ensure the harness bootstrap recipe has run. In the common\n // scenario, this will be a cheap no-op based on just a marker check.\n if (\n sandboxBootstrapPlan.recipe != null &&\n sandboxBootstrapPlan.recipeIdentity != null\n ) {\n try {\n await applyBootstrapRecipe({\n session: createdSandboxSession.restricted(),\n recipe: sandboxBootstrapPlan.recipe,\n identity: sandboxBootstrapPlan.recipeIdentity,\n defaultWorkingDirectory:\n createdSandboxSession.defaultWorkingDirectory,\n abortSignal,\n });\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n }\n }\n }\n\n try {\n await ensureSandboxDirectory({\n session: sandboxSession,\n workDir: sessionWorkDir,\n abortSignal,\n });\n if (this.sandboxConfig.onSession != null) {\n await this.sandboxConfig.onSession({\n session: getRestrictedSandboxSession(sandboxSession),\n sessionWorkDir,\n abortSignal,\n });\n }\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n\n try {\n const baseStartOptions = {\n sessionId,\n skills: this.settings.skills,\n resumeFrom: validatedResumeFrom,\n continueFrom: effectiveContinueFrom,\n permissionMode: this.permissionMode,\n builtinToolFiltering: this.builtinToolFiltering,\n abortSignal,\n observability: buildObservability({ settings: this.settings }),\n };\n const underlyingSession = await harness.doStart({\n ...baseStartOptions,\n sandboxSession,\n sessionWorkDir,\n });\n return new HarnessAgentSession({\n sessionId,\n harness,\n underlyingSession,\n sandboxSession,\n ownsSandboxLifecycle,\n sessionWorkDir,\n toolApproval: this.settings.toolApproval,\n pendingToolApprovals: effectiveContinueFrom?.pendingToolApprovals,\n pendingToolResults: effectiveContinueFrom?.pendingToolResults,\n turnState:\n effectiveContinueFrom == null\n ? 'idle'\n : effectiveContinueFrom.pendingToolApprovals != null &&\n effectiveContinueFrom.pendingToolApprovals.length > 0\n ? 'awaiting-approval'\n : effectiveContinueFrom.pendingToolResults != null &&\n effectiveContinueFrom.pendingToolResults.length > 0\n ? 'awaiting-tool-result'\n : 'suspended',\n });\n } catch (error) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw error;\n }\n }\n\n async generate(\n options: AgentCallParameters<\n never,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions,\n ): Promise<\n GenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const turnInput = this._resolveTurnInput(options);\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n const { result, done } = this._startTurn({\n session: options.session,\n turnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n await done;\n return this._toGenerateResult(result);\n }\n\n async stream(\n options: AgentStreamParameters<\n never,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions,\n ): Promise<\n StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const turnInput = this._resolveTurnInput(options);\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n const { result } = this._startTurn({\n session: options.session,\n turnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n return result;\n }\n\n /**\n * Continue the in-flight turn **without a new prompt**, draining it like\n * {@link generate}. Used after `createSession({ continueFrom })` to finish\n * consuming a turn that crossed a process boundary.\n */\n async continueGenerate(options: {\n session: HarnessAgentSession;\n toolApprovalContinuations?: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations?: readonly HarnessAgentToolResultContinuation[];\n abortSignal?: AbortSignal;\n }): Promise<\n GenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n\n const { result, done } = this._startTurn({\n session: options.session,\n turnInput: {\n mode: 'continue',\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n await done;\n return this._toGenerateResult(result);\n }\n\n /**\n * Continue the in-flight turn **without a new prompt**, streaming its events\n * like {@link stream}. Used to keep consuming a turn that is still running\n * (or finished) in the runtime after a process boundary — the workflow slice\n * loop calls this on every slice after the first. Routes through the adapter's\n * `doContinueTurn`; what it can guarantee (lossless attach vs. lossy rerun)\n * follows from how the adapter resumed the session.\n */\n async continueStream(options: {\n session: HarnessAgentSession;\n toolApprovalContinuations?: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations?: readonly HarnessAgentToolResultContinuation[];\n abortSignal?: AbortSignal;\n }): Promise<\n StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const responseFormat = await this._resolveResponseFormat();\n\n const { result } = this._startTurn({\n session: options.session,\n turnInput: {\n mode: 'continue',\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat,\n });\n return result;\n }\n\n /**\n * Submit another user message to a currently running session turn.\n *\n * The returned promise resolves after the runtime has accepted the message\n * for its next safe input boundary. Output caused by the message remains in\n * the current turn's stream.\n */\n async experimental_steer(options: {\n session: HarnessAgentSession;\n text: string;\n }): Promise<void> {\n await options.session.experimental_steerTurn(options.text);\n }\n\n // ─── Internals ──────────────────────────────────────────────────────\n\n private _startTurn(input: {\n session: HarnessAgentSession;\n turnInput:\n | { mode: 'prompt'; prompt: HarnessAgentPrompt }\n | {\n mode: 'continue';\n toolApprovalContinuations: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations: readonly HarnessAgentToolResultContinuation[];\n };\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n }): {\n result: StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n done: Promise<void>;\n } {\n if (input.turnInput.mode === 'continue') {\n return input.session.continueTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n instructions: this.settings.instructions,\n tools: this.tools,\n activeTools: this.activeUserTools,\n toolSpecs: this._toToolSpecs(),\n builtinToolFiltering: this.builtinToolFiltering,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat: input.responseFormat,\n output: this.settings.output,\n telemetry: this.settings.telemetry,\n stopConditions: this.stopConditions,\n toolApprovalContinuations: input.turnInput.toolApprovalContinuations,\n toolResultContinuations: input.turnInput.toolResultContinuations,\n });\n }\n\n return input.session.promptTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n prompt: input.turnInput.prompt,\n instructions: this.settings.instructions,\n tools: this.tools,\n activeTools: this.activeUserTools,\n toolSpecs: this._toToolSpecs(),\n builtinToolFiltering: this.builtinToolFiltering,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat: input.responseFormat,\n output: this.settings.output,\n telemetry: this.settings.telemetry,\n stopConditions: this.stopConditions,\n });\n }\n\n /*\n * Reduce AI SDK input to the single user message the harness should run\n * for this turn. The harness session owns prior-turn state (system\n * prompt, assistant turns, tool results) — we never replay it. A bare\n * string is forwarded as-is; a message array is collapsed to its last\n * `role: 'user'` entry. Inputs whose only messages are non-user (system,\n * assistant, tool) have no fresh user input and are rejected.\n */\n private _resolveTurnInput(options: {\n prompt?: string | ModelMessage[];\n messages?: ModelMessage[];\n }):\n | { mode: 'prompt'; prompt: HarnessAgentPrompt }\n | {\n mode: 'continue';\n toolApprovalContinuations: readonly HarnessAgentToolApprovalContinuation[];\n toolResultContinuations: readonly HarnessAgentToolResultContinuation[];\n } {\n if (typeof options.prompt === 'string') {\n return { mode: 'prompt', prompt: options.prompt };\n }\n const messages = Array.isArray(options.prompt)\n ? options.prompt\n : options.messages;\n if (Array.isArray(messages)) {\n const toolApprovalContinuations =\n collectHarnessAgentToolApprovalContinuations({ messages });\n const toolResultContinuations =\n collectHarnessAgentToolResultContinuations({ messages });\n if (\n toolApprovalContinuations.length > 0 ||\n toolResultContinuations.length > 0\n ) {\n return {\n mode: 'continue',\n toolApprovalContinuations,\n toolResultContinuations,\n };\n }\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role === 'user')\n return { mode: 'prompt', prompt: message };\n }\n throw new Error(\n 'HarnessAgent: messages must contain at least one `role: \"user\"` entry.',\n );\n }\n throw new Error('HarnessAgent: either `prompt` or `messages` is required.');\n }\n\n /*\n * Wire-format projection of user-defined tools only. Harness builtins are\n * executed by the runtime and the bridge already knows about them — we\n * never re-declare them over the wire.\n */\n private _toToolSpecs(): HarnessAgentToolSpec[] {\n const specs: HarnessAgentToolSpec[] = [];\n for (const [name, tool] of Object.entries(\n this.activeUserTools as Record<string, unknown>,\n )) {\n const t = tool as {\n description?: string;\n inputSchema?: unknown;\n };\n let inputSchema: HarnessAgentToolSpec['inputSchema'];\n if (t.inputSchema != null) {\n try {\n inputSchema = asSchema(\n t.inputSchema as Parameters<typeof asSchema>[0],\n ).jsonSchema as HarnessAgentToolSpec['inputSchema'];\n } catch {\n // tools without a usable schema are still forwarded by name\n }\n }\n specs.push({ name, description: t.description, inputSchema });\n }\n return specs;\n }\n\n private async _toGenerateResult(\n streamResult: StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >,\n ): Promise<\n GenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n // The stream is already drained by the time generate() calls this helper\n // (done has resolved). `steps` is the single source of truth the result\n // derives everything else from, mirroring core's `generateText` result.\n const [steps, usage, responseMessages, output] = await Promise.all([\n streamResult.steps,\n streamResult.usage,\n streamResult.responseMessages,\n this.settings.output == null\n ? Promise.resolve(undefined as never)\n : streamResult.output,\n ]);\n\n return new HarnessGenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({ steps, usage, responseMessages, output });\n }\n\n private async _resolveResponseFormat(): Promise<\n HarnessV1ResponseFormat | undefined\n > {\n const responseFormat = await this.settings.output?.responseFormat;\n if (responseFormat == null || responseFormat.type === 'text') {\n return responseFormat == null ? undefined : { type: 'text' };\n }\n return {\n type: 'json',\n ...(responseFormat.schema == null\n ? {}\n : { schema: responseFormat.schema as HarnessV1JSONSchema }),\n ...(responseFormat.name == null ? {} : { name: responseFormat.name }),\n ...(responseFormat.description == null\n ? {}\n : { description: responseFormat.description }),\n };\n }\n}\n\n/*\n * `GenerateTextResult` view over a drained `streamText` run. Non-deprecated\n * members derive from `steps` (the single source of truth), and the deprecated\n * members are exposed as getters that delegate to `finalStep` / `usage`.\n * Implementing the deprecated members as getters — rather than assigning them\n * in an object literal — keeps construction free of deprecated-property usage,\n * matching how core's `generateText` builds its result.\n */\nclass HarnessGenerateTextResult<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> implements GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n readonly steps: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['steps'];\n readonly usage: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['usage'];\n readonly responseMessages: GenerateTextResult<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT\n >['responseMessages'];\n readonly output: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['output'];\n\n constructor(options: {\n steps: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['steps'];\n usage: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['usage'];\n responseMessages: GenerateTextResult<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT\n >['responseMessages'];\n output: GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>['output'];\n }) {\n this.steps = options.steps;\n this.usage = options.usage;\n this.responseMessages = options.responseMessages;\n this.output = options.output;\n }\n\n get finalStep() {\n return this.steps.at(-1)!;\n }\n\n get content() {\n return this.steps.flatMap(step => step.content);\n }\n\n get text() {\n return this.finalStep.text;\n }\n\n get files() {\n return this.steps.flatMap(step => step.files);\n }\n\n get sources() {\n return this.steps.flatMap(step => step.sources);\n }\n\n get toolCalls() {\n return this.steps.flatMap(step => step.toolCalls);\n }\n\n get staticToolCalls() {\n return this.steps.flatMap(step => step.staticToolCalls);\n }\n\n get dynamicToolCalls() {\n return this.steps.flatMap(step => step.dynamicToolCalls);\n }\n\n get toolResults() {\n return this.steps.flatMap(step => step.toolResults);\n }\n\n get staticToolResults() {\n return this.steps.flatMap(step => step.staticToolResults);\n }\n\n get dynamicToolResults() {\n return this.steps.flatMap(step => step.dynamicToolResults);\n }\n\n get finishReason() {\n return this.finalStep.finishReason;\n }\n\n get rawFinishReason() {\n return this.finalStep.rawFinishReason;\n }\n\n get warnings() {\n return this.steps.flatMap(step => step.warnings ?? []);\n }\n\n get reasoning() {\n return this.finalStep.content.filter(\n (part): part is ReasoningOutput | ReasoningFileOutput =>\n part.type === 'reasoning' || part.type === 'reasoning-file',\n );\n }\n\n get reasoningText() {\n return this.finalStep.reasoningText;\n }\n\n get totalUsage() {\n return this.usage;\n }\n\n get request() {\n return this.finalStep.request;\n }\n\n get response() {\n return this.finalStep.response;\n }\n\n get providerMetadata() {\n return this.finalStep.providerMetadata;\n }\n}\n\nfunction resolveSandboxConfig(\n settings: Pick<HarnessAgentSettings, 'sandboxConfig' | 'onSandboxSession'>,\n): HarnessAgentSandboxConfig {\n if (settings.onSandboxSession != null) {\n console.warn(\n 'HarnessAgent: `onSandboxSession` is deprecated. Use `sandboxConfig.onSession` instead.',\n );\n }\n\n return {\n ...settings.sandboxConfig,\n ...(settings.sandboxConfig?.onSession == null &&\n settings.onSandboxSession != null\n ? { onSession: settings.onSandboxSession }\n : {}),\n };\n}\n\nasync function cleanupAfterStartFailure(input: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n ownsSandboxLifecycle: boolean;\n}): Promise<void> {\n if (!input.ownsSandboxLifecycle) return;\n if ('stop' in input.sandboxSession) {\n await Promise.resolve(input.sandboxSession.stop()).catch(() => {});\n }\n}\n","import { safeValidateTypes } from '@ai-sdk/provider-utils';\nimport { HarnessError } from '../../errors/harness-error';\nimport type { HarnessV1, HarnessV1LifecycleState } from '../../v1';\n\n/**\n * Validate a lifecycle state against the harness's contract:\n * - `type` must match the lifecycle method that will consume it.\n * - `specificationVersion` must be `'harness-v1'`.\n * - `harnessId` must match the harness producing/consuming the payload.\n * - When the harness declares a `lifecycleStateSchema`, `data` is parsed\n * against it.\n *\n * Returns the payload with `data` replaced by the parsed value when a\n * schema is present, so callers downstream see a canonical shape.\n */\nexport async function validateLifecycleStateData<\n STATE extends HarnessV1LifecycleState,\n>(input: {\n harness: HarnessV1;\n state: STATE;\n expectedType: STATE['type'];\n}): Promise<STATE> {\n const { harness, state } = input;\n if (state.type !== input.expectedType) {\n throw new HarnessError({\n message: `Lifecycle state has unexpected type '${state.type}'; expected '${input.expectedType}'.`,\n });\n }\n if (state.specificationVersion !== 'harness-v1') {\n throw new HarnessError({\n message: `Lifecycle state has unexpected specificationVersion '${state.specificationVersion}'; expected 'harness-v1'.`,\n });\n }\n if (state.harnessId !== harness.harnessId) {\n throw new HarnessError({\n message: `Lifecycle state was produced by harness '${state.harnessId}' but this agent uses '${harness.harnessId}'.`,\n });\n }\n if (\n state.type === 'resume-session' &&\n 'pendingToolApprovals' in state &&\n state.pendingToolApprovals !== undefined\n ) {\n throw new HarnessError({\n message:\n 'Resume session state cannot contain pending tool approvals; unfinished turns must be stored as `continueFrom`.',\n });\n }\n if (\n state.type === 'resume-session' &&\n 'pendingToolResults' in state &&\n state.pendingToolResults !== undefined\n ) {\n throw new HarnessError({\n message:\n 'Resume session state cannot contain pending tool results; unfinished turns must be stored as `continueFrom`.',\n });\n }\n\n const data =\n harness.lifecycleStateSchema == null\n ? state.data\n : await (async () => {\n const result = await safeValidateTypes({\n value: state.data,\n schema: harness.lifecycleStateSchema!,\n });\n if (!result.success) {\n throw new HarnessError({\n message: `Lifecycle state failed schema validation for harness '${harness.harnessId}': ${result.error.message}`,\n cause: result.error,\n });\n }\n return result.value as STATE['data'];\n })();\n\n if (state.type === 'resume-session') {\n const continueFrom =\n state.continueFrom == null\n ? undefined\n : await validateLifecycleStateData({\n harness,\n state: state.continueFrom,\n expectedType: 'continue-turn',\n });\n\n return {\n type: state.type,\n harnessId: state.harnessId,\n specificationVersion: state.specificationVersion,\n data,\n ...(continueFrom !== undefined ? { continueFrom } : {}),\n } as STATE;\n }\n\n return {\n type: state.type,\n harnessId: state.harnessId,\n specificationVersion: state.specificationVersion,\n data,\n ...(state.pendingToolApprovals !== undefined\n ? { pendingToolApprovals: state.pendingToolApprovals }\n : {}),\n ...(state.pendingToolResults !== undefined\n ? { pendingToolResults: state.pendingToolResults }\n : {}),\n } as STATE;\n}\n","export type HarnessV1BuiltinToolFiltering =\n | {\n mode: 'allow';\n toolNames: string[];\n }\n | {\n mode: 'deny';\n toolNames: string[];\n };\n\nexport function isHarnessV1BuiltinToolIncluded(input: {\n toolName: string;\n toolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n}): boolean {\n if (input.toolFiltering == null) return true;\n return input.toolFiltering.mode === 'allow'\n ? input.toolFiltering.toolNames.includes(input.toolName)\n : !input.toolFiltering.toolNames.includes(input.toolName);\n}\n\nexport function getHarnessV1BuiltinToolFilteringDenialReason(input: {\n toolName: string;\n}): string {\n return `Tool '${input.toolName}' is inactive due to the HarnessAgent tool filtering policy.`;\n}\n","import type { HarnessV1PromptControl } from '../../v1/harness-v1-prompt-control';\nimport type { HarnessV1StreamPart } from '../../v1/harness-v1-stream-part';\n\n/**\n * Bridge an adapter's emit-based event surface into a pull-based\n * `ReadableStream<HarnessV1StreamPart>`.\n *\n * Adapters implement `doPromptTurn` / `doContinueTurn` against an `emit` callback\n * because that is the natural shape when wrapping an SDK that itself produces\n * events. Consumers (notably `HarnessAgent`) prefer a stream because that is\n * the idiomatic AI SDK shape. This helper converts the former into the latter\n * and is agnostic to which turn entry point produced the control surface — the\n * caller supplies an `invoke` thunk that wires `emit` into either method.\n *\n * Lifetime:\n * 1. Calls `invoke(emit)` immediately (which runs `doPromptTurn`/`doContinueTurn`).\n * 2. Every `emit(part)` becomes a stream chunk.\n * 3. When `control.done` resolves, the stream closes — this includes a\n * graceful `doSuspendTurn`, which resolves `done` cleanly after draining.\n * 4. When `control.done` rejects, an `{ type: 'error', error }` part is\n * enqueued and the stream is then closed normally. The rejection is\n * surfaced to consumers as a discriminated-union event rather than as\n * a stream error so iteration code does not need a separate try/catch\n * around the consumer loop.\n * 5. The supplied `abortSignal` (if any) aborts the underlying turn and\n * closes the stream.\n *\n * The returned `control` is the same object the adapter produced and is\n * intended for use by the consumer to submit tool results / approvals /\n * user messages back into the in-flight turn.\n */\nexport async function toHarnessStream(options: {\n invoke: (\n emit: (event: HarnessV1StreamPart) => void,\n ) => PromiseLike<HarnessV1PromptControl>;\n}): Promise<{\n stream: ReadableStream<HarnessV1StreamPart>;\n control: HarnessV1PromptControl;\n}> {\n let controller!: ReadableStreamDefaultController<HarnessV1StreamPart>;\n let closed = false;\n\n const stream = new ReadableStream<HarnessV1StreamPart>({\n start(c) {\n controller = c;\n },\n });\n\n const safeEnqueue = (part: HarnessV1StreamPart) => {\n if (closed) return;\n controller.enqueue(part);\n };\n\n const safeClose = () => {\n if (closed) return;\n closed = true;\n controller.close();\n };\n\n const control = await options.invoke(safeEnqueue);\n\n Promise.resolve(control.done)\n .then(\n () => safeClose(),\n (err: unknown) => {\n safeEnqueue({ type: 'error', error: err });\n safeClose();\n },\n )\n // Belt-and-suspenders: any throw inside the handlers themselves should\n // not become an unhandled rejection.\n .catch(() => {});\n\n return { stream, control };\n}\n","import {\n getHarnessV1BuiltinToolFilteringDenialReason,\n isHarnessV1BuiltinToolIncluded,\n type HarnessV1,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1PendingToolApproval,\n type HarnessV1PendingToolResult,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResponseFormat,\n type HarnessV1Session,\n type HarnessV1StreamPart,\n type HarnessV1ToolSpec,\n} from '../../v1';\nimport { toHarnessStream } from './to-harness-stream';\nimport {\n executeTool,\n generateId,\n isExecutableTool,\n safeParseJSON,\n type Context,\n type Experimental_SandboxSession as SandboxSession,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport {\n getErrorMessage,\n type LanguageModelV4FinishReason,\n type LanguageModelV4ToolCall,\n type LanguageModelV4Usage,\n} from '@ai-sdk/provider';\nimport { parseToolCall } from 'ai/internal';\nimport type {\n ContentPart,\n OutputInterface as Output,\n ProviderMetadata,\n StepResult,\n StopCondition,\n TelemetryOptions,\n TextStreamPart,\n} from 'ai';\nimport type { HarnessAgentToolApprovalContinuation } from '../harness-agent-tool-approval-continuation';\nimport type { HarnessAgentToolResultContinuation } from '../harness-agent-tool-result-continuation';\nimport type { HarnessAgentToolApprovalConfiguration } from '../harness-agent-settings';\nimport { HarnessStreamTextResult } from './harness-stream-text-result';\nimport { translateStreamPart } from './translate-stream-part';\nimport { stripWorkDir } from './strip-work-dir';\nimport {\n createTurnTelemetry,\n type TurnContentPart,\n type TurnTelemetry,\n} from './turn-telemetry';\nimport { resolveCustomToolApproval } from './permission-mode';\nimport { logBridgeError } from '../../utils/bridge-diagnostics';\nimport { pinSandboxChannelEventCheckpoint } from '../../utils/sandbox-channel';\n\n/**\n * Drive one prompt turn end-to-end:\n * - call `session.doPromptTurn` via `toHarnessStream`\n * - translate harness events to AI SDK `TextStreamPart`s and push into the\n * result object\n * - execute host-side user tools when their `tool-call` events arrive and\n * submit results back to the harness\n * - close the result when the harness signals `finish` (or on error)\n *\n * Returns the result synchronously after the stream is wired up; callers\n * await its `PromiseLike` accessors to observe completion.\n */\nexport function runPrompt<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n>(input: {\n harness: HarnessV1;\n session: HarnessV1Session;\n /**\n * Turn entry point. `'prompt'` (default) starts a new turn from `prompt`;\n * `'continue'` continues the in-flight turn via `doContinueTurn` and ignores\n * `prompt`.\n */\n mode?: 'prompt' | 'continue';\n /** Required for `mode: 'prompt'`; absent for `mode: 'continue'`. */\n prompt?: HarnessV1Prompt;\n instructions: string | undefined;\n tools: TOOLS;\n activeTools?: ToolSet;\n toolSpecs: HarnessV1ToolSpec[];\n builtinToolFiltering?: HarnessV1BuiltinToolFiltering | undefined;\n sandboxSession: SandboxSession;\n sessionWorkDir: string;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat?: HarnessV1ResponseFormat | undefined;\n output?: OUTPUT | undefined;\n telemetry?: TelemetryOptions | undefined;\n stopConditions?: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApproval?: HarnessAgentToolApprovalConfiguration | undefined;\n pendingToolApprovals?: readonly HarnessV1PendingToolApproval[];\n pendingToolResults?: readonly HarnessV1PendingToolResult[];\n toolApprovalContinuations?:\n | readonly HarnessAgentToolApprovalContinuation[]\n | undefined;\n toolResultContinuations?:\n | readonly HarnessAgentToolResultContinuation[]\n | undefined;\n onPendingToolApproval?: (approval: HarnessV1PendingToolApproval) => void;\n onToolApprovalSettled?: (approvalId: string) => void;\n onPendingToolResult?: (pendingResult: HarnessV1PendingToolResult) => void;\n onToolResultSettled?: (toolCallId: string) => void;\n onTurnFinished?: () => void;\n onTurnFailed?: () => void;\n onPromptControlAvailable?: (control: HarnessV1PromptControl) => void;\n /**\n * Reports that the adapter stream closed because the host intentionally\n * suspended the still-running turn at a workflow slice boundary.\n */\n isTurnSuspending?: () => boolean;\n onStopConditionMet?: () => Promise<void>;\n}): {\n result: HarnessStreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n done: Promise<void>;\n} {\n const result = new HarnessStreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n tools: input.tools,\n runtimeContext: input.runtimeContext,\n // toolsContext is not configurable for harnesses; pass undefined cast.\n toolsContext: undefined as never,\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n output: input.output,\n });\n const pendingToolApprovals = input.pendingToolApprovals ?? [];\n const pendingToolResults = input.pendingToolResults ?? [];\n const onPendingToolApproval = input.onPendingToolApproval ?? (() => {});\n const onToolApprovalSettled = input.onToolApprovalSettled ?? (() => {});\n const onPendingToolResult = input.onPendingToolResult ?? (() => {});\n const onToolResultSettled = input.onToolResultSettled ?? (() => {});\n const activeTools = input.activeTools ?? input.tools;\n\n const telemetry = createTurnTelemetry({\n telemetry: input.telemetry,\n harnessId: input.harness.harnessId,\n modelId: input.session.modelId,\n instructions: input.instructions,\n promptText: input.prompt != null ? promptToText(input.prompt) : '',\n runtimeContext: input.runtimeContext,\n });\n\n /*\n * Settle a failed turn. When the caller's own `abortSignal` has fired, the\n * failure is a user-initiated stop, not an error: surface it as an `abort`\n * stream part — matching `streamText`'s abort contract — so\n * `toUIMessageStream` consumers observe an `abort` chunk and\n * `isAborted: true` instead of a spurious `onError`. Every other failure\n * stays a real `error` part. Both outcomes notify `onTurnFailed` so the\n * session's turn tracking returns to idle and the session stays usable,\n * unless the turn is being suspended for a future continuation.\n */\n const settleFailure = (err: unknown) => {\n if (!input.isTurnSuspending?.()) {\n input.onTurnFailed?.();\n }\n if (input.abortSignal?.aborted) {\n result.abort({\n error: err,\n ...(input.abortSignal.reason !== undefined\n ? { reason: getErrorMessage(input.abortSignal.reason) }\n : {}),\n });\n return;\n }\n result.fail(err);\n };\n\n const done = (async () => {\n let bridge: Awaited<ReturnType<typeof toHarnessStream>>;\n try {\n bridge = await toHarnessStream({\n invoke:\n input.mode === 'continue'\n ? emit =>\n input.session.doContinueTurn({\n responseFormat: input.responseFormat,\n tools: input.toolSpecs,\n instructions: input.instructions,\n abortSignal: input.abortSignal,\n emit,\n })\n : emit => {\n if (input.prompt == null) {\n throw new Error(\n 'runPrompt: `prompt` is required for mode \"prompt\".',\n );\n }\n return input.session.doPromptTurn({\n prompt: input.prompt,\n responseFormat: input.responseFormat,\n tools: input.toolSpecs,\n instructions: input.instructions,\n abortSignal: input.abortSignal,\n emit,\n });\n },\n });\n } catch (err) {\n await telemetry.error(err);\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'failed to start harness turn',\n error: err,\n });\n settleFailure(err);\n return;\n }\n\n const { stream, control } = bridge;\n input.onPromptControlAvailable?.(control);\n const reader = stream.getReader();\n const toolCallsByToolCallId = new Map<string, ToolCallTextStreamPart>();\n const rawToolCallsByToolCallId = new Map<\n string,\n Extract<HarnessV1StreamPart, { type: 'tool-call' }>\n >();\n /*\n * Host results are echoed back as `tool-result` events too, so the event\n * alone cannot say who ran the tool — classify by the originating\n * `tool-call`. Only an explicit `true` counts: `LanguageModelV4ToolCall`\n * defines an omitted flag as client-executed. A call missing from the map\n * arrived in an earlier slice, where nothing here can classify it.\n */\n const translateOptions = {\n isProviderExecuted: (toolCallId: string): boolean => {\n const rawToolCall = rawToolCallsByToolCallId.get(toolCallId);\n return rawToolCall == null || rawToolCall.providerExecuted === true;\n },\n };\n const pendingApprovalsByApprovalId = new Map(\n pendingToolApprovals.map(approval => [approval.approvalId, approval]),\n );\n const pendingApprovalsByToolCallId = new Map(\n pendingToolApprovals.map(approval => [approval.toolCallId, approval]),\n );\n const continuationsByApprovalId = new Map(\n (input.toolApprovalContinuations ?? []).map(continuation => [\n continuation.approvalResponse.approvalId,\n continuation,\n ]),\n );\n const pendingResultsByToolCallId = new Map(\n pendingToolResults.map(pendingResult => [\n pendingResult.toolCallId,\n pendingResult,\n ]),\n );\n const continuationsByToolCallId = new Map(\n (input.toolResultContinuations ?? []).map(continuation => [\n continuation.toolCallId,\n continuation,\n ]),\n );\n const settledHostToolCallIds = new Set<string>();\n let closingResumedStep = false;\n let pendingStopBoundary:\n | {\n finishReason: LanguageModelV4FinishReason;\n usage: LanguageModelV4Usage;\n releaseCheckpoint: (() => void) | undefined;\n }\n | undefined;\n let finalFinish:\n | Extract<HarnessV1StreamPart, { type: 'finish' }>\n | undefined;\n const completedSteps: Array<StepResult<TOOLS, RUNTIME_CONTEXT>> = [];\n const outstandingHostToolExecutions: Promise<void>[] = [];\n const startHostToolExecution = (execution: Promise<void>): void => {\n outstandingHostToolExecutions.push(execution);\n // The execution is joined at the next step boundary. Attach a rejection\n // handler immediately so failures cannot become unhandled in the\n // meantime; awaiting the original promise still propagates the failure.\n void execution.catch(() => {});\n };\n const waitForOutstandingHostToolExecutions = async (): Promise<void> => {\n if (outstandingHostToolExecutions.length === 0) return;\n const executions = outstandingHostToolExecutions.splice(0);\n const results = await Promise.allSettled(executions);\n const failedExecution = results.find(\n result => result.status === 'rejected',\n );\n if (failedExecution != null) {\n throw failedExecution.reason;\n }\n };\n const releasePendingStopBoundary = (): void => {\n pendingStopBoundary?.releaseCheckpoint?.();\n pendingStopBoundary = undefined;\n };\n\n // Accumulate the model's output content per step so telemetry can record\n // `gen_ai.output.messages` and reporters can log what was actually said.\n let stepText = '';\n let stepReasoning = '';\n let stepToolCalls: TurnContentPart[] = [];\n const buildStepContent = (): TurnContentPart[] => {\n const parts: TurnContentPart[] = [];\n if (stepText) parts.push({ type: 'text', text: stepText });\n if (stepReasoning) parts.push({ type: 'reasoning', text: stepReasoning });\n parts.push(...stepToolCalls);\n return parts;\n };\n const resetStepContent = (): void => {\n stepText = '';\n stepReasoning = '';\n stepToolCalls = [];\n };\n const zeroUsage: LanguageModelV4Usage = {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined,\n },\n };\n const toolCallsFinishReason: LanguageModelV4FinishReason = {\n unified: 'tool-calls',\n raw: undefined,\n };\n const completeStep = async (input: {\n finishReason: LanguageModelV4FinishReason;\n usage: LanguageModelV4Usage;\n providerMetadata: ProviderMetadata | undefined;\n }): Promise<StepResult<TOOLS, RUNTIME_CONTEXT>> => {\n await telemetry.stepFinish({\n finishReason: input.finishReason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n content: buildStepContent(),\n });\n resetStepContent();\n const step = result.finishStep({\n finishReason: input.finishReason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n warnings: [],\n });\n completedSteps.push(step);\n return step;\n };\n const finishForHostInputPause = async (options: {\n completeCurrentStep: boolean;\n }): Promise<void> => {\n await waitForOutstandingHostToolExecutions();\n if (options.completeCurrentStep) {\n await completeStep({\n finishReason: toolCallsFinishReason,\n usage: zeroUsage,\n providerMetadata: undefined,\n });\n }\n await telemetry.end({\n finishReason: toolCallsFinishReason,\n usage: zeroUsage,\n });\n await result.finish();\n };\n const enqueueApprovalRequest = (approval: {\n approvalId: string;\n toolCall: ToolCallTextStreamPart;\n isAutomatic?: boolean;\n }): void => {\n result.enqueue({\n type: 'tool-approval-request',\n approvalId: approval.approvalId,\n toolCall: approval.toolCall,\n ...(approval.isAutomatic !== undefined\n ? { isAutomatic: approval.isAutomatic }\n : {}),\n } as TextStreamPart<TOOLS>);\n };\n const enqueueAutomaticApprovalResponse = (input: {\n approvalId: string;\n toolCall: ToolCallTextStreamPart;\n approved: boolean;\n reason?: string;\n providerExecuted?: boolean;\n }): void => {\n result.enqueue({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n toolCall: input.toolCall,\n approved: input.approved,\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n ...(input.providerExecuted !== undefined\n ? { providerExecuted: input.providerExecuted }\n : {}),\n } as TextStreamPart<TOOLS>);\n };\n const enqueueApprovalResponse = (\n approval: HarnessV1PendingToolApproval,\n continuation: HarnessAgentToolApprovalContinuation,\n ): void => {\n result.enqueueContinuation({\n type: 'tool-approval-response',\n approvalId: approval.approvalId,\n toolCall: continuation.toolCall,\n approved: continuation.approvalResponse.approved,\n ...(continuation.approvalResponse.reason !== undefined\n ? { reason: continuation.approvalResponse.reason }\n : {}),\n ...(approval.providerExecuted !== undefined\n ? { providerExecuted: approval.providerExecuted }\n : {}),\n } as TextStreamPart<TOOLS>);\n };\n const recordPendingToolResult = (options: {\n toolCall: Extract<HarnessV1StreamPart, { type: 'tool-call' }>;\n }): HarnessV1PendingToolResult => {\n const pendingResult =\n pendingResultsByToolCallId.get(options.toolCall.toolCallId) ??\n ({\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: options.toolCall.input,\n } satisfies HarnessV1PendingToolResult);\n pendingResultsByToolCallId.set(pendingResult.toolCallId, pendingResult);\n onPendingToolResult(pendingResult);\n return pendingResult;\n };\n const processPendingToolResultContinuation = async (\n pendingResult: HarnessV1PendingToolResult,\n continuation: HarnessAgentToolResultContinuation,\n ): Promise<void> => {\n onToolResultSettled(pendingResult.toolCallId);\n pendingResultsByToolCallId.delete(pendingResult.toolCallId);\n settledHostToolCallIds.add(pendingResult.toolCallId);\n await control.submitToolResult({\n toolCallId: pendingResult.toolCallId,\n output: continuation.output,\n isError: continuation.isError,\n });\n };\n const enqueueHostToolOutcome = (options: {\n toolCall: HarnessAgentToolApprovalContinuation['toolCall'];\n outcome: HostToolOutcome;\n }): void => {\n if (options.outcome.ok) {\n const stripped = stripWorkDir(\n {\n type: 'tool-result',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n result: options.outcome.output as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n },\n input.sessionWorkDir,\n ) as Extract<HarnessV1StreamPart, { type: 'tool-result' }>;\n result.enqueueContinuation({\n type: 'tool-result',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: options.toolCall.input,\n output: stripped.result,\n } as TextStreamPart<TOOLS>);\n return;\n }\n\n result.enqueueContinuation({\n type: 'tool-error',\n toolCallId: options.toolCall.toolCallId,\n toolName: options.toolCall.toolName,\n input: options.toolCall.input,\n error: options.outcome.error,\n } as TextStreamPart<TOOLS>);\n };\n const processPendingApprovalContinuation = async (\n approval: HarnessV1PendingToolApproval,\n continuation: HarnessAgentToolApprovalContinuation,\n ): Promise<'continued' | 'awaiting-tool-result'> => {\n enqueueApprovalResponse(approval, continuation);\n onToolApprovalSettled(approval.approvalId);\n pendingApprovalsByApprovalId.delete(approval.approvalId);\n pendingApprovalsByToolCallId.delete(approval.toolCallId);\n settledHostToolCallIds.add(approval.toolCallId);\n\n if (approval.kind === 'builtin') {\n if (control.submitToolApproval == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted a built-in tool approval request but does not support approval responses.`,\n );\n }\n await control.submitToolApproval({\n approvalId: approval.approvalId,\n approved: continuation.approvalResponse.approved,\n reason: continuation.approvalResponse.reason,\n });\n return 'continued';\n }\n\n if (!continuation.approvalResponse.approved) {\n await control.submitToolResult({\n toolCallId: approval.toolCallId,\n output: {\n type: 'execution-denied',\n reason: continuation.approvalResponse.reason,\n },\n });\n return 'continued';\n }\n\n const rawToolCall =\n rawToolCallsByToolCallId.get(approval.toolCallId) ??\n ({\n type: 'tool-call',\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n input: approval.input,\n } satisfies Extract<HarnessV1StreamPart, { type: 'tool-call' }>);\n\n await telemetry.start(input.session.modelId);\n await telemetry.toolStart({\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n input: rawToolCall.input,\n });\n const execution = await maybeExecuteHostTool({\n event: rawToolCall,\n tools: activeTools,\n wrappedExecuteTool: telemetry.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n control,\n onPreliminaryResult: preliminaryOutput => {\n const stripped = stripWorkDir(\n {\n type: 'tool-result',\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n result: preliminaryOutput as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n },\n input.sessionWorkDir,\n ) as Extract<HarnessV1StreamPart, { type: 'tool-result' }>;\n result.enqueue({\n type: 'tool-result',\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n input: undefined,\n output: stripped.result,\n preliminary: true,\n } as TextStreamPart<TOOLS>);\n },\n });\n if (!execution.executed) {\n recordPendingToolResult({ toolCall: rawToolCall });\n await finishForHostInputPause({ completeCurrentStep: false });\n return 'awaiting-tool-result';\n }\n enqueueHostToolOutcome({\n toolCall: continuation.toolCall,\n outcome: execution.outcome,\n });\n await telemetry.toolEnd(rawToolCall.toolCallId, execution.outcome);\n return 'continued';\n };\n\n try {\n for (const approval of pendingToolApprovals) {\n const continuation = continuationsByApprovalId.get(approval.approvalId);\n if (continuation != null) {\n const outcome = await processPendingApprovalContinuation(\n approval,\n continuation,\n );\n if (outcome === 'awaiting-tool-result') return;\n closingResumedStep = true;\n }\n }\n for (const pendingResult of pendingToolResults) {\n const continuation = continuationsByToolCallId.get(\n pendingResult.toolCallId,\n );\n if (continuation != null) {\n await processPendingToolResultContinuation(\n pendingResult,\n continuation,\n );\n closingResumedStep = true;\n }\n }\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n releasePendingStopBoundary();\n break;\n }\n if (value == null) continue;\n\n if (pendingStopBoundary != null) {\n if (value.type === 'finish') {\n releasePendingStopBoundary();\n } else if (\n (\n await Promise.all(\n input.stopConditions!.map(condition =>\n condition({ steps: completedSteps }),\n ),\n )\n ).some(Boolean)\n ) {\n await input.onStopConditionMet?.();\n const { finishReason, usage } = pendingStopBoundary;\n releasePendingStopBoundary();\n await telemetry.end({ finishReason, usage });\n await result.finish();\n return;\n } else {\n releasePendingStopBoundary();\n }\n }\n\n // Begin the operation span on stream-start, using the runtime-resolved\n // model the adapter reports (falling back to the session's model).\n if (value.type === 'stream-start') {\n await telemetry.start(value.modelId ?? input.session.modelId);\n }\n\n // Open a step span lazily before the first content of each step.\n if (\n value.type !== 'stream-start' &&\n value.type !== 'finish-step' &&\n value.type !== 'finish' &&\n value.type !== 'error'\n ) {\n await telemetry.ensureStepOpen();\n }\n\n /*\n * Strip the session working-directory prefix for everything the\n * consumer sees. The original `value` is kept intact for host tool\n * execution below — the tools need the absolute path to resolve\n * against the sandbox root, so the strip is display-only.\n */\n const displayValue = stripWorkDir(value, input.sessionWorkDir);\n const settledHostInputReplay =\n (displayValue.type === 'tool-call' ||\n displayValue.type === 'tool-result' ||\n displayValue.type === 'tool-approval-request') &&\n settledHostToolCallIds.has(displayValue.toolCallId);\n\n if (settledHostInputReplay) {\n continue;\n }\n\n if (displayValue.type === 'finish-step' && closingResumedStep) {\n closingResumedStep = false;\n resetStepContent();\n result.discardCurrentStepContent();\n continue;\n }\n\n if (displayValue.type === 'tool-approval-request') {\n const toolCall = toolCallsByToolCallId.get(displayValue.toolCallId);\n if (toolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted approval request '${displayValue.approvalId}' for unknown tool call '${displayValue.toolCallId}'.`,\n );\n }\n const rawToolCall = rawToolCallsByToolCallId.get(\n displayValue.toolCallId,\n );\n const toolName = rawToolCall?.toolName ?? toolCall.toolName;\n if (\n !isHarnessV1BuiltinToolIncluded({\n toolName,\n toolFiltering: input.builtinToolFiltering,\n })\n ) {\n if (control.submitToolApproval == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted a built-in tool approval request but does not support approval responses.`,\n );\n }\n await control.submitToolApproval({\n approvalId: displayValue.approvalId,\n approved: false,\n reason: getHarnessV1BuiltinToolFilteringDenialReason({\n toolName,\n }),\n });\n continue;\n }\n }\n\n /*\n * Settle failures before the translate-and-forward step below: the\n * translated `error` part must not reach the consumer stream, or the\n * turn surfaces BOTH a forwarded `error` part and the settle-owned\n * terminal part (an `abort` part for user stops via `settleFailure`,\n * or a second `error` part from `fail`).\n */\n if (value.type === 'error' && displayValue.type === 'error') {\n await waitForOutstandingHostToolExecutions();\n // Telemetry and stderr diagnostics keep the raw error (absolute\n // paths help debugging); the consumer-facing settle uses the\n // workDir-stripped one, like every other forwarded part.\n await telemetry.error(value.error);\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'harness stream error',\n error: value.error,\n });\n settleFailure(displayValue.error);\n return;\n }\n\n // Forward to consumer as soon as possible.\n for (const part of translateStreamPart<TOOLS>(\n displayValue,\n translateOptions,\n )) {\n result.enqueue(part);\n }\n\n // Tool-call validation lives here (not in translateStreamPart) because\n // schema parsing is async and needs the merged tool set in scope.\n if (displayValue.type === 'tool-call') {\n const parsed = await validateToolCall<TOOLS>({\n event: displayValue,\n tools: input.tools,\n });\n const parsedToolCall = asToolCallTextStreamPart({ part: parsed });\n rawToolCallsByToolCallId.set(displayValue.toolCallId, displayValue);\n toolCallsByToolCallId.set(displayValue.toolCallId, parsedToolCall);\n result.enqueue(parsed);\n }\n\n // Accumulate output content for telemetry / reporters.\n if (value.type === 'text-delta') {\n stepText += value.delta;\n } else if (value.type === 'reasoning-delta') {\n stepReasoning += value.delta;\n }\n\n // Telemetry: a tool execution begins on its `tool-call`.\n if (value.type === 'tool-call') {\n stepToolCalls.push({\n type: 'tool-call',\n toolCallId: value.toolCallId,\n toolName: value.toolName,\n input: value.input,\n });\n await telemetry.toolStart({\n toolCallId: value.toolCallId,\n toolName: value.toolName,\n input: value.input,\n });\n }\n\n // Telemetry: close a tool span when its provider-executed result lands.\n if (value.type === 'tool-result') {\n await telemetry.toolEnd(\n value.toolCallId,\n value.isError\n ? { ok: false, error: value.result }\n : { ok: true, output: value.result },\n );\n }\n\n if (value.type === 'tool-approval-request') {\n const toolCall = toolCallsByToolCallId.get(value.toolCallId);\n if (toolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' emitted approval request '${value.approvalId}' for unknown tool call '${value.toolCallId}'.`,\n );\n }\n\n const rawToolCall = rawToolCallsByToolCallId.get(value.toolCallId);\n const pendingApproval =\n pendingApprovalsByApprovalId.get(value.approvalId) ??\n ({\n approvalId: value.approvalId,\n toolCallId: value.toolCallId,\n toolName: toolCall.toolName,\n input: rawToolCall?.input ?? JSON.stringify(toolCall.input),\n kind: 'builtin',\n providerExecuted: rawToolCall?.providerExecuted ?? true,\n ...(rawToolCall?.nativeName !== undefined\n ? { nativeName: rawToolCall.nativeName }\n : {}),\n } satisfies HarnessV1PendingToolApproval);\n pendingApprovalsByApprovalId.set(\n pendingApproval.approvalId,\n pendingApproval,\n );\n pendingApprovalsByToolCallId.set(\n pendingApproval.toolCallId,\n pendingApproval,\n );\n\n const continuation = continuationsByApprovalId.get(\n pendingApproval.approvalId,\n );\n if (continuation != null) {\n const outcome = await processPendingApprovalContinuation(\n pendingApproval,\n continuation,\n );\n if (outcome === 'awaiting-tool-result') return;\n closingResumedStep = true;\n continue;\n }\n\n onPendingToolApproval(pendingApproval);\n enqueueApprovalRequest({\n approvalId: pendingApproval.approvalId,\n toolCall,\n });\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n\n // Drive step boundaries.\n if (value.type === 'finish-step') {\n await waitForOutstandingHostToolExecutions();\n await completeStep({\n finishReason: value.finishReason,\n usage: value.usage,\n providerMetadata: value.harnessMetadata,\n });\n if (input.stopConditions != null && input.stopConditions.length > 0) {\n pendingStopBoundary = {\n finishReason: value.finishReason,\n usage: value.usage,\n releaseCheckpoint: pinSandboxChannelEventCheckpoint(value),\n };\n }\n }\n\n if (value.type === 'finish') {\n await waitForOutstandingHostToolExecutions();\n finalFinish = value;\n await telemetry.end({\n finishReason: value.finishReason,\n usage: value.totalUsage,\n });\n }\n\n // Execute host-side tools when the harness asks for one.\n if (value.type === 'tool-call' && !value.providerExecuted) {\n const toolCall = value;\n const parsedToolCall = toolCallsByToolCallId.get(toolCall.toolCallId);\n if (parsedToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not find parsed tool call '${toolCall.toolCallId}' for custom tool approval.`,\n );\n }\n if (!hasTool({ tools: activeTools, toolName: toolCall.toolName })) {\n const output = {\n type: 'execution-denied',\n reason: getHarnessV1BuiltinToolFilteringDenialReason({\n toolName: toolCall.toolName,\n }),\n };\n await control.submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n await telemetry.toolEnd(toolCall.toolCallId, { ok: true, output });\n continue;\n }\n const customToolApprovalDecision = resolveCustomToolApproval({\n toolName: toolCall.toolName,\n toolApproval: input.toolApproval,\n });\n if (customToolApprovalDecision.type === 'deny') {\n const approvalId = generateId();\n enqueueApprovalRequest({\n approvalId,\n toolCall: parsedToolCall,\n isAutomatic: true,\n });\n enqueueAutomaticApprovalResponse({\n approvalId,\n toolCall: parsedToolCall,\n approved: false,\n reason: customToolApprovalDecision.reason,\n providerExecuted: false,\n });\n const output = {\n type: 'execution-denied',\n reason: customToolApprovalDecision.reason,\n };\n await control.submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n await telemetry.toolEnd(toolCall.toolCallId, { ok: true, output });\n continue;\n }\n const pendingApproval =\n pendingApprovalsByToolCallId.get(toolCall.toolCallId) ??\n (customToolApprovalDecision.type === 'request'\n ? ({\n approvalId: generateId(),\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n kind: 'custom',\n providerExecuted: false,\n ...(toolCall.nativeName !== undefined\n ? { nativeName: toolCall.nativeName }\n : {}),\n } satisfies HarnessV1PendingToolApproval)\n : undefined);\n if (pendingApproval != null) {\n pendingApprovalsByApprovalId.set(\n pendingApproval.approvalId,\n pendingApproval,\n );\n pendingApprovalsByToolCallId.set(\n pendingApproval.toolCallId,\n pendingApproval,\n );\n const continuation = continuationsByApprovalId.get(\n pendingApproval.approvalId,\n );\n if (continuation != null) {\n const outcome = await processPendingApprovalContinuation(\n pendingApproval,\n continuation,\n );\n if (outcome === 'awaiting-tool-result') return;\n closingResumedStep = true;\n continue;\n }\n const pendingParsedToolCall = toolCallsByToolCallId.get(\n pendingApproval.toolCallId,\n );\n if (pendingParsedToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not find parsed tool call '${pendingApproval.toolCallId}' for approval request '${pendingApproval.approvalId}'.`,\n );\n }\n onPendingToolApproval(pendingApproval);\n enqueueApprovalRequest({\n approvalId: pendingApproval.approvalId,\n toolCall: pendingParsedToolCall,\n });\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n if (!isExecutableTool(activeTools[toolCall.toolName])) {\n recordPendingToolResult({ toolCall });\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n startHostToolExecution(\n (async () => {\n const execution = await maybeExecuteHostTool({\n event: toolCall,\n tools: activeTools,\n wrappedExecuteTool: telemetry.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n control,\n onPreliminaryResult: preliminaryOutput => {\n /*\n * Project a `yield`ed value as a preliminary AI SDK\n * `tool-result` part. Unlike the final result — which is\n * submitted to the runtime, echoed back as a `tool-result`\n * event, and stripped on its way through the loop above —\n * preliminary values never reach the runtime, so strip the\n * working directory here to match the final result's projection.\n */\n const stripped = stripWorkDir(\n {\n type: 'tool-result',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n result: preliminaryOutput as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n },\n input.sessionWorkDir,\n ) as Extract<HarnessV1StreamPart, { type: 'tool-result' }>;\n result.enqueue({\n type: 'tool-result',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: undefined,\n output: stripped.result,\n preliminary: true,\n } as TextStreamPart<TOOLS>);\n },\n });\n if (!execution.executed) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not execute host tool '${toolCall.toolName}'.`,\n );\n }\n await telemetry.toolEnd(toolCall.toolCallId, execution.outcome);\n })(),\n );\n }\n }\n await waitForOutstandingHostToolExecutions();\n const isTurnSuspending = input.isTurnSuspending?.() === true;\n if (isTurnSuspending) {\n if (finalFinish == null) {\n /*\n * A timed slice may stop in the middle of a model step. Its partial\n * content remains in the bridge replay log for the next slice, but it\n * cannot form a valid StepResult in this slice because no finish-step\n * has arrived yet.\n */\n result.discardCurrentStepContent();\n }\n } else if (finalFinish != null) {\n input.onTurnFinished?.();\n } else {\n input.onTurnFailed?.();\n }\n await result.finish(\n finalFinish\n ? {\n finishReason: finalFinish.finishReason,\n totalUsage: finalFinish.totalUsage,\n providerMetadata: finalFinish.harnessMetadata,\n }\n : undefined,\n );\n } catch (err) {\n try {\n await waitForOutstandingHostToolExecutions();\n } catch {\n // Preserve the error that stopped the reader loop.\n }\n await telemetry.error(err);\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'harness turn failed',\n error: err,\n });\n settleFailure(err);\n } finally {\n releasePendingStopBoundary();\n reader.releaseLock();\n }\n })();\n\n // Swallow the loop's rejection at the top level — failures are observable\n // via the result's `fullStream` `error` part and rejected promise\n // accessors. We do not want the orphan promise to become an unhandled\n // rejection.\n done.catch(() => {});\n\n return { result, done };\n}\n\ntype HostToolOutcome =\n | { ok: true; output: unknown }\n | { ok: false; error: unknown };\n\ntype HostToolExecution =\n | { executed: false }\n | { executed: true; outcome: HostToolOutcome };\n\nfunction asToolCallTextStreamPart<TOOLS extends ToolSet>(input: {\n part: TextStreamPart<TOOLS>;\n}): ToolCallTextStreamPart {\n if (input.part.type !== 'tool-call') {\n throw new Error(\n `Expected parsed tool-call stream part, got '${input.part.type}'.`,\n );\n }\n return input.part as ToolCallTextStreamPart;\n}\n\ntype ToolCallTextStreamPart = {\n readonly type: 'tool-call';\n readonly toolCallId: string;\n readonly toolName: string;\n readonly input: unknown;\n readonly providerExecuted?: boolean;\n readonly providerMetadata?: unknown;\n readonly dynamic?: boolean;\n readonly invalid?: boolean;\n readonly error?: unknown;\n readonly title?: string;\n};\n\nfunction hasTool(input: { tools: ToolSet; toolName: string }): boolean {\n return Object.prototype.hasOwnProperty.call(input.tools, input.toolName);\n}\n\nasync function maybeExecuteHostTool<TOOLS extends ToolSet>(input: {\n event: { toolCallId: string; toolName: string; input: string };\n tools: TOOLS;\n wrappedExecuteTool: TurnTelemetry['executeTool'];\n sandboxSession: SandboxSession;\n abortSignal: AbortSignal | undefined;\n control: HarnessV1PromptControl;\n /**\n * Called for each value a generator `execute` `yield`s before its last. The\n * caller surfaces these as preliminary `tool-result` parts on the consumer\n * stream. Never called for a plain (non-generator) `execute`.\n */\n onPreliminaryResult: (output: unknown) => void;\n}): Promise<HostToolExecution> {\n const tool = input.tools[input.event.toolName];\n\n if (!isExecutableTool(tool)) return { executed: false };\n\n const parsed = await safeParseJSON({ text: input.event.input });\n const args = parsed.success ? parsed.value : input.event.input;\n\n try {\n /*\n * Normalize the tool's return value through `executeTool`, the same helper\n * the non-harness AI SDK uses, so generator `execute` functions behave\n * identically here: each `yield`ed value arrives as a `preliminary` part\n * and the last `yield` is re-emitted as the `final` part; a plain value or\n * Promise arrives as a single `final` part. The underlying runtimes accept\n * exactly one tool result per call, so only the final value is submitted\n * back to the model — preliminary values are surfaced to the consumer\n * stream alone, matching how the AI SDK treats `onPreliminaryToolResult`.\n */\n const output = await input.wrappedExecuteTool({\n toolCallId: input.event.toolCallId,\n execute: async () => {\n let output: unknown;\n const stream = executeTool({\n tool,\n input: args as never,\n options: {\n toolCallId: input.event.toolCallId,\n messages: [],\n abortSignal: input.abortSignal,\n context: undefined as never,\n experimental_sandbox: input.sandboxSession,\n },\n });\n for await (const part of stream) {\n if (part.type === 'preliminary') {\n input.onPreliminaryResult(part.output);\n } else {\n output = part.output;\n }\n }\n return output;\n },\n });\n\n await input.control.submitToolResult({\n toolCallId: input.event.toolCallId,\n output,\n });\n return { executed: true, outcome: { ok: true, output } };\n } catch (err) {\n await input.control.submitToolResult({\n toolCallId: input.event.toolCallId,\n output: { error: String(err) },\n isError: true,\n });\n return { executed: true, outcome: { ok: false, error: err } };\n }\n}\n\n/*\n * Validate an inbound `tool-call` event against the merged tool set's schema\n * using the AI SDK's canonical `parseToolCall`. Returns an AI SDK `tool-call`\n * stream part with parsed input on success, or a `dynamic + invalid: true`\n * part on failure (unknown tool, schema mismatch, malformed JSON).\n *\n * The harness `tool-call` event is structurally a `LanguageModelV4ToolCall`\n * (plus an optional harness-only `nativeName`). `providerExecuted` already\n * lives on the V4 type — `true` for adapter builtins (Claude Code's `Bash`,\n * Codex's `shell`), false/undefined for host tools — and is passed through\n * to the AI SDK part by `parseToolCall`.\n */\nexport async function validateToolCall<TOOLS extends ToolSet>(args: {\n event: Extract<HarnessV1StreamPart, { type: 'tool-call' }>;\n tools: TOOLS;\n}): Promise<TextStreamPart<TOOLS>> {\n const { event, tools } = args;\n const toolCall: LanguageModelV4ToolCall = {\n type: 'tool-call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.input,\n ...(event.providerExecuted !== undefined\n ? { providerExecuted: event.providerExecuted }\n : {}),\n ...(event.dynamic !== undefined ? { dynamic: event.dynamic } : {}),\n ...(event.providerMetadata !== undefined\n ? { providerMetadata: event.providerMetadata }\n : {}),\n };\n\n const parsed = await parseToolCall<TOOLS>({\n toolCall,\n tools,\n repairToolCall: undefined,\n refineToolInput: undefined,\n instructions: undefined,\n messages: [],\n });\n\n return parsed as TextStreamPart<TOOLS>;\n}\n\n/** Best-effort plain text of the turn's prompt, for telemetry input messages. */\nfunction promptToText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const content = (prompt as { content?: unknown }).content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n return content\n .filter(\n (part): part is { type: 'text'; text: string } =>\n typeof part === 'object' &&\n part != null &&\n (part as { type?: unknown }).type === 'text',\n )\n .map(part => part.text)\n .join('');\n }\n return '';\n}\n\n// keep import bound so unused-but-needed type stays cited\nexport type _ContentPartMarker<T extends ToolSet> = ContentPart<T>;\n","import {\n DelayedPromise,\n generateId,\n type AssistantModelMessage,\n type Context,\n type ToolModelMessage,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport {\n addLanguageModelUsage,\n asLanguageModelUsage,\n createAsyncIterableStream,\n createNullLanguageModelUsage,\n DefaultStepResult,\n toResponseMessages,\n} from 'ai/internal';\nimport type {\n LanguageModelV4FinishReason,\n LanguageModelV4Usage,\n} from '@ai-sdk/provider';\nimport {\n createUIMessageStreamResponse,\n toUIMessageStream as toUIMessageStreamHelper,\n type CallWarning,\n type ContentPart,\n type FinishReason,\n type InferUIMessageChunk,\n type InferGenerateOutput,\n type InferStreamOutput,\n type LanguageModelUsage,\n type OutputInterface as Output,\n type ProviderMetadata,\n type StepResult,\n type StreamTextResult,\n type TextStreamPart,\n type UIMessage,\n type UIMessageStreamOptions,\n} from 'ai';\n\ntype StreamProp<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n KEY extends keyof StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>,\n> = Awaited<StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>[KEY]>;\n\ntype InferElementOutput<OUTPUT extends Output> =\n OUTPUT extends Output<any, any, infer ELEMENT> ? ELEMENT : never;\n\ntype EnrichedStreamPart<TOOLS extends ToolSet, PARTIAL_OUTPUT> = {\n part: TextStreamPart<TOOLS>;\n partialOutput: PARTIAL_OUTPUT | undefined;\n};\n\n/**\n * Concrete `StreamTextResult` implementation backed by a single\n * harness prompt turn.\n *\n * Wraps a `ReadableStream<TextStreamPart<TOOLS>>` that the calling\n * driver pushes events into. Every `PromiseLike` accessor is backed by a\n * `DelayedPromise` so the AI SDK consumer surface stays identical to\n * `streamText`'s — consumers can `await result.text` or iterate\n * `result.fullStream`, in either order.\n *\n * Each `finish-step` boundary in the driver translates to a `StepResult`\n * built via `DefaultStepResult`. Step content is accumulated as\n * `ContentPart[]` and fed straight to `DefaultStepResult`, which derives\n * `text`, `toolCalls`, `toolResults`, `reasoning`, etc. via its getters.\n *\n * The Node.js response helpers (`pipeUIMessageStreamToResponse`,\n * `pipeTextStreamToResponse`, `toTextStreamResponse`) are not implemented yet\n * and throw a clear error.\n */\nexport class HarnessStreamTextResult<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> implements StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n // Delayed promises backing every PromiseLike accessor. Each is typed\n // against the corresponding `StreamTextResult` property so the public\n // surface stays in lockstep with AI SDK's interface as it evolves.\n private readonly _content = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'content'>\n >();\n private readonly _text = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'text'>\n >();\n private readonly _reasoning = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'reasoning'>\n >();\n private readonly _reasoningText = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'reasoningText'>\n >();\n private readonly _files = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'files'>\n >();\n private readonly _sources = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'sources'>\n >();\n private readonly _toolCalls = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'toolCalls'>\n >();\n private readonly _staticToolCalls = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'staticToolCalls'>\n >();\n private readonly _dynamicToolCalls = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'dynamicToolCalls'>\n >();\n private readonly _toolResults = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'toolResults'>\n >();\n private readonly _staticToolResults = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'staticToolResults'>\n >();\n private readonly _dynamicToolResults = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'dynamicToolResults'>\n >();\n private readonly _finishReason = new DelayedPromise<FinishReason>();\n private readonly _rawFinishReason = new DelayedPromise<string | undefined>();\n private readonly _usage = new DelayedPromise<LanguageModelUsage>();\n private readonly _warnings = new DelayedPromise<CallWarning[] | undefined>();\n private readonly _steps = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'steps'>\n >();\n private readonly _finalStep = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'finalStep'>\n >();\n private readonly _request = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'request'>\n >();\n private readonly _response = new DelayedPromise<\n StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'response'>\n >();\n private readonly _responseMessages = new DelayedPromise<\n Array<AssistantModelMessage | ToolModelMessage>\n >();\n private readonly _providerMetadata = new DelayedPromise<\n ProviderMetadata | undefined\n >();\n\n // The driver pushes parts into this controller; consumers read via `stream`.\n private readonly fullStreamController: ReadableStreamDefaultController<\n TextStreamPart<TOOLS>\n >;\n private baseStream: ReadableStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n >;\n\n private readonly stepsBuffer: StepResult<TOOLS, RUNTIME_CONTEXT>[] = [];\n private currentStepContent: ContentPart<TOOLS>[] = [];\n private currentStepWarnings: CallWarning[] = [];\n private stepNumber = 0;\n private stepStarted = false;\n\n private readonly tools: TOOLS;\n private readonly runtimeContext: RUNTIME_CONTEXT;\n private readonly toolsContext: never;\n private readonly providerName: string;\n private readonly modelId: string;\n private readonly outputSpecification: OUTPUT | undefined;\n\n // Accumulators that span the whole turn.\n private accumulatedUsage: LanguageModelUsage = createNullLanguageModelUsage();\n private finalProviderMetadata: ProviderMetadata | undefined = undefined;\n private finalFinishReason: FinishReason = 'other';\n private finalRawFinishReason: string | undefined = undefined;\n private aggregateWarnings: CallWarning[] = [];\n private settled = false;\n\n constructor(options: {\n tools: TOOLS;\n runtimeContext: RUNTIME_CONTEXT;\n toolsContext: never;\n harnessId: string;\n sessionId: string;\n output: OUTPUT | undefined;\n }) {\n this.tools = options.tools;\n this.runtimeContext = options.runtimeContext;\n this.toolsContext = options.toolsContext;\n this.providerName = `harness:${options.harnessId}`;\n this.modelId = options.sessionId;\n this.outputSpecification = options.output;\n\n let controllerRef!: ReadableStreamDefaultController<TextStreamPart<TOOLS>>;\n const baseStream = new ReadableStream<TextStreamPart<TOOLS>>({\n start(c) {\n controllerRef = c;\n // Send the message-level start event as the first part, mirroring\n // `streamText`. Downstream UI message stream consumers depend on it:\n // `toUIMessageStream`'s persistence mode injects the response message\n // id into this part (it never synthesizes one), so without it\n // `useChat` clients keep a locally generated assistant message id\n // that diverges from the id the server persists under.\n c.enqueue({ type: 'start' });\n },\n });\n this.fullStreamController = controllerRef;\n\n this.baseStream =\n options.output == null\n ? baseStream.pipeThrough(\n new TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n >({\n transform(part, controller) {\n controller.enqueue({ part, partialOutput: undefined });\n },\n }),\n )\n : baseStream.pipeThrough(createOutputTransformStream(options.output));\n }\n\n // ─── Writer-side methods used by the driver ────────────────────────\n\n /**\n * Push a translated `TextStreamPart` into `fullStream` and accumulate it\n * into the current step's content array where applicable.\n */\n enqueue(part: TextStreamPart<TOOLS>): void {\n this.startStep();\n this.fullStreamController.enqueue(part);\n this.appendToCurrentStepContent(part);\n }\n\n /**\n * Push a continuation input into the consumer stream without attributing it\n * to the next model step. Approval responses and client tool results arrive\n * between model calls and therefore must not create or alter a StepResult.\n */\n enqueueContinuation(part: TextStreamPart<TOOLS>): void {\n this.fullStreamController.enqueue(part);\n }\n\n /**\n * Drop content replayed while a suspended host-input pause closes its\n * already-recorded model step.\n */\n discardCurrentStepContent(): void {\n this.currentStepContent = [];\n this.currentStepWarnings = [];\n this.stepStarted = false;\n }\n\n /**\n * Mark the end of a step. Builds a `StepResult` from the accumulated\n * content and records it in the steps array. Accepts the V4-shaped\n * finish reason / usage the harness emits and normalizes to AI SDK's\n * flat shape internally.\n */\n finishStep(input: {\n finishReason: LanguageModelV4FinishReason;\n usage: LanguageModelV4Usage;\n providerMetadata: ProviderMetadata | undefined;\n warnings: CallWarning[];\n }): StepResult<TOOLS, RUNTIME_CONTEXT> {\n this.startStep();\n\n const normalizedUsage = asLanguageModelUsage(input.usage);\n const finishReason = input.finishReason.unified;\n const rawFinishReason = input.finishReason.raw;\n\n const step = new DefaultStepResult<TOOLS, RUNTIME_CONTEXT>({\n callId: generateId(),\n stepNumber: this.stepNumber,\n provider: this.providerName,\n modelId: this.modelId,\n runtimeContext: this.runtimeContext,\n toolsContext: this.toolsContext,\n content: this.currentStepContent,\n finishReason,\n rawFinishReason,\n usage: normalizedUsage,\n performance: createEmptyPerformance(),\n warnings: input.warnings.length > 0 ? input.warnings : undefined,\n request: {},\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n messages: [],\n },\n providerMetadata: input.providerMetadata,\n });\n this.stepsBuffer.push(step);\n\n // Forward an AI SDK finish-step event so consumers reading fullStream\n // see step boundaries.\n this.fullStreamController.enqueue({\n type: 'finish-step',\n finishReason,\n rawFinishReason,\n usage: normalizedUsage,\n providerMetadata: input.providerMetadata,\n response: step.response,\n performance: createEmptyPerformance(),\n } as TextStreamPart<TOOLS>);\n\n this.accumulatedUsage = addLanguageModelUsage(\n this.accumulatedUsage,\n normalizedUsage,\n );\n this.finalFinishReason = finishReason;\n this.finalRawFinishReason = rawFinishReason;\n this.finalProviderMetadata = input.providerMetadata;\n if (input.warnings.length > 0)\n this.aggregateWarnings.push(...input.warnings);\n\n this.stepNumber += 1;\n this.currentStepContent = [];\n this.currentStepWarnings = [];\n this.stepStarted = false;\n\n return step;\n }\n\n private startStep(): void {\n if (this.stepStarted) return;\n\n this.stepStarted = true;\n this.fullStreamController.enqueue({\n type: 'start-step',\n request: {},\n warnings: this.currentStepWarnings,\n } as TextStreamPart<TOOLS>);\n }\n\n /**\n * Resolve every delayed promise and close `fullStream`. Idempotent.\n */\n async finish(input?: {\n finishReason: LanguageModelV4FinishReason;\n totalUsage: LanguageModelV4Usage;\n providerMetadata: ProviderMetadata | undefined;\n }): Promise<void> {\n if (this.settled) return;\n\n /*\n * Do not flush trailing content that has not been captured by a\n * `finish-step`. A terminal `finish` closes the turn but is not a semantic\n * step boundary, so buffered content indicates an invalid harness stream.\n */\n if (this.currentStepContent.length > 0) {\n this.fail(\n new Error(\n 'HarnessAgent: received terminal finish with unclosed step content. Harness adapters must emit `finish-step` before `finish`.',\n ),\n );\n return;\n }\n\n if (input != null) {\n this.finalFinishReason = input.finishReason.unified;\n this.finalRawFinishReason = input.finishReason.raw;\n this.finalProviderMetadata = input.providerMetadata;\n this.accumulatedUsage = asLanguageModelUsage(input.totalUsage);\n }\n\n this.settled = true;\n\n const finalStep =\n this.stepsBuffer.length > 0\n ? this.stepsBuffer[this.stepsBuffer.length - 1]!\n : new DefaultStepResult<TOOLS, RUNTIME_CONTEXT>({\n callId: generateId(),\n stepNumber: 0,\n provider: this.providerName,\n modelId: this.modelId,\n runtimeContext: this.runtimeContext,\n toolsContext: this.toolsContext,\n content: [],\n finishReason: this.finalFinishReason,\n rawFinishReason: this.finalRawFinishReason,\n usage: createNullLanguageModelUsage(),\n performance: createEmptyPerformance(),\n warnings: undefined,\n request: {},\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n messages: [],\n },\n providerMetadata: undefined,\n });\n\n const aggregatedContent = this.stepsBuffer.flatMap(s => s.content);\n\n this._content.resolve(\n aggregatedContent as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'content'\n >,\n );\n this._text.resolve(finalStep.text);\n // Reasoning content parts are not yet derived from harness events; the\n // foundation surfaces an empty array. Adapters that emit reasoning\n // deltas can be wired up to produce real reasoning content in a later\n // pass.\n this._reasoning.resolve(\n [] as StreamProp<TOOLS, RUNTIME_CONTEXT, OUTPUT, 'reasoning'>,\n );\n this._reasoningText.resolve(undefined);\n this._files.resolve(this.stepsBuffer.flatMap(s => s.files));\n this._sources.resolve(this.stepsBuffer.flatMap(s => s.sources));\n this._toolCalls.resolve(\n this.stepsBuffer.flatMap(s => s.toolCalls) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'toolCalls'\n >,\n );\n this._staticToolCalls.resolve(\n this.stepsBuffer.flatMap(s => s.staticToolCalls) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'staticToolCalls'\n >,\n );\n this._dynamicToolCalls.resolve(\n this.stepsBuffer.flatMap(s => s.dynamicToolCalls) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'dynamicToolCalls'\n >,\n );\n this._toolResults.resolve(\n this.stepsBuffer.flatMap(s => s.toolResults) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'toolResults'\n >,\n );\n this._staticToolResults.resolve(\n this.stepsBuffer.flatMap(s => s.staticToolResults) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'staticToolResults'\n >,\n );\n this._dynamicToolResults.resolve(\n this.stepsBuffer.flatMap(s => s.dynamicToolResults) as StreamProp<\n TOOLS,\n RUNTIME_CONTEXT,\n OUTPUT,\n 'dynamicToolResults'\n >,\n );\n this._finishReason.resolve(this.finalFinishReason);\n this._rawFinishReason.resolve(this.finalRawFinishReason);\n this._usage.resolve(this.accumulatedUsage);\n this._warnings.resolve(\n this.aggregateWarnings.length > 0 ? this.aggregateWarnings : undefined,\n );\n this._steps.resolve(this.stepsBuffer);\n this._finalStep.resolve(finalStep);\n this._request.resolve(finalStep.request);\n this._response.resolve(finalStep.response);\n this._providerMetadata.resolve(this.finalProviderMetadata);\n\n const responseMessages = await toResponseMessages<TOOLS>({\n content: aggregatedContent,\n tools: this.tools,\n });\n this._responseMessages.resolve(responseMessages);\n\n // Forward AI SDK finish event before closing.\n this.fullStreamController.enqueue({\n type: 'finish',\n finishReason: this.finalFinishReason,\n rawFinishReason: this.finalRawFinishReason,\n totalUsage: this.accumulatedUsage,\n providerMetadata: this.finalProviderMetadata,\n } as TextStreamPart<TOOLS>);\n\n this.fullStreamController.close();\n }\n\n /**\n * Settle the turn as user-aborted: emit a final `abort` part — matching\n * `streamText`'s abort contract — and close the stream, instead of\n * surfacing an `error` part. `toUIMessageStream` consumers then observe\n * an `abort` chunk (and `isAborted: true`) rather than a spurious\n * `onError`. The delayed promise accessors still reject with the\n * underlying abort error so awaiting consumers do not hang. Idempotent.\n */\n abort(input: { error: unknown; reason?: string }): void {\n if (this.settled) return;\n this.settled = true;\n this.fullStreamController.enqueue({\n type: 'abort',\n ...(input.reason !== undefined ? { reason: input.reason } : {}),\n } as TextStreamPart<TOOLS>);\n this.fullStreamController.close();\n this.rejectDelayedPromises(input.error);\n }\n\n /**\n * Surface a fatal error as a stream `error` part + reject every delayed\n * promise so awaiting consumers stop hanging. Idempotent.\n */\n fail(error: unknown): void {\n if (this.settled) return;\n this.settled = true;\n this.fullStreamController.enqueue({\n type: 'error',\n error,\n } as TextStreamPart<TOOLS>);\n this.fullStreamController.close();\n this.rejectDelayedPromises(error);\n }\n\n private rejectDelayedPromises(error: unknown): void {\n for (const dp of [\n this._content,\n this._text,\n this._reasoning,\n this._reasoningText,\n this._files,\n this._sources,\n this._toolCalls,\n this._staticToolCalls,\n this._dynamicToolCalls,\n this._toolResults,\n this._staticToolResults,\n this._dynamicToolResults,\n this._finishReason,\n this._rawFinishReason,\n this._usage,\n this._warnings,\n this._steps,\n this._finalStep,\n this._request,\n this._response,\n this._responseMessages,\n this._providerMetadata,\n ]) {\n try {\n (dp as DelayedPromise<unknown>).reject(error);\n } catch {\n // ignore double-rejection\n }\n }\n }\n\n // ─── Reader-side public surface (StreamTextResult contract) ────────\n\n private teeStream(): ReadableStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n > {\n const [stream, remainingStream] = this.baseStream.tee();\n this.baseStream = remainingStream;\n return stream;\n }\n\n get stream(): AsyncIterableStream<TextStreamPart<TOOLS>> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>,\n TextStreamPart<TOOLS>\n >({\n transform({ part }, controller) {\n controller.enqueue(part);\n },\n }),\n ),\n ) as AsyncIterableStream<TextStreamPart<TOOLS>>;\n }\n\n get fullStream(): AsyncIterableStream<TextStreamPart<TOOLS>> {\n return this.stream;\n }\n\n get textStream(): AsyncIterableStream<string> {\n return createAsyncIterableStream(\n this.stream.pipeThrough(\n new TransformStream<TextStreamPart<TOOLS>, string>({\n transform(part, controller) {\n if (part.type === 'text-delta') {\n controller.enqueue(part.text);\n }\n },\n }),\n ),\n ) as AsyncIterableStream<string>;\n }\n\n get content() {\n return this._content.promise;\n }\n get text() {\n return this._text.promise;\n }\n get reasoning() {\n return this._reasoning.promise;\n }\n get reasoningText() {\n return this._reasoningText.promise;\n }\n get files() {\n return this._files.promise;\n }\n get sources() {\n return this._sources.promise;\n }\n get toolCalls() {\n return this._toolCalls.promise;\n }\n get staticToolCalls() {\n return this._staticToolCalls.promise;\n }\n get dynamicToolCalls() {\n return this._dynamicToolCalls.promise;\n }\n get toolResults() {\n return this._toolResults.promise;\n }\n get staticToolResults() {\n return this._staticToolResults.promise;\n }\n get dynamicToolResults() {\n return this._dynamicToolResults.promise;\n }\n get finishReason() {\n return this._finishReason.promise;\n }\n get rawFinishReason() {\n return this._rawFinishReason.promise;\n }\n get usage() {\n return this._usage.promise;\n }\n get totalUsage() {\n return this._usage.promise;\n }\n get warnings() {\n return this._warnings.promise;\n }\n get steps() {\n return this._steps.promise;\n }\n get finalStep() {\n return this._finalStep.promise;\n }\n get request() {\n return this._request.promise;\n }\n get response() {\n return this._response.promise;\n }\n get responseMessages() {\n return this._responseMessages.promise;\n }\n get providerMetadata() {\n return this._providerMetadata.promise;\n }\n\n get experimental_partialOutputStream(): AsyncIterableStream<\n InferStreamOutput<OUTPUT>\n > {\n return this.partialOutputStream;\n }\n\n get partialOutputStream(): AsyncIterableStream<InferStreamOutput<OUTPUT>> {\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(\n new TransformStream<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>,\n InferStreamOutput<OUTPUT>\n >({\n transform({ partialOutput }, controller) {\n if (partialOutput != null) {\n controller.enqueue(partialOutput);\n }\n },\n }),\n ),\n ) as AsyncIterableStream<InferStreamOutput<OUTPUT>>;\n }\n\n get elementStream(): AsyncIterableStream<InferElementOutput<OUTPUT>> {\n const transform = this.outputSpecification?.createElementStreamTransform();\n if (transform == null) {\n throw notSupportedYet(\n `element streams in ${this.outputSpecification?.name ?? 'text'} mode`,\n );\n }\n return createAsyncIterableStream(\n this.teeStream().pipeThrough(transform),\n ) as AsyncIterableStream<InferElementOutput<OUTPUT>>;\n }\n\n get output(): Promise<InferGenerateOutput<OUTPUT>> {\n return this.finalStep.then(step => {\n if (this.outputSpecification == null) {\n throw notSupportedYet('structured output');\n }\n return this.outputSpecification.parseCompleteOutput(\n { text: step.text },\n {\n response: step.response,\n usage: step.usage,\n finishReason: step.finishReason,\n },\n );\n });\n }\n\n async consumeStream(): Promise<void> {\n const reader = this.fullStream.getReader();\n try {\n while (true) {\n const { done } = await reader.read();\n if (done) return;\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n toUIMessageStream<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n }: UIMessageStreamOptions<UI_MESSAGE> = {}): AsyncIterableStream<\n InferUIMessageChunk<UI_MESSAGE>\n > {\n return createAsyncIterableStream(\n toUIMessageStreamHelper<TOOLS, UI_MESSAGE>({\n stream: this.stream,\n tools: this.tools,\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n }),\n ) as AsyncIterableStream<InferUIMessageChunk<UI_MESSAGE>>;\n }\n\n pipeUIMessageStreamToResponse(): never {\n throw notSupportedYet('pipeUIMessageStreamToResponse');\n }\n\n pipeTextStreamToResponse(): never {\n throw notSupportedYet('pipeTextStreamToResponse');\n }\n\n toUIMessageStreamResponse<UI_MESSAGE extends UIMessage>({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n ...init\n }: ResponseInit & {\n consumeSseStream?: (options: {\n stream: ReadableStream<string>;\n }) => PromiseLike<void> | void;\n } & UIMessageStreamOptions<UI_MESSAGE> = {}): Response {\n return createUIMessageStreamResponse({\n stream: this.toUIMessageStream<UI_MESSAGE>({\n originalMessages,\n generateMessageId,\n onEnd,\n onFinish,\n messageMetadata,\n sendReasoning,\n sendSources,\n sendStart,\n sendFinish,\n onError,\n }),\n ...init,\n });\n }\n\n toTextStreamResponse(): never {\n throw notSupportedYet('toTextStreamResponse');\n }\n\n // ─── Helpers ────────────────────────────────────────────────────────\n\n private appendToCurrentStepContent(part: TextStreamPart<TOOLS>): void {\n switch (part.type) {\n case 'text-delta': {\n // Coalesce contiguous text-deltas with the same id into one text part.\n const last =\n this.currentStepContent[this.currentStepContent.length - 1];\n if (last && last.type === 'text') {\n (last as { text: string }).text += part.text;\n } else {\n this.currentStepContent.push({\n type: 'text',\n text: part.text,\n } as ContentPart<TOOLS>);\n }\n return;\n }\n case 'tool-call':\n case 'tool-approval-request':\n case 'tool-approval-response':\n case 'tool-result':\n case 'tool-error':\n this.currentStepContent.push({\n ...(part as object),\n } as ContentPart<TOOLS>);\n return;\n default:\n // text-start/end, reasoning-*, raw, error, finish-step, finish are\n // not directly stored as ContentParts. (Reasoning content parts\n // would belong here; we omit them for v0.)\n return;\n }\n }\n}\n\nfunction createOutputTransformStream<\n TOOLS extends ToolSet,\n OUTPUT extends Output,\n>(\n output: OUTPUT,\n): TransformStream<\n TextStreamPart<TOOLS>,\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n> {\n let firstTextChunkId: string | undefined;\n let text = '';\n let textChunk = '';\n let textProviderMetadata: ProviderMetadata | undefined;\n let lastPublishedValue = '';\n\n const publishTextChunk = (options: {\n controller: TransformStreamDefaultController<\n EnrichedStreamPart<TOOLS, InferStreamOutput<OUTPUT>>\n >;\n partialOutput?: InferStreamOutput<OUTPUT>;\n }): void => {\n options.controller.enqueue({\n part: {\n type: 'text-delta',\n id: firstTextChunkId!,\n text: textChunk,\n providerMetadata: textProviderMetadata,\n },\n partialOutput: options.partialOutput,\n });\n textChunk = '';\n };\n\n return new TransformStream({\n async transform(chunk, controller) {\n if (chunk.type === 'finish-step' && textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n\n if (\n chunk.type !== 'text-delta' &&\n chunk.type !== 'text-start' &&\n chunk.type !== 'text-end'\n ) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (firstTextChunkId == null) {\n firstTextChunkId = chunk.id;\n } else if (chunk.id !== firstTextChunkId) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-start') {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n if (chunk.type === 'text-end') {\n if (textChunk.length > 0) {\n publishTextChunk({ controller });\n }\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n text += chunk.text;\n textChunk += chunk.text;\n textProviderMetadata = chunk.providerMetadata ?? textProviderMetadata;\n\n if (chunk.text.length === 0 && chunk.providerMetadata != null) {\n controller.enqueue({ part: chunk, partialOutput: undefined });\n return;\n }\n\n const result = await output.parsePartialOutput({ text });\n if (result === undefined) {\n return;\n }\n\n const currentValue =\n typeof result.partial === 'string'\n ? result.partial\n : JSON.stringify(result.partial);\n if (currentValue !== lastPublishedValue) {\n publishTextChunk({\n controller,\n partialOutput: result.partial,\n });\n lastPublishedValue = currentValue;\n }\n },\n });\n}\n\nfunction createEmptyPerformance(): StepResult<ToolSet, Context>['performance'] {\n return {\n effectiveOutputTokensPerSecond: 0,\n outputTokensPerSecond: undefined,\n inputTokensPerSecond: undefined,\n effectiveTotalTokensPerSecond: 0,\n stepTimeMs: 0,\n responseTimeMs: 0,\n toolExecutionMs: {},\n timeToFirstOutputMs: undefined,\n };\n}\n\nfunction notSupportedYet(feature: string): Error {\n return new Error(\n `HarnessAgent: ${feature} is not implemented yet. Track the foundation review for follow-up.`,\n );\n}\n\n// Re-declare `AsyncIterableStream` locally to avoid pulling AI SDK's internal\n// async-iterable-stream helper. ReadableStreams already implement the\n// async-iterator contract in modern runtimes; we expose them under the same\n// nominal type AI SDK does.\ntype AsyncIterableStream<T> = ReadableStream<T> & AsyncIterable<T>;\n","import type { HarnessV1StreamPart } from '../../v1';\nimport type { TextStreamPart } from 'ai';\nimport { generateId, type ToolSet } from '@ai-sdk/provider-utils';\n\n/**\n * Translate one event from the harness wire format to the AI SDK\n * `TextStreamPart` shape consumed by `streamText` callers.\n *\n * Most variants are close to the identity function — V4 primitives\n * (`LanguageModelV4ToolCall`, `LanguageModelV4ToolResult`,\n * `LanguageModelV4ToolApprovalRequest`, `LanguageModelV4FinishReason`,\n * `LanguageModelV4Usage`) flow through unchanged. The adapters are:\n * - `harnessMetadata` → `providerMetadata`\n * - tool-call events are not translated here — validation against the\n * merged tool set is async and handled by `validateToolCall` in\n * `run-prompt.ts`\n * - a failed `tool-result` from a provider-executed tool becomes a\n * `tool-error` (see `isProviderExecuted`)\n * - the harness `raw` part is forwarded as the AI SDK `raw` part\n *\n * Returns an array of zero or more AI SDK parts. Most harness events project\n * to a single AI SDK part; `file-change` fans out into a synthetic\n * dynamic + provider-executed `tool-call` / `tool-result` pair so the event\n * is observable in `streamText`-style flows without a new stream-part type\n * needing first-class AI SDK support. Events with no consumer-facing AI SDK\n * equivalent (`stream-start`, `finish-step`, `finish` — consumed internally)\n * return an empty array.\n */\nexport function translateStreamPart<TOOLS extends ToolSet>(\n event: HarnessV1StreamPart,\n options: {\n /**\n * Whether the tool call that produced this event ran inside the harness\n * runtime. Host tools travel the same `tool-result` events and their\n * failures are echoed back with `isError`, so the event alone cannot say\n * who ran the tool — only the originating `tool-call` can, and correlating\n * the two is the caller's job. Omit the callback to treat every failure as\n * provider-executed.\n */\n isProviderExecuted?: (toolCallId: string) => boolean;\n } = {},\n): ReadonlyArray<TextStreamPart<TOOLS>> {\n switch (event.type) {\n case 'stream-start':\n // The agent emits its own `start` part as the first chunk of the\n // stream (see `HarnessStreamTextResult`); the harness-level start\n // signal is consumed internally.\n return [];\n\n case 'text-start':\n return [\n {\n type: 'text-start',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'text-delta':\n return [\n {\n type: 'text-delta',\n id: event.id,\n text: event.delta,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'text-end':\n return [\n {\n type: 'text-end',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'reasoning-start':\n return [\n {\n type: 'reasoning-start',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'reasoning-delta':\n return [\n {\n type: 'reasoning-delta',\n id: event.id,\n text: event.delta,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'reasoning-end':\n return [\n {\n type: 'reasoning-end',\n id: event.id,\n providerMetadata: event.harnessMetadata,\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'tool-call':\n // Tool-call validation is async (it parses input against the tool's\n // schema) and lives in `run-prompt.ts` where the merged tool set is in\n // scope. The translator returns nothing here — the run-prompt loop\n // handles the emission.\n return [];\n\n case 'tool-approval-request':\n return [];\n\n case 'tool-result':\n if (\n event.isError === true &&\n (options.isProviderExecuted?.(event.toolCallId) ?? true)\n ) {\n /*\n * `providerExecuted` decides whether the message survives:\n * `toUIMessageChunk` forwards the real error text only for\n * provider-executed errors, and replaces every other one with the\n * generic `onError` string.\n */\n return [\n {\n type: 'tool-error',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: undefined,\n error: event.result,\n providerExecuted: true,\n ...(event.dynamic !== undefined ? { dynamic: event.dynamic } : {}),\n ...(event.providerMetadata !== undefined\n ? { providerMetadata: event.providerMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n }\n\n return [\n {\n type: 'tool-result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: undefined,\n output: event.result,\n ...(event.preliminary !== undefined\n ? { preliminary: event.preliminary }\n : {}),\n ...(event.dynamic !== undefined ? { dynamic: event.dynamic } : {}),\n ...(event.providerMetadata !== undefined\n ? { providerMetadata: event.providerMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n\n case 'file-change': {\n /*\n * `file-change` has no first-class AI SDK stream-part equivalent.\n * Project it as a synthetic dynamic + provider-executed tool-call /\n * tool-result pair under the reserved name `fileChange` so the event\n * is visible to `streamText`-style consumers. `dynamic: true` keeps it\n * out of typed-tool lookups; `providerExecuted: true` signals the\n * runtime already executed it and the host should not dispatch.\n */\n const toolCallId = `harness-file-change-${generateId()}`;\n const payload = { event: event.event, path: event.path };\n return [\n {\n type: 'tool-call',\n toolCallId,\n toolName: 'fileChange',\n input: payload,\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n {\n type: 'tool-result',\n toolCallId,\n toolName: 'fileChange',\n input: payload,\n output: payload,\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n }\n\n case 'compaction': {\n /*\n * Like `file-change`, compaction has no first-class AI SDK stream-part\n * equivalent. Project it as a synthetic dynamic + provider-executed\n * tool-call / tool-result pair under the reserved name `compaction`, so\n * the event is visible to `streamText`-style consumers. Compaction takes\n * no input, so the call input is empty; the metadata rides on the result\n * output. `dynamic: true` keeps it out of typed-tool lookups;\n * `providerExecuted: true` signals the runtime already performed it.\n */\n const toolCallId = `harness-compaction-${generateId()}`;\n const output = {\n trigger: event.trigger,\n summary: event.summary,\n ...(event.tokensBefore !== undefined\n ? { tokensBefore: event.tokensBefore }\n : {}),\n ...(event.tokensAfter !== undefined\n ? { tokensAfter: event.tokensAfter }\n : {}),\n };\n return [\n {\n type: 'tool-call',\n toolCallId,\n toolName: 'compaction',\n input: {},\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n {\n type: 'tool-result',\n toolCallId,\n toolName: 'compaction',\n input: {},\n output,\n dynamic: true,\n providerExecuted: true,\n ...(event.harnessMetadata !== undefined\n ? { providerMetadata: event.harnessMetadata }\n : {}),\n } as TextStreamPart<TOOLS>,\n ];\n }\n\n case 'error':\n return [{ type: 'error', error: event.error } as TextStreamPart<TOOLS>];\n\n case 'raw':\n return [\n { type: 'raw', rawValue: event.rawValue } as TextStreamPart<TOOLS>,\n ];\n\n case 'finish-step':\n case 'finish':\n // finish-step / finish are consumed by the agent's result builder, not\n // forwarded directly. The agent emits AI SDK `finish-step` / `finish`\n // parts itself once it has assembled the surrounding step / response\n // metadata.\n return [];\n }\n}\n","import type { HarnessV1StreamPart } from '../../v1';\n\n/**\n * Remove the session working-directory prefix from path-bearing fields of a\n * stream event, returning a new event for display to consumers.\n *\n * Harness adapters run the agent in a per-session working directory that is a\n * subdirectory of the sandbox root, and the agent's tools use absolute paths so\n * they resolve against the root regardless of where the runtime process\n * operates. The absolute paths are correct but noisy in a UI, so this strips\n * the prefix for the consumer-facing projection only.\n *\n * Blanket prefix replacement (rather than rewriting known path fields) is used\n * deliberately: `tool-result` results are free-form text — command stdout, grep\n * output — where paths can appear anywhere and field-aware rewriting is\n * impossible. The prefix is long and contains the session id, so it is unique\n * enough that replacing every occurrence is safe.\n */\nexport function stripWorkDir(\n part: HarnessV1StreamPart,\n sessionWorkDir: string,\n): HarnessV1StreamPart {\n if (sessionWorkDir.length === 0) return part;\n\n switch (part.type) {\n case 'tool-call':\n return { ...part, input: stripString(part.input, sessionWorkDir) };\n case 'tool-result':\n return {\n ...part,\n result: stripDeep(part.result, sessionWorkDir) as Extract<\n HarnessV1StreamPart,\n { type: 'tool-result' }\n >['result'],\n };\n case 'file-change':\n return { ...part, path: stripString(part.path, sessionWorkDir) };\n default:\n return part;\n }\n}\n\n/**\n * Replace occurrences of the working directory in a string. A reference to the\n * directory followed by a separator becomes workspace-relative\n * (`/work/dir/src/a.ts` → `src/a.ts`); a bare reference to the directory itself\n * becomes `.`.\n */\nfunction stripString(value: string, workDir: string): string {\n return value.split(`${workDir}/`).join('').split(workDir).join('.');\n}\n\n/**\n * Recursively strip the working directory from every string nested in an\n * arbitrary JSON-like value. Non-string leaves are returned unchanged.\n */\nfunction stripDeep(value: unknown, workDir: string): unknown {\n if (typeof value === 'string') return stripString(value, workDir);\n if (Array.isArray(value)) return value.map(item => stripDeep(item, workDir));\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n out[key] = stripDeep(val, workDir);\n }\n return out;\n }\n return value;\n}\n","import { generateId, type ModelMessage } from '@ai-sdk/provider-utils';\nimport { createTelemetryDispatcher } from 'ai/internal';\nimport type { LanguageModelUsage, TelemetryOptions } from 'ai';\n\n/*\n * Drives AI SDK's pluggable `Telemetry` lifecycle from a harness turn.\n *\n * A harness turn is not a `streamText` call — it has no language model, prompt\n * standardization, or sampling settings — but the AI SDK telemetry contract is\n * shaped around `generateText`/`streamText` events, and `@ai-sdk/otel` (the\n * main integration) only produces spans when the full lifecycle fires. So we\n * map the turn onto that contract: turn = operation, each `finish-step` = a\n * step boundary, tool-calls = tool executions, `finish` = operation end. The\n * model-call-only event fields the harness has no value for (sampling params,\n * standardized prompt) are left `undefined` / cast; the fields the integrations\n * actually read (`callId`, `operationId`, `provider`, `modelId`, `messages`,\n * `toolCall`, `usage`, `finishReason`) carry real values.\n *\n * Telemetry is opt-in: the framework only drives it when `settings.telemetry`\n * is set (the dispatcher then also honours globally-registered integrations).\n */\n\ntype Dispatcher = ReturnType<typeof createTelemetryDispatcher>;\ntype EventArg<K extends keyof Dispatcher> = Dispatcher[K] extends\n | ((event: infer E) => unknown)\n | undefined\n ? E\n : never;\n\n/**\n * An output content part accumulated over a step — the model's assistant turn.\n * Shaped for the gen_ai output-message conventions `@ai-sdk/otel` reads.\n */\nexport type TurnContentPart =\n | { type: 'text'; text: string }\n | { type: 'reasoning'; text: string }\n | { type: 'tool-call'; toolCallId: string; toolName: string; input: unknown };\n\nexport interface TurnTelemetry {\n /**\n * Begin the operation span. Called on `stream-start`, optionally with the\n * model the runtime resolved to (overriding the session's configured id).\n * Idempotent — the first call wins.\n */\n start(modelId?: string): Promise<void>;\n /** Open a step span lazily, before the first content of a step. */\n ensureStepOpen(): Promise<void>;\n /** Close the current step (on a harness `finish-step`). */\n stepFinish(info: {\n finishReason: unknown;\n usage: unknown;\n providerMetadata?: unknown;\n /** The model's output content for this step (text/reasoning/tool-calls). */\n content?: TurnContentPart[];\n }): Promise<void>;\n /** A tool execution began (on a `tool-call`). */\n toolStart(call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n }): Promise<void>;\n /** Execute a host tool through each telemetry integration's context wrapper. */\n executeTool<T>(input: {\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): Promise<T>;\n /**\n * A tool execution completed (on its `tool-result` or after host execution).\n * Idempotent per `toolCallId` — the first caller wins, so provider-executed\n * and host-executed paths can both call it without double-counting.\n */\n toolEnd(\n toolCallId: string,\n output: { ok: true; output: unknown } | { ok: false; error: unknown },\n ): Promise<void>;\n /** The turn ended (on a harness `finish`). */\n end(info: { finishReason: unknown; usage: unknown }): Promise<void>;\n /** The turn failed. */\n error(err: unknown): Promise<void>;\n}\n\nconst NOOP: TurnTelemetry = {\n async start() {},\n async ensureStepOpen() {},\n async stepFinish() {},\n async toolStart() {},\n async executeTool({ execute }) {\n return await execute();\n },\n async toolEnd() {},\n async end() {},\n async error() {},\n};\n\nfunction normalizeFinishReason(finishReason: unknown): unknown {\n if (\n finishReason != null &&\n typeof finishReason === 'object' &&\n 'unified' in finishReason\n ) {\n return (finishReason as { unified: unknown }).unified;\n }\n\n return finishReason;\n}\n\nfunction addTokenCounts(\n tokenCount1: number | undefined,\n tokenCount2: number | undefined,\n): number | undefined {\n return tokenCount1 == null && tokenCount2 == null\n ? undefined\n : (tokenCount1 ?? 0) + (tokenCount2 ?? 0);\n}\n\nfunction normalizeUsage(usage: unknown): LanguageModelUsage | unknown {\n if (\n usage == null ||\n typeof usage !== 'object' ||\n !('inputTokens' in usage) ||\n !('outputTokens' in usage)\n ) {\n return usage;\n }\n\n const inputTokens = (usage as { inputTokens: unknown }).inputTokens;\n const outputTokens = (usage as { outputTokens: unknown }).outputTokens;\n\n if (\n inputTokens == null ||\n typeof inputTokens !== 'object' ||\n outputTokens == null ||\n typeof outputTokens !== 'object'\n ) {\n return usage;\n }\n\n const input = inputTokens as Record<string, number | undefined>;\n const output = outputTokens as Record<string, number | undefined>;\n\n return {\n inputTokens: input.total,\n inputTokenDetails: {\n noCacheTokens: input.noCache,\n cacheReadTokens: input.cacheRead,\n cacheWriteTokens: input.cacheWrite,\n },\n outputTokens: output.total,\n outputTokenDetails: {\n textTokens: output.text,\n reasoningTokens: output.reasoning,\n },\n totalTokens: addTokenCounts(input.total, output.total),\n raw: (usage as { raw?: LanguageModelUsage['raw'] }).raw,\n };\n}\n\nexport function createTurnTelemetry(opts: {\n telemetry: TelemetryOptions | undefined;\n harnessId: string;\n modelId: string | undefined;\n instructions: string | undefined;\n promptText: string;\n runtimeContext: unknown;\n}): TurnTelemetry {\n // Opt-in: with no telemetry settings we do no work and construct no events.\n if (opts.telemetry == null) return NOOP;\n\n const dispatcher = createTelemetryDispatcher({ telemetry: opts.telemetry });\n\n const callId = generateId();\n const provider = opts.harnessId;\n // The configured session model; `start(modelId)` may override it with the\n // model the runtime actually resolved to.\n let modelId = opts.modelId ?? '';\n const runtimeContext = opts.runtimeContext;\n const inputMessages: ModelMessage[] = [\n { role: 'user', content: opts.promptText },\n ];\n\n let started = false;\n let stepOpen = false;\n let stepNumber = 0;\n let ended = false;\n let finalStepText = '';\n let finalStepReasoning: Array<{ text: string }> = [];\n let finalStepProviderMetadata: unknown;\n let outputToolCalls: Array<{\n type: 'tool-call';\n toolCallId: string;\n toolName: string;\n input: unknown;\n }> = [];\n /** Tool calls started in the current turn and not yet ended. */\n const openTools = new Map<\n string,\n { toolCallId: string; toolName: string; input: unknown }\n >();\n\n const cast = <K extends keyof Dispatcher>(event: unknown): EventArg<K> =>\n event as EventArg<K>;\n\n // onStart — open the operation (root) span. Deferred until `start()` so the\n // runtime-resolved model can be attached to the operation span + trace label.\n const fireStart = async (): Promise<void> => {\n if (started) return;\n started = true;\n await dispatcher.onStart?.(\n cast<'onStart'>({\n callId,\n operationId: 'ai.harness',\n provider,\n modelId,\n tools: undefined,\n toolChoice: undefined,\n activeTools: undefined,\n maxRetries: 0,\n timeout: undefined,\n headers: undefined,\n providerOptions: undefined,\n output: undefined,\n toolsContext: undefined,\n runtimeContext,\n instructions: opts.instructions,\n messages: inputMessages,\n }),\n );\n };\n\n const start = async (overrideModelId?: string): Promise<void> => {\n if (started) return;\n if (overrideModelId) modelId = overrideModelId;\n await fireStart();\n };\n\n const ensureStepOpen = async (): Promise<void> => {\n if (!started) await fireStart();\n if (stepOpen || ended) return;\n stepOpen = true;\n await dispatcher.onStepStart?.(\n cast<'onStepStart'>({\n callId,\n provider,\n modelId,\n stepNumber,\n tools: undefined,\n toolChoice: undefined,\n activeTools: undefined,\n steps: new Array(stepNumber),\n providerOptions: undefined,\n output: undefined,\n runtimeContext,\n messages: inputMessages,\n }),\n );\n // Open the inference (language-model call) span — the gen_ai home for the\n // step's input and (on end) output messages.\n await dispatcher.onLanguageModelCallStart?.(\n cast<'onLanguageModelCallStart'>({\n callId,\n provider,\n modelId,\n messages: inputMessages,\n tools: undefined,\n }),\n );\n };\n\n /** Close the inference span with the step's output content. */\n const inferenceEnd = async (info: {\n finishReason: unknown;\n usage: unknown;\n content: TurnContentPart[];\n providerMetadata?: unknown;\n }): Promise<void> => {\n const finishReason = normalizeFinishReason(info.finishReason);\n const usage = normalizeUsage(info.usage);\n\n await dispatcher.onLanguageModelCallEnd?.(\n cast<'onLanguageModelCallEnd'>({\n callId,\n finishReason,\n responseId: callId,\n usage,\n content: info.content,\n ...(info.providerMetadata != null\n ? { providerMetadata: info.providerMetadata }\n : {}),\n performance: {\n responseTimeMs: undefined,\n timeToFirstOutputMs: undefined,\n timeBetweenOutputChunksMs: undefined,\n },\n }),\n );\n };\n\n const recordOutputContent = (content: TurnContentPart[]): void => {\n finalStepText = '';\n finalStepReasoning = [];\n\n for (const part of content) {\n if (part.type === 'text') {\n finalStepText += part.text;\n } else if (part.type === 'reasoning') {\n finalStepReasoning.push({ text: part.text });\n } else if (part.type === 'tool-call') {\n outputToolCalls.push(part);\n }\n }\n };\n\n const closeOpenTools = async (): Promise<void> => {\n for (const call of openTools.values()) {\n await dispatcher.onToolExecutionEnd?.(\n cast<'onToolExecutionEnd'>({\n callId,\n toolExecutionMs: 0,\n messages: [],\n toolCall: {\n type: 'tool-call',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n dynamic: true,\n },\n toolContext: undefined,\n toolOutput: { type: 'error', error: new Error('tool span unclosed') },\n }),\n );\n }\n openTools.clear();\n };\n\n return {\n start,\n ensureStepOpen,\n\n async stepFinish(info) {\n if (!stepOpen) return;\n const content = info.content ?? [];\n const finishReason = normalizeFinishReason(info.finishReason);\n const usage = normalizeUsage(info.usage);\n recordOutputContent(content);\n finalStepProviderMetadata = info.providerMetadata;\n await closeOpenTools();\n await inferenceEnd({\n finishReason,\n usage,\n content,\n providerMetadata: info.providerMetadata,\n });\n await dispatcher.onStepEnd?.(\n cast<'onStepEnd'>({\n callId,\n stepNumber,\n finishReason,\n usage,\n providerMetadata: info.providerMetadata,\n content,\n response: {\n id: callId,\n modelId,\n timestamp: new Date(0),\n messages: [],\n },\n }),\n );\n stepOpen = false;\n stepNumber += 1;\n },\n\n async toolStart(call) {\n await ensureStepOpen();\n if (openTools.has(call.toolCallId)) return;\n openTools.set(call.toolCallId, call);\n await dispatcher.onToolExecutionStart?.(\n cast<'onToolExecutionStart'>({\n callId,\n messages: [],\n toolCall: {\n type: 'tool-call',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n dynamic: true,\n },\n toolContext: undefined,\n }),\n );\n },\n\n async executeTool({ toolCallId, execute }) {\n if (dispatcher.executeTool == null) return await execute();\n return await dispatcher.executeTool({ callId, toolCallId, execute });\n },\n\n async toolEnd(toolCallId, output) {\n const call = openTools.get(toolCallId);\n const normalizedOutput = output.ok\n ? { type: 'tool-result' as const, output: output.output }\n : { type: 'error' as const, error: output.error };\n if (call == null) return;\n openTools.delete(toolCallId);\n await dispatcher.onToolExecutionEnd?.(\n cast<'onToolExecutionEnd'>({\n callId,\n toolExecutionMs: 0,\n messages: [],\n toolCall: {\n type: 'tool-call',\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n dynamic: true,\n },\n toolContext: undefined,\n toolOutput: normalizedOutput,\n }),\n );\n },\n\n async end(info) {\n if (ended) return;\n const finishReason = normalizeFinishReason(info.finishReason);\n const usage = normalizeUsage(info.usage);\n if (!started) await fireStart();\n if (stepOpen) {\n await closeOpenTools();\n await inferenceEnd({\n finishReason,\n usage,\n content: [],\n });\n await dispatcher.onStepEnd?.(\n cast<'onStepEnd'>({\n callId,\n stepNumber,\n finishReason,\n usage,\n providerMetadata: undefined,\n content: [],\n response: {\n id: callId,\n modelId,\n timestamp: new Date(0),\n messages: [],\n },\n }),\n );\n stepOpen = false;\n }\n ended = true;\n await dispatcher.onEnd?.(\n cast<'onEnd'>({\n callId,\n operationId: 'ai.harness',\n finishReason,\n usage,\n totalUsage: usage,\n content: [],\n text: finalStepText,\n finalStep: {\n reasoning: finalStepReasoning,\n providerMetadata: finalStepProviderMetadata,\n },\n toolCalls: outputToolCalls,\n files: [],\n steps: new Array(stepNumber),\n response: {\n id: callId,\n modelId,\n timestamp: new Date(0),\n messages: [],\n },\n runtimeContext,\n }),\n );\n },\n\n async error(err) {\n if (ended) return;\n if (!started) await fireStart();\n await closeOpenTools();\n ended = true;\n await dispatcher.onError?.(err);\n },\n };\n}\n","import type { ToolApprovalStatus } from 'ai';\nimport type { HarnessV1PermissionMode } from '../../v1';\nimport type { HarnessAgentToolApprovalConfiguration } from '../harness-agent-settings';\n\nexport const DEFAULT_PERMISSION_MODE: HarnessV1PermissionMode =\n 'allow-all' as const;\n\nexport function resolvePermissionMode(input: {\n permissionMode: HarnessV1PermissionMode | undefined;\n}): HarnessV1PermissionMode {\n return input.permissionMode ?? DEFAULT_PERMISSION_MODE;\n}\n\nexport function permissionModeNeedsBuiltinSupport(input: {\n permissionMode: HarnessV1PermissionMode;\n}): boolean {\n return input.permissionMode !== 'allow-all';\n}\n\nexport type CustomToolApprovalDecision =\n | { readonly type: 'allow'; readonly reason?: string }\n | { readonly type: 'deny'; readonly reason?: string }\n | { readonly type: 'request' };\n\nexport function resolveCustomToolApproval(input: {\n toolName: string;\n toolApproval: HarnessAgentToolApprovalConfiguration | undefined;\n}): CustomToolApprovalDecision {\n const status = normalizeToolApprovalStatus({\n status: input.toolApproval?.[input.toolName],\n });\n\n switch (status.type) {\n case 'not-applicable':\n case 'approved':\n return { type: 'allow', reason: status.reason };\n case 'denied':\n return { type: 'deny', reason: status.reason };\n case 'user-approval':\n return { type: 'request' };\n }\n}\n\nfunction normalizeToolApprovalStatus(input: {\n status: ToolApprovalStatus | undefined;\n}): Exclude<ToolApprovalStatus, string | undefined> {\n if (input.status === undefined) return { type: 'not-applicable' };\n if (typeof input.status === 'string') return { type: input.status };\n return input.status;\n}\n","import type { Experimental_SandboxProcess } from '@ai-sdk/provider-utils';\n\nconst DEFAULT_TAIL_LIMIT = 20;\n\ntype BridgeProcessStreamName = 'stdout' | 'stderr';\n\ntype SerializedError = {\n name?: string;\n message: string;\n stack?: string;\n};\n\nfunction isSerializedError(error: unknown): error is SerializedError {\n return (\n typeof error === 'object' &&\n error != null &&\n typeof (error as { message?: unknown }).message === 'string'\n );\n}\n\nfunction stringifyUnknown(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function formatBridgeError(error: unknown): string {\n if (error instanceof Error) {\n return error.stack ?? `${error.name}: ${error.message}`;\n }\n if (isSerializedError(error)) {\n return (\n error.stack ?? `${error.name ? `${error.name}: ` : ''}${error.message}`\n );\n }\n return stringifyUnknown(error);\n}\n\nfunction writeToStderr(line: string): void {\n try {\n process.stderr.write(line);\n } catch {}\n}\n\nexport function logBridgeError({\n harnessId,\n sessionId,\n context,\n error,\n write = writeToStderr,\n}: {\n harnessId: string;\n sessionId?: string;\n context?: string;\n error: unknown;\n write?: (line: string) => void;\n}): void {\n const prefix = `[harness:${harnessId}:error${\n sessionId ? ` session=${sessionId}` : ''\n }]`;\n const message = context\n ? `${context}: ${formatBridgeError(error)}`\n : formatBridgeError(error);\n for (const line of message.split('\\n')) {\n if (line.trim().length > 0) {\n write(`${prefix} ${line}\\n`);\n }\n }\n}\n\nexport function createBridgeErrorHandler({\n harnessId,\n sessionId,\n}: {\n harnessId: string;\n sessionId?: string;\n}): (event: { type: 'error'; error: unknown }) => void {\n return event => {\n logBridgeError({\n harnessId,\n sessionId,\n context: 'bridge emitted an error frame',\n error: event.error,\n });\n };\n}\n\nexport async function createBridgeStartupError({\n message,\n proc,\n stdoutTail,\n stderrTail,\n stderrDone,\n}: {\n message: string;\n proc: Experimental_SandboxProcess;\n stdoutTail: string[];\n stderrTail: string[];\n stderrDone?: Promise<void>;\n}): Promise<Error> {\n if (stderrDone) {\n await Promise.race([stderrDone, sleep(250)]).catch(() => {});\n }\n\n let exitStatus = '';\n try {\n const result = (await Promise.race([\n proc.wait(),\n sleep(250).then(() => undefined),\n ])) as { exitCode?: number } | undefined;\n if (result?.exitCode !== undefined) {\n exitStatus = ` Exit code: ${result.exitCode}.`;\n }\n } catch {}\n\n const details: string[] = [];\n if (stdoutTail.length > 0) {\n details.push(`stdout:\\n${stdoutTail.join('\\n')}`);\n }\n if (stderrTail.length > 0) {\n details.push(`stderr:\\n${stderrTail.join('\\n')}`);\n }\n\n return new Error(\n `${message}${exitStatus}${\n details.length > 0 ? `\\n\\n${details.join('\\n\\n')}` : ''\n }`,\n );\n}\n\nexport async function forwardBridgeProcessStream({\n stream,\n streamName,\n source = 'bridge',\n collectTail,\n tailLimit = DEFAULT_TAIL_LIMIT,\n}: {\n stream: ReadableStream<Uint8Array>;\n streamName: BridgeProcessStreamName;\n source?: string;\n collectTail?: string[];\n tailLimit?: number;\n}): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n const decoder = lineDecoder();\n while (true) {\n const { value, done } = await reader.read();\n const lines = done ? decoder.flush() : value ? decoder.push(value) : [];\n for (const line of lines) {\n recordTail({ lines: collectTail, line, limit: tailLimit });\n writeToStderr(`[harness:${source}:${streamName}] ${line}\\n`);\n }\n if (done) return;\n }\n } catch {}\n}\n\nexport async function drainBridgeProcessStream(\n stream: ReadableStream<Uint8Array>,\n): Promise<void> {\n try {\n const reader = stream.pipeThrough(new TextDecoderStream()).getReader();\n while (true) {\n const { done } = await reader.read();\n if (done) return;\n }\n } catch {}\n}\n\nfunction recordTail({\n lines,\n line,\n limit,\n}: {\n lines: string[] | undefined;\n line: string;\n limit: number;\n}): void {\n if (!lines) return;\n lines.push(line);\n while (lines.length > limit) lines.shift();\n}\n\nfunction lineDecoder() {\n let buffer = '';\n return {\n push(chunk: string): string[] {\n buffer += chunk;\n const lines: string[] = [];\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) !== -1) {\n const raw = buffer.slice(0, nl);\n buffer = buffer.slice(nl + 1);\n const line = raw.replace(/\\r$/, '').trim();\n if (line.length > 0) lines.push(line);\n }\n return lines;\n },\n flush(): string[] {\n const line = buffer.replace(/\\r$/, '').trim();\n buffer = '';\n return line.length > 0 ? [line] : [];\n },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import {\n safeParseJSON,\n safeValidateTypes,\n type FlexibleSchema,\n} from '@ai-sdk/provider-utils';\nimport type { WebSocket } from 'ws';\n\n/**\n * Diagnostic event surfaced by {@link SandboxChannel} during its connection\n * lifecycle. Silent unless a consumer wires `onDebug`. Reconnects are otherwise\n * invisible — the channel reconnects transparently and the in-flight turn keeps\n * streaming.\n */\nexport type SandboxChannelDebugEvent =\n | { event: 'reconnect-attempt'; attempt: number; lastSeenEventId: number }\n | { event: 'reconnected'; attempt: number; lastSeenEventId: number }\n | {\n event: 'reconnect-failed';\n attempts: number;\n lastSeenEventId: number;\n cause: unknown;\n };\n\nexport interface SandboxChannelReconnectOptions {\n /** Give up reconnecting after this many milliseconds. Default 30_000. */\n readonly maxElapsedMs?: number;\n /** First backoff delay. Default 50. */\n readonly initialDelayMs?: number;\n /** Backoff ceiling. Default 2_000. */\n readonly maxDelayMs?: number;\n}\n\nexport interface SandboxChannelOptions<TOut> {\n /**\n * Open a fresh WebSocket to the bridge and resolve once it is ready to carry\n * frames (i.e. after any adapter-specific handshake such as Claude Code's\n * `bridge-hello`). Called once by {@link SandboxChannel.open} and again on\n * every transient reconnect. Must reject if the connection cannot be\n * established.\n */\n connect: () => Promise<WebSocket>;\n\n /** Schema validating inbound (bridge → host) frames. */\n outboundSchema: FlexibleSchema<TOut>;\n\n reconnect?: SandboxChannelReconnectOptions;\n\n onDebug?: (event: SandboxChannelDebugEvent) => void;\n\n /**\n * Sink for forwarded bridge diagnostics — `sandbox-log` (captured\n * console lines) and `debug-event` (structured) frames. When set, these\n * frame types are routed here instead of the per-type listener dispatch, so\n * they never reach the consumer's stream. Typed to the diagnostic members of\n * `TOut`, so it is a no-op union for channels whose protocol has none.\n */\n onDiagnostic?: (\n event: Extract<TOut, { type: 'sandbox-log' | 'debug-event' }>,\n ) => void;\n\n onBridgeError?: (event: Extract<TOut, { type: 'error' }>) => void;\n\n /**\n * Seed the host-side cursor before the first connect. Pass the\n * `lastSeenEventId` persisted from a prior process so the bridge replays only\n * events past it when this channel opens with `{ resume: true }` — the\n * cross-process attach handshake. Defaults to `0` (fresh session).\n */\n initialLastSeenEventId?: number;\n}\n\ntype EventTypeOf<TOut extends { type: string }> = TOut['type'];\n\ntype Listener<TOut extends { type: string }, T extends EventTypeOf<TOut>> = (\n event: Extract<TOut, { type: T }>,\n) => void;\n\n/*\n * The agent and utilities entrypoints bundle this module separately. A global\n * symbol lets the agent recognize metadata attached by the channel's bundle\n * copy, while the non-enumerable property leaves protocol payloads unchanged.\n */\nconst sandboxChannelEventCheckpointSymbol = Symbol.for(\n 'vercel.ai.harness.sandboxChannelEventCheckpoint',\n);\n\ntype SandboxChannelEventCheckpoint = {\n pin: () => () => void;\n};\n\nexport function pinSandboxChannelEventCheckpoint(\n event: unknown,\n): (() => void) | undefined {\n if (event == null || typeof event !== 'object') return undefined;\n return (\n event as {\n [sandboxChannelEventCheckpointSymbol]?: SandboxChannelEventCheckpoint;\n }\n )[sandboxChannelEventCheckpointSymbol]?.pin();\n}\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise(resolve => {\n const t = setTimeout(resolve, ms);\n (t as { unref?: () => void }).unref?.();\n });\n\n/**\n * Host-side typed wrapper around the bridge WebSocket connection.\n *\n * Buffers inbound messages until a listener for their type is registered, so\n * callers that subscribe asynchronously do not miss early frames. Inbound\n * dispatch is serialised through a promise chain so a `close` event that\n * arrives on the same microtask as the final `finish` message does not fire\n * close handlers until the message has been dispatched.\n *\n * Survives transient disconnects. The bridge keeps running and\n * accumulates events in an in-memory log keyed by a monotonic `seq`; on an\n * unexpected socket drop this channel re-invokes `connect`, re-wires the new\n * socket, and asks the bridge to replay everything past `lastSeenEventId`. The\n * in-flight turn never observes the blip — `onClose` fires only after a\n * host-initiated close or once the reconnect budget is exhausted.\n */\nexport class SandboxChannel<\n TOut extends { type: string },\n TIn extends { type: string } = { type: string },\n> {\n private readonly listeners = new Map<\n EventTypeOf<TOut>,\n Set<Listener<TOut, EventTypeOf<TOut>>>\n >();\n private readonly buffered = new Map<EventTypeOf<TOut>, TOut[]>();\n private readonly onCloseHandlers = new Set<\n (code: number, reason: string) => void\n >();\n private readonly onReconnectHandlers = new Set<() => void>();\n\n private readonly connectThunk: () => Promise<WebSocket>;\n private readonly outboundSchema: FlexibleSchema<TOut>;\n private readonly onDebug:\n | ((event: SandboxChannelDebugEvent) => void)\n | undefined;\n private readonly onDiagnostic:\n | ((event: Extract<TOut, { type: 'sandbox-log' | 'debug-event' }>) => void)\n | undefined;\n private readonly onBridgeError:\n | ((event: Extract<TOut, { type: 'error' }>) => void)\n | undefined;\n private readonly maxElapsedMs: number;\n private readonly initialDelayMs: number;\n private readonly maxDelayMs: number;\n\n private ws: WebSocket | undefined;\n private connected = false;\n /** Host has begun teardown; suppresses reconnect so a bridge-side close finalises. */\n private closing = false;\n /**\n * Host has gracefully suspended (slice boundary). Inbound frames are ignored\n * from this point so the cursor stops advancing exactly at the last delivered\n * event — the bridge keeps the turn running and the not-yet-delivered tail is\n * replayed to the next process on `resume`.\n */\n private suspended = false;\n private pinnedSuspensionCursor:\n | { eventId: number; token: object }\n | undefined;\n /** Channel is fully torn down; `send` throws and `onClose` has fired. */\n private terminal = false;\n private _lastSeenEventId = 0;\n private readonly pendingSends: string[] = [];\n private dispatchChain: Promise<void> = Promise.resolve();\n\n constructor(options: SandboxChannelOptions<TOut>) {\n this.connectThunk = options.connect;\n this.outboundSchema = options.outboundSchema;\n this.onDebug = options.onDebug;\n this.onDiagnostic = options.onDiagnostic;\n this.onBridgeError = options.onBridgeError;\n this.maxElapsedMs = options.reconnect?.maxElapsedMs ?? 30_000;\n this.initialDelayMs = options.reconnect?.initialDelayMs ?? 50;\n this.maxDelayMs = options.reconnect?.maxDelayMs ?? 2_000;\n this._lastSeenEventId = options.initialLastSeenEventId ?? 0;\n }\n\n /**\n * Highest bridge event `seq` this channel has observed. Persist it (e.g. via\n * the adapter's resume handle) so a future process can seed\n * {@link SandboxChannelOptions.initialLastSeenEventId} and attach.\n */\n get lastSeenEventId(): number {\n return this._lastSeenEventId;\n }\n\n /**\n * Establish the initial connection. A single attempt — startup failures\n * reject so the caller can fail `doStart` cleanly. Reconnect retries apply\n * only to drops after a successful open.\n *\n * Pass `{ resume: true }` to attach to a bridge that is already mid-session:\n * after the socket opens, the channel sends `{ type: 'resume', lastSeenEventId }`\n * so the bridge replays everything past the seeded cursor. This is the\n * cross-process attach handshake — identical to what a transient reconnect\n * does, but triggered by the initial open from a new process.\n */\n async open(opts?: { resume?: boolean }): Promise<void> {\n if (this.terminal) {\n throw new Error('SandboxChannel: cannot open a closed channel.');\n }\n const ws = await this.connectThunk();\n this.wire(ws);\n this.ws = ws;\n this.connected = true;\n if (opts?.resume) {\n this.rawSend(\n JSON.stringify({\n type: 'resume',\n lastSeenEventId: this._lastSeenEventId,\n }),\n );\n }\n }\n\n on<T extends EventTypeOf<TOut>>(\n type: T,\n listener: Listener<TOut, T>,\n ): () => void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n\n const buffered = this.buffered.get(type);\n if (buffered) {\n this.buffered.delete(type);\n for (const event of buffered) {\n listener(event as Extract<TOut, { type: T }>);\n }\n }\n\n return () => {\n set!.delete(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n };\n }\n\n onClose(handler: (code: number, reason: string) => void): void {\n this.onCloseHandlers.add(handler);\n }\n\n onReconnect(handler: () => void): () => void {\n this.onReconnectHandlers.add(handler);\n return () => {\n this.onReconnectHandlers.delete(handler);\n };\n }\n\n send(message: TIn): void {\n if (this.terminal) {\n throw new Error(\n `SandboxChannel: cannot send ${message.type} — channel is closed.`,\n );\n }\n this.rawSend(JSON.stringify(message));\n }\n\n /**\n * Mark that the host is tearing the session down. The next socket close is\n * then treated as terminal rather than triggering a reconnect. Call before\n * sending a `stop` / `destroy` message whose completion closes the bridge\n * socket.\n */\n beginClose(): void {\n this.closing = true;\n }\n\n close(): void {\n if (this.terminal) return;\n this.closing = true;\n try {\n this.ws?.close();\n } catch {\n // best-effort\n }\n this.enqueue(() => this.finalizeClose(1000, 'closed'));\n }\n\n /**\n * Gracefully suspend at a slice boundary: stop processing inbound frames\n * (so the cursor freezes at the last delivered event), drain any frames\n * already queued for dispatch, then close the socket and finalise with the\n * close reason `'suspended'`. Resolves with the final `lastSeenEventId`.\n *\n * The bridge keeps the in-flight turn running (a host socket close never\n * aborts it) and accumulates events past the cursor for the next process to\n * `resume`. Unlike {@link close}, the consumer's active turn is wound down\n * cleanly — adapters distinguish a suspend from an unexpected drop via the\n * `'suspended'` close reason and resolve `done` successfully. When an event\n * checkpoint is pinned, the returned cursor points to that event so any\n * already-dispatched tail is replayed by the next process.\n */\n suspend(): Promise<number> {\n return new Promise<number>(resolve => {\n const pinnedSuspensionCursor = this.pinnedSuspensionCursor?.eventId;\n if (this.terminal) {\n resolve(pinnedSuspensionCursor ?? this._lastSeenEventId);\n return;\n }\n // Stop counting/dispatching further inbound frames immediately, and\n // suppress reconnect so the socket close finalises.\n this.suspended = true;\n this.closing = true;\n this.onClose(() =>\n resolve(pinnedSuspensionCursor ?? this._lastSeenEventId),\n );\n // Queue the close behind any already-dispatched frames so everything\n // delivered to the consumer is reflected in the final cursor.\n this.enqueue(() => {\n try {\n this.ws?.close();\n } catch {\n // best-effort\n }\n this.finalizeClose(1000, 'suspended');\n });\n });\n }\n\n isClosed(): boolean {\n return this.terminal;\n }\n\n // ─── internals ──────────────────────────────────────────────────────\n\n private wire(ws: WebSocket): void {\n let dropped = false;\n const onDrop = (code: number, reason: string) => {\n if (dropped) return;\n dropped = true;\n if (ws !== this.ws) return;\n this.connected = false;\n if (this.closing) {\n this.enqueue(() => this.finalizeClose(code, reason));\n } else {\n this.enqueue(() => this.reconnectLoop());\n }\n };\n\n ws.on('message', (raw: ArrayBufferLike | string) => {\n // Once suspended, ignore further frames so the cursor freezes exactly at\n // the last delivered event (the bridge replays the rest to the next slice).\n if (this.suspended) return;\n const text =\n typeof raw === 'string' ? raw : Buffer.from(raw).toString('utf8');\n this.enqueue(() => this.handleIncoming(text));\n });\n ws.on('close', (code: number, reason: Buffer) =>\n onDrop(code, reason?.toString?.('utf8') ?? ''),\n );\n ws.on('error', () => onDrop(1006, 'socket error'));\n }\n\n private async reconnectLoop(): Promise<void> {\n if (this.terminal || this.closing) return;\n const start = Date.now();\n let attempt = 0;\n let delay = this.initialDelayMs;\n while (!this.terminal && !this.closing) {\n attempt++;\n this.onDebug?.({\n event: 'reconnect-attempt',\n attempt,\n lastSeenEventId: this._lastSeenEventId,\n });\n try {\n const ws = await this.connectThunk();\n if (this.terminal || this.closing) {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n return;\n }\n this.wire(ws);\n this.ws = ws;\n this.connected = true;\n // Ask the bridge to replay everything we have not seen, then flush any\n // host → bridge frames produced while we were disconnected.\n this.rawSend(\n JSON.stringify({\n type: 'resume',\n lastSeenEventId: this._lastSeenEventId,\n }),\n );\n this.flushPending();\n for (const handler of this.onReconnectHandlers) handler();\n this.onDebug?.({\n event: 'reconnected',\n attempt,\n lastSeenEventId: this._lastSeenEventId,\n });\n return;\n } catch (cause) {\n if (Date.now() - start >= this.maxElapsedMs) {\n this.finalizeClose(1006, 'reconnect failed');\n this.onDebug?.({\n event: 'reconnect-failed',\n attempts: attempt,\n lastSeenEventId: this._lastSeenEventId,\n cause,\n });\n return;\n }\n await sleep(delay);\n delay = Math.min(delay * 1.5, this.maxDelayMs);\n }\n }\n }\n\n private rawSend(text: string): void {\n if (this.connected && this.ws) {\n this.ws.send(text);\n } else {\n this.pendingSends.push(text);\n }\n }\n\n private flushPending(): void {\n if (!this.connected || !this.ws) return;\n const queued = this.pendingSends.splice(0);\n for (const text of queued) this.ws.send(text);\n }\n\n private enqueue(work: () => void | Promise<void>): void {\n this.dispatchChain = this.dispatchChain.then(work);\n }\n\n private async handleIncoming(text: string): Promise<void> {\n const raw = await safeParseJSON({ text });\n let seq: number | undefined;\n if (\n raw.success &&\n raw.value != null &&\n typeof raw.value === 'object' &&\n typeof (raw.value as { seq?: unknown }).seq === 'number'\n ) {\n seq = (raw.value as { seq: number }).seq;\n }\n\n const validated = await safeValidateTypes({\n value: raw.success ? raw.value : undefined,\n schema: this.outboundSchema,\n });\n if (validated.success) {\n if (seq !== undefined) {\n this.attachEventCheckpoint({ event: validated.value, eventId: seq });\n }\n this.dispatch(validated.value);\n } else {\n this.dispatch({\n type: 'error',\n error: validated.error,\n } as unknown as TOut);\n }\n\n if (seq !== undefined && seq > this._lastSeenEventId) {\n this._lastSeenEventId = seq;\n }\n }\n\n private dispatch(message: TOut): void {\n // Diagnostics are routed to their own sink and never enter the\n // per-type listener/buffer path, so they stay off the consumer stream.\n if (message.type === 'sandbox-log' || message.type === 'debug-event') {\n this.onDiagnostic?.(\n message as Extract<TOut, { type: 'sandbox-log' | 'debug-event' }>,\n );\n return;\n }\n if (message.type === 'error') {\n this.onBridgeError?.(message as Extract<TOut, { type: 'error' }>);\n }\n const type = message.type as EventTypeOf<TOut>;\n const set = this.listeners.get(type);\n if (!set || set.size === 0) {\n let bucket = this.buffered.get(type);\n if (!bucket) {\n bucket = [];\n this.buffered.set(type, bucket);\n }\n bucket.push(message);\n return;\n }\n for (const listener of set) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n\n private attachEventCheckpoint(options: {\n event: TOut;\n eventId: number;\n }): void {\n if (!Object.isExtensible(options.event)) return;\n Object.defineProperty(options.event, sandboxChannelEventCheckpointSymbol, {\n value: {\n pin: () => {\n const token = {};\n this.pinnedSuspensionCursor = { eventId: options.eventId, token };\n return () => {\n if (this.pinnedSuspensionCursor?.token === token) {\n this.pinnedSuspensionCursor = undefined;\n }\n };\n },\n } satisfies SandboxChannelEventCheckpoint,\n });\n }\n\n private finalizeClose(code: number, reason: string): void {\n if (this.terminal) return;\n this.terminal = true;\n this.connected = false;\n for (const h of this.onCloseHandlers) h(code, reason);\n }\n}\n","import type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessV1NetworkSandboxSession } from '../v1';\n\nexport function getRestrictedSandboxSession(\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession,\n): SandboxSession {\n return 'restricted' in sandboxSession\n ? sandboxSession.restricted()\n : sandboxSession;\n}\n","import type {\n Context,\n Experimental_SandboxSession as SandboxSession,\n ToolSet,\n} from '@ai-sdk/provider-utils';\nimport type {\n OutputInterface as Output,\n StopCondition,\n StreamTextResult,\n TelemetryOptions,\n} from 'ai';\nimport type { HarnessAgentToolApprovalConfiguration } from './harness-agent-settings';\nimport type {\n HarnessV1BuiltinToolFiltering,\n HarnessV1NetworkSandboxSession,\n HarnessV1PromptControl,\n HarnessV1ResponseFormat,\n} from '../v1';\nimport { HarnessCapabilityUnsupportedError } from '../errors/harness-capability-unsupported-error';\nimport type {\n HarnessAgentAdapter,\n HarnessAgentAdapterSession,\n HarnessAgentContinueTurnState,\n HarnessAgentPendingToolApproval,\n HarnessAgentPendingToolResult,\n HarnessAgentPrompt,\n HarnessAgentResumeSessionState,\n HarnessAgentToolSpec,\n} from './harness-agent-types';\nimport type { HarnessAgentToolApprovalContinuation } from './harness-agent-tool-approval-continuation';\nimport type { HarnessAgentToolResultContinuation } from './harness-agent-tool-result-continuation';\nimport { validateLifecycleStateData } from './internal/lifecycle-state-validation';\nimport { runPrompt } from './internal/run-prompt';\nimport { getRestrictedSandboxSession } from '../utils/get-restricted-sandbox-session';\n\ntype HarnessAgentTurnResult<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> = {\n result: StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n done: Promise<void>;\n};\n\ntype HarnessAgentSessionState = 'active' | 'detached' | 'stopped' | 'destroyed';\n\ntype HarnessAgentTurnState =\n | 'idle'\n | 'running'\n | 'awaiting-approval'\n | 'awaiting-tool-result'\n | 'suspended';\n\ntype ActivePromptControl = {\n readonly turnId: number;\n readonly promise: Promise<HarnessV1PromptControl | undefined>;\n resolve(control: HarnessV1PromptControl | undefined): void;\n settled: boolean;\n};\n\n/**\n * Live harness session held by the caller.\n *\n * Created by {@link import('./harness-agent').HarnessAgent.createSession}.\n * Owns the underlying adapter session and holds its sandbox session.\n *\n * Pass the instance back to `agent.generate` / `agent.stream` on every\n * call; end the local handle with `detach()`, `stop()`, or `destroy()`.\n *\n * After any lifecycle method has resolved, the session is unusable — any\n * subsequent `generate`/`stream` call against it throws.\n */\nexport class HarnessAgentSession {\n /**\n * Stable identifier the harness adapter saw in `doStart`. The same\n * string callers persist when they intend to resume the session in a\n * future process.\n */\n readonly sessionId: string;\n\n private readonly harness: HarnessAgentAdapter;\n private readonly sessionWorkDir: string;\n private readonly ownsSandboxLifecycle: boolean;\n private underlyingSession: HarnessAgentAdapterSession | undefined;\n private sandboxSession:\n | HarnessV1NetworkSandboxSession\n | SandboxSession\n | undefined;\n private readonly toolApproval:\n | HarnessAgentToolApprovalConfiguration\n | undefined;\n private readonly pendingToolApprovals = new Map<\n string,\n HarnessAgentPendingToolApproval\n >();\n private readonly pendingToolResults = new Map<\n string,\n HarnessAgentPendingToolResult\n >();\n private sessionState: HarnessAgentSessionState = 'active';\n private turnState: HarnessAgentTurnState;\n private turnSequence = 0;\n private activeTurnSequence = 0;\n private activePromptControl: ActivePromptControl | undefined;\n private suspendedTurnState:\n | Promise<HarnessAgentContinueTurnState>\n | undefined;\n\n /**\n * Whether this session was created from `resumeFrom` or `continueFrom`.\n * Captured at construction so it survives lifecycle cleanup.\n */\n readonly isResume: boolean;\n\n constructor(options: {\n sessionId: string;\n harness: HarnessAgentAdapter;\n underlyingSession: HarnessAgentAdapterSession;\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n ownsSandboxLifecycle?: boolean;\n sessionWorkDir: string;\n toolApproval: HarnessAgentToolApprovalConfiguration | undefined;\n pendingToolApprovals?: readonly HarnessAgentPendingToolApproval[];\n pendingToolResults?: readonly HarnessAgentPendingToolResult[];\n turnState?: HarnessAgentTurnState;\n }) {\n this.sessionId = options.sessionId;\n this.harness = options.harness;\n this.underlyingSession = options.underlyingSession;\n this.sandboxSession = options.sandboxSession;\n this.ownsSandboxLifecycle = options.ownsSandboxLifecycle ?? true;\n this.sessionWorkDir = options.sessionWorkDir;\n this.toolApproval = options.toolApproval;\n for (const approval of options.pendingToolApprovals ?? []) {\n this.pendingToolApprovals.set(approval.approvalId, approval);\n }\n for (const pendingResult of options.pendingToolResults ?? []) {\n this.pendingToolResults.set(pendingResult.toolCallId, pendingResult);\n }\n this.turnState =\n options.turnState ??\n (this.pendingToolApprovals.size > 0\n ? 'awaiting-approval'\n : this.pendingToolResults.size > 0\n ? 'awaiting-tool-result'\n : 'idle');\n this.isResume = options.underlyingSession.isResume;\n }\n\n /**\n * Active sandbox session.\n *\n * @internal — accessed by session turn and lifecycle drivers.\n */\n getSandboxSession(): HarnessV1NetworkSandboxSession | SandboxSession {\n if (this.sessionState !== 'active' || this.sandboxSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} has ended and cannot be reused.`,\n );\n }\n return this.sandboxSession;\n }\n\n /**\n * Working directory the agent runs in for this session. Used to strip the\n * prefix from absolute paths in stream events before they reach consumers.\n *\n * @internal — accessed by session turn drivers.\n */\n getSessionWorkDir(): string {\n return this.sessionWorkDir;\n }\n\n hasUnfinishedTurn(): boolean {\n return this.turnState !== 'idle';\n }\n\n promptTurn<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n >(options: {\n prompt: HarnessAgentPrompt;\n instructions: string | undefined;\n tools: TOOLS;\n activeTools: ToolSet;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n output: OUTPUT | undefined;\n telemetry: TelemetryOptions | undefined;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requirePromptableTurn();\n const sandboxSession = this.getSandboxSession();\n const turnId = this.startTrackedTurn();\n try {\n const turn = runPrompt<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n harness: this.harness,\n session,\n prompt: options.prompt,\n instructions: options.instructions,\n tools: options.tools,\n activeTools: options.activeTools,\n toolSpecs: options.toolSpecs,\n builtinToolFiltering: options.builtinToolFiltering,\n sandboxSession: getRestrictedSandboxSession(sandboxSession),\n sessionWorkDir: this.sessionWorkDir,\n runtimeContext: options.runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat: options.responseFormat,\n output: options.output,\n telemetry: options.telemetry,\n stopConditions: options.stopConditions,\n toolApproval: this.toolApproval,\n pendingToolApprovals: this.getPendingToolApprovals(),\n pendingToolResults: this.getPendingToolResults(),\n onPendingToolApproval: approval => {\n this.pendingToolApprovals.set(approval.approvalId, approval);\n this.markAwaitingApprovalIfActive();\n },\n onToolApprovalSettled: approvalId => {\n this.pendingToolApprovals.delete(approvalId);\n },\n onPendingToolResult: pendingResult => {\n this.pendingToolResults.set(pendingResult.toolCallId, pendingResult);\n this.markAwaitingToolResultIfActive();\n },\n onToolResultSettled: toolCallId => {\n this.pendingToolResults.delete(toolCallId);\n },\n onTurnFinished: () => {\n this.finishTrackedTurn({ turnId });\n },\n onTurnFailed: () => {\n this.finishTrackedTurn({ turnId });\n },\n onPromptControlAvailable: control => {\n this.setPromptControl({ turnId, control });\n },\n isTurnSuspending: () =>\n this.activeTurnSequence === turnId && this.suspendedTurnState != null,\n onStopConditionMet: () =>\n this.captureStopConditionBoundary({ session, turnId }),\n });\n return turn;\n } catch (error) {\n this.finishTrackedTurn({ turnId });\n throw error;\n }\n }\n\n continueTurn<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n >(options: {\n instructions: string | undefined;\n tools: TOOLS;\n activeTools: ToolSet;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n output: OUTPUT | undefined;\n telemetry: TelemetryOptions | undefined;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApprovalContinuations?:\n | readonly HarnessAgentToolApprovalContinuation[]\n | undefined;\n toolResultContinuations?:\n | readonly HarnessAgentToolResultContinuation[]\n | undefined;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requireContinuableTurn();\n const sandboxSession = this.getSandboxSession();\n const turnId = this.startTrackedTurn();\n try {\n const turn = runPrompt<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n harness: this.harness,\n session,\n mode: 'continue',\n instructions: options.instructions,\n tools: options.tools,\n activeTools: options.activeTools,\n toolSpecs: options.toolSpecs,\n builtinToolFiltering: options.builtinToolFiltering,\n sandboxSession: getRestrictedSandboxSession(sandboxSession),\n sessionWorkDir: this.sessionWorkDir,\n runtimeContext: options.runtimeContext,\n abortSignal: options.abortSignal,\n responseFormat: options.responseFormat,\n output: options.output,\n telemetry: options.telemetry,\n stopConditions: options.stopConditions,\n toolApproval: this.toolApproval,\n pendingToolApprovals: this.getPendingToolApprovals(),\n pendingToolResults: this.getPendingToolResults(),\n toolApprovalContinuations: options.toolApprovalContinuations,\n toolResultContinuations: options.toolResultContinuations,\n onPendingToolApproval: approval => {\n this.pendingToolApprovals.set(approval.approvalId, approval);\n this.markAwaitingApprovalIfActive();\n },\n onToolApprovalSettled: approvalId => {\n this.pendingToolApprovals.delete(approvalId);\n },\n onPendingToolResult: pendingResult => {\n this.pendingToolResults.set(pendingResult.toolCallId, pendingResult);\n this.markAwaitingToolResultIfActive();\n },\n onToolResultSettled: toolCallId => {\n this.pendingToolResults.delete(toolCallId);\n },\n onTurnFinished: () => {\n this.finishTrackedTurn({ turnId });\n },\n onTurnFailed: () => {\n this.finishTrackedTurn({ turnId });\n },\n onPromptControlAvailable: control => {\n this.setPromptControl({ turnId, control });\n },\n isTurnSuspending: () =>\n this.activeTurnSequence === turnId && this.suspendedTurnState != null,\n onStopConditionMet: () =>\n this.captureStopConditionBoundary({ session, turnId }),\n });\n return turn;\n } catch (error) {\n this.finishTrackedTurn({ turnId });\n throw error;\n }\n }\n\n /**\n * Ask the underlying runtime to compact its context. The runtime performs\n * the compaction itself; when it completes, a `compaction` part appears on\n * the active (or next) turn's stream. Safe to call between turns for\n * runtimes whose compaction is session-scoped (e.g. Pi).\n *\n * Throws `HarnessCapabilityUnsupportedError` for harnesses that cannot\n * trigger compaction manually (e.g. Codex, which still auto-compacts under\n * the hood). Throws if the session has ended.\n */\n async compact(customInstructions?: string): Promise<void> {\n await this.requireReusableSession().doCompact(customInstructions);\n }\n\n /**\n * Submit another user message to the active turn.\n *\n * The runtime accepts the message for its next safe input boundary. Output\n * caused by the message remains part of the active turn's result stream.\n */\n async experimental_steerTurn(text: string): Promise<void> {\n this.requireReusableSession();\n const activePromptControl = this.activePromptControl;\n if (\n this.turnState !== 'running' ||\n this.suspendedTurnState != null ||\n activePromptControl == null\n ) {\n throw new Error(\n `Harness session ${this.sessionId} has no running turn to steer.`,\n );\n }\n\n const control = await activePromptControl.promise;\n if (\n control == null ||\n this.sessionState !== 'active' ||\n this.turnState !== 'running' ||\n this.suspendedTurnState != null ||\n this.activePromptControl !== activePromptControl ||\n this.activeTurnSequence !== activePromptControl.turnId\n ) {\n throw new Error(\n `Harness session ${this.sessionId} no longer has the running turn targeted for steering.`,\n );\n }\n\n if (control.submitUserMessage == null) {\n throw new HarnessCapabilityUnsupportedError({\n message: `Harness '${this.harness.harnessId}' does not support steering active turns.`,\n harnessId: this.harness.harnessId,\n });\n }\n\n await control.submitUserMessage(text);\n }\n\n /**\n * Park the session, returning a payload the caller can persist and later\n * pass to `agent.createSession({ sessionId, resumeFrom })` to reconnect.\n * The runtime and sandbox keep running; this local session handle becomes\n * unusable.\n */\n async detach(): Promise<HarnessAgentResumeSessionState> {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} is not active and cannot be detached.`,\n );\n }\n const session = this.underlyingSession;\n try {\n if (this.turnState !== 'idle') {\n return this.toResumeStateWithContinuation({\n continueFrom: await this.suspendCurrentTurn({ session }),\n });\n }\n const raw = await session.doDetach();\n const validated = await validateLifecycleStateData({\n harness: this.harness,\n state: raw,\n expectedType: 'resume-session',\n });\n return validated;\n } finally {\n this.endLocalHandle({ sessionState: 'detached' });\n }\n }\n\n /**\n * Persist enough state to resume later, then stop the runtime and any\n * harness-owned sandbox.\n * Returns the resume state for a future\n * `agent.createSession({ sessionId, resumeFrom })` call.\n */\n async stop(): Promise<HarnessAgentResumeSessionState> {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} is not active and cannot be stopped.`,\n );\n }\n const session = this.underlyingSession;\n const sandboxSession = this.getSandboxSession();\n try {\n if (this.turnState !== 'idle') {\n return this.toResumeStateWithContinuation({\n continueFrom: await this.suspendCurrentTurn({ session }),\n });\n }\n const raw = await session.doStop();\n const validated = await validateLifecycleStateData({\n harness: this.harness,\n state: raw,\n expectedType: 'resume-session',\n });\n return validated;\n } finally {\n this.endLocalHandle({ sessionState: 'stopped' });\n if (this.ownsSandboxLifecycle && 'stop' in sandboxSession) {\n await Promise.resolve(sandboxSession.stop()).catch(() => {});\n }\n }\n }\n\n /**\n * Stop the runtime and discard resumability. A harness-owned sandbox is\n * destroyed when supported; otherwise it is stopped.\n */\n async destroy(): Promise<void> {\n if (this.sessionState !== 'active') return;\n const session = this.underlyingSession;\n const sandboxSession = this.getSandboxSession();\n this.endLocalHandle({ sessionState: 'destroyed' });\n if (session != null) {\n await Promise.resolve(session.doDestroy()).catch(() => {});\n }\n if (!this.ownsSandboxLifecycle) return;\n if ('stop' in sandboxSession) {\n await Promise.resolve(\n sandboxSession.destroy?.() ?? sandboxSession.stop(),\n ).catch(() => {});\n }\n }\n\n /**\n * Gracefully freeze the active turn at the slice boundary and return the\n * continuation payload, **leaving the sandbox/runtime running** so the next\n * process can continue. Resolves once the in-flight `stream()` /\n * `continueStream()` has cleanly wound down at a precise cursor (see\n * `doSuspendTurn`).\n *\n * After this call the session is detached. This in-process handle no\n * longer drives turns; a future slice creates a fresh session from the\n * returned state. The sandbox is **not** stopped because bridge-backed\n * adapters may still have a live bridge.\n */\n async suspendTurn(): Promise<HarnessAgentContinueTurnState> {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} is not active and cannot be suspended.`,\n );\n }\n if (this.turnState === 'idle') {\n throw new Error(\n `Harness session ${this.sessionId} has no unfinished turn to suspend.`,\n );\n }\n const session = this.underlyingSession;\n try {\n return await this.suspendCurrentTurn({ session });\n } finally {\n this.endLocalHandle({ sessionState: 'detached' });\n }\n }\n\n private getPendingToolApprovals(): readonly HarnessAgentPendingToolApproval[] {\n return Array.from(this.pendingToolApprovals.values());\n }\n\n private getPendingToolResults(): readonly HarnessAgentPendingToolResult[] {\n return Array.from(this.pendingToolResults.values());\n }\n\n private addPendingToolState(\n state: HarnessAgentContinueTurnState,\n ): HarnessAgentContinueTurnState {\n const pendingToolApprovals = this.getPendingToolApprovals();\n const pendingToolResults = this.getPendingToolResults();\n if (pendingToolApprovals.length === 0 && pendingToolResults.length === 0) {\n return {\n type: state.type,\n harnessId: state.harnessId,\n specificationVersion: state.specificationVersion,\n data: state.data,\n };\n }\n return {\n ...state,\n ...(pendingToolApprovals.length > 0 ? { pendingToolApprovals } : {}),\n ...(pendingToolResults.length > 0 ? { pendingToolResults } : {}),\n };\n }\n\n private async suspendCurrentTurn(options: {\n session: HarnessAgentAdapterSession;\n }): Promise<HarnessAgentContinueTurnState> {\n this.clearActivePromptControl();\n this.suspendedTurnState ??= (async () => {\n const raw = await options.session.doSuspendTurn();\n const validated = await validateLifecycleStateData({\n harness: this.harness,\n state: raw,\n expectedType: 'continue-turn',\n });\n return this.addPendingToolState(validated);\n })();\n const state = await this.suspendedTurnState;\n this.turnState = 'suspended';\n return state;\n }\n\n private async captureStopConditionBoundary(options: {\n session: HarnessAgentAdapterSession;\n turnId: number;\n }): Promise<void> {\n if (\n this.sessionState !== 'active' ||\n this.activeTurnSequence !== options.turnId\n ) {\n return;\n }\n await this.suspendCurrentTurn({ session: options.session });\n }\n\n private toResumeStateWithContinuation(options: {\n continueFrom: HarnessAgentContinueTurnState;\n }): HarnessAgentResumeSessionState {\n const { continueFrom } = options;\n return {\n type: 'resume-session',\n harnessId: continueFrom.harnessId,\n specificationVersion: continueFrom.specificationVersion,\n data: continueFrom.data,\n continueFrom,\n };\n }\n\n private requirePromptableTurn(): void {\n if (this.turnState === 'idle') return;\n if (this.turnState === 'running') {\n throw new Error(\n `Harness session ${this.sessionId} already has a turn in progress.`,\n );\n }\n throw new Error(\n `Harness session ${this.sessionId} has an unfinished turn and must be continued before accepting a new prompt.`,\n );\n }\n\n private requireContinuableTurn(): void {\n if (\n this.turnState === 'awaiting-approval' ||\n this.turnState === 'awaiting-tool-result' ||\n this.turnState === 'suspended'\n ) {\n return;\n }\n if (this.turnState === 'running') {\n throw new Error(\n `Harness session ${this.sessionId} already has a turn in progress.`,\n );\n }\n throw new Error(\n `Harness session ${this.sessionId} has no unfinished turn to continue.`,\n );\n }\n\n private markAwaitingApprovalIfActive(): void {\n if (this.sessionState === 'active') {\n this.clearActivePromptControl();\n this.turnState = 'awaiting-approval';\n }\n }\n\n private markAwaitingToolResultIfActive(): void {\n if (this.sessionState === 'active') {\n this.clearActivePromptControl();\n this.turnState = 'awaiting-tool-result';\n }\n }\n\n private startTrackedTurn(): number {\n const turnId = ++this.turnSequence;\n this.activeTurnSequence = turnId;\n this.suspendedTurnState = undefined;\n this.turnState = 'running';\n this.clearActivePromptControl();\n let resolve!: (control: HarnessV1PromptControl | undefined) => void;\n const promise = new Promise<HarnessV1PromptControl | undefined>(\n resolvePromise => {\n resolve = resolvePromise;\n },\n );\n this.activePromptControl = {\n turnId,\n promise,\n resolve,\n settled: false,\n };\n return turnId;\n }\n\n private setPromptControl(options: {\n turnId: number;\n control: HarnessV1PromptControl;\n }): void {\n const activePromptControl = this.activePromptControl;\n if (\n this.sessionState !== 'active' ||\n this.turnState !== 'running' ||\n this.activeTurnSequence !== options.turnId ||\n activePromptControl?.turnId !== options.turnId\n ) {\n return;\n }\n this.settleActivePromptControl(options.control);\n }\n\n private settleActivePromptControl(\n control: HarnessV1PromptControl | undefined,\n ): void {\n const activePromptControl = this.activePromptControl;\n if (activePromptControl == null || activePromptControl.settled) return;\n activePromptControl.settled = true;\n activePromptControl.resolve(control);\n }\n\n private clearActivePromptControl(turnId?: number): void {\n if (\n turnId != null &&\n this.activePromptControl != null &&\n this.activePromptControl.turnId !== turnId\n ) {\n return;\n }\n this.settleActivePromptControl(undefined);\n this.activePromptControl = undefined;\n }\n\n private finishTrackedTurn(options: { turnId: number }): void {\n if (this.sessionState !== 'active') return;\n if (this.activeTurnSequence !== options.turnId) return;\n this.clearActivePromptControl(options.turnId);\n this.pendingToolApprovals.clear();\n this.pendingToolResults.clear();\n this.suspendedTurnState = undefined;\n this.turnState = 'idle';\n }\n\n private endLocalHandle(options: {\n sessionState: Exclude<HarnessAgentSessionState, 'active'>;\n }): void {\n this.clearActivePromptControl();\n this.sessionState = options.sessionState;\n this.underlyingSession = undefined;\n this.sandboxSession = undefined;\n }\n\n private requireReusableSession(): HarnessAgentAdapterSession {\n if (this.sessionState !== 'active' || this.underlyingSession == null) {\n throw new Error(\n `Harness session ${this.sessionId} has ended and cannot be reused.`,\n );\n }\n return this.underlyingSession;\n }\n}\n","import { HarnessError } from '../errors/harness-error';\nimport type {\n ModelMessage,\n ToolApprovalRequest,\n ToolApprovalResponse,\n} from '@ai-sdk/provider-utils';\n\nexport type HarnessAgentToolApprovalContinuation = {\n readonly approvalResponse: ToolApprovalResponse;\n readonly toolCall: {\n readonly type: 'tool-call';\n readonly toolCallId: string;\n readonly toolName: string;\n readonly input: unknown;\n readonly providerExecuted?: boolean;\n };\n};\n\n/**\n * Extract approval decisions that should continue a suspended harness turn.\n *\n * AI SDK clients send approval decisions as a trailing `role: \"tool\"` message\n * containing `tool-approval-response` parts. The response only carries the\n * approval id, so the harness has to recover the matching approval request\n * locally to find the original tool call before it can resume the paused turn.\n * Responses that already have a tool result are ignored, because those\n * approvals were already consumed by a prior continuation.\n */\nexport function collectHarnessAgentToolApprovalContinuations(input: {\n messages: readonly ModelMessage[];\n}): readonly HarnessAgentToolApprovalContinuation[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n const toolCallsByToolCallId = new Map<\n string,\n HarnessAgentToolApprovalContinuation['toolCall']\n >();\n const approvalRequestsByApprovalId = new Map<string, ToolApprovalRequest>();\n for (const message of input.messages) {\n if (message.role !== 'assistant' || typeof message.content === 'string') {\n continue;\n }\n for (const part of message.content) {\n if (part.type === 'tool-call') {\n toolCallsByToolCallId.set(part.toolCallId, {\n type: 'tool-call',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input,\n ...(part.providerExecuted !== undefined\n ? { providerExecuted: part.providerExecuted }\n : {}),\n });\n } else if (part.type === 'tool-approval-request') {\n approvalRequestsByApprovalId.set(part.approvalId, part);\n }\n }\n }\n\n const toolResultIds = new Set<string>();\n for (const part of lastMessage.content) {\n if (part.type === 'tool-result') {\n toolResultIds.add(part.toolCallId);\n }\n }\n\n const continuations: HarnessAgentToolApprovalContinuation[] = [];\n for (const part of lastMessage.content) {\n if (part.type !== 'tool-approval-response') continue;\n\n const approvalRequest = approvalRequestsByApprovalId.get(part.approvalId);\n if (approvalRequest == null) {\n throw new HarnessError({\n message: `Tool approval response '${part.approvalId}' does not match a prior tool approval request.`,\n });\n }\n if (toolResultIds.has(approvalRequest.toolCallId)) continue;\n\n const toolCall = toolCallsByToolCallId.get(approvalRequest.toolCallId);\n if (toolCall == null) {\n throw new HarnessError({\n message: `Tool approval request '${approvalRequest.approvalId}' references unknown tool call '${approvalRequest.toolCallId}'.`,\n });\n }\n\n continuations.push({\n approvalResponse: part,\n toolCall,\n });\n }\n\n return continuations;\n}\n","import type { ModelMessage, ToolResultOutput } from '@ai-sdk/provider-utils';\n\nexport type HarnessAgentToolResultContinuation = {\n readonly toolCallId: string;\n readonly output: unknown;\n readonly isError?: boolean;\n};\n\n/**\n * Extract client-provided tool results from the trailing tool message and\n * convert AI SDK model-output wrappers back into values a harness runtime can\n * return from its pending host-tool invocation.\n */\nexport function collectHarnessAgentToolResultContinuations(input: {\n messages: readonly ModelMessage[];\n}): readonly HarnessAgentToolResultContinuation[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n return lastMessage.content\n .filter(part => part.type === 'tool-result')\n .map(part =>\n toToolResultContinuation({\n toolCallId: part.toolCallId,\n output: part.output,\n }),\n );\n}\n\nfunction toToolResultContinuation(input: {\n toolCallId: string;\n output: ToolResultOutput;\n}): HarnessAgentToolResultContinuation {\n switch (input.output.type) {\n case 'text':\n case 'json':\n return {\n toolCallId: input.toolCallId,\n output: input.output.value,\n };\n case 'error-text':\n case 'error-json':\n return {\n toolCallId: input.toolCallId,\n output: input.output.value,\n isError: true,\n };\n case 'execution-denied':\n return {\n toolCallId: input.toolCallId,\n output: {\n type: input.output.type,\n reason: input.output.reason,\n },\n };\n case 'content':\n return {\n toolCallId: input.toolCallId,\n output: input.output,\n };\n }\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessV1Bootstrap } from '../../v1';\n\n/**\n * Version of the bootstrap recipe shape itself. Bump to force every existing\n * snapshot/marker to be invalidated regardless of recipe content.\n */\nexport const BOOTSTRAP_SCHEMA_VERSION = 1;\n\n/**\n * Deterministic 16-char hex identity derived from the recipe's content\n * (harnessId, bootstrapDir, file paths + contents, commands, schema version).\n * Two adapters with equivalent recipes produce the same identity; any\n * content change produces a different identity.\n *\n * Used by sandbox providers as part of the persistent sandbox name so\n * recipe changes automatically invalidate snapshots.\n */\nexport async function hashHarnessBootstrap(\n recipe: HarnessV1Bootstrap,\n): Promise<string> {\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n const pushString = (value: string) => {\n chunks.push(encoder.encode(value));\n chunks.push(encoder.encode('\\0'));\n };\n\n pushString(recipe.harnessId);\n pushString(recipe.bootstrapDir);\n\n const sortedFiles = [...recipe.files].sort((a, b) =>\n a.path.localeCompare(b.path),\n );\n for (const file of sortedFiles) {\n pushString(file.path);\n pushString(file.content);\n }\n\n pushString(JSON.stringify(recipe.commands));\n pushString(String(BOOTSTRAP_SCHEMA_VERSION));\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n const digest = await crypto.subtle.digest('SHA-256', buffer);\n const bytes = new Uint8Array(digest);\n let hex = '';\n for (let i = 0; i < 8; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n\n/**\n * Absolute path of the marker file the framework writes after a recipe runs\n * successfully. Presence of this path inside the sandbox indicates the recipe\n * with the matching `identity` has already been applied.\n */\nexport function bootstrapMarkerPath({\n recipe,\n identity,\n defaultWorkingDirectory,\n}: {\n recipe: HarnessV1Bootstrap;\n identity: string;\n defaultWorkingDirectory: string;\n}): string {\n return posix.join(\n resolveBootstrapPath({\n path: recipe.bootstrapDir,\n defaultWorkingDirectory,\n }),\n `.bootstrap-${identity}.ok`,\n );\n}\n\n/**\n * Apply a bootstrap recipe to a sandbox session idempotently. Reads the\n * marker file; if it exists, returns immediately. Otherwise creates the\n * bootstrap directory, writes the recipe's files, runs its commands\n * sequentially, and writes the marker on success.\n *\n * Safe to call multiple times. For sandboxes that already contain the\n * recipe (resumed from snapshot, reused across sessions, or applied by\n * an earlier process) this is a single fast read.\n */\nexport async function applyBootstrapRecipe({\n session,\n recipe,\n identity,\n defaultWorkingDirectory,\n abortSignal,\n}: {\n session: SandboxSession;\n recipe: HarnessV1Bootstrap;\n identity: string;\n defaultWorkingDirectory: string;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const markerPath = bootstrapMarkerPath({\n recipe,\n identity,\n defaultWorkingDirectory,\n });\n\n const existingMarker = await session.readTextFile({\n path: markerPath,\n abortSignal,\n });\n if (existingMarker !== null) {\n return;\n }\n\n const bootstrapDir = resolveBootstrapPath({\n path: recipe.bootstrapDir,\n defaultWorkingDirectory,\n });\n const mkdirResult = await session.run({\n command: 'mkdir -p \"$BOOTSTRAP_DIR\"',\n workingDirectory: defaultWorkingDirectory,\n env: { BOOTSTRAP_DIR: bootstrapDir },\n abortSignal,\n });\n if (mkdirResult.exitCode !== 0) {\n throw new Error(\n `Failed to create bootstrap directory for harness '${recipe.harnessId}' (exit ${mkdirResult.exitCode}): ${bootstrapDir}\\n${mkdirResult.stderr || mkdirResult.stdout}`,\n );\n }\n\n for (const file of recipe.files) {\n await session.writeTextFile({\n path: resolveBootstrapPath({\n path: file.path,\n defaultWorkingDirectory,\n }),\n content: file.content,\n abortSignal,\n });\n }\n\n for (const cmd of recipe.commands) {\n const result = await session.run({\n command: cmd.command,\n workingDirectory: bootstrapDir,\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Bootstrap command failed for harness '${recipe.harnessId}' (exit ${result.exitCode}): ${cmd.command}\\n${result.stderr || result.stdout}`,\n );\n }\n }\n\n await session.writeTextFile({\n path: markerPath,\n content: '',\n abortSignal,\n });\n}\n\nfunction resolveBootstrapPath({\n path,\n defaultWorkingDirectory,\n}: {\n path: string;\n defaultWorkingDirectory: string;\n}): string {\n return posix.isAbsolute(path)\n ? path\n : posix.resolve(defaultWorkingDirectory, path);\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessV1Bootstrap } from '../../v1';\nimport { resolveSandboxDefaultWorkingDirectory } from '../../utils/resolve-sandbox-default-working-directory';\nimport type { HarnessAgentSandboxConfig } from '../harness-agent-settings';\nimport { applyBootstrapRecipe, hashHarnessBootstrap } from './bootstrap-recipe';\n\nconst SANDBOX_BOOTSTRAP_IDENTITY_VERSION = 1;\n\ntype SandboxBootstrapSettings = Omit<HarnessAgentSandboxConfig, 'onSession'>;\n\nexport type SandboxBootstrapPlan = {\n readonly recipe?: HarnessV1Bootstrap;\n readonly recipeIdentity?: string;\n readonly identity?: string;\n readonly workDir?: string;\n readonly onFirstCreate?: (\n session: SandboxSession,\n opts: { abortSignal?: AbortSignal },\n ) => Promise<void>;\n};\n\nexport function validateSandboxBootstrapSettings(\n settings: SandboxBootstrapSettings,\n): void {\n if ((settings.onBootstrap == null) !== (settings.bootstrapHash == null)) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.onBootstrap` and `sandboxConfig.bootstrapHash` must be provided together.',\n );\n }\n\n if (settings.workDir != null) {\n normalizeSandboxWorkDir(settings.workDir);\n }\n}\n\nexport function normalizeSandboxWorkDir(workDir: string): string {\n if (workDir.length === 0) {\n throw new Error('HarnessAgent: `sandboxConfig.workDir` must not be empty.');\n }\n if (workDir.includes('\\0')) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.workDir` must not contain NUL.',\n );\n }\n if (workDir.includes('\\\\')) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.workDir` must use POSIX path separators.',\n );\n }\n if (posix.isAbsolute(workDir)) {\n throw new Error('HarnessAgent: `sandboxConfig.workDir` must be relative.');\n }\n\n const normalized = posix.normalize(workDir);\n if (\n normalized === '.' ||\n normalized === '..' ||\n normalized.startsWith('../')\n ) {\n throw new Error(\n 'HarnessAgent: `sandboxConfig.workDir` must stay inside the sandbox default working directory.',\n );\n }\n return normalized;\n}\n\nexport function resolveSessionWorkDir({\n defaultWorkingDirectory,\n harnessId,\n sessionId,\n workDir,\n}: {\n readonly defaultWorkingDirectory: string;\n readonly harnessId: string;\n readonly sessionId: string;\n readonly workDir?: string;\n}): string {\n return joinSandboxPath({\n base: defaultWorkingDirectory,\n path: workDir ?? `${harnessId}-${sessionId}`,\n });\n}\n\nexport async function createSandboxBootstrapPlan({\n recipe,\n settings,\n}: {\n readonly recipe?: HarnessV1Bootstrap;\n readonly settings: SandboxBootstrapSettings;\n}): Promise<SandboxBootstrapPlan> {\n const workDir =\n settings.workDir == null\n ? undefined\n : normalizeSandboxWorkDir(settings.workDir);\n const recipeIdentity =\n recipe == null ? undefined : await hashHarnessBootstrap(recipe);\n const hasCallerBootstrap = settings.onBootstrap != null;\n const needsCombinedIdentity =\n hasCallerBootstrap || (recipeIdentity != null && workDir != null);\n const identity =\n needsCombinedIdentity && (recipeIdentity != null || hasCallerBootstrap)\n ? await hashSandboxBootstrapIdentity({\n recipeIdentity,\n bootstrapHash: settings.bootstrapHash,\n workDir,\n })\n : recipeIdentity;\n\n return {\n ...(recipe != null ? { recipe } : {}),\n ...(recipeIdentity != null ? { recipeIdentity } : {}),\n ...(identity != null ? { identity } : {}),\n ...(workDir != null ? { workDir } : {}),\n ...(recipe != null || settings.onBootstrap != null\n ? {\n onFirstCreate: (session, opts) =>\n runSandboxBootstrap({\n session,\n recipe,\n recipeIdentity,\n workDir,\n onBootstrap: settings.onBootstrap,\n abortSignal: opts.abortSignal,\n }),\n }\n : {}),\n };\n}\n\nexport async function runSandboxBootstrap({\n session,\n recipe,\n recipeIdentity,\n workDir,\n onBootstrap,\n defaultWorkingDirectory,\n abortSignal,\n}: {\n readonly session: SandboxSession;\n readonly recipe?: HarnessV1Bootstrap;\n readonly recipeIdentity?: string;\n readonly workDir?: string;\n readonly onBootstrap?: SandboxBootstrapSettings['onBootstrap'];\n readonly defaultWorkingDirectory?: string;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n if (recipe == null && onBootstrap == null) return;\n\n const resolvedDefaultWorkingDirectory =\n defaultWorkingDirectory ??\n (await resolveSandboxDefaultWorkingDirectory({\n sandboxSession: session,\n abortSignal,\n }));\n\n if (recipe != null && recipeIdentity != null) {\n await applyBootstrapRecipe({\n session,\n recipe,\n identity: recipeIdentity,\n defaultWorkingDirectory: resolvedDefaultWorkingDirectory,\n abortSignal,\n });\n }\n\n if (onBootstrap == null) return;\n\n const bootstrapWorkDir =\n workDir == null\n ? resolvedDefaultWorkingDirectory\n : joinSandboxPath({\n base: resolvedDefaultWorkingDirectory,\n path: workDir,\n });\n\n await ensureSandboxDirectory({\n session,\n workDir: bootstrapWorkDir,\n abortSignal,\n });\n await onBootstrap({ session, workDir: bootstrapWorkDir, abortSignal });\n}\n\nexport async function ensureSandboxDirectory({\n session,\n workDir,\n abortSignal,\n}: {\n readonly session: SandboxSession;\n readonly workDir: string;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n const result = await session.run({\n command: 'mkdir -p \"$WORK_DIR\"',\n env: { WORK_DIR: workDir },\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to create sandbox work directory ${workDir} (exit ${result.exitCode}): ${result.stderr || result.stdout}`,\n );\n }\n}\n\nasync function hashSandboxBootstrapIdentity({\n recipeIdentity,\n bootstrapHash,\n workDir,\n}: {\n readonly recipeIdentity?: string;\n readonly bootstrapHash?: string;\n readonly workDir?: string;\n}): Promise<string> {\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n const pushString = (value: string) => {\n chunks.push(encoder.encode(value));\n chunks.push(encoder.encode('\\0'));\n };\n\n pushString(String(SANDBOX_BOOTSTRAP_IDENTITY_VERSION));\n pushString(recipeIdentity ?? '');\n pushString(bootstrapHash ?? '');\n pushString(workDir ?? '');\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n const digest = await crypto.subtle.digest('SHA-256', buffer);\n const bytes = new Uint8Array(digest);\n let hex = '';\n for (let i = 0; i < 8; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n\nfunction joinSandboxPath({\n base,\n path,\n}: {\n readonly base: string;\n readonly path: string;\n}): string {\n return posix.join(base, path);\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessV1NetworkSandboxSession } from '../v1';\n\nexport async function resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal,\n}: {\n readonly sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n readonly abortSignal?: AbortSignal;\n}): Promise<string> {\n if ('defaultWorkingDirectory' in sandboxSession) {\n return sandboxSession.defaultWorkingDirectory;\n }\n\n const result = await sandboxSession.run({\n command: 'pwd',\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to resolve sandbox default working directory (exit ${result.exitCode}): ${result.stderr || result.stdout}`,\n );\n }\n\n const cwd = result.stdout.trim();\n if (!posix.isAbsolute(cwd)) {\n throw new Error(\n `Failed to resolve sandbox default working directory: expected an absolute path, got ${JSON.stringify(cwd)}.`,\n );\n }\n return cwd === '/' ? cwd : cwd.replace(/\\/+$/, '');\n}\n","import { asArray } from '@ai-sdk/provider-utils';\nimport type { Telemetry } from 'ai';\nimport type { HarnessV1Diagnostic, HarnessV1Observability } from '../../v1';\nimport type {\n HarnessDebugConfig,\n HarnessDebugLevel,\n HarnessDiagnostic,\n HarnessDiagnosticConsumer,\n} from '../observability/types';\nimport type { HarnessAgentSettings } from '../harness-agent-settings';\n\nconst ENV_TRUTHY = new Set(['1', 'true', 'yes', 'on']);\n\nfunction parseList(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(',')\n .map(item => item.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\n/**\n * Resolve the effective debug config from explicit settings with env-var\n * fallbacks. `HARNESS_DEBUG*` only fill fields the consumer left unset — code is\n * always authoritative.\n */\nexport function resolveDebugConfig(\n debug: HarnessDebugConfig | undefined,\n env: Record<string, string | undefined> = process.env,\n): {\n enabled: boolean;\n level: HarnessDebugLevel;\n subsystems: string[] | undefined;\n} {\n const enabled =\n debug?.enabled ?? ENV_TRUTHY.has((env.HARNESS_DEBUG ?? '').toLowerCase());\n const level =\n debug?.level ??\n (env.HARNESS_DEBUG_LEVEL as HarnessDebugLevel | undefined) ??\n 'debug';\n const subsystems = debug?.subsystems\n ? [...debug.subsystems]\n : parseList(env.HARNESS_DEBUG_SUBSYSTEMS);\n return { enabled, level, subsystems };\n}\n\n/**\n * Map an adapter-emitted `HarnessV1Diagnostic` to the host-facing\n * `HarnessDiagnostic` (the external/telemetry surface). Identity-shaped today,\n * but an explicit boundary so the emission and consumption types can diverge.\n */\nfunction toHarnessDiagnostic(d: HarnessV1Diagnostic): HarnessDiagnostic {\n return {\n level: d.level,\n message: d.message,\n subsystem: d.subsystem,\n kind: d.kind,\n source: d.source,\n stream: d.stream,\n attrs: d.attrs,\n error: d.error,\n sessionId: d.sessionId,\n timestamp: d.timestamp,\n };\n}\n\nfunction formatForStderr(d: HarnessDiagnostic): string {\n const parts = [`[harness:${d.level}]`, d.subsystem, d.message].filter(\n Boolean,\n );\n let line = parts.join(' ');\n if (d.error) {\n line += ` (${d.error.name ?? 'Error'}: ${d.error.message})`;\n }\n return `${line}\\n`;\n}\n\n/**\n * Build the per-session observability handle the framework hands to `doStart`.\n * Returns `undefined` when diagnostics are disabled. When enabled, the `report`\n * sink maps each adapter-emitted `HarnessV1Diagnostic` to the host\n * `HarnessDiagnostic` and fans it out, non-lossy, to: the `HARNESS_DEBUG` stderr\n * default, the consumer's `onLog`, and any telemetry integration that\n * implements `ingestDiagnostic`. Adapters normalize their own source (bridge\n * wire frames, host logs) into `HarnessV1Diagnostic` before calling `report`.\n */\nexport function buildObservability(options: {\n settings: Pick<\n HarnessAgentSettings<any, any>,\n 'debug' | 'onLog' | 'telemetry'\n >;\n}): HarnessV1Observability | undefined {\n const resolved = resolveDebugConfig(options.settings.debug);\n if (!resolved.enabled) return undefined;\n\n const onLog = options.settings.onLog;\n const integrations = options.settings.telemetry?.integrations\n ? asArray(options.settings.telemetry.integrations)\n : [];\n const diagnosticConsumers = integrations.filter(\n (integration): integration is Telemetry & HarnessDiagnosticConsumer =>\n typeof (integration as HarnessDiagnosticConsumer).ingestDiagnostic ===\n 'function',\n );\n\n const report = (emitted: HarnessV1Diagnostic): void => {\n const diagnostic = toHarnessDiagnostic(emitted);\n try {\n process.stderr.write(formatForStderr(diagnostic));\n } catch {\n // Never let the stderr default break the turn.\n }\n onLog?.(diagnostic);\n for (const consumer of diagnosticConsumers) {\n consumer.ingestDiagnostic?.(diagnostic);\n }\n };\n\n return {\n debug: {\n enabled: true,\n level: resolved.level,\n ...(resolved.subsystems ? { subsystems: resolved.subsystems } : {}),\n },\n report,\n };\n}\n","import { HarnessCapabilityUnsupportedError } from '../../errors/harness-capability-unsupported-error';\nimport type { HarnessV1, HarnessV1BuiltinToolFiltering } from '../../v1';\nimport { NoSuchToolError, type ActiveTools } from 'ai';\nimport type { ToolSet } from '@ai-sdk/provider-utils';\n\nexport type ResolvedHarnessAgentToolFiltering<TUserTools extends ToolSet> = {\n readonly activeUserTools: TUserTools;\n readonly builtinToolFiltering?: HarnessV1BuiltinToolFiltering;\n};\n\nexport function resolveHarnessAgentToolFiltering<\n TAllTools extends ToolSet,\n TUserTools extends ToolSet,\n>(input: {\n harness: HarnessV1;\n userTools: TUserTools;\n allTools: TAllTools;\n activeTools: ActiveTools<TAllTools>;\n inactiveTools: ActiveTools<TAllTools>;\n}): ResolvedHarnessAgentToolFiltering<TUserTools> {\n if (input.activeTools !== undefined && input.inactiveTools !== undefined) {\n throw new Error(\n 'HarnessAgent: pass either `activeTools` or `inactiveTools`, not both.',\n );\n }\n\n const allToolNames = Object.keys(input.allTools);\n const activeTools = dedupeToolNames({ toolNames: input.activeTools });\n const inactiveTools = dedupeToolNames({ toolNames: input.inactiveTools });\n validateToolNames({\n requestedToolNames: activeTools ?? inactiveTools,\n availableToolNames: allToolNames,\n });\n\n const userToolNames = Object.keys(input.userTools);\n const activeUserToolNames =\n activeTools != null\n ? userToolNames.filter(name => activeTools.includes(name))\n : inactiveTools != null\n ? userToolNames.filter(name => !inactiveTools.includes(name))\n : userToolNames;\n\n const builtinToolNames = Object.keys(input.harness.builtinTools);\n const disabledBuiltinToolNames =\n activeTools != null\n ? builtinToolNames.filter(name => !activeTools.includes(name))\n : inactiveTools != null\n ? builtinToolNames.filter(name => inactiveTools.includes(name))\n : [];\n\n const builtinToolFiltering =\n disabledBuiltinToolNames.length > 0\n ? activeTools != null\n ? {\n mode: 'allow' as const,\n toolNames: builtinToolNames.filter(name =>\n activeTools.includes(name),\n ),\n }\n : { mode: 'deny' as const, toolNames: disabledBuiltinToolNames }\n : undefined;\n\n if (\n builtinToolFiltering != null &&\n input.harness.supportsBuiltinToolFiltering !== true &&\n input.harness.supportsBuiltinToolApprovals !== true\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message: `Harness '${input.harness.harnessId}' does not support built-in tool filtering controls.`,\n harnessId: input.harness.harnessId,\n });\n }\n\n return {\n activeUserTools: filterToolSet({\n tools: input.userTools,\n toolNames: activeUserToolNames,\n }),\n ...(builtinToolFiltering != null ? { builtinToolFiltering } : {}),\n };\n}\n\nfunction dedupeToolNames(input: {\n toolNames: ReadonlyArray<string> | undefined;\n}): ReadonlyArray<string> | undefined {\n return input.toolNames == null\n ? undefined\n : Array.from(new Set(input.toolNames));\n}\n\nfunction validateToolNames(input: {\n requestedToolNames: ReadonlyArray<string> | undefined;\n availableToolNames: ReadonlyArray<string>;\n}): void {\n if (input.requestedToolNames == null) return;\n for (const toolName of input.requestedToolNames) {\n if (!input.availableToolNames.includes(toolName)) {\n throw new NoSuchToolError({\n toolName,\n availableTools: [...input.availableToolNames],\n });\n }\n }\n}\n\nfunction filterToolSet<TUserTools extends ToolSet>(input: {\n tools: TUserTools;\n toolNames: ReadonlyArray<string>;\n}): TUserTools {\n const allowed = new Set(input.toolNames);\n return Object.fromEntries(\n Object.entries(input.tools).filter(([name]) => allowed.has(name)),\n ) as TUserTools;\n}\n","import type { HarnessV1Bootstrap, HarnessV1SandboxProvider } from '../v1';\nimport type { HarnessAgentAdapter } from './harness-agent-types';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport { applyBootstrapRecipe } from './internal/bootstrap-recipe';\nimport {\n createSandboxBootstrapPlan,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\n\ntype SandboxBootstrapSettings = Omit<HarnessAgentSandboxConfig, 'onSession'>;\n\n/**\n * Prepare a harness's sandbox template without running an agent. Idempotent: if\n * the template already exists (snapshot present, or marker on a non-snapshot\n * provider), this resolves quickly.\n *\n * Use from a CI/deploy script to amortize the first-session cost so production\n * sessions always resume from snapshot. For adapters without a bootstrap\n * recipe (no `getBootstrap`) this is a no-op.\n *\n * The temporary network sandbox session created during preparation is stopped\n * before the function resolves; the snapshot/template state persists in the\n * provider's native storage (for Vercel: as the `currentSnapshotId` of the\n * named template sandbox).\n */\nexport async function prepareHarnessSandboxTemplate(options: {\n readonly harness: HarnessAgentAdapter;\n readonly sandboxProvider: HarnessV1SandboxProvider;\n readonly sandboxConfig?: SandboxBootstrapSettings;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n const sandboxConfig = options.sandboxConfig ?? {};\n validateSandboxBootstrapSettings(sandboxConfig);\n\n const { harness, sandboxProvider, abortSignal } = options;\n\n let recipe: HarnessV1Bootstrap | undefined;\n if (harness.getBootstrap != null) {\n recipe = await harness.getBootstrap({ abortSignal });\n }\n\n const bootstrapPlan = await createSandboxBootstrapPlan({\n recipe,\n settings: sandboxConfig,\n });\n if (bootstrapPlan.identity == null || bootstrapPlan.onFirstCreate == null) {\n return;\n }\n\n const sandboxSession = await sandboxProvider.createSession({\n abortSignal,\n identity: bootstrapPlan.identity,\n onFirstCreate: bootstrapPlan.onFirstCreate,\n });\n\n // Unlike `prepareSandboxForHarness()` and `HarnessAgent.createSession()`, this function\n // does not apply the agent-specific sandbox config, since the function is meant as a\n // general harness utility, not for a concrete agent.\n try {\n if (bootstrapPlan.recipe != null && bootstrapPlan.recipeIdentity != null) {\n await applyBootstrapRecipe({\n session: sandboxSession.restricted(),\n recipe: bootstrapPlan.recipe,\n identity: bootstrapPlan.recipeIdentity,\n defaultWorkingDirectory: sandboxSession.defaultWorkingDirectory,\n abortSignal,\n });\n }\n } finally {\n await Promise.resolve(sandboxSession.stop()).catch(() => {});\n }\n}\n\n/** @deprecated Use `prepareHarnessSandboxTemplate` instead. */\nexport const prewarmHarness = prepareHarnessSandboxTemplate;\n","import type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport type { HarnessAgentAdapter } from './harness-agent-types';\nimport { resolveSandboxDefaultWorkingDirectory } from '../utils/resolve-sandbox-default-working-directory';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n normalizeSandboxWorkDir,\n runSandboxBootstrap,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\n\nconst PREPARED_SANDBOX_IDENTITY_VERSION = 1;\n\nexport type PrepareSandboxForHarnessResult = {\n readonly identity?: string;\n readonly recipeIdentities: Record<string, string>;\n readonly skippedHarnessIds: ReadonlyArray<string>;\n};\n\n/**\n * Apply one or more harness bootstrap recipes to an existing sandbox session.\n *\n * Use this when a sandbox provider or caller wants to prepare a reusable\n * sandbox template, image, or snapshot before creating live harness sessions.\n *\n * The function writes each adapter's bridge/bootstrap files, runs its install\n * commands, and then returns a deterministic identity derived from the applied\n * recipes and optional sandbox bootstrap configuration. Providers can use that\n * identity as the cache key for the prepared artifact.\n *\n * This function only mutates the supplied sandbox; the caller is responsible for\n * committing, snapshotting, or otherwise persisting that modified filesystem.\n * When a later `HarnessAgent` session uses a sandbox created from the persisted\n * artifact, the adapter recomputes the same recipe identity and the existing\n * bootstrap marker makes the bootstrap logic a no-op.\n *\n * Repeated harness IDs are prepared once. When multiple adapters use the same\n * ID, the last adapter in `harnesses` is used.\n */\nexport async function prepareSandboxForHarness(options: {\n readonly session: SandboxSession;\n readonly harnesses: ReadonlyArray<HarnessAgentAdapter>;\n readonly sandboxConfig?: HarnessAgentSandboxConfig;\n readonly abortSignal?: AbortSignal;\n}): Promise<PrepareSandboxForHarnessResult> {\n const sandboxConfig = options.sandboxConfig ?? {};\n validateSandboxBootstrapSettings(sandboxConfig);\n\n if (options.harnesses.length === 0) {\n throw new Error(\n 'prepareSandboxForHarness: at least one harness must be provided.',\n );\n }\n\n const harnesses = [\n ...new Map(\n options.harnesses.map(harness => [harness.harnessId, harness]),\n ).values(),\n ].sort((a, b) => a.harnessId.localeCompare(b.harnessId));\n\n const workDir =\n sandboxConfig.workDir == null\n ? undefined\n : normalizeSandboxWorkDir(sandboxConfig.workDir);\n const recipeIdentities: Record<string, string> = {};\n const skippedHarnessIds: string[] = [];\n let defaultWorkingDirectory: string | undefined;\n\n for (const harness of harnesses) {\n const recipe = await harness.getBootstrap?.({\n abortSignal: options.abortSignal,\n });\n if (recipe == null) {\n skippedHarnessIds.push(harness.harnessId);\n continue;\n }\n\n const recipeIdentity = await hashHarnessBootstrap(recipe);\n recipeIdentities[harness.harnessId] = recipeIdentity;\n defaultWorkingDirectory ??= await resolveSandboxDefaultWorkingDirectory({\n sandboxSession: options.session,\n abortSignal: options.abortSignal,\n });\n await applyBootstrapRecipe({\n session: options.session,\n recipe,\n identity: recipeIdentity,\n defaultWorkingDirectory,\n abortSignal: options.abortSignal,\n });\n }\n\n if (sandboxConfig.onBootstrap != null) {\n await runSandboxBootstrap({\n session: options.session,\n workDir,\n onBootstrap: sandboxConfig.onBootstrap,\n defaultWorkingDirectory,\n abortSignal: options.abortSignal,\n });\n }\n\n const identity = await resolvePreparedSandboxIdentity({\n recipeIdentities,\n bootstrapHash: sandboxConfig.bootstrapHash,\n workDir,\n });\n\n return {\n ...(identity != null ? { identity } : {}),\n recipeIdentities,\n skippedHarnessIds,\n };\n}\n\nasync function resolvePreparedSandboxIdentity({\n recipeIdentities,\n bootstrapHash,\n workDir,\n}: {\n readonly recipeIdentities: Record<string, string>;\n readonly bootstrapHash?: string;\n readonly workDir?: string;\n}): Promise<string | undefined> {\n const entries = Object.entries(recipeIdentities).sort(([a], [b]) =>\n a.localeCompare(b),\n );\n if (entries.length === 0 && bootstrapHash == null) {\n return undefined;\n }\n\n const encoder = new TextEncoder();\n const chunks: Uint8Array[] = [];\n const pushString = (value: string) => {\n chunks.push(encoder.encode(value));\n chunks.push(encoder.encode('\\0'));\n };\n\n pushString(String(PREPARED_SANDBOX_IDENTITY_VERSION));\n pushString(workDir ?? '');\n pushString(bootstrapHash ?? '');\n\n for (const [harnessId, identity] of entries) {\n pushString(harnessId);\n pushString(identity);\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const buffer = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n const digest = await crypto.subtle.digest('SHA-256', buffer);\n const bytes = new Uint8Array(digest);\n let hex = '';\n for (let i = 0; i < 8; i++) {\n hex += bytes[i].toString(16).padStart(2, '0');\n }\n return hex;\n}\n","import { AISDKError } from '@ai-sdk/provider';\nimport { HarnessError } from './harness-error';\n\nconst name = 'AI_HarnessSandboxAuthenticationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Thrown when a sandbox provider cannot authenticate or authorize the\n * operation needed to create or resume a harness sandbox. Providers should\n * preserve the underlying SDK failure as `cause` and supply a message that\n * explains how the consumer can configure credentials.\n */\nexport class HarnessSandboxAuthenticationError extends HarnessError {\n private readonly [symbol] = true;\n\n readonly sandboxProviderId: string;\n\n constructor({\n message,\n sandboxProviderId,\n cause,\n }: {\n message: string;\n sandboxProviderId: string;\n cause?: unknown;\n }) {\n super({ message, cause });\n Object.defineProperty(this, 'name', { value: name });\n this.sandboxProviderId = sandboxProviderId;\n }\n\n static isInstance(\n error: unknown,\n ): error is HarnessSandboxAuthenticationError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { HarnessCapabilityUnsupportedError } from '../errors/harness-capability-unsupported-error';\nimport { HarnessError } from '../errors/harness-error';\nimport { HarnessSandboxAuthenticationError } from '../errors/harness-sandbox-authentication-error';\n\nconst defaultErrorMessage = 'An error occurred.';\n\n/**\n * Returns a client-safe message for errors produced by the harness runtime.\n * Messages from explicitly reviewed harness error types are preserved. All\n * other errors are masked so provider, sandbox, and server details are not\n * exposed to clients by default.\n */\nexport function getHarnessErrorMessage(error: unknown): string {\n if (\n HarnessCapabilityUnsupportedError.isInstance(error) ||\n HarnessSandboxAuthenticationError.isInstance(error) ||\n (HarnessError.isInstance(error) && error.name === 'AI_HarnessError')\n ) {\n return error.message;\n }\n\n return defaultErrorMessage;\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport type { Telemetry } from 'ai';\nimport type { HarnessDiagnostic, HarnessDiagnosticConsumer } from './types';\n\n/**\n * A harness observability reporter that writes a unified, non-lossy\n * `events.jsonl` containing **both** the telemetry span lifecycle (turn / step\n * / tool) **and** the forwarded bridge diagnostics (console lines + structured\n * events). It is a single object registered in `telemetry.integrations`: the\n * framework drives its `Telemetry` methods for spans and calls\n * `ingestDiagnostic` for diagnostics.\n *\n * No external collector or OTel setup required — this is the AI-SDK-idiomatic\n * replacement for the original SDK's host-side artifact files.\n */\nexport interface FileReporterOptions {\n /** Directory for `events.jsonl` (created if absent). */\n dir: string;\n /**\n * Buffer a turn's records in memory and write them only if the turn produced\n * an error (an `error`-level diagnostic, a failed tool, or an error finish).\n * Default false (write everything).\n */\n failOnly?: boolean;\n /** File name within `dir`. Default `events.jsonl`. */\n fileName?: string;\n}\n\ntype Record_ = { ts: number } & Record<string, unknown>;\n\nexport type FileReporter = Telemetry & HarnessDiagnosticConsumer;\n\nexport function createFileReporter(options: FileReporterOptions): FileReporter {\n const fileName = options.fileName ?? 'events.jsonl';\n const path = `${options.dir}/${fileName}`;\n const failOnly = options.failOnly ?? false;\n\n // Per-turn buffers, keyed by the telemetry callId. Diagnostics (which carry a\n // sessionId, not a callId) attach to the most recently started, open turn.\n const turns = new Map<string, { lines: Record_[]; errored: boolean }>();\n let lastOpenCallId: string | undefined;\n let dirReady = false;\n\n const bucketFor = (callId: string) => {\n let bucket = turns.get(callId);\n if (!bucket) {\n bucket = { lines: [], errored: false };\n turns.set(callId, bucket);\n }\n return bucket;\n };\n\n const record = (callId: string | undefined, rec: Record_): void => {\n const id = callId ?? lastOpenCallId;\n if (id == null) {\n // No active turn — write standalone (best-effort).\n flushLines([rec]);\n return;\n }\n bucketFor(id).lines.push(rec);\n };\n\n const flushLines = (lines: Record_[]): void => {\n if (lines.length === 0) return;\n try {\n if (!dirReady) {\n mkdirSync(options.dir, { recursive: true });\n dirReady = true;\n }\n appendFileSync(path, lines.map(l => JSON.stringify(l)).join('\\n') + '\\n');\n } catch {\n // Best-effort: never let observability break a turn.\n }\n };\n\n const finishTurn = (callId: string): void => {\n const bucket = turns.get(callId);\n if (!bucket) return;\n turns.delete(callId);\n if (lastOpenCallId === callId) lastOpenCallId = undefined;\n if (failOnly && !bucket.errored) return;\n flushLines(bucket.lines);\n };\n\n return {\n onStart(event) {\n const e = event as {\n callId: string;\n operationId?: string;\n modelId?: string;\n provider?: string;\n messages?: unknown;\n instructions?: unknown;\n recordInputs?: boolean;\n };\n lastOpenCallId = e.callId;\n record(e.callId, {\n ts: Date.now(),\n kind: 'turn-start',\n callId: e.callId,\n operationId: e.operationId,\n provider: e.provider,\n modelId: e.modelId,\n // Input prompt, unless the consumer opted out via `recordInputs: false`.\n ...(e.recordInputs === false\n ? {}\n : { input: { messages: e.messages, instructions: e.instructions } }),\n });\n },\n onStepStart(event) {\n const e = event as { callId: string; stepNumber?: number };\n record(e.callId, {\n ts: Date.now(),\n kind: 'step-start',\n callId: e.callId,\n step: e.stepNumber,\n });\n },\n onToolExecutionStart(event) {\n const e = event as {\n callId: string;\n toolCall: { toolName: string; toolCallId: string; input: unknown };\n };\n record(e.callId, {\n ts: Date.now(),\n kind: 'tool-start',\n callId: e.callId,\n toolName: e.toolCall.toolName,\n toolCallId: e.toolCall.toolCallId,\n input: e.toolCall.input,\n });\n },\n onToolExecutionEnd(event) {\n const e = event as {\n callId: string;\n toolCall: { toolCallId: string };\n toolOutput: { type: string; output?: unknown; error?: unknown };\n };\n const isError = e.toolOutput.type === 'error';\n if (isError) bucketFor(e.callId).errored = true;\n record(e.callId, {\n ts: Date.now(),\n kind: 'tool-end',\n callId: e.callId,\n toolCallId: e.toolCall.toolCallId,\n isError,\n output: isError ? e.toolOutput.error : e.toolOutput.output,\n });\n },\n onStepFinish(event) {\n const e = event as {\n callId: string;\n usage?: unknown;\n content?: unknown[];\n recordOutputs?: boolean;\n };\n record(e.callId, {\n ts: Date.now(),\n kind: 'step-finish',\n callId: e.callId,\n usage: e.usage,\n // The model's output content, unless `recordOutputs: false`.\n ...(e.recordOutputs === false || e.content == null\n ? {}\n : { output: e.content }),\n });\n },\n onEnd(event) {\n const e = event as {\n callId: string;\n finishReason?: unknown;\n usage?: unknown;\n totalUsage?: unknown;\n };\n record(e.callId, {\n ts: Date.now(),\n kind: 'turn-finish',\n callId: e.callId,\n finishReason: e.finishReason,\n usage: e.totalUsage ?? e.usage,\n });\n finishTurn(e.callId);\n },\n onError(error) {\n if (lastOpenCallId != null) bucketFor(lastOpenCallId).errored = true;\n record(lastOpenCallId, {\n ts: Date.now(),\n kind: 'error',\n error:\n error instanceof Error\n ? { name: error.name, message: error.message }\n : error,\n });\n },\n ingestDiagnostic(diagnostic: HarnessDiagnostic) {\n if (diagnostic.level === 'error' && lastOpenCallId != null) {\n bucketFor(lastOpenCallId).errored = true;\n }\n record(lastOpenCallId, {\n ts: diagnostic.timestamp,\n kind: 'diagnostic',\n diagnostic,\n });\n },\n };\n}\n","import type { Telemetry } from 'ai';\n\n/**\n * A harness observability reporter that renders an ASCII trace tree of a\n * turn's span lifecycle (turn → steps → tools) to a stream at turn end. It is a\n * `Telemetry` integration — register it in `telemetry.integrations`. Useful for\n * zero-setup local debugging when no OTel collector is wired up; a real OTel\n * backend (via `@ai-sdk/otel`) is a strict superset.\n */\nexport interface TraceTreeReporterOptions {\n /** Where to write the rendered tree. Default `process.stderr.write`. */\n write?: (chunk: string) => void;\n}\n\ntype Node = {\n label: string;\n startMs: number;\n endMs?: number;\n children: Node[];\n};\n\nexport function createTraceTreeReporter(\n options: TraceTreeReporterOptions = {},\n): Telemetry {\n const write =\n options.write ?? ((chunk: string) => void process.stderr.write(chunk));\n\n type TurnState = {\n root: Node;\n step?: Node;\n tools: Map<string, Node>;\n };\n const turns = new Map<string, TurnState>();\n\n const render = (node: Node, depth: number): string => {\n const indent = ' '.repeat(depth);\n const dur =\n node.endMs != null\n ? `${Math.max(0, Math.round(node.endMs - node.startMs))}ms`\n : '(open)';\n let out = `${indent}- ${node.label} ${dur}\\n`;\n for (const child of node.children) out += render(child, depth + 1);\n return out;\n };\n\n return {\n onStart(event) {\n const e = event as {\n callId: string;\n operationId?: string;\n modelId?: string;\n };\n turns.set(e.callId, {\n root: {\n label: `${e.operationId ?? 'turn'}${e.modelId ? ` ${e.modelId}` : ''}`,\n startMs: Date.now(),\n children: [],\n },\n tools: new Map(),\n });\n },\n onStepStart(event) {\n const e = event as { callId: string; stepNumber?: number };\n const turn = turns.get(e.callId);\n if (!turn) return;\n const step: Node = {\n label: `step ${(e.stepNumber ?? turn.root.children.length) + 1}`,\n startMs: Date.now(),\n children: [],\n };\n turn.step = step;\n turn.root.children.push(step);\n },\n onToolExecutionStart(event) {\n const e = event as {\n callId: string;\n toolCall: { toolName: string; toolCallId: string };\n };\n const turn = turns.get(e.callId);\n const parent = turn?.step ?? turn?.root;\n if (!turn || !parent) return;\n const node: Node = {\n label: `tool ${e.toolCall.toolName}`,\n startMs: Date.now(),\n children: [],\n };\n turn.tools.set(e.toolCall.toolCallId, node);\n parent.children.push(node);\n },\n onToolExecutionEnd(event) {\n const e = event as {\n callId: string;\n toolCall: { toolCallId: string };\n toolOutput: { type: string };\n };\n const node = turns.get(e.callId)?.tools.get(e.toolCall.toolCallId);\n if (!node) return;\n node.endMs = Date.now();\n if (e.toolOutput.type === 'error') node.label += ' [error]';\n },\n onStepFinish(event) {\n const e = event as { callId: string };\n const turn = turns.get(e.callId);\n if (turn?.step) {\n turn.step.endMs = Date.now();\n turn.step = undefined;\n }\n },\n onEnd(event) {\n const e = event as { callId: string };\n const turn = turns.get(e.callId);\n if (!turn) return;\n turn.root.endMs = Date.now();\n turns.delete(e.callId);\n try {\n write(`\\n${render(turn.root, 0)}`);\n } catch {\n // Never let rendering break the turn.\n }\n },\n };\n}\n"],"mappings":"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","names":["AISDKError","name","marker","symbol","_a","_b","AISDKError","asArray","generateId","generateId","safeParseJSON","_a","_b","generateId","_a","_b","generateId","_a","_b","_a","_a","_b","safeValidateTypes","_a","_a","_b","_c","_d","_e","_f","_g","result","input","done","generateId","safeParseJSON","output","_a","_b","posix","posix","posix","_a","_b","name","_a","asArray","_b","generateId","name","_a","_a","_b","AISDKError","name","marker","symbol","_a","_b","AISDKError","_a","_b","_a","e"]}