@ai-sdk/harness 1.0.128 → 1.0.129
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.
- package/CHANGELOG.md +15 -0
- package/dist/agent/index.d.ts +18 -4
- package/dist/agent/index.js +22 -11
- package/dist/agent/index.js.map +1 -1
- package/package.json +5 -5
- package/src/agent/harness-agent-session.ts +9 -1
- package/src/agent/harness-agent-settings.ts +11 -4
- package/src/agent/harness-agent.ts +26 -9
- package/src/agent/internal/sandbox-bootstrap.ts +1 -1
- package/src/agent/internal/turn-telemetry.ts +7 -3
package/dist/agent/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors/harness-capability-unsupported-error.ts","../../src/errors/harness-error.ts","../../src/v1/harness-v1-network-sandbox-session.ts","../../src/v1/harness-session-data-directory-path.ts","../../src/v1/harness-v1-tool-filtering.ts","../../src/agent/harness-agent.ts","../../src/agent/internal/lifecycle-state-validation.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/get-own.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/utils/sandbox-home-dir.ts","../../src/agent/internal/on-bootstrap-marker.ts","../../src/agent/internal/resolve-observability.ts","../../src/agent/internal/tool-filtering.ts","../../src/agent/internal/prepared-sandbox-identity.ts","../../src/agent/create-harness-sandbox-template.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 { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\n\n/**\n * Connection details for a sandbox-exposed port. Headers are scoped to the\n * returned URL and must be included when opening the connection.\n */\nexport type HarnessV1PortEndpoint = {\n readonly url: string;\n readonly headers?: Readonly<Record<string, string>>;\n};\n\n/**\n * Fixed directory, relative to the sandbox's own HOME, that holds every\n * piece of state the harness machinery generates.\n */\nconst HARNESS_V1_STATE_DIRECTORY_NAME = '.ai-sdk-harness';\n\n/**\n * Fixed, non-configurable path for harness-generated state (bootstrap files,\n * markers, and `.agent-runs`) under the sandbox's own HOME, never under\n * {@link HarnessV1NetworkSandboxSession.defaultWorkingDirectory}. Resolve HOME\n * with `resolveSandboxHomeDir` when it is not already known. This works from\n * provider creation hooks that only have a plain sandbox session. The\n * framework also calls this with a symbolic `$HOME` when hashing bootstrap\n * recipes, so changes to the state path invalidate existing templates.\n */\nexport function harnessStateDirectoryPath({\n sandboxHomeDir,\n}: {\n sandboxHomeDir: string;\n}): string {\n return posix.join(sandboxHomeDir, HARNESS_V1_STATE_DIRECTORY_NAME);\n}\n\n/**\n * Network sandbox session returned by sandbox adapter creation and resume\n * functions. The harness keeps this for the lifetime of a session. It is itself a\n * {@link SandboxSession} (file I/O, exec, spawn) and adds the infra surface on\n * top: port resolution, lifecycle, and network-policy mutation.\n *\n * Code that should only touch the filesystem and spawn processes receives the\n * reduced view from {@link HarnessV1NetworkSandboxSession.restricted}, never the\n * network sandbox session itself — so it cannot stop the sandbox, change\n * network access, or transform requests.\n */\nexport interface HarnessV1NetworkSandboxSession extends SandboxSession {\n /**\n * Identifier for the sandbox session. Persist this separately from the\n * harness session ID and resume state when reattaching across processes.\n */\n readonly id: string;\n\n /**\n * The sandbox's default working directory — the absolute path that\n * `run`/`spawn` resolve relative commands against when no `workingDirectory`\n * is given. Read from the live sandbox, never hardcoded.\n *\n * The framework composes each session's working directory underneath this\n * path (`<defaultWorkingDirectory>/<harnessId>-<sessionId>`) so adapters do\n * not bake a provider-specific base into their own paths.\n */\n readonly defaultWorkingDirectory: string;\n\n /** Ports the sandbox exposes; resolvable via `getPortEndpoint`. */\n readonly ports: ReadonlyArray<number>;\n\n /**\n * Resolve the connection details for a sandbox-exposed port. Bridge-backed\n * adapters call this to open their WebSocket to the in-sandbox bridge.\n */\n readonly getPortEndpoint: (options: {\n port: number;\n protocol?: 'http' | 'https' | 'ws';\n }) => PromiseLike<HarnessV1PortEndpoint>;\n\n /**\n * Resolve a publicly-reachable URL for a sandbox-exposed port.\n *\n * @deprecated Use `getPortEndpoint` instead.\n */\n readonly getPortUrl: (options: {\n port: number;\n protocol?: 'http' | 'https' | 'ws';\n }) => PromiseLike<string>;\n\n /** Stop the sandbox. Idempotent. */\n readonly stop: () => PromiseLike<void>;\n\n /**\n * Stop the sandbox session, then perform any additional cleanup necessary\n * to destroy it, such as deleting its backing resource or freeing resources.\n * Implementations with no cleanup beyond stopping may delegate to `stop()`.\n * Implementations must handle both a still-running sandbox and a previously\n * stopped sandbox.\n */\n readonly destroy: () => PromiseLike<void>;\n\n /**\n * Update the sandbox's outbound network policy. Optional — implementations\n * without a local enforcement primitive omit this. Callers\n * use optional-call (`sandboxSession.setNetworkPolicy?.(policy)`); a\n * missing implementation is a no-op.\n */\n readonly setNetworkPolicy?: (\n policy: HarnessV1NetworkPolicy,\n ) => PromiseLike<void>;\n\n /**\n * Replace the sandbox's outbound request-transformation rules. Optional —\n * implementations expose this only when credentials can be injected outside\n * the sandbox security boundary. Calling this method assumes authority over\n * the complete transformation set; harness adapters should normally use\n * `addRequestTransformations` instead. Adapters may preserve legacy\n * credential-forwarding behavior when additive request transformations are\n * unavailable.\n */\n readonly setRequestTransformations?: (\n transformations: ReadonlyArray<HarnessV1RequestTransformation>,\n ) => PromiseLike<void>;\n\n /**\n * Add outbound request-transformation rules without replacing rules already\n * managed by the sandbox session. Optional for the same reason as\n * `setRequestTransformations`. Harness adapters should use this additive\n * capability unless they explicitly own the complete transformation set.\n */\n readonly addRequestTransformations?: (\n transformations: ReadonlyArray<HarnessV1RequestTransformation>,\n ) => PromiseLike<void>;\n\n /**\n * Replace the set of ports exposed by the sandbox. Full-replacement\n * semantics: ports omitted from the array are deregistered. Optional —\n * implementations that cannot expose ports omit this.\n */\n readonly setPorts?: (\n ports: ReadonlyArray<number>,\n options?: { abortSignal?: AbortSignal },\n ) => PromiseLike<void>;\n\n /**\n * Reduced view of this session, typed as the bare {@link SandboxSession}\n * (file I/O, exec, spawn) — nothing that could stop the sandbox or change\n * its network policy. Pass this to user-tool `execute()` calls and other\n * code that must not reach the infra surface.\n *\n * The returned object points at exactly the same underlying sandbox\n * resource as the network sandbox session it was produced from; it is only a\n * narrower surface over the same resource, not a separate sandbox. In\n * particular, it cannot mutate network access or request transformations.\n */\n readonly restricted: () => SandboxSession;\n}\n\n/**\n * Outbound network policy applied by the sandbox runtime.\n *\n * `'allow-all'` and `'deny-all'` are convenience presets. `'custom'` is an\n * allow-list with an optional CIDR deny-list that takes precedence:\n *\n * - Reachable hosts are the union of `allowedHosts` and `allowedCIDRs`.\n * - `deniedCIDRs` wins over both, useful for blocking cloud-metadata IPs while\n * otherwise allowing broad access.\n *\n * The two `'custom'` branches share the same discriminator but each requires\n * a different allow field. Specifying `'custom'` with only `deniedCIDRs`\n * (deny-only) is rejected at compile time — functionally it would be\n * equivalent to `'deny-all'`.\n */\nexport type HarnessV1NetworkPolicy =\n | { mode: 'allow-all' }\n | { mode: 'deny-all' }\n | {\n mode: 'custom';\n allowedHosts: ReadonlyArray<string>;\n allowedCIDRs?: ReadonlyArray<string>;\n deniedCIDRs?: ReadonlyArray<string>;\n }\n | {\n mode: 'custom';\n allowedHosts?: ReadonlyArray<string>;\n allowedCIDRs: ReadonlyArray<string>;\n deniedCIDRs?: ReadonlyArray<string>;\n };\n\ntype HarnessV1RequestTransformationPathMatcher =\n | { exact: string }\n | { startsWith: string }\n | { regex: string };\n\ntype HarnessV1RequestTransformationKeyValuePartMatcher =\n | { exact: string }\n | { startsWith: string }\n | { regex: string };\n\ntype HarnessV1RequestTransformationKeyValueMatcher = {\n readonly key?: HarnessV1RequestTransformationKeyValuePartMatcher;\n readonly value?: HarnessV1RequestTransformationKeyValuePartMatcher;\n};\n\n/**\n * Outbound HTTPS request transformation applied outside the sandbox security\n * boundary. The host is part of the match so each rule is self-contained and\n * several rules, including several for the same host, can be installed at\n * once.\n *\n * Credential values belong in `transform.headers`, while the sandbox process\n * receives only a non-secret placeholder. Implementations must overwrite\n * matching request headers after the request leaves the sandbox rather than\n * making transformed values available inside it.\n */\nexport type HarnessV1RequestTransformation = {\n readonly match: {\n readonly host: string;\n readonly path?: HarnessV1RequestTransformationPathMatcher;\n readonly method?: ReadonlyArray<string>;\n readonly queryString?: ReadonlyArray<HarnessV1RequestTransformationKeyValueMatcher>;\n readonly headers?: ReadonlyArray<HarnessV1RequestTransformationKeyValueMatcher>;\n };\n readonly transform: {\n readonly headers: Readonly<Record<string, string>>;\n };\n};\n\nexport type HarnessV1RequestTransformationSources<AuthenticationMode> = {\n env: Record<string, string>;\n sandboxEnv: Record<string, string>;\n auth: AuthenticationMode;\n};\n","import { posix } from 'node:path';\n\nexport function encodeHarnessPathSegment(value: string): string {\n const encoded = encodeURIComponent(value);\n if (encoded === '') return '%';\n if (encoded === '.') return '%2E';\n if (encoded === '..') return '%2E%2E';\n return encoded;\n}\n\n/**\n * Return the per-session harness state path under `.agent-runs`. Session IDs\n * occupy one encoded path segment, so path separators and parent-directory\n * references cannot move session data outside the harness state directory.\n */\nexport function harnessSessionDataDirectoryPath({\n stateDirectory,\n sessionId,\n}: {\n stateDirectory: string;\n sessionId: string;\n}): string {\n return posix.join(\n stateDirectory,\n '.agent-runs',\n encodeHarnessPathSegment(sessionId),\n );\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 { HarnessCapabilityUnsupportedError } from '../errors/harness-capability-unsupported-error';\nimport {\n harnessStateDirectoryPath,\n type HarnessV1,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1JSONSchema,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1ResponseFormat,\n} from '../v1';\nimport {\n asArray,\n asSchema,\n generateId,\n type InferToolSetContext,\n normalizeHeaders,\n validateTypes,\n type Context,\n type Experimental_SandboxSession as SandboxSession,\n type ModelMessage,\n type SystemModelMessage,\n type ToolApprovalResponse,\n type ToolResultPart,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport { mergeCallbacks, type ToolsContextSettings } from 'ai/internal';\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 HarnessAgentSkill,\n HarnessAgentToolSpec,\n HarnessSandboxTemplate,\n} from './harness-agent-types';\nimport { collectHarnessAgentToolApprovalContinuations } from './harness-agent-tool-approval-continuation';\nimport { collectHarnessAgentToolResultContinuations } from './harness-agent-tool-result-continuation';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n createSandboxBootstrapPlan,\n ensureSandboxDirectory,\n resolveSessionWorkDir,\n runSandboxBootstrap,\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 { resolveSandboxHomeDir } from '../utils/sandbox-home-dir';\nimport { getRestrictedSandboxSession } from '../utils/get-restricted-sandbox-session';\nimport type { HarnessAgentLifecycleCallbacks } from './internal/turn-telemetry';\nimport { createHarnessSandboxTemplate } from './create-harness-sandbox-template';\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\ntype HarnessAgentContinueTurnInput = {\n toolApprovalContinuations: readonly ToolApprovalResponse[];\n toolResultContinuations: readonly ToolResultPart[];\n};\n\ntype PreparedHarnessAgentTurnSettings<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n> = {\n model: string | undefined;\n skills: ReadonlyArray<HarnessAgentSkill>;\n instructions: string | undefined;\n tools: HarnessAllTools<THarness, TUserTools>;\n toolsContext: InferToolSetContext<HarnessAllTools<THarness, TUserTools>>;\n activeTools: TUserTools;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n};\n\ntype PreparedHarnessAgentPromptTurnInput<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n> = PreparedHarnessAgentTurnSettings<THarness, TUserTools> & {\n prompt: HarnessAgentPrompt;\n};\n\ntype PreparedHarnessAgentContinueTurnInput<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n> = PreparedHarnessAgentTurnSettings<THarness, TUserTools> & {\n toolApprovalContinuations: readonly ToolApprovalResponse[];\n toolResultContinuations: readonly ToolResultPart[];\n};\n\ntype HarnessAgentTurnResult<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> = {\n result: StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n done: Promise<void>;\n ready: Promise<void>;\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 CALL_OPTIONS = never,\n> implements Agent<\n CALL_OPTIONS,\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 CALL_OPTIONS\n >;\n private readonly stopConditions: Array<\n StopCondition<HarnessAllTools<THarness, TUserTools>, RUNTIME_CONTEXT>\n >;\n private readonly sandboxConfig: HarnessAgentSandboxConfig;\n private readonly builtinToolFiltering:\n | HarnessV1BuiltinToolFiltering\n | undefined;\n private readonly permissionMode: HarnessAgentPermissionMode;\n private readonly headers: Readonly<Record<string, string>> | undefined;\n\n constructor(\n settings: HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT,\n CALL_OPTIONS\n >,\n ) {\n if (settings.sandbox != null) {\n console.warn(\n 'HarnessAgent: `sandbox` is deprecated. Supply `sandboxSession` to createSession() instead.',\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 const forbiddenHeaders = new Set([\n 'authorization',\n 'x-api-key',\n 'user-agent',\n 'x-client-app',\n ]);\n const forbiddenHeader = Object.keys(settings.headers ?? {})\n .map(name => name.toLowerCase())\n .find(name => forbiddenHeaders.has(name));\n if (forbiddenHeader != null) {\n throw new Error(\n `HarnessAgent: \\`headers\\` must not include the managed header \\`${forbiddenHeader}\\`.`,\n );\n }\n const headers = normalizeHeaders(settings.headers);\n this.headers = Object.keys(headers).length === 0 ? undefined : headers;\n this.id = settings.id;\n const userTools = settings.tools ?? ({} as TUserTools);\n assertNoReservedQuestionTool({\n harness: settings.harness,\n userTools,\n });\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.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 /** Whether this agent parses completed turns with its configured output. */\n get hasOutput(): boolean {\n return this.settings.output != null;\n }\n\n getSandboxTemplate(): Promise<HarnessSandboxTemplate | undefined> {\n return createHarnessSandboxTemplate({\n harnesses: [this.settings.harness],\n sandboxConfig: this.sandboxConfig,\n });\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 * Rebinds host-only tool context for an unfinished turn resumed with\n * `continueFrom` (directly or through `resumeFrom`). Tool context is not\n * serialized into lifecycle state because it may contain credentials or\n * non-serializable host objects.\n */\n toolsContext?: ToolsContextSettings<TUserTools>['toolsContext'];\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 if (options?.toolsContext != null && effectiveContinueFrom == null) {\n throw new Error(\n 'HarnessAgent.createSession: `toolsContext` can only rebind an unfinished turn from `continueFrom` or `resumeFrom`.',\n );\n }\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 // Harness infrastructure always lives under the sandbox's own\n // HOME, never the session's working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal,\n }),\n }),\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 const recipe = await harness.getBootstrap?.({ abortSignal });\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\n // Ensure the harness bootstrap recipe on resumed sessions too. The\n // marker is keyed by recipe identity, so a resume whose bootstrap is\n // already current costs one file read, while a resume into a sandbox\n // bootstrapped by an older adapter build — a snapshot that outlived\n // the harness version that made it — would otherwise keep running a\n // stale bridge against a newer host, silently missing whatever the\n // newer protocol added.\n if (recipe != null) {\n const recipeIdentity = await hashHarnessBootstrap(recipe);\n try {\n await applyBootstrapRecipe({\n session: resumedSandboxSession.restricted(),\n recipe,\n identity: recipeIdentity,\n // Harness infrastructure always lives under the sandbox's own\n // HOME, never the working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: resumedSandboxSession,\n abortSignal,\n }),\n }),\n abortSignal,\n });\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n }\n } else {\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 // Harness infrastructure always lives under the sandbox's own\n // HOME, never the working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: createdSandboxSession,\n abortSignal,\n }),\n }),\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 runSandboxBootstrap({\n session: getRestrictedSandboxSession(sandboxSession),\n workDir: this.sandboxConfig.workDir,\n onBootstrap: this.sandboxConfig.onBootstrap,\n bootstrapHash: this.sandboxConfig.bootstrapHash,\n skipOnBootstrapIfMarked: true,\n abortSignal,\n });\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 ...(this.headers == null ? {} : { headers: this.headers }),\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 turnSettings: effectiveContinueFrom?.turnSettings,\n resumedToolsContext: options?.toolsContext,\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 CALL_OPTIONS,\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 continueTurnInput = this._resolveContinueTurnInput(options);\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const { result, done } =\n continueTurnInput == null\n ? await this._startPromptTurn({ options, runtimeContext })\n : await this._startContinueTurn({\n session: options.session,\n turnInput: continueTurnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n });\n await done;\n return this._toGenerateResult(result);\n }\n\n async stream(\n options: AgentStreamParameters<\n CALL_OPTIONS,\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 continueTurnInput = this._resolveContinueTurnInput(options);\n const runtimeContext = {} as RUNTIME_CONTEXT;\n const { result, ready } =\n continueTurnInput == null\n ? await this._startPromptTurn({ options, runtimeContext })\n : await this._startContinueTurn({\n session: options.session,\n turnInput: continueTurnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n });\n await ready;\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 ToolApprovalResponse[];\n toolResultContinuations?: readonly ToolResultPart[];\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 { result, done } = await this._startContinueTurn({\n session: options.session,\n turnInput: {\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\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 ToolApprovalResponse[];\n toolResultContinuations?: readonly ToolResultPart[];\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 { result, ready } = await this._startContinueTurn({\n session: options.session,\n turnInput: {\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\n });\n await ready;\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 async _startPromptTurn(input: {\n options: AgentCallParameters<\n CALL_OPTIONS,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions;\n runtimeContext: RUNTIME_CONTEXT;\n }): Promise<\n HarnessAgentTurnResult<THarness, TUserTools, RUNTIME_CONTEXT, OUTPUT>\n > {\n const turnInput = await this._preparePromptTurnInput(input.options);\n const responseFormat = await this._resolveResponseFormat();\n\n return input.options.session.promptTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n ...this._buildTurnOptions({\n turnSettings: turnInput,\n runtimeContext: input.runtimeContext,\n abortSignal: input.options.abortSignal,\n responseFormat,\n callbacks: this._resolveLifecycleCallbacks(input.options),\n }),\n prompt: turnInput.prompt,\n });\n }\n\n private async _startContinueTurn(input: {\n session: HarnessAgentSession;\n turnInput: HarnessAgentContinueTurnInput;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n }): Promise<\n HarnessAgentTurnResult<THarness, TUserTools, RUNTIME_CONTEXT, OUTPUT>\n > {\n const turnInput = this._prepareContinueTurnInput(input.turnInput);\n const responseFormat = await this._resolveResponseFormat();\n\n return input.session.continueTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n ...this._buildTurnOptions({\n turnSettings: turnInput,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat,\n callbacks: this._resolveLifecycleCallbacks(),\n }),\n toolApprovalContinuations: turnInput.toolApprovalContinuations,\n toolResultContinuations: turnInput.toolResultContinuations,\n });\n }\n\n private _buildTurnOptions(input: {\n turnSettings: PreparedHarnessAgentTurnSettings<THarness, TUserTools>;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n callbacks: HarnessAgentLifecycleCallbacks<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n }) {\n return {\n model: input.turnSettings.model,\n skills: input.turnSettings.skills,\n instructions: input.turnSettings.instructions,\n tools: input.turnSettings.tools,\n toolsContext: input.turnSettings.toolsContext,\n activeTools: input.turnSettings.activeTools,\n toolSpecs: input.turnSettings.toolSpecs,\n builtinToolFiltering: input.turnSettings.builtinToolFiltering,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat: input.responseFormat,\n output: this.settings.output,\n telemetry: this.settings.telemetry,\n callbacks: input.callbacks,\n stopConditions: this.stopConditions,\n };\n }\n\n private _resolveLifecycleCallbacks(\n call?: AgentCallParameters<\n CALL_OPTIONS,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n >,\n ): HarnessAgentLifecycleCallbacks<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n > {\n return {\n onStart: mergeCallbacks(\n this.settings.onStart,\n call?.onStart ?? call?.experimental_onStart,\n ),\n onStepStart: mergeCallbacks(\n this.settings.onStepStart,\n call?.onStepStart ?? call?.experimental_onStepStart,\n ),\n onLanguageModelCallStart: this.settings.onLanguageModelCallStart,\n onLanguageModelCallEnd: this.settings.onLanguageModelCallEnd,\n onToolExecutionStart: mergeCallbacks(\n this.settings.onToolExecutionStart,\n call?.onToolExecutionStart ?? call?.experimental_onToolCallStart,\n ),\n onToolExecutionEnd: mergeCallbacks(\n this.settings.onToolExecutionEnd,\n call?.onToolExecutionEnd ?? call?.experimental_onToolCallFinish,\n ),\n onStepEnd: mergeCallbacks(\n this.settings.onStepEnd,\n call?.onStepEnd ?? call?.onStepFinish,\n ),\n onEnd: mergeCallbacks(this.settings.onEnd, call?.onEnd ?? call?.onFinish),\n };\n }\n\n private _resolveContinueTurnInput(options: {\n prompt?: string | ModelMessage[];\n messages?: ModelMessage[];\n }): HarnessAgentContinueTurnInput | undefined {\n if (typeof options.prompt === 'string') {\n return undefined;\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 toolApprovalContinuations,\n toolResultContinuations,\n };\n }\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 _resolvePromptTurnInput(options: {\n prompt?: string | ModelMessage[];\n messages?: ModelMessage[];\n }): HarnessAgentPrompt {\n if (typeof options.prompt === 'string') {\n return options.prompt;\n }\n const messages = Array.isArray(options.prompt)\n ? options.prompt\n : options.messages;\n if (Array.isArray(messages)) {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role === 'user') return 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 private async _preparePromptTurnInput(\n options: AgentCallParameters<\n CALL_OPTIONS,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions,\n ): Promise<PreparedHarnessAgentPromptTurnInput<THarness, TUserTools>> {\n let callOptions = options;\n if (\n this.settings.callOptionsSchema != null &&\n options.options !== undefined\n ) {\n const validatedOptions = await validateTypes({\n value: options.options,\n schema: this.settings.callOptionsSchema,\n context: { field: 'options' },\n });\n callOptions = {\n ...options,\n options: validatedOptions,\n } as unknown as typeof options;\n }\n\n const {\n session: _session,\n abortSignal: _abortSignal,\n timeout: _timeout,\n onStart: _onStart,\n experimental_onStart: _experimentalOnStart,\n onStepStart: _onStepStart,\n experimental_onStepStart: _experimentalOnStepStart,\n onToolExecutionStart: _onToolExecutionStart,\n experimental_onToolCallStart: _experimentalOnToolCallStart,\n onToolExecutionEnd: _onToolExecutionEnd,\n experimental_onToolCallFinish: _experimentalOnToolCallFinish,\n onStepEnd: _onStepEnd,\n onStepFinish: _onStepFinish,\n onEnd: _onEnd,\n onFinish: _onFinish,\n experimental_sandbox: _experimentalSandbox,\n ...promptOptions\n } = callOptions;\n\n const baseCallArgs = {\n model: this.settings.model,\n skills: this.settings.skills,\n instructions: this.settings.instructions,\n tools: this.settings.tools,\n toolsContext:\n this.settings.toolsContext ?? ({} as InferToolSetContext<TUserTools>),\n ...promptOptions,\n };\n const preparedCallArgs =\n (await this.settings.prepareCall?.(\n baseCallArgs as Parameters<\n NonNullable<\n HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT,\n CALL_OPTIONS\n >['prepareCall']\n >\n >[0],\n )) ?? baseCallArgs;\n if (this._resolveContinueTurnInput(preparedCallArgs) != null) {\n throw new Error(\n 'HarnessAgent.prepareCall must return a fresh user prompt, not a tool continuation.',\n );\n }\n\n return {\n prompt: this._resolvePromptTurnInput(preparedCallArgs),\n ...this._prepareTurnSettings({\n model: preparedCallArgs.model,\n skills: preparedCallArgs.skills,\n instructions: preparedCallArgs.instructions,\n tools: preparedCallArgs.tools,\n toolsContext: preparedCallArgs.toolsContext,\n }),\n };\n }\n\n private _prepareContinueTurnInput(options: {\n toolApprovalContinuations?: readonly ToolApprovalResponse[];\n toolResultContinuations?: readonly ToolResultPart[];\n }): PreparedHarnessAgentContinueTurnInput<THarness, TUserTools> {\n return {\n ...this._prepareTurnSettings({\n model: this.settings.model,\n skills: this.settings.skills,\n instructions: this.settings.instructions,\n tools: this.settings.tools,\n toolsContext: this.settings.toolsContext,\n }),\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n };\n }\n\n private _prepareTurnSettings(options: {\n model?: string;\n skills?: ReadonlyArray<HarnessAgentSkill>;\n instructions?: string | SystemModelMessage;\n tools?: TUserTools;\n toolsContext?: InferToolSetContext<TUserTools>;\n }): PreparedHarnessAgentTurnSettings<THarness, TUserTools> {\n const userTools = options.tools ?? ({} as TUserTools);\n assertNoReservedQuestionTool({\n harness: this.settings.harness,\n userTools,\n });\n const tools = {\n ...this.settings.harness.builtinTools,\n ...userTools,\n } as HarnessAllTools<THarness, TUserTools>;\n const toolFiltering = resolveHarnessAgentToolFiltering({\n harness: this.settings.harness,\n userTools,\n allTools: tools,\n activeTools: this.settings.activeTools,\n inactiveTools: this.settings.inactiveTools,\n });\n return {\n model: options.model,\n skills: options.skills ?? [],\n instructions:\n typeof options.instructions === 'string'\n ? options.instructions\n : options.instructions?.content,\n tools,\n toolsContext: (options.toolsContext ?? {}) as InferToolSetContext<\n HarnessAllTools<THarness, TUserTools>\n >,\n activeTools: toolFiltering.activeUserTools,\n toolSpecs: this._toToolSpecs(toolFiltering.activeUserTools),\n builtinToolFiltering: toolFiltering.builtinToolFiltering,\n };\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(activeUserTools: TUserTools): HarnessAgentToolSpec[] {\n const specs: HarnessAgentToolSpec[] = [];\n for (const [name, tool] of Object.entries(\n 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\nfunction assertNoReservedQuestionTool(input: {\n harness: HarnessV1;\n userTools: ToolSet;\n}): void {\n if (\n Object.prototype.hasOwnProperty.call(\n input.harness.builtinTools,\n 'askUserQuestions',\n ) &&\n Object.prototype.hasOwnProperty.call(input.userTools, 'askUserQuestions')\n ) {\n throw new Error(\n \"HarnessAgent tool name 'askUserQuestions' is reserved for harness question requests.\",\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 ...(state.turnSettings !== undefined\n ? { turnSettings: state.turnSettings }\n : {}),\n } as STATE;\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 HarnessV1Skill,\n type HarnessV1StreamPart,\n type HarnessV1ToolSpec,\n} from '../../v1';\nimport { toHarnessStream } from './to-harness-stream';\nimport {\n executeTool,\n generateId,\n type InferToolSetContext,\n isExecutableTool,\n safeParseJSON,\n type Context,\n type Experimental_SandboxSession as SandboxSession,\n type ToolApprovalResponse,\n type ToolResultPart,\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 {\n asLanguageModelUsage,\n parseToolCall,\n validateToolContext,\n} from 'ai/internal';\nimport type {\n ContentPart,\n OutputInterface as Output,\n ProviderMetadata,\n StepResult,\n StopCondition,\n TelemetryOptions,\n TextStreamPart,\n TypedToolCall,\n TypedToolError,\n TypedToolResult,\n} from 'ai';\nimport type { HarnessAgentToolApprovalConfiguration } from '../harness-agent-settings';\nimport { HarnessStreamTextResult } from './harness-stream-text-result';\nimport { getOwn } from './get-own';\nimport { translateStreamPart } from './translate-stream-part';\nimport {\n createToolInputWorkDirStripper,\n stripParsedToolInputWorkDir,\n stripWorkDir,\n} from './strip-work-dir';\nimport {\n createTurnLifecycle,\n type HarnessAgentLifecycleCallbacks,\n type TurnLifecycle,\n} from './turn-telemetry';\nimport { resolveCustomToolApproval } from './permission-mode';\nimport { logBridgeError } from '../../utils/bridge-diagnostics';\nimport { pinSandboxChannelEventCheckpoint } from '../../utils/sandbox-channel';\n\nconst invalidToolInputMessage = 'Tool input validation failed.';\n\nfunction unwrapToolResultOutput(toolResult: ToolResultPart): {\n output: unknown;\n isError?: boolean;\n} {\n switch (toolResult.output.type) {\n case 'text':\n case 'json':\n return { output: toolResult.output.value };\n case 'error-text':\n case 'error-json':\n return { output: toolResult.output.value, isError: true };\n case 'execution-denied':\n return {\n output: {\n type: toolResult.output.type,\n reason: toolResult.output.reason,\n },\n };\n case 'content':\n return { output: toolResult.output };\n }\n}\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 model?: string;\n skills?: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext?: InferToolSetContext<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 callbacks?: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n stopConditions?: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApproval?: HarnessAgentToolApprovalConfiguration | undefined;\n pendingToolApprovals?: readonly HarnessV1PendingToolApproval[];\n pendingToolResults?: readonly HarnessV1PendingToolResult[];\n toolApprovalContinuations?: readonly ToolApprovalResponse[] | undefined;\n toolResultContinuations?: readonly ToolResultPart[] | 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 callId = generateId();\n const toolsContext = input.toolsContext ?? ({} as InferToolSetContext<TOOLS>);\n const result = new HarnessStreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n tools: input.tools,\n runtimeContext: input.runtimeContext,\n toolsContext,\n harnessId: input.harness.harnessId,\n callId,\n modelId: input.model ?? '',\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 const activeToolNames = Object.keys(input.tools).filter(\n toolName =>\n Object.prototype.hasOwnProperty.call(activeTools, toolName) ||\n (Object.prototype.hasOwnProperty.call(\n input.harness.builtinTools,\n toolName,\n ) &&\n isHarnessV1BuiltinToolIncluded({\n toolName,\n toolFiltering: input.builtinToolFiltering,\n })),\n );\n\n const lifecycle = createTurnLifecycle({\n callId,\n telemetry: input.telemetry,\n callbacks: input.callbacks ?? {},\n harnessId: input.harness.harnessId,\n modelId: input.model,\n instructions: input.instructions,\n tools: input.tools,\n activeToolNames,\n toolSpecs: input.toolSpecs,\n messages:\n input.prompt == null\n ? []\n : [{ role: 'user', content: promptToText(input.prompt) }],\n runtimeContext: input.runtimeContext,\n toolsContext,\n output: input.output,\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 model: input.model,\n skills: input.skills ?? [],\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 model: input.model,\n skills: input.skills ?? [],\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 lifecycle.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 stripToolInputWorkDir = createToolInputWorkDirStripper({\n sessionWorkDir: input.sessionWorkDir,\n });\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.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 const settledBuiltinApprovalToolCallIds = 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 response until its step boundary. Harness runtimes\n // may execute tools before emitting `finish-step`, so tool lifecycle\n // notifications and consumer-visible tool outcomes are held until then.\n let stepText = '';\n let stepReasoning = '';\n let stepToolCalls: ContentPart<TOOLS>[] = [];\n let stepProviderToolResults: ContentPart<TOOLS>[] = [];\n let stepApprovalRequests: ContentPart<TOOLS>[] = [];\n let bufferedToolOutcomes: Array<() => void> = [];\n const toolExecutions = new Map<\n string,\n {\n toolCall: TypedToolCall<TOOLS>;\n toolOutput?: TypedToolResult<TOOLS> | TypedToolError<TOOLS>;\n toolExecutionMs?: number;\n }\n >();\n const publishToolExecutions = async (): Promise<void> => {\n for (const execution of toolExecutions.values()) {\n if (execution.toolOutput == null) continue;\n await lifecycle.toolExecutionStart({\n toolCall: execution.toolCall,\n });\n await lifecycle.toolExecutionEnd({\n toolCall: execution.toolCall,\n toolOutput: execution.toolOutput,\n toolExecutionMs: execution.toolExecutionMs ?? 0,\n });\n }\n for (const publish of bufferedToolOutcomes) publish();\n toolExecutions.clear();\n bufferedToolOutcomes = [];\n };\n let expectedStepToolCallCount: number | undefined;\n let observedStepToolCallCount = 0;\n let pauseAfterStepToolCalls = false;\n const buildModelCallContent = (): ContentPart<TOOLS>[] => {\n const parts: ContentPart<TOOLS>[] = [];\n if (stepText) parts.push({ type: 'text', text: stepText });\n if (stepReasoning) parts.push({ type: 'reasoning', text: stepReasoning });\n parts.push(...stepToolCalls);\n parts.push(...stepApprovalRequests);\n parts.push(...stepProviderToolResults);\n return parts;\n };\n const resetStepContent = (): void => {\n stepText = '';\n stepReasoning = '';\n stepToolCalls = [];\n stepProviderToolResults = [];\n stepApprovalRequests = [];\n bufferedToolOutcomes = [];\n toolExecutions.clear();\n expectedStepToolCallCount = undefined;\n observedStepToolCallCount = 0;\n pauseAfterStepToolCalls = false;\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 lifecycle.languageModelCallEnd({\n finishReason: input.finishReason.unified,\n usage: asLanguageModelUsage(input.usage),\n providerMetadata: input.providerMetadata,\n content: buildModelCallContent(),\n });\n await publishToolExecutions();\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 await lifecycle.stepEnd(step);\n resetStepContent();\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 } else {\n await publishToolExecutions();\n }\n await lifecycle.end({\n steps: completedSteps,\n usage: asLanguageModelUsage(zeroUsage),\n });\n await result.finish();\n };\n const enqueueApprovalRequest = (approval: {\n approvalId: string;\n toolCall: ToolCallTextStreamPart;\n isAutomatic?: boolean;\n }): void => {\n const part = {\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 result.enqueue(part);\n stepApprovalRequests.push(part as ContentPart<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: ToolApprovalResponse,\n toolCall: ToolCallTextStreamPart,\n ): void => {\n result.enqueueContinuation({\n type: 'tool-approval-response',\n approvalId: approval.approvalId,\n toolCall,\n approved: continuation.approved,\n ...(continuation.reason !== undefined\n ? { reason: continuation.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 ...(options.toolCall.providerMetadata !== undefined\n ? { providerOptions: options.toolCall.providerMetadata }\n : {}),\n } satisfies HarnessV1PendingToolResult);\n pendingResultsByToolCallId.set(pendingResult.toolCallId, pendingResult);\n onPendingToolResult(pendingResult);\n return pendingResult;\n };\n const enqueueHostToolOutcome = (options: {\n toolCall: ToolCallTextStreamPart;\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 submitToolResult: HarnessV1PromptControl['submitToolResult'] =\n async submission => {\n if (!input.isTurnSuspending?.()) {\n return control.submitToolResult(submission);\n }\n const toolCall =\n rawToolCallsByToolCallId.get(submission.toolCallId) ??\n pendingResultsByToolCallId.get(submission.toolCallId) ??\n pendingToolApprovals.find(\n approval => approval.toolCallId === submission.toolCallId,\n );\n if (toolCall == null) {\n throw new Error(\n `Unknown suspended tool call '${submission.toolCallId}'.`,\n );\n }\n const { toolCallId, ...completedResult } = submission;\n onPendingToolResult({\n toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n completedResult,\n });\n const parsed = toolCallsByToolCallId.get(toolCallId);\n if (parsed != null && !settledHostToolCallIds.has(toolCallId)) {\n bufferedToolOutcomes.push(() =>\n enqueueHostToolOutcome({\n toolCall: parsed,\n outcome: submission.isError\n ? { ok: false, error: submission.output }\n : { ok: true, output: submission.output },\n }),\n );\n }\n };\n const processPendingToolResultContinuation = async (\n pendingResult: HarnessV1PendingToolResult,\n continuation: ToolResultPart | undefined,\n ): Promise<void> => {\n const submission =\n continuation == null\n ? pendingResult.completedResult\n : {\n ...unwrapToolResultOutput(continuation),\n toolResult: {\n ...continuation,\n toolName: pendingResult.toolName,\n ...(continuation.providerOptions == null &&\n pendingResult.providerOptions != null\n ? { providerOptions: pendingResult.providerOptions }\n : {}),\n },\n };\n if (submission == null) return;\n settledHostToolCallIds.add(pendingResult.toolCallId);\n onToolResultSettled(pendingResult.toolCallId);\n await submitToolResult({\n toolCallId: pendingResult.toolCallId,\n ...submission,\n });\n pendingResultsByToolCallId.delete(pendingResult.toolCallId);\n };\n const processPendingApprovalContinuation = async (\n approval: HarnessV1PendingToolApproval,\n continuation: ToolApprovalResponse,\n ): Promise<'continued' | 'awaiting-tool-result'> => {\n const rawToolCall =\n (approval.kind === 'builtin'\n ? rawToolCallsByToolCallId.get(approval.toolCallId)\n : undefined) ??\n ({\n type: 'tool-call',\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n input: approval.input,\n providerExecuted: approval.providerExecuted,\n nativeName: approval.nativeName,\n } satisfies Extract<HarnessV1StreamPart, { type: 'tool-call' }>);\n let validatedToolCall: ToolCallTextStreamPart | undefined;\n let toolCall: ToolCallTextStreamPart;\n if (approval.kind === 'custom' && continuation.approved) {\n validatedToolCall = asToolCallTextStreamPart({\n part: await validateToolCall({\n event: rawToolCall,\n tools: input.tools,\n }),\n });\n toolCall = displayHostToolCall({\n toolCall: validatedToolCall,\n sessionWorkDir: input.sessionWorkDir,\n });\n } else {\n const parsedInput = await safeParseJSON({ text: rawToolCall.input });\n toolCall = {\n type: 'tool-call',\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n input: parsedInput.success ? parsedInput.value : rawToolCall.input,\n ...(rawToolCall.providerExecuted !== undefined\n ? { providerExecuted: rawToolCall.providerExecuted }\n : {}),\n };\n }\n\n enqueueApprovalResponse(approval, continuation, toolCall);\n onToolApprovalSettled(approval.approvalId);\n pendingApprovalsByApprovalId.delete(approval.approvalId);\n pendingApprovalsByToolCallId.delete(approval.toolCallId);\n\n if (approval.kind === 'builtin') {\n settledBuiltinApprovalToolCallIds.add(approval.toolCallId);\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.approved,\n reason: continuation.reason,\n });\n return 'continued';\n }\n\n settledHostToolCallIds.add(approval.toolCallId);\n if (!continuation.approved) {\n await submitToolResult({\n toolCallId: approval.toolCallId,\n output: {\n type: 'execution-denied',\n reason: continuation.reason,\n },\n });\n return 'continued';\n }\n\n if (validatedToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not validate approved host tool '${approval.toolName}'.`,\n );\n }\n\n if (validatedToolCall.invalid) {\n const error = new Error(invalidToolInputMessage);\n await submitToolResult({\n toolCallId: approval.toolCallId,\n output: { error: invalidToolInputMessage },\n isError: true,\n });\n bufferedToolOutcomes.push(() => {\n enqueueHostToolOutcome({\n toolCall,\n outcome: { ok: false, error },\n });\n });\n await publishToolExecutions();\n return 'continued';\n }\n\n await lifecycle.start(input.model);\n toolExecutions.set(rawToolCall.toolCallId, {\n toolCall: toolCall as TypedToolCall<TOOLS>,\n });\n const executionStartedAt = Date.now();\n const execution = await maybeExecuteHostTool({\n event: rawToolCall,\n parsedToolCall: validatedToolCall,\n tools: activeTools,\n toolsContext,\n wrappedExecuteTool: lifecycle.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n submitToolResult,\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 bufferedToolOutcomes.push(() => {\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 });\n if (!execution.executed) {\n recordPendingToolResult({ toolCall: rawToolCall });\n await finishForHostInputPause({ completeCurrentStep: false });\n return 'awaiting-tool-result';\n }\n const toolExecution = toolExecutions.get(rawToolCall.toolCallId)!;\n toolExecution.toolOutput = toToolOutput({\n toolCall,\n outcome: execution.outcome,\n });\n toolExecution.toolExecutionMs = Date.now() - executionStartedAt;\n bufferedToolOutcomes.push(() => {\n enqueueHostToolOutcome({\n toolCall,\n outcome: execution.outcome,\n });\n });\n await publishToolExecutions();\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 || pendingResult.completedResult != null) {\n await processPendingToolResultContinuation(\n pendingResult,\n continuation,\n );\n if (pendingResult.completedResult == null) closingResumedStep = true;\n }\n }\n\n while (true) {\n if (\n pauseAfterStepToolCalls &&\n expectedStepToolCallCount != null &&\n observedStepToolCallCount >= expectedStepToolCallCount\n ) {\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n\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 { usage } = pendingStopBoundary;\n releasePendingStopBoundary();\n await lifecycle.end({\n steps: completedSteps,\n usage: asLanguageModelUsage(usage),\n });\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 requested turn model).\n if (value.type === 'stream-start') {\n const modelId = value.modelId ?? input.model;\n if (modelId != null) result.setModelId(modelId);\n await lifecycle.start(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 lifecycle.ensureStepOpen();\n }\n\n if (\n value.type === 'tool-input-start' ||\n value.type === 'tool-input-delta' ||\n value.type === 'tool-input-end'\n ) {\n if (\n settledHostToolCallIds.has(value.id) ||\n settledBuiltinApprovalToolCallIds.has(value.id)\n ) {\n continue;\n }\n for (const displayValue of stripToolInputWorkDir(value)) {\n for (const part of translateStreamPart<TOOLS>(\n displayValue,\n translateOptions,\n )) {\n result.enqueue(part);\n }\n }\n continue;\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 const settledBuiltinApprovalReplay =\n (displayValue.type === 'tool-call' ||\n displayValue.type === 'tool-approval-request') &&\n settledBuiltinApprovalToolCallIds.has(displayValue.toolCallId);\n\n if (settledHostInputReplay || settledBuiltinApprovalReplay) {\n continue;\n }\n if (displayValue.type === 'finish-step' && closingResumedStep) {\n closingResumedStep = false;\n await publishToolExecutions();\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 lifecycle.error(value.error);\n // A turn the caller itself aborted ends with an error-shaped part by\n // construction; diagnosing the caller's own signal to stderr reads\n // as a malfunction. `settleFailure` below still reports it as an\n // abort to the consumer.\n if (!input.abortSignal?.aborted) {\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'harness stream error',\n error: value.error,\n });\n }\n settleFailure(displayValue.error);\n return;\n }\n\n const translatedParts = translateStreamPart<TOOLS>(\n displayValue,\n translateOptions,\n );\n if (value.type === 'tool-result') {\n bufferedToolOutcomes.push(() => {\n for (const part of translatedParts) result.enqueue(part);\n });\n } else {\n for (const part of translatedParts) 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 let validatedHostToolCall: ToolCallTextStreamPart | undefined;\n if (displayValue.type === 'tool-call') {\n const isHostTool =\n value.type === 'tool-call' &&\n !value.providerExecuted &&\n hasTool({ tools: activeTools, toolName: value.toolName }) &&\n !(\n value.toolName === 'askUserQuestions' &&\n hasTool({\n tools: input.harness.builtinTools,\n toolName: value.toolName,\n })\n );\n const parsed = await validateToolCall<TOOLS>({\n event: isHostTool ? value : displayValue,\n tools: input.tools,\n });\n const parsedToolCall = asToolCallTextStreamPart({ part: parsed });\n validatedHostToolCall = isHostTool ? parsedToolCall : undefined;\n const displayToolCall = isHostTool\n ? displayHostToolCall({\n toolCall: parsedToolCall,\n sessionWorkDir: input.sessionWorkDir,\n })\n : parsedToolCall;\n rawToolCallsByToolCallId.set(displayValue.toolCallId, displayValue);\n toolCallsByToolCallId.set(displayValue.toolCallId, displayToolCall);\n result.enqueue(displayToolCall as TextStreamPart<TOOLS>);\n }\n\n if (value.type === 'text-delta') {\n stepText += value.delta;\n } else if (value.type === 'reasoning-delta') {\n stepReasoning += value.delta;\n }\n\n if (value.type === 'tool-call') {\n observedStepToolCallCount += 1;\n expectedStepToolCallCount ??= value.stepToolCallCount;\n const toolCall = toolCallsByToolCallId.get(value.toolCallId);\n if (toolCall != null) {\n stepToolCalls.push(toolCall as ContentPart<TOOLS>);\n toolExecutions.set(value.toolCallId, {\n toolCall: toolCall as TypedToolCall<TOOLS>,\n });\n }\n }\n\n if (value.type === 'tool-result') {\n const execution = toolExecutions.get(value.toolCallId);\n if (execution != null && execution.toolOutput == null) {\n execution.toolOutput = value.isError\n ? ({\n ...execution.toolCall,\n type: 'tool-error',\n error: value.result,\n } as TypedToolError<TOOLS>)\n : ({\n ...execution.toolCall,\n type: 'tool-result',\n output: value.result,\n } as TypedToolResult<TOOLS>);\n }\n if (\n rawToolCallsByToolCallId.get(value.toolCallId)?.providerExecuted ===\n true &&\n execution?.toolOutput != null\n ) {\n stepProviderToolResults.push(\n execution.toolOutput as ContentPart<TOOLS>,\n );\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 lifecycle.end({\n steps: completedSteps,\n usage: asLanguageModelUsage(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 const isClientExecutedBuiltin =\n toolCall.toolName === 'askUserQuestions' &&\n Object.prototype.hasOwnProperty.call(\n input.harness.builtinTools,\n toolCall.toolName,\n );\n if (\n !isClientExecutedBuiltin &&\n !hasTool({ tools: activeTools, toolName: toolCall.toolName })\n ) {\n const output = {\n type: 'execution-denied',\n reason: getHarnessV1BuiltinToolFilteringDenialReason({\n toolName: toolCall.toolName,\n }),\n };\n await submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n const execution = toolExecutions.get(toolCall.toolCallId);\n if (execution != null) {\n execution.toolOutput = toToolOutput({\n toolCall: parsedToolCall,\n outcome: { ok: true, output },\n });\n }\n continue;\n }\n if (isClientExecutedBuiltin) {\n recordPendingToolResult({ toolCall });\n if (\n expectedStepToolCallCount != null &&\n observedStepToolCallCount < expectedStepToolCallCount\n ) {\n pauseAfterStepToolCalls = true;\n continue;\n }\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n if (validatedHostToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not validate host tool '${toolCall.toolName}'.`,\n );\n }\n if (validatedHostToolCall.invalid) {\n settledHostToolCallIds.add(toolCall.toolCallId);\n toolExecutions.delete(toolCall.toolCallId);\n bufferedToolOutcomes.push(() => {\n result.enqueue({\n type: 'tool-error',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parsedToolCall.input,\n error: new Error(invalidToolInputMessage),\n dynamic: true,\n } as TextStreamPart<TOOLS>);\n });\n await submitToolResult({\n toolCallId: toolCall.toolCallId,\n output: { error: invalidToolInputMessage },\n isError: true,\n });\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 submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n const execution = toolExecutions.get(toolCall.toolCallId);\n if (execution != null) {\n execution.toolOutput = toToolOutput({\n toolCall: parsedToolCall,\n outcome: { ok: true, output },\n });\n }\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 if (\n expectedStepToolCallCount != null &&\n observedStepToolCallCount < expectedStepToolCallCount\n ) {\n pauseAfterStepToolCalls = true;\n continue;\n }\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n if (!isExecutableTool(activeTools[toolCall.toolName])) {\n recordPendingToolResult({ toolCall });\n if (\n expectedStepToolCallCount != null &&\n observedStepToolCallCount < expectedStepToolCallCount\n ) {\n pauseAfterStepToolCalls = true;\n continue;\n }\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n startHostToolExecution(\n (async () => {\n const executionStartedAt = Date.now();\n const execution = await maybeExecuteHostTool({\n event: toolCall,\n parsedToolCall: validatedHostToolCall,\n tools: activeTools,\n toolsContext,\n wrappedExecuteTool: lifecycle.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n submitToolResult,\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 bufferedToolOutcomes.push(() => {\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 });\n if (!execution.executed) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not execute host tool '${toolCall.toolName}'.`,\n );\n }\n const toolExecution = toolExecutions.get(toolCall.toolCallId);\n if (toolExecution != null) {\n toolExecution.toolOutput = toToolOutput({\n toolCall: parsedToolCall,\n outcome: execution.outcome,\n });\n toolExecution.toolExecutionMs = Date.now() - executionStartedAt;\n }\n })(),\n );\n }\n }\n await waitForOutstandingHostToolExecutions();\n const isTurnSuspending = input.isTurnSuspending?.() === true;\n if (isTurnSuspending) {\n await publishToolExecutions();\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 lifecycle.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 toToolOutput<TOOLS extends ToolSet>(input: {\n toolCall: ToolCallTextStreamPart;\n outcome: HostToolOutcome;\n}): TypedToolResult<TOOLS> | TypedToolError<TOOLS> {\n return input.outcome.ok\n ? ({\n ...input.toolCall,\n type: 'tool-result',\n output: input.outcome.output,\n } as TypedToolResult<TOOLS>)\n : ({\n ...input.toolCall,\n type: 'tool-error',\n error: input.outcome.error,\n } as TypedToolError<TOOLS>);\n}\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\nfunction displayHostToolCall(input: {\n toolCall: ToolCallTextStreamPart;\n sessionWorkDir: string;\n}): ToolCallTextStreamPart {\n return {\n ...input.toolCall,\n input: stripParsedToolInputWorkDir({\n value: input.toolCall.input,\n sessionWorkDir: input.sessionWorkDir,\n }),\n ...(input.toolCall.invalid\n ? { error: new Error(invalidToolInputMessage) }\n : {}),\n };\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 parsedToolCall: ToolCallTextStreamPart;\n tools: TOOLS;\n toolsContext: InferToolSetContext<TOOLS>;\n wrappedExecuteTool: TurnLifecycle<ToolSet, Context>['executeTool'];\n sandboxSession: SandboxSession;\n abortSignal: AbortSignal | undefined;\n submitToolResult: HarnessV1PromptControl['submitToolResult'];\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 if (input.parsedToolCall.invalid) {\n const error = new Error(invalidToolInputMessage);\n await input.submitToolResult({\n toolCallId: input.event.toolCallId,\n output: { error: invalidToolInputMessage },\n isError: true,\n });\n return { executed: true, outcome: { ok: false, error } };\n }\n\n let context: unknown;\n try {\n context = await validateToolContext({\n toolName: input.event.toolName,\n context: getOwn(input.toolsContext, input.event.toolName),\n contextSchema: tool.contextSchema,\n });\n } catch (err) {\n // Context is host-only and can contain credentials. Keep the detailed\n // validation error in the host-facing outcome, but never send its value or\n // schema diagnostics back to the runtime/model.\n await input.submitToolResult({\n toolCallId: input.event.toolCallId,\n output: { error: 'Tool context validation failed.' },\n isError: true,\n });\n return { executed: true, outcome: { ok: false, error: err } };\n }\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: input.parsedToolCall.input as never,\n options: {\n toolCallId: input.event.toolCallId,\n messages: [],\n abortSignal: input.abortSignal,\n context: context 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.submitToolResult({\n toolCallId: input.event.toolCallId,\n output,\n });\n return { executed: true, outcome: { ok: true, output } };\n } catch (err) {\n await input.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 optional harness-only fields. `providerExecuted` already lives on the\n * V4 type — `true` for adapter builtins (Claude Code's `Bash`, Codex's\n * `shell`), false/undefined for host tools — and is passed through to the AI\n * 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 type InferToolSetContext,\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: InferToolSetContext<TOOLS>;\n private readonly providerName: string;\n private readonly callId: string;\n private 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: InferToolSetContext<TOOLS>;\n harnessId: string;\n callId: string;\n modelId: 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.callId = options.callId;\n this.modelId = options.modelId;\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 setModelId(modelId: string): void {\n if (this.stepsBuffer.length === 0) {\n this.modelId = modelId;\n }\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: this.callId,\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: `${this.callId}-${this.stepNumber}`,\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: this.callId,\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: `${this.callId}-0`,\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 'reasoning-delta': {\n const last =\n this.currentStepContent[this.currentStepContent.length - 1];\n if (last && last.type === 'reasoning') {\n (last as { text: string }).text += part.text;\n } else {\n this.currentStepContent.push({\n type: 'reasoning',\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 default:\n // Boundary, raw, error, and finish parts are not ContentParts.\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","export function getOwn<T extends object>(\n obj: T | undefined | null,\n key: string,\n): T[keyof T] | undefined {\n return obj != null && Object.prototype.hasOwnProperty.call(obj, key)\n ? obj[key as keyof T]\n : undefined;\n}\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-input-start':\n case 'tool-input-delta':\n case 'tool-input-end':\n return [event as TextStreamPart<TOOLS>];\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\ntype ToolInputStreamPart = Extract<\n HarnessV1StreamPart,\n {\n type: 'tool-input-start' | 'tool-input-delta' | 'tool-input-end';\n }\n>;\n\nexport function createToolInputWorkDirStripper({\n sessionWorkDir,\n}: {\n sessionWorkDir: string;\n}): (part: ToolInputStreamPart) => ToolInputStreamPart[] {\n const stateByToolCallId = new Map<\n string,\n {\n pending: string;\n precedingCharacter: string | undefined;\n }\n >();\n\n return part => {\n if (sessionWorkDir.length === 0) return [part];\n\n if (part.type === 'tool-input-start') {\n stateByToolCallId.set(part.id, {\n pending: '',\n precedingCharacter: undefined,\n });\n return [part];\n }\n\n if (part.type === 'tool-input-delta') {\n const state = stateByToolCallId.get(part.id) ?? {\n pending: '',\n precedingCharacter: undefined,\n };\n const value = state.pending + part.delta;\n const stripped = stripStreamingString({\n value,\n workDir: sessionWorkDir,\n final: false,\n precedingCharacter: state.precedingCharacter,\n });\n const pendingStart = value.length - stripped.pending.length;\n stateByToolCallId.set(part.id, {\n pending: stripped.pending,\n precedingCharacter:\n stripped.pending.length > 0\n ? pendingStart > 0\n ? value[pendingStart - 1]\n : state.precedingCharacter\n : value.length > 0\n ? value[value.length - 1]\n : state.precedingCharacter,\n });\n return stripped.output.length === 0\n ? []\n : [{ ...part, delta: stripped.output }];\n }\n\n const state = stateByToolCallId.get(part.id);\n stateByToolCallId.delete(part.id);\n if (state == null || state.pending.length === 0) return [part];\n\n const stripped = stripStreamingString({\n value: state.pending,\n workDir: sessionWorkDir,\n final: true,\n precedingCharacter: state.precedingCharacter,\n });\n return stripped.output.length === 0\n ? [part]\n : [\n { type: 'tool-input-delta', id: part.id, delta: stripped.output },\n part,\n ];\n };\n}\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 * Boundary-aware prefix replacement (rather than rewriting known path fields)\n * is used deliberately: `tool-result` results are free-form text — command\n * stdout, grep output — where paths can appear anywhere and field-aware\n * rewriting is impossible.\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-input-delta':\n return { ...part, delta: stripString(part.delta, sessionWorkDir) };\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\nexport function stripParsedToolInputWorkDir({\n value,\n sessionWorkDir,\n}: {\n value: unknown;\n sessionWorkDir: string;\n}): unknown {\n if (sessionWorkDir.length === 0) return value;\n\n const projected = new WeakMap<object, unknown>();\n const pending: Array<{\n source: object;\n target: Record<string, unknown> | unknown[];\n }> = [];\n\n const project = (item: unknown): unknown => {\n if (typeof item === 'string') return stripString(item, sessionWorkDir);\n if (item === null || typeof item !== 'object') return item;\n if (\n !Array.isArray(item) &&\n Object.getPrototypeOf(item) !== Object.prototype &&\n Object.getPrototypeOf(item) !== null\n ) {\n return item;\n }\n if (projected.has(item)) return projected.get(item);\n\n const target: Record<string, unknown> | unknown[] = Array.isArray(item)\n ? new Array(item.length)\n : {};\n projected.set(item, target);\n pending.push({ source: item, target });\n return target;\n };\n\n const result = project(value);\n while (pending.length > 0) {\n const { source, target } = pending.pop()!;\n if (Array.isArray(source) && Array.isArray(target)) {\n for (let index = 0; index < source.length; index++) {\n if (index in source) target[index] = project(source[index]);\n }\n } else {\n for (const [key, item] of Object.entries(source)) {\n Object.defineProperty(target, key, {\n value: project(item),\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n }\n }\n\n return result;\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 stripStreamingString({\n value,\n workDir,\n final: true,\n precedingCharacter: undefined,\n }).output;\n}\n\nfunction stripStreamingString({\n value,\n workDir,\n final,\n precedingCharacter,\n}: {\n value: string;\n workDir: string;\n final: boolean;\n precedingCharacter: string | undefined;\n}): { output: string; pending: string } {\n let remaining = value;\n let output = '';\n let characterBeforeRemaining = precedingCharacter;\n\n while (remaining.length > 0) {\n const matchIndex = remaining.indexOf(workDir);\n if (matchIndex >= 0) {\n const followingIndex = matchIndex + workDir.length;\n const hasPathBoundary = isPathBoundary(\n remaining,\n matchIndex,\n characterBeforeRemaining,\n );\n if (hasPathBoundary && followingIndex === remaining.length && !final) {\n return {\n output: output + remaining.slice(0, matchIndex),\n pending: remaining.slice(matchIndex),\n };\n }\n\n const isPath =\n hasPathBoundary &&\n (followingIndex === remaining.length ||\n remaining[followingIndex] === '/' ||\n isPathTerminator(remaining[followingIndex]));\n if (!isPath) {\n output += remaining.slice(0, followingIndex);\n characterBeforeRemaining = remaining[followingIndex - 1];\n remaining = remaining.slice(followingIndex);\n } else if (remaining[followingIndex] === '/') {\n output += remaining.slice(0, matchIndex);\n characterBeforeRemaining = remaining[followingIndex];\n remaining = remaining.slice(followingIndex + 1);\n } else {\n output += remaining.slice(0, matchIndex) + '.';\n remaining = remaining.slice(followingIndex);\n }\n continue;\n }\n\n if (final) return { output: output + remaining, pending: '' };\n\n let pendingLength = Math.min(remaining.length, workDir.length - 1);\n while (\n pendingLength > 0 &&\n (!workDir.startsWith(remaining.slice(-pendingLength)) ||\n !isPathBoundary(\n remaining,\n remaining.length - pendingLength,\n characterBeforeRemaining,\n ))\n ) {\n pendingLength -= 1;\n }\n const outputLength = remaining.length - pendingLength;\n return {\n output: output + remaining.slice(0, outputLength),\n pending: remaining.slice(outputLength),\n };\n }\n\n return { output, pending: '' };\n}\n\nfunction isPathBoundary(\n value: string,\n index: number,\n precedingCharacter?: string,\n): boolean {\n const character = index === 0 ? precedingCharacter : value[index - 1]!;\n return character === undefined || /[\\s\"'`=]/.test(character);\n}\n\nfunction isPathTerminator(character: string | undefined): boolean {\n return character === undefined || /[\\s\"'`;|&<>()]/.test(character);\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 type {\n Context,\n InferToolSetContext,\n ModelMessage,\n ToolSet,\n} from '@ai-sdk/provider-utils';\nimport { createTelemetryDispatcher } from 'ai/internal';\nimport type {\n ContentPart,\n GenerateTextOnEndCallback,\n GenerateTextOnStartCallback,\n GenerateTextOnStepEndCallback,\n GenerateTextOnStepStartCallback,\n LanguageModelUsage,\n OnLanguageModelCallEndCallback,\n OnLanguageModelCallStartCallback,\n OnToolExecutionEndCallback,\n OnToolExecutionStartCallback,\n OutputInterface as Output,\n StepResult,\n TelemetryOptions,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n TypedToolCall,\n TypedToolError,\n TypedToolResult,\n} from 'ai';\nimport type { HarnessV1ToolSpec } from '../../v1';\n\nexport type HarnessAgentLifecycleCallbacks<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> = {\n onStart?: GenerateTextOnStartCallback<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n onStepStart?: GenerateTextOnStepStartCallback<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n onLanguageModelCallStart?: OnLanguageModelCallStartCallback;\n onLanguageModelCallEnd?: OnLanguageModelCallEndCallback<TOOLS>;\n onToolExecutionStart?: OnToolExecutionStartCallback<TOOLS>;\n onToolExecutionEnd?: OnToolExecutionEndCallback<TOOLS>;\n onStepEnd?: GenerateTextOnStepEndCallback<TOOLS, RUNTIME_CONTEXT>;\n onEnd?: GenerateTextOnEndCallback<TOOLS, RUNTIME_CONTEXT>;\n};\n\ntype Dispatcher = ReturnType<typeof createTelemetryDispatcher>;\n\nexport interface TurnLifecycle<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n> {\n start(modelId?: string): Promise<void>;\n ensureStepOpen(): Promise<void>;\n languageModelCallEnd(input: {\n finishReason: StepResult<TOOLS, RUNTIME_CONTEXT>['finishReason'];\n usage: LanguageModelUsage;\n content: ContentPart<TOOLS>[];\n providerMetadata: StepResult<TOOLS, RUNTIME_CONTEXT>['providerMetadata'];\n }): Promise<void>;\n toolExecutionStart(input: { toolCall: TypedToolCall<TOOLS> }): Promise<void>;\n toolExecutionEnd(input: {\n toolCall: TypedToolCall<TOOLS>;\n toolOutput: TypedToolResult<TOOLS> | TypedToolError<TOOLS>;\n toolExecutionMs: number;\n }): Promise<void>;\n stepEnd(step: StepResult<TOOLS, RUNTIME_CONTEXT>): Promise<void>;\n end(input: {\n steps: StepResult<TOOLS, RUNTIME_CONTEXT>[];\n usage: LanguageModelUsage;\n }): Promise<void>;\n executeTool<T>(input: {\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): Promise<T>;\n error(error: unknown): Promise<void>;\n}\n\nasync function notify<EVENT>(\n event: EVENT,\n ...callbacks: Array<((event: EVENT) => unknown) | undefined>\n): Promise<void> {\n await Promise.allSettled(\n callbacks.map(async callback => {\n await callback?.(event);\n }),\n );\n}\n\nexport function createTurnLifecycle<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n>(options: {\n callId: string;\n telemetry: TelemetryOptions | undefined;\n callbacks: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n harnessId: string;\n modelId: string | undefined;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext: InferToolSetContext<TOOLS>;\n activeToolNames: string[];\n toolSpecs: HarnessV1ToolSpec[];\n messages: ModelMessage[];\n runtimeContext: RUNTIME_CONTEXT;\n output: OUTPUT | undefined;\n}): TurnLifecycle<TOOLS, RUNTIME_CONTEXT> {\n const telemetry =\n options.telemetry == null\n ? ({} as Dispatcher)\n : createTelemetryDispatcher({ telemetry: options.telemetry });\n const provider = `harness:${options.harnessId}`;\n let modelId = options.modelId ?? '';\n let started = false;\n let stepOpen = false;\n let stepNumber = 0;\n let ended = false;\n let modelCallStartedAt = 0;\n const completedSteps: StepResult<TOOLS, RUNTIME_CONTEXT>[] = [];\n const languageModelTools =\n options.toolSpecs.length === 0\n ? undefined\n : options.toolSpecs.map(tool => ({\n type: 'function' as const,\n name: tool.name,\n ...(tool.description == null\n ? {}\n : { description: tool.description }),\n ...(tool.inputSchema == null\n ? {}\n : { inputSchema: tool.inputSchema }),\n }));\n\n const start = async (overrideModelId?: string): Promise<void> => {\n if (started) return;\n if (overrideModelId != null) modelId = overrideModelId;\n started = true;\n const event = {\n callId: options.callId,\n operationId: 'ai.harness',\n provider,\n modelId,\n tools: options.tools,\n toolChoice: undefined,\n activeTools: options.activeToolNames,\n toolOrder: [],\n maxRetries: 0,\n timeout: undefined,\n headers: undefined,\n providerOptions: undefined,\n output: options.output,\n toolsContext: options.toolsContext,\n runtimeContext: options.runtimeContext,\n instructions: options.instructions,\n messages: options.messages,\n };\n await notify(\n event,\n options.callbacks.onStart,\n telemetry.onStart as typeof options.callbacks.onStart,\n );\n };\n\n const ensureStepOpen = async (): Promise<void> => {\n if (!started) await start();\n if (stepOpen || ended) return;\n stepOpen = true;\n const stepStartEvent = {\n callId: options.callId,\n provider,\n modelId,\n stepNumber,\n tools: options.tools,\n toolChoice: undefined,\n activeTools: options.activeToolNames,\n toolOrder: [],\n steps: [...completedSteps],\n providerOptions: undefined,\n output: options.output,\n runtimeContext: options.runtimeContext,\n toolsContext: options.toolsContext,\n instructions: options.instructions,\n messages: options.messages,\n };\n await notify(\n stepStartEvent,\n options.callbacks.onStepStart,\n telemetry.onStepStart as typeof options.callbacks.onStepStart,\n );\n\n const modelStartEvent = {\n callId: options.callId,\n provider,\n modelId,\n instructions: options.instructions,\n messages: options.messages,\n tools: languageModelTools,\n };\n modelCallStartedAt = Date.now();\n await notify(\n modelStartEvent,\n options.callbacks.onLanguageModelCallStart,\n telemetry.onLanguageModelCallStart as typeof options.callbacks.onLanguageModelCallStart,\n );\n };\n\n return {\n start,\n ensureStepOpen,\n\n async languageModelCallEnd(input) {\n await ensureStepOpen();\n const event = {\n callId: options.callId,\n provider,\n modelId,\n finishReason: input.finishReason,\n usage: input.usage,\n content: input.content,\n responseId: `${options.callId}-${stepNumber}`,\n providerMetadata: input.providerMetadata,\n performance: {\n responseTimeMs: Math.max(0, Date.now() - modelCallStartedAt),\n effectiveOutputTokensPerSecond: 0,\n outputTokensPerSecond: undefined,\n inputTokensPerSecond: undefined,\n effectiveTotalTokensPerSecond: 0,\n timeToFirstOutputMs: undefined,\n timeBetweenOutputChunksMs: undefined,\n },\n };\n await notify(\n event,\n options.callbacks.onLanguageModelCallEnd,\n telemetry.onLanguageModelCallEnd as typeof options.callbacks.onLanguageModelCallEnd,\n );\n },\n\n async toolExecutionStart({ toolCall }) {\n const event = {\n callId: options.callId,\n messages: options.messages,\n toolCall,\n toolContext: undefined,\n } as ToolExecutionStartEvent<TOOLS>;\n await notify(\n event,\n options.callbacks.onToolExecutionStart,\n telemetry.onToolExecutionStart as typeof options.callbacks.onToolExecutionStart,\n );\n },\n\n async toolExecutionEnd({ toolCall, toolOutput, toolExecutionMs }) {\n const event = {\n callId: options.callId,\n messages: options.messages,\n toolCall,\n toolContext: undefined,\n toolOutput,\n toolExecutionMs,\n } as ToolExecutionEndEvent<TOOLS>;\n await notify(\n event,\n options.callbacks.onToolExecutionEnd,\n telemetry.onToolExecutionEnd as typeof options.callbacks.onToolExecutionEnd,\n );\n },\n\n async stepEnd(step) {\n if (!stepOpen) return;\n completedSteps.push(step);\n const telemetryStepEndEvent = Object.assign(Object.create(null), {\n callId: step.callId,\n stepNumber: step.stepNumber,\n model: step.model,\n toolsContext: step.toolsContext,\n runtimeContext: step.runtimeContext,\n content: step.content,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n usage: step.usage,\n performance: step.performance,\n warnings: step.warnings,\n request: step.request,\n response: step.response,\n providerMetadata: step.providerMetadata,\n text: step.text,\n reasoning: step.reasoning,\n reasoningText: step.reasoningText,\n files: step.files,\n sources: step.sources,\n toolCalls: step.toolCalls,\n staticToolCalls: step.staticToolCalls,\n dynamicToolCalls: step.dynamicToolCalls,\n toolResults: step.toolResults,\n staticToolResults: step.staticToolResults,\n dynamicToolResults: step.dynamicToolResults,\n });\n await Promise.allSettled([\n options.callbacks.onStepEnd?.(step),\n telemetry.onStepEnd?.(telemetryStepEndEvent),\n ]);\n stepOpen = false;\n stepNumber += 1;\n },\n\n async end({ steps, usage }) {\n if (!started) await start();\n if (ended || steps.length === 0) return;\n ended = true;\n const finalStep = steps[steps.length - 1]!;\n const event = {\n callId: options.callId,\n stepNumber: finalStep.stepNumber,\n model: finalStep.model,\n toolsContext: finalStep.toolsContext,\n runtimeContext: finalStep.runtimeContext,\n content: steps.flatMap(step => step.content),\n text: finalStep.text,\n reasoning: finalStep.reasoning,\n reasoningText: finalStep.reasoningText,\n files: steps.flatMap(step => step.files),\n sources: steps.flatMap(step => step.sources),\n toolCalls: steps.flatMap(step => step.toolCalls),\n staticToolCalls: steps.flatMap(step => step.staticToolCalls),\n dynamicToolCalls: steps.flatMap(step => step.dynamicToolCalls),\n toolResults: steps.flatMap(step => step.toolResults),\n staticToolResults: steps.flatMap(step => step.staticToolResults),\n dynamicToolResults: steps.flatMap(step => step.dynamicToolResults),\n finishReason: finalStep.finishReason,\n rawFinishReason: finalStep.rawFinishReason,\n usage,\n totalUsage: usage,\n warnings: steps.flatMap(step => step.warnings ?? []),\n request: finalStep.request,\n response: finalStep.response,\n providerMetadata: finalStep.providerMetadata,\n responseMessages: steps.flatMap(step => step.response.messages),\n steps,\n finalStep,\n };\n await notify(\n event,\n options.callbacks.onEnd,\n telemetry.onEnd as typeof options.callbacks.onEnd,\n );\n },\n\n async executeTool({ toolCallId, execute }) {\n if (telemetry.executeTool == null) return await execute();\n return await telemetry.executeTool({\n callId: options.callId,\n toolCallId,\n execute,\n });\n },\n\n async error(error) {\n if (ended) return;\n if (!started) await start();\n ended = true;\n await telemetry.onError?.(error);\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';\nimport { sleep } from './sleep';\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 /**\n * Give up reconnecting after this many milliseconds, including connection\n * establishment and backoff delays. Default 30_000.\n */\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 SandboxChannelConnectOptions {\n readonly abortSignal: AbortSignal;\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: (options: SandboxChannelConnectOptions) => 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\ntype BufferedEvent<TOut extends { type: string }> = {\n message: TOut;\n listeners?: ReadonlyArray<Listener<TOut, EventTypeOf<TOut>>>;\n};\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\nfunction getAbortReason({\n abortSignal,\n}: {\n abortSignal: AbortSignal;\n}): unknown {\n return abortSignal.reason ?? new Error('SandboxChannel connection aborted');\n}\n\nfunction closeWebSocket({ ws }: { ws: WebSocket }): void {\n try {\n const terminable = ws as WebSocket & { terminate?: () => void };\n if (terminable.terminate != null) {\n terminable.terminate();\n } else {\n ws.close();\n }\n } catch {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n }\n}\n\nasync function awaitWebSocketConnection({\n connection,\n abortSignal,\n}: {\n connection: Promise<WebSocket>;\n abortSignal: AbortSignal;\n}): Promise<WebSocket> {\n if (abortSignal.aborted) {\n void connection.then(ws => closeWebSocket({ ws })).catch(() => {});\n throw getAbortReason({ abortSignal });\n }\n\n let onAbort: (() => void) | undefined;\n const aborted = new Promise<never>((_, reject) => {\n onAbort = () => reject(getAbortReason({ abortSignal }));\n abortSignal.addEventListener('abort', onAbort, { once: true });\n });\n\n try {\n const ws = await Promise.race([connection, aborted]);\n if (abortSignal.aborted) {\n closeWebSocket({ ws });\n throw getAbortReason({ abortSignal });\n }\n return ws;\n } catch (error) {\n if (abortSignal.aborted) {\n void connection.then(ws => closeWebSocket({ ws })).catch(() => {});\n }\n throw error;\n } finally {\n if (onAbort != null) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n }\n}\n\n/**\n * Host-side typed wrapper around the bridge WebSocket connection.\n *\n * Buffers inbound messages in arrival order while listeners attach, so callers\n * do not miss or reorder early frames. Listener registration drains the\n * ordered prefix synchronously. Selective listeners are given through the\n * current task (including its microtasks) to attach before unhandled event\n * types are retained independently, so they cannot block subscribed event\n * types indefinitely. A listener that claims an already-buffered event still\n * receives it if it unsubscribes before that ordered drain completes. Use\n * {@link SandboxChannel.beginListenerAttachment} to define an explicit\n * attachment boundary that spans asynchronous work. Inbound dispatch is\n * serialised through a promise chain so a `close` event that arrives on the\n * same microtask as the final `finish` message does not fire close handlers\n * 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: BufferedEvent<TOut>[] = [];\n private readonly bufferedByType = new Map<EventTypeOf<TOut>, TOut[]>();\n private bufferedOffset = 0;\n private flushingBuffered = false;\n private bufferedFlushScheduled = false;\n private listenerAttachmentDepth = 0;\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: (\n options: SandboxChannelConnectOptions,\n ) => 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 private activeConnectAbortController: AbortController | undefined;\n private reconnectAbortController: AbortController | undefined;\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 abortController = new AbortController();\n this.activeConnectAbortController = abortController;\n try {\n const ws = await this.connect({\n abortSignal: abortController.signal,\n });\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 } finally {\n if (this.activeConnectAbortController === abortController) {\n this.activeConnectAbortController = undefined;\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 this.captureBufferedListeners(type);\n if (this.listenerAttachmentDepth > 0) {\n return () => {\n set!.delete(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n };\n }\n\n this.flushBufferedType(type);\n this.flushBuffered();\n this.scheduleSelectiveBufferedFlush();\n\n return () => {\n set!.delete(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n };\n }\n\n /**\n * Hold buffered event delivery while a consumer attaches a related set of\n * listeners, including across asynchronous boundaries. Call the returned\n * function once registration is complete. Buffered events are then replayed\n * in arrival order; event types that remain unhandled are retained\n * independently so they do not block subscribed types.\n */\n beginListenerAttachment(): () => void {\n this.listenerAttachmentDepth++;\n let finished = false;\n return () => {\n if (finished) return;\n finished = true;\n this.listenerAttachmentDepth--;\n if (this.listenerAttachmentDepth > 0) return;\n\n for (const type of this.listeners.keys()) {\n this.flushBufferedType(type);\n }\n this.flushBuffered();\n this.scheduleSelectiveBufferedFlush();\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 this.abortActiveConnect();\n }\n\n close(): void {\n if (this.terminal) return;\n this.closing = true;\n this.abortActiveConnect();\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.abortActiveConnect();\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 deadline = Date.now() + this.maxElapsedMs;\n let attempt = 0;\n let delay = this.initialDelayMs;\n const reconnectAbortController = new AbortController();\n this.reconnectAbortController = reconnectAbortController;\n try {\n while (!this.terminal && !this.closing) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n this.failReconnect({\n attempts: attempt,\n cause: new Error('Reconnect deadline expired'),\n });\n return;\n }\n\n attempt++;\n this.onDebug?.({\n event: 'reconnect-attempt',\n attempt,\n lastSeenEventId: this._lastSeenEventId,\n });\n const abortController = new AbortController();\n this.activeConnectAbortController = abortController;\n const abortConnect = () =>\n abortController.abort(reconnectAbortController.signal.reason);\n reconnectAbortController.signal.addEventListener(\n 'abort',\n abortConnect,\n {\n once: true,\n },\n );\n const timeout = setTimeout(() => {\n abortController.abort(new Error('Reconnect deadline expired'));\n }, remaining);\n (timeout as { unref?: () => void }).unref?.();\n\n try {\n const ws = await this.connect({\n abortSignal: abortController.signal,\n });\n if (this.terminal || this.closing) {\n closeWebSocket({ ws });\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 (\n this.terminal ||\n this.closing ||\n reconnectAbortController.signal.aborted\n ) {\n return;\n }\n const remainingAfterFailure = deadline - Date.now();\n if (remainingAfterFailure <= 0) {\n this.failReconnect({ attempts: attempt, cause });\n return;\n }\n await sleep({\n ms: Math.min(delay, remainingAfterFailure),\n abortSignal: reconnectAbortController.signal,\n });\n delay = Math.min(delay * 1.5, this.maxDelayMs);\n } finally {\n clearTimeout(timeout);\n reconnectAbortController.signal.removeEventListener(\n 'abort',\n abortConnect,\n );\n if (this.activeConnectAbortController === abortController) {\n this.activeConnectAbortController = undefined;\n }\n }\n }\n } finally {\n if (this.reconnectAbortController === reconnectAbortController) {\n this.reconnectAbortController = undefined;\n }\n }\n }\n\n private connect({\n abortSignal,\n }: SandboxChannelConnectOptions): Promise<WebSocket> {\n return awaitWebSocketConnection({\n connection: Promise.resolve().then(() =>\n this.connectThunk({ abortSignal }),\n ),\n abortSignal,\n });\n }\n\n private abortActiveConnect(): void {\n const controller = this.activeConnectAbortController;\n this.activeConnectAbortController = undefined;\n controller?.abort(new Error('SandboxChannel connection aborted'));\n this.reconnectAbortController?.abort(\n new Error('SandboxChannel connection aborted'),\n );\n }\n\n private failReconnect({\n attempts,\n cause,\n }: {\n attempts: number;\n cause: unknown;\n }): void {\n this.finalizeClose(1006, 'reconnect failed');\n this.onDebug?.({\n event: 'reconnect-failed',\n attempts,\n lastSeenEventId: this._lastSeenEventId,\n cause,\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 (\n this.listenerAttachmentDepth > 0 ||\n this.bufferedOffset < this.buffered.length ||\n !set ||\n set.size === 0\n ) {\n this.buffered.push({\n message,\n ...(set != null && set.size > 0 ? { listeners: Array.from(set) } : {}),\n });\n this.flushBuffered();\n this.scheduleSelectiveBufferedFlush();\n return;\n }\n for (const listener of set) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n\n private flushBuffered({\n selective = false,\n }: { selective?: boolean } = {}): void {\n if (this.flushingBuffered || this.listenerAttachmentDepth > 0) return;\n this.flushingBuffered = true;\n try {\n while (this.bufferedOffset < this.buffered.length) {\n const bufferedEvent = this.buffered[this.bufferedOffset];\n const message = bufferedEvent.message;\n const type = message.type as EventTypeOf<TOut>;\n const set = this.listeners.get(type);\n const listeners =\n bufferedEvent.listeners ??\n (set != null && set.size > 0 ? Array.from(set) : undefined);\n if (!listeners || listeners.length === 0) {\n if (!selective) return;\n this.bufferedOffset++;\n const buffered = this.bufferedByType.get(type);\n if (buffered) {\n buffered.push(message);\n } else {\n this.bufferedByType.set(type, [message]);\n }\n continue;\n }\n\n this.bufferedOffset++;\n for (const listener of listeners) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n } finally {\n if (this.bufferedOffset > 0) {\n this.buffered.splice(0, this.bufferedOffset);\n this.bufferedOffset = 0;\n }\n this.flushingBuffered = false;\n }\n }\n\n private captureBufferedListeners(type: EventTypeOf<TOut>): void {\n const set = this.listeners.get(type);\n if (!set || set.size === 0) return;\n\n for (let i = this.bufferedOffset; i < this.buffered.length; i++) {\n const bufferedEvent = this.buffered[i];\n if (\n bufferedEvent.listeners == null &&\n bufferedEvent.message.type === type\n ) {\n bufferedEvent.listeners = Array.from(set);\n }\n }\n }\n\n private flushBufferedType(type: EventTypeOf<TOut>): void {\n const buffered = this.bufferedByType.get(type);\n if (!buffered) return;\n\n let offset = 0;\n try {\n while (offset < buffered.length) {\n const set = this.listeners.get(type);\n if (!set || set.size === 0) return;\n\n const message = buffered[offset++];\n for (const listener of set) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n } finally {\n if (offset === buffered.length) {\n this.bufferedByType.delete(type);\n } else if (offset > 0) {\n buffered.splice(0, offset);\n }\n }\n }\n\n private scheduleSelectiveBufferedFlush(): void {\n if (\n this.bufferedFlushScheduled ||\n this.bufferedOffset >= this.buffered.length ||\n !this.hasListeners() ||\n this.listenerAttachmentDepth > 0\n ) {\n return;\n }\n\n this.bufferedFlushScheduled = true;\n setTimeout(() => {\n this.bufferedFlushScheduled = false;\n if (this.listenerAttachmentDepth > 0) return;\n this.flushBuffered({ selective: true });\n }, 0);\n }\n\n private hasListeners(): boolean {\n for (const listeners of this.listeners.values()) {\n if (listeners.size > 0) return true;\n }\n return false;\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.abortActiveConnect();\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 InferToolSetContext,\n ToolApprovalResponse,\n ToolResultPart,\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 HarnessV1Skill,\n HarnessV1TurnSettings,\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 { validateLifecycleStateData } from './internal/lifecycle-state-validation';\nimport { runPrompt } from './internal/run-prompt';\nimport { getRestrictedSandboxSession } from '../utils/get-restricted-sandbox-session';\nimport type { HarnessAgentLifecycleCallbacks } from './internal/turn-telemetry';\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 ready: 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\ntype ActiveTurnSettings = {\n readonly persisted: HarnessV1TurnSettings;\n readonly tools: ToolSet;\n readonly toolsContext: Record<string, Context | undefined>;\n readonly activeTools: ToolSet;\n readonly builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\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 activePromptDone: Promise<void> | undefined;\n private activePromptControl: ActivePromptControl | undefined;\n private suspendedTurnState:\n | Promise<HarnessAgentContinueTurnState>\n | undefined;\n private activeTurnSettings: ActiveTurnSettings | undefined;\n private persistedTurnSettings: HarnessV1TurnSettings | undefined;\n private readonly resumedToolsContext:\n | Record<string, Context | undefined>\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 turnSettings?: HarnessV1TurnSettings;\n resumedToolsContext?: Record<string, Context | undefined>;\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.persistedTurnSettings = options.turnSettings;\n this.resumedToolsContext = options.resumedToolsContext;\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 model: string | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext: InferToolSetContext<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 callbacks: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requirePromptableTurn();\n this.persistedTurnSettings = {\n ...(options.model == null ? {} : { model: options.model }),\n skills: options.skills,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n tools: options.toolSpecs,\n };\n this.activeTurnSettings = {\n persisted: this.persistedTurnSettings,\n tools: options.tools,\n toolsContext: options.toolsContext,\n activeTools: options.activeTools,\n builtinToolFiltering: options.builtinToolFiltering,\n };\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 model: options.model,\n skills: options.skills,\n instructions: options.instructions,\n tools: options.tools,\n toolsContext: options.toolsContext,\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 callbacks: options.callbacks,\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 this.activePromptDone = turn.done;\n return {\n ...turn,\n ready: this.waitForPromptControl({ turnId }),\n };\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 model: string | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext: InferToolSetContext<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 callbacks: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApprovalContinuations?: readonly ToolApprovalResponse[] | undefined;\n toolResultContinuations?: readonly ToolResultPart[] | undefined;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requireContinuableTurn();\n const turnSettings = this.resolveActiveTurnSettings({\n model: options.model,\n skills: options.skills,\n instructions: options.instructions,\n tools: options.tools,\n toolsContext: options.toolsContext,\n activeTools: options.activeTools,\n toolSpecs: options.toolSpecs,\n builtinToolFiltering: options.builtinToolFiltering,\n });\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 model: turnSettings.persisted.model,\n skills: turnSettings.persisted.skills,\n instructions: turnSettings.persisted.instructions,\n tools: turnSettings.tools as TOOLS,\n toolsContext: turnSettings.toolsContext as InferToolSetContext<TOOLS>,\n activeTools: turnSettings.activeTools,\n toolSpecs: [...turnSettings.persisted.tools],\n builtinToolFiltering: turnSettings.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 callbacks: options.callbacks,\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 this.activePromptDone = turn.done;\n return {\n ...turn,\n ready: this.waitForPromptControl({ turnId }),\n };\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.finalizeCurrentTurnSuspension({ 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.finalizeCurrentTurnSuspension({ 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 network\n * sandbox is stopped and destroyed through its `destroy()` method.\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 ('destroy' in sandboxSession) {\n await Promise.resolve(sandboxSession.destroy()).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.finalizeCurrentTurnSuspension({ 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 turnSettings = this.persistedTurnSettings;\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 ...(turnSettings == null ? {} : { turnSettings }),\n };\n }\n return {\n ...state,\n ...(turnSettings == null ? {} : { turnSettings }),\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 finalizeCurrentTurnSuspension(options: {\n session: HarnessAgentAdapterSession;\n }): Promise<HarnessAgentContinueTurnState> {\n const state = await this.suspendCurrentTurn(options);\n // Freeze ingress first, then include all dispatched host work in the cursor.\n // Keep this wait outside suspendCurrentTurn because stop-condition handling\n // invokes that helper from inside the active prompt.\n await this.activePromptDone;\n return this.addPendingToolState(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 async waitForPromptControl(options: {\n turnId: number;\n }): Promise<void> {\n const activePromptControl = this.activePromptControl;\n if (activePromptControl?.turnId !== options.turnId) return;\n await activePromptControl.promise;\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.activeTurnSettings = undefined;\n this.persistedTurnSettings = undefined;\n this.turnState = 'idle';\n }\n\n private resolveActiveTurnSettings(options: {\n model: string | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: ToolSet;\n toolsContext: Record<string, Context | undefined>;\n activeTools: ToolSet;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n }): ActiveTurnSettings {\n if (this.activeTurnSettings != null) {\n return this.activeTurnSettings;\n }\n const persisted =\n this.persistedTurnSettings ??\n ({\n ...(options.model == null ? {} : { model: options.model }),\n skills: options.skills,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n tools: options.toolSpecs,\n } satisfies HarnessV1TurnSettings);\n this.persistedTurnSettings = persisted;\n\n const activeTools: ToolSet = {};\n for (const toolSpec of persisted.tools) {\n const tool = options.activeTools[toolSpec.name];\n if (tool == null) {\n throw new Error(\n `HarnessAgent cannot continue turn because tool '${toolSpec.name}' is no longer available.`,\n );\n }\n activeTools[toolSpec.name] = tool;\n }\n\n this.activeTurnSettings = {\n persisted,\n tools: options.tools,\n toolsContext: this.resumedToolsContext ?? options.toolsContext,\n activeTools,\n builtinToolFiltering: options.builtinToolFiltering,\n };\n return this.activeTurnSettings;\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\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 ToolApprovalResponse[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n const toolCallIds = new Set<string>();\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 toolCallIds.add(part.toolCallId);\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: ToolApprovalResponse[] = [];\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 if (!toolCallIds.has(approvalRequest.toolCallId)) {\n throw new HarnessError({\n message: `Tool approval request '${approvalRequest.approvalId}' references unknown tool call '${approvalRequest.toolCallId}'.`,\n });\n }\n\n continuations.push(part);\n }\n\n return continuations;\n}\n","import type { ModelMessage, ToolResultPart } from '@ai-sdk/provider-utils';\n\n/**\n * Extract client-provided tool results from the trailing tool message.\n */\nexport function collectHarnessAgentToolResultContinuations(input: {\n messages: readonly ModelMessage[];\n}): readonly ToolResultPart[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n return lastMessage.content.filter(part => part.type === 'tool-result');\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport { harnessStateDirectoryPath, 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 * (harness state directory, harnessId, bootstrapDir, file paths + contents,\n * commands, schema version). The sandbox's concrete HOME is unavailable until\n * creation, so the directory is hashed with a symbolic HOME prefix.\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(harnessStateDirectoryPath({ sandboxHomeDir: '$HOME' }));\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 stateDirectory,\n}: {\n recipe: HarnessV1Bootstrap;\n identity: string;\n stateDirectory: string;\n}): string {\n return posix.join(\n resolveBootstrapPath({\n path: recipe.bootstrapDir,\n stateDirectory,\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 stateDirectory,\n abortSignal,\n}: {\n session: SandboxSession;\n recipe: HarnessV1Bootstrap;\n identity: string;\n stateDirectory: string;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const markerPath = bootstrapMarkerPath({\n recipe,\n identity,\n stateDirectory,\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 stateDirectory,\n });\n const mkdirResult = await session.run({\n command: 'mkdir -p \"$BOOTSTRAP_DIR\"',\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 stateDirectory,\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 stateDirectory,\n}: {\n path: string;\n stateDirectory: string;\n}): string {\n return posix.isAbsolute(path) ? path : posix.resolve(stateDirectory, path);\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport { harnessStateDirectoryPath, type HarnessV1Bootstrap } from '../../v1';\nimport { encodeHarnessPathSegment } from '../../v1/harness-session-data-directory-path';\nimport { resolveSandboxDefaultWorkingDirectory } from '../../utils/resolve-sandbox-default-working-directory';\nimport { resolveSandboxHomeDir } from '../../utils/sandbox-home-dir';\nimport type { HarnessAgentSandboxConfig } from '../harness-agent-settings';\nimport { applyBootstrapRecipe, hashHarnessBootstrap } from './bootstrap-recipe';\nimport {\n hasOnBootstrapMarker,\n writeOnBootstrapMarker,\n} from './on-bootstrap-marker';\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:\n workDir ??\n `${encodeHarnessPathSegment(harnessId)}-${encodeHarnessPathSegment(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 bootstrapHash: settings.bootstrapHash,\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 bootstrapHash,\n skipOnBootstrapIfMarked = false,\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 bootstrapHash?: string;\n readonly skipOnBootstrapIfMarked?: boolean;\n readonly defaultWorkingDirectory?: string;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n if (recipe == null && onBootstrap == null) return;\n\n if (recipe != null && recipeIdentity != null) {\n await applyBootstrapRecipe({\n session,\n recipe,\n identity: recipeIdentity,\n // Harness infrastructure always lives under the sandbox's own HOME,\n // never the working directory resolved below for the caller's own\n // `onBootstrap` hook. Resolved directly from `session` — this runs\n // from a provider's `onFirstCreate`, before a\n // `HarnessV1NetworkSandboxSession` even exists.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal,\n }),\n }),\n abortSignal,\n });\n }\n\n if (onBootstrap == null) return;\n\n if (\n skipOnBootstrapIfMarked &&\n bootstrapHash != null &&\n (await hasOnBootstrapMarker({ session, bootstrapHash, abortSignal }))\n )\n return;\n\n const resolvedDefaultWorkingDirectory =\n defaultWorkingDirectory ??\n (await resolveSandboxDefaultWorkingDirectory({\n sandboxSession: session,\n abortSignal,\n }));\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 if (bootstrapHash != null) {\n await writeOnBootstrapMarker({ session, bootstrapHash, abortSignal });\n }\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 path from 'node:path';\nimport type { Experimental_SandboxSession } from '@ai-sdk/provider-utils';\n\nexport async function resolveSandboxHomeDir({\n sandbox,\n abortSignal,\n}: {\n sandbox: Experimental_SandboxSession;\n abortSignal?: AbortSignal;\n}): Promise<string> {\n const result = await sandbox.run({\n command: 'printf \"%s\" \"$HOME\"',\n abortSignal,\n });\n const homeDir = result.stdout.trim();\n if (result.exitCode !== 0 || !homeDir || !path.posix.isAbsolute(homeDir)) {\n throw new Error(\n `Unable to resolve sandbox HOME directory: ${result.stderr || result.stdout}`,\n );\n }\n return homeDir;\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport { harnessStateDirectoryPath } from '../../v1';\nimport { resolveSandboxHomeDir } from '../../utils/sandbox-home-dir';\n\nexport async function onBootstrapMarkerPath({\n session,\n bootstrapHash,\n abortSignal,\n}: {\n session: SandboxSession;\n bootstrapHash: string;\n abortSignal?: AbortSignal;\n}): Promise<string> {\n const digest = new Uint8Array(\n await crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(bootstrapHash),\n ),\n );\n const filename = Array.from(digest, byte =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return posix.join(\n harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal,\n }),\n }),\n '.on-bootstrap',\n `${filename}.ok`,\n );\n}\n\nexport async function hasOnBootstrapMarker(options: {\n session: SandboxSession;\n bootstrapHash: string;\n abortSignal?: AbortSignal;\n}): Promise<boolean> {\n return (\n (await options.session.readTextFile({\n path: await onBootstrapMarkerPath(options),\n abortSignal: options.abortSignal,\n })) !== null\n );\n}\n\nexport async function writeOnBootstrapMarker(options: {\n session: SandboxSession;\n bootstrapHash: string;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const path = await onBootstrapMarkerPath(options);\n const result = await options.session.run({\n command: 'mkdir -p \"$MARKER_DIR\"',\n env: { MARKER_DIR: posix.dirname(path) },\n abortSignal: options.abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to create onBootstrap marker directory: ${result.stderr || result.stdout}`,\n );\n }\n await options.session.writeTextFile({\n path,\n content: '',\n abortSignal: options.abortSignal,\n });\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","const PREPARED_SANDBOX_IDENTITY_VERSION = 1;\n\nexport async 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) return undefined;\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 pushString(String(PREPARED_SANDBOX_IDENTITY_VERSION));\n pushString(workDir ?? '');\n pushString(bootstrapHash ?? '');\n for (const [harnessId, identity] of entries) {\n pushString(harnessId);\n pushString(identity);\n }\n const buffer = new Uint8Array(\n chunks.reduce((sum, chunk) => sum + chunk.length, 0),\n );\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', buffer));\n return Array.from(digest.slice(0, 8), byte =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n}\n","import type {\n HarnessAgentAdapter,\n HarnessSandboxTemplate,\n} from './harness-agent-types';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport { hashHarnessBootstrap } from './internal/bootstrap-recipe';\nimport { resolvePreparedSandboxIdentity } from './internal/prepared-sandbox-identity';\nimport {\n normalizeSandboxWorkDir,\n runSandboxBootstrap,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\n\nexport async function createHarnessSandboxTemplate(options: {\n readonly harnesses: ReadonlyArray<HarnessAgentAdapter>;\n readonly sandboxConfig?: Omit<HarnessAgentSandboxConfig, 'onSession'>;\n}): Promise<HarnessSandboxTemplate | undefined> {\n if (options.harnesses.length === 0) {\n throw new Error(\n 'createHarnessSandboxTemplate: at least one harness must be provided.',\n );\n }\n const settings = options.sandboxConfig ?? {};\n validateSandboxBootstrapSettings(settings);\n const workDir =\n settings.workDir == null\n ? undefined\n : normalizeSandboxWorkDir(settings.workDir);\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 const recipes = await Promise.all(\n harnesses.map(async harness => {\n const recipe = await harness.getBootstrap?.({});\n return recipe == null\n ? undefined\n : {\n recipe,\n identity: await hashHarnessBootstrap(recipe),\n };\n }),\n );\n const recipeIdentities: Record<string, string> = {};\n for (let index = 0; index < harnesses.length; index++) {\n const entry = recipes[index];\n if (entry != null)\n recipeIdentities[harnesses[index].harnessId] = entry.identity;\n }\n const identity = await resolvePreparedSandboxIdentity({\n recipeIdentities,\n bootstrapHash: settings.bootstrapHash,\n workDir,\n });\n if (identity == null) return undefined;\n return {\n identity,\n prepare: async ({ session, abortSignal }) => {\n for (const entry of recipes) {\n if (entry != null) {\n await runSandboxBootstrap({\n session,\n recipe: entry.recipe,\n recipeIdentity: entry.identity,\n abortSignal,\n });\n }\n }\n await runSandboxBootstrap({\n session,\n workDir,\n onBootstrap: settings.onBootstrap,\n bootstrapHash: settings.bootstrapHash,\n skipOnBootstrapIfMarked: true,\n abortSignal,\n });\n },\n };\n}\n","import {\n harnessStateDirectoryPath,\n type HarnessV1Bootstrap,\n type HarnessV1SandboxProvider,\n} from '../v1';\nimport { resolveSandboxHomeDir } from '../utils/sandbox-home-dir';\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.\n * @deprecated Use `createHarnessSandboxTemplate` and pass its template to a sandbox session creator instead.\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 console.warn(\n 'prepareHarnessSandboxTemplate (prewarmHarness) is deprecated. Use createHarnessSandboxTemplate and a sandbox session creator instead.',\n );\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 const restrictedSession = sandboxSession.restricted();\n await applyBootstrapRecipe({\n session: restrictedSession,\n recipe: bootstrapPlan.recipe,\n identity: bootstrapPlan.recipeIdentity,\n // Harness infrastructure always lives under the sandbox's own HOME,\n // never the working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: restrictedSession,\n abortSignal,\n }),\n }),\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 { harnessStateDirectoryPath } from '../v1';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport type { HarnessAgentAdapter } from './harness-agent-types';\nimport { resolveSandboxDefaultWorkingDirectory } from '../utils/resolve-sandbox-default-working-directory';\nimport { resolveSandboxHomeDir } from '../utils/sandbox-home-dir';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n normalizeSandboxWorkDir,\n runSandboxBootstrap,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\nimport { resolvePreparedSandboxIdentity } from './internal/prepared-sandbox-identity';\n\n/** @deprecated Use `createHarnessSandboxTemplate` and `template.prepare` instead. */\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 * @deprecated Use `createHarnessSandboxTemplate` and `template.prepare` instead.\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 console.warn(\n 'prepareSandboxForHarness is deprecated. Use createHarnessSandboxTemplate and template.prepare instead.',\n );\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 stateDirectory: 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 // Harness infrastructure always lives under the sandbox's own HOME,\n // never the working directory.\n stateDirectory ??= harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: options.session,\n abortSignal: options.abortSignal,\n }),\n });\n await applyBootstrapRecipe({\n session: options.session,\n recipe,\n identity: recipeIdentity,\n stateDirectory,\n abortSignal: options.abortSignal,\n });\n }\n\n if (sandboxConfig.onBootstrap != null) {\n const defaultWorkingDirectory = await resolveSandboxDefaultWorkingDirectory(\n { sandboxSession: options.session, abortSignal: options.abortSignal },\n );\n await runSandboxBootstrap({\n session: options.session,\n workDir,\n onBootstrap: sandboxConfig.onBootstrap,\n bootstrapHash: sandboxConfig.bootstrapHash,\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","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","posix","asArray","generateId","generateId","safeParseJSON","asLanguageModelUsage","state","stripped","safeValidateTypes","generateId","result","input","asLanguageModelUsage","safeParseJSON","done","displayValue","output","posix","posix","path","posix","posix","posix","posix","path","posix","path","name","asArray","name","generateId","AISDKError","name","marker","symbol","_a","_b","AISDKError","path"]}
|
|
1
|
+
{"version":3,"sources":["../../src/errors/harness-capability-unsupported-error.ts","../../src/errors/harness-error.ts","../../src/v1/harness-v1-network-sandbox-session.ts","../../src/v1/harness-session-data-directory-path.ts","../../src/v1/harness-v1-tool-filtering.ts","../../src/agent/harness-agent.ts","../../src/agent/internal/lifecycle-state-validation.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/get-own.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/utils/sandbox-home-dir.ts","../../src/agent/internal/on-bootstrap-marker.ts","../../src/agent/internal/resolve-observability.ts","../../src/agent/internal/tool-filtering.ts","../../src/agent/internal/prepared-sandbox-identity.ts","../../src/agent/create-harness-sandbox-template.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 { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\n\n/**\n * Connection details for a sandbox-exposed port. Headers are scoped to the\n * returned URL and must be included when opening the connection.\n */\nexport type HarnessV1PortEndpoint = {\n readonly url: string;\n readonly headers?: Readonly<Record<string, string>>;\n};\n\n/**\n * Fixed directory, relative to the sandbox's own HOME, that holds every\n * piece of state the harness machinery generates.\n */\nconst HARNESS_V1_STATE_DIRECTORY_NAME = '.ai-sdk-harness';\n\n/**\n * Fixed, non-configurable path for harness-generated state (bootstrap files,\n * markers, and `.agent-runs`) under the sandbox's own HOME, never under\n * {@link HarnessV1NetworkSandboxSession.defaultWorkingDirectory}. Resolve HOME\n * with `resolveSandboxHomeDir` when it is not already known. This works from\n * provider creation hooks that only have a plain sandbox session. The\n * framework also calls this with a symbolic `$HOME` when hashing bootstrap\n * recipes, so changes to the state path invalidate existing templates.\n */\nexport function harnessStateDirectoryPath({\n sandboxHomeDir,\n}: {\n sandboxHomeDir: string;\n}): string {\n return posix.join(sandboxHomeDir, HARNESS_V1_STATE_DIRECTORY_NAME);\n}\n\n/**\n * Network sandbox session returned by sandbox adapter creation and resume\n * functions. The harness keeps this for the lifetime of a session. It is itself a\n * {@link SandboxSession} (file I/O, exec, spawn) and adds the infra surface on\n * top: port resolution, lifecycle, and network-policy mutation.\n *\n * Code that should only touch the filesystem and spawn processes receives the\n * reduced view from {@link HarnessV1NetworkSandboxSession.restricted}, never the\n * network sandbox session itself — so it cannot stop the sandbox, change\n * network access, or transform requests.\n */\nexport interface HarnessV1NetworkSandboxSession extends SandboxSession {\n /**\n * Identifier for the sandbox session. Persist this separately from the\n * harness session ID and resume state when reattaching across processes.\n */\n readonly id: string;\n\n /**\n * The sandbox's default working directory — the absolute path that\n * `run`/`spawn` resolve relative commands against when no `workingDirectory`\n * is given. Read from the live sandbox, never hardcoded.\n *\n * The framework composes each session's working directory underneath this\n * path (`<defaultWorkingDirectory>/<harnessId>-<sessionId>`) so adapters do\n * not bake a provider-specific base into their own paths.\n */\n readonly defaultWorkingDirectory: string;\n\n /** Ports the sandbox exposes; resolvable via `getPortEndpoint`. */\n readonly ports: ReadonlyArray<number>;\n\n /**\n * Resolve the connection details for a sandbox-exposed port. Bridge-backed\n * adapters call this to open their WebSocket to the in-sandbox bridge.\n */\n readonly getPortEndpoint: (options: {\n port: number;\n protocol?: 'http' | 'https' | 'ws';\n }) => PromiseLike<HarnessV1PortEndpoint>;\n\n /**\n * Resolve a publicly-reachable URL for a sandbox-exposed port.\n *\n * @deprecated Use `getPortEndpoint` instead.\n */\n readonly getPortUrl: (options: {\n port: number;\n protocol?: 'http' | 'https' | 'ws';\n }) => PromiseLike<string>;\n\n /** Stop the sandbox. Idempotent. */\n readonly stop: () => PromiseLike<void>;\n\n /**\n * Stop the sandbox session, then perform any additional cleanup necessary\n * to destroy it, such as deleting its backing resource or freeing resources.\n * Implementations with no cleanup beyond stopping may delegate to `stop()`.\n * Implementations must handle both a still-running sandbox and a previously\n * stopped sandbox.\n */\n readonly destroy: () => PromiseLike<void>;\n\n /**\n * Update the sandbox's outbound network policy. Optional — implementations\n * without a local enforcement primitive omit this. Callers\n * use optional-call (`sandboxSession.setNetworkPolicy?.(policy)`); a\n * missing implementation is a no-op.\n */\n readonly setNetworkPolicy?: (\n policy: HarnessV1NetworkPolicy,\n ) => PromiseLike<void>;\n\n /**\n * Replace the sandbox's outbound request-transformation rules. Optional —\n * implementations expose this only when credentials can be injected outside\n * the sandbox security boundary. Calling this method assumes authority over\n * the complete transformation set; harness adapters should normally use\n * `addRequestTransformations` instead. Adapters may preserve legacy\n * credential-forwarding behavior when additive request transformations are\n * unavailable.\n */\n readonly setRequestTransformations?: (\n transformations: ReadonlyArray<HarnessV1RequestTransformation>,\n ) => PromiseLike<void>;\n\n /**\n * Add outbound request-transformation rules without replacing rules already\n * managed by the sandbox session. Optional for the same reason as\n * `setRequestTransformations`. Harness adapters should use this additive\n * capability unless they explicitly own the complete transformation set.\n */\n readonly addRequestTransformations?: (\n transformations: ReadonlyArray<HarnessV1RequestTransformation>,\n ) => PromiseLike<void>;\n\n /**\n * Replace the set of ports exposed by the sandbox. Full-replacement\n * semantics: ports omitted from the array are deregistered. Optional —\n * implementations that cannot expose ports omit this.\n */\n readonly setPorts?: (\n ports: ReadonlyArray<number>,\n options?: { abortSignal?: AbortSignal },\n ) => PromiseLike<void>;\n\n /**\n * Reduced view of this session, typed as the bare {@link SandboxSession}\n * (file I/O, exec, spawn) — nothing that could stop the sandbox or change\n * its network policy. Pass this to user-tool `execute()` calls and other\n * code that must not reach the infra surface.\n *\n * The returned object points at exactly the same underlying sandbox\n * resource as the network sandbox session it was produced from; it is only a\n * narrower surface over the same resource, not a separate sandbox. In\n * particular, it cannot mutate network access or request transformations.\n */\n readonly restricted: () => SandboxSession;\n}\n\n/**\n * Outbound network policy applied by the sandbox runtime.\n *\n * `'allow-all'` and `'deny-all'` are convenience presets. `'custom'` is an\n * allow-list with an optional CIDR deny-list that takes precedence:\n *\n * - Reachable hosts are the union of `allowedHosts` and `allowedCIDRs`.\n * - `deniedCIDRs` wins over both, useful for blocking cloud-metadata IPs while\n * otherwise allowing broad access.\n *\n * The two `'custom'` branches share the same discriminator but each requires\n * a different allow field. Specifying `'custom'` with only `deniedCIDRs`\n * (deny-only) is rejected at compile time — functionally it would be\n * equivalent to `'deny-all'`.\n */\nexport type HarnessV1NetworkPolicy =\n | { mode: 'allow-all' }\n | { mode: 'deny-all' }\n | {\n mode: 'custom';\n allowedHosts: ReadonlyArray<string>;\n allowedCIDRs?: ReadonlyArray<string>;\n deniedCIDRs?: ReadonlyArray<string>;\n }\n | {\n mode: 'custom';\n allowedHosts?: ReadonlyArray<string>;\n allowedCIDRs: ReadonlyArray<string>;\n deniedCIDRs?: ReadonlyArray<string>;\n };\n\ntype HarnessV1RequestTransformationPathMatcher =\n | { exact: string }\n | { startsWith: string }\n | { regex: string };\n\ntype HarnessV1RequestTransformationKeyValuePartMatcher =\n | { exact: string }\n | { startsWith: string }\n | { regex: string };\n\ntype HarnessV1RequestTransformationKeyValueMatcher = {\n readonly key?: HarnessV1RequestTransformationKeyValuePartMatcher;\n readonly value?: HarnessV1RequestTransformationKeyValuePartMatcher;\n};\n\n/**\n * Outbound HTTPS request transformation applied outside the sandbox security\n * boundary. The host is part of the match so each rule is self-contained and\n * several rules, including several for the same host, can be installed at\n * once.\n *\n * Credential values belong in `transform.headers`, while the sandbox process\n * receives only a non-secret placeholder. Implementations must overwrite\n * matching request headers after the request leaves the sandbox rather than\n * making transformed values available inside it.\n */\nexport type HarnessV1RequestTransformation = {\n readonly match: {\n readonly host: string;\n readonly path?: HarnessV1RequestTransformationPathMatcher;\n readonly method?: ReadonlyArray<string>;\n readonly queryString?: ReadonlyArray<HarnessV1RequestTransformationKeyValueMatcher>;\n readonly headers?: ReadonlyArray<HarnessV1RequestTransformationKeyValueMatcher>;\n };\n readonly transform: {\n readonly headers: Readonly<Record<string, string>>;\n };\n};\n\nexport type HarnessV1RequestTransformationSources<AuthenticationMode> = {\n env: Record<string, string>;\n sandboxEnv: Record<string, string>;\n auth: AuthenticationMode;\n};\n","import { posix } from 'node:path';\n\nexport function encodeHarnessPathSegment(value: string): string {\n const encoded = encodeURIComponent(value);\n if (encoded === '') return '%';\n if (encoded === '.') return '%2E';\n if (encoded === '..') return '%2E%2E';\n return encoded;\n}\n\n/**\n * Return the per-session harness state path under `.agent-runs`. Session IDs\n * occupy one encoded path segment, so path separators and parent-directory\n * references cannot move session data outside the harness state directory.\n */\nexport function harnessSessionDataDirectoryPath({\n stateDirectory,\n sessionId,\n}: {\n stateDirectory: string;\n sessionId: string;\n}): string {\n return posix.join(\n stateDirectory,\n '.agent-runs',\n encodeHarnessPathSegment(sessionId),\n );\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 { HarnessCapabilityUnsupportedError } from '../errors/harness-capability-unsupported-error';\nimport {\n harnessStateDirectoryPath,\n type HarnessV1,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1JSONSchema,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1ResponseFormat,\n} from '../v1';\nimport {\n asArray,\n asSchema,\n generateId,\n type InferToolSetContext,\n normalizeHeaders,\n validateTypes,\n type Context,\n type Experimental_SandboxSession as SandboxSession,\n type ModelMessage,\n type SystemModelMessage,\n type ToolApprovalResponse,\n type ToolResultPart,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport { mergeCallbacks, type ToolsContextSettings } from 'ai/internal';\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 HarnessAgentSkill,\n HarnessAgentToolSpec,\n HarnessSandboxTemplate,\n} from './harness-agent-types';\nimport { collectHarnessAgentToolApprovalContinuations } from './harness-agent-tool-approval-continuation';\nimport { collectHarnessAgentToolResultContinuations } from './harness-agent-tool-result-continuation';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n createSandboxBootstrapPlan,\n ensureSandboxDirectory,\n resolveSessionWorkDir,\n runSandboxBootstrap,\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 { resolveSandboxHomeDir } from '../utils/sandbox-home-dir';\nimport { getRestrictedSandboxSession } from '../utils/get-restricted-sandbox-session';\nimport type { HarnessAgentLifecycleCallbacks } from './internal/turn-telemetry';\nimport { createHarnessSandboxTemplate } from './create-harness-sandbox-template';\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\ntype HarnessAgentContinueTurnInput = {\n toolApprovalContinuations: readonly ToolApprovalResponse[];\n toolResultContinuations: readonly ToolResultPart[];\n};\n\ntype PreparedHarnessAgentTurnSettings<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n> = {\n model: string | undefined;\n skills: ReadonlyArray<HarnessAgentSkill>;\n instructions: string | undefined;\n tools: HarnessAllTools<THarness, TUserTools>;\n toolsContext: InferToolSetContext<HarnessAllTools<THarness, TUserTools>>;\n activeTools: TUserTools;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n};\n\ntype PreparedHarnessAgentPromptTurnInput<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n> = PreparedHarnessAgentTurnSettings<THarness, TUserTools> & {\n prompt: HarnessAgentPrompt;\n runtimeContext: RUNTIME_CONTEXT;\n};\n\ntype PreparedHarnessAgentContinueTurnInput<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n> = PreparedHarnessAgentTurnSettings<THarness, TUserTools> & {\n toolApprovalContinuations: readonly ToolApprovalResponse[];\n toolResultContinuations: readonly ToolResultPart[];\n};\n\ntype HarnessAgentTurnResult<\n THarness extends HarnessAgentAdapter<any>,\n TUserTools extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> = {\n result: StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n done: Promise<void>;\n ready: Promise<void>;\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 CALL_OPTIONS = never,\n> implements Agent<\n CALL_OPTIONS,\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 CALL_OPTIONS\n >;\n private readonly stopConditions: Array<\n StopCondition<HarnessAllTools<THarness, TUserTools>, RUNTIME_CONTEXT>\n >;\n private readonly sandboxConfig: HarnessAgentSandboxConfig;\n private readonly builtinToolFiltering:\n | HarnessV1BuiltinToolFiltering\n | undefined;\n private readonly permissionMode: HarnessAgentPermissionMode;\n private readonly headers: Readonly<Record<string, string>> | undefined;\n\n constructor(\n settings: HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT,\n CALL_OPTIONS\n >,\n ) {\n if (settings.sandbox != null) {\n console.warn(\n 'HarnessAgent: `sandbox` is deprecated. Supply `sandboxSession` to createSession() instead.',\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 const forbiddenHeaders = new Set([\n 'authorization',\n 'x-api-key',\n 'user-agent',\n 'x-client-app',\n ]);\n const forbiddenHeader = Object.keys(settings.headers ?? {})\n .map(name => name.toLowerCase())\n .find(name => forbiddenHeaders.has(name));\n if (forbiddenHeader != null) {\n throw new Error(\n `HarnessAgent: \\`headers\\` must not include the managed header \\`${forbiddenHeader}\\`.`,\n );\n }\n const headers = normalizeHeaders(settings.headers);\n this.headers = Object.keys(headers).length === 0 ? undefined : headers;\n this.id = settings.id;\n const userTools = settings.tools ?? ({} as TUserTools);\n assertNoReservedQuestionTool({\n harness: settings.harness,\n userTools,\n });\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.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 /** Whether this agent parses completed turns with its configured output. */\n get hasOutput(): boolean {\n return this.settings.output != null;\n }\n\n getSandboxTemplate(): Promise<HarnessSandboxTemplate | undefined> {\n return createHarnessSandboxTemplate({\n harnesses: [this.settings.harness],\n sandboxConfig: this.sandboxConfig,\n });\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 * Rebinds host-only tool context for an unfinished turn resumed with\n * `continueFrom` (directly or through `resumeFrom`). Tool context is not\n * serialized into lifecycle state because it may contain credentials or\n * non-serializable host objects.\n */\n toolsContext?: ToolsContextSettings<TUserTools>['toolsContext'];\n /**\n * Rebinds host-only runtime context for an unfinished turn resumed with\n * `continueFrom` (directly or through `resumeFrom`). Runtime context is\n * not serialized into lifecycle state.\n */\n runtimeContext?: RUNTIME_CONTEXT;\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 if (options?.toolsContext != null && effectiveContinueFrom == null) {\n throw new Error(\n 'HarnessAgent.createSession: `toolsContext` can only rebind an unfinished turn from `continueFrom` or `resumeFrom`.',\n );\n }\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 // Harness infrastructure always lives under the sandbox's own\n // HOME, never the session's working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal,\n }),\n }),\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 const recipe = await harness.getBootstrap?.({ abortSignal });\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\n // Ensure the harness bootstrap recipe on resumed sessions too. The\n // marker is keyed by recipe identity, so a resume whose bootstrap is\n // already current costs one file read, while a resume into a sandbox\n // bootstrapped by an older adapter build — a snapshot that outlived\n // the harness version that made it — would otherwise keep running a\n // stale bridge against a newer host, silently missing whatever the\n // newer protocol added.\n if (recipe != null) {\n const recipeIdentity = await hashHarnessBootstrap(recipe);\n try {\n await applyBootstrapRecipe({\n session: resumedSandboxSession.restricted(),\n recipe,\n identity: recipeIdentity,\n // Harness infrastructure always lives under the sandbox's own\n // HOME, never the working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: resumedSandboxSession,\n abortSignal,\n }),\n }),\n abortSignal,\n });\n } catch (err) {\n await cleanupAfterStartFailure({\n sandboxSession,\n ownsSandboxLifecycle,\n });\n throw err;\n }\n }\n } else {\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 // Harness infrastructure always lives under the sandbox's own\n // HOME, never the working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: createdSandboxSession,\n abortSignal,\n }),\n }),\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 runSandboxBootstrap({\n session: getRestrictedSandboxSession(sandboxSession),\n workDir: this.sandboxConfig.workDir,\n onBootstrap: this.sandboxConfig.onBootstrap,\n bootstrapHash: this.sandboxConfig.bootstrapHash,\n skipOnBootstrapIfMarked: true,\n abortSignal,\n });\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 ...(this.headers == null ? {} : { headers: this.headers }),\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 turnSettings: effectiveContinueFrom?.turnSettings,\n resumedToolsContext: options?.toolsContext,\n resumedRuntimeContext: options?.runtimeContext,\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 CALL_OPTIONS,\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 continueTurnInput = this._resolveContinueTurnInput(options);\n const runtimeContext =\n this.settings.runtimeContext ?? ({} as RUNTIME_CONTEXT);\n const { result, done } =\n continueTurnInput == null\n ? await this._startPromptTurn({ options })\n : await this._startContinueTurn({\n session: options.session,\n turnInput: continueTurnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n });\n await done;\n return this._toGenerateResult(result);\n }\n\n async stream(\n options: AgentStreamParameters<\n CALL_OPTIONS,\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 continueTurnInput = this._resolveContinueTurnInput(options);\n const runtimeContext =\n this.settings.runtimeContext ?? ({} as RUNTIME_CONTEXT);\n const { result, ready } =\n continueTurnInput == null\n ? await this._startPromptTurn({ options })\n : await this._startContinueTurn({\n session: options.session,\n turnInput: continueTurnInput,\n runtimeContext,\n abortSignal: options.abortSignal,\n });\n await ready;\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 ToolApprovalResponse[];\n toolResultContinuations?: readonly ToolResultPart[];\n abortSignal?: AbortSignal;\n }): Promise<\n GenerateTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const runtimeContext =\n this.settings.runtimeContext ?? ({} as RUNTIME_CONTEXT);\n const { result, done } = await this._startContinueTurn({\n session: options.session,\n turnInput: {\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\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 ToolApprovalResponse[];\n toolResultContinuations?: readonly ToolResultPart[];\n abortSignal?: AbortSignal;\n }): Promise<\n StreamTextResult<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >\n > {\n const runtimeContext =\n this.settings.runtimeContext ?? ({} as RUNTIME_CONTEXT);\n const { result, ready } = await this._startContinueTurn({\n session: options.session,\n turnInput: {\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n },\n runtimeContext,\n abortSignal: options.abortSignal,\n });\n await ready;\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 async _startPromptTurn(input: {\n options: AgentCallParameters<\n CALL_OPTIONS,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions;\n }): Promise<\n HarnessAgentTurnResult<THarness, TUserTools, RUNTIME_CONTEXT, OUTPUT>\n > {\n const turnInput = await this._preparePromptTurnInput(input.options);\n const responseFormat = await this._resolveResponseFormat();\n\n return input.options.session.promptTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n ...this._buildTurnOptions({\n turnSettings: turnInput,\n runtimeContext: turnInput.runtimeContext,\n abortSignal: input.options.abortSignal,\n responseFormat,\n callbacks: this._resolveLifecycleCallbacks(input.options),\n }),\n prompt: turnInput.prompt,\n });\n }\n\n private async _startContinueTurn(input: {\n session: HarnessAgentSession;\n turnInput: HarnessAgentContinueTurnInput;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n }): Promise<\n HarnessAgentTurnResult<THarness, TUserTools, RUNTIME_CONTEXT, OUTPUT>\n > {\n const turnInput = this._prepareContinueTurnInput(input.turnInput);\n const responseFormat = await this._resolveResponseFormat();\n\n return input.session.continueTurn<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >({\n ...this._buildTurnOptions({\n turnSettings: turnInput,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat,\n callbacks: this._resolveLifecycleCallbacks(),\n }),\n toolApprovalContinuations: turnInput.toolApprovalContinuations,\n toolResultContinuations: turnInput.toolResultContinuations,\n });\n }\n\n private _buildTurnOptions(input: {\n turnSettings: PreparedHarnessAgentTurnSettings<THarness, TUserTools>;\n runtimeContext: RUNTIME_CONTEXT;\n abortSignal: AbortSignal | undefined;\n responseFormat: HarnessV1ResponseFormat | undefined;\n callbacks: HarnessAgentLifecycleCallbacks<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n >;\n }) {\n return {\n model: input.turnSettings.model,\n skills: input.turnSettings.skills,\n instructions: input.turnSettings.instructions,\n tools: input.turnSettings.tools,\n toolsContext: input.turnSettings.toolsContext,\n activeTools: input.turnSettings.activeTools,\n toolSpecs: input.turnSettings.toolSpecs,\n builtinToolFiltering: input.turnSettings.builtinToolFiltering,\n runtimeContext: input.runtimeContext,\n abortSignal: input.abortSignal,\n responseFormat: input.responseFormat,\n output: this.settings.output,\n telemetry: this.settings.telemetry,\n callbacks: input.callbacks,\n stopConditions: this.stopConditions,\n };\n }\n\n private _resolveLifecycleCallbacks(\n call?: AgentCallParameters<\n CALL_OPTIONS,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n >,\n ): HarnessAgentLifecycleCallbacks<\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT,\n OUTPUT\n > {\n return {\n onStart: mergeCallbacks(\n this.settings.onStart,\n call?.onStart ?? call?.experimental_onStart,\n ),\n onStepStart: mergeCallbacks(\n this.settings.onStepStart,\n call?.onStepStart ?? call?.experimental_onStepStart,\n ),\n onLanguageModelCallStart: this.settings.onLanguageModelCallStart,\n onLanguageModelCallEnd: this.settings.onLanguageModelCallEnd,\n onToolExecutionStart: mergeCallbacks(\n this.settings.onToolExecutionStart,\n call?.onToolExecutionStart ?? call?.experimental_onToolCallStart,\n ),\n onToolExecutionEnd: mergeCallbacks(\n this.settings.onToolExecutionEnd,\n call?.onToolExecutionEnd ?? call?.experimental_onToolCallFinish,\n ),\n onStepEnd: mergeCallbacks(\n this.settings.onStepEnd,\n call?.onStepEnd ?? call?.onStepFinish,\n ),\n onEnd: mergeCallbacks(this.settings.onEnd, call?.onEnd ?? call?.onFinish),\n };\n }\n\n private _resolveContinueTurnInput(options: {\n prompt?: string | ModelMessage[];\n messages?: ModelMessage[];\n }): HarnessAgentContinueTurnInput | undefined {\n if (typeof options.prompt === 'string') {\n return undefined;\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 toolApprovalContinuations,\n toolResultContinuations,\n };\n }\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 _resolvePromptTurnInput(options: {\n prompt?: string | ModelMessage[];\n messages?: ModelMessage[];\n }): HarnessAgentPrompt {\n if (typeof options.prompt === 'string') {\n return options.prompt;\n }\n const messages = Array.isArray(options.prompt)\n ? options.prompt\n : options.messages;\n if (Array.isArray(messages)) {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i];\n if (message?.role === 'user') return 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 private async _preparePromptTurnInput(\n options: AgentCallParameters<\n CALL_OPTIONS,\n HarnessAllTools<THarness, TUserTools>,\n RUNTIME_CONTEXT\n > &\n HarnessAgentCallExtensions,\n ): Promise<\n PreparedHarnessAgentPromptTurnInput<THarness, TUserTools, RUNTIME_CONTEXT>\n > {\n let callOptions = options;\n if (\n this.settings.callOptionsSchema != null &&\n options.options !== undefined\n ) {\n const validatedOptions = await validateTypes({\n value: options.options,\n schema: this.settings.callOptionsSchema,\n context: { field: 'options' },\n });\n callOptions = {\n ...options,\n options: validatedOptions,\n } as unknown as typeof options;\n }\n\n const {\n session: _session,\n abortSignal: _abortSignal,\n timeout: _timeout,\n onStart: _onStart,\n experimental_onStart: _experimentalOnStart,\n onStepStart: _onStepStart,\n experimental_onStepStart: _experimentalOnStepStart,\n onToolExecutionStart: _onToolExecutionStart,\n experimental_onToolCallStart: _experimentalOnToolCallStart,\n onToolExecutionEnd: _onToolExecutionEnd,\n experimental_onToolCallFinish: _experimentalOnToolCallFinish,\n onStepEnd: _onStepEnd,\n onStepFinish: _onStepFinish,\n onEnd: _onEnd,\n onFinish: _onFinish,\n experimental_sandbox: _experimentalSandbox,\n ...promptOptions\n } = callOptions;\n\n const baseCallArgs = {\n model: this.settings.model,\n skills: this.settings.skills,\n instructions: this.settings.instructions,\n tools: this.settings.tools,\n runtimeContext: this.settings.runtimeContext,\n toolsContext:\n this.settings.toolsContext ?? ({} as InferToolSetContext<TUserTools>),\n ...promptOptions,\n };\n const preparedCallArgs =\n (await this.settings.prepareCall?.(\n baseCallArgs as Parameters<\n NonNullable<\n HarnessAgentSettings<\n THarness,\n TUserTools,\n RUNTIME_CONTEXT,\n OUTPUT,\n CALL_OPTIONS\n >['prepareCall']\n >\n >[0],\n )) ?? baseCallArgs;\n if (this._resolveContinueTurnInput(preparedCallArgs) != null) {\n throw new Error(\n 'HarnessAgent.prepareCall must return a fresh user prompt, not a tool continuation.',\n );\n }\n\n return {\n prompt: this._resolvePromptTurnInput(preparedCallArgs),\n runtimeContext:\n preparedCallArgs.runtimeContext ?? ({} as RUNTIME_CONTEXT),\n ...this._prepareTurnSettings({\n model: preparedCallArgs.model,\n skills: preparedCallArgs.skills,\n instructions: preparedCallArgs.instructions,\n tools: preparedCallArgs.tools,\n toolsContext: preparedCallArgs.toolsContext,\n }),\n };\n }\n\n private _prepareContinueTurnInput(options: {\n toolApprovalContinuations?: readonly ToolApprovalResponse[];\n toolResultContinuations?: readonly ToolResultPart[];\n }): PreparedHarnessAgentContinueTurnInput<THarness, TUserTools> {\n return {\n ...this._prepareTurnSettings({\n model: this.settings.model,\n skills: this.settings.skills,\n instructions: this.settings.instructions,\n tools: this.settings.tools,\n toolsContext: this.settings.toolsContext,\n }),\n toolApprovalContinuations: options.toolApprovalContinuations ?? [],\n toolResultContinuations: options.toolResultContinuations ?? [],\n };\n }\n\n private _prepareTurnSettings(options: {\n model?: string;\n skills?: ReadonlyArray<HarnessAgentSkill>;\n instructions?: string | SystemModelMessage;\n tools?: TUserTools;\n toolsContext?: InferToolSetContext<TUserTools>;\n }): PreparedHarnessAgentTurnSettings<THarness, TUserTools> {\n const userTools = options.tools ?? ({} as TUserTools);\n assertNoReservedQuestionTool({\n harness: this.settings.harness,\n userTools,\n });\n const tools = {\n ...this.settings.harness.builtinTools,\n ...userTools,\n } as HarnessAllTools<THarness, TUserTools>;\n const toolFiltering = resolveHarnessAgentToolFiltering({\n harness: this.settings.harness,\n userTools,\n allTools: tools,\n activeTools: this.settings.activeTools,\n inactiveTools: this.settings.inactiveTools,\n });\n return {\n model: options.model,\n skills: options.skills ?? [],\n instructions:\n typeof options.instructions === 'string'\n ? options.instructions\n : options.instructions?.content,\n tools,\n toolsContext: (options.toolsContext ?? {}) as InferToolSetContext<\n HarnessAllTools<THarness, TUserTools>\n >,\n activeTools: toolFiltering.activeUserTools,\n toolSpecs: this._toToolSpecs(toolFiltering.activeUserTools),\n builtinToolFiltering: toolFiltering.builtinToolFiltering,\n };\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(activeUserTools: TUserTools): HarnessAgentToolSpec[] {\n const specs: HarnessAgentToolSpec[] = [];\n for (const [name, tool] of Object.entries(\n 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\nfunction assertNoReservedQuestionTool(input: {\n harness: HarnessV1;\n userTools: ToolSet;\n}): void {\n if (\n Object.prototype.hasOwnProperty.call(\n input.harness.builtinTools,\n 'askUserQuestions',\n ) &&\n Object.prototype.hasOwnProperty.call(input.userTools, 'askUserQuestions')\n ) {\n throw new Error(\n \"HarnessAgent tool name 'askUserQuestions' is reserved for harness question requests.\",\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 ...(state.turnSettings !== undefined\n ? { turnSettings: state.turnSettings }\n : {}),\n } as STATE;\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 HarnessV1Skill,\n type HarnessV1StreamPart,\n type HarnessV1ToolSpec,\n} from '../../v1';\nimport { toHarnessStream } from './to-harness-stream';\nimport {\n executeTool,\n generateId,\n type InferToolSetContext,\n isExecutableTool,\n safeParseJSON,\n type Context,\n type Experimental_SandboxSession as SandboxSession,\n type ToolApprovalResponse,\n type ToolResultPart,\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 {\n asLanguageModelUsage,\n parseToolCall,\n validateToolContext,\n} from 'ai/internal';\nimport type {\n ContentPart,\n OutputInterface as Output,\n ProviderMetadata,\n StepResult,\n StopCondition,\n TelemetryOptions,\n TextStreamPart,\n TypedToolCall,\n TypedToolError,\n TypedToolResult,\n} from 'ai';\nimport type { HarnessAgentToolApprovalConfiguration } from '../harness-agent-settings';\nimport { HarnessStreamTextResult } from './harness-stream-text-result';\nimport { getOwn } from './get-own';\nimport { translateStreamPart } from './translate-stream-part';\nimport {\n createToolInputWorkDirStripper,\n stripParsedToolInputWorkDir,\n stripWorkDir,\n} from './strip-work-dir';\nimport {\n createTurnLifecycle,\n type HarnessAgentLifecycleCallbacks,\n type TurnLifecycle,\n} from './turn-telemetry';\nimport { resolveCustomToolApproval } from './permission-mode';\nimport { logBridgeError } from '../../utils/bridge-diagnostics';\nimport { pinSandboxChannelEventCheckpoint } from '../../utils/sandbox-channel';\n\nconst invalidToolInputMessage = 'Tool input validation failed.';\n\nfunction unwrapToolResultOutput(toolResult: ToolResultPart): {\n output: unknown;\n isError?: boolean;\n} {\n switch (toolResult.output.type) {\n case 'text':\n case 'json':\n return { output: toolResult.output.value };\n case 'error-text':\n case 'error-json':\n return { output: toolResult.output.value, isError: true };\n case 'execution-denied':\n return {\n output: {\n type: toolResult.output.type,\n reason: toolResult.output.reason,\n },\n };\n case 'content':\n return { output: toolResult.output };\n }\n}\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 model?: string;\n skills?: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext?: InferToolSetContext<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 callbacks?: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n stopConditions?: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApproval?: HarnessAgentToolApprovalConfiguration | undefined;\n pendingToolApprovals?: readonly HarnessV1PendingToolApproval[];\n pendingToolResults?: readonly HarnessV1PendingToolResult[];\n toolApprovalContinuations?: readonly ToolApprovalResponse[] | undefined;\n toolResultContinuations?: readonly ToolResultPart[] | 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 callId = generateId();\n const toolsContext = input.toolsContext ?? ({} as InferToolSetContext<TOOLS>);\n const result = new HarnessStreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n tools: input.tools,\n runtimeContext: input.runtimeContext,\n toolsContext,\n harnessId: input.harness.harnessId,\n callId,\n modelId: input.model ?? '',\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 const activeToolNames = Object.keys(input.tools).filter(\n toolName =>\n Object.prototype.hasOwnProperty.call(activeTools, toolName) ||\n (Object.prototype.hasOwnProperty.call(\n input.harness.builtinTools,\n toolName,\n ) &&\n isHarnessV1BuiltinToolIncluded({\n toolName,\n toolFiltering: input.builtinToolFiltering,\n })),\n );\n\n const lifecycle = createTurnLifecycle({\n callId,\n telemetry: input.telemetry,\n callbacks: input.callbacks ?? {},\n harnessId: input.harness.harnessId,\n modelId: input.model,\n instructions: input.instructions,\n tools: input.tools,\n activeToolNames,\n toolSpecs: input.toolSpecs,\n messages:\n input.prompt == null\n ? []\n : [{ role: 'user', content: promptToText(input.prompt) }],\n runtimeContext: input.runtimeContext,\n toolsContext,\n output: input.output,\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 model: input.model,\n skills: input.skills ?? [],\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 model: input.model,\n skills: input.skills ?? [],\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 lifecycle.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 stripToolInputWorkDir = createToolInputWorkDirStripper({\n sessionWorkDir: input.sessionWorkDir,\n });\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.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 const settledBuiltinApprovalToolCallIds = 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 response until its step boundary. Harness runtimes\n // may execute tools before emitting `finish-step`, so tool lifecycle\n // notifications and consumer-visible tool outcomes are held until then.\n let stepText = '';\n let stepReasoning = '';\n let stepToolCalls: ContentPart<TOOLS>[] = [];\n let stepProviderToolResults: ContentPart<TOOLS>[] = [];\n let stepApprovalRequests: ContentPart<TOOLS>[] = [];\n let bufferedToolOutcomes: Array<() => void> = [];\n const toolExecutions = new Map<\n string,\n {\n toolCall: TypedToolCall<TOOLS>;\n toolOutput?: TypedToolResult<TOOLS> | TypedToolError<TOOLS>;\n toolExecutionMs?: number;\n }\n >();\n const publishToolExecutions = async (): Promise<void> => {\n for (const execution of toolExecutions.values()) {\n if (execution.toolOutput == null) continue;\n await lifecycle.toolExecutionStart({\n toolCall: execution.toolCall,\n });\n await lifecycle.toolExecutionEnd({\n toolCall: execution.toolCall,\n toolOutput: execution.toolOutput,\n toolExecutionMs: execution.toolExecutionMs ?? 0,\n });\n }\n for (const publish of bufferedToolOutcomes) publish();\n toolExecutions.clear();\n bufferedToolOutcomes = [];\n };\n let expectedStepToolCallCount: number | undefined;\n let observedStepToolCallCount = 0;\n let pauseAfterStepToolCalls = false;\n const buildModelCallContent = (): ContentPart<TOOLS>[] => {\n const parts: ContentPart<TOOLS>[] = [];\n if (stepText) parts.push({ type: 'text', text: stepText });\n if (stepReasoning) parts.push({ type: 'reasoning', text: stepReasoning });\n parts.push(...stepToolCalls);\n parts.push(...stepApprovalRequests);\n parts.push(...stepProviderToolResults);\n return parts;\n };\n const resetStepContent = (): void => {\n stepText = '';\n stepReasoning = '';\n stepToolCalls = [];\n stepProviderToolResults = [];\n stepApprovalRequests = [];\n bufferedToolOutcomes = [];\n toolExecutions.clear();\n expectedStepToolCallCount = undefined;\n observedStepToolCallCount = 0;\n pauseAfterStepToolCalls = false;\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 lifecycle.languageModelCallEnd({\n finishReason: input.finishReason.unified,\n usage: asLanguageModelUsage(input.usage),\n providerMetadata: input.providerMetadata,\n content: buildModelCallContent(),\n });\n await publishToolExecutions();\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 await lifecycle.stepEnd(step);\n resetStepContent();\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 } else {\n await publishToolExecutions();\n }\n await lifecycle.end({\n steps: completedSteps,\n usage: asLanguageModelUsage(zeroUsage),\n });\n await result.finish();\n };\n const enqueueApprovalRequest = (approval: {\n approvalId: string;\n toolCall: ToolCallTextStreamPart;\n isAutomatic?: boolean;\n }): void => {\n const part = {\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 result.enqueue(part);\n stepApprovalRequests.push(part as ContentPart<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: ToolApprovalResponse,\n toolCall: ToolCallTextStreamPart,\n ): void => {\n result.enqueueContinuation({\n type: 'tool-approval-response',\n approvalId: approval.approvalId,\n toolCall,\n approved: continuation.approved,\n ...(continuation.reason !== undefined\n ? { reason: continuation.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 ...(options.toolCall.providerMetadata !== undefined\n ? { providerOptions: options.toolCall.providerMetadata }\n : {}),\n } satisfies HarnessV1PendingToolResult);\n pendingResultsByToolCallId.set(pendingResult.toolCallId, pendingResult);\n onPendingToolResult(pendingResult);\n return pendingResult;\n };\n const enqueueHostToolOutcome = (options: {\n toolCall: ToolCallTextStreamPart;\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 submitToolResult: HarnessV1PromptControl['submitToolResult'] =\n async submission => {\n if (!input.isTurnSuspending?.()) {\n return control.submitToolResult(submission);\n }\n const toolCall =\n rawToolCallsByToolCallId.get(submission.toolCallId) ??\n pendingResultsByToolCallId.get(submission.toolCallId) ??\n pendingToolApprovals.find(\n approval => approval.toolCallId === submission.toolCallId,\n );\n if (toolCall == null) {\n throw new Error(\n `Unknown suspended tool call '${submission.toolCallId}'.`,\n );\n }\n const { toolCallId, ...completedResult } = submission;\n onPendingToolResult({\n toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n completedResult,\n });\n const parsed = toolCallsByToolCallId.get(toolCallId);\n if (parsed != null && !settledHostToolCallIds.has(toolCallId)) {\n bufferedToolOutcomes.push(() =>\n enqueueHostToolOutcome({\n toolCall: parsed,\n outcome: submission.isError\n ? { ok: false, error: submission.output }\n : { ok: true, output: submission.output },\n }),\n );\n }\n };\n const processPendingToolResultContinuation = async (\n pendingResult: HarnessV1PendingToolResult,\n continuation: ToolResultPart | undefined,\n ): Promise<void> => {\n const submission =\n continuation == null\n ? pendingResult.completedResult\n : {\n ...unwrapToolResultOutput(continuation),\n toolResult: {\n ...continuation,\n toolName: pendingResult.toolName,\n ...(continuation.providerOptions == null &&\n pendingResult.providerOptions != null\n ? { providerOptions: pendingResult.providerOptions }\n : {}),\n },\n };\n if (submission == null) return;\n settledHostToolCallIds.add(pendingResult.toolCallId);\n onToolResultSettled(pendingResult.toolCallId);\n await submitToolResult({\n toolCallId: pendingResult.toolCallId,\n ...submission,\n });\n pendingResultsByToolCallId.delete(pendingResult.toolCallId);\n };\n const processPendingApprovalContinuation = async (\n approval: HarnessV1PendingToolApproval,\n continuation: ToolApprovalResponse,\n ): Promise<'continued' | 'awaiting-tool-result'> => {\n const rawToolCall =\n (approval.kind === 'builtin'\n ? rawToolCallsByToolCallId.get(approval.toolCallId)\n : undefined) ??\n ({\n type: 'tool-call',\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n input: approval.input,\n providerExecuted: approval.providerExecuted,\n nativeName: approval.nativeName,\n } satisfies Extract<HarnessV1StreamPart, { type: 'tool-call' }>);\n let validatedToolCall: ToolCallTextStreamPart | undefined;\n let toolCall: ToolCallTextStreamPart;\n if (approval.kind === 'custom' && continuation.approved) {\n validatedToolCall = asToolCallTextStreamPart({\n part: await validateToolCall({\n event: rawToolCall,\n tools: input.tools,\n }),\n });\n toolCall = displayHostToolCall({\n toolCall: validatedToolCall,\n sessionWorkDir: input.sessionWorkDir,\n });\n } else {\n const parsedInput = await safeParseJSON({ text: rawToolCall.input });\n toolCall = {\n type: 'tool-call',\n toolCallId: rawToolCall.toolCallId,\n toolName: rawToolCall.toolName,\n input: parsedInput.success ? parsedInput.value : rawToolCall.input,\n ...(rawToolCall.providerExecuted !== undefined\n ? { providerExecuted: rawToolCall.providerExecuted }\n : {}),\n };\n }\n\n enqueueApprovalResponse(approval, continuation, toolCall);\n onToolApprovalSettled(approval.approvalId);\n pendingApprovalsByApprovalId.delete(approval.approvalId);\n pendingApprovalsByToolCallId.delete(approval.toolCallId);\n\n if (approval.kind === 'builtin') {\n settledBuiltinApprovalToolCallIds.add(approval.toolCallId);\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.approved,\n reason: continuation.reason,\n });\n return 'continued';\n }\n\n settledHostToolCallIds.add(approval.toolCallId);\n if (!continuation.approved) {\n await submitToolResult({\n toolCallId: approval.toolCallId,\n output: {\n type: 'execution-denied',\n reason: continuation.reason,\n },\n });\n return 'continued';\n }\n\n if (validatedToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not validate approved host tool '${approval.toolName}'.`,\n );\n }\n\n if (validatedToolCall.invalid) {\n const error = new Error(invalidToolInputMessage);\n await submitToolResult({\n toolCallId: approval.toolCallId,\n output: { error: invalidToolInputMessage },\n isError: true,\n });\n bufferedToolOutcomes.push(() => {\n enqueueHostToolOutcome({\n toolCall,\n outcome: { ok: false, error },\n });\n });\n await publishToolExecutions();\n return 'continued';\n }\n\n await lifecycle.start(input.model);\n toolExecutions.set(rawToolCall.toolCallId, {\n toolCall: toolCall as TypedToolCall<TOOLS>,\n });\n const executionStartedAt = Date.now();\n const execution = await maybeExecuteHostTool({\n event: rawToolCall,\n parsedToolCall: validatedToolCall,\n tools: activeTools,\n toolsContext,\n wrappedExecuteTool: lifecycle.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n submitToolResult,\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 bufferedToolOutcomes.push(() => {\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 });\n if (!execution.executed) {\n recordPendingToolResult({ toolCall: rawToolCall });\n await finishForHostInputPause({ completeCurrentStep: false });\n return 'awaiting-tool-result';\n }\n const toolExecution = toolExecutions.get(rawToolCall.toolCallId)!;\n toolExecution.toolOutput = toToolOutput({\n toolCall,\n outcome: execution.outcome,\n });\n toolExecution.toolExecutionMs = Date.now() - executionStartedAt;\n bufferedToolOutcomes.push(() => {\n enqueueHostToolOutcome({\n toolCall,\n outcome: execution.outcome,\n });\n });\n await publishToolExecutions();\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 || pendingResult.completedResult != null) {\n await processPendingToolResultContinuation(\n pendingResult,\n continuation,\n );\n if (pendingResult.completedResult == null) closingResumedStep = true;\n }\n }\n\n while (true) {\n if (\n pauseAfterStepToolCalls &&\n expectedStepToolCallCount != null &&\n observedStepToolCallCount >= expectedStepToolCallCount\n ) {\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n\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 { usage } = pendingStopBoundary;\n releasePendingStopBoundary();\n await lifecycle.end({\n steps: completedSteps,\n usage: asLanguageModelUsage(usage),\n });\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 requested turn model).\n if (value.type === 'stream-start') {\n const modelId = value.modelId ?? input.model;\n if (modelId != null) result.setModelId(modelId);\n await lifecycle.start(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 lifecycle.ensureStepOpen();\n }\n\n if (\n value.type === 'tool-input-start' ||\n value.type === 'tool-input-delta' ||\n value.type === 'tool-input-end'\n ) {\n if (\n settledHostToolCallIds.has(value.id) ||\n settledBuiltinApprovalToolCallIds.has(value.id)\n ) {\n continue;\n }\n for (const displayValue of stripToolInputWorkDir(value)) {\n for (const part of translateStreamPart<TOOLS>(\n displayValue,\n translateOptions,\n )) {\n result.enqueue(part);\n }\n }\n continue;\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 const settledBuiltinApprovalReplay =\n (displayValue.type === 'tool-call' ||\n displayValue.type === 'tool-approval-request') &&\n settledBuiltinApprovalToolCallIds.has(displayValue.toolCallId);\n\n if (settledHostInputReplay || settledBuiltinApprovalReplay) {\n continue;\n }\n if (displayValue.type === 'finish-step' && closingResumedStep) {\n closingResumedStep = false;\n await publishToolExecutions();\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 lifecycle.error(value.error);\n // A turn the caller itself aborted ends with an error-shaped part by\n // construction; diagnosing the caller's own signal to stderr reads\n // as a malfunction. `settleFailure` below still reports it as an\n // abort to the consumer.\n if (!input.abortSignal?.aborted) {\n logBridgeError({\n harnessId: input.harness.harnessId,\n sessionId: input.session.sessionId,\n context: 'harness stream error',\n error: value.error,\n });\n }\n settleFailure(displayValue.error);\n return;\n }\n\n const translatedParts = translateStreamPart<TOOLS>(\n displayValue,\n translateOptions,\n );\n if (value.type === 'tool-result') {\n bufferedToolOutcomes.push(() => {\n for (const part of translatedParts) result.enqueue(part);\n });\n } else {\n for (const part of translatedParts) 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 let validatedHostToolCall: ToolCallTextStreamPart | undefined;\n if (displayValue.type === 'tool-call') {\n const isHostTool =\n value.type === 'tool-call' &&\n !value.providerExecuted &&\n hasTool({ tools: activeTools, toolName: value.toolName }) &&\n !(\n value.toolName === 'askUserQuestions' &&\n hasTool({\n tools: input.harness.builtinTools,\n toolName: value.toolName,\n })\n );\n const parsed = await validateToolCall<TOOLS>({\n event: isHostTool ? value : displayValue,\n tools: input.tools,\n });\n const parsedToolCall = asToolCallTextStreamPart({ part: parsed });\n validatedHostToolCall = isHostTool ? parsedToolCall : undefined;\n const displayToolCall = isHostTool\n ? displayHostToolCall({\n toolCall: parsedToolCall,\n sessionWorkDir: input.sessionWorkDir,\n })\n : parsedToolCall;\n rawToolCallsByToolCallId.set(displayValue.toolCallId, displayValue);\n toolCallsByToolCallId.set(displayValue.toolCallId, displayToolCall);\n result.enqueue(displayToolCall as TextStreamPart<TOOLS>);\n }\n\n if (value.type === 'text-delta') {\n stepText += value.delta;\n } else if (value.type === 'reasoning-delta') {\n stepReasoning += value.delta;\n }\n\n if (value.type === 'tool-call') {\n observedStepToolCallCount += 1;\n expectedStepToolCallCount ??= value.stepToolCallCount;\n const toolCall = toolCallsByToolCallId.get(value.toolCallId);\n if (toolCall != null) {\n stepToolCalls.push(toolCall as ContentPart<TOOLS>);\n toolExecutions.set(value.toolCallId, {\n toolCall: toolCall as TypedToolCall<TOOLS>,\n });\n }\n }\n\n if (value.type === 'tool-result') {\n const execution = toolExecutions.get(value.toolCallId);\n if (execution != null && execution.toolOutput == null) {\n execution.toolOutput = value.isError\n ? ({\n ...execution.toolCall,\n type: 'tool-error',\n error: value.result,\n } as TypedToolError<TOOLS>)\n : ({\n ...execution.toolCall,\n type: 'tool-result',\n output: value.result,\n } as TypedToolResult<TOOLS>);\n }\n if (\n rawToolCallsByToolCallId.get(value.toolCallId)?.providerExecuted ===\n true &&\n execution?.toolOutput != null\n ) {\n stepProviderToolResults.push(\n execution.toolOutput as ContentPart<TOOLS>,\n );\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 lifecycle.end({\n steps: completedSteps,\n usage: asLanguageModelUsage(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 const isClientExecutedBuiltin =\n toolCall.toolName === 'askUserQuestions' &&\n Object.prototype.hasOwnProperty.call(\n input.harness.builtinTools,\n toolCall.toolName,\n );\n if (\n !isClientExecutedBuiltin &&\n !hasTool({ tools: activeTools, toolName: toolCall.toolName })\n ) {\n const output = {\n type: 'execution-denied',\n reason: getHarnessV1BuiltinToolFilteringDenialReason({\n toolName: toolCall.toolName,\n }),\n };\n await submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n const execution = toolExecutions.get(toolCall.toolCallId);\n if (execution != null) {\n execution.toolOutput = toToolOutput({\n toolCall: parsedToolCall,\n outcome: { ok: true, output },\n });\n }\n continue;\n }\n if (isClientExecutedBuiltin) {\n recordPendingToolResult({ toolCall });\n if (\n expectedStepToolCallCount != null &&\n observedStepToolCallCount < expectedStepToolCallCount\n ) {\n pauseAfterStepToolCalls = true;\n continue;\n }\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n if (validatedHostToolCall == null) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not validate host tool '${toolCall.toolName}'.`,\n );\n }\n if (validatedHostToolCall.invalid) {\n settledHostToolCallIds.add(toolCall.toolCallId);\n toolExecutions.delete(toolCall.toolCallId);\n bufferedToolOutcomes.push(() => {\n result.enqueue({\n type: 'tool-error',\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: parsedToolCall.input,\n error: new Error(invalidToolInputMessage),\n dynamic: true,\n } as TextStreamPart<TOOLS>);\n });\n await submitToolResult({\n toolCallId: toolCall.toolCallId,\n output: { error: invalidToolInputMessage },\n isError: true,\n });\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 submitToolResult({\n toolCallId: toolCall.toolCallId,\n output,\n });\n const execution = toolExecutions.get(toolCall.toolCallId);\n if (execution != null) {\n execution.toolOutput = toToolOutput({\n toolCall: parsedToolCall,\n outcome: { ok: true, output },\n });\n }\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 if (\n expectedStepToolCallCount != null &&\n observedStepToolCallCount < expectedStepToolCallCount\n ) {\n pauseAfterStepToolCalls = true;\n continue;\n }\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n if (!isExecutableTool(activeTools[toolCall.toolName])) {\n recordPendingToolResult({ toolCall });\n if (\n expectedStepToolCallCount != null &&\n observedStepToolCallCount < expectedStepToolCallCount\n ) {\n pauseAfterStepToolCalls = true;\n continue;\n }\n await finishForHostInputPause({ completeCurrentStep: true });\n return;\n }\n startHostToolExecution(\n (async () => {\n const executionStartedAt = Date.now();\n const execution = await maybeExecuteHostTool({\n event: toolCall,\n parsedToolCall: validatedHostToolCall,\n tools: activeTools,\n toolsContext,\n wrappedExecuteTool: lifecycle.executeTool,\n sandboxSession: input.sandboxSession,\n abortSignal: input.abortSignal,\n submitToolResult,\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 bufferedToolOutcomes.push(() => {\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 });\n if (!execution.executed) {\n throw new Error(\n `Harness '${input.harness.harnessId}' could not execute host tool '${toolCall.toolName}'.`,\n );\n }\n const toolExecution = toolExecutions.get(toolCall.toolCallId);\n if (toolExecution != null) {\n toolExecution.toolOutput = toToolOutput({\n toolCall: parsedToolCall,\n outcome: execution.outcome,\n });\n toolExecution.toolExecutionMs = Date.now() - executionStartedAt;\n }\n })(),\n );\n }\n }\n await waitForOutstandingHostToolExecutions();\n const isTurnSuspending = input.isTurnSuspending?.() === true;\n if (isTurnSuspending) {\n await publishToolExecutions();\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 lifecycle.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 toToolOutput<TOOLS extends ToolSet>(input: {\n toolCall: ToolCallTextStreamPart;\n outcome: HostToolOutcome;\n}): TypedToolResult<TOOLS> | TypedToolError<TOOLS> {\n return input.outcome.ok\n ? ({\n ...input.toolCall,\n type: 'tool-result',\n output: input.outcome.output,\n } as TypedToolResult<TOOLS>)\n : ({\n ...input.toolCall,\n type: 'tool-error',\n error: input.outcome.error,\n } as TypedToolError<TOOLS>);\n}\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\nfunction displayHostToolCall(input: {\n toolCall: ToolCallTextStreamPart;\n sessionWorkDir: string;\n}): ToolCallTextStreamPart {\n return {\n ...input.toolCall,\n input: stripParsedToolInputWorkDir({\n value: input.toolCall.input,\n sessionWorkDir: input.sessionWorkDir,\n }),\n ...(input.toolCall.invalid\n ? { error: new Error(invalidToolInputMessage) }\n : {}),\n };\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 parsedToolCall: ToolCallTextStreamPart;\n tools: TOOLS;\n toolsContext: InferToolSetContext<TOOLS>;\n wrappedExecuteTool: TurnLifecycle<ToolSet, Context>['executeTool'];\n sandboxSession: SandboxSession;\n abortSignal: AbortSignal | undefined;\n submitToolResult: HarnessV1PromptControl['submitToolResult'];\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 if (input.parsedToolCall.invalid) {\n const error = new Error(invalidToolInputMessage);\n await input.submitToolResult({\n toolCallId: input.event.toolCallId,\n output: { error: invalidToolInputMessage },\n isError: true,\n });\n return { executed: true, outcome: { ok: false, error } };\n }\n\n let context: unknown;\n try {\n context = await validateToolContext({\n toolName: input.event.toolName,\n context: getOwn(input.toolsContext, input.event.toolName),\n contextSchema: tool.contextSchema,\n });\n } catch (err) {\n // Context is host-only and can contain credentials. Keep the detailed\n // validation error in the host-facing outcome, but never send its value or\n // schema diagnostics back to the runtime/model.\n await input.submitToolResult({\n toolCallId: input.event.toolCallId,\n output: { error: 'Tool context validation failed.' },\n isError: true,\n });\n return { executed: true, outcome: { ok: false, error: err } };\n }\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: input.parsedToolCall.input as never,\n options: {\n toolCallId: input.event.toolCallId,\n messages: [],\n abortSignal: input.abortSignal,\n context: context 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.submitToolResult({\n toolCallId: input.event.toolCallId,\n output,\n });\n return { executed: true, outcome: { ok: true, output } };\n } catch (err) {\n await input.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 optional harness-only fields. `providerExecuted` already lives on the\n * V4 type — `true` for adapter builtins (Claude Code's `Bash`, Codex's\n * `shell`), false/undefined for host tools — and is passed through to the AI\n * 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 type InferToolSetContext,\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: InferToolSetContext<TOOLS>;\n private readonly providerName: string;\n private readonly callId: string;\n private 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: InferToolSetContext<TOOLS>;\n harnessId: string;\n callId: string;\n modelId: 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.callId = options.callId;\n this.modelId = options.modelId;\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 setModelId(modelId: string): void {\n if (this.stepsBuffer.length === 0) {\n this.modelId = modelId;\n }\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: this.callId,\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: `${this.callId}-${this.stepNumber}`,\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: this.callId,\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: `${this.callId}-0`,\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 'reasoning-delta': {\n const last =\n this.currentStepContent[this.currentStepContent.length - 1];\n if (last && last.type === 'reasoning') {\n (last as { text: string }).text += part.text;\n } else {\n this.currentStepContent.push({\n type: 'reasoning',\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 default:\n // Boundary, raw, error, and finish parts are not ContentParts.\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","export function getOwn<T extends object>(\n obj: T | undefined | null,\n key: string,\n): T[keyof T] | undefined {\n return obj != null && Object.prototype.hasOwnProperty.call(obj, key)\n ? obj[key as keyof T]\n : undefined;\n}\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-input-start':\n case 'tool-input-delta':\n case 'tool-input-end':\n return [event as TextStreamPart<TOOLS>];\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\ntype ToolInputStreamPart = Extract<\n HarnessV1StreamPart,\n {\n type: 'tool-input-start' | 'tool-input-delta' | 'tool-input-end';\n }\n>;\n\nexport function createToolInputWorkDirStripper({\n sessionWorkDir,\n}: {\n sessionWorkDir: string;\n}): (part: ToolInputStreamPart) => ToolInputStreamPart[] {\n const stateByToolCallId = new Map<\n string,\n {\n pending: string;\n precedingCharacter: string | undefined;\n }\n >();\n\n return part => {\n if (sessionWorkDir.length === 0) return [part];\n\n if (part.type === 'tool-input-start') {\n stateByToolCallId.set(part.id, {\n pending: '',\n precedingCharacter: undefined,\n });\n return [part];\n }\n\n if (part.type === 'tool-input-delta') {\n const state = stateByToolCallId.get(part.id) ?? {\n pending: '',\n precedingCharacter: undefined,\n };\n const value = state.pending + part.delta;\n const stripped = stripStreamingString({\n value,\n workDir: sessionWorkDir,\n final: false,\n precedingCharacter: state.precedingCharacter,\n });\n const pendingStart = value.length - stripped.pending.length;\n stateByToolCallId.set(part.id, {\n pending: stripped.pending,\n precedingCharacter:\n stripped.pending.length > 0\n ? pendingStart > 0\n ? value[pendingStart - 1]\n : state.precedingCharacter\n : value.length > 0\n ? value[value.length - 1]\n : state.precedingCharacter,\n });\n return stripped.output.length === 0\n ? []\n : [{ ...part, delta: stripped.output }];\n }\n\n const state = stateByToolCallId.get(part.id);\n stateByToolCallId.delete(part.id);\n if (state == null || state.pending.length === 0) return [part];\n\n const stripped = stripStreamingString({\n value: state.pending,\n workDir: sessionWorkDir,\n final: true,\n precedingCharacter: state.precedingCharacter,\n });\n return stripped.output.length === 0\n ? [part]\n : [\n { type: 'tool-input-delta', id: part.id, delta: stripped.output },\n part,\n ];\n };\n}\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 * Boundary-aware prefix replacement (rather than rewriting known path fields)\n * is used deliberately: `tool-result` results are free-form text — command\n * stdout, grep output — where paths can appear anywhere and field-aware\n * rewriting is impossible.\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-input-delta':\n return { ...part, delta: stripString(part.delta, sessionWorkDir) };\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\nexport function stripParsedToolInputWorkDir({\n value,\n sessionWorkDir,\n}: {\n value: unknown;\n sessionWorkDir: string;\n}): unknown {\n if (sessionWorkDir.length === 0) return value;\n\n const projected = new WeakMap<object, unknown>();\n const pending: Array<{\n source: object;\n target: Record<string, unknown> | unknown[];\n }> = [];\n\n const project = (item: unknown): unknown => {\n if (typeof item === 'string') return stripString(item, sessionWorkDir);\n if (item === null || typeof item !== 'object') return item;\n if (\n !Array.isArray(item) &&\n Object.getPrototypeOf(item) !== Object.prototype &&\n Object.getPrototypeOf(item) !== null\n ) {\n return item;\n }\n if (projected.has(item)) return projected.get(item);\n\n const target: Record<string, unknown> | unknown[] = Array.isArray(item)\n ? new Array(item.length)\n : {};\n projected.set(item, target);\n pending.push({ source: item, target });\n return target;\n };\n\n const result = project(value);\n while (pending.length > 0) {\n const { source, target } = pending.pop()!;\n if (Array.isArray(source) && Array.isArray(target)) {\n for (let index = 0; index < source.length; index++) {\n if (index in source) target[index] = project(source[index]);\n }\n } else {\n for (const [key, item] of Object.entries(source)) {\n Object.defineProperty(target, key, {\n value: project(item),\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n }\n }\n\n return result;\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 stripStreamingString({\n value,\n workDir,\n final: true,\n precedingCharacter: undefined,\n }).output;\n}\n\nfunction stripStreamingString({\n value,\n workDir,\n final,\n precedingCharacter,\n}: {\n value: string;\n workDir: string;\n final: boolean;\n precedingCharacter: string | undefined;\n}): { output: string; pending: string } {\n let remaining = value;\n let output = '';\n let characterBeforeRemaining = precedingCharacter;\n\n while (remaining.length > 0) {\n const matchIndex = remaining.indexOf(workDir);\n if (matchIndex >= 0) {\n const followingIndex = matchIndex + workDir.length;\n const hasPathBoundary = isPathBoundary(\n remaining,\n matchIndex,\n characterBeforeRemaining,\n );\n if (hasPathBoundary && followingIndex === remaining.length && !final) {\n return {\n output: output + remaining.slice(0, matchIndex),\n pending: remaining.slice(matchIndex),\n };\n }\n\n const isPath =\n hasPathBoundary &&\n (followingIndex === remaining.length ||\n remaining[followingIndex] === '/' ||\n isPathTerminator(remaining[followingIndex]));\n if (!isPath) {\n output += remaining.slice(0, followingIndex);\n characterBeforeRemaining = remaining[followingIndex - 1];\n remaining = remaining.slice(followingIndex);\n } else if (remaining[followingIndex] === '/') {\n output += remaining.slice(0, matchIndex);\n characterBeforeRemaining = remaining[followingIndex];\n remaining = remaining.slice(followingIndex + 1);\n } else {\n output += remaining.slice(0, matchIndex) + '.';\n remaining = remaining.slice(followingIndex);\n }\n continue;\n }\n\n if (final) return { output: output + remaining, pending: '' };\n\n let pendingLength = Math.min(remaining.length, workDir.length - 1);\n while (\n pendingLength > 0 &&\n (!workDir.startsWith(remaining.slice(-pendingLength)) ||\n !isPathBoundary(\n remaining,\n remaining.length - pendingLength,\n characterBeforeRemaining,\n ))\n ) {\n pendingLength -= 1;\n }\n const outputLength = remaining.length - pendingLength;\n return {\n output: output + remaining.slice(0, outputLength),\n pending: remaining.slice(outputLength),\n };\n }\n\n return { output, pending: '' };\n}\n\nfunction isPathBoundary(\n value: string,\n index: number,\n precedingCharacter?: string,\n): boolean {\n const character = index === 0 ? precedingCharacter : value[index - 1]!;\n return character === undefined || /[\\s\"'`=]/.test(character);\n}\n\nfunction isPathTerminator(character: string | undefined): boolean {\n return character === undefined || /[\\s\"'`;|&<>()]/.test(character);\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 type {\n Context,\n InferToolSetContext,\n ModelMessage,\n ToolSet,\n} from '@ai-sdk/provider-utils';\nimport { createRestrictedTelemetryDispatcher } from 'ai/internal';\nimport type {\n ContentPart,\n GenerateTextOnEndCallback,\n GenerateTextOnStartCallback,\n GenerateTextOnStepEndCallback,\n GenerateTextOnStepStartCallback,\n LanguageModelUsage,\n OnLanguageModelCallEndCallback,\n OnLanguageModelCallStartCallback,\n OnToolExecutionEndCallback,\n OnToolExecutionStartCallback,\n OutputInterface as Output,\n StepResult,\n TelemetryOptions,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n TypedToolCall,\n TypedToolError,\n TypedToolResult,\n} from 'ai';\nimport type { HarnessV1ToolSpec } from '../../v1';\n\nexport type HarnessAgentLifecycleCallbacks<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n> = {\n onStart?: GenerateTextOnStartCallback<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n onStepStart?: GenerateTextOnStepStartCallback<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n onLanguageModelCallStart?: OnLanguageModelCallStartCallback;\n onLanguageModelCallEnd?: OnLanguageModelCallEndCallback<TOOLS>;\n onToolExecutionStart?: OnToolExecutionStartCallback<TOOLS>;\n onToolExecutionEnd?: OnToolExecutionEndCallback<TOOLS>;\n onStepEnd?: GenerateTextOnStepEndCallback<TOOLS, RUNTIME_CONTEXT>;\n onEnd?: GenerateTextOnEndCallback<TOOLS, RUNTIME_CONTEXT>;\n};\n\ntype Dispatcher = ReturnType<typeof createRestrictedTelemetryDispatcher>;\n\nexport interface TurnLifecycle<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n> {\n start(modelId?: string): Promise<void>;\n ensureStepOpen(): Promise<void>;\n languageModelCallEnd(input: {\n finishReason: StepResult<TOOLS, RUNTIME_CONTEXT>['finishReason'];\n usage: LanguageModelUsage;\n content: ContentPart<TOOLS>[];\n providerMetadata: StepResult<TOOLS, RUNTIME_CONTEXT>['providerMetadata'];\n }): Promise<void>;\n toolExecutionStart(input: { toolCall: TypedToolCall<TOOLS> }): Promise<void>;\n toolExecutionEnd(input: {\n toolCall: TypedToolCall<TOOLS>;\n toolOutput: TypedToolResult<TOOLS> | TypedToolError<TOOLS>;\n toolExecutionMs: number;\n }): Promise<void>;\n stepEnd(step: StepResult<TOOLS, RUNTIME_CONTEXT>): Promise<void>;\n end(input: {\n steps: StepResult<TOOLS, RUNTIME_CONTEXT>[];\n usage: LanguageModelUsage;\n }): Promise<void>;\n executeTool<T>(input: {\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): Promise<T>;\n error(error: unknown): Promise<void>;\n}\n\nasync function notify<EVENT>(\n event: EVENT,\n ...callbacks: Array<((event: EVENT) => unknown) | undefined>\n): Promise<void> {\n await Promise.allSettled(\n callbacks.map(async callback => {\n await callback?.(event);\n }),\n );\n}\n\nexport function createTurnLifecycle<\n TOOLS extends ToolSet,\n RUNTIME_CONTEXT extends Context,\n OUTPUT extends Output,\n>(options: {\n callId: string;\n telemetry: TelemetryOptions | undefined;\n callbacks: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n harnessId: string;\n modelId: string | undefined;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext: InferToolSetContext<TOOLS>;\n activeToolNames: string[];\n toolSpecs: HarnessV1ToolSpec[];\n messages: ModelMessage[];\n runtimeContext: RUNTIME_CONTEXT;\n output: OUTPUT | undefined;\n}): TurnLifecycle<TOOLS, RUNTIME_CONTEXT> {\n const telemetry =\n options.telemetry == null\n ? ({} as Dispatcher)\n : createRestrictedTelemetryDispatcher<TOOLS, RUNTIME_CONTEXT, OUTPUT>({\n telemetry: options.telemetry,\n includeRuntimeContext: options.telemetry.includeRuntimeContext,\n includeToolsContext: options.telemetry.includeToolsContext,\n });\n const provider = `harness:${options.harnessId}`;\n let modelId = options.modelId ?? '';\n let started = false;\n let stepOpen = false;\n let stepNumber = 0;\n let ended = false;\n let modelCallStartedAt = 0;\n const completedSteps: StepResult<TOOLS, RUNTIME_CONTEXT>[] = [];\n const languageModelTools =\n options.toolSpecs.length === 0\n ? undefined\n : options.toolSpecs.map(tool => ({\n type: 'function' as const,\n name: tool.name,\n ...(tool.description == null\n ? {}\n : { description: tool.description }),\n ...(tool.inputSchema == null\n ? {}\n : { inputSchema: tool.inputSchema }),\n }));\n\n const start = async (overrideModelId?: string): Promise<void> => {\n if (started) return;\n if (overrideModelId != null) modelId = overrideModelId;\n started = true;\n const event = {\n callId: options.callId,\n operationId: 'ai.harness',\n provider,\n modelId,\n tools: options.tools,\n toolChoice: undefined,\n activeTools: options.activeToolNames,\n toolOrder: [],\n maxRetries: 0,\n timeout: undefined,\n headers: undefined,\n providerOptions: undefined,\n output: options.output,\n toolsContext: options.toolsContext,\n runtimeContext: options.runtimeContext,\n instructions: options.instructions,\n messages: options.messages,\n };\n await notify(\n event,\n options.callbacks.onStart,\n telemetry.onStart as typeof options.callbacks.onStart,\n );\n };\n\n const ensureStepOpen = async (): Promise<void> => {\n if (!started) await start();\n if (stepOpen || ended) return;\n stepOpen = true;\n const stepStartEvent = {\n callId: options.callId,\n provider,\n modelId,\n stepNumber,\n tools: options.tools,\n toolChoice: undefined,\n activeTools: options.activeToolNames,\n toolOrder: [],\n steps: [...completedSteps],\n providerOptions: undefined,\n output: options.output,\n runtimeContext: options.runtimeContext,\n toolsContext: options.toolsContext,\n instructions: options.instructions,\n messages: options.messages,\n };\n await notify(\n stepStartEvent,\n options.callbacks.onStepStart,\n telemetry.onStepStart as typeof options.callbacks.onStepStart,\n );\n\n const modelStartEvent = {\n callId: options.callId,\n provider,\n modelId,\n instructions: options.instructions,\n messages: options.messages,\n tools: languageModelTools,\n };\n modelCallStartedAt = Date.now();\n await notify(\n modelStartEvent,\n options.callbacks.onLanguageModelCallStart,\n telemetry.onLanguageModelCallStart as typeof options.callbacks.onLanguageModelCallStart,\n );\n };\n\n return {\n start,\n ensureStepOpen,\n\n async languageModelCallEnd(input) {\n await ensureStepOpen();\n const event = {\n callId: options.callId,\n provider,\n modelId,\n finishReason: input.finishReason,\n usage: input.usage,\n content: input.content,\n responseId: `${options.callId}-${stepNumber}`,\n providerMetadata: input.providerMetadata,\n performance: {\n responseTimeMs: Math.max(0, Date.now() - modelCallStartedAt),\n effectiveOutputTokensPerSecond: 0,\n outputTokensPerSecond: undefined,\n inputTokensPerSecond: undefined,\n effectiveTotalTokensPerSecond: 0,\n timeToFirstOutputMs: undefined,\n timeBetweenOutputChunksMs: undefined,\n },\n };\n await notify(\n event,\n options.callbacks.onLanguageModelCallEnd,\n telemetry.onLanguageModelCallEnd as typeof options.callbacks.onLanguageModelCallEnd,\n );\n },\n\n async toolExecutionStart({ toolCall }) {\n const event = {\n callId: options.callId,\n messages: options.messages,\n toolCall,\n toolContext: undefined,\n } as ToolExecutionStartEvent<TOOLS>;\n await notify(\n event,\n options.callbacks.onToolExecutionStart,\n telemetry.onToolExecutionStart as typeof options.callbacks.onToolExecutionStart,\n );\n },\n\n async toolExecutionEnd({ toolCall, toolOutput, toolExecutionMs }) {\n const event = {\n callId: options.callId,\n messages: options.messages,\n toolCall,\n toolContext: undefined,\n toolOutput,\n toolExecutionMs,\n } as ToolExecutionEndEvent<TOOLS>;\n await notify(\n event,\n options.callbacks.onToolExecutionEnd,\n telemetry.onToolExecutionEnd as typeof options.callbacks.onToolExecutionEnd,\n );\n },\n\n async stepEnd(step) {\n if (!stepOpen) return;\n completedSteps.push(step);\n const telemetryStepEndEvent = Object.assign(Object.create(null), {\n callId: step.callId,\n stepNumber: step.stepNumber,\n model: step.model,\n toolsContext: step.toolsContext,\n runtimeContext: step.runtimeContext,\n content: step.content,\n finishReason: step.finishReason,\n rawFinishReason: step.rawFinishReason,\n usage: step.usage,\n performance: step.performance,\n warnings: step.warnings,\n request: step.request,\n response: step.response,\n providerMetadata: step.providerMetadata,\n text: step.text,\n reasoning: step.reasoning,\n reasoningText: step.reasoningText,\n files: step.files,\n sources: step.sources,\n toolCalls: step.toolCalls,\n staticToolCalls: step.staticToolCalls,\n dynamicToolCalls: step.dynamicToolCalls,\n toolResults: step.toolResults,\n staticToolResults: step.staticToolResults,\n dynamicToolResults: step.dynamicToolResults,\n });\n await Promise.allSettled([\n options.callbacks.onStepEnd?.(step),\n telemetry.onStepEnd?.(telemetryStepEndEvent),\n ]);\n stepOpen = false;\n stepNumber += 1;\n },\n\n async end({ steps, usage }) {\n if (!started) await start();\n if (ended || steps.length === 0) return;\n ended = true;\n const finalStep = steps[steps.length - 1]!;\n const event = {\n callId: options.callId,\n stepNumber: finalStep.stepNumber,\n model: finalStep.model,\n toolsContext: finalStep.toolsContext,\n runtimeContext: finalStep.runtimeContext,\n content: steps.flatMap(step => step.content),\n text: finalStep.text,\n reasoning: finalStep.reasoning,\n reasoningText: finalStep.reasoningText,\n files: steps.flatMap(step => step.files),\n sources: steps.flatMap(step => step.sources),\n toolCalls: steps.flatMap(step => step.toolCalls),\n staticToolCalls: steps.flatMap(step => step.staticToolCalls),\n dynamicToolCalls: steps.flatMap(step => step.dynamicToolCalls),\n toolResults: steps.flatMap(step => step.toolResults),\n staticToolResults: steps.flatMap(step => step.staticToolResults),\n dynamicToolResults: steps.flatMap(step => step.dynamicToolResults),\n finishReason: finalStep.finishReason,\n rawFinishReason: finalStep.rawFinishReason,\n usage,\n totalUsage: usage,\n warnings: steps.flatMap(step => step.warnings ?? []),\n request: finalStep.request,\n response: finalStep.response,\n providerMetadata: finalStep.providerMetadata,\n responseMessages: steps.flatMap(step => step.response.messages),\n steps,\n finalStep,\n };\n await notify(\n event,\n options.callbacks.onEnd,\n telemetry.onEnd as typeof options.callbacks.onEnd,\n );\n },\n\n async executeTool({ toolCallId, execute }) {\n if (telemetry.executeTool == null) return await execute();\n return await telemetry.executeTool({\n callId: options.callId,\n toolCallId,\n execute,\n });\n },\n\n async error(error) {\n if (ended) return;\n if (!started) await start();\n ended = true;\n await telemetry.onError?.(error);\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';\nimport { sleep } from './sleep';\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 /**\n * Give up reconnecting after this many milliseconds, including connection\n * establishment and backoff delays. Default 30_000.\n */\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 SandboxChannelConnectOptions {\n readonly abortSignal: AbortSignal;\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: (options: SandboxChannelConnectOptions) => 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\ntype BufferedEvent<TOut extends { type: string }> = {\n message: TOut;\n listeners?: ReadonlyArray<Listener<TOut, EventTypeOf<TOut>>>;\n};\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\nfunction getAbortReason({\n abortSignal,\n}: {\n abortSignal: AbortSignal;\n}): unknown {\n return abortSignal.reason ?? new Error('SandboxChannel connection aborted');\n}\n\nfunction closeWebSocket({ ws }: { ws: WebSocket }): void {\n try {\n const terminable = ws as WebSocket & { terminate?: () => void };\n if (terminable.terminate != null) {\n terminable.terminate();\n } else {\n ws.close();\n }\n } catch {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n }\n}\n\nasync function awaitWebSocketConnection({\n connection,\n abortSignal,\n}: {\n connection: Promise<WebSocket>;\n abortSignal: AbortSignal;\n}): Promise<WebSocket> {\n if (abortSignal.aborted) {\n void connection.then(ws => closeWebSocket({ ws })).catch(() => {});\n throw getAbortReason({ abortSignal });\n }\n\n let onAbort: (() => void) | undefined;\n const aborted = new Promise<never>((_, reject) => {\n onAbort = () => reject(getAbortReason({ abortSignal }));\n abortSignal.addEventListener('abort', onAbort, { once: true });\n });\n\n try {\n const ws = await Promise.race([connection, aborted]);\n if (abortSignal.aborted) {\n closeWebSocket({ ws });\n throw getAbortReason({ abortSignal });\n }\n return ws;\n } catch (error) {\n if (abortSignal.aborted) {\n void connection.then(ws => closeWebSocket({ ws })).catch(() => {});\n }\n throw error;\n } finally {\n if (onAbort != null) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n }\n}\n\n/**\n * Host-side typed wrapper around the bridge WebSocket connection.\n *\n * Buffers inbound messages in arrival order while listeners attach, so callers\n * do not miss or reorder early frames. Listener registration drains the\n * ordered prefix synchronously. Selective listeners are given through the\n * current task (including its microtasks) to attach before unhandled event\n * types are retained independently, so they cannot block subscribed event\n * types indefinitely. A listener that claims an already-buffered event still\n * receives it if it unsubscribes before that ordered drain completes. Use\n * {@link SandboxChannel.beginListenerAttachment} to define an explicit\n * attachment boundary that spans asynchronous work. Inbound dispatch is\n * serialised through a promise chain so a `close` event that arrives on the\n * same microtask as the final `finish` message does not fire close handlers\n * 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: BufferedEvent<TOut>[] = [];\n private readonly bufferedByType = new Map<EventTypeOf<TOut>, TOut[]>();\n private bufferedOffset = 0;\n private flushingBuffered = false;\n private bufferedFlushScheduled = false;\n private listenerAttachmentDepth = 0;\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: (\n options: SandboxChannelConnectOptions,\n ) => 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 private activeConnectAbortController: AbortController | undefined;\n private reconnectAbortController: AbortController | undefined;\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 abortController = new AbortController();\n this.activeConnectAbortController = abortController;\n try {\n const ws = await this.connect({\n abortSignal: abortController.signal,\n });\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 } finally {\n if (this.activeConnectAbortController === abortController) {\n this.activeConnectAbortController = undefined;\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 this.captureBufferedListeners(type);\n if (this.listenerAttachmentDepth > 0) {\n return () => {\n set!.delete(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n };\n }\n\n this.flushBufferedType(type);\n this.flushBuffered();\n this.scheduleSelectiveBufferedFlush();\n\n return () => {\n set!.delete(listener as unknown as Listener<TOut, EventTypeOf<TOut>>);\n };\n }\n\n /**\n * Hold buffered event delivery while a consumer attaches a related set of\n * listeners, including across asynchronous boundaries. Call the returned\n * function once registration is complete. Buffered events are then replayed\n * in arrival order; event types that remain unhandled are retained\n * independently so they do not block subscribed types.\n */\n beginListenerAttachment(): () => void {\n this.listenerAttachmentDepth++;\n let finished = false;\n return () => {\n if (finished) return;\n finished = true;\n this.listenerAttachmentDepth--;\n if (this.listenerAttachmentDepth > 0) return;\n\n for (const type of this.listeners.keys()) {\n this.flushBufferedType(type);\n }\n this.flushBuffered();\n this.scheduleSelectiveBufferedFlush();\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 this.abortActiveConnect();\n }\n\n close(): void {\n if (this.terminal) return;\n this.closing = true;\n this.abortActiveConnect();\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.abortActiveConnect();\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 deadline = Date.now() + this.maxElapsedMs;\n let attempt = 0;\n let delay = this.initialDelayMs;\n const reconnectAbortController = new AbortController();\n this.reconnectAbortController = reconnectAbortController;\n try {\n while (!this.terminal && !this.closing) {\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n this.failReconnect({\n attempts: attempt,\n cause: new Error('Reconnect deadline expired'),\n });\n return;\n }\n\n attempt++;\n this.onDebug?.({\n event: 'reconnect-attempt',\n attempt,\n lastSeenEventId: this._lastSeenEventId,\n });\n const abortController = new AbortController();\n this.activeConnectAbortController = abortController;\n const abortConnect = () =>\n abortController.abort(reconnectAbortController.signal.reason);\n reconnectAbortController.signal.addEventListener(\n 'abort',\n abortConnect,\n {\n once: true,\n },\n );\n const timeout = setTimeout(() => {\n abortController.abort(new Error('Reconnect deadline expired'));\n }, remaining);\n (timeout as { unref?: () => void }).unref?.();\n\n try {\n const ws = await this.connect({\n abortSignal: abortController.signal,\n });\n if (this.terminal || this.closing) {\n closeWebSocket({ ws });\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 (\n this.terminal ||\n this.closing ||\n reconnectAbortController.signal.aborted\n ) {\n return;\n }\n const remainingAfterFailure = deadline - Date.now();\n if (remainingAfterFailure <= 0) {\n this.failReconnect({ attempts: attempt, cause });\n return;\n }\n await sleep({\n ms: Math.min(delay, remainingAfterFailure),\n abortSignal: reconnectAbortController.signal,\n });\n delay = Math.min(delay * 1.5, this.maxDelayMs);\n } finally {\n clearTimeout(timeout);\n reconnectAbortController.signal.removeEventListener(\n 'abort',\n abortConnect,\n );\n if (this.activeConnectAbortController === abortController) {\n this.activeConnectAbortController = undefined;\n }\n }\n }\n } finally {\n if (this.reconnectAbortController === reconnectAbortController) {\n this.reconnectAbortController = undefined;\n }\n }\n }\n\n private connect({\n abortSignal,\n }: SandboxChannelConnectOptions): Promise<WebSocket> {\n return awaitWebSocketConnection({\n connection: Promise.resolve().then(() =>\n this.connectThunk({ abortSignal }),\n ),\n abortSignal,\n });\n }\n\n private abortActiveConnect(): void {\n const controller = this.activeConnectAbortController;\n this.activeConnectAbortController = undefined;\n controller?.abort(new Error('SandboxChannel connection aborted'));\n this.reconnectAbortController?.abort(\n new Error('SandboxChannel connection aborted'),\n );\n }\n\n private failReconnect({\n attempts,\n cause,\n }: {\n attempts: number;\n cause: unknown;\n }): void {\n this.finalizeClose(1006, 'reconnect failed');\n this.onDebug?.({\n event: 'reconnect-failed',\n attempts,\n lastSeenEventId: this._lastSeenEventId,\n cause,\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 (\n this.listenerAttachmentDepth > 0 ||\n this.bufferedOffset < this.buffered.length ||\n !set ||\n set.size === 0\n ) {\n this.buffered.push({\n message,\n ...(set != null && set.size > 0 ? { listeners: Array.from(set) } : {}),\n });\n this.flushBuffered();\n this.scheduleSelectiveBufferedFlush();\n return;\n }\n for (const listener of set) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n\n private flushBuffered({\n selective = false,\n }: { selective?: boolean } = {}): void {\n if (this.flushingBuffered || this.listenerAttachmentDepth > 0) return;\n this.flushingBuffered = true;\n try {\n while (this.bufferedOffset < this.buffered.length) {\n const bufferedEvent = this.buffered[this.bufferedOffset];\n const message = bufferedEvent.message;\n const type = message.type as EventTypeOf<TOut>;\n const set = this.listeners.get(type);\n const listeners =\n bufferedEvent.listeners ??\n (set != null && set.size > 0 ? Array.from(set) : undefined);\n if (!listeners || listeners.length === 0) {\n if (!selective) return;\n this.bufferedOffset++;\n const buffered = this.bufferedByType.get(type);\n if (buffered) {\n buffered.push(message);\n } else {\n this.bufferedByType.set(type, [message]);\n }\n continue;\n }\n\n this.bufferedOffset++;\n for (const listener of listeners) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n } finally {\n if (this.bufferedOffset > 0) {\n this.buffered.splice(0, this.bufferedOffset);\n this.bufferedOffset = 0;\n }\n this.flushingBuffered = false;\n }\n }\n\n private captureBufferedListeners(type: EventTypeOf<TOut>): void {\n const set = this.listeners.get(type);\n if (!set || set.size === 0) return;\n\n for (let i = this.bufferedOffset; i < this.buffered.length; i++) {\n const bufferedEvent = this.buffered[i];\n if (\n bufferedEvent.listeners == null &&\n bufferedEvent.message.type === type\n ) {\n bufferedEvent.listeners = Array.from(set);\n }\n }\n }\n\n private flushBufferedType(type: EventTypeOf<TOut>): void {\n const buffered = this.bufferedByType.get(type);\n if (!buffered) return;\n\n let offset = 0;\n try {\n while (offset < buffered.length) {\n const set = this.listeners.get(type);\n if (!set || set.size === 0) return;\n\n const message = buffered[offset++];\n for (const listener of set) {\n listener(message as Extract<TOut, { type: EventTypeOf<TOut> }>);\n }\n }\n } finally {\n if (offset === buffered.length) {\n this.bufferedByType.delete(type);\n } else if (offset > 0) {\n buffered.splice(0, offset);\n }\n }\n }\n\n private scheduleSelectiveBufferedFlush(): void {\n if (\n this.bufferedFlushScheduled ||\n this.bufferedOffset >= this.buffered.length ||\n !this.hasListeners() ||\n this.listenerAttachmentDepth > 0\n ) {\n return;\n }\n\n this.bufferedFlushScheduled = true;\n setTimeout(() => {\n this.bufferedFlushScheduled = false;\n if (this.listenerAttachmentDepth > 0) return;\n this.flushBuffered({ selective: true });\n }, 0);\n }\n\n private hasListeners(): boolean {\n for (const listeners of this.listeners.values()) {\n if (listeners.size > 0) return true;\n }\n return false;\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.abortActiveConnect();\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 InferToolSetContext,\n ToolApprovalResponse,\n ToolResultPart,\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 HarnessV1Skill,\n HarnessV1TurnSettings,\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 { validateLifecycleStateData } from './internal/lifecycle-state-validation';\nimport { runPrompt } from './internal/run-prompt';\nimport { getRestrictedSandboxSession } from '../utils/get-restricted-sandbox-session';\nimport type { HarnessAgentLifecycleCallbacks } from './internal/turn-telemetry';\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 ready: 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\ntype ActiveTurnSettings = {\n readonly persisted: HarnessV1TurnSettings;\n readonly tools: ToolSet;\n readonly toolsContext: Record<string, Context | undefined>;\n readonly runtimeContext: Context;\n readonly activeTools: ToolSet;\n readonly builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\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 activePromptDone: Promise<void> | undefined;\n private activePromptControl: ActivePromptControl | undefined;\n private suspendedTurnState:\n | Promise<HarnessAgentContinueTurnState>\n | undefined;\n private activeTurnSettings: ActiveTurnSettings | undefined;\n private persistedTurnSettings: HarnessV1TurnSettings | undefined;\n private readonly resumedToolsContext:\n | Record<string, Context | undefined>\n | undefined;\n private readonly resumedRuntimeContext: Context | 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 turnSettings?: HarnessV1TurnSettings;\n resumedToolsContext?: Record<string, Context | undefined>;\n resumedRuntimeContext?: Context;\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.persistedTurnSettings = options.turnSettings;\n this.resumedToolsContext = options.resumedToolsContext;\n this.resumedRuntimeContext = options.resumedRuntimeContext;\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 model: string | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext: InferToolSetContext<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 callbacks: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requirePromptableTurn();\n this.persistedTurnSettings = {\n ...(options.model == null ? {} : { model: options.model }),\n skills: options.skills,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n tools: options.toolSpecs,\n };\n this.activeTurnSettings = {\n persisted: this.persistedTurnSettings,\n tools: options.tools,\n toolsContext: options.toolsContext,\n runtimeContext: options.runtimeContext,\n activeTools: options.activeTools,\n builtinToolFiltering: options.builtinToolFiltering,\n };\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 model: options.model,\n skills: options.skills,\n instructions: options.instructions,\n tools: options.tools,\n toolsContext: options.toolsContext,\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 callbacks: options.callbacks,\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 this.activePromptDone = turn.done;\n return {\n ...turn,\n ready: this.waitForPromptControl({ turnId }),\n };\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 model: string | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: TOOLS;\n toolsContext: InferToolSetContext<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 callbacks: HarnessAgentLifecycleCallbacks<TOOLS, RUNTIME_CONTEXT, OUTPUT>;\n stopConditions: ReadonlyArray<StopCondition<TOOLS, RUNTIME_CONTEXT>>;\n toolApprovalContinuations?: readonly ToolApprovalResponse[] | undefined;\n toolResultContinuations?: readonly ToolResultPart[] | undefined;\n }): HarnessAgentTurnResult<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n const session = this.requireReusableSession();\n this.requireContinuableTurn();\n const turnSettings = this.resolveActiveTurnSettings({\n model: options.model,\n skills: options.skills,\n instructions: options.instructions,\n tools: options.tools,\n toolsContext: options.toolsContext,\n runtimeContext: options.runtimeContext,\n activeTools: options.activeTools,\n toolSpecs: options.toolSpecs,\n builtinToolFiltering: options.builtinToolFiltering,\n });\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 model: turnSettings.persisted.model,\n skills: turnSettings.persisted.skills,\n instructions: turnSettings.persisted.instructions,\n tools: turnSettings.tools as TOOLS,\n toolsContext: turnSettings.toolsContext as InferToolSetContext<TOOLS>,\n activeTools: turnSettings.activeTools,\n toolSpecs: [...turnSettings.persisted.tools],\n builtinToolFiltering: turnSettings.builtinToolFiltering,\n sandboxSession: getRestrictedSandboxSession(sandboxSession),\n sessionWorkDir: this.sessionWorkDir,\n runtimeContext: turnSettings.runtimeContext as RUNTIME_CONTEXT,\n abortSignal: options.abortSignal,\n responseFormat: options.responseFormat,\n output: options.output,\n telemetry: options.telemetry,\n callbacks: options.callbacks,\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 this.activePromptDone = turn.done;\n return {\n ...turn,\n ready: this.waitForPromptControl({ turnId }),\n };\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.finalizeCurrentTurnSuspension({ 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.finalizeCurrentTurnSuspension({ 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 network\n * sandbox is stopped and destroyed through its `destroy()` method.\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 ('destroy' in sandboxSession) {\n await Promise.resolve(sandboxSession.destroy()).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.finalizeCurrentTurnSuspension({ 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 turnSettings = this.persistedTurnSettings;\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 ...(turnSettings == null ? {} : { turnSettings }),\n };\n }\n return {\n ...state,\n ...(turnSettings == null ? {} : { turnSettings }),\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 finalizeCurrentTurnSuspension(options: {\n session: HarnessAgentAdapterSession;\n }): Promise<HarnessAgentContinueTurnState> {\n const state = await this.suspendCurrentTurn(options);\n // Freeze ingress first, then include all dispatched host work in the cursor.\n // Keep this wait outside suspendCurrentTurn because stop-condition handling\n // invokes that helper from inside the active prompt.\n await this.activePromptDone;\n return this.addPendingToolState(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 async waitForPromptControl(options: {\n turnId: number;\n }): Promise<void> {\n const activePromptControl = this.activePromptControl;\n if (activePromptControl?.turnId !== options.turnId) return;\n await activePromptControl.promise;\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.activeTurnSettings = undefined;\n this.persistedTurnSettings = undefined;\n this.turnState = 'idle';\n }\n\n private resolveActiveTurnSettings(options: {\n model: string | undefined;\n skills: ReadonlyArray<HarnessV1Skill>;\n instructions: string | undefined;\n tools: ToolSet;\n toolsContext: Record<string, Context | undefined>;\n runtimeContext: Context;\n activeTools: ToolSet;\n toolSpecs: HarnessAgentToolSpec[];\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n }): ActiveTurnSettings {\n if (this.activeTurnSettings != null) {\n return this.activeTurnSettings;\n }\n const persisted =\n this.persistedTurnSettings ??\n ({\n ...(options.model == null ? {} : { model: options.model }),\n skills: options.skills,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n tools: options.toolSpecs,\n } satisfies HarnessV1TurnSettings);\n this.persistedTurnSettings = persisted;\n\n const activeTools: ToolSet = {};\n for (const toolSpec of persisted.tools) {\n const tool = options.activeTools[toolSpec.name];\n if (tool == null) {\n throw new Error(\n `HarnessAgent cannot continue turn because tool '${toolSpec.name}' is no longer available.`,\n );\n }\n activeTools[toolSpec.name] = tool;\n }\n\n this.activeTurnSettings = {\n persisted,\n tools: options.tools,\n toolsContext: this.resumedToolsContext ?? options.toolsContext,\n runtimeContext: this.resumedRuntimeContext ?? options.runtimeContext,\n activeTools,\n builtinToolFiltering: options.builtinToolFiltering,\n };\n return this.activeTurnSettings;\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\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 ToolApprovalResponse[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n const toolCallIds = new Set<string>();\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 toolCallIds.add(part.toolCallId);\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: ToolApprovalResponse[] = [];\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 if (!toolCallIds.has(approvalRequest.toolCallId)) {\n throw new HarnessError({\n message: `Tool approval request '${approvalRequest.approvalId}' references unknown tool call '${approvalRequest.toolCallId}'.`,\n });\n }\n\n continuations.push(part);\n }\n\n return continuations;\n}\n","import type { ModelMessage, ToolResultPart } from '@ai-sdk/provider-utils';\n\n/**\n * Extract client-provided tool results from the trailing tool message.\n */\nexport function collectHarnessAgentToolResultContinuations(input: {\n messages: readonly ModelMessage[];\n}): readonly ToolResultPart[] {\n const lastMessage = input.messages.at(-1);\n if (lastMessage?.role !== 'tool') return [];\n\n return lastMessage.content.filter(part => part.type === 'tool-result');\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport { harnessStateDirectoryPath, 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 * (harness state directory, harnessId, bootstrapDir, file paths + contents,\n * commands, schema version). The sandbox's concrete HOME is unavailable until\n * creation, so the directory is hashed with a symbolic HOME prefix.\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(harnessStateDirectoryPath({ sandboxHomeDir: '$HOME' }));\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 stateDirectory,\n}: {\n recipe: HarnessV1Bootstrap;\n identity: string;\n stateDirectory: string;\n}): string {\n return posix.join(\n resolveBootstrapPath({\n path: recipe.bootstrapDir,\n stateDirectory,\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 stateDirectory,\n abortSignal,\n}: {\n session: SandboxSession;\n recipe: HarnessV1Bootstrap;\n identity: string;\n stateDirectory: string;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const markerPath = bootstrapMarkerPath({\n recipe,\n identity,\n stateDirectory,\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 stateDirectory,\n });\n const mkdirResult = await session.run({\n command: 'mkdir -p \"$BOOTSTRAP_DIR\"',\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 stateDirectory,\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 stateDirectory,\n}: {\n path: string;\n stateDirectory: string;\n}): string {\n return posix.isAbsolute(path) ? path : posix.resolve(stateDirectory, path);\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport { harnessStateDirectoryPath, type HarnessV1Bootstrap } from '../../v1';\nimport { encodeHarnessPathSegment } from '../../v1/harness-session-data-directory-path';\nimport { resolveSandboxDefaultWorkingDirectory } from '../../utils/resolve-sandbox-default-working-directory';\nimport { resolveSandboxHomeDir } from '../../utils/sandbox-home-dir';\nimport type { HarnessAgentSandboxConfig } from '../harness-agent-settings';\nimport { applyBootstrapRecipe, hashHarnessBootstrap } from './bootstrap-recipe';\nimport {\n hasOnBootstrapMarker,\n writeOnBootstrapMarker,\n} from './on-bootstrap-marker';\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 === '.' || normalized === './') && workDir !== '.') ||\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:\n workDir ??\n `${encodeHarnessPathSegment(harnessId)}-${encodeHarnessPathSegment(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 bootstrapHash: settings.bootstrapHash,\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 bootstrapHash,\n skipOnBootstrapIfMarked = false,\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 bootstrapHash?: string;\n readonly skipOnBootstrapIfMarked?: boolean;\n readonly defaultWorkingDirectory?: string;\n readonly abortSignal?: AbortSignal;\n}): Promise<void> {\n if (recipe == null && onBootstrap == null) return;\n\n if (recipe != null && recipeIdentity != null) {\n await applyBootstrapRecipe({\n session,\n recipe,\n identity: recipeIdentity,\n // Harness infrastructure always lives under the sandbox's own HOME,\n // never the working directory resolved below for the caller's own\n // `onBootstrap` hook. Resolved directly from `session` — this runs\n // from a provider's `onFirstCreate`, before a\n // `HarnessV1NetworkSandboxSession` even exists.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal,\n }),\n }),\n abortSignal,\n });\n }\n\n if (onBootstrap == null) return;\n\n if (\n skipOnBootstrapIfMarked &&\n bootstrapHash != null &&\n (await hasOnBootstrapMarker({ session, bootstrapHash, abortSignal }))\n )\n return;\n\n const resolvedDefaultWorkingDirectory =\n defaultWorkingDirectory ??\n (await resolveSandboxDefaultWorkingDirectory({\n sandboxSession: session,\n abortSignal,\n }));\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 if (bootstrapHash != null) {\n await writeOnBootstrapMarker({ session, bootstrapHash, abortSignal });\n }\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 path from 'node:path';\nimport type { Experimental_SandboxSession } from '@ai-sdk/provider-utils';\n\nexport async function resolveSandboxHomeDir({\n sandbox,\n abortSignal,\n}: {\n sandbox: Experimental_SandboxSession;\n abortSignal?: AbortSignal;\n}): Promise<string> {\n const result = await sandbox.run({\n command: 'printf \"%s\" \"$HOME\"',\n abortSignal,\n });\n const homeDir = result.stdout.trim();\n if (result.exitCode !== 0 || !homeDir || !path.posix.isAbsolute(homeDir)) {\n throw new Error(\n `Unable to resolve sandbox HOME directory: ${result.stderr || result.stdout}`,\n );\n }\n return homeDir;\n}\n","import { posix } from 'node:path';\nimport type { Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';\nimport { harnessStateDirectoryPath } from '../../v1';\nimport { resolveSandboxHomeDir } from '../../utils/sandbox-home-dir';\n\nexport async function onBootstrapMarkerPath({\n session,\n bootstrapHash,\n abortSignal,\n}: {\n session: SandboxSession;\n bootstrapHash: string;\n abortSignal?: AbortSignal;\n}): Promise<string> {\n const digest = new Uint8Array(\n await crypto.subtle.digest(\n 'SHA-256',\n new TextEncoder().encode(bootstrapHash),\n ),\n );\n const filename = Array.from(digest, byte =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n return posix.join(\n harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: session,\n abortSignal,\n }),\n }),\n '.on-bootstrap',\n `${filename}.ok`,\n );\n}\n\nexport async function hasOnBootstrapMarker(options: {\n session: SandboxSession;\n bootstrapHash: string;\n abortSignal?: AbortSignal;\n}): Promise<boolean> {\n return (\n (await options.session.readTextFile({\n path: await onBootstrapMarkerPath(options),\n abortSignal: options.abortSignal,\n })) !== null\n );\n}\n\nexport async function writeOnBootstrapMarker(options: {\n session: SandboxSession;\n bootstrapHash: string;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const path = await onBootstrapMarkerPath(options);\n const result = await options.session.run({\n command: 'mkdir -p \"$MARKER_DIR\"',\n env: { MARKER_DIR: posix.dirname(path) },\n abortSignal: options.abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to create onBootstrap marker directory: ${result.stderr || result.stdout}`,\n );\n }\n await options.session.writeTextFile({\n path,\n content: '',\n abortSignal: options.abortSignal,\n });\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","const PREPARED_SANDBOX_IDENTITY_VERSION = 1;\n\nexport async 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) return undefined;\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 pushString(String(PREPARED_SANDBOX_IDENTITY_VERSION));\n pushString(workDir ?? '');\n pushString(bootstrapHash ?? '');\n for (const [harnessId, identity] of entries) {\n pushString(harnessId);\n pushString(identity);\n }\n const buffer = new Uint8Array(\n chunks.reduce((sum, chunk) => sum + chunk.length, 0),\n );\n let offset = 0;\n for (const chunk of chunks) {\n buffer.set(chunk, offset);\n offset += chunk.length;\n }\n const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', buffer));\n return Array.from(digest.slice(0, 8), byte =>\n byte.toString(16).padStart(2, '0'),\n ).join('');\n}\n","import type {\n HarnessAgentAdapter,\n HarnessSandboxTemplate,\n} from './harness-agent-types';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport { hashHarnessBootstrap } from './internal/bootstrap-recipe';\nimport { resolvePreparedSandboxIdentity } from './internal/prepared-sandbox-identity';\nimport {\n normalizeSandboxWorkDir,\n runSandboxBootstrap,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\n\nexport async function createHarnessSandboxTemplate(options: {\n readonly harnesses: ReadonlyArray<HarnessAgentAdapter>;\n readonly sandboxConfig?: Omit<HarnessAgentSandboxConfig, 'onSession'>;\n}): Promise<HarnessSandboxTemplate | undefined> {\n if (options.harnesses.length === 0) {\n throw new Error(\n 'createHarnessSandboxTemplate: at least one harness must be provided.',\n );\n }\n const settings = options.sandboxConfig ?? {};\n validateSandboxBootstrapSettings(settings);\n const workDir =\n settings.workDir == null\n ? undefined\n : normalizeSandboxWorkDir(settings.workDir);\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 const recipes = await Promise.all(\n harnesses.map(async harness => {\n const recipe = await harness.getBootstrap?.({});\n return recipe == null\n ? undefined\n : {\n recipe,\n identity: await hashHarnessBootstrap(recipe),\n };\n }),\n );\n const recipeIdentities: Record<string, string> = {};\n for (let index = 0; index < harnesses.length; index++) {\n const entry = recipes[index];\n if (entry != null)\n recipeIdentities[harnesses[index].harnessId] = entry.identity;\n }\n const identity = await resolvePreparedSandboxIdentity({\n recipeIdentities,\n bootstrapHash: settings.bootstrapHash,\n workDir,\n });\n if (identity == null) return undefined;\n return {\n identity,\n prepare: async ({ session, abortSignal }) => {\n for (const entry of recipes) {\n if (entry != null) {\n await runSandboxBootstrap({\n session,\n recipe: entry.recipe,\n recipeIdentity: entry.identity,\n abortSignal,\n });\n }\n }\n await runSandboxBootstrap({\n session,\n workDir,\n onBootstrap: settings.onBootstrap,\n bootstrapHash: settings.bootstrapHash,\n skipOnBootstrapIfMarked: true,\n abortSignal,\n });\n },\n };\n}\n","import {\n harnessStateDirectoryPath,\n type HarnessV1Bootstrap,\n type HarnessV1SandboxProvider,\n} from '../v1';\nimport { resolveSandboxHomeDir } from '../utils/sandbox-home-dir';\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.\n * @deprecated Use `createHarnessSandboxTemplate` and pass its template to a sandbox session creator instead.\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 console.warn(\n 'prepareHarnessSandboxTemplate (prewarmHarness) is deprecated. Use createHarnessSandboxTemplate and a sandbox session creator instead.',\n );\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 const restrictedSession = sandboxSession.restricted();\n await applyBootstrapRecipe({\n session: restrictedSession,\n recipe: bootstrapPlan.recipe,\n identity: bootstrapPlan.recipeIdentity,\n // Harness infrastructure always lives under the sandbox's own HOME,\n // never the working directory.\n stateDirectory: harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: restrictedSession,\n abortSignal,\n }),\n }),\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 { harnessStateDirectoryPath } from '../v1';\nimport type { HarnessAgentSandboxConfig } from './harness-agent-settings';\nimport type { HarnessAgentAdapter } from './harness-agent-types';\nimport { resolveSandboxDefaultWorkingDirectory } from '../utils/resolve-sandbox-default-working-directory';\nimport { resolveSandboxHomeDir } from '../utils/sandbox-home-dir';\nimport {\n applyBootstrapRecipe,\n hashHarnessBootstrap,\n} from './internal/bootstrap-recipe';\nimport {\n normalizeSandboxWorkDir,\n runSandboxBootstrap,\n validateSandboxBootstrapSettings,\n} from './internal/sandbox-bootstrap';\nimport { resolvePreparedSandboxIdentity } from './internal/prepared-sandbox-identity';\n\n/** @deprecated Use `createHarnessSandboxTemplate` and `template.prepare` instead. */\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 * @deprecated Use `createHarnessSandboxTemplate` and `template.prepare` instead.\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 console.warn(\n 'prepareSandboxForHarness is deprecated. Use createHarnessSandboxTemplate and template.prepare instead.',\n );\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 stateDirectory: 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 // Harness infrastructure always lives under the sandbox's own HOME,\n // never the working directory.\n stateDirectory ??= harnessStateDirectoryPath({\n sandboxHomeDir: await resolveSandboxHomeDir({\n sandbox: options.session,\n abortSignal: options.abortSignal,\n }),\n });\n await applyBootstrapRecipe({\n session: options.session,\n recipe,\n identity: recipeIdentity,\n stateDirectory,\n abortSignal: options.abortSignal,\n });\n }\n\n if (sandboxConfig.onBootstrap != null) {\n const defaultWorkingDirectory = await resolveSandboxDefaultWorkingDirectory(\n { sandboxSession: options.session, abortSignal: options.abortSignal },\n );\n await runSandboxBootstrap({\n session: options.session,\n workDir,\n onBootstrap: sandboxConfig.onBootstrap,\n bootstrapHash: sandboxConfig.bootstrapHash,\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","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","posix","asArray","generateId","generateId","safeParseJSON","asLanguageModelUsage","state","stripped","safeValidateTypes","generateId","result","input","asLanguageModelUsage","safeParseJSON","done","displayValue","output","posix","posix","path","posix","posix","posix","posix","path","posix","path","name","asArray","name","generateId","AISDKError","name","marker","symbol","_a","_b","AISDKError","path"]}
|