@ai-sdk/harness-claude-code 1.0.136 → 1.0.137
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 +11 -0
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/claude-code-harness.ts +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @ai-sdk/harness-claude-code
|
|
2
2
|
|
|
3
|
+
## 1.0.137
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- b2049fa: fix(harness): expose `resolveSandboxCredentialEnvironment()` helper in favor of `createSandboxCredentialEnvironment()` and use it across bridge backed adapters
|
|
8
|
+
- Updated dependencies [b2049fa]
|
|
9
|
+
- Updated dependencies [11f0e71]
|
|
10
|
+
- Updated dependencies [2b9195b]
|
|
11
|
+
- Updated dependencies [446725d]
|
|
12
|
+
- @ai-sdk/harness@1.0.133
|
|
13
|
+
|
|
3
14
|
## 1.0.136
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
applyCredentialForwarding,
|
|
13
13
|
classifyDiskLog,
|
|
14
|
-
|
|
14
|
+
resolveSandboxCredentialEnvironment,
|
|
15
15
|
createBridgeToken,
|
|
16
16
|
experimental_createBridgeUserMessageSubmitter,
|
|
17
17
|
createBridgeErrorHandler,
|
|
@@ -450,7 +450,7 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
|
|
|
450
450
|
]);
|
|
451
451
|
|
|
452
452
|
// src/version.ts
|
|
453
|
-
var VERSION = true ? "1.0.
|
|
453
|
+
var VERSION = true ? "1.0.137" : "0.0.0-test";
|
|
454
454
|
|
|
455
455
|
// src/claude-code-harness.ts
|
|
456
456
|
var CLAUDE_CODE_CLIENT_APP = `ai-sdk-harness-claude-code/${VERSION}`;
|
|
@@ -1106,10 +1106,11 @@ function createClaudeCode(settings = {}) {
|
|
|
1106
1106
|
let sandboxClaudeEnvironment = claudeEnvironment;
|
|
1107
1107
|
let sandboxCredentialEnvironment;
|
|
1108
1108
|
if ("addRequestTransformations" in sandboxSession && sandboxSession.addRequestTransformations != null) {
|
|
1109
|
-
sandboxCredentialEnvironment =
|
|
1109
|
+
sandboxCredentialEnvironment = await resolveSandboxCredentialEnvironment({
|
|
1110
1110
|
environment: claudeEnvironment,
|
|
1111
1111
|
credentialEnvironmentVariables: CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,
|
|
1112
|
-
credentialForwarding: settings.credentialForwarding
|
|
1112
|
+
credentialForwarding: settings.credentialForwarding,
|
|
1113
|
+
previousSandboxCredentialEnvironment: resumeData?.sandboxCredentialEnvironment
|
|
1113
1114
|
});
|
|
1114
1115
|
sandboxClaudeEnvironment = {
|
|
1115
1116
|
...claudeEnvironment,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/claude-code-harness.ts","../src/claude-code-bootstrap.ts","../src/claude-code-auth.ts","../src/claude-code-subscription.ts","../src/claude-code-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { posix } from 'node:path';\nimport {\n commonTool,\n HARNESS_V1_BUILTIN_TOOLS,\n harnessV1DiagnosticFromBridgeFrame,\n HarnessCapabilityUnsupportedError,\n type HarnessV1,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1BuiltinTool,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1MintBridgeTokenCallback,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResponseFormat,\n type HarnessV1PortEndpoint,\n type HarnessV1ResumeSessionState,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n harnessStateDirectoryPath,\n harnessSessionDataDirectoryPath,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n createSandboxCredentialEnvironment,\n createBridgeToken,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n sleep,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n withBridgeToken,\n writeSkills,\n type SandboxChannelReconnectOptions,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxSession as SandboxSession,\n type Experimental_SandboxProcess,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n CLAUDE_CODE_BOOTSTRAP_DIR as BOOTSTRAP_DIR,\n getClaudeCodeBootstrap,\n} from './claude-code-bootstrap';\nimport {\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n createClaudeCodeRequestTransformations,\n resolveClaudeCodeAuthenticationMode,\n type ClaudeCodeAuthenticationMode,\n} from './claude-code-auth';\nimport {\n createClaudeCodeSubscriptionRequestTransformations,\n resolveClaudeCodeAuthentication,\n} from './claude-code-subscription';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './claude-code-bridge-protocol';\nimport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\nimport { VERSION } from './version';\n\ntype ClaudeCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype ClaudeCodeRespawnStrategy = 'replay' | 'rerun';\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst CLAUDE_CODE_CLIENT_APP = `ai-sdk-harness-claude-code/${VERSION}`;\n\nexport type ClaudeCodeHarnessSettings = {\n readonly auth?: ClaudeCodeAuthenticationMode;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n /**\n * Hard cap on how many internal turns the CLI can take before yielding\n * back to the caller. Unset means the CLI's default.\n */\n readonly maxTurns?: number;\n /**\n * Environment variables for the Claude Code process. These values are\n * merged over the sandbox bridge process environment.\n */\n readonly env?: Readonly<Record<string, string>>;\n /**\n * Controls extended-thinking behavior and whether reasoning is summarized or\n * omitted. Defaults to `{ type: 'adaptive', display: 'summarized' }`.\n */\n readonly thinking?: ClaudeCodeThinkingConfig;\n /**\n * Controls how much effort Claude applies when adaptive thinking is enabled.\n * Unset uses the Claude Agent SDK default.\n */\n readonly effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n /**\n * Override the port the bridge binds inside the sandbox. By default the\n * adapter uses the first port the sandbox declares via `sandbox.ports`.\n * Only set this if the sandbox declares multiple ports and the first one\n * is reserved for something else.\n */\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n /** Maximum milliseconds to wait for the bridge to advertise its port. Defaults to 120000. */\n readonly startupTimeoutMs?: number;\n /**\n * Configures reconnection attempts after an established bridge connection\n * drops. The reconnect window includes connection establishment and\n * backoff delays. Defaults to 30 seconds with exponential backoff from 50\n * milliseconds up to 2 seconds.\n */\n readonly reconnect?: SandboxChannelReconnectOptions;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: HarnessV1MintBridgeTokenCallback;\n};\n\n/*\n * Every native tool the Claude Code CLI can invoke, declared as a `ToolSet`\n * keyed by what the bridge emits as `toolName` on the wire\n * (`commonName ?? nativeName`). Schemas are transcribed from the generated\n * `sdk-tools.d.ts` and the conditionally registered tool definitions in the\n * pinned Claude Code executable.\n *\n * `MCP` (the generic proxy tool inside the Claude Code SDK) is intentionally\n * omitted — the bridge filters out `mcp__harness-tools__*` tool names before\n * emitting them, and other MCP invocations come through with their own\n * server-tool names rather than the literal `'Mcp'` token.\n */\nconst listMcpResourcesInputSchema = z.object({\n server: z.string().optional(),\n});\n\nconst readMcpResourceInputSchema = z.object({\n server: z.string(),\n uri: z.string(),\n});\n\nconst structuredTeamMessageSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('shutdown_request'),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('shutdown_response'),\n request_id: z.string(),\n approve: z.boolean(),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('plan_approval_response'),\n request_id: z.string(),\n approve: z.boolean(),\n feedback: z.string().optional(),\n }),\n]);\n\nconst CLAUDE_CODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'Read',\n toolUseKind: 'readonly',\n description: 'Read file contents (text, image, PDF, notebook)',\n inputSchema: z.object({\n file_path: z.string(),\n offset: z.number().optional(),\n limit: z.number().optional(),\n pages: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'Write',\n toolUseKind: 'edit',\n description: 'Overwrite or create a file at an absolute path',\n inputSchema: z.object({\n file_path: z.string(),\n content: z.string(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'Edit',\n toolUseKind: 'edit',\n description: 'Edit a file by exact string replacement',\n inputSchema: z.object({\n file_path: z.string(),\n old_string: z.string(),\n new_string: z.string(),\n replace_all: z.boolean().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'Bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'Glob',\n toolUseKind: 'readonly',\n description: 'Fast file-pattern search using glob syntax',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'Grep',\n toolUseKind: 'readonly',\n description: 'Regex search over file contents via ripgrep',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n glob: z.string().optional(),\n output_mode: z\n .enum(['content', 'files_with_matches', 'count'])\n .optional(),\n '-B': z.number().optional(),\n '-A': z.number().optional(),\n '-C': z.number().optional(),\n context: z.number().optional(),\n '-n': z.boolean().optional(),\n '-i': z.boolean().optional(),\n '-o': z.boolean().optional(),\n type: z.string().optional(),\n head_limit: z.number().optional(),\n offset: z.number().optional(),\n multiline: z.boolean().optional(),\n }),\n }),\n webSearch: commonTool('webSearch', {\n nativeName: 'WebSearch',\n toolUseKind: 'readonly',\n description: 'Issue web search queries with optional domain filters',\n inputSchema: z.object({\n query: z.string(),\n allowed_domains: z.array(z.string()).optional(),\n blocked_domains: z.array(z.string()).optional(),\n }),\n }),\n\n WebFetch: tool({\n description: 'Fetch a URL and run a prompt against its content',\n inputSchema: z.object({\n url: z.string(),\n prompt: z.string(),\n }),\n }),\n NotebookEdit: tool({\n description: 'Edit, insert, or delete a Jupyter notebook cell',\n inputSchema: z.object({\n notebook_path: z.string(),\n new_source: z.string(),\n cell_id: z.string().optional(),\n cell_type: z.enum(['code', 'markdown']).optional(),\n edit_mode: z.enum(['replace', 'insert', 'delete']).optional(),\n }),\n }),\n TodoWrite: tool({\n description: 'Replace the session todo list',\n inputSchema: z.object({\n todos: z.array(\n z.object({\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n ),\n }),\n }),\n Agent: tool({\n description: 'Spawn a subagent with a task',\n inputSchema: z.object({\n description: z.string(),\n prompt: z.string(),\n subagent_type: z.string().optional(),\n model: z.enum(['sonnet', 'opus', 'haiku']).optional(),\n run_in_background: z.boolean().optional(),\n name: z.string().optional(),\n team_name: z.string().optional(),\n mode: z\n .enum([\n 'acceptEdits',\n 'auto',\n 'bypassPermissions',\n 'default',\n 'dontAsk',\n 'plan',\n ])\n .optional(),\n isolation: z.literal('worktree').optional(),\n }),\n }),\n TaskCreate: tool({\n description: 'Create a task in the session-local task list',\n inputSchema: z.object({\n subject: z.string(),\n description: z.string(),\n activeForm: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskGet: tool({\n description: 'Retrieve a task by id',\n inputSchema: z.object({ taskId: z.string() }),\n }),\n TaskUpdate: tool({\n description: 'Update fields of an existing task',\n inputSchema: z.object({\n taskId: z.string(),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .union([\n z.enum(['pending', 'in_progress', 'completed']),\n z.literal('deleted'),\n ])\n .optional(),\n addBlocks: z.array(z.string()).optional(),\n addBlockedBy: z.array(z.string()).optional(),\n owner: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskList: tool({\n description: 'Return all tasks in the session-local task list',\n inputSchema: z.object({}),\n }),\n TaskStop: tool({\n description: 'Stop a running background task by id',\n inputSchema: z.object({\n task_id: z.string().optional(),\n shell_id: z.string().optional(),\n }),\n }),\n TaskOutput: tool({\n description: 'Poll for output from a background task',\n inputSchema: z.object({\n task_id: z.string(),\n block: z.boolean(),\n timeout: z.number(),\n }),\n }),\n Monitor: {\n ...tool({\n description: 'Run and monitor a shell command or WebSocket',\n inputSchema: z.object({\n description: z.string().optional(),\n timeout_ms: z.number().optional(),\n persistent: z.boolean().optional(),\n command: z.string().optional(),\n ws: z\n .object({\n url: z.string(),\n protocols: z.array(z.string()).optional(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n ListMcpResources: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ListMcpResourcesTool: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResource: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceTool: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceDirTool: {\n ...tool({\n description: 'List direct children of an MCP directory resource',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n RefreshMcpTools: {\n ...tool({\n description: 'Refresh tools from one or all connected MCP servers',\n inputSchema: z.object({ server: z.string().optional() }),\n }),\n toolUseKind: 'readonly',\n },\n ExitPlanMode: tool({\n description: 'Exit plan mode with optional permission approvals',\n inputSchema: z.looseObject({\n allowedPrompts: z\n .array(\n z.object({\n tool: z.literal('Bash'),\n prompt: z.string(),\n }),\n )\n .optional(),\n }),\n }),\n EnterPlanMode: {\n ...tool({\n description: 'Enter plan mode',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n EnterWorktree: tool({\n description: 'Create or enter an isolated git worktree',\n inputSchema: z.object({\n name: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ExitWorktree: tool({\n description: 'Exit the current worktree session',\n inputSchema: z.object({\n action: z.enum(['keep', 'remove']),\n discard_changes: z.boolean().optional(),\n }),\n }),\n askUserQuestions: {\n ...HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,\n nativeName: 'AskUserQuestion',\n toolUseKind: 'readonly',\n } as typeof HARNESS_V1_BUILTIN_TOOLS.askUserQuestions & {\n readonly nativeName: 'AskUserQuestion';\n readonly toolUseKind: 'readonly';\n },\n Skill: {\n ...tool({\n description: 'Activate a skill by name',\n inputSchema: z.object({\n skill: z.string(),\n args: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ToolSearch: tool({\n description:\n 'Search deferred MCP / catalog tools so the model can load them on demand',\n inputSchema: z.object({\n query: z.string(),\n max_results: z.number().optional(),\n }),\n }),\n Artifact: {\n ...tool({\n description: 'Publish or list claude.ai artifacts',\n inputSchema: z.object({\n action: z.enum(['publish', 'list']).optional(),\n file_path: z.string().optional(),\n favicon: z.string().optional(),\n limit: z.number().optional(),\n scope: z.enum(['mine', 'shared', 'all']).optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n label: z.string().optional(),\n url: z.string().optional(),\n force: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronCreate: {\n ...tool({\n description: 'Schedule a recurring or one-shot prompt',\n inputSchema: z.object({\n cron: z.string(),\n prompt: z.string(),\n recurring: z.boolean().optional(),\n durable: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronDelete: {\n ...tool({\n description: 'Delete a scheduled prompt by id',\n inputSchema: z.object({ id: z.string() }),\n }),\n toolUseKind: 'edit',\n },\n CronList: {\n ...tool({\n description: 'List scheduled prompts for the current session',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n DesignSync: {\n ...tool({\n description: 'Read or update claude.ai Design projects',\n inputSchema: z.object({\n method: z.enum([\n 'list_projects',\n 'get_project',\n 'list_files',\n 'get_file',\n 'finalize_plan',\n 'write_files',\n 'delete_files',\n 'register_assets',\n 'unregister_assets',\n 'create_project',\n 'report_validate',\n ]),\n projectId: z.string().optional(),\n path: z.string().optional(),\n writes: z.array(z.string()).max(256).optional(),\n deletes: z.array(z.string()).max(256).optional(),\n planId: z.string().optional(),\n files: z\n .array(\n z.object({\n path: z.string(),\n localPath: z.string().optional(),\n data: z.string().optional(),\n encoding: z.literal('base64').optional(),\n mimeType: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n paths: z.array(z.string()).max(256).optional(),\n name: z.string().optional(),\n assets: z\n .array(\n z.object({\n name: z.string(),\n path: z.string(),\n subtitle: z.string().optional(),\n viewport: z\n .object({\n width: z.number(),\n height: z.number().optional(),\n })\n .optional(),\n group: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n localDir: z.string().optional(),\n counts: z\n .object({\n total: z.number(),\n bad: z.number(),\n thin: z.number(),\n variantsIdentical: z.number(),\n iterations: z.number(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n LSP: {\n ...tool({\n description: 'Query a language server for code intelligence',\n inputSchema: z.object({\n operation: z.enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n ]),\n filePath: z.string(),\n line: z.number().int().positive(),\n character: z.number().int().positive(),\n query: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n PowerShell: {\n ...tool({\n description: 'Execute a PowerShell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n PushNotification: {\n ...tool({\n description: 'Send a notification for proactive or scheduled work',\n inputSchema: z.object({\n message: z.string(),\n status: z.literal('proactive'),\n }),\n }),\n toolUseKind: 'edit',\n },\n RemoteTrigger: {\n ...tool({\n description: 'List, manage, or run a claude.ai Routine trigger',\n inputSchema: z.object({\n action: z.enum(['list', 'get', 'create', 'update', 'run']),\n trigger_id: z.string().optional(),\n body: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n ReportFindings: {\n ...tool({\n description: 'Return verified code-review findings',\n inputSchema: z.object({\n level: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n findings: z\n .array(\n z.object({\n file: z.string(),\n line: z.number().optional(),\n summary: z.string(),\n short_summary: z.string().optional(),\n failure_scenario: z.string(),\n category: z.string().optional(),\n verdict: z.enum(['CONFIRMED', 'PLAUSIBLE']).optional(),\n outcome: z\n .enum(['fixed', 'skipped', 'no_change_needed'])\n .optional(),\n }),\n )\n .max(32),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ScheduleWakeup: {\n ...tool({\n description: 'Schedule or stop the next iteration of a dynamic loop',\n inputSchema: z.object({\n delaySeconds: z.number().optional(),\n reason: z.string().optional(),\n prompt: z.string().optional(),\n stop: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendMessage: {\n ...tool({\n description: 'Send a plain-text or protocol message to another agent',\n inputSchema: z.object({\n to: z.string(),\n summary: z.string().max(200).optional(),\n message: z.union([z.string(), structuredTeamMessageSchema]),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendUserFile: {\n ...tool({\n description: 'Send one or more files to the user',\n inputSchema: z.object({\n files: z.union([z.string(), z.array(z.string()).min(1)]),\n caption: z.string().optional(),\n status: z.enum(['normal', 'proactive']),\n display: z.enum(['render', 'attach']).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ShareOnboardingGuide: {\n ...tool({\n description: 'Create, update, inspect, or delete an onboarding guide',\n inputSchema: z.object({\n mode: z.enum(['check', 'update', 'create', 'delete']).optional(),\n short_code: z\n .string()\n .regex(/^[A-Za-z0-9_-]{1,64}$/)\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n WaitForMcpServers: {\n ...tool({\n description: 'Wait for MCP servers that are still connecting',\n inputSchema: z.object({\n servers: z.array(z.string()).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n Workflow: {\n ...tool({\n description: 'Run or resume a dynamic multi-agent workflow',\n inputSchema: z.object({\n script: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n title: z.string().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n scriptPath: z.string().optional(),\n resumeFromRunId: z.string().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\n/**\n * Live bridge coordinates returned by `doDetach()` and `doSuspendTurn()`. A\n * future process uses them to reopen a socket to the still-running bridge\n * (`attach`) instead of re-spawning it. Absent on a `doStop()` payload.\n */\nconst claudeCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\n/**\n * Schema for the adapter-specific portion of lifecycle state `data`.\n *\n * A `doStop()` payload is structurally empty (`{}`): the framework derives the\n * sandbox via `provider.resumeSession({ sessionId })`, and the Claude SDK's\n * `{ continue: true }` flag rehydrates the thread from the workdir. A\n * `doDetach()` payload additionally carries `bridge` coordinates for\n * cross-process `attach`. A loose object keeps both shapes valid.\n */\nconst claudeCodeResumeStateSchema = z.looseObject({\n bridge: claudeCodeBridgeCoordsSchema.optional(),\n sandboxCredentialEnvironment: z.record(z.string(), z.string()).optional(),\n /**\n * The exact Claude conversation to rehydrate on resume. Written by the\n * adapter on `doStop()`/`doDetach()`/`doSuspendTurn()` from the session id\n * the bridge observed, so a resume names the conversation instead of\n * relying on the SDK's `continue` flag — \"most recent thread in this\n * workdir\" — which silently picks the wrong one once a second thread\n * exists there. Hosts that captured the id themselves (it is surfaced as\n * `harnessMetadata['claude-code'].sessionId` on `finish` parts) may also\n * set it explicitly.\n */\n claudeSessionId: z.string().optional(),\n});\n\ntype ClaudeCodeBridgeCoords = z.infer<typeof claudeCodeBridgeCoordsSchema>;\n\nexport function createClaudeCode(\n settings: ClaudeCodeHarnessSettings = {},\n): HarnessV1<typeof CLAUDE_CODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'Claude Code MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n const thinking = settings.thinking ?? {\n type: 'adaptive',\n display: 'summarized',\n };\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'claude-code',\n builtinTools: CLAUDE_CODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n supportsBuiltinToolFiltering: true,\n lifecycleStateSchema: claudeCodeResumeStateSchema,\n getBootstrap: getClaudeCodeBootstrap,\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness cannot use `mintBridgeToken` with a sandbox session that does not expose an id.',\n });\n }\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData = isResume\n ? (lifecycleState?.data as {\n bridge?: ClaudeCodeBridgeCoords;\n sandboxCredentialEnvironment?: Record<string, string>;\n claudeSessionId?: string;\n })\n : undefined;\n const coords = resumeData?.bridge;\n const authenticationMode = resolveClaudeCodeAuthenticationMode(\n settings.auth,\n );\n const resolvedAuthEnvironment = await resolveClaudeCodeAuthentication({\n auth: settings.auth,\n });\n const claudeEnvironment = {\n ...resolvedAuthEnvironment,\n /*\n * The Claude Agent SDK does not expose arbitrary model-request\n * headers. It reads this environment variable and sends the value as\n * `x-client-app`, while also appending `client-app/<value>` to\n * `User-Agent`, so this is the attribution path for AI Gateway.\n */\n ...(resolvedAuthEnvironment.AI_GATEWAY_BASE_URL\n ? { CLAUDE_AGENT_SDK_CLIENT_APP: CLAUDE_CODE_CLIENT_APP }\n : {}),\n ...settings.env,\n ...(startOpts.headers != null\n ? {\n ANTHROPIC_CUSTOM_HEADERS: Object.entries(startOpts.headers)\n .map(([name, value]) => `${name}: ${value}`)\n .join('\\n'),\n }\n : {}),\n };\n let sandboxClaudeEnvironment = claudeEnvironment;\n let sandboxCredentialEnvironment: Record<string, string> | undefined;\n if (\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n sandboxCredentialEnvironment =\n resumeData?.sandboxCredentialEnvironment ??\n (await createSandboxCredentialEnvironment({\n environment: claudeEnvironment,\n credentialEnvironmentVariables:\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n }));\n sandboxClaudeEnvironment = {\n ...claudeEnvironment,\n ...sandboxCredentialEnvironment,\n };\n const transformationSources = {\n env: claudeEnvironment,\n sandboxEnv: sandboxClaudeEnvironment,\n auth: authenticationMode,\n };\n const requestTransformations = [\n ...createClaudeCodeRequestTransformations(transformationSources),\n ...createClaudeCodeSubscriptionRequestTransformations(\n transformationSources,\n ),\n ];\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n } else {\n sandboxClaudeEnvironment = await applyCredentialForwarding({\n environment: sandboxClaudeEnvironment,\n credentialEnvironmentVariables:\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n });\n warnCredentialBrokeringUnavailable({\n environment: claudeEnvironment,\n forwardedEnvironment: sandboxClaudeEnvironment,\n credentialEnvironmentVariables:\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n });\n }\n // Harness SDK state (bootstrap, per-session runs) always lives under\n // the sandbox's own HOME, never the working directory, so it stays\n // out of a user-owned workspace.\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const stateDir = harnessStateDirectoryPath({ sandboxHomeDir });\n const bootstrapDir = posix.resolve(stateDir, BOOTSTRAP_DIR);\n // The conversation the host wants back, when it is known. Absent on\n // state written before this field existed; those resumes fall back to\n // the `continue` flag as before.\n const resumeSessionId = resumeData?.claudeSessionId;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = harnessSessionDataDirectoryPath({\n stateDirectory: stateDir,\n sessionId: startOpts.sessionId,\n });\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n\n // Normalize each forwarded bridge diagnostics frame into the general\n // `HarnessV1Diagnostic` and report it. The adapter does no telemetry work\n // beyond this transport→emission mapping.\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'claude-code',\n sessionId: startOpts.sessionId,\n });\n let supportsUserMessageResponses = false;\n\n // Builds the `connect` thunk a `SandboxChannel` re-invokes on every\n // (re)connect: open the socket, then wait for `bridge-hello` so the\n // end-to-end link is proven live before any frame is sent.\n const buildConnect =\n (endpoint: HarnessV1PortEndpoint) =>\n async ({\n abortSignal,\n }: {\n abortSignal: AbortSignal;\n }): Promise<WebSocket> => {\n return openBridgeWebSocket({\n endpoint,\n timeoutMs,\n abortSignal,\n onHello: supportsResponses => {\n supportsUserMessageResponses = supportsResponses;\n },\n });\n };\n\n /*\n * Rung 1 — ATTACH. When lifecycle state carries live bridge coordinates,\n * try to reopen a socket to the still-running bridge. Parked sessions wait\n * for the next `start`; suspended turns request replay of everything past\n * the persisted cursor. No spawn, no fresh token (the existing bridge\n * still authorises the persisted one). If the bridge is gone the open\n * throws and we fall through to a spawn-based recovery.\n */\n if (coords) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: coords.port,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n const attachChannel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(attachEndpoint),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\n });\n const finishListenerAttachment = isContinue\n ? attachChannel.beginListenerAttachment()\n : undefined;\n try {\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n } catch (error) {\n finishListenerAttachment?.();\n throw error;\n }\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n finishListenerAttachment,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n // The live bridge was spawned by another process; this one owns no\n // process handle. The session lifecycle method decides whether the\n // sandbox is left running, stopped, or destroyed.\n proc: undefined,\n maxTurns: settings.maxTurns,\n env: sandboxClaudeEnvironment,\n thinking,\n effort: settings.effort,\n isResume: true,\n continueOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n mcpServers: settings.mcpServers,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n } catch {\n // Bridge no longer reachable — recover by respawning below.\n }\n }\n\n /*\n * Rungs 2/3 — REPLAY vs RERUN. Respawn the bridge. `replay` is only sound\n * for `continueFrom`: those coordinates include the cursor the on-disk\n * log is replayed *from*. `resumeFrom` is a between-turn resume; even when\n * it carries bridge coordinates, replaying the previous turn would\n * re-deliver stale events into the next turn. Those resumes always `rerun`\n * when attach is unavailable (the CLI continues its own thread from the\n * workdir snapshot via `continue: true`).\n */\n let respawnStrategy: ClaudeCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort({\n sandboxSession,\n override: settings.port,\n });\n const token =\n settings.mintBridgeToken == null\n ? createBridgeToken()\n : settings.mintBridgeToken(sandboxId!);\n const env = {\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n /*\n * On a fresh start the workdir and bridge-state directory must be\n * created. The env is sent fresh on every spawn —\n * `BRIDGE_CHANNEL_TOKEN` rotates per start.\n */\n if (respawnStrategy === undefined) {\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'claude-code',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n\n const bridgeStartupStderr: string[] = [];\n const bridgeStartupStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'claude-code',\n collectTail: bridgeStartupStderr,\n });\n void bridgeStartupStderrDone;\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'claude-code',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: boundPort,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n\n const channel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(bridgeEndpoint),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\n // In replay mode the respawned bridge reloaded the finished turn from\n // disk; seed the cursor and resume so it streams the tail (incl.\n // `finish`) rather than starting empty.\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n const finishListenerAttachment =\n respawnStrategy === 'replay'\n ? channel.beginListenerAttachment()\n : undefined;\n try {\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n } catch (error) {\n finishListenerAttachment?.();\n throw error;\n }\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n finishListenerAttachment,\n proc,\n maxTurns: settings.maxTurns,\n env: sandboxClaudeEnvironment,\n thinking,\n effort: settings.effort,\n isResume: respawnStrategy !== undefined,\n continueOnFirstPrompt: respawnStrategy !== undefined,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n mcpServers: settings.mcpServers,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n },\n };\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n}): number {\n if (override !== undefined) return override;\n if ('ports' in sandboxSession && sandboxSession.ports.length > 0) {\n return sandboxSession.ports[0];\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The claude-code harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createClaudeCode({ port })`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness requires an explicit `port` when using a basic sandbox session.',\n });\n }\n if (portEndpoint == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n }\n}\n\nasync function resolveBridgeEndpoint({\n sandboxSession,\n override,\n port,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n}\n\n/**\n * Materialise skill files into\n * `$HOME/.claude/skills/<name>/SKILL.md`. The `claude` CLI\n * auto-discovers skills from that directory on startup, so the files have to\n * be in place before the bridge is spawned without mutating the session\n * workdir. Each file uses the YAML-frontmatter shape the CLI expects.\n */\n/**\n * Wait for the bridge's `bridge-hello` message to arrive on the freshly\n * opened WebSocket before any other host-side code touches it.\n *\n * Some sandbox runtimes (Vercel in particular) complete the WS upgrade\n * with the host long before the connection is actually forwarded to the\n * sandbox-side bridge. Anything sent in that gap is silently dropped —\n * including the `start` message we send next. The bridge emits\n * `bridge-hello` the instant it accepts the connection, so receiving it\n * is the only reliable evidence that the end-to-end link is live.\n */\nfunction openWebSocketAndWaitForBridgeHello({\n endpoint,\n openTimeoutMs,\n getHelloTimeoutMs,\n abortSignal,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n openTimeoutMs: number;\n getHelloTimeoutMs: () => number;\n abortSignal: AbortSignal;\n onHello: (supportsUserMessageResponses: boolean) => void;\n}): Promise<WebSocket> {\n return new Promise<WebSocket>((resolve, reject) => {\n const abortReason = () =>\n abortSignal.reason ?? new Error('WebSocket connection aborted');\n if (abortSignal.aborted) {\n reject(abortReason());\n return;\n }\n\n const ws = new WebSocket(endpoint.url, {\n headers: endpoint.headers == null ? undefined : { ...endpoint.headers },\n });\n let opened = false;\n let sawBridgeHello = false;\n let settled = false;\n let openTimer: ReturnType<typeof setTimeout> | undefined;\n let helloTimer: ReturnType<typeof setTimeout> | undefined;\n let onAbort: (() => void) | undefined;\n\n const cleanup = ({\n keepTerminationListeners = false,\n }: {\n keepTerminationListeners?: boolean;\n } = {}) => {\n if (openTimer) clearTimeout(openTimer);\n if (helloTimer) clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n if (onAbort != null) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n if (!keepTerminationListeners) {\n ws.off('close', onClose);\n ws.off('error', onError);\n }\n };\n const settle = (err?: unknown) => {\n if (settled) return;\n settled = true;\n if (err) {\n cleanup({ keepTerminationListeners: true });\n try {\n ws.terminate();\n } catch {\n cleanup();\n }\n reject(err);\n } else {\n cleanup();\n resolve(ws);\n }\n };\n const tryResolve = () => {\n if (opened && sawBridgeHello) settle();\n };\n const startHelloTimer = () => {\n if (helloTimer) return;\n const helloTimeoutMs = getHelloTimeoutMs();\n helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `claude-code bridge did not send bridge-hello within ${helloTimeoutMs}ms`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n };\n const onOpen = () => {\n opened = true;\n if (openTimer) {\n clearTimeout(openTimer);\n openTimer = undefined;\n }\n startHelloTimer();\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success || settled) return;\n const value = parsed.value;\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { type?: unknown }).type === 'bridge-hello'\n ) {\n const capabilities = (\n value as {\n capabilities?: { experimental_userMessageResponses?: unknown };\n }\n ).capabilities;\n onHello(capabilities?.experimental_userMessageResponses === true);\n sawBridgeHello = true;\n tryResolve();\n }\n })();\n };\n const onClose = () => {\n settle(\n new Error('claude-code bridge closed before sending bridge-hello'),\n );\n cleanup();\n };\n const onError = (err: Error) => settle(err);\n onAbort = () => settle(abortReason());\n openTimer = setTimeout(\n () =>\n settle(new Error(`WebSocket open timed out after ${openTimeoutMs}ms`)),\n openTimeoutMs,\n );\n openTimer.unref?.();\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n abortSignal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function openBridgeWebSocket({\n endpoint,\n timeoutMs,\n abortSignal,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n timeoutMs: number;\n abortSignal: AbortSignal;\n onHello: (supportsUserMessageResponses: boolean) => void;\n}): Promise<WebSocket> {\n const deadline = Date.now() + timeoutMs;\n let attempt = 0;\n let lastError: unknown;\n\n while (!abortSignal.aborted && Date.now() < deadline) {\n attempt++;\n try {\n const remaining = Math.max(1, deadline - Date.now());\n return await openWebSocketAndWaitForBridgeHello({\n endpoint,\n openTimeoutMs: Math.min(10_000, remaining),\n getHelloTimeoutMs: () =>\n Math.min(5_000, Math.max(1, deadline - Date.now())),\n abortSignal,\n onHello,\n });\n } catch (err) {\n if (abortSignal.aborted) {\n throw abortSignal.reason ?? new Error('WebSocket connection aborted');\n }\n lastError = err;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep({\n ms: Math.min(250 * attempt, 1_000, remaining),\n abortSignal,\n });\n }\n }\n\n if (abortSignal.aborted) {\n throw abortSignal.reason ?? new Error('WebSocket connection aborted');\n }\n\n throw new Error(\n `claude-code bridge did not complete WebSocket handshake within ${timeoutMs}ms after ${attempt} attempt(s). Last error: ${formatUnknownError(lastError)}`,\n );\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction formatUnknownError(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction createSession({\n sessionId,\n channel,\n finishListenerAttachment,\n proc,\n maxTurns,\n env,\n thinking,\n effort,\n isResume,\n continueOnFirstPrompt,\n resumeSessionId,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n sandboxCredentialEnvironment,\n debug,\n permissionMode,\n builtinToolFiltering,\n sandbox,\n sandboxHomeDir,\n mcpServers,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: ClaudeCodeChannel;\n finishListenerAttachment: (() => void) | undefined;\n /** Undefined on `attach` — the live bridge was spawned by another process. */\n proc: Experimental_SandboxProcess | undefined;\n maxTurns: number | undefined;\n env: Readonly<Record<string, string>> | undefined;\n thinking: ClaudeCodeThinkingConfig;\n effort: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | undefined;\n isResume: boolean;\n continueOnFirstPrompt: boolean;\n /**\n * Exact conversation to rehydrate whenever a fresh SDK query starts. Takes\n * precedence over the `continue` flag, which can only mean \"most recent in\n * this workdir\".\n */\n resumeSessionId?: string;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n sandboxCredentialEnvironment: Record<string, string> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n sandbox: SandboxSession;\n sandboxHomeDir: string;\n mcpServers: Record<string, unknown> | undefined;\n supportsUserMessageResponses: () => boolean;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n /*\n * Force the Claude SDK's `continue: true` on the first prompt only when the\n * bridge was respawned without an exact conversation id (rerun/replay): a\n * fresh bridge process treats its first turn as new, so it must be told to\n * rehydrate the workdir thread. Exact ids are sent independently of this\n * fallback on every fresh query.\n */\n let pendingResumeFlag = continueOnFirstPrompt;\n\n /*\n * The Claude conversation this session currently embodies. Seeded from the\n * resume state and updated from every `finish` part's metadata — each turn\n * may fork a new id, so the latest observation is the one a later\n * stop/detach must record for exact resume.\n */\n let lastClaudeSessionId = resumeSessionId;\n\n /*\n * Wire the channel into one turn's worth of events and return the control\n * surface. Shared by `doPromptTurn` (which sends a `start` afterwards) and\n * `doContinueTurn` (which attaches to an already-running/replayed turn, or sends\n * a rerun `start`). The only difference between the two entry points is the\n * `start` message, not the listener/abort/settle plumbing.\n */\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const userMessageSubmitter = supportsUserMessageResponses()\n ? experimental_createBridgeUserMessageSubmitter({\n send: message => channel.send(message),\n onResponse: listener => channel.on('user-message-response', listener),\n onReconnect: listener => channel.onReconnect(listener),\n })\n : undefined;\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n userMessageSubmitter?.close();\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n userMessageSubmitter?.close(err);\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-input-start',\n 'tool-input-delta',\n 'tool-input-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n const metadata = (\n msg as {\n harnessMetadata?: { 'claude-code'?: { sessionId?: unknown } };\n }\n ).harnessMetadata?.['claude-code']?.sessionId;\n if (typeof metadata === 'string' && metadata.length > 0) {\n lastClaudeSessionId = metadata;\n }\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n finishListenerAttachment?.();\n finishListenerAttachment = undefined;\n\n /*\n * A `'suspended'` close is a graceful slice-boundary freeze the host\n * initiated (`doSuspendTurn`): the turn keeps running in the bridge and its\n * tail is replayed to the next process, so wind this turn down cleanly\n * rather than failing it. Any other close mid-turn is an unexpected drop.\n */\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('claude-code bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n ...(input.toolResult !== undefined\n ? { toolResult: input.toolResult }\n : {}),\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n ...(userMessageSubmitter == null\n ? {}\n : {\n submitUserMessage: async (text: string) => {\n await userMessageSubmitter.submit(text);\n },\n }),\n done,\n };\n };\n\n const prepareTurn = async (turnOpts: {\n responseFormat?: HarnessV1ResponseFormat;\n skills: ReadonlyArray<HarnessV1Skill>;\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): Promise<HarnessV1PromptControl> => {\n if (\n turnOpts.responseFormat?.type === 'json' &&\n turnOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'claude-code' requires a JSON schema for structured output.\",\n harnessId: 'claude-code',\n });\n }\n await writeSkills({\n sandbox,\n homePath: sandboxHomeDir,\n skillsDir: '.claude/skills',\n skills: turnOpts.skills,\n abortSignal: turnOpts.abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid Claude Code skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid Claude Code skill file path for ${skillName}: ${filePath}`,\n trailingNewline: true,\n });\n return wireTurn({\n emit: turnOpts.emit,\n abortSignal: turnOpts.abortSignal,\n });\n };\n\n return {\n sessionId,\n isResume,\n doPromptTurn: async promptOpts => {\n const control = await prepareTurn(promptOpts);\n\n /*\n * A signal that was already aborted has settled the turn inside\n * `wireTurn`. Sending `start` anyway would run a full unattended turn\n * in the bridge — consuming tokens and possibly acting on the\n * workspace — after the caller has already observed the abort.\n */\n if (promptOpts.abortSignal?.aborted) {\n return control;\n }\n\n const startMessage = {\n type: 'start' as const,\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.responseFormat == null\n ? {}\n : { responseFormat: promptOpts.responseFormat }),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n model: promptOpts.model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(effort !== undefined ? { effort } : {}),\n ...(promptOpts.skills.length > 0\n ? { skills: promptOpts.skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n ...(lastClaudeSessionId\n ? { resumeSessionId: lastClaudeSessionId }\n : pendingResumeFlag\n ? { continue: true }\n : {}),\n };\n pendingResumeFlag = false;\n channel.send(startMessage);\n\n return control;\n },\n doContinueTurn: async continueOpts => {\n const control = await prepareTurn(continueOpts);\n\n /*\n * attach / replay: the still-running (or disk-replayed) turn streams into\n * the wired listeners — `doStart` opened the channel with `{ resume: true }`\n * so the bridge replays everything past the persisted cursor (including a\n * `finish` if the turn ended during the gap). No `start` is sent: issuing\n * one would clear the bridge's replay log and begin a new turn. Lossless.\n *\n * rerun: the bridge was respawned with no in-flight turn to attach to, so\n * re-drive the runtime's own thread from the workdir snapshot via\n * `continue: true`. Lossy — work in flight at the suspension is\n * recomputed. This is the rare bridge-died fallback; the common slice path\n * is `attach`.\n */\n // Same as `doPromptTurn`: an already-aborted signal settled the turn in\n // `wireTurn`, so don't re-drive the thread nobody is waiting on.\n if (rerunContinue && !continueOpts.abortSignal?.aborted) {\n pendingResumeFlag = false;\n channel.send({\n type: 'start' as const,\n /*\n * A continuation nudge rather than an empty prompt: `continue: true`\n * rehydrates the prior thread, and this is the new user turn that\n * drives it forward. It must be non-empty — an empty text block is\n * rejected by the Anthropic API once the SDK stamps it with\n * `cache_control`.\n */\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.responseFormat == null\n ? {}\n : { responseFormat: continueOpts.responseFormat }),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n model: continueOpts.model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(effort !== undefined ? { effort } : {}),\n ...(continueOpts.skills.length > 0\n ? { skills: continueOpts.skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n ...(lastClaudeSessionId\n ? { resumeSessionId: lastClaudeSessionId }\n : { continue: true }),\n });\n }\n\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n /*\n * Claude Code has no SDK/control method for compaction — the supported\n * trigger is the `/compact` slash command submitted as user input. Ride\n * the existing user-message rail; the bridge feeds it into the streaming\n * query input and Claude's native compaction handles the rest, emitting a\n * `compact_boundary` + `PostCompact` we observe as a `compaction` event.\n */\n const text =\n customInstructions && customInstructions.trim()\n ? `/compact ${customInstructions.trim()}`\n : '/compact';\n channel.send({ type: 'user-message', text });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n ...(lastClaudeSessionId\n ? { claudeSessionId: lastClaudeSessionId }\n : {}),\n },\n };\n return payload;\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n // Tell the channel we are tearing down so the bridge's post-shutdown\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n /*\n * If the bridge's channel already closed (e.g. mid-turn WS drop)\n * there is no one to acknowledge a `stop` message. Synthesize an empty\n * payload — for Claude Code the resume state structurally is `{}`\n * (the conversation lives in the workdir, captured by the sandbox\n * snapshot during the subsequent `sandboxSession.stop()`), so we\n * lose nothing by skipping the round-trip.\n */\n // Tell the channel we are tearing down so the bridge's post-stop\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `claude-code session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n // The bridge exits itself after sending bridge-stop. Give\n // it a moment, then ensure the process is reaped and the channel\n // closed.\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const lifecycleData =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? { ...(data as Record<string, unknown>) }\n : {};\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n // The bridge's stop reply carries the session id it observed; the\n // adapter's own record backfills it when the reply predates the\n // field or the channel was already closed.\n data: {\n ...(lastClaudeSessionId\n ? { claudeSessionId: lastClaudeSessionId }\n : {}),\n ...lifecycleData,\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n } as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n /*\n * Freeze the host at a precise cursor without stopping the active model\n * turn. `channel.suspend` stops processing inbound frames, drains what\n * was already dispatched, then closes the host socket with reason\n * `'suspended'`. The bridge keeps the turn running and accumulates events\n * past the cursor for the next slice to replay. The sandbox process is\n * deliberately left alive.\n */\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n ...(lastClaudeSessionId\n ? { claudeSessionId: lastClaudeSessionId }\n : {}),\n },\n };\n return payload;\n },\n };\n}\n\n/*\n * Reduce a `HarnessV1Prompt` to the plain user text the bridge forwards\n * to the Claude SDK. File and image parts on the message are not yet\n * supported by the underlying runtime — throw rather than silently drop\n * them so callers learn about the gap instead of seeing mysteriously\n * truncated prompts.\n */\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message: `The claude-code harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import type { HarnessV1Bootstrap } from '@ai-sdk/harness';\nimport { createReadBridgeAsset } from '@ai-sdk/harness/utils';\n\n/*\n * Keep every asset URL literal so bundlers can emit each file separately.\n * Dynamic new URL() paths can collapse multiple assets into one resolution.\n */\nconst readBridgeAsset = createReadBridgeAsset({\n 'package.json': new URL('./bridge/package.json', import.meta.url),\n 'pnpm-lock.yaml': new URL('./bridge/pnpm-lock.yaml', import.meta.url),\n 'pnpm-workspace.yaml': new URL(\n './bridge/pnpm-workspace.yaml',\n import.meta.url,\n ),\n 'index.mjs': new URL('./bridge/index.mjs', import.meta.url),\n});\n\n/*\n * Bootstrap is derived state stored under `$HOME/.ai-sdk-harness`, outside\n * the agent's working directory. Snapshot-capable providers preserve the\n * installed CLI, bridge, and recipe marker there.\n *\n * The session work dir (`startOpts.sessionWorkDir`) lives under the sandbox's\n * default working directory, while the bridge-state dir lives under\n * `$HOME/.ai-sdk-harness/.agent-runs`. Claude's project history is keyed by\n * the working directory, so the same work dir is needed across resumes.\n */\nexport const CLAUDE_CODE_BOOTSTRAP_DIR = '.harness-bootstrap/claude-code';\n\nlet cachedBootstrap: HarnessV1Bootstrap | undefined;\n\nexport async function getClaudeCodeBootstrap(): Promise<HarnessV1Bootstrap> {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, workspace, bridge] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('pnpm-workspace.yaml'),\n readBridgeAsset('index.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'claude-code',\n bootstrapDir: CLAUDE_CODE_BOOTSTRAP_DIR,\n files: [\n { path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n {\n path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/pnpm-workspace.yaml`,\n content: workspace,\n },\n { path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: './node_modules/.bin/claude --version',\n },\n ],\n };\n return cachedBootstrap;\n}\n","import { execFileSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type {\n HarnessV1Authentication,\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n isHarnessAuthenticationEnvironment,\n} from '@ai-sdk/harness/utils';\n\nexport const CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [\n 'AI_GATEWAY_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n 'CLAUDE_CODE_OAUTH_TOKEN',\n] as const;\n\nexport function createClaudeCodeRequestTransformations({\n env: environment,\n sandboxEnv: sandboxEnvironment,\n auth: authenticationMode,\n}: HarnessV1RequestTransformationSources<ClaudeCodeResolvedAuthenticationMode>): HarnessV1RequestTransformation[] {\n const matchUrl =\n authenticationMode === 'ai-gateway'\n ? environment.ANTHROPIC_BASE_URL\n : (environment.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com');\n const transformations: HarnessV1RequestTransformation[] = [];\n\n if (\n environment.ANTHROPIC_API_KEY != null &&\n sandboxEnvironment.ANTHROPIC_API_KEY != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n 'x-api-key': sandboxEnvironment.ANTHROPIC_API_KEY,\n },\n transformHeaders: {\n 'x-api-key': environment.ANTHROPIC_API_KEY,\n },\n }),\n );\n }\n\n if (\n environment.ANTHROPIC_AUTH_TOKEN != null &&\n sandboxEnvironment.ANTHROPIC_AUTH_TOKEN != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.ANTHROPIC_AUTH_TOKEN}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.ANTHROPIC_AUTH_TOKEN}`,\n },\n }),\n );\n }\n\n return transformations;\n}\n\nexport type ClaudeCodeResolvedAuthenticationMode = 'direct' | 'ai-gateway';\n\nexport type ClaudeCodeAuthenticationMode = HarnessV1Authentication;\n\n/**\n * Resolve the environment-variable blob the bridge needs to authenticate\n * with Anthropic (directly or via the Vercel AI Gateway). Precedence:\n *\n * 1. An explicit authentication mode pins the selected route.\n * 2. Auto-detect from the host process env: gateway first\n * (`AI_GATEWAY_API_KEY` / `VERCEL_OIDC_TOKEN`), then direct\n * (`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN`).\n */\nexport type ResolveClaudeCodeEnvOptions = {\n /**\n * Returns an API key from a custom source (e.g. a password manager).\n * Used as the last-resort fallback in the auto-detect branch when no\n * static env vars or explicit auth are configured. Defaults to running\n * the `apiKeyHelper` command from `~/.claude/settings.json`, matching\n * the `claude` CLI's own behaviour.\n */\n readApiKeyHelper?: () => string | undefined;\n};\n\nexport function resolveClaudeCodeEnv(\n auth: ClaudeCodeAuthenticationMode | undefined,\n processEnv: Record<string, string | undefined> = process.env,\n options: ResolveClaudeCodeEnvOptions = {},\n): Record<string, string> {\n const suppliedEnvironment = isHarnessAuthenticationEnvironment(auth);\n const authenticationEnvironment = suppliedEnvironment ? auth : processEnv;\n\n const readApiKey =\n suppliedEnvironment || auth === 'direct'\n ? () => undefined\n : (options.readApiKeyHelper ?? readApiKeyHelper);\n if (auth === 'direct') {\n return pickAnthropic({\n processEnv: authenticationEnvironment,\n readApiKey,\n });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({\n env: authenticationEnvironment,\n });\n if (auth === 'ai-gateway' || gatewayAuthFromEnv.apiKey) {\n return pickGateway({ gatewayAuthFromEnv });\n }\n\n return pickAnthropic({\n processEnv: authenticationEnvironment,\n readApiKey,\n });\n}\n\nexport function resolveClaudeCodeAuthenticationMode(\n auth: ClaudeCodeAuthenticationMode | undefined,\n processEnv: Record<string, string | undefined> = process.env,\n): ClaudeCodeResolvedAuthenticationMode {\n if (isHarnessAuthenticationEnvironment(auth)) {\n return getAiGatewayAuthFromEnv({ env: auth }).apiKey\n ? 'ai-gateway'\n : 'direct';\n }\n if (auth === 'direct') {\n return 'direct';\n }\n if (auth === 'ai-gateway') {\n return 'ai-gateway';\n }\n return getAiGatewayAuthFromEnv({ env: processEnv }).apiKey\n ? 'ai-gateway'\n : 'direct';\n}\n\nfunction pickAnthropic({\n processEnv,\n readApiKey,\n}: {\n processEnv: Record<string, string | undefined>;\n readApiKey: () => string | undefined;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const helperKey = readApiKey();\n const apiKey = processEnv.ANTHROPIC_API_KEY ?? helperKey;\n const authToken = processEnv.ANTHROPIC_AUTH_TOKEN ?? helperKey;\n const oauthToken = processEnv.CLAUDE_CODE_OAUTH_TOKEN;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n if (oauthToken) env.CLAUDE_CODE_OAUTH_TOKEN = oauthToken;\n const baseUrl = processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\n/**\n * Read the `apiKeyHelper` setting from `~/.claude/settings.json` and run\n * it. The `claude` CLI uses this hook to fetch credentials from password\n * managers and similar tools; mirroring it here lets users with that\n * setup run the harness without having to set `ANTHROPIC_API_KEY`\n * explicitly.\n */\nfunction readApiKeyHelper(): string | undefined {\n const home = homedir();\n if (!home) return undefined;\n let raw: string;\n try {\n raw = readFileSync(join(home, '.claude', 'settings.json'), 'utf8');\n } catch {\n return undefined;\n }\n let settings: { apiKeyHelper?: unknown };\n try {\n settings = JSON.parse(raw);\n } catch {\n return undefined;\n }\n const command = settings.apiKeyHelper;\n if (typeof command !== 'string' || command.length === 0) return undefined;\n try {\n const output = execFileSync('sh', ['-c', command], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const trimmed = output.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction pickGateway({\n gatewayAuthFromEnv,\n}: {\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const apiKey = gatewayAuthFromEnv.apiKey;\n const baseUrl = gatewayAuthFromEnv.baseUrl;\n const env: Record<string, string> = {};\n if (apiKey) {\n env.AI_GATEWAY_API_KEY = apiKey;\n env.ANTHROPIC_API_KEY = apiKey;\n }\n env.AI_GATEWAY_BASE_URL = baseUrl;\n env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n","import { execFileSync } from 'node:child_process';\nimport { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport type {\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n isAccessTokenExpiringSoon,\n isHarnessAuthenticationEnvironment,\n isMacOS,\n readMacOSKeychainPassword,\n refreshOAuthAccessToken,\n shouldResolveNativeSubscription,\n} from '@ai-sdk/harness/utils';\nimport { isRecord, safeParseJSON } from '@ai-sdk/provider-utils';\nimport {\n resolveClaudeCodeEnv,\n type ClaudeCodeAuthenticationMode,\n type ClaudeCodeResolvedAuthenticationMode,\n type ResolveClaudeCodeEnvOptions,\n} from './claude-code-auth';\n\nconst CLAUDE_TOKEN_URL = 'https://platform.claude.com/v1/oauth/token';\nconst CLAUDE_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';\n\nexport function createClaudeCodeSubscriptionRequestTransformations({\n env: environment,\n sandboxEnv: sandboxEnvironment,\n auth: authenticationMode,\n}: HarnessV1RequestTransformationSources<ClaudeCodeResolvedAuthenticationMode>): HarnessV1RequestTransformation[] {\n if (\n environment.CLAUDE_CODE_OAUTH_TOKEN == null ||\n sandboxEnvironment.CLAUDE_CODE_OAUTH_TOKEN == null\n ) {\n return [];\n }\n return [\n createCredentialRequestTransformation({\n matchUrl:\n authenticationMode === 'ai-gateway'\n ? environment.ANTHROPIC_BASE_URL\n : (environment.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com'),\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.CLAUDE_CODE_OAUTH_TOKEN}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.CLAUDE_CODE_OAUTH_TOKEN}`,\n },\n }),\n ];\n}\n\nexport async function resolveClaudeCodeAuthentication({\n auth,\n processEnv = process.env,\n options = {},\n readSubscription = readClaudeCodeSubscription,\n}: {\n auth: ClaudeCodeAuthenticationMode | undefined;\n processEnv?: Record<string, string | undefined>;\n options?: ResolveClaudeCodeEnvOptions;\n readSubscription?: () => Promise<Record<string, string> | undefined>;\n}): Promise<Record<string, string>> {\n const environmentWithoutHelper = resolveClaudeCodeEnv(auth, processEnv, {\n readApiKeyHelper: () => undefined,\n });\n if (isHarnessAuthenticationEnvironment(auth)) {\n return environmentWithoutHelper;\n }\n if (\n !shouldResolveNativeSubscription({\n auth,\n env: environmentWithoutHelper,\n hasDirectCredential:\n environmentWithoutHelper.ANTHROPIC_API_KEY != null ||\n environmentWithoutHelper.ANTHROPIC_AUTH_TOKEN != null ||\n environmentWithoutHelper.CLAUDE_CODE_OAUTH_TOKEN != null,\n })\n ) {\n return environmentWithoutHelper;\n }\n\n return (\n (await readSubscription()) ??\n resolveClaudeCodeEnv(auth, processEnv, options)\n );\n}\n\nexport async function readClaudeCodeSubscription({\n env = process.env,\n homeDirectory = homedir(),\n platform = process.platform,\n fetch,\n}: {\n env?: Record<string, string | undefined>;\n homeDirectory?: string;\n platform?: NodeJS.Platform;\n fetch?: typeof globalThis.fetch;\n} = {}): Promise<Record<string, string> | undefined> {\n const configDirectory = resolve(\n env.CLAUDE_CONFIG_DIR ?? join(homeDirectory, '.claude'),\n );\n const credentialPath = join(configDirectory, '.credentials.json');\n const stored = await readClaudeCredentialStore({\n credentialPath,\n homeDirectory,\n configDirectory,\n platform,\n });\n if (stored == null) return undefined;\n const oauth = getClaudeOAuthCredential({ value: stored.value });\n if (oauth == null) return undefined;\n const { accessToken, refreshToken, expiresAt } = oauth;\n\n let resolvedAccessToken = accessToken;\n if (isAccessTokenExpiringSoon({ expiresAt })) {\n const refreshed = await refreshOAuthAccessToken({\n tokenUrl: CLAUDE_TOKEN_URL,\n clientId: CLAUDE_CLIENT_ID,\n refreshToken,\n requestFormat: 'json',\n ...(fetch == null ? {} : { fetch }),\n });\n resolvedAccessToken = refreshed.accessToken;\n await stored.write({\n ...stored.value,\n claudeAiOauth: {\n ...oauth,\n accessToken: refreshed.accessToken,\n refreshToken: refreshed.refreshToken ?? refreshToken,\n expiresAt: refreshed.expiresAt,\n },\n });\n }\n\n return {\n CLAUDE_CODE_OAUTH_TOKEN: resolvedAccessToken,\n ANTHROPIC_BASE_URL: 'https://api.anthropic.com',\n };\n}\n\ntype ClaudeCredentialFile = {\n readonly claudeAiOauth?: unknown;\n readonly [key: string]: unknown;\n};\n\ntype ClaudeOAuthCredential = Record<string, unknown> & {\n readonly accessToken: string;\n readonly refreshToken: string;\n readonly expiresAt: number;\n};\n\nasync function readClaudeCredentialStore({\n credentialPath,\n homeDirectory,\n configDirectory,\n platform,\n}: {\n credentialPath: string;\n homeDirectory: string;\n configDirectory: string;\n platform: NodeJS.Platform;\n}): Promise<\n | {\n value: ClaudeCredentialFile;\n write(value: ClaudeCredentialFile): Promise<void>;\n }\n | undefined\n> {\n const text = await readFile(credentialPath, 'utf8').catch(() => undefined);\n if (text != null) {\n const value = await parseClaudeCredentialFile(text);\n if (value != null && getClaudeOAuthCredential({ value }) != null) {\n return {\n value,\n write: updated =>\n writeClaudeCredentialFile({ credentialPath, value: updated }),\n };\n }\n }\n\n if (!isMacOS(platform)) return undefined;\n if (configDirectory !== resolve(join(homeDirectory, '.claude'))) {\n return undefined;\n }\n const service = 'Claude Code-credentials';\n const keychainText = await readMacOSKeychainPassword({\n service,\n account: process.env.USER ?? '',\n });\n if (keychainText == null) return undefined;\n const value = await parseClaudeCredentialFile(keychainText);\n if (value == null) return undefined;\n return {\n value,\n write: async updated => {\n execFileSync(\n '/usr/bin/security',\n [\n 'add-generic-password',\n '-U',\n '-s',\n service,\n '-a',\n process.env.USER ?? '',\n '-w',\n JSON.stringify(updated),\n ],\n { stdio: 'ignore' },\n );\n },\n };\n}\n\nfunction getClaudeOAuthCredential({\n value,\n}: {\n value: ClaudeCredentialFile;\n}): ClaudeOAuthCredential | undefined {\n const oauth = value.claudeAiOauth;\n if (\n !isRecord(oauth) ||\n typeof oauth.accessToken !== 'string' ||\n typeof oauth.refreshToken !== 'string' ||\n typeof oauth.expiresAt !== 'number'\n ) {\n return undefined;\n }\n return oauth as ClaudeOAuthCredential;\n}\n\nasync function parseClaudeCredentialFile(\n text: string,\n): Promise<ClaudeCredentialFile | undefined> {\n const parsed = await safeParseJSON({ text });\n return parsed.success && isRecord(parsed.value)\n ? (parsed.value as ClaudeCredentialFile)\n : undefined;\n}\n\nasync function writeClaudeCredentialFile({\n credentialPath,\n value,\n}: {\n credentialPath: string;\n value: ClaudeCredentialFile;\n}): Promise<void> {\n await mkdir(dirname(credentialPath), { recursive: true });\n const temporaryPath = `${credentialPath}.${process.pid}.tmp`;\n await writeFile(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, {\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, credentialPath);\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\n/*\n * Claude Code's bridge wire protocol. The outbound events, transport frames,\n * shared inbound commands, and `bridge-ready` line all come from the shared\n * `@ai-sdk/harness` protocol — the only Claude-specific piece is the `start`\n * payload, which carries Claude SDK configuration.\n */\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nconst thinkingDisplaySchema = z.enum(['summarized', 'omitted']).optional();\n\nconst thinkingSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('adaptive'),\n display: thinkingDisplaySchema,\n }),\n z.object({\n type: z.literal('enabled'),\n display: thinkingDisplaySchema,\n }),\n z.object({ type: z.literal('disabled') }),\n]);\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n instructions: z.string().optional(),\n thinking: thinkingSchema,\n effort: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n maxTurns: z.number().optional(),\n env: z.record(z.string(), z.string()).optional(),\n skills: z.array(z.string()).optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n // Resume signal. When true, the bridge passes `{ continue: true }` to the\n // Claude SDK so the in-workdir thread state is rehydrated. The host sets this\n // on the first prompt after a cross-process resume.\n continue: z.boolean().optional(),\n // Exact conversation to resume, as the Claude SDK's `resume` option.\n //\n // Preferred over `continue` whenever the host knows which conversation it\n // means: `continue` resolves to the most recent thread in the workdir, which\n // is the wrong one as soon as anything else has run there since — including\n // a resume that itself started a new thread. Mutually exclusive with\n // `continue` in the SDK, so the bridge sends one or the other.\n resumeSessionId: z.string().optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createClaudeCode } from './claude-code-harness';\n\n/**\n * Default `claude-code` harness instance with no overrides — suitable for the\n * common case where the underlying `claude` CLI's defaults are fine.\n * Equivalent to `createClaudeCode()`.\n */\nexport const claudeCode = createClaudeCode();\n\nexport { createClaudeCode } from './claude-code-harness';\nexport { VERSION } from './version';\nexport type { ClaudeCodeHarnessSettings } from './claude-code-harness';\nexport type { ClaudeCodeAuthenticationMode } from './claude-code-auth';\nexport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\n"],"mappings":"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","names":["safeParseJSON","z","execFileSync","homedir","join","createCredentialRequestTransformation","isHarnessAuthenticationEnvironment","createCredentialRequestTransformation","isHarnessAuthenticationEnvironment","homedir","join","value","execFileSync","z","endpoint","finishListenerAttachment","proc","resolve","safeParseJSON"]}
|
|
1
|
+
{"version":3,"sources":["../src/claude-code-harness.ts","../src/claude-code-bootstrap.ts","../src/claude-code-auth.ts","../src/claude-code-subscription.ts","../src/claude-code-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { posix } from 'node:path';\nimport {\n commonTool,\n HARNESS_V1_BUILTIN_TOOLS,\n harnessV1DiagnosticFromBridgeFrame,\n HarnessCapabilityUnsupportedError,\n type HarnessV1,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1BuiltinTool,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1MintBridgeTokenCallback,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResponseFormat,\n type HarnessV1PortEndpoint,\n type HarnessV1ResumeSessionState,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n harnessStateDirectoryPath,\n harnessSessionDataDirectoryPath,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n resolveSandboxCredentialEnvironment,\n createBridgeToken,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n sleep,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n withBridgeToken,\n writeSkills,\n type SandboxChannelReconnectOptions,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxSession as SandboxSession,\n type Experimental_SandboxProcess,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n CLAUDE_CODE_BOOTSTRAP_DIR as BOOTSTRAP_DIR,\n getClaudeCodeBootstrap,\n} from './claude-code-bootstrap';\nimport {\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n createClaudeCodeRequestTransformations,\n resolveClaudeCodeAuthenticationMode,\n type ClaudeCodeAuthenticationMode,\n} from './claude-code-auth';\nimport {\n createClaudeCodeSubscriptionRequestTransformations,\n resolveClaudeCodeAuthentication,\n} from './claude-code-subscription';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './claude-code-bridge-protocol';\nimport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\nimport { VERSION } from './version';\n\ntype ClaudeCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype ClaudeCodeRespawnStrategy = 'replay' | 'rerun';\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst CLAUDE_CODE_CLIENT_APP = `ai-sdk-harness-claude-code/${VERSION}`;\n\nexport type ClaudeCodeHarnessSettings = {\n readonly auth?: ClaudeCodeAuthenticationMode;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n /**\n * Hard cap on how many internal turns the CLI can take before yielding\n * back to the caller. Unset means the CLI's default.\n */\n readonly maxTurns?: number;\n /**\n * Environment variables for the Claude Code process. These values are\n * merged over the sandbox bridge process environment.\n */\n readonly env?: Readonly<Record<string, string>>;\n /**\n * Controls extended-thinking behavior and whether reasoning is summarized or\n * omitted. Defaults to `{ type: 'adaptive', display: 'summarized' }`.\n */\n readonly thinking?: ClaudeCodeThinkingConfig;\n /**\n * Controls how much effort Claude applies when adaptive thinking is enabled.\n * Unset uses the Claude Agent SDK default.\n */\n readonly effort?: 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n /**\n * Override the port the bridge binds inside the sandbox. By default the\n * adapter uses the first port the sandbox declares via `sandbox.ports`.\n * Only set this if the sandbox declares multiple ports and the first one\n * is reserved for something else.\n */\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n /** Maximum milliseconds to wait for the bridge to advertise its port. Defaults to 120000. */\n readonly startupTimeoutMs?: number;\n /**\n * Configures reconnection attempts after an established bridge connection\n * drops. The reconnect window includes connection establishment and\n * backoff delays. Defaults to 30 seconds with exponential backoff from 50\n * milliseconds up to 2 seconds.\n */\n readonly reconnect?: SandboxChannelReconnectOptions;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: HarnessV1MintBridgeTokenCallback;\n};\n\n/*\n * Every native tool the Claude Code CLI can invoke, declared as a `ToolSet`\n * keyed by what the bridge emits as `toolName` on the wire\n * (`commonName ?? nativeName`). Schemas are transcribed from the generated\n * `sdk-tools.d.ts` and the conditionally registered tool definitions in the\n * pinned Claude Code executable.\n *\n * `MCP` (the generic proxy tool inside the Claude Code SDK) is intentionally\n * omitted — the bridge filters out `mcp__harness-tools__*` tool names before\n * emitting them, and other MCP invocations come through with their own\n * server-tool names rather than the literal `'Mcp'` token.\n */\nconst listMcpResourcesInputSchema = z.object({\n server: z.string().optional(),\n});\n\nconst readMcpResourceInputSchema = z.object({\n server: z.string(),\n uri: z.string(),\n});\n\nconst structuredTeamMessageSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('shutdown_request'),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('shutdown_response'),\n request_id: z.string(),\n approve: z.boolean(),\n reason: z.string().optional(),\n }),\n z.object({\n type: z.literal('plan_approval_response'),\n request_id: z.string(),\n approve: z.boolean(),\n feedback: z.string().optional(),\n }),\n]);\n\nconst CLAUDE_CODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'Read',\n toolUseKind: 'readonly',\n description: 'Read file contents (text, image, PDF, notebook)',\n inputSchema: z.object({\n file_path: z.string(),\n offset: z.number().optional(),\n limit: z.number().optional(),\n pages: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'Write',\n toolUseKind: 'edit',\n description: 'Overwrite or create a file at an absolute path',\n inputSchema: z.object({\n file_path: z.string(),\n content: z.string(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'Edit',\n toolUseKind: 'edit',\n description: 'Edit a file by exact string replacement',\n inputSchema: z.object({\n file_path: z.string(),\n old_string: z.string(),\n new_string: z.string(),\n replace_all: z.boolean().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'Bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'Glob',\n toolUseKind: 'readonly',\n description: 'Fast file-pattern search using glob syntax',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'Grep',\n toolUseKind: 'readonly',\n description: 'Regex search over file contents via ripgrep',\n inputSchema: z.object({\n pattern: z.string(),\n path: z.string().optional(),\n glob: z.string().optional(),\n output_mode: z\n .enum(['content', 'files_with_matches', 'count'])\n .optional(),\n '-B': z.number().optional(),\n '-A': z.number().optional(),\n '-C': z.number().optional(),\n context: z.number().optional(),\n '-n': z.boolean().optional(),\n '-i': z.boolean().optional(),\n '-o': z.boolean().optional(),\n type: z.string().optional(),\n head_limit: z.number().optional(),\n offset: z.number().optional(),\n multiline: z.boolean().optional(),\n }),\n }),\n webSearch: commonTool('webSearch', {\n nativeName: 'WebSearch',\n toolUseKind: 'readonly',\n description: 'Issue web search queries with optional domain filters',\n inputSchema: z.object({\n query: z.string(),\n allowed_domains: z.array(z.string()).optional(),\n blocked_domains: z.array(z.string()).optional(),\n }),\n }),\n\n WebFetch: tool({\n description: 'Fetch a URL and run a prompt against its content',\n inputSchema: z.object({\n url: z.string(),\n prompt: z.string(),\n }),\n }),\n NotebookEdit: tool({\n description: 'Edit, insert, or delete a Jupyter notebook cell',\n inputSchema: z.object({\n notebook_path: z.string(),\n new_source: z.string(),\n cell_id: z.string().optional(),\n cell_type: z.enum(['code', 'markdown']).optional(),\n edit_mode: z.enum(['replace', 'insert', 'delete']).optional(),\n }),\n }),\n TodoWrite: tool({\n description: 'Replace the session todo list',\n inputSchema: z.object({\n todos: z.array(\n z.object({\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed']),\n activeForm: z.string(),\n }),\n ),\n }),\n }),\n Agent: tool({\n description: 'Spawn a subagent with a task',\n inputSchema: z.object({\n description: z.string(),\n prompt: z.string(),\n subagent_type: z.string().optional(),\n model: z.enum(['sonnet', 'opus', 'haiku']).optional(),\n run_in_background: z.boolean().optional(),\n name: z.string().optional(),\n team_name: z.string().optional(),\n mode: z\n .enum([\n 'acceptEdits',\n 'auto',\n 'bypassPermissions',\n 'default',\n 'dontAsk',\n 'plan',\n ])\n .optional(),\n isolation: z.literal('worktree').optional(),\n }),\n }),\n TaskCreate: tool({\n description: 'Create a task in the session-local task list',\n inputSchema: z.object({\n subject: z.string(),\n description: z.string(),\n activeForm: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskGet: tool({\n description: 'Retrieve a task by id',\n inputSchema: z.object({ taskId: z.string() }),\n }),\n TaskUpdate: tool({\n description: 'Update fields of an existing task',\n inputSchema: z.object({\n taskId: z.string(),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .union([\n z.enum(['pending', 'in_progress', 'completed']),\n z.literal('deleted'),\n ])\n .optional(),\n addBlocks: z.array(z.string()).optional(),\n addBlockedBy: z.array(z.string()).optional(),\n owner: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n TaskList: tool({\n description: 'Return all tasks in the session-local task list',\n inputSchema: z.object({}),\n }),\n TaskStop: tool({\n description: 'Stop a running background task by id',\n inputSchema: z.object({\n task_id: z.string().optional(),\n shell_id: z.string().optional(),\n }),\n }),\n TaskOutput: tool({\n description: 'Poll for output from a background task',\n inputSchema: z.object({\n task_id: z.string(),\n block: z.boolean(),\n timeout: z.number(),\n }),\n }),\n Monitor: {\n ...tool({\n description: 'Run and monitor a shell command or WebSocket',\n inputSchema: z.object({\n description: z.string().optional(),\n timeout_ms: z.number().optional(),\n persistent: z.boolean().optional(),\n command: z.string().optional(),\n ws: z\n .object({\n url: z.string(),\n protocols: z.array(z.string()).optional(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n ListMcpResources: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ListMcpResourcesTool: {\n ...tool({\n description: 'List resources available from MCP servers',\n inputSchema: listMcpResourcesInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResource: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceTool: {\n ...tool({\n description: 'Read a specific MCP resource by URI',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n ReadMcpResourceDirTool: {\n ...tool({\n description: 'List direct children of an MCP directory resource',\n inputSchema: readMcpResourceInputSchema,\n }),\n toolUseKind: 'readonly',\n },\n RefreshMcpTools: {\n ...tool({\n description: 'Refresh tools from one or all connected MCP servers',\n inputSchema: z.object({ server: z.string().optional() }),\n }),\n toolUseKind: 'readonly',\n },\n ExitPlanMode: tool({\n description: 'Exit plan mode with optional permission approvals',\n inputSchema: z.looseObject({\n allowedPrompts: z\n .array(\n z.object({\n tool: z.literal('Bash'),\n prompt: z.string(),\n }),\n )\n .optional(),\n }),\n }),\n EnterPlanMode: {\n ...tool({\n description: 'Enter plan mode',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n EnterWorktree: tool({\n description: 'Create or enter an isolated git worktree',\n inputSchema: z.object({\n name: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ExitWorktree: tool({\n description: 'Exit the current worktree session',\n inputSchema: z.object({\n action: z.enum(['keep', 'remove']),\n discard_changes: z.boolean().optional(),\n }),\n }),\n askUserQuestions: {\n ...HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,\n nativeName: 'AskUserQuestion',\n toolUseKind: 'readonly',\n } as typeof HARNESS_V1_BUILTIN_TOOLS.askUserQuestions & {\n readonly nativeName: 'AskUserQuestion';\n readonly toolUseKind: 'readonly';\n },\n Skill: {\n ...tool({\n description: 'Activate a skill by name',\n inputSchema: z.object({\n skill: z.string(),\n args: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ToolSearch: tool({\n description:\n 'Search deferred MCP / catalog tools so the model can load them on demand',\n inputSchema: z.object({\n query: z.string(),\n max_results: z.number().optional(),\n }),\n }),\n Artifact: {\n ...tool({\n description: 'Publish or list claude.ai artifacts',\n inputSchema: z.object({\n action: z.enum(['publish', 'list']).optional(),\n file_path: z.string().optional(),\n favicon: z.string().optional(),\n limit: z.number().optional(),\n scope: z.enum(['mine', 'shared', 'all']).optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n label: z.string().optional(),\n url: z.string().optional(),\n force: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronCreate: {\n ...tool({\n description: 'Schedule a recurring or one-shot prompt',\n inputSchema: z.object({\n cron: z.string(),\n prompt: z.string(),\n recurring: z.boolean().optional(),\n durable: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n CronDelete: {\n ...tool({\n description: 'Delete a scheduled prompt by id',\n inputSchema: z.object({ id: z.string() }),\n }),\n toolUseKind: 'edit',\n },\n CronList: {\n ...tool({\n description: 'List scheduled prompts for the current session',\n inputSchema: z.object({}),\n }),\n toolUseKind: 'readonly',\n },\n DesignSync: {\n ...tool({\n description: 'Read or update claude.ai Design projects',\n inputSchema: z.object({\n method: z.enum([\n 'list_projects',\n 'get_project',\n 'list_files',\n 'get_file',\n 'finalize_plan',\n 'write_files',\n 'delete_files',\n 'register_assets',\n 'unregister_assets',\n 'create_project',\n 'report_validate',\n ]),\n projectId: z.string().optional(),\n path: z.string().optional(),\n writes: z.array(z.string()).max(256).optional(),\n deletes: z.array(z.string()).max(256).optional(),\n planId: z.string().optional(),\n files: z\n .array(\n z.object({\n path: z.string(),\n localPath: z.string().optional(),\n data: z.string().optional(),\n encoding: z.literal('base64').optional(),\n mimeType: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n paths: z.array(z.string()).max(256).optional(),\n name: z.string().optional(),\n assets: z\n .array(\n z.object({\n name: z.string(),\n path: z.string(),\n subtitle: z.string().optional(),\n viewport: z\n .object({\n width: z.number(),\n height: z.number().optional(),\n })\n .optional(),\n group: z.string().optional(),\n }),\n )\n .max(256)\n .optional(),\n localDir: z.string().optional(),\n counts: z\n .object({\n total: z.number(),\n bad: z.number(),\n thin: z.number(),\n variantsIdentical: z.number(),\n iterations: z.number(),\n })\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n LSP: {\n ...tool({\n description: 'Query a language server for code intelligence',\n inputSchema: z.object({\n operation: z.enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n ]),\n filePath: z.string(),\n line: z.number().int().positive(),\n character: z.number().int().positive(),\n query: z.string().optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n PowerShell: {\n ...tool({\n description: 'Execute a PowerShell command, optionally in background',\n inputSchema: z.object({\n command: z.string(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n run_in_background: z.boolean().optional(),\n dangerouslyDisableSandbox: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'bash',\n },\n PushNotification: {\n ...tool({\n description: 'Send a notification for proactive or scheduled work',\n inputSchema: z.object({\n message: z.string(),\n status: z.literal('proactive'),\n }),\n }),\n toolUseKind: 'edit',\n },\n RemoteTrigger: {\n ...tool({\n description: 'List, manage, or run a claude.ai Routine trigger',\n inputSchema: z.object({\n action: z.enum(['list', 'get', 'create', 'update', 'run']),\n trigger_id: z.string().optional(),\n body: z.record(z.string(), z.unknown()).optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n ReportFindings: {\n ...tool({\n description: 'Return verified code-review findings',\n inputSchema: z.object({\n level: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n findings: z\n .array(\n z.object({\n file: z.string(),\n line: z.number().optional(),\n summary: z.string(),\n short_summary: z.string().optional(),\n failure_scenario: z.string(),\n category: z.string().optional(),\n verdict: z.enum(['CONFIRMED', 'PLAUSIBLE']).optional(),\n outcome: z\n .enum(['fixed', 'skipped', 'no_change_needed'])\n .optional(),\n }),\n )\n .max(32),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ScheduleWakeup: {\n ...tool({\n description: 'Schedule or stop the next iteration of a dynamic loop',\n inputSchema: z.object({\n delaySeconds: z.number().optional(),\n reason: z.string().optional(),\n prompt: z.string().optional(),\n stop: z.boolean().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendMessage: {\n ...tool({\n description: 'Send a plain-text or protocol message to another agent',\n inputSchema: z.object({\n to: z.string(),\n summary: z.string().max(200).optional(),\n message: z.union([z.string(), structuredTeamMessageSchema]),\n }),\n }),\n toolUseKind: 'edit',\n },\n SendUserFile: {\n ...tool({\n description: 'Send one or more files to the user',\n inputSchema: z.object({\n files: z.union([z.string(), z.array(z.string()).min(1)]),\n caption: z.string().optional(),\n status: z.enum(['normal', 'proactive']),\n display: z.enum(['render', 'attach']).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n ShareOnboardingGuide: {\n ...tool({\n description: 'Create, update, inspect, or delete an onboarding guide',\n inputSchema: z.object({\n mode: z.enum(['check', 'update', 'create', 'delete']).optional(),\n short_code: z\n .string()\n .regex(/^[A-Za-z0-9_-]{1,64}$/)\n .optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n WaitForMcpServers: {\n ...tool({\n description: 'Wait for MCP servers that are still connecting',\n inputSchema: z.object({\n servers: z.array(z.string()).optional(),\n }),\n }),\n toolUseKind: 'readonly',\n },\n Workflow: {\n ...tool({\n description: 'Run or resume a dynamic multi-agent workflow',\n inputSchema: z.object({\n script: z.string().optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n title: z.string().optional(),\n args: z.record(z.string(), z.unknown()).optional(),\n scriptPath: z.string().optional(),\n resumeFromRunId: z.string().optional(),\n }),\n }),\n toolUseKind: 'edit',\n },\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\n/**\n * Live bridge coordinates returned by `doDetach()` and `doSuspendTurn()`. A\n * future process uses them to reopen a socket to the still-running bridge\n * (`attach`) instead of re-spawning it. Absent on a `doStop()` payload.\n */\nconst claudeCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\n/**\n * Schema for the adapter-specific portion of lifecycle state `data`.\n *\n * A `doStop()` payload is structurally empty (`{}`): the framework derives the\n * sandbox via `provider.resumeSession({ sessionId })`, and the Claude SDK's\n * `{ continue: true }` flag rehydrates the thread from the workdir. A\n * `doDetach()` payload additionally carries `bridge` coordinates for\n * cross-process `attach`. A loose object keeps both shapes valid.\n */\nconst claudeCodeResumeStateSchema = z.looseObject({\n bridge: claudeCodeBridgeCoordsSchema.optional(),\n sandboxCredentialEnvironment: z.record(z.string(), z.string()).optional(),\n /**\n * The exact Claude conversation to rehydrate on resume. Written by the\n * adapter on `doStop()`/`doDetach()`/`doSuspendTurn()` from the session id\n * the bridge observed, so a resume names the conversation instead of\n * relying on the SDK's `continue` flag — \"most recent thread in this\n * workdir\" — which silently picks the wrong one once a second thread\n * exists there. Hosts that captured the id themselves (it is surfaced as\n * `harnessMetadata['claude-code'].sessionId` on `finish` parts) may also\n * set it explicitly.\n */\n claudeSessionId: z.string().optional(),\n});\n\ntype ClaudeCodeBridgeCoords = z.infer<typeof claudeCodeBridgeCoordsSchema>;\n\nexport function createClaudeCode(\n settings: ClaudeCodeHarnessSettings = {},\n): HarnessV1<typeof CLAUDE_CODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'Claude Code MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n const thinking = settings.thinking ?? {\n type: 'adaptive',\n display: 'summarized',\n };\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'claude-code',\n builtinTools: CLAUDE_CODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n supportsBuiltinToolFiltering: true,\n lifecycleStateSchema: claudeCodeResumeStateSchema,\n getBootstrap: getClaudeCodeBootstrap,\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness cannot use `mintBridgeToken` with a sandbox session that does not expose an id.',\n });\n }\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData = isResume\n ? (lifecycleState?.data as {\n bridge?: ClaudeCodeBridgeCoords;\n sandboxCredentialEnvironment?: Record<string, string>;\n claudeSessionId?: string;\n })\n : undefined;\n const coords = resumeData?.bridge;\n const authenticationMode = resolveClaudeCodeAuthenticationMode(\n settings.auth,\n );\n const resolvedAuthEnvironment = await resolveClaudeCodeAuthentication({\n auth: settings.auth,\n });\n const claudeEnvironment = {\n ...resolvedAuthEnvironment,\n /*\n * The Claude Agent SDK does not expose arbitrary model-request\n * headers. It reads this environment variable and sends the value as\n * `x-client-app`, while also appending `client-app/<value>` to\n * `User-Agent`, so this is the attribution path for AI Gateway.\n */\n ...(resolvedAuthEnvironment.AI_GATEWAY_BASE_URL\n ? { CLAUDE_AGENT_SDK_CLIENT_APP: CLAUDE_CODE_CLIENT_APP }\n : {}),\n ...settings.env,\n ...(startOpts.headers != null\n ? {\n ANTHROPIC_CUSTOM_HEADERS: Object.entries(startOpts.headers)\n .map(([name, value]) => `${name}: ${value}`)\n .join('\\n'),\n }\n : {}),\n };\n let sandboxClaudeEnvironment = claudeEnvironment;\n let sandboxCredentialEnvironment: Record<string, string> | undefined;\n if (\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n sandboxCredentialEnvironment =\n await resolveSandboxCredentialEnvironment({\n environment: claudeEnvironment,\n credentialEnvironmentVariables:\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n previousSandboxCredentialEnvironment:\n resumeData?.sandboxCredentialEnvironment,\n });\n sandboxClaudeEnvironment = {\n ...claudeEnvironment,\n ...sandboxCredentialEnvironment,\n };\n const transformationSources = {\n env: claudeEnvironment,\n sandboxEnv: sandboxClaudeEnvironment,\n auth: authenticationMode,\n };\n const requestTransformations = [\n ...createClaudeCodeRequestTransformations(transformationSources),\n ...createClaudeCodeSubscriptionRequestTransformations(\n transformationSources,\n ),\n ];\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n } else {\n sandboxClaudeEnvironment = await applyCredentialForwarding({\n environment: sandboxClaudeEnvironment,\n credentialEnvironmentVariables:\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n });\n warnCredentialBrokeringUnavailable({\n environment: claudeEnvironment,\n forwardedEnvironment: sandboxClaudeEnvironment,\n credentialEnvironmentVariables:\n CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n });\n }\n // Harness SDK state (bootstrap, per-session runs) always lives under\n // the sandbox's own HOME, never the working directory, so it stays\n // out of a user-owned workspace.\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const stateDir = harnessStateDirectoryPath({ sandboxHomeDir });\n const bootstrapDir = posix.resolve(stateDir, BOOTSTRAP_DIR);\n // The conversation the host wants back, when it is known. Absent on\n // state written before this field existed; those resumes fall back to\n // the `continue` flag as before.\n const resumeSessionId = resumeData?.claudeSessionId;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = harnessSessionDataDirectoryPath({\n stateDirectory: stateDir,\n sessionId: startOpts.sessionId,\n });\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n\n // Normalize each forwarded bridge diagnostics frame into the general\n // `HarnessV1Diagnostic` and report it. The adapter does no telemetry work\n // beyond this transport→emission mapping.\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'claude-code',\n sessionId: startOpts.sessionId,\n });\n let supportsUserMessageResponses = false;\n\n // Builds the `connect` thunk a `SandboxChannel` re-invokes on every\n // (re)connect: open the socket, then wait for `bridge-hello` so the\n // end-to-end link is proven live before any frame is sent.\n const buildConnect =\n (endpoint: HarnessV1PortEndpoint) =>\n async ({\n abortSignal,\n }: {\n abortSignal: AbortSignal;\n }): Promise<WebSocket> => {\n return openBridgeWebSocket({\n endpoint,\n timeoutMs,\n abortSignal,\n onHello: supportsResponses => {\n supportsUserMessageResponses = supportsResponses;\n },\n });\n };\n\n /*\n * Rung 1 — ATTACH. When lifecycle state carries live bridge coordinates,\n * try to reopen a socket to the still-running bridge. Parked sessions wait\n * for the next `start`; suspended turns request replay of everything past\n * the persisted cursor. No spawn, no fresh token (the existing bridge\n * still authorises the persisted one). If the bridge is gone the open\n * throws and we fall through to a spawn-based recovery.\n */\n if (coords) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: coords.port,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n const attachChannel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(attachEndpoint),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\n });\n const finishListenerAttachment = isContinue\n ? attachChannel.beginListenerAttachment()\n : undefined;\n try {\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n } catch (error) {\n finishListenerAttachment?.();\n throw error;\n }\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n finishListenerAttachment,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n // The live bridge was spawned by another process; this one owns no\n // process handle. The session lifecycle method decides whether the\n // sandbox is left running, stopped, or destroyed.\n proc: undefined,\n maxTurns: settings.maxTurns,\n env: sandboxClaudeEnvironment,\n thinking,\n effort: settings.effort,\n isResume: true,\n continueOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n mcpServers: settings.mcpServers,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n } catch {\n // Bridge no longer reachable — recover by respawning below.\n }\n }\n\n /*\n * Rungs 2/3 — REPLAY vs RERUN. Respawn the bridge. `replay` is only sound\n * for `continueFrom`: those coordinates include the cursor the on-disk\n * log is replayed *from*. `resumeFrom` is a between-turn resume; even when\n * it carries bridge coordinates, replaying the previous turn would\n * re-deliver stale events into the next turn. Those resumes always `rerun`\n * when attach is unavailable (the CLI continues its own thread from the\n * workdir snapshot via `continue: true`).\n */\n let respawnStrategy: ClaudeCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort({\n sandboxSession,\n override: settings.port,\n });\n const token =\n settings.mintBridgeToken == null\n ? createBridgeToken()\n : settings.mintBridgeToken(sandboxId!);\n const env = {\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n /*\n * On a fresh start the workdir and bridge-state directory must be\n * created. The env is sent fresh on every spawn —\n * `BRIDGE_CHANNEL_TOKEN` rotates per start.\n */\n if (respawnStrategy === undefined) {\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'claude-code',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n\n const bridgeStartupStderr: string[] = [];\n const bridgeStartupStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'claude-code',\n collectTail: bridgeStartupStderr,\n });\n void bridgeStartupStderrDone;\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'claude-code',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'claude-code bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail: bridgeStartupStderr,\n stderrDone: bridgeStartupStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: boundPort,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n\n const channel: ClaudeCodeChannel = new SandboxChannel({\n connect: buildConnect(bridgeEndpoint),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\n // In replay mode the respawned bridge reloaded the finished turn from\n // disk; seed the cursor and resume so it streams the tail (incl.\n // `finish`) rather than starting empty.\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n const finishListenerAttachment =\n respawnStrategy === 'replay'\n ? channel.beginListenerAttachment()\n : undefined;\n try {\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n } catch (error) {\n finishListenerAttachment?.();\n throw error;\n }\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n finishListenerAttachment,\n proc,\n maxTurns: settings.maxTurns,\n env: sandboxClaudeEnvironment,\n thinking,\n effort: settings.effort,\n isResume: respawnStrategy !== undefined,\n continueOnFirstPrompt: respawnStrategy !== undefined,\n ...(resumeSessionId ? { resumeSessionId } : {}),\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n mcpServers: settings.mcpServers,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n },\n };\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n}): number {\n if (override !== undefined) return override;\n if ('ports' in sandboxSession && sandboxSession.ports.length > 0) {\n return sandboxSession.ports[0];\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The claude-code harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createClaudeCode({ port })`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness requires an explicit `port` when using a basic sandbox session.',\n });\n }\n if (portEndpoint == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n }\n}\n\nasync function resolveBridgeEndpoint({\n sandboxSession,\n override,\n port,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message:\n 'The Claude Code harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n}\n\n/**\n * Materialise skill files into\n * `$HOME/.claude/skills/<name>/SKILL.md`. The `claude` CLI\n * auto-discovers skills from that directory on startup, so the files have to\n * be in place before the bridge is spawned without mutating the session\n * workdir. Each file uses the YAML-frontmatter shape the CLI expects.\n */\n/**\n * Wait for the bridge's `bridge-hello` message to arrive on the freshly\n * opened WebSocket before any other host-side code touches it.\n *\n * Some sandbox runtimes (Vercel in particular) complete the WS upgrade\n * with the host long before the connection is actually forwarded to the\n * sandbox-side bridge. Anything sent in that gap is silently dropped —\n * including the `start` message we send next. The bridge emits\n * `bridge-hello` the instant it accepts the connection, so receiving it\n * is the only reliable evidence that the end-to-end link is live.\n */\nfunction openWebSocketAndWaitForBridgeHello({\n endpoint,\n openTimeoutMs,\n getHelloTimeoutMs,\n abortSignal,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n openTimeoutMs: number;\n getHelloTimeoutMs: () => number;\n abortSignal: AbortSignal;\n onHello: (supportsUserMessageResponses: boolean) => void;\n}): Promise<WebSocket> {\n return new Promise<WebSocket>((resolve, reject) => {\n const abortReason = () =>\n abortSignal.reason ?? new Error('WebSocket connection aborted');\n if (abortSignal.aborted) {\n reject(abortReason());\n return;\n }\n\n const ws = new WebSocket(endpoint.url, {\n headers: endpoint.headers == null ? undefined : { ...endpoint.headers },\n });\n let opened = false;\n let sawBridgeHello = false;\n let settled = false;\n let openTimer: ReturnType<typeof setTimeout> | undefined;\n let helloTimer: ReturnType<typeof setTimeout> | undefined;\n let onAbort: (() => void) | undefined;\n\n const cleanup = ({\n keepTerminationListeners = false,\n }: {\n keepTerminationListeners?: boolean;\n } = {}) => {\n if (openTimer) clearTimeout(openTimer);\n if (helloTimer) clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n if (onAbort != null) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n if (!keepTerminationListeners) {\n ws.off('close', onClose);\n ws.off('error', onError);\n }\n };\n const settle = (err?: unknown) => {\n if (settled) return;\n settled = true;\n if (err) {\n cleanup({ keepTerminationListeners: true });\n try {\n ws.terminate();\n } catch {\n cleanup();\n }\n reject(err);\n } else {\n cleanup();\n resolve(ws);\n }\n };\n const tryResolve = () => {\n if (opened && sawBridgeHello) settle();\n };\n const startHelloTimer = () => {\n if (helloTimer) return;\n const helloTimeoutMs = getHelloTimeoutMs();\n helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `claude-code bridge did not send bridge-hello within ${helloTimeoutMs}ms`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n };\n const onOpen = () => {\n opened = true;\n if (openTimer) {\n clearTimeout(openTimer);\n openTimer = undefined;\n }\n startHelloTimer();\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success || settled) return;\n const value = parsed.value;\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { type?: unknown }).type === 'bridge-hello'\n ) {\n const capabilities = (\n value as {\n capabilities?: { experimental_userMessageResponses?: unknown };\n }\n ).capabilities;\n onHello(capabilities?.experimental_userMessageResponses === true);\n sawBridgeHello = true;\n tryResolve();\n }\n })();\n };\n const onClose = () => {\n settle(\n new Error('claude-code bridge closed before sending bridge-hello'),\n );\n cleanup();\n };\n const onError = (err: Error) => settle(err);\n onAbort = () => settle(abortReason());\n openTimer = setTimeout(\n () =>\n settle(new Error(`WebSocket open timed out after ${openTimeoutMs}ms`)),\n openTimeoutMs,\n );\n openTimer.unref?.();\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n abortSignal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function openBridgeWebSocket({\n endpoint,\n timeoutMs,\n abortSignal,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n timeoutMs: number;\n abortSignal: AbortSignal;\n onHello: (supportsUserMessageResponses: boolean) => void;\n}): Promise<WebSocket> {\n const deadline = Date.now() + timeoutMs;\n let attempt = 0;\n let lastError: unknown;\n\n while (!abortSignal.aborted && Date.now() < deadline) {\n attempt++;\n try {\n const remaining = Math.max(1, deadline - Date.now());\n return await openWebSocketAndWaitForBridgeHello({\n endpoint,\n openTimeoutMs: Math.min(10_000, remaining),\n getHelloTimeoutMs: () =>\n Math.min(5_000, Math.max(1, deadline - Date.now())),\n abortSignal,\n onHello,\n });\n } catch (err) {\n if (abortSignal.aborted) {\n throw abortSignal.reason ?? new Error('WebSocket connection aborted');\n }\n lastError = err;\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep({\n ms: Math.min(250 * attempt, 1_000, remaining),\n abortSignal,\n });\n }\n }\n\n if (abortSignal.aborted) {\n throw abortSignal.reason ?? new Error('WebSocket connection aborted');\n }\n\n throw new Error(\n `claude-code bridge did not complete WebSocket handshake within ${timeoutMs}ms after ${attempt} attempt(s). Last error: ${formatUnknownError(lastError)}`,\n );\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction formatUnknownError(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction createSession({\n sessionId,\n channel,\n finishListenerAttachment,\n proc,\n maxTurns,\n env,\n thinking,\n effort,\n isResume,\n continueOnFirstPrompt,\n resumeSessionId,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n sandboxCredentialEnvironment,\n debug,\n permissionMode,\n builtinToolFiltering,\n sandbox,\n sandboxHomeDir,\n mcpServers,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: ClaudeCodeChannel;\n finishListenerAttachment: (() => void) | undefined;\n /** Undefined on `attach` — the live bridge was spawned by another process. */\n proc: Experimental_SandboxProcess | undefined;\n maxTurns: number | undefined;\n env: Readonly<Record<string, string>> | undefined;\n thinking: ClaudeCodeThinkingConfig;\n effort: 'low' | 'medium' | 'high' | 'xhigh' | 'max' | undefined;\n isResume: boolean;\n continueOnFirstPrompt: boolean;\n /**\n * Exact conversation to rehydrate whenever a fresh SDK query starts. Takes\n * precedence over the `continue` flag, which can only mean \"most recent in\n * this workdir\".\n */\n resumeSessionId?: string;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n sandboxCredentialEnvironment: Record<string, string> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n sandbox: SandboxSession;\n sandboxHomeDir: string;\n mcpServers: Record<string, unknown> | undefined;\n supportsUserMessageResponses: () => boolean;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n /*\n * Force the Claude SDK's `continue: true` on the first prompt only when the\n * bridge was respawned without an exact conversation id (rerun/replay): a\n * fresh bridge process treats its first turn as new, so it must be told to\n * rehydrate the workdir thread. Exact ids are sent independently of this\n * fallback on every fresh query.\n */\n let pendingResumeFlag = continueOnFirstPrompt;\n\n /*\n * The Claude conversation this session currently embodies. Seeded from the\n * resume state and updated from every `finish` part's metadata — each turn\n * may fork a new id, so the latest observation is the one a later\n * stop/detach must record for exact resume.\n */\n let lastClaudeSessionId = resumeSessionId;\n\n /*\n * Wire the channel into one turn's worth of events and return the control\n * surface. Shared by `doPromptTurn` (which sends a `start` afterwards) and\n * `doContinueTurn` (which attaches to an already-running/replayed turn, or sends\n * a rerun `start`). The only difference between the two entry points is the\n * `start` message, not the listener/abort/settle plumbing.\n */\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const userMessageSubmitter = supportsUserMessageResponses()\n ? experimental_createBridgeUserMessageSubmitter({\n send: message => channel.send(message),\n onResponse: listener => channel.on('user-message-response', listener),\n onReconnect: listener => channel.onReconnect(listener),\n })\n : undefined;\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n userMessageSubmitter?.close();\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n userMessageSubmitter?.close(err);\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-input-start',\n 'tool-input-delta',\n 'tool-input-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n const metadata = (\n msg as {\n harnessMetadata?: { 'claude-code'?: { sessionId?: unknown } };\n }\n ).harnessMetadata?.['claude-code']?.sessionId;\n if (typeof metadata === 'string' && metadata.length > 0) {\n lastClaudeSessionId = metadata;\n }\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n finishListenerAttachment?.();\n finishListenerAttachment = undefined;\n\n /*\n * A `'suspended'` close is a graceful slice-boundary freeze the host\n * initiated (`doSuspendTurn`): the turn keeps running in the bridge and its\n * tail is replayed to the next process, so wind this turn down cleanly\n * rather than failing it. Any other close mid-turn is an unexpected drop.\n */\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('claude-code bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n ...(input.toolResult !== undefined\n ? { toolResult: input.toolResult }\n : {}),\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n ...(userMessageSubmitter == null\n ? {}\n : {\n submitUserMessage: async (text: string) => {\n await userMessageSubmitter.submit(text);\n },\n }),\n done,\n };\n };\n\n const prepareTurn = async (turnOpts: {\n responseFormat?: HarnessV1ResponseFormat;\n skills: ReadonlyArray<HarnessV1Skill>;\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): Promise<HarnessV1PromptControl> => {\n if (\n turnOpts.responseFormat?.type === 'json' &&\n turnOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'claude-code' requires a JSON schema for structured output.\",\n harnessId: 'claude-code',\n });\n }\n await writeSkills({\n sandbox,\n homePath: sandboxHomeDir,\n skillsDir: '.claude/skills',\n skills: turnOpts.skills,\n abortSignal: turnOpts.abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid Claude Code skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid Claude Code skill file path for ${skillName}: ${filePath}`,\n trailingNewline: true,\n });\n return wireTurn({\n emit: turnOpts.emit,\n abortSignal: turnOpts.abortSignal,\n });\n };\n\n return {\n sessionId,\n isResume,\n doPromptTurn: async promptOpts => {\n const control = await prepareTurn(promptOpts);\n\n /*\n * A signal that was already aborted has settled the turn inside\n * `wireTurn`. Sending `start` anyway would run a full unattended turn\n * in the bridge — consuming tokens and possibly acting on the\n * workspace — after the caller has already observed the abort.\n */\n if (promptOpts.abortSignal?.aborted) {\n return control;\n }\n\n const startMessage = {\n type: 'start' as const,\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.responseFormat == null\n ? {}\n : { responseFormat: promptOpts.responseFormat }),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n model: promptOpts.model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(effort !== undefined ? { effort } : {}),\n ...(promptOpts.skills.length > 0\n ? { skills: promptOpts.skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n ...(lastClaudeSessionId\n ? { resumeSessionId: lastClaudeSessionId }\n : pendingResumeFlag\n ? { continue: true }\n : {}),\n };\n pendingResumeFlag = false;\n channel.send(startMessage);\n\n return control;\n },\n doContinueTurn: async continueOpts => {\n const control = await prepareTurn(continueOpts);\n\n /*\n * attach / replay: the still-running (or disk-replayed) turn streams into\n * the wired listeners — `doStart` opened the channel with `{ resume: true }`\n * so the bridge replays everything past the persisted cursor (including a\n * `finish` if the turn ended during the gap). No `start` is sent: issuing\n * one would clear the bridge's replay log and begin a new turn. Lossless.\n *\n * rerun: the bridge was respawned with no in-flight turn to attach to, so\n * re-drive the runtime's own thread from the workdir snapshot via\n * `continue: true`. Lossy — work in flight at the suspension is\n * recomputed. This is the rare bridge-died fallback; the common slice path\n * is `attach`.\n */\n // Same as `doPromptTurn`: an already-aborted signal settled the turn in\n // `wireTurn`, so don't re-drive the thread nobody is waiting on.\n if (rerunContinue && !continueOpts.abortSignal?.aborted) {\n pendingResumeFlag = false;\n channel.send({\n type: 'start' as const,\n /*\n * A continuation nudge rather than an empty prompt: `continue: true`\n * rehydrates the prior thread, and this is the new user turn that\n * drives it forward. It must be non-empty — an empty text block is\n * rejected by the Anthropic API once the SDK stamps it with\n * `cache_control`.\n */\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.responseFormat == null\n ? {}\n : { responseFormat: continueOpts.responseFormat }),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n model: continueOpts.model,\n maxTurns,\n ...(env !== undefined ? { env } : {}),\n thinking,\n ...(effort !== undefined ? { effort } : {}),\n ...(continueOpts.skills.length > 0\n ? { skills: continueOpts.skills.map(skill => skill.name) }\n : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(debug ? { debug } : {}),\n ...(lastClaudeSessionId\n ? { resumeSessionId: lastClaudeSessionId }\n : { continue: true }),\n });\n }\n\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n /*\n * Claude Code has no SDK/control method for compaction — the supported\n * trigger is the `/compact` slash command submitted as user input. Ride\n * the existing user-message rail; the bridge feeds it into the streaming\n * query input and Claude's native compaction handles the rest, emitting a\n * `compact_boundary` + `PostCompact` we observe as a `compaction` event.\n */\n const text =\n customInstructions && customInstructions.trim()\n ? `/compact ${customInstructions.trim()}`\n : '/compact';\n channel.send({ type: 'user-message', text });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n ...(lastClaudeSessionId\n ? { claudeSessionId: lastClaudeSessionId }\n : {}),\n },\n };\n return payload;\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n // Tell the channel we are tearing down so the bridge's post-shutdown\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n /*\n * If the bridge's channel already closed (e.g. mid-turn WS drop)\n * there is no one to acknowledge a `stop` message. Synthesize an empty\n * payload — for Claude Code the resume state structurally is `{}`\n * (the conversation lives in the workdir, captured by the sandbox\n * snapshot during the subsequent `sandboxSession.stop()`), so we\n * lose nothing by skipping the round-trip.\n */\n // Tell the channel we are tearing down so the bridge's post-stop\n // socket close finalises instead of triggering a reconnect.\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `claude-code session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n // The bridge exits itself after sending bridge-stop. Give\n // it a moment, then ensure the process is reaped and the channel\n // closed.\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const lifecycleData =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? { ...(data as Record<string, unknown>) }\n : {};\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n // The bridge's stop reply carries the session id it observed; the\n // adapter's own record backfills it when the reply predates the\n // field or the channel was already closed.\n data: {\n ...(lastClaudeSessionId\n ? { claudeSessionId: lastClaudeSessionId }\n : {}),\n ...lifecycleData,\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n } as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `claude-code session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n /*\n * Freeze the host at a precise cursor without stopping the active model\n * turn. `channel.suspend` stops processing inbound frames, drains what\n * was already dispatched, then closes the host socket with reason\n * `'suspended'`. The bridge keeps the turn running and accumulates events\n * past the cursor for the next slice to replay. The sandbox process is\n * deliberately left alive.\n */\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'claude-code',\n specificationVersion: 'harness-v1',\n data: {\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n ...(lastClaudeSessionId\n ? { claudeSessionId: lastClaudeSessionId }\n : {}),\n },\n };\n return payload;\n },\n };\n}\n\n/*\n * Reduce a `HarnessV1Prompt` to the plain user text the bridge forwards\n * to the Claude SDK. File and image parts on the message are not yet\n * supported by the underlying runtime — throw rather than silently drop\n * them so callers learn about the gap instead of seeing mysteriously\n * truncated prompts.\n */\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'claude-code',\n message: `The claude-code harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import type { HarnessV1Bootstrap } from '@ai-sdk/harness';\nimport { createReadBridgeAsset } from '@ai-sdk/harness/utils';\n\n/*\n * Keep every asset URL literal so bundlers can emit each file separately.\n * Dynamic new URL() paths can collapse multiple assets into one resolution.\n */\nconst readBridgeAsset = createReadBridgeAsset({\n 'package.json': new URL('./bridge/package.json', import.meta.url),\n 'pnpm-lock.yaml': new URL('./bridge/pnpm-lock.yaml', import.meta.url),\n 'pnpm-workspace.yaml': new URL(\n './bridge/pnpm-workspace.yaml',\n import.meta.url,\n ),\n 'index.mjs': new URL('./bridge/index.mjs', import.meta.url),\n});\n\n/*\n * Bootstrap is derived state stored under `$HOME/.ai-sdk-harness`, outside\n * the agent's working directory. Snapshot-capable providers preserve the\n * installed CLI, bridge, and recipe marker there.\n *\n * The session work dir (`startOpts.sessionWorkDir`) lives under the sandbox's\n * default working directory, while the bridge-state dir lives under\n * `$HOME/.ai-sdk-harness/.agent-runs`. Claude's project history is keyed by\n * the working directory, so the same work dir is needed across resumes.\n */\nexport const CLAUDE_CODE_BOOTSTRAP_DIR = '.harness-bootstrap/claude-code';\n\nlet cachedBootstrap: HarnessV1Bootstrap | undefined;\n\nexport async function getClaudeCodeBootstrap(): Promise<HarnessV1Bootstrap> {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, workspace, bridge] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('pnpm-workspace.yaml'),\n readBridgeAsset('index.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'claude-code',\n bootstrapDir: CLAUDE_CODE_BOOTSTRAP_DIR,\n files: [\n { path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n {\n path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/pnpm-workspace.yaml`,\n content: workspace,\n },\n { path: `${CLAUDE_CODE_BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: './node_modules/.bin/claude --version',\n },\n ],\n };\n return cachedBootstrap;\n}\n","import { execFileSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type {\n HarnessV1Authentication,\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n isHarnessAuthenticationEnvironment,\n} from '@ai-sdk/harness/utils';\n\nexport const CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [\n 'AI_GATEWAY_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n 'CLAUDE_CODE_OAUTH_TOKEN',\n] as const;\n\nexport function createClaudeCodeRequestTransformations({\n env: environment,\n sandboxEnv: sandboxEnvironment,\n auth: authenticationMode,\n}: HarnessV1RequestTransformationSources<ClaudeCodeResolvedAuthenticationMode>): HarnessV1RequestTransformation[] {\n const matchUrl =\n authenticationMode === 'ai-gateway'\n ? environment.ANTHROPIC_BASE_URL\n : (environment.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com');\n const transformations: HarnessV1RequestTransformation[] = [];\n\n if (\n environment.ANTHROPIC_API_KEY != null &&\n sandboxEnvironment.ANTHROPIC_API_KEY != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n 'x-api-key': sandboxEnvironment.ANTHROPIC_API_KEY,\n },\n transformHeaders: {\n 'x-api-key': environment.ANTHROPIC_API_KEY,\n },\n }),\n );\n }\n\n if (\n environment.ANTHROPIC_AUTH_TOKEN != null &&\n sandboxEnvironment.ANTHROPIC_AUTH_TOKEN != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.ANTHROPIC_AUTH_TOKEN}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.ANTHROPIC_AUTH_TOKEN}`,\n },\n }),\n );\n }\n\n return transformations;\n}\n\nexport type ClaudeCodeResolvedAuthenticationMode = 'direct' | 'ai-gateway';\n\nexport type ClaudeCodeAuthenticationMode = HarnessV1Authentication;\n\n/**\n * Resolve the environment-variable blob the bridge needs to authenticate\n * with Anthropic (directly or via the Vercel AI Gateway). Precedence:\n *\n * 1. An explicit authentication mode pins the selected route.\n * 2. Auto-detect from the host process env: gateway first\n * (`AI_GATEWAY_API_KEY` / `VERCEL_OIDC_TOKEN`), then direct\n * (`ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN`).\n */\nexport type ResolveClaudeCodeEnvOptions = {\n /**\n * Returns an API key from a custom source (e.g. a password manager).\n * Used as the last-resort fallback in the auto-detect branch when no\n * static env vars or explicit auth are configured. Defaults to running\n * the `apiKeyHelper` command from `~/.claude/settings.json`, matching\n * the `claude` CLI's own behaviour.\n */\n readApiKeyHelper?: () => string | undefined;\n};\n\nexport function resolveClaudeCodeEnv(\n auth: ClaudeCodeAuthenticationMode | undefined,\n processEnv: Record<string, string | undefined> = process.env,\n options: ResolveClaudeCodeEnvOptions = {},\n): Record<string, string> {\n const suppliedEnvironment = isHarnessAuthenticationEnvironment(auth);\n const authenticationEnvironment = suppliedEnvironment ? auth : processEnv;\n\n const readApiKey =\n suppliedEnvironment || auth === 'direct'\n ? () => undefined\n : (options.readApiKeyHelper ?? readApiKeyHelper);\n if (auth === 'direct') {\n return pickAnthropic({\n processEnv: authenticationEnvironment,\n readApiKey,\n });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({\n env: authenticationEnvironment,\n });\n if (auth === 'ai-gateway' || gatewayAuthFromEnv.apiKey) {\n return pickGateway({ gatewayAuthFromEnv });\n }\n\n return pickAnthropic({\n processEnv: authenticationEnvironment,\n readApiKey,\n });\n}\n\nexport function resolveClaudeCodeAuthenticationMode(\n auth: ClaudeCodeAuthenticationMode | undefined,\n processEnv: Record<string, string | undefined> = process.env,\n): ClaudeCodeResolvedAuthenticationMode {\n if (isHarnessAuthenticationEnvironment(auth)) {\n return getAiGatewayAuthFromEnv({ env: auth }).apiKey\n ? 'ai-gateway'\n : 'direct';\n }\n if (auth === 'direct') {\n return 'direct';\n }\n if (auth === 'ai-gateway') {\n return 'ai-gateway';\n }\n return getAiGatewayAuthFromEnv({ env: processEnv }).apiKey\n ? 'ai-gateway'\n : 'direct';\n}\n\nfunction pickAnthropic({\n processEnv,\n readApiKey,\n}: {\n processEnv: Record<string, string | undefined>;\n readApiKey: () => string | undefined;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const helperKey = readApiKey();\n const apiKey = processEnv.ANTHROPIC_API_KEY ?? helperKey;\n const authToken = processEnv.ANTHROPIC_AUTH_TOKEN ?? helperKey;\n const oauthToken = processEnv.CLAUDE_CODE_OAUTH_TOKEN;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n if (oauthToken) env.CLAUDE_CODE_OAUTH_TOKEN = oauthToken;\n const baseUrl = processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\n/**\n * Read the `apiKeyHelper` setting from `~/.claude/settings.json` and run\n * it. The `claude` CLI uses this hook to fetch credentials from password\n * managers and similar tools; mirroring it here lets users with that\n * setup run the harness without having to set `ANTHROPIC_API_KEY`\n * explicitly.\n */\nfunction readApiKeyHelper(): string | undefined {\n const home = homedir();\n if (!home) return undefined;\n let raw: string;\n try {\n raw = readFileSync(join(home, '.claude', 'settings.json'), 'utf8');\n } catch {\n return undefined;\n }\n let settings: { apiKeyHelper?: unknown };\n try {\n settings = JSON.parse(raw);\n } catch {\n return undefined;\n }\n const command = settings.apiKeyHelper;\n if (typeof command !== 'string' || command.length === 0) return undefined;\n try {\n const output = execFileSync('sh', ['-c', command], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const trimmed = output.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction pickGateway({\n gatewayAuthFromEnv,\n}: {\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const apiKey = gatewayAuthFromEnv.apiKey;\n const baseUrl = gatewayAuthFromEnv.baseUrl;\n const env: Record<string, string> = {};\n if (apiKey) {\n env.AI_GATEWAY_API_KEY = apiKey;\n env.ANTHROPIC_API_KEY = apiKey;\n }\n env.AI_GATEWAY_BASE_URL = baseUrl;\n env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n","import { execFileSync } from 'node:child_process';\nimport { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport type {\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n isAccessTokenExpiringSoon,\n isHarnessAuthenticationEnvironment,\n isMacOS,\n readMacOSKeychainPassword,\n refreshOAuthAccessToken,\n shouldResolveNativeSubscription,\n} from '@ai-sdk/harness/utils';\nimport { isRecord, safeParseJSON } from '@ai-sdk/provider-utils';\nimport {\n resolveClaudeCodeEnv,\n type ClaudeCodeAuthenticationMode,\n type ClaudeCodeResolvedAuthenticationMode,\n type ResolveClaudeCodeEnvOptions,\n} from './claude-code-auth';\n\nconst CLAUDE_TOKEN_URL = 'https://platform.claude.com/v1/oauth/token';\nconst CLAUDE_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';\n\nexport function createClaudeCodeSubscriptionRequestTransformations({\n env: environment,\n sandboxEnv: sandboxEnvironment,\n auth: authenticationMode,\n}: HarnessV1RequestTransformationSources<ClaudeCodeResolvedAuthenticationMode>): HarnessV1RequestTransformation[] {\n if (\n environment.CLAUDE_CODE_OAUTH_TOKEN == null ||\n sandboxEnvironment.CLAUDE_CODE_OAUTH_TOKEN == null\n ) {\n return [];\n }\n return [\n createCredentialRequestTransformation({\n matchUrl:\n authenticationMode === 'ai-gateway'\n ? environment.ANTHROPIC_BASE_URL\n : (environment.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com'),\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.CLAUDE_CODE_OAUTH_TOKEN}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.CLAUDE_CODE_OAUTH_TOKEN}`,\n },\n }),\n ];\n}\n\nexport async function resolveClaudeCodeAuthentication({\n auth,\n processEnv = process.env,\n options = {},\n readSubscription = readClaudeCodeSubscription,\n}: {\n auth: ClaudeCodeAuthenticationMode | undefined;\n processEnv?: Record<string, string | undefined>;\n options?: ResolveClaudeCodeEnvOptions;\n readSubscription?: () => Promise<Record<string, string> | undefined>;\n}): Promise<Record<string, string>> {\n const environmentWithoutHelper = resolveClaudeCodeEnv(auth, processEnv, {\n readApiKeyHelper: () => undefined,\n });\n if (isHarnessAuthenticationEnvironment(auth)) {\n return environmentWithoutHelper;\n }\n if (\n !shouldResolveNativeSubscription({\n auth,\n env: environmentWithoutHelper,\n hasDirectCredential:\n environmentWithoutHelper.ANTHROPIC_API_KEY != null ||\n environmentWithoutHelper.ANTHROPIC_AUTH_TOKEN != null ||\n environmentWithoutHelper.CLAUDE_CODE_OAUTH_TOKEN != null,\n })\n ) {\n return environmentWithoutHelper;\n }\n\n return (\n (await readSubscription()) ??\n resolveClaudeCodeEnv(auth, processEnv, options)\n );\n}\n\nexport async function readClaudeCodeSubscription({\n env = process.env,\n homeDirectory = homedir(),\n platform = process.platform,\n fetch,\n}: {\n env?: Record<string, string | undefined>;\n homeDirectory?: string;\n platform?: NodeJS.Platform;\n fetch?: typeof globalThis.fetch;\n} = {}): Promise<Record<string, string> | undefined> {\n const configDirectory = resolve(\n env.CLAUDE_CONFIG_DIR ?? join(homeDirectory, '.claude'),\n );\n const credentialPath = join(configDirectory, '.credentials.json');\n const stored = await readClaudeCredentialStore({\n credentialPath,\n homeDirectory,\n configDirectory,\n platform,\n });\n if (stored == null) return undefined;\n const oauth = getClaudeOAuthCredential({ value: stored.value });\n if (oauth == null) return undefined;\n const { accessToken, refreshToken, expiresAt } = oauth;\n\n let resolvedAccessToken = accessToken;\n if (isAccessTokenExpiringSoon({ expiresAt })) {\n const refreshed = await refreshOAuthAccessToken({\n tokenUrl: CLAUDE_TOKEN_URL,\n clientId: CLAUDE_CLIENT_ID,\n refreshToken,\n requestFormat: 'json',\n ...(fetch == null ? {} : { fetch }),\n });\n resolvedAccessToken = refreshed.accessToken;\n await stored.write({\n ...stored.value,\n claudeAiOauth: {\n ...oauth,\n accessToken: refreshed.accessToken,\n refreshToken: refreshed.refreshToken ?? refreshToken,\n expiresAt: refreshed.expiresAt,\n },\n });\n }\n\n return {\n CLAUDE_CODE_OAUTH_TOKEN: resolvedAccessToken,\n ANTHROPIC_BASE_URL: 'https://api.anthropic.com',\n };\n}\n\ntype ClaudeCredentialFile = {\n readonly claudeAiOauth?: unknown;\n readonly [key: string]: unknown;\n};\n\ntype ClaudeOAuthCredential = Record<string, unknown> & {\n readonly accessToken: string;\n readonly refreshToken: string;\n readonly expiresAt: number;\n};\n\nasync function readClaudeCredentialStore({\n credentialPath,\n homeDirectory,\n configDirectory,\n platform,\n}: {\n credentialPath: string;\n homeDirectory: string;\n configDirectory: string;\n platform: NodeJS.Platform;\n}): Promise<\n | {\n value: ClaudeCredentialFile;\n write(value: ClaudeCredentialFile): Promise<void>;\n }\n | undefined\n> {\n const text = await readFile(credentialPath, 'utf8').catch(() => undefined);\n if (text != null) {\n const value = await parseClaudeCredentialFile(text);\n if (value != null && getClaudeOAuthCredential({ value }) != null) {\n return {\n value,\n write: updated =>\n writeClaudeCredentialFile({ credentialPath, value: updated }),\n };\n }\n }\n\n if (!isMacOS(platform)) return undefined;\n if (configDirectory !== resolve(join(homeDirectory, '.claude'))) {\n return undefined;\n }\n const service = 'Claude Code-credentials';\n const keychainText = await readMacOSKeychainPassword({\n service,\n account: process.env.USER ?? '',\n });\n if (keychainText == null) return undefined;\n const value = await parseClaudeCredentialFile(keychainText);\n if (value == null) return undefined;\n return {\n value,\n write: async updated => {\n execFileSync(\n '/usr/bin/security',\n [\n 'add-generic-password',\n '-U',\n '-s',\n service,\n '-a',\n process.env.USER ?? '',\n '-w',\n JSON.stringify(updated),\n ],\n { stdio: 'ignore' },\n );\n },\n };\n}\n\nfunction getClaudeOAuthCredential({\n value,\n}: {\n value: ClaudeCredentialFile;\n}): ClaudeOAuthCredential | undefined {\n const oauth = value.claudeAiOauth;\n if (\n !isRecord(oauth) ||\n typeof oauth.accessToken !== 'string' ||\n typeof oauth.refreshToken !== 'string' ||\n typeof oauth.expiresAt !== 'number'\n ) {\n return undefined;\n }\n return oauth as ClaudeOAuthCredential;\n}\n\nasync function parseClaudeCredentialFile(\n text: string,\n): Promise<ClaudeCredentialFile | undefined> {\n const parsed = await safeParseJSON({ text });\n return parsed.success && isRecord(parsed.value)\n ? (parsed.value as ClaudeCredentialFile)\n : undefined;\n}\n\nasync function writeClaudeCredentialFile({\n credentialPath,\n value,\n}: {\n credentialPath: string;\n value: ClaudeCredentialFile;\n}): Promise<void> {\n await mkdir(dirname(credentialPath), { recursive: true });\n const temporaryPath = `${credentialPath}.${process.pid}.tmp`;\n await writeFile(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, {\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, credentialPath);\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\n/*\n * Claude Code's bridge wire protocol. The outbound events, transport frames,\n * shared inbound commands, and `bridge-ready` line all come from the shared\n * `@ai-sdk/harness` protocol — the only Claude-specific piece is the `start`\n * payload, which carries Claude SDK configuration.\n */\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nconst thinkingDisplaySchema = z.enum(['summarized', 'omitted']).optional();\n\nconst thinkingSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('adaptive'),\n display: thinkingDisplaySchema,\n }),\n z.object({\n type: z.literal('enabled'),\n display: thinkingDisplaySchema,\n }),\n z.object({ type: z.literal('disabled') }),\n]);\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n instructions: z.string().optional(),\n thinking: thinkingSchema,\n effort: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n maxTurns: z.number().optional(),\n env: z.record(z.string(), z.string()).optional(),\n skills: z.array(z.string()).optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n // Resume signal. When true, the bridge passes `{ continue: true }` to the\n // Claude SDK so the in-workdir thread state is rehydrated. The host sets this\n // on the first prompt after a cross-process resume.\n continue: z.boolean().optional(),\n // Exact conversation to resume, as the Claude SDK's `resume` option.\n //\n // Preferred over `continue` whenever the host knows which conversation it\n // means: `continue` resolves to the most recent thread in the workdir, which\n // is the wrong one as soon as anything else has run there since — including\n // a resume that itself started a new thread. Mutually exclusive with\n // `continue` in the SDK, so the bridge sends one or the other.\n resumeSessionId: z.string().optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createClaudeCode } from './claude-code-harness';\n\n/**\n * Default `claude-code` harness instance with no overrides — suitable for the\n * common case where the underlying `claude` CLI's defaults are fine.\n * Equivalent to `createClaudeCode()`.\n */\nexport const claudeCode = createClaudeCode();\n\nexport { createClaudeCode } from './claude-code-harness';\nexport { VERSION } from './version';\nexport type { ClaudeCodeHarnessSettings } from './claude-code-harness';\nexport type { ClaudeCodeAuthenticationMode } from './claude-code-auth';\nexport type { ClaudeCodeThinkingConfig } from './claude-code-thinking';\n"],"mappings":"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","names":["safeParseJSON","z","execFileSync","homedir","join","createCredentialRequestTransformation","isHarnessAuthenticationEnvironment","createCredentialRequestTransformation","isHarnessAuthenticationEnvironment","homedir","join","value","execFileSync","z","endpoint","finishListenerAttachment","proc","resolve","safeParseJSON"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/harness-claude-code",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.137",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ai-sdk/harness": "1.0.
|
|
29
|
+
"@ai-sdk/harness": "1.0.133",
|
|
30
30
|
"@ai-sdk/provider-utils": "5.0.51",
|
|
31
31
|
"ws": "^8.21.0"
|
|
32
32
|
},
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
applyCredentialForwarding,
|
|
29
29
|
classifyDiskLog,
|
|
30
|
-
|
|
30
|
+
resolveSandboxCredentialEnvironment,
|
|
31
31
|
createBridgeToken,
|
|
32
32
|
experimental_createBridgeUserMessageSubmitter,
|
|
33
33
|
createBridgeErrorHandler,
|
|
@@ -887,13 +887,14 @@ export function createClaudeCode(
|
|
|
887
887
|
sandboxSession.addRequestTransformations != null
|
|
888
888
|
) {
|
|
889
889
|
sandboxCredentialEnvironment =
|
|
890
|
-
|
|
891
|
-
(await createSandboxCredentialEnvironment({
|
|
890
|
+
await resolveSandboxCredentialEnvironment({
|
|
892
891
|
environment: claudeEnvironment,
|
|
893
892
|
credentialEnvironmentVariables:
|
|
894
893
|
CLAUDE_CODE_CREDENTIAL_ENVIRONMENT_VARIABLES,
|
|
895
894
|
credentialForwarding: settings.credentialForwarding,
|
|
896
|
-
|
|
895
|
+
previousSandboxCredentialEnvironment:
|
|
896
|
+
resumeData?.sandboxCredentialEnvironment,
|
|
897
|
+
});
|
|
897
898
|
sandboxClaudeEnvironment = {
|
|
898
899
|
...claudeEnvironment,
|
|
899
900
|
...sandboxCredentialEnvironment,
|