@ai-sdk/harness-acp 1.0.58 → 1.0.59

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # @ai-sdk/harness-acp
2
2
 
3
+ ## 1.0.59
4
+
5
+ ### Patch Changes
6
+
7
+ - 3ea56bc: fix(harness): make bridge asset resolution compatible with Turbopack (and thus Next.js 16)
8
+ - Updated dependencies [3ea56bc]
9
+ - @ai-sdk/harness@1.0.121
10
+
3
11
  ## 1.0.58
4
12
 
5
13
  ### Patch Changes
@@ -12,7 +12,7 @@ import {
12
12
  ListToolsRequestSchema,
13
13
  McpError
14
14
  } from "@modelcontextprotocol/sdk/types.js";
15
- var VERSION = true ? "1.0.58" : "0.0.0-test";
15
+ var VERSION = true ? "1.0.59" : "0.0.0-test";
16
16
  function createHostToolMCPServer({
17
17
  tools: tools2,
18
18
  revision = 1,
@@ -2416,7 +2416,7 @@ import {
2416
2416
  ListToolsRequestSchema,
2417
2417
  McpError
2418
2418
  } from "@modelcontextprotocol/sdk/types.js";
2419
- var VERSION = true ? "1.0.58" : "0.0.0-test";
2419
+ var VERSION = true ? "1.0.59" : "0.0.0-test";
2420
2420
  function createHostToolMCPServer({
2421
2421
  tools,
2422
2422
  revision = 1,
package/dist/index.js CHANGED
@@ -484,7 +484,10 @@ function sortValue({ value }) {
484
484
  // src/v1/acp-v1-bootstrap.ts
485
485
  import { createReadBridgeAsset } from "@ai-sdk/harness/utils";
486
486
  var readBridgeAsset = createReadBridgeAsset({
487
- resolveAssetUrl: (name) => new URL(`./bridge/${name}`, import.meta.url)
487
+ "package.json": new URL("./bridge/package.json", import.meta.url),
488
+ "pnpm-lock.yaml": new URL("./bridge/pnpm-lock.yaml", import.meta.url),
489
+ "index.mjs": new URL("./bridge/index.mjs", import.meta.url),
490
+ "host-tool-mcp.mjs": new URL("./bridge/host-tool-mcp.mjs", import.meta.url)
488
491
  });
489
492
  function createACPBootstrap({
490
493
  harnessId,
@@ -2917,7 +2920,7 @@ function deserializeBridgeError({
2917
2920
  }
2918
2921
 
2919
2922
  // src/version.ts
2920
- var VERSION = true ? "1.0.58" : "0.0.0-test";
2923
+ var VERSION = true ? "1.0.59" : "0.0.0-test";
2921
2924
 
2922
2925
  // src/acp-harness.ts
2923
2926
  var ACP_CLIENT_APP = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/acp-harness.ts","../src/v1/acp-v1-harness.ts","../src/acp-auth.ts","../src/v1/implementation.ts","../src/v1/acp-v1-bootstrap.ts","../src/v1/acp-v1-bridge-protocol.ts","../src/v1/acp-v1-prompt.ts","../src/v1/bridge/acp-v1-bridge-environment.ts","../src/v1/bridge/profile-values.ts","../src/v1/bridge/protocol-configuration.ts","../src/v1/acp-v1-turn-start-config.ts","../src/v1/acp-v1-lifecycle.ts","../src/v1/acp-v1-skills.ts","../src/version.ts"],"sourcesContent":["import {\n HARNESS_V1_BUILTIN_TOOLS,\n type HarnessV1,\n type HarnessV1CredentialForwarding,\n type HarnessV1MintBridgeTokenCallback,\n type HarnessV1PortEndpoint,\n} from '@ai-sdk/harness';\nimport type { SandboxChannelReconnectOptions } from '@ai-sdk/harness/utils';\nimport type { ToolSet } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ACPAuthenticationMode, ACPClientApp } from './acp-auth';\nimport type { ACPToolCall } from './acp-tool-call';\nimport {\n createACPV1,\n type ACPAskUserQuestionsSettings,\n type ACPV1Settings,\n} from './v1';\nimport {\n acpColdSessionStateSchema,\n acpTurnStartConfigSchema,\n} from './v1/acp-v1-bridge-protocol';\nimport { VERSION } from './version';\n\nconst ACP_CLIENT_APP = {\n name: 'ai-sdk/harness-acp',\n version: VERSION,\n} as const satisfies ACPClientApp;\n\nexport type ACPHarnessSettings<\n TBuiltinTools extends ToolSet = {},\n TAskUserQuestions extends ACPAskUserQuestionsSettings | undefined =\n | ACPAskUserQuestionsSettings\n | undefined,\n> = {\n readonly builtinTools?: TBuiltinTools;\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 readonly isMcpToolCall?: (toolCall: ACPToolCall) => boolean;\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 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 readonly clientApp?: ACPClientApp;\n readonly version?: ACPV1Settings['version'];\n readonly harnessId: ACPV1Settings['harnessId'];\n readonly auth?: ACPAuthenticationMode;\n readonly resolveAuthenticationEnvironment?: ACPV1Settings['resolveAuthenticationEnvironment'];\n readonly source: ACPV1Settings['source'];\n readonly executable: ACPV1Settings['executable'];\n readonly args?: ACPV1Settings['args'];\n readonly forwardEnv?: ACPV1Settings['forwardEnv'];\n readonly credentialEnv?: ACPV1Settings['credentialEnv'];\n readonly credentialBrokering?: ACPV1Settings['credentialBrokering'];\n readonly authenticationFiles?: ACPV1Settings['authenticationFiles'];\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 readonly env?: ACPV1Settings['env'];\n readonly authentication?: ACPV1Settings['authentication'];\n readonly clientCapabilities?: ACPV1Settings['clientCapabilities'];\n readonly providerAuthentication?: ACPV1Settings['providerAuthentication'];\n /**\n * Maps the HarnessAgent model identifier to an ACP session operation.\n */\n readonly modelMapping: ACPV1Settings['modelMapping'];\n readonly skillsDirectory?: ACPV1Settings['skillsDirectory'];\n readonly instructionMapping?: ACPV1Settings['instructionMapping'];\n readonly outputSchemaMapping?: ACPV1Settings['outputSchemaMapping'];\n /**\n * Transport used for the harness-owned MCP server that exposes host tools to\n * the ACP implementation. Defaults to `stdio`. Set this to `http` for\n * implementations that only accept HTTP or SSE MCP servers from the client,\n * which requires the implementation to advertise\n * `agentCapabilities.mcpCapabilities.http`.\n */\n readonly hostToolMcpTransport?: ACPV1Settings['hostToolMcpTransport'];\n readonly askUserQuestions?: TAskUserQuestions;\n readonly permissionModeMapping?: ACPV1Settings['permissionModeMapping'];\n readonly session?: ACPV1Settings['session'];\n readonly mintBridgeToken?: HarnessV1MintBridgeTokenCallback;\n};\n\nconst ACP_BUILTIN_TOOLS = {} as const satisfies ToolSet;\n\nconst acpBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n stateDir: z.string().optional(),\n});\n\nconst acpResumeStateSchema = z.object({\n implementationIdentity: z.string(),\n authenticationProfile: z\n .object({\n digest: z.string(),\n acpMethodId: z.string().optional(),\n providerKind: z\n .enum(['implementation-default', 'direct', 'ai-gateway'])\n .transform(value =>\n value === 'implementation-default' ? 'direct' : value,\n ),\n providerMode: z.enum(['auto', 'direct', 'ai-gateway']).optional(),\n gatewayCredentialSource: z\n .enum(['AI_GATEWAY_API_KEY', 'VERCEL_OIDC_TOKEN'])\n .nullable()\n .optional(),\n })\n .optional(),\n sandboxCredentialEnvironment: z.record(z.string(), z.string()).optional(),\n acpSessionId: z.string().optional(),\n bridge: acpBridgeCoordsSchema.optional(),\n coldSession: acpColdSessionStateSchema.optional(),\n turnStartConfig: acpTurnStartConfigSchema.optional(),\n recovery: z\n .object({\n mode: z.enum(['disk-replay', 'lossy-rerun']),\n reason: z.string(),\n })\n .optional(),\n restoration: z\n .object({\n method: z.enum(['resume', 'load']),\n })\n .optional(),\n initialGuidanceApplied: z.boolean().optional(),\n instructionsFingerprint: z.string().optional(),\n skillsDirectory: z.string().optional(),\n});\n\ntype ACPBridgeCoords = z.infer<typeof acpBridgeCoordsSchema>;\n\ntype ACPHarnessTools<\n TBuiltinTools extends ToolSet,\n TAskUserQuestions,\n> = TBuiltinTools &\n ([TAskUserQuestions] extends [undefined]\n ? {}\n : {\n askUserQuestions: typeof HARNESS_V1_BUILTIN_TOOLS.askUserQuestions;\n });\n\nexport function createACP<\n TBuiltinTools extends ToolSet = {},\n TAskUserQuestions extends ACPAskUserQuestionsSettings | undefined = undefined,\n>(\n settings: ACPHarnessSettings<TBuiltinTools, TAskUserQuestions>,\n): HarnessV1<ACPHarnessTools<TBuiltinTools, TAskUserQuestions>> {\n if (\n (settings.credentialEnv == null) !==\n (settings.credentialBrokering == null)\n ) {\n throw new Error(\n 'ACP credentialEnv and credentialBrokering must be configured together.',\n );\n }\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(\n settings.mcpServers,\n 'ai-sdk-harness-tools',\n )\n ) {\n throw new Error(\n 'ACP MCP server name \"ai-sdk-harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n const version = (settings as { readonly version?: string }).version ?? 'v1';\n switch (version) {\n case 'v1': {\n const clientApp = settings.clientApp ?? ACP_CLIENT_APP;\n const builtinTools =\n settings.askUserQuestions == null\n ? (settings.builtinTools ?? (ACP_BUILTIN_TOOLS as TBuiltinTools))\n : {\n ...(settings.builtinTools ??\n (ACP_BUILTIN_TOOLS as TBuiltinTools)),\n askUserQuestions: HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,\n };\n return createACPV1({\n settings,\n builtinTools,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n startupTimeoutMs: settings.startupTimeoutMs,\n reconnect: settings.reconnect,\n clientApp,\n lifecycleStateSchema: acpResumeStateSchema satisfies z.ZodType<{\n bridge?: ACPBridgeCoords;\n }>,\n }) as HarnessV1<ACPHarnessTools<TBuiltinTools, TAskUserQuestions>>;\n }\n default:\n throw new Error(\n `Unsupported ACP protocol version ${JSON.stringify(version)}. Supported versions: \"v1\".`,\n );\n }\n}\n","import { createHash } from 'node:crypto';\nimport { posix } from 'node:path';\nimport {\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PortEndpoint,\n type HarnessV1PromptControl,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n type HarnessV1ToolSpec,\n} from '@ai-sdk/harness';\nimport { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport {\n applyCredentialForwarding,\n createBridgeToken,\n createBridgeErrorHandler,\n createBridgeStartupError,\n createSandboxCredentialEnvironment,\n classifyDiskLog,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxDefaultWorkingDirectory,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n withBridgeToken,\n writeInstructions,\n writeSkills,\n type SandboxChannelReconnectOptions,\n} from '@ai-sdk/harness/utils';\nimport {\n asSchema,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession as SandboxSession,\n type ToolResultPart,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport {\n createACPAuthenticationProfileIdentity,\n resolveACPAuthenticationEnvironment,\n resolveACPProviderAuthentication,\n resolveACPProviderAuthenticationCompatibility,\n type ACPAuthenticationProfileIdentity,\n type ACPClientApp,\n} from '../acp-auth';\nimport type { ACPToolCall } from '../acp-tool-call';\nimport {\n createACPV1Implementation,\n createImplementationIdentity,\n resolveImplementationEnvironment,\n validateACPV1Implementation,\n} from './implementation';\nimport { createACPBootstrap } from './acp-v1-bootstrap';\nimport {\n outboundMessageSchema,\n type ACPBuiltinToolMapping,\n type ACPColdSessionState,\n type ACPTurnStartConfig,\n type InboundMessage,\n type OutboundMessage,\n type StartMessage,\n} from './acp-v1-bridge-protocol';\nimport { createACPBridgeEnvironment } from './bridge/acp-v1-bridge-environment';\nimport { resolveACPLaunchEnvironment } from './bridge/protocol-configuration';\nimport {\n createACPColdSessionState,\n createACPTurnStartConfig,\n} from './acp-v1-turn-start-config';\nimport {\n resolveACPInitialGuidanceApplied,\n validateACPLifecycleCompatibility,\n type ACPLifecycleData,\n} from './acp-v1-lifecycle';\nimport {\n convertHarnessPromptToACPTextBlocks,\n prependACPInstructionGuidance,\n} from './acp-v1-prompt';\nimport type {\n ACPAskUserQuestionsSettings,\n ACPInstructionMapping,\n ACPModelMapping,\n ACPOutputSchemaMapping,\n ACPPermissionModeMapping,\n ACPPermissionModeTarget,\n ACPProfileValue,\n ACPSerializableValue,\n ACPV1Settings,\n} from './acp-v1-settings';\nimport {\n ACP_SKILL_NAME_PATTERN,\n DEFAULT_ACP_SKILLS_DIRECTORY,\n resolveACPPrivateSessionDirectory,\n resolveACPSkillsDirectory,\n validateACPSkills,\n} from './acp-v1-skills';\n\nconst HARNESS_ID_REGEXP = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\ntype ACPChannel = SandboxChannel<OutboundMessage, InboundMessage>;\n\ntype ACPRespawnStrategy =\n | {\n readonly mode: 'disk-replay';\n readonly reason: string;\n readonly afterSeq: number;\n }\n | {\n readonly mode: 'lossy-rerun';\n readonly reason: string;\n readonly turnStartConfig: ACPTurnStartConfig;\n readonly acpSessionId: string;\n }\n | {\n readonly mode: 'cold-restore';\n readonly turnStartConfig: ACPTurnStartConfig;\n readonly acpSessionId: string;\n };\n\nexport function createACPV1<TBuiltinTools extends ToolSet = {}>({\n settings,\n builtinTools,\n port: portOverride,\n portEndpoint: portEndpointOverride,\n startupTimeoutMs,\n reconnect,\n clientApp,\n lifecycleStateSchema,\n}: {\n settings: ACPV1Settings;\n builtinTools: TBuiltinTools;\n port?: number;\n portEndpoint?: HarnessV1PortEndpoint;\n startupTimeoutMs?: number;\n reconnect?: SandboxChannelReconnectOptions;\n clientApp: ACPClientApp;\n lifecycleStateSchema: NonNullable<\n HarnessV1<TBuiltinTools>['lifecycleStateSchema']\n >;\n}): HarnessV1<TBuiltinTools> {\n if (\n (settings.credentialEnv == null) !==\n (settings.credentialBrokering == null)\n ) {\n throw new Error(\n 'ACP credentialEnv and credentialBrokering must be configured together.',\n );\n }\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(\n settings.mcpServers,\n 'ai-sdk-harness-tools',\n )\n ) {\n throw new Error(\n 'ACP MCP server name \"ai-sdk-harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n if (!HARNESS_ID_REGEXP.test(settings.harnessId)) {\n throw new Error(\n `ACP harnessId must be a stable kebab-case identifier; received ${JSON.stringify(settings.harnessId)}.`,\n );\n }\n const implementation = createACPV1Implementation({ settings });\n validateACPV1Implementation(implementation);\n const bootstrap = createACPBootstrap({\n harnessId: settings.harnessId,\n implementation,\n });\n const permissionModeMapping = isCompletePermissionModeMapping({\n value: settings.permissionModeMapping,\n })\n ? settings.permissionModeMapping\n : undefined;\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: settings.harnessId,\n builtinTools,\n supportsBuiltinToolApprovals: true,\n supportsBuiltinToolFiltering: false,\n lifecycleStateSchema,\n getBootstrap: bootstrap.getBootstrap,\n doStart: async startOptions => {\n if (startOptions.builtinToolFiltering != null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'ACP built-in tool filtering is not available in this initial ACP v1 implementation.',\n });\n }\n const permissionMode = startOptions.permissionMode ?? 'allow-all';\n const env = { ...process.env };\n const authenticationEnvironment =\n settings.resolveAuthenticationEnvironment == null\n ? resolveACPAuthenticationEnvironment({\n auth: settings.auth,\n env,\n })\n : await settings.resolveAuthenticationEnvironment({\n auth: settings.auth,\n env,\n });\n const providerAuthenticationCompatibility =\n resolveACPProviderAuthenticationCompatibility({\n auth: settings.auth,\n providerAuthentication: settings.providerAuthentication,\n env: authenticationEnvironment,\n });\n const implementationIdentity = createImplementationIdentity({\n harnessId: settings.harnessId,\n acpVersion: 'v1',\n implementation,\n clientApp,\n clientCapabilities: settings.clientCapabilities,\n modelMapping: settings.modelMapping,\n providerAuthentication: providerAuthenticationCompatibility,\n permissionModeMapping: settings.permissionModeMapping,\n });\n const authenticationProfile = createACPAuthenticationProfileIdentity({\n authentication: settings.authentication,\n providerAuthenticationCompatibility,\n });\n\n const resolvedProviderAuthentication = resolveACPProviderAuthentication({\n auth: {\n mode: settings.auth,\n providerAuthentication: settings.providerAuthentication,\n clientApp,\n },\n env: authenticationEnvironment,\n compatibility: providerAuthenticationCompatibility,\n });\n const sandboxSession = startOptions.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: portOverride,\n portEndpoint: portEndpointOverride,\n harnessId: settings.harnessId,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message: `The ${settings.harnessId} ACP harness cannot use \\`mintBridgeToken\\` with a sandbox session that does not expose an id.`,\n });\n }\n const defaultWorkingDirectory =\n await resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal: startOptions.abortSignal,\n });\n const continueFrom =\n startOptions.continueFrom ?? startOptions.resumeFrom?.continueFrom;\n const lifecycleState = continueFrom ?? startOptions.resumeFrom;\n const isContinue = continueFrom != null;\n const isResume = lifecycleState != null;\n const lifecycleData =\n lifecycleState != null\n ? (lifecycleState.data as unknown as ACPLifecycleData)\n : undefined;\n if (lifecycleData != null && lifecycleState != null) {\n validateACPLifecycleCompatibility({\n harnessId: settings.harnessId,\n lifecycleHarnessId: lifecycleState.harnessId,\n implementationIdentity,\n authenticationProfile,\n lifecycleData,\n sandboxId,\n });\n }\n const implementationEnvironment = resolveImplementationEnvironment({\n implementation,\n env: { ...env, ...authenticationEnvironment },\n credentialEnv: authenticationEnvironment,\n });\n let sandboxImplementationEnvironment = implementationEnvironment;\n let sandboxProviderAuthenticationEnvironment =\n resolvedProviderAuthentication.env;\n let sandboxProviderEnvironment: Record<string, string> | undefined;\n const credentialEnvironmentVariables = [\n ...new Set([\n ...(settings.credentialEnv ?? []),\n 'AI_GATEWAY_API_KEY',\n 'VERCEL_OIDC_TOKEN',\n ]),\n ];\n const credentialForwardingEnvironmentVariables = [\n ...new Set([\n ...credentialEnvironmentVariables,\n ...resolveACPProviderCredentialEnvironmentVariables({\n providerAuthentication:\n resolvedProviderAuthentication.providerAuthentication,\n }),\n ]),\n ];\n let sandboxCredentialEnvironment:\n | Readonly<Record<string, string>>\n | undefined;\n\n if (\n settings.credentialBrokering != null &&\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n const providerEnvironment = resolveProviderEnvironment({\n resolvedProviderAuthentication,\n clientApp,\n });\n const brokeringEnvironment = {\n ...implementationEnvironment,\n ...providerEnvironment,\n };\n sandboxCredentialEnvironment =\n lifecycleData?.sandboxCredentialEnvironment ??\n (await createSandboxCredentialEnvironment({\n environment: brokeringEnvironment,\n credentialEnvironmentVariables:\n credentialForwardingEnvironmentVariables,\n credentialForwarding: settings.credentialForwarding,\n }));\n sandboxImplementationEnvironment = {\n ...brokeringEnvironment,\n ...sandboxCredentialEnvironment,\n };\n const requestTransformations = settings.credentialBrokering({\n env: brokeringEnvironment,\n sandboxEnv: sandboxImplementationEnvironment,\n ...(startOptions.headers == null\n ? {}\n : { headers: startOptions.headers }),\n });\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n sandboxProviderEnvironment =\n resolvedProviderAuthentication.providerAuthentication?.type ===\n 'ai-gateway'\n ? {}\n : undefined;\n }\n if (\n settings.credentialForwarding != null &&\n sandboxProviderEnvironment == null &&\n resolvedProviderAuthentication.providerAuthentication?.type ===\n 'ai-gateway'\n ) {\n sandboxProviderEnvironment = resolveProviderEnvironment({\n resolvedProviderAuthentication,\n clientApp,\n });\n }\n if (sandboxProviderEnvironment != null) {\n sandboxImplementationEnvironment = {\n ...sandboxImplementationEnvironment,\n ...sandboxProviderEnvironment,\n };\n sandboxProviderAuthenticationEnvironment = Object.fromEntries(\n Object.entries(resolvedProviderAuthentication.env).filter(\n ([key]) =>\n key !== 'AI_SDK_ACP_GATEWAY_API_KEY' &&\n key !== 'AI_SDK_ACP_GATEWAY_BASE_URL',\n ),\n );\n }\n const resolvedBridgeDir = posix.resolve(\n defaultWorkingDirectory,\n bootstrap.bootstrapDir,\n );\n const resolvedImplementationDir = `${resolvedBridgeDir}/implementation`;\n const workDir = startOptions.sessionWorkDir;\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOptions.abortSignal,\n });\n const privateSessionDir = resolveACPPrivateSessionDirectory({\n sandboxHomeDir,\n harnessId: settings.harnessId,\n sessionId: startOptions.sessionId,\n });\n const implementationHomeDir =\n implementation.source.type === 'install-command'\n ? `${resolvedImplementationDir}/home`\n : sandboxHomeDir;\n const skillsDir =\n settings.skillsDirectory ?? DEFAULT_ACP_SKILLS_DIRECTORY;\n const skillsDirectory = resolveACPSkillsDirectory({\n implementationHomeDir,\n skillsDirectory: settings.skillsDirectory,\n });\n const bridgeStateDir = `${privateSessionDir}/bridge`;\n const report = startOptions.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOptions.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: settings.harnessId,\n sessionId: startOptions.sessionId,\n });\n const builtinToolCatalog = serializeBuiltinTools({ builtinTools });\n let respawnStrategy: ACPRespawnStrategy | undefined;\n\n if (isResume) {\n if (lifecycleData == null) {\n throw new Error('ACP lifecycle state data is missing.');\n }\n const coords = lifecycleData.bridge;\n if (coords == null && isContinue) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'ACP continuation state does not contain bridge coordinates required for replay or process-loss rerun.',\n });\n }\n if (coords != null) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: portEndpointOverride,\n port: coords.port,\n harnessId: settings.harnessId,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n const attachChannel: ACPChannel = new SandboxChannel({\n connect: ({ abortSignal }) =>\n openWebSocket({ ...attachEndpoint, abortSignal }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n reconnect,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOptions.sessionId,\n harnessId: settings.harnessId,\n channel: attachChannel,\n proc: undefined,\n modelMapping: settings.modelMapping,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n askUserQuestions: settings.askUserQuestions,\n debug: startOptions.observability?.debug,\n implementationIdentity,\n authenticationProfile,\n builtinTools: builtinToolCatalog,\n permissionMode,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n isMcpToolCall: settings.isMcpToolCall,\n initialGuidanceApplied: resolveACPInitialGuidanceApplied({\n isResume: true,\n lifecycleState: lifecycleData,\n }),\n instructionsFingerprint: lifecycleData.instructionsFingerprint,\n sandbox: toolSafeSandboxSession,\n homePath: implementationHomeDir,\n skillsDir,\n skillsDirectory,\n acpSessionId: lifecycleData.acpSessionId,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n isResume: true,\n turnInFlight: isContinue,\n bridgeStateDir,\n turnStartConfig: lifecycleData.turnStartConfig,\n recoveryStatus: lifecycleData.recovery,\n restoration: lifecycleData.restoration,\n sandboxCredentialEnvironment,\n replayOnly: false,\n lossyRerun: false,\n });\n } catch (error) {\n if (isContinue) {\n const eventLog = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOptions.abortSignal,\n }),\n );\n const recoveryMode = await classifyDiskLog(eventLog);\n if (recoveryMode === 'replay') {\n respawnStrategy = {\n mode: 'disk-replay',\n reason: 'completed coherent event log',\n afterSeq: coords.lastSeenEventId,\n };\n } else {\n const turnStartConfig = lifecycleData.turnStartConfig;\n const acpSessionId = lifecycleData.acpSessionId;\n if (turnStartConfig == null || acpSessionId == null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'ACP process-loss recovery is unavailable because the lifecycle state does not contain the persisted turn start configuration and ACP session identifier.',\n cause: error,\n });\n }\n validateACPTurnStartConfig({\n turnStartConfig,\n authenticationProfile,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n modelMapping: settings.modelMapping,\n builtinTools: builtinToolCatalog,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n });\n respawnStrategy = {\n mode: 'lossy-rerun',\n reason: 'event log not replayable',\n turnStartConfig,\n acpSessionId,\n };\n }\n }\n }\n }\n if (!isContinue) {\n const coldSession = lifecycleData.coldSession;\n const acpSessionId = lifecycleData.acpSessionId;\n if (coldSession == null || acpSessionId == null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'Cold ACP session restoration requires persisted cold-session configuration and an ACP session identifier.',\n });\n }\n const turnStartConfig = validateACPColdSessionConfiguration({\n coldSession,\n permissionMode,\n authenticationProfile,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n modelMapping: settings.modelMapping,\n builtinTools: builtinToolCatalog,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n debug: startOptions.observability?.debug,\n });\n respawnStrategy = {\n mode: 'cold-restore',\n turnStartConfig,\n acpSessionId,\n };\n }\n }\n\n const forwardedImplementationEnvironment =\n sandboxCredentialEnvironment == null\n ? await applyCredentialForwarding({\n environment: sandboxImplementationEnvironment,\n credentialEnvironmentVariables:\n credentialForwardingEnvironmentVariables,\n credentialForwarding: settings.credentialForwarding,\n })\n : sandboxImplementationEnvironment;\n if (\n settings.credentialBrokering != null &&\n sandboxCredentialEnvironment == null\n ) {\n warnCredentialBrokeringUnavailable({\n environment: {\n ...sandboxImplementationEnvironment,\n ...resolvedProviderAuthentication.env,\n },\n forwardedEnvironment: {\n ...forwardedImplementationEnvironment,\n ...sandboxProviderAuthenticationEnvironment,\n },\n credentialEnvironmentVariables: [\n ...credentialForwardingEnvironmentVariables,\n 'AI_SDK_ACP_GATEWAY_API_KEY',\n ],\n });\n }\n await writeACPAuthenticationFiles({\n sandbox: toolSafeSandboxSession,\n homePath: implementationHomeDir,\n files:\n settings.authenticationFiles?.({\n env: implementationEnvironment,\n sandboxEnv: forwardedImplementationEnvironment,\n credentialBrokeringAvailable: sandboxCredentialEnvironment != null,\n }) ?? [],\n abortSignal: startOptions.abortSignal,\n });\n const port = resolveBridgePort({\n sandboxSession,\n override: portOverride,\n harnessId: settings.harnessId,\n });\n const token =\n settings.mintBridgeToken == null\n ? createBridgeToken()\n : settings.mintBridgeToken(sandboxId!);\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)}`,\n abortSignal: startOptions.abortSignal,\n });\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: settings.harnessId,\n abortSignal: startOptions.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command:\n `node ${shellQuote(`${resolvedBridgeDir}/bridge.mjs`)}` +\n ` --workdir ${shellQuote(workDir)}` +\n ` --bridge-state-dir ${shellQuote(bridgeStateDir)}` +\n ` --implementation-dir ${shellQuote(resolvedImplementationDir)}` +\n ` --bridge-type ${shellQuote(settings.harnessId)}`,\n env: {\n ...forwardedImplementationEnvironment,\n ...createACPBridgeEnvironment({\n authentication: settings.authentication,\n providerAuthentication:\n resolvedProviderAuthentication.providerAuthentication,\n providerEnvironment:\n sandboxProviderEnvironment == null ? undefined : {},\n sessionMeta: settings.session?.meta,\n clientCapabilities: settings.clientCapabilities,\n askUserQuestionsRequestMethod:\n settings.askUserQuestions?.requestMethod,\n hostToolMcpTransport: settings.hostToolMcpTransport,\n }),\n ...sandboxProviderAuthenticationEnvironment,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n ...(respawnStrategy?.mode === 'disk-replay'\n ? {\n BRIDGE_REPLAY_FROM_DISK: '1',\n }\n : {}),\n },\n abortSignal: startOptions.abortSignal,\n });\n const stderrTail: string[] = [];\n const bridgeStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: settings.harnessId,\n collectTail: stderrTail,\n });\n const timeoutMs = startupTimeoutMs ?? 120_000;\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: settings.harnessId,\n timeoutMs,\n abortSignal: startOptions.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: `${settings.harnessId} ACP bridge did not become ready in time.`,\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: `${settings.harnessId} ACP bridge exited before becoming ready.`,\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: portEndpointOverride,\n port: boundPort,\n harnessId: settings.harnessId,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n const channel: ACPChannel = new SandboxChannel({\n connect: ({ abortSignal }) =>\n openWebSocket({ ...bridgeEndpoint, abortSignal }),\n outboundSchema: outboundMessageSchema,\n ...(respawnStrategy?.mode === 'disk-replay'\n ? { initialLastSeenEventId: respawnStrategy.afterSeq }\n : {}),\n onDiagnostic,\n onBridgeError,\n reconnect,\n });\n await channel.open(\n respawnStrategy?.mode === 'disk-replay' ? { resume: true } : undefined,\n );\n let coldRestoration: 'resume' | 'load' | undefined;\n if (respawnStrategy?.mode === 'cold-restore') {\n try {\n coldRestoration = await restoreColdACPSession({\n channel,\n harnessId: settings.harnessId,\n start: {\n type: 'start',\n prompt: [],\n debug: startOptions.observability?.debug,\n builtinTools: builtinToolCatalog,\n permissionMode,\n permissionModeMapping,\n ...(settings.instructionMapping == null\n ? {}\n : { instructionMapping: settings.instructionMapping }),\n ...(settings.mcpServers == null\n ? {}\n : { mcpServers: settings.mcpServers }),\n tools: respawnStrategy.turnStartConfig.tools,\n turnStartConfig: respawnStrategy.turnStartConfig,\n recoveryMode: {\n type: 'cold-restore',\n acpSessionId: respawnStrategy.acpSessionId,\n },\n },\n });\n } catch (error) {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n try {\n await proc.kill();\n } catch {}\n channel.close();\n throw error;\n }\n }\n\n return createSession({\n sessionId: startOptions.sessionId,\n harnessId: settings.harnessId,\n channel,\n proc,\n modelMapping: settings.modelMapping,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n askUserQuestions: settings.askUserQuestions,\n debug: startOptions.observability?.debug,\n implementationIdentity,\n authenticationProfile,\n builtinTools: builtinToolCatalog,\n permissionMode,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n isMcpToolCall: settings.isMcpToolCall,\n initialGuidanceApplied: resolveACPInitialGuidanceApplied({\n isResume,\n lifecycleState: lifecycleData,\n }),\n instructionsFingerprint: lifecycleData?.instructionsFingerprint,\n sandbox: toolSafeSandboxSession,\n homePath: implementationHomeDir,\n skillsDir,\n skillsDirectory,\n acpSessionId: lifecycleData?.acpSessionId,\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n isResume,\n turnInFlight:\n respawnStrategy?.mode === 'disk-replay' ||\n respawnStrategy?.mode === 'lossy-rerun',\n bridgeStateDir,\n turnStartConfig:\n respawnStrategy?.mode === 'lossy-rerun' ||\n respawnStrategy?.mode === 'cold-restore'\n ? respawnStrategy.turnStartConfig\n : lifecycleData?.turnStartConfig,\n recoveryStatus:\n respawnStrategy?.mode === 'disk-replay' ||\n respawnStrategy?.mode === 'lossy-rerun'\n ? {\n mode: respawnStrategy.mode,\n reason: respawnStrategy.reason,\n }\n : undefined,\n restoration:\n coldRestoration == null\n ? lifecycleData?.restoration\n : { method: coldRestoration },\n sandboxCredentialEnvironment,\n replayOnly: respawnStrategy?.mode === 'disk-replay',\n lossyRerun: respawnStrategy?.mode === 'lossy-rerun',\n });\n },\n };\n}\n\nasync function writeACPAuthenticationFiles({\n sandbox,\n homePath,\n files,\n abortSignal,\n}: {\n sandbox: SandboxSession;\n homePath: string;\n files: ReadonlyArray<{ readonly path: string; readonly content: string }>;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const targetPaths = files.map(file => {\n if (\n file.path.length === 0 ||\n posix.isAbsolute(file.path) ||\n file.path.split('/').some(segment => segment === '..')\n ) {\n throw new Error(\n `ACP authentication file path must be relative without traversal: ${JSON.stringify(file.path)}.`,\n );\n }\n return posix.join(homePath, file.path);\n });\n\n for (let index = 0; index < files.length; index++) {\n await sandbox.writeTextFile({\n path: targetPaths[index],\n content: files[index].content,\n abortSignal,\n });\n }\n if (targetPaths.length === 0) return;\n\n const result = await sandbox.run({\n command: `chmod 600 -- ${targetPaths.map(shellQuote).join(' ')}`,\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to secure ACP authentication files (exit ${result.exitCode})${result.stderr ? `: ${result.stderr}` : ''}`,\n );\n }\n}\n\nfunction resolveProviderEnvironment({\n resolvedProviderAuthentication,\n clientApp,\n}: {\n resolvedProviderAuthentication: ReturnType<\n typeof resolveACPProviderAuthentication\n >;\n clientApp: ACPClientApp;\n}): Record<string, string> {\n if (\n resolvedProviderAuthentication.providerAuthentication?.type !== 'ai-gateway'\n ) {\n return {};\n }\n return resolveACPLaunchEnvironment({\n providerAuthentication:\n resolvedProviderAuthentication.providerAuthentication,\n gateway: {\n apiKey: requireResolvedEnvironmentValue({\n environment: resolvedProviderAuthentication.env,\n name: 'AI_SDK_ACP_GATEWAY_API_KEY',\n }),\n baseUrl: requireResolvedEnvironmentValue({\n environment: resolvedProviderAuthentication.env,\n name: 'AI_SDK_ACP_GATEWAY_BASE_URL',\n }),\n clientAppName: clientApp.name,\n clientAppVersion: clientApp.version,\n },\n });\n}\n\nfunction resolveACPProviderCredentialEnvironmentVariables({\n providerAuthentication,\n}: {\n providerAuthentication: ReturnType<\n typeof resolveACPProviderAuthentication\n >['providerAuthentication'];\n}): string[] {\n if (providerAuthentication?.type !== 'ai-gateway') return [];\n\n return Object.entries(providerAuthentication.env)\n .filter(([, value]) => containsACPProviderCredential({ value }))\n .map(([name]) => name);\n}\n\nfunction containsACPProviderCredential({\n value,\n}: {\n value: ACPProfileValue;\n}): boolean {\n if (Array.isArray(value)) {\n return value.some(item => containsACPProviderCredential({ value: item }));\n }\n if (value == null || typeof value !== 'object') return false;\n if ('$source' in value) {\n return (\n value.$source === 'gateway-api-key' ||\n value.$source === 'gateway-authorization'\n );\n }\n return Object.values(value).some(item =>\n containsACPProviderCredential({ value: item }),\n );\n}\n\nfunction requireResolvedEnvironmentValue({\n environment,\n name,\n}: {\n environment: Readonly<Record<string, string>>;\n name: string;\n}): string {\n const value = environment[name];\n if (value == null) {\n throw new Error(`ACP resolved environment value ${name} is unavailable.`);\n }\n return value;\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n harnessId,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n harnessId: string;\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 unsupported({\n harnessId,\n message:\n `The ${harnessId} ACP harness needs a TCP port exposed by the sandbox. ` +\n 'Create the sandbox with `ports: [<port>]` or configure the harness `port`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n harnessId,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n harnessId: string;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw unsupported({\n harnessId,\n message: `The ${harnessId} ACP harness requires an explicit \\`port\\` when using a basic sandbox session.`,\n });\n }\n if (portEndpoint == null) {\n throw unsupported({\n harnessId,\n message: `The ${harnessId} ACP 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 harnessId,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n harnessId: string;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw unsupported({\n harnessId,\n message: `The ${harnessId} ACP harness requires an explicit \\`portEndpoint\\` when using a basic sandbox session.`,\n });\n}\n\nfunction openWebSocket({\n url,\n headers,\n abortSignal,\n}: HarnessV1PortEndpoint & { abortSignal: AbortSignal }): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n if (abortSignal.aborted) {\n reject(abortSignal.reason ?? new Error('WebSocket connection aborted'));\n return;\n }\n\n const ws = new WebSocket(url, {\n headers: headers == null ? undefined : { ...headers },\n });\n\n let settled = false;\n const cleanup = () => {\n abortSignal.removeEventListener('abort', onAbort);\n ws.off('open', onOpen);\n ws.off('error', onError);\n };\n const rejectWithCleanup = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n ws.once('error', () => {});\n try {\n ws.terminate();\n } catch {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n }\n reject(error);\n };\n const onOpen = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(ws);\n };\n const onError = (error: Error) => {\n rejectWithCleanup(error);\n };\n const onAbort = () =>\n rejectWithCleanup(\n abortSignal.reason ?? new Error('WebSocket connection aborted'),\n );\n\n ws.once('open', onOpen);\n ws.once('error', onError);\n abortSignal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction restoreColdACPSession({\n channel,\n harnessId,\n start,\n}: {\n channel: ACPChannel;\n harnessId: string;\n start: StartMessage;\n}): Promise<'resume' | 'load'> {\n return new Promise<{\n method?: 'resume' | 'load';\n error?: unknown;\n }>(complete => {\n let restorationMethod: 'resume' | 'load' | undefined;\n let settled = false;\n const subscriptions: Array<() => void> = [];\n const cleanup = () => {\n for (const unsubscribe of subscriptions) unsubscribe();\n };\n const settle = ({\n method,\n error,\n }: {\n method?: 'resume' | 'load';\n error?: unknown;\n }) => {\n if (settled) return;\n settled = true;\n cleanup();\n complete({\n ...(method == null ? {} : { method }),\n ...(error === undefined ? {} : { error }),\n });\n };\n subscriptions.push(\n channel.on('raw', event => {\n const rawValue = event.rawValue;\n if (\n isRecord(rawValue) &&\n rawValue.type === 'acp-session-restored' &&\n (rawValue.method === 'resume' || rawValue.method === 'load')\n ) {\n restorationMethod = rawValue.method;\n }\n }),\n );\n subscriptions.push(\n channel.on('finish', () => {\n settle({ method: restorationMethod });\n }),\n );\n subscriptions.push(\n channel.on('error', event => {\n settle({\n error: deserializeBridgeError({\n error: event.error,\n harnessId,\n }),\n });\n }),\n );\n channel.onClose((_code, reason) => {\n settle({\n error: new Error(\n `${harnessId} ACP bridge closed during cold restoration: ${reason}`,\n ),\n });\n });\n try {\n channel.send(start);\n } catch (error) {\n settle({ error });\n }\n }).then(result => {\n if (result.error !== undefined) throw result.error;\n if (result.method == null) {\n throw new Error(\n `${harnessId} ACP cold restoration completed without identifying the negotiated method.`,\n );\n }\n return result.method;\n });\n}\n\nfunction createSession({\n sessionId,\n harnessId,\n channel,\n proc,\n modelMapping,\n sessionMeta,\n instructionMapping,\n outputSchemaMapping,\n askUserQuestions,\n debug,\n implementationIdentity,\n authenticationProfile,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n isMcpToolCall,\n initialGuidanceApplied: initialGuidanceAppliedAtStart,\n instructionsFingerprint: instructionsFingerprintAtStart,\n sandbox,\n homePath,\n skillsDir,\n skillsDirectory,\n acpSessionId: acpSessionIdAtStart,\n bridgePort,\n bridgeToken,\n sandboxId,\n isResume,\n turnInFlight: turnInFlightAtStart,\n bridgeStateDir,\n turnStartConfig: turnStartConfigAtStart,\n recoveryStatus,\n restoration,\n sandboxCredentialEnvironment,\n replayOnly,\n lossyRerun,\n}: {\n sessionId: string;\n harnessId: string;\n channel: ACPChannel;\n proc: Experimental_SandboxProcess | undefined;\n modelMapping: ACPModelMapping;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n askUserQuestions: ACPAskUserQuestionsSettings | undefined;\n debug: HarnessV1DebugConfig | undefined;\n implementationIdentity: string;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionMode: NonNullable<StartMessage['permissionMode']>;\n permissionModeMapping: StartMessage['permissionModeMapping'];\n mcpServers: Record<string, unknown> | undefined;\n isMcpToolCall: ((toolCall: ACPToolCall) => boolean) | undefined;\n initialGuidanceApplied: boolean;\n instructionsFingerprint: string | undefined;\n sandbox: SandboxSession;\n homePath: string;\n skillsDir: string;\n skillsDirectory: string;\n acpSessionId: string | undefined;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n isResume: boolean;\n turnInFlight: boolean;\n bridgeStateDir: string;\n turnStartConfig: ACPTurnStartConfig | undefined;\n recoveryStatus: ACPLifecycleData['recovery'];\n restoration: ACPLifecycleData['restoration'];\n sandboxCredentialEnvironment: Readonly<Record<string, string>> | undefined;\n replayOnly: boolean;\n lossyRerun: boolean;\n}): HarnessV1Session {\n let stopped = false;\n let turnInFlight = turnInFlightAtStart;\n let initialGuidanceApplied = initialGuidanceAppliedAtStart;\n let instructionsFingerprint = instructionsFingerprintAtStart;\n let latestACPSessionId = acpSessionIdAtStart;\n let latestTurnStartConfig = turnStartConfigAtStart;\n const bufferedQuestionResults = new Map<\n string,\n {\n readonly output: unknown;\n readonly isError?: boolean;\n readonly toolResult: ToolResultPart;\n }\n >();\n\n const markTurnFinished = () => {\n turnInFlight = false;\n };\n channel.on('bridge-thread', event => {\n latestACPSessionId = event.threadId;\n });\n // A resumed continuation replays its buffered events after the new session\n // is created. Let `wireTurn` consume those events so it can forward a\n // terminal replay instead of rejecting the continuation before it starts.\n if (!turnInFlightAtStart) {\n channel.on('finish', markTurnFinished);\n channel.on('error', markTurnFinished);\n channel.onClose(markTurnFinished);\n }\n\n const wireTurn = ({\n emit,\n abortSignal,\n start,\n }: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n start: () => void;\n }): HarnessV1PromptControl => {\n let resolveDone: (() => void) | undefined;\n let rejectDone: ((error: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n resolveDone = resolve;\n rejectDone = reject;\n });\n let settled = false;\n let abortRequested = false;\n let abortError: unknown;\n let abortListenerAttached = false;\n let openBlock:\n | { readonly type: 'text' | 'reasoning'; readonly id: string }\n | undefined;\n const dynamicToolCalls = new Map<string, boolean>();\n const toolCallClassificationErrors = new Map<string, unknown>();\n const activeQuestionRequests = new Map<\n string,\n {\n readonly requestId: string;\n readonly nativeRequest: unknown;\n }\n >();\n const questionToolCallIdsByRequestId = new Map<string, string>();\n const subscriptions: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n if (event.type === 'text-start' || event.type === 'reasoning-start') {\n openBlock = {\n type: event.type === 'text-start' ? 'text' : 'reasoning',\n id: event.id,\n };\n } else if (\n (event.type === 'text-end' || event.type === 'reasoning-end') &&\n openBlock?.id === event.id\n ) {\n openBlock = undefined;\n }\n try {\n emit(event);\n } catch {}\n };\n const closeForwardedBlock = () => {\n if (openBlock == null) return;\n const block = openBlock;\n openBlock = undefined;\n forward({\n type: block.type === 'text' ? 'text-end' : 'reasoning-end',\n id: block.id,\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-approval-request',\n 'file-change',\n 'finish-step',\n 'raw',\n ] as const;\n const cleanup = () => {\n for (const unsubscribe of subscriptions) unsubscribe();\n if (abortListenerAttached) {\n abortSignal?.removeEventListener('abort', onAbort);\n }\n };\n const settle = ({ error }: { error?: unknown }) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error === undefined) resolveDone!();\n else rejectDone!(error);\n };\n const onAbort = () => {\n if (settled || abortRequested) return;\n abortRequested = true;\n abortError =\n abortSignal?.reason ?? new DOMException('Aborted', 'AbortError');\n try {\n channel.send({ type: 'abort' });\n } catch {\n settle({ error: abortError });\n }\n };\n subscriptions.push(\n channel.on('acp-tool-call-candidate', event => {\n try {\n const suppress =\n askUserQuestions?.isNativeToolCall?.({\n nativeToolCall: event.toolCall,\n }) === true;\n dynamicToolCalls.set(\n event.toolCall.toolCallId,\n isMcpToolCall?.(event.toolCall) === true,\n );\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { suppress },\n });\n } catch (error) {\n toolCallClassificationErrors.set(event.toolCall.toolCallId, error);\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { suppress: false },\n });\n }\n }),\n );\n subscriptions.push(\n channel.on('acp-question-request', event => {\n if (askUserQuestions == null) {\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { type: 'unhandled' },\n });\n return;\n }\n try {\n const nativeToolCall = askUserQuestions.fromNativeRequest({\n nativeRequest: event.nativeRequest,\n nativeToolCall: event.nativeToolCall,\n });\n if (nativeToolCall == null) {\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { type: 'unhandled' },\n });\n return;\n }\n if (\n nativeToolCall.toolName !== 'askUserQuestions' ||\n nativeToolCall.providerExecuted !== false\n ) {\n throw new Error(\n `${harnessId} ACP askUserQuestions.fromNativeRequest must return a client-executed askUserQuestions tool call.`,\n );\n }\n\n const toolCall = withNativeQuestionRequest({\n harnessId,\n nativeRequest: event.nativeRequest,\n toolCall: nativeToolCall,\n });\n const bufferedResult = takeBufferedQuestionResult({\n bufferedQuestionResults,\n toolCallId: toolCall.toolCallId,\n nativeRequest: event.nativeRequest,\n matchesNativeRequest: askUserQuestions.matchesNativeRequest,\n harnessId,\n });\n activeQuestionRequests.set(toolCall.toolCallId, {\n requestId: event.requestId,\n nativeRequest: event.nativeRequest,\n });\n questionToolCallIdsByRequestId.set(\n event.requestId,\n toolCall.toolCallId,\n );\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: {\n type: 'handled',\n toolCallId: toolCall.toolCallId,\n },\n });\n\n if (bufferedResult == null) {\n forward(toolCall);\n return;\n }\n channel.send({\n type: 'tool-result',\n toolCallId: toolCall.toolCallId,\n output: askUserQuestions.toNativeResponse({\n nativeRequest: event.nativeRequest,\n toolResult: bufferedResult.toolResult,\n }),\n isError: bufferedResult.isError,\n toolResult: bufferedResult.toolResult,\n });\n } catch (error) {\n closeForwardedBlock();\n forward({ type: 'error', error });\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settle({ error });\n }\n }),\n );\n subscriptions.push(\n channel.on('acp-question-resolved', event => {\n const toolCallId = questionToolCallIdsByRequestId.get(event.requestId);\n if (toolCallId != null) {\n activeQuestionRequests.delete(toolCallId);\n questionToolCallIdsByRequestId.delete(event.requestId);\n }\n }),\n );\n subscriptions.push(\n channel.on('tool-call', event => {\n if (toolCallClassificationErrors.has(event.toolCallId)) {\n const error = toolCallClassificationErrors.get(event.toolCallId);\n closeForwardedBlock();\n forward({ type: 'error', error });\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settle({ error });\n return;\n }\n forward(\n dynamicToolCalls.get(event.toolCallId) === true\n ? { ...event, dynamic: true }\n : event,\n );\n }),\n );\n subscriptions.push(\n channel.on('tool-result', event => {\n const dynamic = dynamicToolCalls.get(event.toolCallId) === true;\n dynamicToolCalls.delete(event.toolCallId);\n toolCallClassificationErrors.delete(event.toolCallId);\n forward(dynamic ? { ...event, dynamic: true } : event);\n }),\n );\n for (const type of eventTypes) {\n subscriptions.push(channel.on(type, event => forward(event)));\n }\n subscriptions.push(\n channel.on('finish', event => {\n markTurnFinished();\n closeForwardedBlock();\n forward(event);\n settle(abortRequested ? { error: abortError } : {});\n }),\n );\n subscriptions.push(\n channel.on('error', event => {\n markTurnFinished();\n closeForwardedBlock();\n const error = deserializeBridgeError({\n error: event.error,\n harnessId,\n });\n forward({ ...event, error });\n settle({ error });\n }),\n );\n channel.onClose((_code, reason) => {\n markTurnFinished();\n if (reason === 'suspended') {\n settle({});\n return;\n }\n closeForwardedBlock();\n settle({\n error:\n abortRequested && abortError !== undefined\n ? abortError\n : new Error(`${harnessId} ACP bridge closed before turn end.`),\n });\n });\n try {\n start();\n } catch (error) {\n settled = true;\n cleanup();\n throw error;\n }\n if (abortSignal?.aborted) onAbort();\n else if (abortSignal != null) {\n abortSignal.addEventListener('abort', onAbort, { once: true });\n abortListenerAttached = true;\n }\n return {\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 submitToolResult: async input => {\n if (\n askUserQuestions != null &&\n input.toolResult?.toolName === 'askUserQuestions'\n ) {\n const activeRequest = activeQuestionRequests.get(input.toolCallId);\n if (activeRequest == null) {\n const previousNativeRequest =\n input.toolResult.providerOptions?.[harnessId]?.nativeRequest;\n if (!lossyRerun && previousNativeRequest !== undefined) {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: askUserQuestions.toNativeResponse({\n nativeRequest: previousNativeRequest,\n toolResult: input.toolResult,\n }),\n isError: input.isError,\n toolResult: input.toolResult,\n });\n return;\n }\n bufferedQuestionResults.set(input.toolCallId, {\n output: input.output,\n ...(input.isError == null ? {} : { isError: input.isError }),\n toolResult: input.toolResult,\n });\n return;\n }\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: askUserQuestions.toNativeResponse({\n nativeRequest: activeRequest.nativeRequest,\n toolResult: input.toolResult,\n }),\n isError: input.isError,\n toolResult: input.toolResult,\n });\n return;\n }\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n toolResult: input.toolResult,\n });\n },\n done,\n };\n };\n\n const terminateBridge = async ({\n command,\n }: {\n command: 'stop' | 'destroy';\n }) => {\n if (stopped) return;\n stopped = true;\n channel.beginClose();\n const channelClosed = new Promise<void>(resolve => {\n channel.onClose(() => resolve());\n });\n try {\n if (!channel.isClosed()) {\n channel.send({ type: command });\n }\n } catch {}\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n proc == null ? channelClosed : proc.wait(),\n new Promise<void>(resolve => {\n timer = setTimeout(resolve, 5000);\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer != null) clearTimeout(timer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n };\n\n const createLifecycleData = ({\n bridge,\n includeTurnStartConfig = true,\n }: {\n bridge?: ACPLifecycleData['bridge'];\n includeTurnStartConfig?: boolean;\n }): ACPLifecycleData => ({\n implementationIdentity,\n authenticationProfile,\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n ...(latestACPSessionId == null ? {} : { acpSessionId: latestACPSessionId }),\n ...(bridge == null ? {} : { bridge }),\n ...(latestTurnStartConfig == null\n ? {}\n : {\n coldSession: createACPColdSessionState({\n turnStartConfig: latestTurnStartConfig,\n }),\n }),\n ...(!includeTurnStartConfig || latestTurnStartConfig == null\n ? {}\n : { turnStartConfig: latestTurnStartConfig }),\n ...(recoveryStatus == null ? {} : { recovery: recoveryStatus }),\n ...(restoration == null ? {} : { restoration }),\n initialGuidanceApplied,\n ...(instructionsFingerprint == null ? {} : { instructionsFingerprint }),\n skillsDirectory,\n });\n\n const synchronizeSkills = async ({\n skills,\n abortSignal,\n }: {\n skills: ReadonlyArray<HarnessV1Skill>;\n abortSignal?: AbortSignal;\n }): Promise<void> => {\n validateACPSkills({ skills });\n await writeSkills({\n sandbox,\n homePath,\n skillsDir,\n skills,\n abortSignal,\n skillNamePattern: ACP_SKILL_NAME_PATTERN,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid ACP skill name ${JSON.stringify(name)}: expected a kebab-case slug.`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid ACP skill file path ${JSON.stringify(filePath)} for skill ${JSON.stringify(\n skillName,\n )}: expected a relative POSIX path without traversal.`,\n });\n };\n\n const synchronizeInstructions = async ({\n instructions,\n abortSignal,\n }: {\n instructions: string | undefined;\n abortSignal?: AbortSignal;\n }): Promise<void> => {\n if (instructionMapping?.type === 'filesystem') {\n await writeInstructions({\n sandbox,\n homePath,\n instructionsFile: instructionMapping.path,\n instructions,\n abortSignal,\n });\n }\n };\n\n return {\n sessionId,\n isResume,\n doPromptTurn: async options => {\n await synchronizeSkills({\n skills: options.skills,\n abortSignal: options.abortSignal,\n });\n await synchronizeInstructions({\n instructions: options.instructions,\n abortSignal: options.abortSignal,\n });\n if (options.responseFormat?.type === 'json') {\n if (options.responseFormat.schema == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} requires a JSON schema for structured output.`,\n });\n }\n if (outputSchemaMapping == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} does not support structured output through ACP.`,\n });\n }\n }\n if (replayOnly) {\n throw new Error(\n `${harnessId} recovered this turn through disk replay only and has no restored ACP process for a subsequent prompt.`,\n );\n }\n if (options.abortSignal?.aborted) {\n throw (\n options.abortSignal.reason ??\n new DOMException('Aborted', 'AbortError')\n );\n }\n const prompt = convertHarnessPromptToACPTextBlocks({\n prompt: options.prompt,\n harnessId,\n });\n const model = options.model;\n const turnStartConfig = createACPTurnStartConfig({\n prompt,\n tools: options.tools ?? [],\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat: options.responseFormat,\n outputSchemaMapping,\n model,\n modelMapping,\n });\n const nextInstructionsFingerprint = fingerprintValue({\n value: options.instructions ?? null,\n });\n const control = wireTurn({\n emit: options.emit,\n abortSignal: options.abortSignal,\n start: () => {\n if (turnInFlight) {\n throw new Error(\n `${harnessId} cannot start a new ACP prompt while a turn is in flight.`,\n );\n }\n turnInFlight = true;\n channel.send({\n type: 'start',\n prompt:\n instructionMapping?.type !== 'filesystem' &&\n instructionsFingerprint !== nextInstructionsFingerprint &&\n (instructionMapping == null || initialGuidanceApplied)\n ? prependACPInstructionGuidance({\n prompt,\n instructions: options.instructions,\n })\n : prompt,\n ...(instructionMapping == null\n ? {}\n : {\n instructionMapping,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n }),\n debug,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n ...(model == null ? {} : { model, modelMapping }),\n ...(options.responseFormat == null\n ? {}\n : { responseFormat: options.responseFormat }),\n ...(turnStartConfig.outputSchemaMapping == null\n ? {}\n : { outputSchemaMapping: turnStartConfig.outputSchemaMapping }),\n ...(mcpServers == null ? {} : { mcpServers }),\n tools: options.tools == null ? undefined : turnStartConfig.tools,\n turnStartConfig,\n });\n latestTurnStartConfig = turnStartConfig;\n initialGuidanceApplied = true;\n instructionsFingerprint = nextInstructionsFingerprint;\n },\n });\n return control;\n },\n doContinueTurn: async options => {\n await synchronizeSkills({\n skills: options.skills,\n abortSignal: options.abortSignal,\n });\n await synchronizeInstructions({\n instructions: options.instructions,\n abortSignal: options.abortSignal,\n });\n if (options.responseFormat?.type === 'json') {\n if (options.responseFormat.schema == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} requires a JSON schema for structured output.`,\n });\n }\n if (outputSchemaMapping == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} does not support structured output through ACP.`,\n });\n }\n }\n if (!turnInFlight) {\n throw new Error(`${harnessId} has no in-flight ACP turn to continue.`);\n }\n if (lossyRerun) {\n if (latestTurnStartConfig == null || latestACPSessionId == null) {\n throw new Error(\n `${harnessId} cannot perform lossy ACP rerun without persisted start configuration and an ACP session identifier.`,\n );\n }\n assertRecoveryToolCatalog({\n persisted: latestTurnStartConfig.tools,\n current: options.tools ?? [],\n });\n }\n return wireTurn({\n emit: options.emit,\n abortSignal: options.abortSignal,\n start: () => {\n if (!lossyRerun) return;\n const turnStartConfig = latestTurnStartConfig!;\n channel.send({\n type: 'start',\n prompt: turnStartConfig.prompt,\n debug: turnStartConfig.debug,\n builtinTools: turnStartConfig.builtinTools,\n permissionMode: turnStartConfig.permissionMode,\n permissionModeMapping: turnStartConfig.permissionModeMapping,\n ...(turnStartConfig.model == null\n ? {}\n : {\n model: turnStartConfig.model,\n modelMapping: turnStartConfig.modelMapping,\n }),\n ...(turnStartConfig.responseFormat == null\n ? {}\n : { responseFormat: turnStartConfig.responseFormat }),\n ...(turnStartConfig.outputSchemaMapping == null\n ? {}\n : { outputSchemaMapping: turnStartConfig.outputSchemaMapping }),\n ...(instructionMapping == null\n ? {}\n : {\n instructionMapping,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n }),\n ...(mcpServers == null ? {} : { mcpServers }),\n tools: turnStartConfig.tools,\n turnStartConfig,\n recoveryMode: {\n type: 'lossy-rerun',\n acpSessionId: latestACPSessionId!,\n reason: recoveryStatus?.reason ?? 'bridge process loss',\n },\n });\n },\n });\n },\n doCompact: async () => {\n throw unsupported({\n harnessId,\n message: 'ACP v1 does not define manual session compaction.',\n });\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `${harnessId} ACP session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'continue-turn',\n harnessId,\n specificationVersion: 'harness-v1',\n data: createLifecycleData({\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n stateDir: bridgeStateDir,\n },\n }),\n };\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `${harnessId} ACP session ${sessionId} is stopped; cannot detach.`,\n );\n }\n if (turnInFlight) {\n throw new Error(\n `${harnessId} ACP session ${sessionId} has an in-flight turn; suspend it instead.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId,\n specificationVersion: 'harness-v1',\n data: createLifecycleData({\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n stateDir: bridgeStateDir,\n },\n }),\n };\n },\n doStop: async () => {\n const data = createLifecycleData({ includeTurnStartConfig: false });\n await terminateBridge({ command: 'stop' });\n return {\n type: 'resume-session',\n harnessId,\n specificationVersion: 'harness-v1',\n data,\n };\n },\n doDestroy: async () => {\n await terminateBridge({ command: 'destroy' });\n },\n };\n}\n\nfunction isCompletePermissionModeMapping({\n value,\n}: {\n value: ACPPermissionModeMapping | undefined;\n}): boolean {\n return (\n isPermissionModeMappingValue({ value: value?.['allow-reads'] }) &&\n isPermissionModeMappingValue({ value: value?.['allow-edits'] }) &&\n isPermissionModeMappingValue({ value: value?.['allow-all'] })\n );\n}\n\nfunction withNativeQuestionRequest({\n harnessId,\n nativeRequest,\n toolCall,\n}: {\n harnessId: string;\n nativeRequest: unknown;\n toolCall: Extract<HarnessV1StreamPart, { type: 'tool-call' }>;\n}): Extract<HarnessV1StreamPart, { type: 'tool-call' }> {\n const harnessMetadata = toolCall.providerMetadata?.[harnessId];\n return {\n ...toolCall,\n providerMetadata: {\n ...toolCall.providerMetadata,\n [harnessId]: {\n ...(harnessMetadata ?? {}),\n nativeRequest,\n } as NonNullable<\n Extract<HarnessV1StreamPart, { type: 'tool-call' }>['providerMetadata']\n >[string],\n },\n };\n}\n\nfunction takeBufferedQuestionResult({\n bufferedQuestionResults,\n toolCallId,\n nativeRequest,\n matchesNativeRequest,\n harnessId,\n}: {\n bufferedQuestionResults: Map<\n string,\n {\n readonly output: unknown;\n readonly isError?: boolean;\n readonly toolResult: ToolResultPart;\n }\n >;\n toolCallId: string;\n nativeRequest: unknown;\n matchesNativeRequest:\n | ACPAskUserQuestionsSettings['matchesNativeRequest']\n | undefined;\n harnessId: string;\n}):\n | {\n readonly output: unknown;\n readonly isError?: boolean;\n readonly toolResult: ToolResultPart;\n }\n | undefined {\n const exact = bufferedQuestionResults.get(toolCallId);\n if (exact != null) {\n bufferedQuestionResults.delete(toolCallId);\n return exact;\n }\n if (matchesNativeRequest == null) return undefined;\n for (const [bufferedToolCallId, buffered] of bufferedQuestionResults) {\n const previousNativeRequest =\n buffered.toolResult.providerOptions?.[harnessId]?.nativeRequest;\n if (\n previousNativeRequest !== undefined &&\n matchesNativeRequest({ previousNativeRequest, nativeRequest })\n ) {\n bufferedQuestionResults.delete(bufferedToolCallId);\n return buffered;\n }\n }\n return undefined;\n}\n\nfunction isPermissionModeMappingValue({\n value,\n}: {\n value: ACPPermissionModeTarget | null | undefined;\n}): boolean {\n return value === null || isPermissionModeTarget({ value });\n}\n\nfunction isPermissionModeTarget({\n value,\n}: {\n value: ACPPermissionModeTarget | undefined;\n}): boolean {\n if (value?.type === 'session-mode') {\n return typeof value.modeId === 'string';\n }\n return (\n value?.type === 'session-config-option' &&\n typeof value.configId === 'string' &&\n (typeof value.value === 'string' || typeof value.value === 'boolean')\n );\n}\n\nexport function serializeBuiltinTools({\n builtinTools,\n}: {\n builtinTools: ToolSet;\n}): ReadonlyArray<ACPBuiltinToolMapping> {\n return Object.entries(builtinTools).map(([toolName, tool]) => {\n const nativeName =\n tool != null &&\n typeof tool === 'object' &&\n 'nativeName' in tool &&\n typeof tool.nativeName === 'string'\n ? tool.nativeName\n : undefined;\n const title =\n tool != null &&\n typeof tool === 'object' &&\n 'title' in tool &&\n typeof tool.title === 'string'\n ? tool.title\n : undefined;\n const toolUseKind =\n tool != null &&\n typeof tool === 'object' &&\n 'toolUseKind' in tool &&\n (tool.toolUseKind === 'readonly' ||\n tool.toolUseKind === 'edit' ||\n tool.toolUseKind === 'bash')\n ? tool.toolUseKind\n : undefined;\n let inputSchema: ACPBuiltinToolMapping['inputSchema'];\n if (\n tool != null &&\n typeof tool === 'object' &&\n 'inputSchema' in tool &&\n tool.inputSchema != null\n ) {\n try {\n inputSchema = asSchema(\n tool.inputSchema as Parameters<typeof asSchema>[0],\n ).jsonSchema as ACPBuiltinToolMapping['inputSchema'];\n } catch {}\n }\n return {\n toolName,\n ...(nativeName == null ? {} : { nativeName }),\n ...(title == null ? {} : { title }),\n ...(toolUseKind == null ? {} : { toolUseKind }),\n ...(inputSchema == null ? {} : { inputSchema }),\n };\n });\n}\n\nfunction validateACPTurnStartConfig({\n turnStartConfig,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n outputSchemaMapping,\n modelMapping,\n builtinTools,\n permissionModeMapping,\n mcpServers,\n}: {\n turnStartConfig: ACPTurnStartConfig;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n modelMapping: ACPModelMapping;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionModeMapping: ACPPermissionModeMapping | undefined;\n mcpServers: Record<string, unknown> | undefined;\n}): void {\n const current = createACPTurnStartConfig({\n prompt: turnStartConfig.prompt,\n tools: turnStartConfig.tools,\n builtinTools,\n permissionMode: turnStartConfig.permissionMode,\n permissionModeMapping,\n mcpServers,\n debug: turnStartConfig.debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat: turnStartConfig.responseFormat,\n outputSchemaMapping,\n model: turnStartConfig.model,\n modelMapping,\n });\n if (\n current.configurationFingerprint !==\n turnStartConfig.configurationFingerprint\n ) {\n throw new Error(\n 'The persisted ACP turn start configuration is incompatible with the current non-secret start configuration.',\n );\n }\n}\n\nfunction validateACPColdSessionConfiguration({\n coldSession,\n permissionMode,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n outputSchemaMapping,\n modelMapping,\n builtinTools,\n permissionModeMapping,\n mcpServers,\n debug,\n}: {\n coldSession: ACPColdSessionState;\n permissionMode: NonNullable<StartMessage['permissionMode']>;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n modelMapping: ACPModelMapping;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionModeMapping: ACPPermissionModeMapping | undefined;\n mcpServers: Record<string, unknown> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n}): ACPTurnStartConfig {\n const current = createACPTurnStartConfig({\n prompt: [],\n tools: coldSession.tools,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat: coldSession.responseFormat,\n outputSchemaMapping,\n model: undefined,\n modelMapping,\n });\n if (\n current.configurationFingerprint !== coldSession.configurationFingerprint ||\n coldSession.permissionMode !== permissionMode\n ) {\n throw new Error(\n 'ACP cold-session state is incompatible with the current non-secret session configuration.',\n );\n }\n return current;\n}\n\nfunction assertRecoveryToolCatalog({\n persisted,\n current,\n}: {\n persisted: ReadonlyArray<HarnessV1ToolSpec>;\n current: ReadonlyArray<HarnessV1ToolSpec>;\n}): void {\n if (\n fingerprintValue({ value: persisted }) !==\n fingerprintValue({ value: current })\n ) {\n throw new Error(\n 'ACP lossy rerun requires the same active host tool catalog as the original turn.',\n );\n }\n}\n\nfunction fingerprintValue({ value }: { value: unknown }): string {\n return createHash('sha256').update(JSON.stringify(value)).digest('hex');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction unsupported({\n harnessId,\n message,\n cause,\n}: {\n harnessId: string;\n message: string;\n cause?: unknown;\n}): HarnessCapabilityUnsupportedError {\n return new HarnessCapabilityUnsupportedError({\n harnessId,\n message,\n cause,\n });\n}\n\nfunction deserializeBridgeError({\n error,\n harnessId,\n}: {\n error: unknown;\n harnessId: string;\n}): unknown {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n return unsupported({ harnessId, message: error.message });\n }\n return error;\n}\n","import { createHash } from 'node:crypto';\nimport {\n getAiGatewayAuthFromEnv,\n isHarnessAuthenticationEnvironment,\n} from '@ai-sdk/harness/utils';\nimport type {\n ACPAuthentication,\n ACPAuthenticationMode as ACPV1AuthenticationMode,\n ACPProviderAuthentication,\n} from './v1';\nimport type { ACPResolvedProviderAuthentication } from './v1/bridge/acp-v1-bridge-environment';\n\nconst DEFAULT_AI_GATEWAY_BASE_URL = 'https://ai-gateway.vercel.sh';\n\nexport type ACPAuthenticationMode = ACPV1AuthenticationMode;\n\nexport type ACPClientApp = {\n readonly name: string;\n readonly version: string;\n};\n\ntype ACPAuthResolutionOptions = {\n readonly mode?: ACPAuthenticationMode;\n readonly providerAuthentication: ACPProviderAuthentication | undefined;\n readonly clientApp: ACPClientApp;\n};\n\ntype ACPGatewayCredentialSource = 'AI_GATEWAY_API_KEY' | 'VERCEL_OIDC_TOKEN';\n\nexport type ACPProviderAuthenticationCompatibility =\n | {\n readonly type: 'direct';\n readonly mode: 'auto' | 'direct';\n }\n | {\n readonly type: 'ai-gateway';\n readonly mode: 'auto' | 'ai-gateway';\n readonly env: ACPProviderAuthentication['gateway']['env'];\n readonly credentialSource: ACPGatewayCredentialSource | null;\n readonly baseUrl: string;\n };\n\nexport type ACPAuthenticationProfileIdentity = {\n readonly digest: string;\n readonly acpMethodId?: string;\n readonly providerKind: 'direct' | 'ai-gateway';\n readonly providerMode?: 'auto' | 'direct' | 'ai-gateway';\n readonly gatewayCredentialSource?:\n | 'AI_GATEWAY_API_KEY'\n | 'VERCEL_OIDC_TOKEN'\n | null;\n};\n\nexport function createACPAuthenticationProfileIdentity({\n authentication,\n providerAuthenticationCompatibility,\n}: {\n authentication: ACPAuthentication | undefined;\n providerAuthenticationCompatibility:\n | ACPProviderAuthenticationCompatibility\n | undefined;\n}): ACPAuthenticationProfileIdentity {\n const providerKind = providerAuthenticationCompatibility?.type ?? 'direct';\n const digest = createHash('sha256')\n .update(\n stableStringify({\n value: {\n authentication: authentication ?? null,\n providerAuthentication: providerAuthenticationCompatibility ?? null,\n },\n }),\n )\n .digest('hex');\n return {\n digest,\n ...(authentication == null ? {} : { acpMethodId: authentication.methodId }),\n providerKind,\n ...(providerAuthenticationCompatibility == null\n ? {}\n : { providerMode: providerAuthenticationCompatibility.mode }),\n ...(providerAuthenticationCompatibility?.type === 'ai-gateway'\n ? {\n gatewayCredentialSource:\n providerAuthenticationCompatibility.credentialSource,\n }\n : {}),\n };\n}\n\nexport function resolveACPProviderAuthentication({\n auth,\n env,\n compatibility,\n}: {\n auth: ACPAuthResolutionOptions;\n env: Record<string, string | undefined>;\n compatibility?: ACPProviderAuthenticationCompatibility;\n}): {\n readonly providerAuthentication:\n | ACPResolvedProviderAuthentication\n | undefined;\n readonly env: Record<string, string>;\n} {\n const clientAppEnv = {\n AI_SDK_ACP_CLIENT_APP_NAME: auth.clientApp.name,\n AI_SDK_ACP_CLIENT_APP_VERSION: auth.clientApp.version,\n };\n const resolvedEnv = resolveACPAuthenticationEnvironment({\n auth: auth.mode,\n env,\n });\n const providerAuthentication = auth.providerAuthentication;\n if (providerAuthentication == null) {\n return { providerAuthentication: undefined, env: clientAppEnv };\n }\n\n if (compatibility?.type === 'direct') {\n return {\n providerAuthentication: { type: 'direct' },\n env: clientAppEnv,\n };\n }\n\n const mode = resolveACPProviderAuthenticationMode(auth.mode);\n if (mode === 'direct') {\n return {\n providerAuthentication: { type: 'direct' },\n env: clientAppEnv,\n };\n }\n\n const gateway =\n compatibility?.type === 'ai-gateway'\n ? {\n apiKey: resolveGatewayCredential({\n env: resolvedEnv,\n credentialSource: compatibility.credentialSource,\n }),\n baseUrl: compatibility.baseUrl,\n }\n : getAiGatewayAuthFromEnv({ env: resolvedEnv });\n const apiKey = gateway.apiKey;\n if (compatibility == null && mode === 'auto' && apiKey == null) {\n return {\n providerAuthentication: { type: 'direct' },\n env: clientAppEnv,\n };\n }\n if (apiKey == null) {\n throw new Error(\n 'AI Gateway authentication was selected, but neither AI_GATEWAY_API_KEY nor VERCEL_OIDC_TOKEN is set.',\n );\n }\n\n return {\n providerAuthentication: {\n type: 'ai-gateway',\n env:\n compatibility?.type === 'ai-gateway'\n ? compatibility.env\n : providerAuthentication.gateway.env,\n },\n env: {\n AI_SDK_ACP_GATEWAY_API_KEY: apiKey,\n AI_SDK_ACP_GATEWAY_BASE_URL: gateway.baseUrl,\n ...clientAppEnv,\n },\n };\n}\n\nexport function resolveACPProviderAuthenticationCompatibility({\n auth = 'auto',\n providerAuthentication,\n env,\n}: {\n auth?: ACPAuthenticationMode;\n providerAuthentication: ACPProviderAuthentication | undefined;\n env: Record<string, string | undefined>;\n}): ACPProviderAuthenticationCompatibility | undefined {\n const resolvedEnv = resolveACPAuthenticationEnvironment({\n auth,\n env,\n });\n if (providerAuthentication == null) return undefined;\n\n const mode = resolveACPProviderAuthenticationMode(auth);\n if (mode === 'direct') {\n return { type: 'direct', mode };\n }\n\n const credentialSource = resolveGatewayCredentialSource({ env: resolvedEnv });\n if (mode === 'auto' && credentialSource == null) {\n return { type: 'direct', mode };\n }\n\n return {\n type: 'ai-gateway',\n mode,\n env: providerAuthentication.gateway.env,\n credentialSource,\n baseUrl: resolvedEnv.AI_GATEWAY_BASE_URL ?? DEFAULT_AI_GATEWAY_BASE_URL,\n };\n}\n\nfunction resolveACPProviderAuthenticationMode(\n auth: ACPAuthenticationMode | undefined,\n): Extract<ACPAuthenticationMode, string> {\n return typeof auth === 'string' || auth == null ? (auth ?? 'auto') : 'auto';\n}\n\nexport function resolveACPAuthenticationEnvironment({\n auth,\n env,\n}: {\n auth: ACPAuthenticationMode | undefined;\n env: Record<string, string | undefined>;\n}): Record<string, string | undefined> {\n return isHarnessAuthenticationEnvironment(auth) ? auth : env;\n}\n\nexport function resolveACPEnv({\n auth,\n env,\n}: {\n auth: ACPAuthResolutionOptions;\n env: Record<string, string | undefined>;\n}): Record<string, string> {\n return resolveACPProviderAuthentication({ auth, env }).env;\n}\n\nfunction resolveGatewayCredentialSource({\n env,\n}: {\n env: Record<string, string | undefined>;\n}): ACPGatewayCredentialSource | null {\n return env.AI_GATEWAY_API_KEY\n ? 'AI_GATEWAY_API_KEY'\n : env.VERCEL_OIDC_TOKEN\n ? 'VERCEL_OIDC_TOKEN'\n : null;\n}\n\nfunction resolveGatewayCredential({\n env,\n credentialSource,\n}: {\n env: Record<string, string | undefined>;\n credentialSource: ACPGatewayCredentialSource | null;\n}): string | undefined {\n const gatewayFromEnv = getAiGatewayAuthFromEnv({ env });\n switch (credentialSource) {\n case 'AI_GATEWAY_API_KEY':\n return env.AI_GATEWAY_API_KEY == null ? undefined : gatewayFromEnv.apiKey;\n case 'VERCEL_OIDC_TOKEN':\n return getAiGatewayAuthFromEnv({\n env: { VERCEL_OIDC_TOKEN: env.VERCEL_OIDC_TOKEN },\n }).apiKey;\n case null:\n return undefined;\n }\n}\n\nfunction stableStringify({ value }: { value: unknown }): string {\n return JSON.stringify(sortIdentityValue({ value }));\n}\n\nfunction sortIdentityValue({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sortIdentityValue({ value: item }));\n }\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, entry]) => [key, sortIdentityValue({ value: entry })]),\n );\n }\n return value;\n}\n","import { createHash } from 'node:crypto';\nimport type {\n ACPClientApp,\n ACPProviderAuthenticationCompatibility,\n} from '../acp-auth';\nimport type {\n ACPModelMapping,\n ACPNpmSimpleSource,\n ACPPermissionModeMapping,\n ACPSerializableValue,\n ACPSource,\n ACPV1Settings,\n} from './acp-v1-settings';\n\n/*\n * Launch descriptor assembled from the launch-related settings fields. The\n * fields are declared here rather than derived from ACPV1Settings so that the\n * settings type stays free to describe the configuration surface while this\n * type describes what the bootstrap, install, and identity logic consume. The\n * two shapes are required to agree, and createACPV1Implementation is the only\n * place that maps between them.\n */\nexport type ACPImplementation = {\n readonly source: ACPSource;\n readonly executable: string;\n readonly args?: ReadonlyArray<string>;\n readonly forwardEnv?: ReadonlyArray<string>;\n readonly credentialEnv?: ReadonlyArray<string>;\n readonly env?: Readonly<Record<string, string>>;\n};\n\nexport function createACPV1Implementation({\n settings,\n}: {\n settings: ACPV1Settings;\n}): ACPImplementation {\n return {\n source: settings.source,\n executable: settings.executable,\n args: settings.args,\n forwardEnv: settings.forwardEnv,\n credentialEnv: settings.credentialEnv,\n env: settings.env,\n };\n}\n\nconst EXACT_SEMVER_REGEXP =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\nconst PACKAGE_NAME_REGEXP =\n /^(?:@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$/;\nconst EXECUTABLE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst ENVIRONMENT_VARIABLE_NAME_REGEXP = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport function validateACPV1Implementation(\n implementation: ACPImplementation,\n): void {\n const { source } = implementation;\n if (source.type === 'npm-locked') {\n if (source.packageJson.length === 0) {\n throw new Error('ACP source.packageJson must not be empty.');\n }\n if (source.pnpmLockYaml.length === 0) {\n throw new Error('ACP source.pnpmLockYaml must not be empty.');\n }\n if (source.pnpmWorkspaceYaml?.length === 0) {\n throw new Error('ACP source.pnpmWorkspaceYaml must not be empty.');\n }\n } else if (source.type === 'npm-simple') {\n validateNpmSimpleSource({ source });\n } else if (source.command.trim().length === 0) {\n throw new Error('ACP source.command must not be empty.');\n }\n if (!EXECUTABLE_NAME_REGEXP.test(implementation.executable)) {\n throw new Error(\n `ACP executable must be a bare command name without a path; received ${JSON.stringify(implementation.executable)}.`,\n );\n }\n\n validateForwardEnvironment({ forwardEnv: implementation.forwardEnv });\n validateForwardEnvironment({ forwardEnv: implementation.credentialEnv });\n validateEnvironment({ env: implementation.env });\n const forwardedKeys = new Set(implementation.forwardEnv ?? []);\n const credentialKeys = new Set(implementation.credentialEnv ?? []);\n for (const key of credentialKeys) {\n if (forwardedKeys.has(key)) {\n throw new Error(\n `ACP runtime environment key ${JSON.stringify(key)} cannot be configured in both forwardEnv and credentialEnv.`,\n );\n }\n }\n for (const key of Object.keys(implementation.env ?? {})) {\n if (forwardedKeys.has(key)) {\n throw new Error(\n `ACP runtime environment key ${JSON.stringify(key)} cannot be configured in both forwardEnv and env.`,\n );\n }\n if (credentialKeys.has(key)) {\n throw new Error(\n `ACP runtime environment key ${JSON.stringify(key)} cannot be configured in both credentialEnv and env.`,\n );\n }\n }\n}\n\nexport function createImplementationManifest({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n const { source } = implementation;\n if (source.type === 'install-command') return undefined;\n if (source.type === 'npm-locked') {\n return source.packageJson;\n }\n return (\n JSON.stringify(\n {\n name: 'harness-acp-implementation',\n version: '0.0.0',\n private: true,\n type: 'module',\n dependencies: {\n [source.packageName]: source.packageVersion ?? 'latest',\n },\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\nexport function getImplementationLockfile({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n const { source } = implementation;\n return source.type === 'npm-locked' ? source.pnpmLockYaml : undefined;\n}\n\nexport function getImplementationWorkspaceFile({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n const { source } = implementation;\n return source.type === 'npm-locked' ? source.pnpmWorkspaceYaml : undefined;\n}\n\nexport function createImplementationDescriptor({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string {\n return (\n JSON.stringify(\n {\n executablePath:\n implementation.source.type === 'install-command'\n ? `home/.local/bin/${implementation.executable}`\n : `node_modules/.bin/${implementation.executable}`,\n privateHome: implementation.source.type === 'install-command',\n args: implementation.args ?? [],\n envKeys: getImplementationEnvironmentKeys({ implementation }),\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\nexport function createImplementationIdentity({\n harnessId,\n acpVersion,\n implementation,\n clientApp,\n clientCapabilities,\n modelMapping,\n providerAuthentication,\n permissionModeMapping,\n}: {\n harnessId: string;\n acpVersion: 'v1';\n implementation: ACPImplementation;\n clientApp: ACPClientApp;\n clientCapabilities?: Readonly<Record<string, ACPSerializableValue>>;\n modelMapping: ACPModelMapping;\n providerAuthentication: ACPProviderAuthenticationCompatibility | undefined;\n permissionModeMapping?: ACPPermissionModeMapping;\n}): string {\n const { source } = implementation;\n const sourceIdentity =\n source.type === 'npm-locked'\n ? {\n type: source.type,\n packageJson: source.packageJson,\n pnpmLockYaml: source.pnpmLockYaml,\n pnpmWorkspaceYaml: source.pnpmWorkspaceYaml,\n }\n : source.type === 'npm-simple'\n ? {\n type: source.type,\n packageName: source.packageName,\n ...(source.packageVersion == null\n ? {}\n : { packageVersion: source.packageVersion }),\n }\n : {\n type: source.type,\n command: source.command,\n };\n const forwardedEnvironment = [\n ...new Set(implementation.forwardEnv ?? []),\n ].sort();\n const credentialEnvironment = [\n ...new Set(implementation.credentialEnv ?? []),\n ].sort();\n const literalEnvironment = Object.fromEntries(\n Object.entries(implementation.env ?? {})\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => [key, { value }]),\n );\n const payload = {\n harnessId,\n acpVersion,\n source: sourceIdentity,\n executable: implementation.executable,\n args: implementation.args ?? [],\n clientApp,\n clientCapabilities: clientCapabilities ?? null,\n modelMapping,\n environment: {\n forwarded: forwardedEnvironment,\n credential: credentialEnvironment,\n literal: literalEnvironment,\n },\n providerAuthentication: providerAuthentication ?? null,\n permissionModeMapping: permissionModeMapping ?? null,\n };\n return createHash('sha256')\n .update(stableStringify({ value: payload }))\n .digest('hex');\n}\n\nexport function createImplementationInstallCommand({\n implementationDir,\n storeDir,\n implementation,\n}: {\n implementationDir: string;\n storeDir: string;\n implementation: ACPImplementation;\n}): string {\n if (implementation.source.type === 'install-command') {\n return 'bash implementation/install.sh';\n }\n return (\n `pnpm --dir ${implementationDir} install` +\n (implementation.source.type === 'npm-locked' ? ' --frozen-lockfile' : '') +\n ` --prod --store-dir ${storeDir}`\n );\n}\n\nexport function getImplementationInstallScript({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n if (implementation.source.type !== 'install-command') return undefined;\n return `#!/usr/bin/env bash\nset -euo pipefail\n\nACP_IMPLEMENTATION_DIR=\"$(cd \"$(dirname \"\\${BASH_SOURCE[0]}\")\" && pwd)\"\nACP_INSTALL_HOME=\"$ACP_IMPLEMENTATION_DIR/home\"\nexport HOME=\"$ACP_INSTALL_HOME\"\nexport PATH=\"$ACP_INSTALL_HOME/.local/bin:$PATH\"\n\nmkdir -p \"$ACP_INSTALL_HOME/.local/bin\"\ncd \"$ACP_IMPLEMENTATION_DIR\"\n\n${implementation.source.command}\n`;\n}\n\nexport function resolveImplementationEnvironment({\n implementation,\n env,\n credentialEnv = env,\n}: {\n implementation: ACPImplementation;\n env: Readonly<Record<string, string | undefined>>;\n credentialEnv?: Readonly<Record<string, string | undefined>>;\n}): Record<string, string> {\n const forwardedEnvironment: Record<string, string> = {};\n for (const name of implementation.forwardEnv ?? []) {\n const value = env[name];\n if (value != null && value.length > 0) {\n forwardedEnvironment[name] = value;\n }\n }\n for (const name of implementation.credentialEnv ?? []) {\n const value = credentialEnv[name];\n if (value != null && value.length > 0) {\n forwardedEnvironment[name] = value;\n }\n }\n return {\n ...forwardedEnvironment,\n ...implementation.env,\n };\n}\n\nfunction validateNpmSimpleSource({\n source,\n}: {\n source: ACPNpmSimpleSource;\n}): void {\n if (!PACKAGE_NAME_REGEXP.test(source.packageName)) {\n throw new Error(\n `ACP npm package name is invalid: ${JSON.stringify(source.packageName)}.`,\n );\n }\n if (\n source.packageVersion != null &&\n !EXACT_SEMVER_REGEXP.test(source.packageVersion)\n ) {\n throw new Error(\n `ACP npm package version must be an exact semantic version; received ${JSON.stringify(source.packageVersion)}.`,\n );\n }\n}\n\nfunction validateEnvironment({\n env,\n}: {\n env: Readonly<Record<string, string>> | undefined;\n}): void {\n for (const [key, value] of Object.entries(env ?? {})) {\n if (!ENVIRONMENT_VARIABLE_NAME_REGEXP.test(key)) {\n throw new Error(\n `ACP environment variable name is invalid: ${JSON.stringify(key)}.`,\n );\n }\n if (value.includes('\\0')) {\n throw new Error(`ACP runtime environment value for ${key} contains NUL.`);\n }\n }\n}\n\nfunction validateForwardEnvironment({\n forwardEnv,\n}: {\n forwardEnv: ReadonlyArray<string> | undefined;\n}): void {\n for (const name of forwardEnv ?? []) {\n if (!ENVIRONMENT_VARIABLE_NAME_REGEXP.test(name)) {\n throw new Error(\n `ACP environment variable name is invalid: ${JSON.stringify(name)}.`,\n );\n }\n }\n}\n\nfunction getImplementationEnvironmentKeys({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string[] {\n return [\n ...new Set([\n ...(implementation.forwardEnv ?? []),\n ...(implementation.credentialEnv ?? []),\n ...Object.keys(implementation.env ?? {}),\n ]),\n ].sort();\n}\n\nfunction stableStringify({ value }: { value: unknown }): string {\n return JSON.stringify(sortValue({ value }));\n}\n\nfunction sortValue({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sortValue({ value: item }));\n }\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, sortValue({ value: item })]),\n );\n }\n return value;\n}\n","import type { HarnessV1Bootstrap } from '@ai-sdk/harness';\nimport { createReadBridgeAsset } from '@ai-sdk/harness/utils';\nimport {\n createImplementationDescriptor,\n createImplementationInstallCommand,\n createImplementationManifest,\n getImplementationInstallScript,\n getImplementationLockfile,\n getImplementationWorkspaceFile,\n type ACPImplementation,\n} from './implementation';\n\nconst readBridgeAsset = createReadBridgeAsset({\n resolveAssetUrl: name => new URL(`./bridge/${name}`, import.meta.url),\n});\n\nexport function createACPBootstrap({\n harnessId,\n implementation,\n}: {\n readonly harnessId: string;\n readonly implementation: ACPImplementation;\n}): {\n readonly bootstrapDir: string;\n readonly getBootstrap: () => Promise<HarnessV1Bootstrap>;\n} {\n const bootstrapDir = `.harness-bootstrap/${harnessId}`;\n let cachedBootstrap: HarnessV1Bootstrap | undefined;\n\n return {\n bootstrapDir,\n getBootstrap: async () => {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [bridgePackage, bridgeLock, bridge, hostToolMCP] =\n await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n const implementationManifest = createImplementationManifest({\n implementation,\n });\n const implementationLock = getImplementationLockfile({\n implementation,\n });\n const implementationWorkspace = getImplementationWorkspaceFile({\n implementation,\n });\n const implementationInstallScript = getImplementationInstallScript({\n implementation,\n });\n cachedBootstrap = {\n harnessId,\n bootstrapDir,\n files: [\n {\n path: `${bootstrapDir}/package.json`,\n content: bridgePackage,\n },\n {\n path: `${bootstrapDir}/pnpm-lock.yaml`,\n content: bridgeLock,\n },\n { path: `${bootstrapDir}/bridge.mjs`, content: bridge },\n {\n path: `${bootstrapDir}/host-tool-mcp.mjs`,\n content: hostToolMCP,\n },\n {\n path: `${bootstrapDir}/implementation/implementation.json`,\n content: createImplementationDescriptor({ implementation }),\n },\n ...(implementationManifest == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/package.json`,\n content: implementationManifest,\n },\n ]),\n ...(implementationLock == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/pnpm-lock.yaml`,\n content: implementationLock,\n },\n ]),\n ...(implementationWorkspace == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/pnpm-workspace.yaml`,\n content: implementationWorkspace,\n },\n ]),\n ...(implementationInstallScript == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/install.sh`,\n content: implementationInstallScript,\n },\n ]),\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: createImplementationInstallCommand({\n implementationDir: 'implementation',\n storeDir: '../.pnpm-store',\n implementation,\n }),\n },\n ],\n };\n return cachedBootstrap;\n },\n };\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n harnessV1BridgeToolWireSchema,\n type HarnessV1BuiltinTool,\n type HarnessV1DebugConfig,\n type HarnessV1LifecycleState,\n type HarnessV1PermissionMode,\n type HarnessV1ToolSpec,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\nimport type { ACPToolCall } from '../acp-tool-call';\nimport type {\n ACPInstructionMapping,\n ACPModelMapping,\n ACPPermissionModeMapping,\n} from './acp-v1-settings';\nimport { acpTextContentBlockSchema } from './acp-v1-prompt';\n\nexport type ACPBuiltinToolMapping = {\n /**\n * Key of the tool in `HarnessV1.builtinTools`, which is also emitted as the\n * Harness V1 `toolName`. It is the common tool name when the tool has a\n * standardized Harness V1 equivalent; otherwise it is the native tool name.\n */\n readonly toolName: string;\n\n /**\n * Name used by the underlying agent runtime. It is present when `toolName`\n * is a Harness V1 common tool name that differs from the runtime's name.\n */\n readonly nativeName?: HarnessV1BuiltinTool['nativeName'];\n\n /**\n * Stable prefix of the display title emitted by an ACP implementation.\n * Used only when the implementation omits a programmatic tool name.\n */\n readonly title?: HarnessV1BuiltinTool['title'];\n\n /**\n * Broad capability category used to compare a built-in with the ACP tool\n * kind when resolving unnamed calls.\n */\n readonly toolUseKind?: HarnessV1BuiltinTool['toolUseKind'];\n\n /**\n * JSON Schema used to identify tool calls when an ACP implementation does\n * not provide a programmatic tool name. It is optional because built-in\n * definitions are allowed to omit their input schema.\n */\n readonly inputSchema?: HarnessV1LifecycleState['data'];\n};\n\nconst builtinToolSchema: z.ZodType<ACPBuiltinToolMapping> = z.object({\n toolName: z.string(),\n nativeName: z.string().optional(),\n title: z.string().optional(),\n toolUseKind: z.enum(['readonly', 'edit', 'bash']).optional(),\n inputSchema: z.json().optional(),\n});\n\ntype ACPSerializableToolSpec = Omit<HarnessV1ToolSpec, 'inputSchema'> & {\n readonly inputSchema?: NonNullable<HarnessV1ToolSpec['inputSchema']> &\n HarnessV1LifecycleState['data'];\n};\n\nconst jsonValueSchema = z.json();\n\nexport const acpSerializableToolSpecSchema: z.ZodType<ACPSerializableToolSpec> =\n harnessV1BridgeToolWireSchema.extend({\n inputSchema: z\n .custom<NonNullable<ACPSerializableToolSpec['inputSchema']>>(\n value =>\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n jsonValueSchema.safeParse(value).success,\n )\n .optional(),\n });\n\nconst permissionModeTargetSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('session-mode'),\n modeId: z.string(),\n }),\n z.object({\n type: z.literal('session-config-option'),\n configId: z.string(),\n value: z.union([z.string(), z.boolean()]),\n }),\n]);\n\nconst permissionModeMappingSchema: z.ZodType<ACPPermissionModeMapping> =\n z.object({\n 'allow-reads': permissionModeTargetSchema.nullable(),\n 'allow-edits': permissionModeTargetSchema.nullable(),\n 'allow-all': permissionModeTargetSchema.nullable(),\n });\n\nconst instructionMappingPathSchema = z.array(z.string().min(1)).min(1);\n\nconst instructionMappingSchema: z.ZodType<ACPInstructionMapping> =\n z.discriminatedUnion('type', [\n z.object({\n type: z.literal('session-meta'),\n path: instructionMappingPathSchema,\n }),\n z.object({\n type: z.literal('launch-env-json'),\n variable: z.string().min(1),\n path: instructionMappingPathSchema,\n }),\n z.object({\n type: z.literal('filesystem'),\n path: z.string().min(1),\n }),\n ]);\n\ntype ACPSerializableOutputSchemaMapping = {\n readonly type: 'session-prompt-meta';\n readonly path: string[];\n};\n\nconst outputSchemaMappingSchema: z.ZodType<ACPSerializableOutputSchemaMapping> =\n z.object({\n type: z.literal('session-prompt-meta'),\n path: z.array(z.string().min(1)).min(1),\n });\n\nconst modelMappingSchema: z.ZodType<ACPModelMapping> = z.discriminatedUnion(\n 'type',\n [\n z.object({\n type: z.literal('session-config-option'),\n path: z.string().min(1),\n }),\n z.object({\n type: z.literal('session-model'),\n path: z.string().min(1),\n }),\n ],\n);\n\nexport type ACPTurnStartConfig = {\n readonly version: 1;\n readonly configurationFingerprint: string;\n readonly prompt: Array<z.infer<typeof acpTextContentBlockSchema>>;\n readonly tools: Array<ACPSerializableToolSpec>;\n readonly builtinTools: Array<ACPBuiltinToolMapping>;\n readonly permissionMode: HarnessV1PermissionMode;\n readonly permissionModeMapping?: ACPPermissionModeMapping;\n readonly model?: string;\n readonly modelMapping?: ACPModelMapping;\n readonly debug?: HarnessV1DebugConfig;\n readonly responseFormat?: z.infer<\n typeof harnessV1BridgeStartBaseSchema\n >['responseFormat'];\n readonly outputSchemaMapping?: ACPSerializableOutputSchemaMapping;\n};\n\nexport const acpTurnStartConfigSchema = z.object({\n version: z.literal(1),\n configurationFingerprint: z.string(),\n prompt: z.array(acpTextContentBlockSchema),\n tools: z.array(acpSerializableToolSpecSchema).default([]),\n builtinTools: z.array(builtinToolSchema).default([]),\n permissionMode: harnessV1BridgeStartBaseSchema.shape.permissionMode.unwrap(),\n permissionModeMapping: permissionModeMappingSchema.optional(),\n model: harnessV1BridgeStartBaseSchema.shape.model.optional(),\n modelMapping: modelMappingSchema.optional(),\n debug: harnessV1BridgeStartBaseSchema.shape.debug.optional(),\n responseFormat:\n harnessV1BridgeStartBaseSchema.shape.responseFormat.optional(),\n outputSchemaMapping: outputSchemaMappingSchema.optional(),\n}) satisfies z.ZodType<ACPTurnStartConfig>;\n\nexport type ACPColdSessionState = Omit<\n ACPTurnStartConfig,\n 'prompt' | 'debug' | 'model' | 'modelMapping'\n>;\n\nexport const acpColdSessionStateSchema: z.ZodType<ACPColdSessionState> =\n acpTurnStartConfigSchema.omit({\n prompt: true,\n debug: true,\n model: true,\n modelMapping: true,\n });\n\nconst lossyRecoverySchema = z.object({\n type: z.literal('lossy-rerun'),\n acpSessionId: z.string(),\n reason: z.string(),\n});\n\nconst coldRestoreSchema = z.object({\n type: z.literal('cold-restore'),\n acpSessionId: z.string(),\n});\n\nconst acpToolCallCandidateSchema = z.object({\n type: z.literal('acp-tool-call-candidate'),\n requestId: z.string(),\n toolCall: z.custom<ACPToolCall>(\n value =>\n value != null &&\n typeof value === 'object' &&\n typeof (value as { toolCallId?: unknown }).toolCallId === 'string' &&\n typeof (value as { title?: unknown }).title === 'string',\n ),\n});\n\nconst acpQuestionRequestSchema = z.object({\n type: z.literal('acp-question-request'),\n requestId: z.string(),\n nativeRequest: z.unknown(),\n nativeToolCall: acpToolCallCandidateSchema.shape.toolCall.optional(),\n});\n\nconst acpQuestionResolvedSchema = z.object({\n type: z.literal('acp-question-resolved'),\n requestId: z.string(),\n});\n\nexport const outboundMessageSchema = z.union([\n harnessV1BridgeOutboundMessageSchema,\n acpToolCallCandidateSchema,\n acpQuestionRequestSchema,\n acpQuestionResolvedSchema,\n]);\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n prompt: z.array(acpTextContentBlockSchema),\n instructions: z.string().optional(),\n instructionMapping: instructionMappingSchema.optional(),\n outputSchemaMapping: outputSchemaMappingSchema.optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n tools: z.array(acpSerializableToolSpecSchema).optional(),\n builtinTools: z.array(builtinToolSchema).readonly().default([]),\n permissionModeMapping: permissionModeMappingSchema.optional(),\n modelMapping: modelMappingSchema.optional(),\n turnStartConfig: acpTurnStartConfigSchema,\n recoveryMode: z\n .discriminatedUnion('type', [lossyRecoverySchema, coldRestoreSchema])\n .optional(),\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","import {\n HarnessCapabilityUnsupportedError,\n type HarnessV1Prompt,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const acpTextContentBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\nexport type ACPTextContentBlock = z.infer<typeof acpTextContentBlockSchema>;\n\nexport function convertHarnessPromptToACPTextBlocks({\n prompt,\n harnessId,\n}: {\n prompt: HarnessV1Prompt;\n harnessId: string;\n}): ACPTextContentBlock[] {\n if (typeof prompt === 'string') {\n return [{ type: 'text', text: prompt }];\n }\n if (typeof prompt.content === 'string') {\n return [{ type: 'text', text: prompt.content }];\n }\n\n const content: ACPTextContentBlock[] = [];\n for (const part of prompt.content) {\n if (part.type === 'text') {\n content.push({ type: 'text', text: part.text });\n continue;\n }\n if (part.type === 'image') {\n throw unsupportedPromptContent({\n harnessId,\n category: 'image content',\n });\n }\n if (part.type === 'file') {\n const mediaCategory = part.mediaType.toLowerCase().split('/', 1)[0];\n if (mediaCategory === 'image') {\n throw unsupportedPromptContent({\n harnessId,\n category: 'image content',\n });\n }\n if (mediaCategory === 'audio') {\n throw unsupportedPromptContent({\n harnessId,\n category: 'audio content',\n });\n }\n throw unsupportedPromptContent({\n harnessId,\n category: `embedded resource content with media type ${JSON.stringify(part.mediaType)}`,\n });\n }\n throw unsupportedPromptContent({\n harnessId,\n category: `content parts of type ${JSON.stringify(\n (part as { readonly type?: unknown }).type,\n )}`,\n });\n }\n return content;\n}\n\nexport function prependACPInstructionGuidance({\n prompt,\n instructions,\n}: {\n prompt: ReadonlyArray<ACPTextContentBlock>;\n instructions: string | undefined;\n}): ACPTextContentBlock[] {\n const hasInstructions = instructions != null && instructions.length > 0;\n if (!hasInstructions) return [...prompt];\n\n const lines = [\n '<session-guidance>',\n 'This block is operating guidance from the harness, not user-authored content.',\n ];\n lines.push('<instructions>', instructions, '</instructions>');\n lines.push('</session-guidance>');\n\n return [{ type: 'text', text: lines.join('\\n') }, ...prompt];\n}\n\nfunction unsupportedPromptContent({\n harnessId,\n category,\n}: {\n harnessId: string;\n category: string;\n}): HarnessCapabilityUnsupportedError {\n return new HarnessCapabilityUnsupportedError({\n harnessId,\n message:\n `The ${harnessId} ACP harness supports only portable text prompts and does not support ${category}. ` +\n 'Pass a string or a user message whose content contains only text parts.',\n });\n}\n","import { z } from 'zod/v4';\nimport type {\n ACPAuthentication,\n ACPHostToolMCPTransport,\n ACPProfileValue,\n ACPSerializableValue,\n} from '../acp-v1-settings';\n\nexport const ACP_BRIDGE_CONFIGURATION_ENV = 'AI_SDK_ACP_BRIDGE_CONFIGURATION';\n\nconst serializableValueSchema: z.ZodType<ACPSerializableValue> = z.json();\n\nconst profileValueSchema: z.ZodType<ACPProfileValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.object({\n $source: z.enum([\n 'gateway-api-key',\n 'gateway-base-url',\n 'gateway-authorization',\n 'client-app',\n 'client-app-name',\n 'client-app-version',\n ]),\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n ensureSuffix: z.string().optional(),\n }),\n z.array(profileValueSchema),\n z.record(z.string(), profileValueSchema),\n ]),\n);\n\nconst hostToolMcpTransportSchema: z.ZodType<ACPHostToolMCPTransport> = z.enum([\n 'stdio',\n 'http',\n]);\n\nconst serializableRecordSchema = z.record(z.string(), serializableValueSchema);\nconst profileRecordSchema = z.record(z.string(), profileValueSchema);\n\nconst authenticationSchema: z.ZodType<ACPAuthentication> = z.object({\n methodId: z.string(),\n meta: serializableRecordSchema.optional(),\n clientCapabilities: serializableRecordSchema.optional(),\n});\n\nconst providerAuthenticationSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('direct') }),\n z.object({\n type: z.literal('ai-gateway'),\n env: profileRecordSchema,\n }),\n]);\n\nexport type ACPResolvedProviderAuthentication = z.infer<\n typeof providerAuthenticationSchema\n>;\n\nexport type ACPBridgeConfiguration = {\n readonly authentication?: ACPAuthentication;\n readonly providerAuthentication?: ACPResolvedProviderAuthentication;\n readonly providerEnvironment?: Readonly<Record<string, string>>;\n readonly sessionMeta?: Readonly<Record<string, ACPSerializableValue>>;\n readonly clientCapabilities?: Readonly<Record<string, ACPSerializableValue>>;\n readonly askUserQuestionsRequestMethod?: string;\n readonly hostToolMcpTransport?: ACPHostToolMCPTransport;\n};\n\nconst bridgeConfigurationSchema: z.ZodType<ACPBridgeConfiguration> = z.object({\n authentication: authenticationSchema.optional(),\n providerAuthentication: providerAuthenticationSchema.optional(),\n providerEnvironment: z.record(z.string(), z.string()).optional(),\n sessionMeta: serializableRecordSchema.optional(),\n clientCapabilities: serializableRecordSchema.optional(),\n askUserQuestionsRequestMethod: z.string().optional(),\n hostToolMcpTransport: hostToolMcpTransportSchema.optional(),\n});\n\nexport function createACPBridgeEnvironment({\n authentication,\n providerAuthentication,\n providerEnvironment,\n sessionMeta,\n clientCapabilities,\n askUserQuestionsRequestMethod,\n hostToolMcpTransport,\n}: ACPBridgeConfiguration): Record<string, string> {\n return {\n [ACP_BRIDGE_CONFIGURATION_ENV]: JSON.stringify({\n ...(authentication == null ? {} : { authentication }),\n ...(providerAuthentication == null ? {} : { providerAuthentication }),\n ...(providerEnvironment == null ? {} : { providerEnvironment }),\n ...(sessionMeta == null ? {} : { sessionMeta }),\n ...(clientCapabilities == null ? {} : { clientCapabilities }),\n ...(askUserQuestionsRequestMethod == null\n ? {}\n : { askUserQuestionsRequestMethod }),\n ...(hostToolMcpTransport == null ? {} : { hostToolMcpTransport }),\n }),\n };\n}\n\nexport async function readACPBridgeEnvironment({\n env,\n}: {\n env: Readonly<Record<string, string | undefined>>;\n}): Promise<ACPBridgeConfiguration> {\n const serialized = env[ACP_BRIDGE_CONFIGURATION_ENV];\n if (serialized == null) return {};\n try {\n const result = bridgeConfigurationSchema.safeParse(JSON.parse(serialized));\n if (result.success) return result.data;\n } catch {}\n throw new Error('ACP bridge configuration environment is invalid.');\n}\n","import type { ACPProfileValue, ACPSerializableValue } from '../acp-v1-settings';\n\nexport type ACPGatewayValues = {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly clientAppName: string;\n readonly clientAppVersion: string;\n};\n\nexport function resolveACPProfileValue({\n value,\n gateway,\n}: {\n value: ACPProfileValue;\n gateway: ACPGatewayValues;\n}): ACPSerializableValue {\n if (Array.isArray(value)) {\n return value.map(item => resolveACPProfileValue({ value: item, gateway }));\n }\n if (value !== null && typeof value === 'object') {\n if (isValueSource(value)) {\n const sourceValue = resolveSource({ source: value.$source, gateway });\n const resolved = `${value.prefix ?? ''}${sourceValue}`;\n return value.ensureSuffix == null\n ? `${resolved}${value.suffix ?? ''}`\n : ensureSuffix({\n value: resolved,\n suffix: value.ensureSuffix,\n });\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n resolveACPProfileValue({ value: item, gateway }),\n ]),\n );\n }\n return value;\n}\n\nfunction isValueSource(value: object): value is {\n readonly $source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n readonly prefix?: string;\n readonly suffix?: string;\n readonly ensureSuffix?: string;\n} {\n return (\n '$source' in value &&\n typeof (value as { $source?: unknown }).$source === 'string'\n );\n}\n\nfunction ensureSuffix({\n value,\n suffix,\n}: {\n value: string;\n suffix: string;\n}): string {\n const normalized = value.replace(/\\/+$/, '');\n return normalized.endsWith(suffix) ? normalized : `${normalized}${suffix}`;\n}\n\nfunction resolveSource({\n source,\n gateway,\n}: {\n source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n gateway: ACPGatewayValues;\n}): string {\n switch (source) {\n case 'gateway-api-key':\n return gateway.apiKey;\n case 'gateway-base-url':\n return gateway.baseUrl;\n case 'gateway-authorization':\n return `Bearer ${gateway.apiKey}`;\n case 'client-app':\n return `${gateway.clientAppName}/${gateway.clientAppVersion}`;\n case 'client-app-name':\n return gateway.clientAppName;\n case 'client-app-version':\n return gateway.clientAppVersion;\n }\n}\n","import type { ACPResolvedProviderAuthentication } from './acp-v1-bridge-environment';\nimport type { ACPClientApp } from '../../acp-auth';\nimport type { ACPAuthentication } from '../acp-v1-settings';\nimport {\n resolveACPProfileValue,\n type ACPGatewayValues,\n} from './profile-values';\n\nexport type ACPInitializeResult = {\n readonly protocolVersion: number;\n readonly authMethods?: ReadonlyArray<{ readonly id: string }> | null;\n readonly agentCapabilities?: Readonly<Record<string, unknown>> | null;\n};\n\nexport function createACPInitializeRequest({\n protocolVersion,\n clientApp,\n authentication,\n clientCapabilities: configuredClientCapabilities,\n supportsBooleanSessionConfigOptions = false,\n}: {\n protocolVersion: number;\n clientApp: ACPClientApp;\n authentication: ACPAuthentication | undefined;\n clientCapabilities?: Readonly<Record<string, unknown>>;\n supportsBooleanSessionConfigOptions?: boolean;\n}): {\n readonly protocolVersion: number;\n readonly clientInfo: {\n readonly name: string;\n readonly version: string;\n };\n readonly clientCapabilities: Readonly<Record<string, unknown>>;\n} {\n let clientCapabilities = mergeRecords({\n left: authentication?.clientCapabilities ?? {},\n right: configuredClientCapabilities ?? {},\n });\n if (supportsBooleanSessionConfigOptions) {\n clientCapabilities = mergeRecords({\n left: clientCapabilities,\n right: {\n session: {\n configOptions: {\n boolean: {},\n },\n },\n },\n });\n }\n return {\n protocolVersion,\n clientInfo: clientApp,\n clientCapabilities,\n };\n}\n\nexport function resolveACPLaunchEnvironment({\n providerAuthentication,\n gateway,\n}: {\n providerAuthentication: ACPResolvedProviderAuthentication | undefined;\n gateway: ACPGatewayValues | undefined;\n}): Record<string, string> {\n if (providerAuthentication?.type !== 'ai-gateway') {\n return {};\n }\n const resolved = asRecord(\n resolveACPProfileValue({\n value: providerAuthentication.env,\n gateway: requireGateway({ gateway }),\n }),\n );\n return Object.fromEntries(\n Object.entries(resolved).map(([key, value]) => [\n key,\n typeof value === 'string' ? value : JSON.stringify(value),\n ]),\n );\n}\n\nexport function validateACPProtocolVersion({\n requested,\n initialization,\n}: {\n requested: number;\n initialization: ACPInitializeResult;\n}): void {\n if (initialization.protocolVersion !== requested) {\n throw new Error(\n `ACP protocol negotiation failed: requested v${requested}, agent selected v${initialization.protocolVersion}.`,\n );\n }\n}\n\nexport function assertACPAuthenticationMethod({\n initialization,\n methodId,\n}: {\n initialization: ACPInitializeResult;\n methodId: string;\n}): void {\n if (!initialization.authMethods?.some(method => method.id === methodId)) {\n const advertised =\n initialization.authMethods?.map(method => method.id).join(', ') || 'none';\n throw new Error(\n `ACP authentication method ${JSON.stringify(methodId)} is not advertised by the agent. Advertised methods: ${advertised}.`,\n );\n }\n}\n\nfunction mergeRecords({\n left,\n right,\n}: {\n left: Readonly<Record<string, unknown>>;\n right: Readonly<Record<string, unknown>>;\n}): Readonly<Record<string, unknown>> {\n const result: Record<string, unknown> = { ...left };\n for (const [key, value] of Object.entries(right)) {\n const previous = result[key];\n result[key] =\n isRecord(previous) && isRecord(value)\n ? mergeRecords({ left: previous, right: value })\n : value;\n }\n return result;\n}\n\nfunction requireGateway({\n gateway,\n}: {\n gateway: ACPGatewayValues | undefined;\n}): ACPGatewayValues {\n if (gateway == null) {\n throw new Error('ACP Gateway profile values are unavailable.');\n }\n return gateway;\n}\n\nfunction asRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (!isRecord(value)) {\n throw new Error('ACP profile data must resolve to an object.');\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import { createHash } from 'node:crypto';\nimport type { HarnessV1DebugConfig, HarnessV1ToolSpec } from '@ai-sdk/harness';\nimport type { ACPAuthenticationProfileIdentity } from '../acp-auth';\nimport {\n acpSerializableToolSpecSchema,\n type ACPBuiltinToolMapping,\n type ACPColdSessionState,\n type ACPTurnStartConfig,\n type StartMessage,\n} from './acp-v1-bridge-protocol';\nimport type { ACPTextContentBlock } from './acp-v1-prompt';\nimport type {\n ACPInstructionMapping,\n ACPModelMapping,\n ACPOutputSchemaMapping,\n ACPPermissionModeMapping,\n ACPSerializableValue,\n} from './acp-v1-settings';\n\nexport function createACPTurnStartConfig({\n prompt,\n tools,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat,\n outputSchemaMapping,\n model,\n modelMapping,\n}: {\n prompt: ReadonlyArray<ACPTextContentBlock>;\n tools: ReadonlyArray<HarnessV1ToolSpec>;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionMode: NonNullable<StartMessage['permissionMode']>;\n permissionModeMapping: ACPPermissionModeMapping | undefined;\n mcpServers: Record<string, unknown> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n responseFormat: StartMessage['responseFormat'];\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n model: string | undefined;\n modelMapping: ACPModelMapping;\n}): ACPTurnStartConfig {\n return {\n version: 1,\n configurationFingerprint: createHash('sha256')\n .update(\n stableStringify({\n authenticationProfile,\n sessionMeta: sessionMeta ?? null,\n ...(instructionMapping == null ? {} : { instructionMapping }),\n ...(outputSchemaMapping == null ? {} : { outputSchemaMapping }),\n modelMapping,\n builtinTools,\n permissionModeMapping: permissionModeMapping ?? null,\n mcpServers: mcpServers ?? null,\n }),\n )\n .digest('hex'),\n prompt: [...prompt],\n tools: tools.map(tool => acpSerializableToolSpecSchema.parse(tool)),\n builtinTools: [...builtinTools],\n permissionMode,\n ...(model == null ? {} : { model, modelMapping }),\n ...(responseFormat == null ? {} : { responseFormat }),\n ...(outputSchemaMapping == null\n ? {}\n : {\n outputSchemaMapping: {\n type: outputSchemaMapping.type,\n path: [...outputSchemaMapping.path],\n },\n }),\n ...(permissionModeMapping == null ? {} : { permissionModeMapping }),\n ...(debug == null ? {} : { debug }),\n };\n}\n\nexport function createACPColdSessionState({\n turnStartConfig,\n}: {\n turnStartConfig: ACPTurnStartConfig;\n}): ACPColdSessionState {\n return {\n version: turnStartConfig.version,\n configurationFingerprint: turnStartConfig.configurationFingerprint,\n tools: turnStartConfig.tools,\n builtinTools: turnStartConfig.builtinTools,\n permissionMode: turnStartConfig.permissionMode,\n ...(turnStartConfig.responseFormat == null\n ? {}\n : { responseFormat: turnStartConfig.responseFormat }),\n ...(turnStartConfig.outputSchemaMapping == null\n ? {}\n : { outputSchemaMapping: turnStartConfig.outputSchemaMapping }),\n ...(turnStartConfig.permissionModeMapping == null\n ? {}\n : { permissionModeMapping: turnStartConfig.permissionModeMapping }),\n };\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sortValue(item));\n }\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, entry]) => [key, sortValue(entry)]),\n );\n }\n return value;\n}\n","import type { ACPAuthenticationProfileIdentity } from '../acp-auth';\nimport type {\n ACPColdSessionState,\n ACPTurnStartConfig,\n} from './acp-v1-bridge-protocol';\n\nexport type ACPPromptGuidanceLifecycleState = {\n readonly initialGuidanceApplied?: boolean;\n readonly instructionsFingerprint?: string;\n readonly skillsDirectory?: string;\n};\n\nexport type ACPBridgeCoordinates = {\n readonly port: number;\n readonly token: string;\n readonly lastSeenEventId: number;\n readonly sandboxId?: string;\n readonly stateDir?: string;\n};\n\nexport type ACPLifecycleData = ACPPromptGuidanceLifecycleState & {\n readonly implementationIdentity: string;\n readonly authenticationProfile?: ACPAuthenticationProfileIdentity;\n readonly sandboxCredentialEnvironment?: Readonly<Record<string, string>>;\n readonly acpSessionId?: string;\n readonly bridge?: ACPBridgeCoordinates;\n readonly coldSession?: ACPColdSessionState;\n readonly turnStartConfig?: ACPTurnStartConfig;\n readonly recovery?: {\n readonly mode: 'disk-replay' | 'lossy-rerun';\n readonly reason: string;\n };\n readonly restoration?: {\n readonly method: 'resume' | 'load';\n };\n};\n\nexport function resolveACPInitialGuidanceApplied({\n isResume,\n lifecycleState,\n}: {\n isResume: boolean;\n lifecycleState: ACPPromptGuidanceLifecycleState | undefined;\n}): boolean {\n if (!isResume) return false;\n return lifecycleState?.initialGuidanceApplied ?? true;\n}\n\nexport function validateACPLifecycleCompatibility({\n harnessId,\n lifecycleHarnessId,\n implementationIdentity,\n authenticationProfile,\n lifecycleData,\n sandboxId,\n}: {\n harnessId: string;\n lifecycleHarnessId: string;\n implementationIdentity: string;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n lifecycleData: ACPLifecycleData;\n sandboxId: string | undefined;\n}): void {\n if (lifecycleHarnessId !== harnessId) {\n throw new Error(\n `ACP lifecycle state was produced by harness ${JSON.stringify(\n lifecycleHarnessId,\n )}, but this harness is ${JSON.stringify(harnessId)}.`,\n );\n }\n if (lifecycleData.implementationIdentity !== implementationIdentity) {\n throw new Error(\n 'ACP lifecycle state is incompatible with the configured implementation.',\n );\n }\n if (\n lifecycleData.authenticationProfile?.digest !== authenticationProfile.digest\n ) {\n throw new Error(\n 'ACP lifecycle state is incompatible with the configured authentication profile.',\n );\n }\n const expectedSandboxId = lifecycleData.bridge?.sandboxId;\n if (\n expectedSandboxId != null &&\n sandboxId != null &&\n expectedSandboxId !== sandboxId\n ) {\n throw new Error(\n `ACP lifecycle state belongs to sandbox ${JSON.stringify(\n expectedSandboxId,\n )}, not ${JSON.stringify(sandboxId)}.`,\n );\n }\n}\n","import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport type { HarnessV1Skill } from '@ai-sdk/harness';\n\nexport const ACP_SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nexport const DEFAULT_ACP_SKILLS_DIRECTORY = '.agents/skills';\n\nexport function resolveACPPrivateSessionDirectory({\n sandboxHomeDir,\n harnessId,\n sessionId,\n}: {\n sandboxHomeDir: string;\n harnessId: string;\n sessionId: string;\n}): string {\n const sessionKey = createHash('sha256').update(sessionId).digest('hex');\n return path.posix.join(\n sandboxHomeDir,\n '.ai-sdk',\n 'harness-acp',\n harnessId,\n sessionKey,\n );\n}\n\nexport function resolveACPSkillsDirectory({\n implementationHomeDir,\n skillsDirectory = DEFAULT_ACP_SKILLS_DIRECTORY,\n}: {\n implementationHomeDir: string;\n skillsDirectory?: string;\n}): string {\n const containsTraversal = skillsDirectory\n .split(/[\\\\/]/)\n .some(segment => segment === '..');\n const normalizedDirectory = path.posix.normalize(skillsDirectory);\n if (\n skillsDirectory.length === 0 ||\n skillsDirectory.includes('\\\\') ||\n path.posix.isAbsolute(skillsDirectory) ||\n path.win32.isAbsolute(skillsDirectory) ||\n containsTraversal ||\n normalizedDirectory === '.' ||\n normalizedDirectory.startsWith('../') ||\n normalizedDirectory.includes('/../') ||\n normalizedDirectory.endsWith('/..')\n ) {\n throw new Error(\n `ACP skillsDirectory ${JSON.stringify(skillsDirectory)} must be a relative POSIX path without traversal.`,\n );\n }\n\n return path.posix.join(implementationHomeDir, normalizedDirectory);\n}\n\nexport function validateACPSkills({\n skills,\n}: {\n skills: ReadonlyArray<HarnessV1Skill>;\n}): void {\n const skillNames = new Set<string>();\n for (const skill of skills) {\n if (\n !ACP_SKILL_NAME_PATTERN.test(skill.name) ||\n skill.name === '.' ||\n skill.name === '..'\n ) {\n throw new Error(\n `Invalid ACP skill name ${JSON.stringify(skill.name)}: expected a kebab-case slug.`,\n );\n }\n if (skillNames.has(skill.name)) {\n throw new Error(\n `Duplicate ACP skill name ${JSON.stringify(skill.name)}.`,\n );\n }\n skillNames.add(skill.name);\n\n const filePaths = new Set<string>();\n for (const file of skill.files ?? []) {\n const normalizedPath = validateACPAttachedFilePath({\n skillName: skill.name,\n filePath: file.path,\n });\n if (normalizedPath === 'SKILL.md') {\n throw new Error(\n `Invalid ACP skill file path ${JSON.stringify(file.path)} for skill ${JSON.stringify(\n skill.name,\n )}: SKILL.md is reserved for the skill definition.`,\n );\n }\n if (filePaths.has(normalizedPath)) {\n throw new Error(\n `Duplicate ACP skill file path ${JSON.stringify(file.path)} for skill ${JSON.stringify(\n skill.name,\n )}.`,\n );\n }\n filePaths.add(normalizedPath);\n }\n }\n}\n\nfunction validateACPAttachedFilePath({\n skillName,\n filePath,\n}: {\n skillName: string;\n filePath: string;\n}): string {\n const containsTraversal = filePath\n .split(/[\\\\/]/)\n .some(segment => segment === '..');\n const normalizedPath = path.posix.normalize(filePath);\n const invalid =\n filePath.length === 0 ||\n filePath.endsWith('/') ||\n filePath.includes('\\\\') ||\n path.posix.isAbsolute(filePath) ||\n path.win32.isAbsolute(filePath) ||\n containsTraversal ||\n normalizedPath === '.' ||\n normalizedPath.startsWith('../') ||\n normalizedPath.includes('/../') ||\n normalizedPath.endsWith('/..');\n if (invalid) {\n throw new Error(\n `Invalid ACP skill file path ${JSON.stringify(filePath)} for skill ${JSON.stringify(\n skillName,\n )}: expected a relative POSIX path without traversal.`,\n );\n }\n return normalizedPath;\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","createHash","HarnessCapabilityUnsupportedError","createHash","stableStringify","z","z","z","createHash","createHash","stableStringify","sortValue","createHash","endpoint","proc","isRecord","createHash","HarnessCapabilityUnsupportedError","z"]}
1
+ {"version":3,"sources":["../src/acp-harness.ts","../src/v1/acp-v1-harness.ts","../src/acp-auth.ts","../src/v1/implementation.ts","../src/v1/acp-v1-bootstrap.ts","../src/v1/acp-v1-bridge-protocol.ts","../src/v1/acp-v1-prompt.ts","../src/v1/bridge/acp-v1-bridge-environment.ts","../src/v1/bridge/profile-values.ts","../src/v1/bridge/protocol-configuration.ts","../src/v1/acp-v1-turn-start-config.ts","../src/v1/acp-v1-lifecycle.ts","../src/v1/acp-v1-skills.ts","../src/version.ts"],"sourcesContent":["import {\n HARNESS_V1_BUILTIN_TOOLS,\n type HarnessV1,\n type HarnessV1CredentialForwarding,\n type HarnessV1MintBridgeTokenCallback,\n type HarnessV1PortEndpoint,\n} from '@ai-sdk/harness';\nimport type { SandboxChannelReconnectOptions } from '@ai-sdk/harness/utils';\nimport type { ToolSet } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport type { ACPAuthenticationMode, ACPClientApp } from './acp-auth';\nimport type { ACPToolCall } from './acp-tool-call';\nimport {\n createACPV1,\n type ACPAskUserQuestionsSettings,\n type ACPV1Settings,\n} from './v1';\nimport {\n acpColdSessionStateSchema,\n acpTurnStartConfigSchema,\n} from './v1/acp-v1-bridge-protocol';\nimport { VERSION } from './version';\n\nconst ACP_CLIENT_APP = {\n name: 'ai-sdk/harness-acp',\n version: VERSION,\n} as const satisfies ACPClientApp;\n\nexport type ACPHarnessSettings<\n TBuiltinTools extends ToolSet = {},\n TAskUserQuestions extends ACPAskUserQuestionsSettings | undefined =\n | ACPAskUserQuestionsSettings\n | undefined,\n> = {\n readonly builtinTools?: TBuiltinTools;\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 readonly isMcpToolCall?: (toolCall: ACPToolCall) => boolean;\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 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 readonly clientApp?: ACPClientApp;\n readonly version?: ACPV1Settings['version'];\n readonly harnessId: ACPV1Settings['harnessId'];\n readonly auth?: ACPAuthenticationMode;\n readonly resolveAuthenticationEnvironment?: ACPV1Settings['resolveAuthenticationEnvironment'];\n readonly source: ACPV1Settings['source'];\n readonly executable: ACPV1Settings['executable'];\n readonly args?: ACPV1Settings['args'];\n readonly forwardEnv?: ACPV1Settings['forwardEnv'];\n readonly credentialEnv?: ACPV1Settings['credentialEnv'];\n readonly credentialBrokering?: ACPV1Settings['credentialBrokering'];\n readonly authenticationFiles?: ACPV1Settings['authenticationFiles'];\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 readonly env?: ACPV1Settings['env'];\n readonly authentication?: ACPV1Settings['authentication'];\n readonly clientCapabilities?: ACPV1Settings['clientCapabilities'];\n readonly providerAuthentication?: ACPV1Settings['providerAuthentication'];\n /**\n * Maps the HarnessAgent model identifier to an ACP session operation.\n */\n readonly modelMapping: ACPV1Settings['modelMapping'];\n readonly skillsDirectory?: ACPV1Settings['skillsDirectory'];\n readonly instructionMapping?: ACPV1Settings['instructionMapping'];\n readonly outputSchemaMapping?: ACPV1Settings['outputSchemaMapping'];\n /**\n * Transport used for the harness-owned MCP server that exposes host tools to\n * the ACP implementation. Defaults to `stdio`. Set this to `http` for\n * implementations that only accept HTTP or SSE MCP servers from the client,\n * which requires the implementation to advertise\n * `agentCapabilities.mcpCapabilities.http`.\n */\n readonly hostToolMcpTransport?: ACPV1Settings['hostToolMcpTransport'];\n readonly askUserQuestions?: TAskUserQuestions;\n readonly permissionModeMapping?: ACPV1Settings['permissionModeMapping'];\n readonly session?: ACPV1Settings['session'];\n readonly mintBridgeToken?: HarnessV1MintBridgeTokenCallback;\n};\n\nconst ACP_BUILTIN_TOOLS = {} as const satisfies ToolSet;\n\nconst acpBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n stateDir: z.string().optional(),\n});\n\nconst acpResumeStateSchema = z.object({\n implementationIdentity: z.string(),\n authenticationProfile: z\n .object({\n digest: z.string(),\n acpMethodId: z.string().optional(),\n providerKind: z\n .enum(['implementation-default', 'direct', 'ai-gateway'])\n .transform(value =>\n value === 'implementation-default' ? 'direct' : value,\n ),\n providerMode: z.enum(['auto', 'direct', 'ai-gateway']).optional(),\n gatewayCredentialSource: z\n .enum(['AI_GATEWAY_API_KEY', 'VERCEL_OIDC_TOKEN'])\n .nullable()\n .optional(),\n })\n .optional(),\n sandboxCredentialEnvironment: z.record(z.string(), z.string()).optional(),\n acpSessionId: z.string().optional(),\n bridge: acpBridgeCoordsSchema.optional(),\n coldSession: acpColdSessionStateSchema.optional(),\n turnStartConfig: acpTurnStartConfigSchema.optional(),\n recovery: z\n .object({\n mode: z.enum(['disk-replay', 'lossy-rerun']),\n reason: z.string(),\n })\n .optional(),\n restoration: z\n .object({\n method: z.enum(['resume', 'load']),\n })\n .optional(),\n initialGuidanceApplied: z.boolean().optional(),\n instructionsFingerprint: z.string().optional(),\n skillsDirectory: z.string().optional(),\n});\n\ntype ACPBridgeCoords = z.infer<typeof acpBridgeCoordsSchema>;\n\ntype ACPHarnessTools<\n TBuiltinTools extends ToolSet,\n TAskUserQuestions,\n> = TBuiltinTools &\n ([TAskUserQuestions] extends [undefined]\n ? {}\n : {\n askUserQuestions: typeof HARNESS_V1_BUILTIN_TOOLS.askUserQuestions;\n });\n\nexport function createACP<\n TBuiltinTools extends ToolSet = {},\n TAskUserQuestions extends ACPAskUserQuestionsSettings | undefined = undefined,\n>(\n settings: ACPHarnessSettings<TBuiltinTools, TAskUserQuestions>,\n): HarnessV1<ACPHarnessTools<TBuiltinTools, TAskUserQuestions>> {\n if (\n (settings.credentialEnv == null) !==\n (settings.credentialBrokering == null)\n ) {\n throw new Error(\n 'ACP credentialEnv and credentialBrokering must be configured together.',\n );\n }\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(\n settings.mcpServers,\n 'ai-sdk-harness-tools',\n )\n ) {\n throw new Error(\n 'ACP MCP server name \"ai-sdk-harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n const version = (settings as { readonly version?: string }).version ?? 'v1';\n switch (version) {\n case 'v1': {\n const clientApp = settings.clientApp ?? ACP_CLIENT_APP;\n const builtinTools =\n settings.askUserQuestions == null\n ? (settings.builtinTools ?? (ACP_BUILTIN_TOOLS as TBuiltinTools))\n : {\n ...(settings.builtinTools ??\n (ACP_BUILTIN_TOOLS as TBuiltinTools)),\n askUserQuestions: HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,\n };\n return createACPV1({\n settings,\n builtinTools,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n startupTimeoutMs: settings.startupTimeoutMs,\n reconnect: settings.reconnect,\n clientApp,\n lifecycleStateSchema: acpResumeStateSchema satisfies z.ZodType<{\n bridge?: ACPBridgeCoords;\n }>,\n }) as HarnessV1<ACPHarnessTools<TBuiltinTools, TAskUserQuestions>>;\n }\n default:\n throw new Error(\n `Unsupported ACP protocol version ${JSON.stringify(version)}. Supported versions: \"v1\".`,\n );\n }\n}\n","import { createHash } from 'node:crypto';\nimport { posix } from 'node:path';\nimport {\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PortEndpoint,\n type HarnessV1PromptControl,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n type HarnessV1ToolSpec,\n} from '@ai-sdk/harness';\nimport { HarnessBridgeCapabilityUnsupportedError } from '@ai-sdk/harness/bridge';\nimport {\n applyCredentialForwarding,\n createBridgeToken,\n createBridgeErrorHandler,\n createBridgeStartupError,\n createSandboxCredentialEnvironment,\n classifyDiskLog,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxDefaultWorkingDirectory,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n withBridgeToken,\n writeInstructions,\n writeSkills,\n type SandboxChannelReconnectOptions,\n} from '@ai-sdk/harness/utils';\nimport {\n asSchema,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession as SandboxSession,\n type ToolResultPart,\n type ToolSet,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport {\n createACPAuthenticationProfileIdentity,\n resolveACPAuthenticationEnvironment,\n resolveACPProviderAuthentication,\n resolveACPProviderAuthenticationCompatibility,\n type ACPAuthenticationProfileIdentity,\n type ACPClientApp,\n} from '../acp-auth';\nimport type { ACPToolCall } from '../acp-tool-call';\nimport {\n createACPV1Implementation,\n createImplementationIdentity,\n resolveImplementationEnvironment,\n validateACPV1Implementation,\n} from './implementation';\nimport { createACPBootstrap } from './acp-v1-bootstrap';\nimport {\n outboundMessageSchema,\n type ACPBuiltinToolMapping,\n type ACPColdSessionState,\n type ACPTurnStartConfig,\n type InboundMessage,\n type OutboundMessage,\n type StartMessage,\n} from './acp-v1-bridge-protocol';\nimport { createACPBridgeEnvironment } from './bridge/acp-v1-bridge-environment';\nimport { resolveACPLaunchEnvironment } from './bridge/protocol-configuration';\nimport {\n createACPColdSessionState,\n createACPTurnStartConfig,\n} from './acp-v1-turn-start-config';\nimport {\n resolveACPInitialGuidanceApplied,\n validateACPLifecycleCompatibility,\n type ACPLifecycleData,\n} from './acp-v1-lifecycle';\nimport {\n convertHarnessPromptToACPTextBlocks,\n prependACPInstructionGuidance,\n} from './acp-v1-prompt';\nimport type {\n ACPAskUserQuestionsSettings,\n ACPInstructionMapping,\n ACPModelMapping,\n ACPOutputSchemaMapping,\n ACPPermissionModeMapping,\n ACPPermissionModeTarget,\n ACPProfileValue,\n ACPSerializableValue,\n ACPV1Settings,\n} from './acp-v1-settings';\nimport {\n ACP_SKILL_NAME_PATTERN,\n DEFAULT_ACP_SKILLS_DIRECTORY,\n resolveACPPrivateSessionDirectory,\n resolveACPSkillsDirectory,\n validateACPSkills,\n} from './acp-v1-skills';\n\nconst HARNESS_ID_REGEXP = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\ntype ACPChannel = SandboxChannel<OutboundMessage, InboundMessage>;\n\ntype ACPRespawnStrategy =\n | {\n readonly mode: 'disk-replay';\n readonly reason: string;\n readonly afterSeq: number;\n }\n | {\n readonly mode: 'lossy-rerun';\n readonly reason: string;\n readonly turnStartConfig: ACPTurnStartConfig;\n readonly acpSessionId: string;\n }\n | {\n readonly mode: 'cold-restore';\n readonly turnStartConfig: ACPTurnStartConfig;\n readonly acpSessionId: string;\n };\n\nexport function createACPV1<TBuiltinTools extends ToolSet = {}>({\n settings,\n builtinTools,\n port: portOverride,\n portEndpoint: portEndpointOverride,\n startupTimeoutMs,\n reconnect,\n clientApp,\n lifecycleStateSchema,\n}: {\n settings: ACPV1Settings;\n builtinTools: TBuiltinTools;\n port?: number;\n portEndpoint?: HarnessV1PortEndpoint;\n startupTimeoutMs?: number;\n reconnect?: SandboxChannelReconnectOptions;\n clientApp: ACPClientApp;\n lifecycleStateSchema: NonNullable<\n HarnessV1<TBuiltinTools>['lifecycleStateSchema']\n >;\n}): HarnessV1<TBuiltinTools> {\n if (\n (settings.credentialEnv == null) !==\n (settings.credentialBrokering == null)\n ) {\n throw new Error(\n 'ACP credentialEnv and credentialBrokering must be configured together.',\n );\n }\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(\n settings.mcpServers,\n 'ai-sdk-harness-tools',\n )\n ) {\n throw new Error(\n 'ACP MCP server name \"ai-sdk-harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n if (!HARNESS_ID_REGEXP.test(settings.harnessId)) {\n throw new Error(\n `ACP harnessId must be a stable kebab-case identifier; received ${JSON.stringify(settings.harnessId)}.`,\n );\n }\n const implementation = createACPV1Implementation({ settings });\n validateACPV1Implementation(implementation);\n const bootstrap = createACPBootstrap({\n harnessId: settings.harnessId,\n implementation,\n });\n const permissionModeMapping = isCompletePermissionModeMapping({\n value: settings.permissionModeMapping,\n })\n ? settings.permissionModeMapping\n : undefined;\n\n return {\n specificationVersion: 'harness-v1',\n harnessId: settings.harnessId,\n builtinTools,\n supportsBuiltinToolApprovals: true,\n supportsBuiltinToolFiltering: false,\n lifecycleStateSchema,\n getBootstrap: bootstrap.getBootstrap,\n doStart: async startOptions => {\n if (startOptions.builtinToolFiltering != null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'ACP built-in tool filtering is not available in this initial ACP v1 implementation.',\n });\n }\n const permissionMode = startOptions.permissionMode ?? 'allow-all';\n const env = { ...process.env };\n const authenticationEnvironment =\n settings.resolveAuthenticationEnvironment == null\n ? resolveACPAuthenticationEnvironment({\n auth: settings.auth,\n env,\n })\n : await settings.resolveAuthenticationEnvironment({\n auth: settings.auth,\n env,\n });\n const providerAuthenticationCompatibility =\n resolveACPProviderAuthenticationCompatibility({\n auth: settings.auth,\n providerAuthentication: settings.providerAuthentication,\n env: authenticationEnvironment,\n });\n const implementationIdentity = createImplementationIdentity({\n harnessId: settings.harnessId,\n acpVersion: 'v1',\n implementation,\n clientApp,\n clientCapabilities: settings.clientCapabilities,\n modelMapping: settings.modelMapping,\n providerAuthentication: providerAuthenticationCompatibility,\n permissionModeMapping: settings.permissionModeMapping,\n });\n const authenticationProfile = createACPAuthenticationProfileIdentity({\n authentication: settings.authentication,\n providerAuthenticationCompatibility,\n });\n\n const resolvedProviderAuthentication = resolveACPProviderAuthentication({\n auth: {\n mode: settings.auth,\n providerAuthentication: settings.providerAuthentication,\n clientApp,\n },\n env: authenticationEnvironment,\n compatibility: providerAuthenticationCompatibility,\n });\n const sandboxSession = startOptions.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: portOverride,\n portEndpoint: portEndpointOverride,\n harnessId: settings.harnessId,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message: `The ${settings.harnessId} ACP harness cannot use \\`mintBridgeToken\\` with a sandbox session that does not expose an id.`,\n });\n }\n const defaultWorkingDirectory =\n await resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal: startOptions.abortSignal,\n });\n const continueFrom =\n startOptions.continueFrom ?? startOptions.resumeFrom?.continueFrom;\n const lifecycleState = continueFrom ?? startOptions.resumeFrom;\n const isContinue = continueFrom != null;\n const isResume = lifecycleState != null;\n const lifecycleData =\n lifecycleState != null\n ? (lifecycleState.data as unknown as ACPLifecycleData)\n : undefined;\n if (lifecycleData != null && lifecycleState != null) {\n validateACPLifecycleCompatibility({\n harnessId: settings.harnessId,\n lifecycleHarnessId: lifecycleState.harnessId,\n implementationIdentity,\n authenticationProfile,\n lifecycleData,\n sandboxId,\n });\n }\n const implementationEnvironment = resolveImplementationEnvironment({\n implementation,\n env: { ...env, ...authenticationEnvironment },\n credentialEnv: authenticationEnvironment,\n });\n let sandboxImplementationEnvironment = implementationEnvironment;\n let sandboxProviderAuthenticationEnvironment =\n resolvedProviderAuthentication.env;\n let sandboxProviderEnvironment: Record<string, string> | undefined;\n const credentialEnvironmentVariables = [\n ...new Set([\n ...(settings.credentialEnv ?? []),\n 'AI_GATEWAY_API_KEY',\n 'VERCEL_OIDC_TOKEN',\n ]),\n ];\n const credentialForwardingEnvironmentVariables = [\n ...new Set([\n ...credentialEnvironmentVariables,\n ...resolveACPProviderCredentialEnvironmentVariables({\n providerAuthentication:\n resolvedProviderAuthentication.providerAuthentication,\n }),\n ]),\n ];\n let sandboxCredentialEnvironment:\n | Readonly<Record<string, string>>\n | undefined;\n\n if (\n settings.credentialBrokering != null &&\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n const providerEnvironment = resolveProviderEnvironment({\n resolvedProviderAuthentication,\n clientApp,\n });\n const brokeringEnvironment = {\n ...implementationEnvironment,\n ...providerEnvironment,\n };\n sandboxCredentialEnvironment =\n lifecycleData?.sandboxCredentialEnvironment ??\n (await createSandboxCredentialEnvironment({\n environment: brokeringEnvironment,\n credentialEnvironmentVariables:\n credentialForwardingEnvironmentVariables,\n credentialForwarding: settings.credentialForwarding,\n }));\n sandboxImplementationEnvironment = {\n ...brokeringEnvironment,\n ...sandboxCredentialEnvironment,\n };\n const requestTransformations = settings.credentialBrokering({\n env: brokeringEnvironment,\n sandboxEnv: sandboxImplementationEnvironment,\n ...(startOptions.headers == null\n ? {}\n : { headers: startOptions.headers }),\n });\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n sandboxProviderEnvironment =\n resolvedProviderAuthentication.providerAuthentication?.type ===\n 'ai-gateway'\n ? {}\n : undefined;\n }\n if (\n settings.credentialForwarding != null &&\n sandboxProviderEnvironment == null &&\n resolvedProviderAuthentication.providerAuthentication?.type ===\n 'ai-gateway'\n ) {\n sandboxProviderEnvironment = resolveProviderEnvironment({\n resolvedProviderAuthentication,\n clientApp,\n });\n }\n if (sandboxProviderEnvironment != null) {\n sandboxImplementationEnvironment = {\n ...sandboxImplementationEnvironment,\n ...sandboxProviderEnvironment,\n };\n sandboxProviderAuthenticationEnvironment = Object.fromEntries(\n Object.entries(resolvedProviderAuthentication.env).filter(\n ([key]) =>\n key !== 'AI_SDK_ACP_GATEWAY_API_KEY' &&\n key !== 'AI_SDK_ACP_GATEWAY_BASE_URL',\n ),\n );\n }\n const resolvedBridgeDir = posix.resolve(\n defaultWorkingDirectory,\n bootstrap.bootstrapDir,\n );\n const resolvedImplementationDir = `${resolvedBridgeDir}/implementation`;\n const workDir = startOptions.sessionWorkDir;\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOptions.abortSignal,\n });\n const privateSessionDir = resolveACPPrivateSessionDirectory({\n sandboxHomeDir,\n harnessId: settings.harnessId,\n sessionId: startOptions.sessionId,\n });\n const implementationHomeDir =\n implementation.source.type === 'install-command'\n ? `${resolvedImplementationDir}/home`\n : sandboxHomeDir;\n const skillsDir =\n settings.skillsDirectory ?? DEFAULT_ACP_SKILLS_DIRECTORY;\n const skillsDirectory = resolveACPSkillsDirectory({\n implementationHomeDir,\n skillsDirectory: settings.skillsDirectory,\n });\n const bridgeStateDir = `${privateSessionDir}/bridge`;\n const report = startOptions.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOptions.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: settings.harnessId,\n sessionId: startOptions.sessionId,\n });\n const builtinToolCatalog = serializeBuiltinTools({ builtinTools });\n let respawnStrategy: ACPRespawnStrategy | undefined;\n\n if (isResume) {\n if (lifecycleData == null) {\n throw new Error('ACP lifecycle state data is missing.');\n }\n const coords = lifecycleData.bridge;\n if (coords == null && isContinue) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'ACP continuation state does not contain bridge coordinates required for replay or process-loss rerun.',\n });\n }\n if (coords != null) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: portEndpointOverride,\n port: coords.port,\n harnessId: settings.harnessId,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n const attachChannel: ACPChannel = new SandboxChannel({\n connect: ({ abortSignal }) =>\n openWebSocket({ ...attachEndpoint, abortSignal }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n reconnect,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOptions.sessionId,\n harnessId: settings.harnessId,\n channel: attachChannel,\n proc: undefined,\n modelMapping: settings.modelMapping,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n askUserQuestions: settings.askUserQuestions,\n debug: startOptions.observability?.debug,\n implementationIdentity,\n authenticationProfile,\n builtinTools: builtinToolCatalog,\n permissionMode,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n isMcpToolCall: settings.isMcpToolCall,\n initialGuidanceApplied: resolveACPInitialGuidanceApplied({\n isResume: true,\n lifecycleState: lifecycleData,\n }),\n instructionsFingerprint: lifecycleData.instructionsFingerprint,\n sandbox: toolSafeSandboxSession,\n homePath: implementationHomeDir,\n skillsDir,\n skillsDirectory,\n acpSessionId: lifecycleData.acpSessionId,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n isResume: true,\n turnInFlight: isContinue,\n bridgeStateDir,\n turnStartConfig: lifecycleData.turnStartConfig,\n recoveryStatus: lifecycleData.recovery,\n restoration: lifecycleData.restoration,\n sandboxCredentialEnvironment,\n replayOnly: false,\n lossyRerun: false,\n });\n } catch (error) {\n if (isContinue) {\n const eventLog = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOptions.abortSignal,\n }),\n );\n const recoveryMode = await classifyDiskLog(eventLog);\n if (recoveryMode === 'replay') {\n respawnStrategy = {\n mode: 'disk-replay',\n reason: 'completed coherent event log',\n afterSeq: coords.lastSeenEventId,\n };\n } else {\n const turnStartConfig = lifecycleData.turnStartConfig;\n const acpSessionId = lifecycleData.acpSessionId;\n if (turnStartConfig == null || acpSessionId == null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'ACP process-loss recovery is unavailable because the lifecycle state does not contain the persisted turn start configuration and ACP session identifier.',\n cause: error,\n });\n }\n validateACPTurnStartConfig({\n turnStartConfig,\n authenticationProfile,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n modelMapping: settings.modelMapping,\n builtinTools: builtinToolCatalog,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n });\n respawnStrategy = {\n mode: 'lossy-rerun',\n reason: 'event log not replayable',\n turnStartConfig,\n acpSessionId,\n };\n }\n }\n }\n }\n if (!isContinue) {\n const coldSession = lifecycleData.coldSession;\n const acpSessionId = lifecycleData.acpSessionId;\n if (coldSession == null || acpSessionId == null) {\n throw unsupported({\n harnessId: settings.harnessId,\n message:\n 'Cold ACP session restoration requires persisted cold-session configuration and an ACP session identifier.',\n });\n }\n const turnStartConfig = validateACPColdSessionConfiguration({\n coldSession,\n permissionMode,\n authenticationProfile,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n modelMapping: settings.modelMapping,\n builtinTools: builtinToolCatalog,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n debug: startOptions.observability?.debug,\n });\n respawnStrategy = {\n mode: 'cold-restore',\n turnStartConfig,\n acpSessionId,\n };\n }\n }\n\n const forwardedImplementationEnvironment =\n sandboxCredentialEnvironment == null\n ? await applyCredentialForwarding({\n environment: sandboxImplementationEnvironment,\n credentialEnvironmentVariables:\n credentialForwardingEnvironmentVariables,\n credentialForwarding: settings.credentialForwarding,\n })\n : sandboxImplementationEnvironment;\n if (\n settings.credentialBrokering != null &&\n sandboxCredentialEnvironment == null\n ) {\n warnCredentialBrokeringUnavailable({\n environment: {\n ...sandboxImplementationEnvironment,\n ...resolvedProviderAuthentication.env,\n },\n forwardedEnvironment: {\n ...forwardedImplementationEnvironment,\n ...sandboxProviderAuthenticationEnvironment,\n },\n credentialEnvironmentVariables: [\n ...credentialForwardingEnvironmentVariables,\n 'AI_SDK_ACP_GATEWAY_API_KEY',\n ],\n });\n }\n await writeACPAuthenticationFiles({\n sandbox: toolSafeSandboxSession,\n homePath: implementationHomeDir,\n files:\n settings.authenticationFiles?.({\n env: implementationEnvironment,\n sandboxEnv: forwardedImplementationEnvironment,\n credentialBrokeringAvailable: sandboxCredentialEnvironment != null,\n }) ?? [],\n abortSignal: startOptions.abortSignal,\n });\n const port = resolveBridgePort({\n sandboxSession,\n override: portOverride,\n harnessId: settings.harnessId,\n });\n const token =\n settings.mintBridgeToken == null\n ? createBridgeToken()\n : settings.mintBridgeToken(sandboxId!);\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)}`,\n abortSignal: startOptions.abortSignal,\n });\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: settings.harnessId,\n abortSignal: startOptions.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command:\n `node ${shellQuote(`${resolvedBridgeDir}/bridge.mjs`)}` +\n ` --workdir ${shellQuote(workDir)}` +\n ` --bridge-state-dir ${shellQuote(bridgeStateDir)}` +\n ` --implementation-dir ${shellQuote(resolvedImplementationDir)}` +\n ` --bridge-type ${shellQuote(settings.harnessId)}`,\n env: {\n ...forwardedImplementationEnvironment,\n ...createACPBridgeEnvironment({\n authentication: settings.authentication,\n providerAuthentication:\n resolvedProviderAuthentication.providerAuthentication,\n providerEnvironment:\n sandboxProviderEnvironment == null ? undefined : {},\n sessionMeta: settings.session?.meta,\n clientCapabilities: settings.clientCapabilities,\n askUserQuestionsRequestMethod:\n settings.askUserQuestions?.requestMethod,\n hostToolMcpTransport: settings.hostToolMcpTransport,\n }),\n ...sandboxProviderAuthenticationEnvironment,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n ...(respawnStrategy?.mode === 'disk-replay'\n ? {\n BRIDGE_REPLAY_FROM_DISK: '1',\n }\n : {}),\n },\n abortSignal: startOptions.abortSignal,\n });\n const stderrTail: string[] = [];\n const bridgeStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: settings.harnessId,\n collectTail: stderrTail,\n });\n const timeoutMs = startupTimeoutMs ?? 120_000;\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: settings.harnessId,\n timeoutMs,\n abortSignal: startOptions.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: `${settings.harnessId} ACP bridge did not become ready in time.`,\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: `${settings.harnessId} ACP bridge exited before becoming ready.`,\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: portEndpointOverride,\n port: boundPort,\n harnessId: settings.harnessId,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n const channel: ACPChannel = new SandboxChannel({\n connect: ({ abortSignal }) =>\n openWebSocket({ ...bridgeEndpoint, abortSignal }),\n outboundSchema: outboundMessageSchema,\n ...(respawnStrategy?.mode === 'disk-replay'\n ? { initialLastSeenEventId: respawnStrategy.afterSeq }\n : {}),\n onDiagnostic,\n onBridgeError,\n reconnect,\n });\n await channel.open(\n respawnStrategy?.mode === 'disk-replay' ? { resume: true } : undefined,\n );\n let coldRestoration: 'resume' | 'load' | undefined;\n if (respawnStrategy?.mode === 'cold-restore') {\n try {\n coldRestoration = await restoreColdACPSession({\n channel,\n harnessId: settings.harnessId,\n start: {\n type: 'start',\n prompt: [],\n debug: startOptions.observability?.debug,\n builtinTools: builtinToolCatalog,\n permissionMode,\n permissionModeMapping,\n ...(settings.instructionMapping == null\n ? {}\n : { instructionMapping: settings.instructionMapping }),\n ...(settings.mcpServers == null\n ? {}\n : { mcpServers: settings.mcpServers }),\n tools: respawnStrategy.turnStartConfig.tools,\n turnStartConfig: respawnStrategy.turnStartConfig,\n recoveryMode: {\n type: 'cold-restore',\n acpSessionId: respawnStrategy.acpSessionId,\n },\n },\n });\n } catch (error) {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n try {\n await proc.kill();\n } catch {}\n channel.close();\n throw error;\n }\n }\n\n return createSession({\n sessionId: startOptions.sessionId,\n harnessId: settings.harnessId,\n channel,\n proc,\n modelMapping: settings.modelMapping,\n sessionMeta: settings.session?.meta,\n instructionMapping: settings.instructionMapping,\n outputSchemaMapping: settings.outputSchemaMapping,\n askUserQuestions: settings.askUserQuestions,\n debug: startOptions.observability?.debug,\n implementationIdentity,\n authenticationProfile,\n builtinTools: builtinToolCatalog,\n permissionMode,\n permissionModeMapping,\n mcpServers: settings.mcpServers,\n isMcpToolCall: settings.isMcpToolCall,\n initialGuidanceApplied: resolveACPInitialGuidanceApplied({\n isResume,\n lifecycleState: lifecycleData,\n }),\n instructionsFingerprint: lifecycleData?.instructionsFingerprint,\n sandbox: toolSafeSandboxSession,\n homePath: implementationHomeDir,\n skillsDir,\n skillsDirectory,\n acpSessionId: lifecycleData?.acpSessionId,\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n isResume,\n turnInFlight:\n respawnStrategy?.mode === 'disk-replay' ||\n respawnStrategy?.mode === 'lossy-rerun',\n bridgeStateDir,\n turnStartConfig:\n respawnStrategy?.mode === 'lossy-rerun' ||\n respawnStrategy?.mode === 'cold-restore'\n ? respawnStrategy.turnStartConfig\n : lifecycleData?.turnStartConfig,\n recoveryStatus:\n respawnStrategy?.mode === 'disk-replay' ||\n respawnStrategy?.mode === 'lossy-rerun'\n ? {\n mode: respawnStrategy.mode,\n reason: respawnStrategy.reason,\n }\n : undefined,\n restoration:\n coldRestoration == null\n ? lifecycleData?.restoration\n : { method: coldRestoration },\n sandboxCredentialEnvironment,\n replayOnly: respawnStrategy?.mode === 'disk-replay',\n lossyRerun: respawnStrategy?.mode === 'lossy-rerun',\n });\n },\n };\n}\n\nasync function writeACPAuthenticationFiles({\n sandbox,\n homePath,\n files,\n abortSignal,\n}: {\n sandbox: SandboxSession;\n homePath: string;\n files: ReadonlyArray<{ readonly path: string; readonly content: string }>;\n abortSignal?: AbortSignal;\n}): Promise<void> {\n const targetPaths = files.map(file => {\n if (\n file.path.length === 0 ||\n posix.isAbsolute(file.path) ||\n file.path.split('/').some(segment => segment === '..')\n ) {\n throw new Error(\n `ACP authentication file path must be relative without traversal: ${JSON.stringify(file.path)}.`,\n );\n }\n return posix.join(homePath, file.path);\n });\n\n for (let index = 0; index < files.length; index++) {\n await sandbox.writeTextFile({\n path: targetPaths[index],\n content: files[index].content,\n abortSignal,\n });\n }\n if (targetPaths.length === 0) return;\n\n const result = await sandbox.run({\n command: `chmod 600 -- ${targetPaths.map(shellQuote).join(' ')}`,\n abortSignal,\n });\n if (result.exitCode !== 0) {\n throw new Error(\n `Failed to secure ACP authentication files (exit ${result.exitCode})${result.stderr ? `: ${result.stderr}` : ''}`,\n );\n }\n}\n\nfunction resolveProviderEnvironment({\n resolvedProviderAuthentication,\n clientApp,\n}: {\n resolvedProviderAuthentication: ReturnType<\n typeof resolveACPProviderAuthentication\n >;\n clientApp: ACPClientApp;\n}): Record<string, string> {\n if (\n resolvedProviderAuthentication.providerAuthentication?.type !== 'ai-gateway'\n ) {\n return {};\n }\n return resolveACPLaunchEnvironment({\n providerAuthentication:\n resolvedProviderAuthentication.providerAuthentication,\n gateway: {\n apiKey: requireResolvedEnvironmentValue({\n environment: resolvedProviderAuthentication.env,\n name: 'AI_SDK_ACP_GATEWAY_API_KEY',\n }),\n baseUrl: requireResolvedEnvironmentValue({\n environment: resolvedProviderAuthentication.env,\n name: 'AI_SDK_ACP_GATEWAY_BASE_URL',\n }),\n clientAppName: clientApp.name,\n clientAppVersion: clientApp.version,\n },\n });\n}\n\nfunction resolveACPProviderCredentialEnvironmentVariables({\n providerAuthentication,\n}: {\n providerAuthentication: ReturnType<\n typeof resolveACPProviderAuthentication\n >['providerAuthentication'];\n}): string[] {\n if (providerAuthentication?.type !== 'ai-gateway') return [];\n\n return Object.entries(providerAuthentication.env)\n .filter(([, value]) => containsACPProviderCredential({ value }))\n .map(([name]) => name);\n}\n\nfunction containsACPProviderCredential({\n value,\n}: {\n value: ACPProfileValue;\n}): boolean {\n if (Array.isArray(value)) {\n return value.some(item => containsACPProviderCredential({ value: item }));\n }\n if (value == null || typeof value !== 'object') return false;\n if ('$source' in value) {\n return (\n value.$source === 'gateway-api-key' ||\n value.$source === 'gateway-authorization'\n );\n }\n return Object.values(value).some(item =>\n containsACPProviderCredential({ value: item }),\n );\n}\n\nfunction requireResolvedEnvironmentValue({\n environment,\n name,\n}: {\n environment: Readonly<Record<string, string>>;\n name: string;\n}): string {\n const value = environment[name];\n if (value == null) {\n throw new Error(`ACP resolved environment value ${name} is unavailable.`);\n }\n return value;\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n harnessId,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n harnessId: string;\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 unsupported({\n harnessId,\n message:\n `The ${harnessId} ACP harness needs a TCP port exposed by the sandbox. ` +\n 'Create the sandbox with `ports: [<port>]` or configure the harness `port`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n harnessId,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n harnessId: string;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw unsupported({\n harnessId,\n message: `The ${harnessId} ACP harness requires an explicit \\`port\\` when using a basic sandbox session.`,\n });\n }\n if (portEndpoint == null) {\n throw unsupported({\n harnessId,\n message: `The ${harnessId} ACP 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 harnessId,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n harnessId: string;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw unsupported({\n harnessId,\n message: `The ${harnessId} ACP harness requires an explicit \\`portEndpoint\\` when using a basic sandbox session.`,\n });\n}\n\nfunction openWebSocket({\n url,\n headers,\n abortSignal,\n}: HarnessV1PortEndpoint & { abortSignal: AbortSignal }): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n if (abortSignal.aborted) {\n reject(abortSignal.reason ?? new Error('WebSocket connection aborted'));\n return;\n }\n\n const ws = new WebSocket(url, {\n headers: headers == null ? undefined : { ...headers },\n });\n\n let settled = false;\n const cleanup = () => {\n abortSignal.removeEventListener('abort', onAbort);\n ws.off('open', onOpen);\n ws.off('error', onError);\n };\n const rejectWithCleanup = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n ws.once('error', () => {});\n try {\n ws.terminate();\n } catch {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n }\n reject(error);\n };\n const onOpen = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(ws);\n };\n const onError = (error: Error) => {\n rejectWithCleanup(error);\n };\n const onAbort = () =>\n rejectWithCleanup(\n abortSignal.reason ?? new Error('WebSocket connection aborted'),\n );\n\n ws.once('open', onOpen);\n ws.once('error', onError);\n abortSignal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction restoreColdACPSession({\n channel,\n harnessId,\n start,\n}: {\n channel: ACPChannel;\n harnessId: string;\n start: StartMessage;\n}): Promise<'resume' | 'load'> {\n return new Promise<{\n method?: 'resume' | 'load';\n error?: unknown;\n }>(complete => {\n let restorationMethod: 'resume' | 'load' | undefined;\n let settled = false;\n const subscriptions: Array<() => void> = [];\n const cleanup = () => {\n for (const unsubscribe of subscriptions) unsubscribe();\n };\n const settle = ({\n method,\n error,\n }: {\n method?: 'resume' | 'load';\n error?: unknown;\n }) => {\n if (settled) return;\n settled = true;\n cleanup();\n complete({\n ...(method == null ? {} : { method }),\n ...(error === undefined ? {} : { error }),\n });\n };\n subscriptions.push(\n channel.on('raw', event => {\n const rawValue = event.rawValue;\n if (\n isRecord(rawValue) &&\n rawValue.type === 'acp-session-restored' &&\n (rawValue.method === 'resume' || rawValue.method === 'load')\n ) {\n restorationMethod = rawValue.method;\n }\n }),\n );\n subscriptions.push(\n channel.on('finish', () => {\n settle({ method: restorationMethod });\n }),\n );\n subscriptions.push(\n channel.on('error', event => {\n settle({\n error: deserializeBridgeError({\n error: event.error,\n harnessId,\n }),\n });\n }),\n );\n channel.onClose((_code, reason) => {\n settle({\n error: new Error(\n `${harnessId} ACP bridge closed during cold restoration: ${reason}`,\n ),\n });\n });\n try {\n channel.send(start);\n } catch (error) {\n settle({ error });\n }\n }).then(result => {\n if (result.error !== undefined) throw result.error;\n if (result.method == null) {\n throw new Error(\n `${harnessId} ACP cold restoration completed without identifying the negotiated method.`,\n );\n }\n return result.method;\n });\n}\n\nfunction createSession({\n sessionId,\n harnessId,\n channel,\n proc,\n modelMapping,\n sessionMeta,\n instructionMapping,\n outputSchemaMapping,\n askUserQuestions,\n debug,\n implementationIdentity,\n authenticationProfile,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n isMcpToolCall,\n initialGuidanceApplied: initialGuidanceAppliedAtStart,\n instructionsFingerprint: instructionsFingerprintAtStart,\n sandbox,\n homePath,\n skillsDir,\n skillsDirectory,\n acpSessionId: acpSessionIdAtStart,\n bridgePort,\n bridgeToken,\n sandboxId,\n isResume,\n turnInFlight: turnInFlightAtStart,\n bridgeStateDir,\n turnStartConfig: turnStartConfigAtStart,\n recoveryStatus,\n restoration,\n sandboxCredentialEnvironment,\n replayOnly,\n lossyRerun,\n}: {\n sessionId: string;\n harnessId: string;\n channel: ACPChannel;\n proc: Experimental_SandboxProcess | undefined;\n modelMapping: ACPModelMapping;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n askUserQuestions: ACPAskUserQuestionsSettings | undefined;\n debug: HarnessV1DebugConfig | undefined;\n implementationIdentity: string;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionMode: NonNullable<StartMessage['permissionMode']>;\n permissionModeMapping: StartMessage['permissionModeMapping'];\n mcpServers: Record<string, unknown> | undefined;\n isMcpToolCall: ((toolCall: ACPToolCall) => boolean) | undefined;\n initialGuidanceApplied: boolean;\n instructionsFingerprint: string | undefined;\n sandbox: SandboxSession;\n homePath: string;\n skillsDir: string;\n skillsDirectory: string;\n acpSessionId: string | undefined;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n isResume: boolean;\n turnInFlight: boolean;\n bridgeStateDir: string;\n turnStartConfig: ACPTurnStartConfig | undefined;\n recoveryStatus: ACPLifecycleData['recovery'];\n restoration: ACPLifecycleData['restoration'];\n sandboxCredentialEnvironment: Readonly<Record<string, string>> | undefined;\n replayOnly: boolean;\n lossyRerun: boolean;\n}): HarnessV1Session {\n let stopped = false;\n let turnInFlight = turnInFlightAtStart;\n let initialGuidanceApplied = initialGuidanceAppliedAtStart;\n let instructionsFingerprint = instructionsFingerprintAtStart;\n let latestACPSessionId = acpSessionIdAtStart;\n let latestTurnStartConfig = turnStartConfigAtStart;\n const bufferedQuestionResults = new Map<\n string,\n {\n readonly output: unknown;\n readonly isError?: boolean;\n readonly toolResult: ToolResultPart;\n }\n >();\n\n const markTurnFinished = () => {\n turnInFlight = false;\n };\n channel.on('bridge-thread', event => {\n latestACPSessionId = event.threadId;\n });\n // A resumed continuation replays its buffered events after the new session\n // is created. Let `wireTurn` consume those events so it can forward a\n // terminal replay instead of rejecting the continuation before it starts.\n if (!turnInFlightAtStart) {\n channel.on('finish', markTurnFinished);\n channel.on('error', markTurnFinished);\n channel.onClose(markTurnFinished);\n }\n\n const wireTurn = ({\n emit,\n abortSignal,\n start,\n }: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n start: () => void;\n }): HarnessV1PromptControl => {\n let resolveDone: (() => void) | undefined;\n let rejectDone: ((error: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n resolveDone = resolve;\n rejectDone = reject;\n });\n let settled = false;\n let abortRequested = false;\n let abortError: unknown;\n let abortListenerAttached = false;\n let openBlock:\n | { readonly type: 'text' | 'reasoning'; readonly id: string }\n | undefined;\n const dynamicToolCalls = new Map<string, boolean>();\n const toolCallClassificationErrors = new Map<string, unknown>();\n const activeQuestionRequests = new Map<\n string,\n {\n readonly requestId: string;\n readonly nativeRequest: unknown;\n }\n >();\n const questionToolCallIdsByRequestId = new Map<string, string>();\n const subscriptions: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n if (event.type === 'text-start' || event.type === 'reasoning-start') {\n openBlock = {\n type: event.type === 'text-start' ? 'text' : 'reasoning',\n id: event.id,\n };\n } else if (\n (event.type === 'text-end' || event.type === 'reasoning-end') &&\n openBlock?.id === event.id\n ) {\n openBlock = undefined;\n }\n try {\n emit(event);\n } catch {}\n };\n const closeForwardedBlock = () => {\n if (openBlock == null) return;\n const block = openBlock;\n openBlock = undefined;\n forward({\n type: block.type === 'text' ? 'text-end' : 'reasoning-end',\n id: block.id,\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-approval-request',\n 'file-change',\n 'finish-step',\n 'raw',\n ] as const;\n const cleanup = () => {\n for (const unsubscribe of subscriptions) unsubscribe();\n if (abortListenerAttached) {\n abortSignal?.removeEventListener('abort', onAbort);\n }\n };\n const settle = ({ error }: { error?: unknown }) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error === undefined) resolveDone!();\n else rejectDone!(error);\n };\n const onAbort = () => {\n if (settled || abortRequested) return;\n abortRequested = true;\n abortError =\n abortSignal?.reason ?? new DOMException('Aborted', 'AbortError');\n try {\n channel.send({ type: 'abort' });\n } catch {\n settle({ error: abortError });\n }\n };\n subscriptions.push(\n channel.on('acp-tool-call-candidate', event => {\n try {\n const suppress =\n askUserQuestions?.isNativeToolCall?.({\n nativeToolCall: event.toolCall,\n }) === true;\n dynamicToolCalls.set(\n event.toolCall.toolCallId,\n isMcpToolCall?.(event.toolCall) === true,\n );\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { suppress },\n });\n } catch (error) {\n toolCallClassificationErrors.set(event.toolCall.toolCallId, error);\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { suppress: false },\n });\n }\n }),\n );\n subscriptions.push(\n channel.on('acp-question-request', event => {\n if (askUserQuestions == null) {\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { type: 'unhandled' },\n });\n return;\n }\n try {\n const nativeToolCall = askUserQuestions.fromNativeRequest({\n nativeRequest: event.nativeRequest,\n nativeToolCall: event.nativeToolCall,\n });\n if (nativeToolCall == null) {\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: { type: 'unhandled' },\n });\n return;\n }\n if (\n nativeToolCall.toolName !== 'askUserQuestions' ||\n nativeToolCall.providerExecuted !== false\n ) {\n throw new Error(\n `${harnessId} ACP askUserQuestions.fromNativeRequest must return a client-executed askUserQuestions tool call.`,\n );\n }\n\n const toolCall = withNativeQuestionRequest({\n harnessId,\n nativeRequest: event.nativeRequest,\n toolCall: nativeToolCall,\n });\n const bufferedResult = takeBufferedQuestionResult({\n bufferedQuestionResults,\n toolCallId: toolCall.toolCallId,\n nativeRequest: event.nativeRequest,\n matchesNativeRequest: askUserQuestions.matchesNativeRequest,\n harnessId,\n });\n activeQuestionRequests.set(toolCall.toolCallId, {\n requestId: event.requestId,\n nativeRequest: event.nativeRequest,\n });\n questionToolCallIdsByRequestId.set(\n event.requestId,\n toolCall.toolCallId,\n );\n channel.send({\n type: 'tool-result',\n toolCallId: event.requestId,\n output: {\n type: 'handled',\n toolCallId: toolCall.toolCallId,\n },\n });\n\n if (bufferedResult == null) {\n forward(toolCall);\n return;\n }\n channel.send({\n type: 'tool-result',\n toolCallId: toolCall.toolCallId,\n output: askUserQuestions.toNativeResponse({\n nativeRequest: event.nativeRequest,\n toolResult: bufferedResult.toolResult,\n }),\n isError: bufferedResult.isError,\n toolResult: bufferedResult.toolResult,\n });\n } catch (error) {\n closeForwardedBlock();\n forward({ type: 'error', error });\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settle({ error });\n }\n }),\n );\n subscriptions.push(\n channel.on('acp-question-resolved', event => {\n const toolCallId = questionToolCallIdsByRequestId.get(event.requestId);\n if (toolCallId != null) {\n activeQuestionRequests.delete(toolCallId);\n questionToolCallIdsByRequestId.delete(event.requestId);\n }\n }),\n );\n subscriptions.push(\n channel.on('tool-call', event => {\n if (toolCallClassificationErrors.has(event.toolCallId)) {\n const error = toolCallClassificationErrors.get(event.toolCallId);\n closeForwardedBlock();\n forward({ type: 'error', error });\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settle({ error });\n return;\n }\n forward(\n dynamicToolCalls.get(event.toolCallId) === true\n ? { ...event, dynamic: true }\n : event,\n );\n }),\n );\n subscriptions.push(\n channel.on('tool-result', event => {\n const dynamic = dynamicToolCalls.get(event.toolCallId) === true;\n dynamicToolCalls.delete(event.toolCallId);\n toolCallClassificationErrors.delete(event.toolCallId);\n forward(dynamic ? { ...event, dynamic: true } : event);\n }),\n );\n for (const type of eventTypes) {\n subscriptions.push(channel.on(type, event => forward(event)));\n }\n subscriptions.push(\n channel.on('finish', event => {\n markTurnFinished();\n closeForwardedBlock();\n forward(event);\n settle(abortRequested ? { error: abortError } : {});\n }),\n );\n subscriptions.push(\n channel.on('error', event => {\n markTurnFinished();\n closeForwardedBlock();\n const error = deserializeBridgeError({\n error: event.error,\n harnessId,\n });\n forward({ ...event, error });\n settle({ error });\n }),\n );\n channel.onClose((_code, reason) => {\n markTurnFinished();\n if (reason === 'suspended') {\n settle({});\n return;\n }\n closeForwardedBlock();\n settle({\n error:\n abortRequested && abortError !== undefined\n ? abortError\n : new Error(`${harnessId} ACP bridge closed before turn end.`),\n });\n });\n try {\n start();\n } catch (error) {\n settled = true;\n cleanup();\n throw error;\n }\n if (abortSignal?.aborted) onAbort();\n else if (abortSignal != null) {\n abortSignal.addEventListener('abort', onAbort, { once: true });\n abortListenerAttached = true;\n }\n return {\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 submitToolResult: async input => {\n if (\n askUserQuestions != null &&\n input.toolResult?.toolName === 'askUserQuestions'\n ) {\n const activeRequest = activeQuestionRequests.get(input.toolCallId);\n if (activeRequest == null) {\n const previousNativeRequest =\n input.toolResult.providerOptions?.[harnessId]?.nativeRequest;\n if (!lossyRerun && previousNativeRequest !== undefined) {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: askUserQuestions.toNativeResponse({\n nativeRequest: previousNativeRequest,\n toolResult: input.toolResult,\n }),\n isError: input.isError,\n toolResult: input.toolResult,\n });\n return;\n }\n bufferedQuestionResults.set(input.toolCallId, {\n output: input.output,\n ...(input.isError == null ? {} : { isError: input.isError }),\n toolResult: input.toolResult,\n });\n return;\n }\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: askUserQuestions.toNativeResponse({\n nativeRequest: activeRequest.nativeRequest,\n toolResult: input.toolResult,\n }),\n isError: input.isError,\n toolResult: input.toolResult,\n });\n return;\n }\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n toolResult: input.toolResult,\n });\n },\n done,\n };\n };\n\n const terminateBridge = async ({\n command,\n }: {\n command: 'stop' | 'destroy';\n }) => {\n if (stopped) return;\n stopped = true;\n channel.beginClose();\n const channelClosed = new Promise<void>(resolve => {\n channel.onClose(() => resolve());\n });\n try {\n if (!channel.isClosed()) {\n channel.send({ type: command });\n }\n } catch {}\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n proc == null ? channelClosed : proc.wait(),\n new Promise<void>(resolve => {\n timer = setTimeout(resolve, 5000);\n timer.unref?.();\n }),\n ]);\n } finally {\n if (timer != null) clearTimeout(timer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n };\n\n const createLifecycleData = ({\n bridge,\n includeTurnStartConfig = true,\n }: {\n bridge?: ACPLifecycleData['bridge'];\n includeTurnStartConfig?: boolean;\n }): ACPLifecycleData => ({\n implementationIdentity,\n authenticationProfile,\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n ...(latestACPSessionId == null ? {} : { acpSessionId: latestACPSessionId }),\n ...(bridge == null ? {} : { bridge }),\n ...(latestTurnStartConfig == null\n ? {}\n : {\n coldSession: createACPColdSessionState({\n turnStartConfig: latestTurnStartConfig,\n }),\n }),\n ...(!includeTurnStartConfig || latestTurnStartConfig == null\n ? {}\n : { turnStartConfig: latestTurnStartConfig }),\n ...(recoveryStatus == null ? {} : { recovery: recoveryStatus }),\n ...(restoration == null ? {} : { restoration }),\n initialGuidanceApplied,\n ...(instructionsFingerprint == null ? {} : { instructionsFingerprint }),\n skillsDirectory,\n });\n\n const synchronizeSkills = async ({\n skills,\n abortSignal,\n }: {\n skills: ReadonlyArray<HarnessV1Skill>;\n abortSignal?: AbortSignal;\n }): Promise<void> => {\n validateACPSkills({ skills });\n await writeSkills({\n sandbox,\n homePath,\n skillsDir,\n skills,\n abortSignal,\n skillNamePattern: ACP_SKILL_NAME_PATTERN,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid ACP skill name ${JSON.stringify(name)}: expected a kebab-case slug.`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid ACP skill file path ${JSON.stringify(filePath)} for skill ${JSON.stringify(\n skillName,\n )}: expected a relative POSIX path without traversal.`,\n });\n };\n\n const synchronizeInstructions = async ({\n instructions,\n abortSignal,\n }: {\n instructions: string | undefined;\n abortSignal?: AbortSignal;\n }): Promise<void> => {\n if (instructionMapping?.type === 'filesystem') {\n await writeInstructions({\n sandbox,\n homePath,\n instructionsFile: instructionMapping.path,\n instructions,\n abortSignal,\n });\n }\n };\n\n return {\n sessionId,\n isResume,\n doPromptTurn: async options => {\n await synchronizeSkills({\n skills: options.skills,\n abortSignal: options.abortSignal,\n });\n await synchronizeInstructions({\n instructions: options.instructions,\n abortSignal: options.abortSignal,\n });\n if (options.responseFormat?.type === 'json') {\n if (options.responseFormat.schema == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} requires a JSON schema for structured output.`,\n });\n }\n if (outputSchemaMapping == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} does not support structured output through ACP.`,\n });\n }\n }\n if (replayOnly) {\n throw new Error(\n `${harnessId} recovered this turn through disk replay only and has no restored ACP process for a subsequent prompt.`,\n );\n }\n if (options.abortSignal?.aborted) {\n throw (\n options.abortSignal.reason ??\n new DOMException('Aborted', 'AbortError')\n );\n }\n const prompt = convertHarnessPromptToACPTextBlocks({\n prompt: options.prompt,\n harnessId,\n });\n const model = options.model;\n const turnStartConfig = createACPTurnStartConfig({\n prompt,\n tools: options.tools ?? [],\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat: options.responseFormat,\n outputSchemaMapping,\n model,\n modelMapping,\n });\n const nextInstructionsFingerprint = fingerprintValue({\n value: options.instructions ?? null,\n });\n const control = wireTurn({\n emit: options.emit,\n abortSignal: options.abortSignal,\n start: () => {\n if (turnInFlight) {\n throw new Error(\n `${harnessId} cannot start a new ACP prompt while a turn is in flight.`,\n );\n }\n turnInFlight = true;\n channel.send({\n type: 'start',\n prompt:\n instructionMapping?.type !== 'filesystem' &&\n instructionsFingerprint !== nextInstructionsFingerprint &&\n (instructionMapping == null || initialGuidanceApplied)\n ? prependACPInstructionGuidance({\n prompt,\n instructions: options.instructions,\n })\n : prompt,\n ...(instructionMapping == null\n ? {}\n : {\n instructionMapping,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n }),\n debug,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n ...(model == null ? {} : { model, modelMapping }),\n ...(options.responseFormat == null\n ? {}\n : { responseFormat: options.responseFormat }),\n ...(turnStartConfig.outputSchemaMapping == null\n ? {}\n : { outputSchemaMapping: turnStartConfig.outputSchemaMapping }),\n ...(mcpServers == null ? {} : { mcpServers }),\n tools: options.tools == null ? undefined : turnStartConfig.tools,\n turnStartConfig,\n });\n latestTurnStartConfig = turnStartConfig;\n initialGuidanceApplied = true;\n instructionsFingerprint = nextInstructionsFingerprint;\n },\n });\n return control;\n },\n doContinueTurn: async options => {\n await synchronizeSkills({\n skills: options.skills,\n abortSignal: options.abortSignal,\n });\n await synchronizeInstructions({\n instructions: options.instructions,\n abortSignal: options.abortSignal,\n });\n if (options.responseFormat?.type === 'json') {\n if (options.responseFormat.schema == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} requires a JSON schema for structured output.`,\n });\n }\n if (outputSchemaMapping == null) {\n throw unsupported({\n harnessId,\n message: `${harnessId} does not support structured output through ACP.`,\n });\n }\n }\n if (!turnInFlight) {\n throw new Error(`${harnessId} has no in-flight ACP turn to continue.`);\n }\n if (lossyRerun) {\n if (latestTurnStartConfig == null || latestACPSessionId == null) {\n throw new Error(\n `${harnessId} cannot perform lossy ACP rerun without persisted start configuration and an ACP session identifier.`,\n );\n }\n assertRecoveryToolCatalog({\n persisted: latestTurnStartConfig.tools,\n current: options.tools ?? [],\n });\n }\n return wireTurn({\n emit: options.emit,\n abortSignal: options.abortSignal,\n start: () => {\n if (!lossyRerun) return;\n const turnStartConfig = latestTurnStartConfig!;\n channel.send({\n type: 'start',\n prompt: turnStartConfig.prompt,\n debug: turnStartConfig.debug,\n builtinTools: turnStartConfig.builtinTools,\n permissionMode: turnStartConfig.permissionMode,\n permissionModeMapping: turnStartConfig.permissionModeMapping,\n ...(turnStartConfig.model == null\n ? {}\n : {\n model: turnStartConfig.model,\n modelMapping: turnStartConfig.modelMapping,\n }),\n ...(turnStartConfig.responseFormat == null\n ? {}\n : { responseFormat: turnStartConfig.responseFormat }),\n ...(turnStartConfig.outputSchemaMapping == null\n ? {}\n : { outputSchemaMapping: turnStartConfig.outputSchemaMapping }),\n ...(instructionMapping == null\n ? {}\n : {\n instructionMapping,\n ...(options.instructions == null\n ? {}\n : { instructions: options.instructions }),\n }),\n ...(mcpServers == null ? {} : { mcpServers }),\n tools: turnStartConfig.tools,\n turnStartConfig,\n recoveryMode: {\n type: 'lossy-rerun',\n acpSessionId: latestACPSessionId!,\n reason: recoveryStatus?.reason ?? 'bridge process loss',\n },\n });\n },\n });\n },\n doCompact: async () => {\n throw unsupported({\n harnessId,\n message: 'ACP v1 does not define manual session compaction.',\n });\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `${harnessId} ACP session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'continue-turn',\n harnessId,\n specificationVersion: 'harness-v1',\n data: createLifecycleData({\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n stateDir: bridgeStateDir,\n },\n }),\n };\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `${harnessId} ACP session ${sessionId} is stopped; cannot detach.`,\n );\n }\n if (turnInFlight) {\n throw new Error(\n `${harnessId} ACP session ${sessionId} has an in-flight turn; suspend it instead.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId,\n specificationVersion: 'harness-v1',\n data: createLifecycleData({\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n stateDir: bridgeStateDir,\n },\n }),\n };\n },\n doStop: async () => {\n const data = createLifecycleData({ includeTurnStartConfig: false });\n await terminateBridge({ command: 'stop' });\n return {\n type: 'resume-session',\n harnessId,\n specificationVersion: 'harness-v1',\n data,\n };\n },\n doDestroy: async () => {\n await terminateBridge({ command: 'destroy' });\n },\n };\n}\n\nfunction isCompletePermissionModeMapping({\n value,\n}: {\n value: ACPPermissionModeMapping | undefined;\n}): boolean {\n return (\n isPermissionModeMappingValue({ value: value?.['allow-reads'] }) &&\n isPermissionModeMappingValue({ value: value?.['allow-edits'] }) &&\n isPermissionModeMappingValue({ value: value?.['allow-all'] })\n );\n}\n\nfunction withNativeQuestionRequest({\n harnessId,\n nativeRequest,\n toolCall,\n}: {\n harnessId: string;\n nativeRequest: unknown;\n toolCall: Extract<HarnessV1StreamPart, { type: 'tool-call' }>;\n}): Extract<HarnessV1StreamPart, { type: 'tool-call' }> {\n const harnessMetadata = toolCall.providerMetadata?.[harnessId];\n return {\n ...toolCall,\n providerMetadata: {\n ...toolCall.providerMetadata,\n [harnessId]: {\n ...(harnessMetadata ?? {}),\n nativeRequest,\n } as NonNullable<\n Extract<HarnessV1StreamPart, { type: 'tool-call' }>['providerMetadata']\n >[string],\n },\n };\n}\n\nfunction takeBufferedQuestionResult({\n bufferedQuestionResults,\n toolCallId,\n nativeRequest,\n matchesNativeRequest,\n harnessId,\n}: {\n bufferedQuestionResults: Map<\n string,\n {\n readonly output: unknown;\n readonly isError?: boolean;\n readonly toolResult: ToolResultPart;\n }\n >;\n toolCallId: string;\n nativeRequest: unknown;\n matchesNativeRequest:\n | ACPAskUserQuestionsSettings['matchesNativeRequest']\n | undefined;\n harnessId: string;\n}):\n | {\n readonly output: unknown;\n readonly isError?: boolean;\n readonly toolResult: ToolResultPart;\n }\n | undefined {\n const exact = bufferedQuestionResults.get(toolCallId);\n if (exact != null) {\n bufferedQuestionResults.delete(toolCallId);\n return exact;\n }\n if (matchesNativeRequest == null) return undefined;\n for (const [bufferedToolCallId, buffered] of bufferedQuestionResults) {\n const previousNativeRequest =\n buffered.toolResult.providerOptions?.[harnessId]?.nativeRequest;\n if (\n previousNativeRequest !== undefined &&\n matchesNativeRequest({ previousNativeRequest, nativeRequest })\n ) {\n bufferedQuestionResults.delete(bufferedToolCallId);\n return buffered;\n }\n }\n return undefined;\n}\n\nfunction isPermissionModeMappingValue({\n value,\n}: {\n value: ACPPermissionModeTarget | null | undefined;\n}): boolean {\n return value === null || isPermissionModeTarget({ value });\n}\n\nfunction isPermissionModeTarget({\n value,\n}: {\n value: ACPPermissionModeTarget | undefined;\n}): boolean {\n if (value?.type === 'session-mode') {\n return typeof value.modeId === 'string';\n }\n return (\n value?.type === 'session-config-option' &&\n typeof value.configId === 'string' &&\n (typeof value.value === 'string' || typeof value.value === 'boolean')\n );\n}\n\nexport function serializeBuiltinTools({\n builtinTools,\n}: {\n builtinTools: ToolSet;\n}): ReadonlyArray<ACPBuiltinToolMapping> {\n return Object.entries(builtinTools).map(([toolName, tool]) => {\n const nativeName =\n tool != null &&\n typeof tool === 'object' &&\n 'nativeName' in tool &&\n typeof tool.nativeName === 'string'\n ? tool.nativeName\n : undefined;\n const title =\n tool != null &&\n typeof tool === 'object' &&\n 'title' in tool &&\n typeof tool.title === 'string'\n ? tool.title\n : undefined;\n const toolUseKind =\n tool != null &&\n typeof tool === 'object' &&\n 'toolUseKind' in tool &&\n (tool.toolUseKind === 'readonly' ||\n tool.toolUseKind === 'edit' ||\n tool.toolUseKind === 'bash')\n ? tool.toolUseKind\n : undefined;\n let inputSchema: ACPBuiltinToolMapping['inputSchema'];\n if (\n tool != null &&\n typeof tool === 'object' &&\n 'inputSchema' in tool &&\n tool.inputSchema != null\n ) {\n try {\n inputSchema = asSchema(\n tool.inputSchema as Parameters<typeof asSchema>[0],\n ).jsonSchema as ACPBuiltinToolMapping['inputSchema'];\n } catch {}\n }\n return {\n toolName,\n ...(nativeName == null ? {} : { nativeName }),\n ...(title == null ? {} : { title }),\n ...(toolUseKind == null ? {} : { toolUseKind }),\n ...(inputSchema == null ? {} : { inputSchema }),\n };\n });\n}\n\nfunction validateACPTurnStartConfig({\n turnStartConfig,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n outputSchemaMapping,\n modelMapping,\n builtinTools,\n permissionModeMapping,\n mcpServers,\n}: {\n turnStartConfig: ACPTurnStartConfig;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n modelMapping: ACPModelMapping;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionModeMapping: ACPPermissionModeMapping | undefined;\n mcpServers: Record<string, unknown> | undefined;\n}): void {\n const current = createACPTurnStartConfig({\n prompt: turnStartConfig.prompt,\n tools: turnStartConfig.tools,\n builtinTools,\n permissionMode: turnStartConfig.permissionMode,\n permissionModeMapping,\n mcpServers,\n debug: turnStartConfig.debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat: turnStartConfig.responseFormat,\n outputSchemaMapping,\n model: turnStartConfig.model,\n modelMapping,\n });\n if (\n current.configurationFingerprint !==\n turnStartConfig.configurationFingerprint\n ) {\n throw new Error(\n 'The persisted ACP turn start configuration is incompatible with the current non-secret start configuration.',\n );\n }\n}\n\nfunction validateACPColdSessionConfiguration({\n coldSession,\n permissionMode,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n outputSchemaMapping,\n modelMapping,\n builtinTools,\n permissionModeMapping,\n mcpServers,\n debug,\n}: {\n coldSession: ACPColdSessionState;\n permissionMode: NonNullable<StartMessage['permissionMode']>;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n modelMapping: ACPModelMapping;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionModeMapping: ACPPermissionModeMapping | undefined;\n mcpServers: Record<string, unknown> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n}): ACPTurnStartConfig {\n const current = createACPTurnStartConfig({\n prompt: [],\n tools: coldSession.tools,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat: coldSession.responseFormat,\n outputSchemaMapping,\n model: undefined,\n modelMapping,\n });\n if (\n current.configurationFingerprint !== coldSession.configurationFingerprint ||\n coldSession.permissionMode !== permissionMode\n ) {\n throw new Error(\n 'ACP cold-session state is incompatible with the current non-secret session configuration.',\n );\n }\n return current;\n}\n\nfunction assertRecoveryToolCatalog({\n persisted,\n current,\n}: {\n persisted: ReadonlyArray<HarnessV1ToolSpec>;\n current: ReadonlyArray<HarnessV1ToolSpec>;\n}): void {\n if (\n fingerprintValue({ value: persisted }) !==\n fingerprintValue({ value: current })\n ) {\n throw new Error(\n 'ACP lossy rerun requires the same active host tool catalog as the original turn.',\n );\n }\n}\n\nfunction fingerprintValue({ value }: { value: unknown }): string {\n return createHash('sha256').update(JSON.stringify(value)).digest('hex');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction unsupported({\n harnessId,\n message,\n cause,\n}: {\n harnessId: string;\n message: string;\n cause?: unknown;\n}): HarnessCapabilityUnsupportedError {\n return new HarnessCapabilityUnsupportedError({\n harnessId,\n message,\n cause,\n });\n}\n\nfunction deserializeBridgeError({\n error,\n harnessId,\n}: {\n error: unknown;\n harnessId: string;\n}): unknown {\n if (HarnessBridgeCapabilityUnsupportedError.isInstance(error)) {\n return unsupported({ harnessId, message: error.message });\n }\n return error;\n}\n","import { createHash } from 'node:crypto';\nimport {\n getAiGatewayAuthFromEnv,\n isHarnessAuthenticationEnvironment,\n} from '@ai-sdk/harness/utils';\nimport type {\n ACPAuthentication,\n ACPAuthenticationMode as ACPV1AuthenticationMode,\n ACPProviderAuthentication,\n} from './v1';\nimport type { ACPResolvedProviderAuthentication } from './v1/bridge/acp-v1-bridge-environment';\n\nconst DEFAULT_AI_GATEWAY_BASE_URL = 'https://ai-gateway.vercel.sh';\n\nexport type ACPAuthenticationMode = ACPV1AuthenticationMode;\n\nexport type ACPClientApp = {\n readonly name: string;\n readonly version: string;\n};\n\ntype ACPAuthResolutionOptions = {\n readonly mode?: ACPAuthenticationMode;\n readonly providerAuthentication: ACPProviderAuthentication | undefined;\n readonly clientApp: ACPClientApp;\n};\n\ntype ACPGatewayCredentialSource = 'AI_GATEWAY_API_KEY' | 'VERCEL_OIDC_TOKEN';\n\nexport type ACPProviderAuthenticationCompatibility =\n | {\n readonly type: 'direct';\n readonly mode: 'auto' | 'direct';\n }\n | {\n readonly type: 'ai-gateway';\n readonly mode: 'auto' | 'ai-gateway';\n readonly env: ACPProviderAuthentication['gateway']['env'];\n readonly credentialSource: ACPGatewayCredentialSource | null;\n readonly baseUrl: string;\n };\n\nexport type ACPAuthenticationProfileIdentity = {\n readonly digest: string;\n readonly acpMethodId?: string;\n readonly providerKind: 'direct' | 'ai-gateway';\n readonly providerMode?: 'auto' | 'direct' | 'ai-gateway';\n readonly gatewayCredentialSource?:\n | 'AI_GATEWAY_API_KEY'\n | 'VERCEL_OIDC_TOKEN'\n | null;\n};\n\nexport function createACPAuthenticationProfileIdentity({\n authentication,\n providerAuthenticationCompatibility,\n}: {\n authentication: ACPAuthentication | undefined;\n providerAuthenticationCompatibility:\n | ACPProviderAuthenticationCompatibility\n | undefined;\n}): ACPAuthenticationProfileIdentity {\n const providerKind = providerAuthenticationCompatibility?.type ?? 'direct';\n const digest = createHash('sha256')\n .update(\n stableStringify({\n value: {\n authentication: authentication ?? null,\n providerAuthentication: providerAuthenticationCompatibility ?? null,\n },\n }),\n )\n .digest('hex');\n return {\n digest,\n ...(authentication == null ? {} : { acpMethodId: authentication.methodId }),\n providerKind,\n ...(providerAuthenticationCompatibility == null\n ? {}\n : { providerMode: providerAuthenticationCompatibility.mode }),\n ...(providerAuthenticationCompatibility?.type === 'ai-gateway'\n ? {\n gatewayCredentialSource:\n providerAuthenticationCompatibility.credentialSource,\n }\n : {}),\n };\n}\n\nexport function resolveACPProviderAuthentication({\n auth,\n env,\n compatibility,\n}: {\n auth: ACPAuthResolutionOptions;\n env: Record<string, string | undefined>;\n compatibility?: ACPProviderAuthenticationCompatibility;\n}): {\n readonly providerAuthentication:\n | ACPResolvedProviderAuthentication\n | undefined;\n readonly env: Record<string, string>;\n} {\n const clientAppEnv = {\n AI_SDK_ACP_CLIENT_APP_NAME: auth.clientApp.name,\n AI_SDK_ACP_CLIENT_APP_VERSION: auth.clientApp.version,\n };\n const resolvedEnv = resolveACPAuthenticationEnvironment({\n auth: auth.mode,\n env,\n });\n const providerAuthentication = auth.providerAuthentication;\n if (providerAuthentication == null) {\n return { providerAuthentication: undefined, env: clientAppEnv };\n }\n\n if (compatibility?.type === 'direct') {\n return {\n providerAuthentication: { type: 'direct' },\n env: clientAppEnv,\n };\n }\n\n const mode = resolveACPProviderAuthenticationMode(auth.mode);\n if (mode === 'direct') {\n return {\n providerAuthentication: { type: 'direct' },\n env: clientAppEnv,\n };\n }\n\n const gateway =\n compatibility?.type === 'ai-gateway'\n ? {\n apiKey: resolveGatewayCredential({\n env: resolvedEnv,\n credentialSource: compatibility.credentialSource,\n }),\n baseUrl: compatibility.baseUrl,\n }\n : getAiGatewayAuthFromEnv({ env: resolvedEnv });\n const apiKey = gateway.apiKey;\n if (compatibility == null && mode === 'auto' && apiKey == null) {\n return {\n providerAuthentication: { type: 'direct' },\n env: clientAppEnv,\n };\n }\n if (apiKey == null) {\n throw new Error(\n 'AI Gateway authentication was selected, but neither AI_GATEWAY_API_KEY nor VERCEL_OIDC_TOKEN is set.',\n );\n }\n\n return {\n providerAuthentication: {\n type: 'ai-gateway',\n env:\n compatibility?.type === 'ai-gateway'\n ? compatibility.env\n : providerAuthentication.gateway.env,\n },\n env: {\n AI_SDK_ACP_GATEWAY_API_KEY: apiKey,\n AI_SDK_ACP_GATEWAY_BASE_URL: gateway.baseUrl,\n ...clientAppEnv,\n },\n };\n}\n\nexport function resolveACPProviderAuthenticationCompatibility({\n auth = 'auto',\n providerAuthentication,\n env,\n}: {\n auth?: ACPAuthenticationMode;\n providerAuthentication: ACPProviderAuthentication | undefined;\n env: Record<string, string | undefined>;\n}): ACPProviderAuthenticationCompatibility | undefined {\n const resolvedEnv = resolveACPAuthenticationEnvironment({\n auth,\n env,\n });\n if (providerAuthentication == null) return undefined;\n\n const mode = resolveACPProviderAuthenticationMode(auth);\n if (mode === 'direct') {\n return { type: 'direct', mode };\n }\n\n const credentialSource = resolveGatewayCredentialSource({ env: resolvedEnv });\n if (mode === 'auto' && credentialSource == null) {\n return { type: 'direct', mode };\n }\n\n return {\n type: 'ai-gateway',\n mode,\n env: providerAuthentication.gateway.env,\n credentialSource,\n baseUrl: resolvedEnv.AI_GATEWAY_BASE_URL ?? DEFAULT_AI_GATEWAY_BASE_URL,\n };\n}\n\nfunction resolveACPProviderAuthenticationMode(\n auth: ACPAuthenticationMode | undefined,\n): Extract<ACPAuthenticationMode, string> {\n return typeof auth === 'string' || auth == null ? (auth ?? 'auto') : 'auto';\n}\n\nexport function resolveACPAuthenticationEnvironment({\n auth,\n env,\n}: {\n auth: ACPAuthenticationMode | undefined;\n env: Record<string, string | undefined>;\n}): Record<string, string | undefined> {\n return isHarnessAuthenticationEnvironment(auth) ? auth : env;\n}\n\nexport function resolveACPEnv({\n auth,\n env,\n}: {\n auth: ACPAuthResolutionOptions;\n env: Record<string, string | undefined>;\n}): Record<string, string> {\n return resolveACPProviderAuthentication({ auth, env }).env;\n}\n\nfunction resolveGatewayCredentialSource({\n env,\n}: {\n env: Record<string, string | undefined>;\n}): ACPGatewayCredentialSource | null {\n return env.AI_GATEWAY_API_KEY\n ? 'AI_GATEWAY_API_KEY'\n : env.VERCEL_OIDC_TOKEN\n ? 'VERCEL_OIDC_TOKEN'\n : null;\n}\n\nfunction resolveGatewayCredential({\n env,\n credentialSource,\n}: {\n env: Record<string, string | undefined>;\n credentialSource: ACPGatewayCredentialSource | null;\n}): string | undefined {\n const gatewayFromEnv = getAiGatewayAuthFromEnv({ env });\n switch (credentialSource) {\n case 'AI_GATEWAY_API_KEY':\n return env.AI_GATEWAY_API_KEY == null ? undefined : gatewayFromEnv.apiKey;\n case 'VERCEL_OIDC_TOKEN':\n return getAiGatewayAuthFromEnv({\n env: { VERCEL_OIDC_TOKEN: env.VERCEL_OIDC_TOKEN },\n }).apiKey;\n case null:\n return undefined;\n }\n}\n\nfunction stableStringify({ value }: { value: unknown }): string {\n return JSON.stringify(sortIdentityValue({ value }));\n}\n\nfunction sortIdentityValue({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sortIdentityValue({ value: item }));\n }\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, entry]) => [key, sortIdentityValue({ value: entry })]),\n );\n }\n return value;\n}\n","import { createHash } from 'node:crypto';\nimport type {\n ACPClientApp,\n ACPProviderAuthenticationCompatibility,\n} from '../acp-auth';\nimport type {\n ACPModelMapping,\n ACPNpmSimpleSource,\n ACPPermissionModeMapping,\n ACPSerializableValue,\n ACPSource,\n ACPV1Settings,\n} from './acp-v1-settings';\n\n/*\n * Launch descriptor assembled from the launch-related settings fields. The\n * fields are declared here rather than derived from ACPV1Settings so that the\n * settings type stays free to describe the configuration surface while this\n * type describes what the bootstrap, install, and identity logic consume. The\n * two shapes are required to agree, and createACPV1Implementation is the only\n * place that maps between them.\n */\nexport type ACPImplementation = {\n readonly source: ACPSource;\n readonly executable: string;\n readonly args?: ReadonlyArray<string>;\n readonly forwardEnv?: ReadonlyArray<string>;\n readonly credentialEnv?: ReadonlyArray<string>;\n readonly env?: Readonly<Record<string, string>>;\n};\n\nexport function createACPV1Implementation({\n settings,\n}: {\n settings: ACPV1Settings;\n}): ACPImplementation {\n return {\n source: settings.source,\n executable: settings.executable,\n args: settings.args,\n forwardEnv: settings.forwardEnv,\n credentialEnv: settings.credentialEnv,\n env: settings.env,\n };\n}\n\nconst EXACT_SEMVER_REGEXP =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\nconst PACKAGE_NAME_REGEXP =\n /^(?:@[a-z0-9][a-z0-9._-]*\\/)?[a-z0-9][a-z0-9._-]*$/;\nconst EXECUTABLE_NAME_REGEXP = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst ENVIRONMENT_VARIABLE_NAME_REGEXP = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport function validateACPV1Implementation(\n implementation: ACPImplementation,\n): void {\n const { source } = implementation;\n if (source.type === 'npm-locked') {\n if (source.packageJson.length === 0) {\n throw new Error('ACP source.packageJson must not be empty.');\n }\n if (source.pnpmLockYaml.length === 0) {\n throw new Error('ACP source.pnpmLockYaml must not be empty.');\n }\n if (source.pnpmWorkspaceYaml?.length === 0) {\n throw new Error('ACP source.pnpmWorkspaceYaml must not be empty.');\n }\n } else if (source.type === 'npm-simple') {\n validateNpmSimpleSource({ source });\n } else if (source.command.trim().length === 0) {\n throw new Error('ACP source.command must not be empty.');\n }\n if (!EXECUTABLE_NAME_REGEXP.test(implementation.executable)) {\n throw new Error(\n `ACP executable must be a bare command name without a path; received ${JSON.stringify(implementation.executable)}.`,\n );\n }\n\n validateForwardEnvironment({ forwardEnv: implementation.forwardEnv });\n validateForwardEnvironment({ forwardEnv: implementation.credentialEnv });\n validateEnvironment({ env: implementation.env });\n const forwardedKeys = new Set(implementation.forwardEnv ?? []);\n const credentialKeys = new Set(implementation.credentialEnv ?? []);\n for (const key of credentialKeys) {\n if (forwardedKeys.has(key)) {\n throw new Error(\n `ACP runtime environment key ${JSON.stringify(key)} cannot be configured in both forwardEnv and credentialEnv.`,\n );\n }\n }\n for (const key of Object.keys(implementation.env ?? {})) {\n if (forwardedKeys.has(key)) {\n throw new Error(\n `ACP runtime environment key ${JSON.stringify(key)} cannot be configured in both forwardEnv and env.`,\n );\n }\n if (credentialKeys.has(key)) {\n throw new Error(\n `ACP runtime environment key ${JSON.stringify(key)} cannot be configured in both credentialEnv and env.`,\n );\n }\n }\n}\n\nexport function createImplementationManifest({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n const { source } = implementation;\n if (source.type === 'install-command') return undefined;\n if (source.type === 'npm-locked') {\n return source.packageJson;\n }\n return (\n JSON.stringify(\n {\n name: 'harness-acp-implementation',\n version: '0.0.0',\n private: true,\n type: 'module',\n dependencies: {\n [source.packageName]: source.packageVersion ?? 'latest',\n },\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\nexport function getImplementationLockfile({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n const { source } = implementation;\n return source.type === 'npm-locked' ? source.pnpmLockYaml : undefined;\n}\n\nexport function getImplementationWorkspaceFile({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n const { source } = implementation;\n return source.type === 'npm-locked' ? source.pnpmWorkspaceYaml : undefined;\n}\n\nexport function createImplementationDescriptor({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string {\n return (\n JSON.stringify(\n {\n executablePath:\n implementation.source.type === 'install-command'\n ? `home/.local/bin/${implementation.executable}`\n : `node_modules/.bin/${implementation.executable}`,\n privateHome: implementation.source.type === 'install-command',\n args: implementation.args ?? [],\n envKeys: getImplementationEnvironmentKeys({ implementation }),\n },\n null,\n 2,\n ) + '\\n'\n );\n}\n\nexport function createImplementationIdentity({\n harnessId,\n acpVersion,\n implementation,\n clientApp,\n clientCapabilities,\n modelMapping,\n providerAuthentication,\n permissionModeMapping,\n}: {\n harnessId: string;\n acpVersion: 'v1';\n implementation: ACPImplementation;\n clientApp: ACPClientApp;\n clientCapabilities?: Readonly<Record<string, ACPSerializableValue>>;\n modelMapping: ACPModelMapping;\n providerAuthentication: ACPProviderAuthenticationCompatibility | undefined;\n permissionModeMapping?: ACPPermissionModeMapping;\n}): string {\n const { source } = implementation;\n const sourceIdentity =\n source.type === 'npm-locked'\n ? {\n type: source.type,\n packageJson: source.packageJson,\n pnpmLockYaml: source.pnpmLockYaml,\n pnpmWorkspaceYaml: source.pnpmWorkspaceYaml,\n }\n : source.type === 'npm-simple'\n ? {\n type: source.type,\n packageName: source.packageName,\n ...(source.packageVersion == null\n ? {}\n : { packageVersion: source.packageVersion }),\n }\n : {\n type: source.type,\n command: source.command,\n };\n const forwardedEnvironment = [\n ...new Set(implementation.forwardEnv ?? []),\n ].sort();\n const credentialEnvironment = [\n ...new Set(implementation.credentialEnv ?? []),\n ].sort();\n const literalEnvironment = Object.fromEntries(\n Object.entries(implementation.env ?? {})\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => [key, { value }]),\n );\n const payload = {\n harnessId,\n acpVersion,\n source: sourceIdentity,\n executable: implementation.executable,\n args: implementation.args ?? [],\n clientApp,\n clientCapabilities: clientCapabilities ?? null,\n modelMapping,\n environment: {\n forwarded: forwardedEnvironment,\n credential: credentialEnvironment,\n literal: literalEnvironment,\n },\n providerAuthentication: providerAuthentication ?? null,\n permissionModeMapping: permissionModeMapping ?? null,\n };\n return createHash('sha256')\n .update(stableStringify({ value: payload }))\n .digest('hex');\n}\n\nexport function createImplementationInstallCommand({\n implementationDir,\n storeDir,\n implementation,\n}: {\n implementationDir: string;\n storeDir: string;\n implementation: ACPImplementation;\n}): string {\n if (implementation.source.type === 'install-command') {\n return 'bash implementation/install.sh';\n }\n return (\n `pnpm --dir ${implementationDir} install` +\n (implementation.source.type === 'npm-locked' ? ' --frozen-lockfile' : '') +\n ` --prod --store-dir ${storeDir}`\n );\n}\n\nexport function getImplementationInstallScript({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string | undefined {\n if (implementation.source.type !== 'install-command') return undefined;\n return `#!/usr/bin/env bash\nset -euo pipefail\n\nACP_IMPLEMENTATION_DIR=\"$(cd \"$(dirname \"\\${BASH_SOURCE[0]}\")\" && pwd)\"\nACP_INSTALL_HOME=\"$ACP_IMPLEMENTATION_DIR/home\"\nexport HOME=\"$ACP_INSTALL_HOME\"\nexport PATH=\"$ACP_INSTALL_HOME/.local/bin:$PATH\"\n\nmkdir -p \"$ACP_INSTALL_HOME/.local/bin\"\ncd \"$ACP_IMPLEMENTATION_DIR\"\n\n${implementation.source.command}\n`;\n}\n\nexport function resolveImplementationEnvironment({\n implementation,\n env,\n credentialEnv = env,\n}: {\n implementation: ACPImplementation;\n env: Readonly<Record<string, string | undefined>>;\n credentialEnv?: Readonly<Record<string, string | undefined>>;\n}): Record<string, string> {\n const forwardedEnvironment: Record<string, string> = {};\n for (const name of implementation.forwardEnv ?? []) {\n const value = env[name];\n if (value != null && value.length > 0) {\n forwardedEnvironment[name] = value;\n }\n }\n for (const name of implementation.credentialEnv ?? []) {\n const value = credentialEnv[name];\n if (value != null && value.length > 0) {\n forwardedEnvironment[name] = value;\n }\n }\n return {\n ...forwardedEnvironment,\n ...implementation.env,\n };\n}\n\nfunction validateNpmSimpleSource({\n source,\n}: {\n source: ACPNpmSimpleSource;\n}): void {\n if (!PACKAGE_NAME_REGEXP.test(source.packageName)) {\n throw new Error(\n `ACP npm package name is invalid: ${JSON.stringify(source.packageName)}.`,\n );\n }\n if (\n source.packageVersion != null &&\n !EXACT_SEMVER_REGEXP.test(source.packageVersion)\n ) {\n throw new Error(\n `ACP npm package version must be an exact semantic version; received ${JSON.stringify(source.packageVersion)}.`,\n );\n }\n}\n\nfunction validateEnvironment({\n env,\n}: {\n env: Readonly<Record<string, string>> | undefined;\n}): void {\n for (const [key, value] of Object.entries(env ?? {})) {\n if (!ENVIRONMENT_VARIABLE_NAME_REGEXP.test(key)) {\n throw new Error(\n `ACP environment variable name is invalid: ${JSON.stringify(key)}.`,\n );\n }\n if (value.includes('\\0')) {\n throw new Error(`ACP runtime environment value for ${key} contains NUL.`);\n }\n }\n}\n\nfunction validateForwardEnvironment({\n forwardEnv,\n}: {\n forwardEnv: ReadonlyArray<string> | undefined;\n}): void {\n for (const name of forwardEnv ?? []) {\n if (!ENVIRONMENT_VARIABLE_NAME_REGEXP.test(name)) {\n throw new Error(\n `ACP environment variable name is invalid: ${JSON.stringify(name)}.`,\n );\n }\n }\n}\n\nfunction getImplementationEnvironmentKeys({\n implementation,\n}: {\n implementation: ACPImplementation;\n}): string[] {\n return [\n ...new Set([\n ...(implementation.forwardEnv ?? []),\n ...(implementation.credentialEnv ?? []),\n ...Object.keys(implementation.env ?? {}),\n ]),\n ].sort();\n}\n\nfunction stableStringify({ value }: { value: unknown }): string {\n return JSON.stringify(sortValue({ value }));\n}\n\nfunction sortValue({ value }: { value: unknown }): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sortValue({ value: item }));\n }\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, sortValue({ value: item })]),\n );\n }\n return value;\n}\n","import type { HarnessV1Bootstrap } from '@ai-sdk/harness';\nimport { createReadBridgeAsset } from '@ai-sdk/harness/utils';\nimport {\n createImplementationDescriptor,\n createImplementationInstallCommand,\n createImplementationManifest,\n getImplementationInstallScript,\n getImplementationLockfile,\n getImplementationWorkspaceFile,\n type ACPImplementation,\n} from './implementation';\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 'index.mjs': new URL('./bridge/index.mjs', import.meta.url),\n 'host-tool-mcp.mjs': new URL('./bridge/host-tool-mcp.mjs', import.meta.url),\n});\n\nexport function createACPBootstrap({\n harnessId,\n implementation,\n}: {\n readonly harnessId: string;\n readonly implementation: ACPImplementation;\n}): {\n readonly bootstrapDir: string;\n readonly getBootstrap: () => Promise<HarnessV1Bootstrap>;\n} {\n const bootstrapDir = `.harness-bootstrap/${harnessId}`;\n let cachedBootstrap: HarnessV1Bootstrap | undefined;\n\n return {\n bootstrapDir,\n getBootstrap: async () => {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [bridgePackage, bridgeLock, bridge, hostToolMCP] =\n await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n const implementationManifest = createImplementationManifest({\n implementation,\n });\n const implementationLock = getImplementationLockfile({\n implementation,\n });\n const implementationWorkspace = getImplementationWorkspaceFile({\n implementation,\n });\n const implementationInstallScript = getImplementationInstallScript({\n implementation,\n });\n cachedBootstrap = {\n harnessId,\n bootstrapDir,\n files: [\n {\n path: `${bootstrapDir}/package.json`,\n content: bridgePackage,\n },\n {\n path: `${bootstrapDir}/pnpm-lock.yaml`,\n content: bridgeLock,\n },\n { path: `${bootstrapDir}/bridge.mjs`, content: bridge },\n {\n path: `${bootstrapDir}/host-tool-mcp.mjs`,\n content: hostToolMCP,\n },\n {\n path: `${bootstrapDir}/implementation/implementation.json`,\n content: createImplementationDescriptor({ implementation }),\n },\n ...(implementationManifest == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/package.json`,\n content: implementationManifest,\n },\n ]),\n ...(implementationLock == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/pnpm-lock.yaml`,\n content: implementationLock,\n },\n ]),\n ...(implementationWorkspace == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/pnpm-workspace.yaml`,\n content: implementationWorkspace,\n },\n ]),\n ...(implementationInstallScript == null\n ? []\n : [\n {\n path: `${bootstrapDir}/implementation/install.sh`,\n content: implementationInstallScript,\n },\n ]),\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: createImplementationInstallCommand({\n implementationDir: 'implementation',\n storeDir: '../.pnpm-store',\n implementation,\n }),\n },\n ],\n };\n return cachedBootstrap;\n },\n };\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n harnessV1BridgeToolWireSchema,\n type HarnessV1BuiltinTool,\n type HarnessV1DebugConfig,\n type HarnessV1LifecycleState,\n type HarnessV1PermissionMode,\n type HarnessV1ToolSpec,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\nimport type { ACPToolCall } from '../acp-tool-call';\nimport type {\n ACPInstructionMapping,\n ACPModelMapping,\n ACPPermissionModeMapping,\n} from './acp-v1-settings';\nimport { acpTextContentBlockSchema } from './acp-v1-prompt';\n\nexport type ACPBuiltinToolMapping = {\n /**\n * Key of the tool in `HarnessV1.builtinTools`, which is also emitted as the\n * Harness V1 `toolName`. It is the common tool name when the tool has a\n * standardized Harness V1 equivalent; otherwise it is the native tool name.\n */\n readonly toolName: string;\n\n /**\n * Name used by the underlying agent runtime. It is present when `toolName`\n * is a Harness V1 common tool name that differs from the runtime's name.\n */\n readonly nativeName?: HarnessV1BuiltinTool['nativeName'];\n\n /**\n * Stable prefix of the display title emitted by an ACP implementation.\n * Used only when the implementation omits a programmatic tool name.\n */\n readonly title?: HarnessV1BuiltinTool['title'];\n\n /**\n * Broad capability category used to compare a built-in with the ACP tool\n * kind when resolving unnamed calls.\n */\n readonly toolUseKind?: HarnessV1BuiltinTool['toolUseKind'];\n\n /**\n * JSON Schema used to identify tool calls when an ACP implementation does\n * not provide a programmatic tool name. It is optional because built-in\n * definitions are allowed to omit their input schema.\n */\n readonly inputSchema?: HarnessV1LifecycleState['data'];\n};\n\nconst builtinToolSchema: z.ZodType<ACPBuiltinToolMapping> = z.object({\n toolName: z.string(),\n nativeName: z.string().optional(),\n title: z.string().optional(),\n toolUseKind: z.enum(['readonly', 'edit', 'bash']).optional(),\n inputSchema: z.json().optional(),\n});\n\ntype ACPSerializableToolSpec = Omit<HarnessV1ToolSpec, 'inputSchema'> & {\n readonly inputSchema?: NonNullable<HarnessV1ToolSpec['inputSchema']> &\n HarnessV1LifecycleState['data'];\n};\n\nconst jsonValueSchema = z.json();\n\nexport const acpSerializableToolSpecSchema: z.ZodType<ACPSerializableToolSpec> =\n harnessV1BridgeToolWireSchema.extend({\n inputSchema: z\n .custom<NonNullable<ACPSerializableToolSpec['inputSchema']>>(\n value =>\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n jsonValueSchema.safeParse(value).success,\n )\n .optional(),\n });\n\nconst permissionModeTargetSchema = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('session-mode'),\n modeId: z.string(),\n }),\n z.object({\n type: z.literal('session-config-option'),\n configId: z.string(),\n value: z.union([z.string(), z.boolean()]),\n }),\n]);\n\nconst permissionModeMappingSchema: z.ZodType<ACPPermissionModeMapping> =\n z.object({\n 'allow-reads': permissionModeTargetSchema.nullable(),\n 'allow-edits': permissionModeTargetSchema.nullable(),\n 'allow-all': permissionModeTargetSchema.nullable(),\n });\n\nconst instructionMappingPathSchema = z.array(z.string().min(1)).min(1);\n\nconst instructionMappingSchema: z.ZodType<ACPInstructionMapping> =\n z.discriminatedUnion('type', [\n z.object({\n type: z.literal('session-meta'),\n path: instructionMappingPathSchema,\n }),\n z.object({\n type: z.literal('launch-env-json'),\n variable: z.string().min(1),\n path: instructionMappingPathSchema,\n }),\n z.object({\n type: z.literal('filesystem'),\n path: z.string().min(1),\n }),\n ]);\n\ntype ACPSerializableOutputSchemaMapping = {\n readonly type: 'session-prompt-meta';\n readonly path: string[];\n};\n\nconst outputSchemaMappingSchema: z.ZodType<ACPSerializableOutputSchemaMapping> =\n z.object({\n type: z.literal('session-prompt-meta'),\n path: z.array(z.string().min(1)).min(1),\n });\n\nconst modelMappingSchema: z.ZodType<ACPModelMapping> = z.discriminatedUnion(\n 'type',\n [\n z.object({\n type: z.literal('session-config-option'),\n path: z.string().min(1),\n }),\n z.object({\n type: z.literal('session-model'),\n path: z.string().min(1),\n }),\n ],\n);\n\nexport type ACPTurnStartConfig = {\n readonly version: 1;\n readonly configurationFingerprint: string;\n readonly prompt: Array<z.infer<typeof acpTextContentBlockSchema>>;\n readonly tools: Array<ACPSerializableToolSpec>;\n readonly builtinTools: Array<ACPBuiltinToolMapping>;\n readonly permissionMode: HarnessV1PermissionMode;\n readonly permissionModeMapping?: ACPPermissionModeMapping;\n readonly model?: string;\n readonly modelMapping?: ACPModelMapping;\n readonly debug?: HarnessV1DebugConfig;\n readonly responseFormat?: z.infer<\n typeof harnessV1BridgeStartBaseSchema\n >['responseFormat'];\n readonly outputSchemaMapping?: ACPSerializableOutputSchemaMapping;\n};\n\nexport const acpTurnStartConfigSchema = z.object({\n version: z.literal(1),\n configurationFingerprint: z.string(),\n prompt: z.array(acpTextContentBlockSchema),\n tools: z.array(acpSerializableToolSpecSchema).default([]),\n builtinTools: z.array(builtinToolSchema).default([]),\n permissionMode: harnessV1BridgeStartBaseSchema.shape.permissionMode.unwrap(),\n permissionModeMapping: permissionModeMappingSchema.optional(),\n model: harnessV1BridgeStartBaseSchema.shape.model.optional(),\n modelMapping: modelMappingSchema.optional(),\n debug: harnessV1BridgeStartBaseSchema.shape.debug.optional(),\n responseFormat:\n harnessV1BridgeStartBaseSchema.shape.responseFormat.optional(),\n outputSchemaMapping: outputSchemaMappingSchema.optional(),\n}) satisfies z.ZodType<ACPTurnStartConfig>;\n\nexport type ACPColdSessionState = Omit<\n ACPTurnStartConfig,\n 'prompt' | 'debug' | 'model' | 'modelMapping'\n>;\n\nexport const acpColdSessionStateSchema: z.ZodType<ACPColdSessionState> =\n acpTurnStartConfigSchema.omit({\n prompt: true,\n debug: true,\n model: true,\n modelMapping: true,\n });\n\nconst lossyRecoverySchema = z.object({\n type: z.literal('lossy-rerun'),\n acpSessionId: z.string(),\n reason: z.string(),\n});\n\nconst coldRestoreSchema = z.object({\n type: z.literal('cold-restore'),\n acpSessionId: z.string(),\n});\n\nconst acpToolCallCandidateSchema = z.object({\n type: z.literal('acp-tool-call-candidate'),\n requestId: z.string(),\n toolCall: z.custom<ACPToolCall>(\n value =>\n value != null &&\n typeof value === 'object' &&\n typeof (value as { toolCallId?: unknown }).toolCallId === 'string' &&\n typeof (value as { title?: unknown }).title === 'string',\n ),\n});\n\nconst acpQuestionRequestSchema = z.object({\n type: z.literal('acp-question-request'),\n requestId: z.string(),\n nativeRequest: z.unknown(),\n nativeToolCall: acpToolCallCandidateSchema.shape.toolCall.optional(),\n});\n\nconst acpQuestionResolvedSchema = z.object({\n type: z.literal('acp-question-resolved'),\n requestId: z.string(),\n});\n\nexport const outboundMessageSchema = z.union([\n harnessV1BridgeOutboundMessageSchema,\n acpToolCallCandidateSchema,\n acpQuestionRequestSchema,\n acpQuestionResolvedSchema,\n]);\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n prompt: z.array(acpTextContentBlockSchema),\n instructions: z.string().optional(),\n instructionMapping: instructionMappingSchema.optional(),\n outputSchemaMapping: outputSchemaMappingSchema.optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n tools: z.array(acpSerializableToolSpecSchema).optional(),\n builtinTools: z.array(builtinToolSchema).readonly().default([]),\n permissionModeMapping: permissionModeMappingSchema.optional(),\n modelMapping: modelMappingSchema.optional(),\n turnStartConfig: acpTurnStartConfigSchema,\n recoveryMode: z\n .discriminatedUnion('type', [lossyRecoverySchema, coldRestoreSchema])\n .optional(),\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","import {\n HarnessCapabilityUnsupportedError,\n type HarnessV1Prompt,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const acpTextContentBlockSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\nexport type ACPTextContentBlock = z.infer<typeof acpTextContentBlockSchema>;\n\nexport function convertHarnessPromptToACPTextBlocks({\n prompt,\n harnessId,\n}: {\n prompt: HarnessV1Prompt;\n harnessId: string;\n}): ACPTextContentBlock[] {\n if (typeof prompt === 'string') {\n return [{ type: 'text', text: prompt }];\n }\n if (typeof prompt.content === 'string') {\n return [{ type: 'text', text: prompt.content }];\n }\n\n const content: ACPTextContentBlock[] = [];\n for (const part of prompt.content) {\n if (part.type === 'text') {\n content.push({ type: 'text', text: part.text });\n continue;\n }\n if (part.type === 'image') {\n throw unsupportedPromptContent({\n harnessId,\n category: 'image content',\n });\n }\n if (part.type === 'file') {\n const mediaCategory = part.mediaType.toLowerCase().split('/', 1)[0];\n if (mediaCategory === 'image') {\n throw unsupportedPromptContent({\n harnessId,\n category: 'image content',\n });\n }\n if (mediaCategory === 'audio') {\n throw unsupportedPromptContent({\n harnessId,\n category: 'audio content',\n });\n }\n throw unsupportedPromptContent({\n harnessId,\n category: `embedded resource content with media type ${JSON.stringify(part.mediaType)}`,\n });\n }\n throw unsupportedPromptContent({\n harnessId,\n category: `content parts of type ${JSON.stringify(\n (part as { readonly type?: unknown }).type,\n )}`,\n });\n }\n return content;\n}\n\nexport function prependACPInstructionGuidance({\n prompt,\n instructions,\n}: {\n prompt: ReadonlyArray<ACPTextContentBlock>;\n instructions: string | undefined;\n}): ACPTextContentBlock[] {\n const hasInstructions = instructions != null && instructions.length > 0;\n if (!hasInstructions) return [...prompt];\n\n const lines = [\n '<session-guidance>',\n 'This block is operating guidance from the harness, not user-authored content.',\n ];\n lines.push('<instructions>', instructions, '</instructions>');\n lines.push('</session-guidance>');\n\n return [{ type: 'text', text: lines.join('\\n') }, ...prompt];\n}\n\nfunction unsupportedPromptContent({\n harnessId,\n category,\n}: {\n harnessId: string;\n category: string;\n}): HarnessCapabilityUnsupportedError {\n return new HarnessCapabilityUnsupportedError({\n harnessId,\n message:\n `The ${harnessId} ACP harness supports only portable text prompts and does not support ${category}. ` +\n 'Pass a string or a user message whose content contains only text parts.',\n });\n}\n","import { z } from 'zod/v4';\nimport type {\n ACPAuthentication,\n ACPHostToolMCPTransport,\n ACPProfileValue,\n ACPSerializableValue,\n} from '../acp-v1-settings';\n\nexport const ACP_BRIDGE_CONFIGURATION_ENV = 'AI_SDK_ACP_BRIDGE_CONFIGURATION';\n\nconst serializableValueSchema: z.ZodType<ACPSerializableValue> = z.json();\n\nconst profileValueSchema: z.ZodType<ACPProfileValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.object({\n $source: z.enum([\n 'gateway-api-key',\n 'gateway-base-url',\n 'gateway-authorization',\n 'client-app',\n 'client-app-name',\n 'client-app-version',\n ]),\n prefix: z.string().optional(),\n suffix: z.string().optional(),\n ensureSuffix: z.string().optional(),\n }),\n z.array(profileValueSchema),\n z.record(z.string(), profileValueSchema),\n ]),\n);\n\nconst hostToolMcpTransportSchema: z.ZodType<ACPHostToolMCPTransport> = z.enum([\n 'stdio',\n 'http',\n]);\n\nconst serializableRecordSchema = z.record(z.string(), serializableValueSchema);\nconst profileRecordSchema = z.record(z.string(), profileValueSchema);\n\nconst authenticationSchema: z.ZodType<ACPAuthentication> = z.object({\n methodId: z.string(),\n meta: serializableRecordSchema.optional(),\n clientCapabilities: serializableRecordSchema.optional(),\n});\n\nconst providerAuthenticationSchema = z.discriminatedUnion('type', [\n z.object({ type: z.literal('direct') }),\n z.object({\n type: z.literal('ai-gateway'),\n env: profileRecordSchema,\n }),\n]);\n\nexport type ACPResolvedProviderAuthentication = z.infer<\n typeof providerAuthenticationSchema\n>;\n\nexport type ACPBridgeConfiguration = {\n readonly authentication?: ACPAuthentication;\n readonly providerAuthentication?: ACPResolvedProviderAuthentication;\n readonly providerEnvironment?: Readonly<Record<string, string>>;\n readonly sessionMeta?: Readonly<Record<string, ACPSerializableValue>>;\n readonly clientCapabilities?: Readonly<Record<string, ACPSerializableValue>>;\n readonly askUserQuestionsRequestMethod?: string;\n readonly hostToolMcpTransport?: ACPHostToolMCPTransport;\n};\n\nconst bridgeConfigurationSchema: z.ZodType<ACPBridgeConfiguration> = z.object({\n authentication: authenticationSchema.optional(),\n providerAuthentication: providerAuthenticationSchema.optional(),\n providerEnvironment: z.record(z.string(), z.string()).optional(),\n sessionMeta: serializableRecordSchema.optional(),\n clientCapabilities: serializableRecordSchema.optional(),\n askUserQuestionsRequestMethod: z.string().optional(),\n hostToolMcpTransport: hostToolMcpTransportSchema.optional(),\n});\n\nexport function createACPBridgeEnvironment({\n authentication,\n providerAuthentication,\n providerEnvironment,\n sessionMeta,\n clientCapabilities,\n askUserQuestionsRequestMethod,\n hostToolMcpTransport,\n}: ACPBridgeConfiguration): Record<string, string> {\n return {\n [ACP_BRIDGE_CONFIGURATION_ENV]: JSON.stringify({\n ...(authentication == null ? {} : { authentication }),\n ...(providerAuthentication == null ? {} : { providerAuthentication }),\n ...(providerEnvironment == null ? {} : { providerEnvironment }),\n ...(sessionMeta == null ? {} : { sessionMeta }),\n ...(clientCapabilities == null ? {} : { clientCapabilities }),\n ...(askUserQuestionsRequestMethod == null\n ? {}\n : { askUserQuestionsRequestMethod }),\n ...(hostToolMcpTransport == null ? {} : { hostToolMcpTransport }),\n }),\n };\n}\n\nexport async function readACPBridgeEnvironment({\n env,\n}: {\n env: Readonly<Record<string, string | undefined>>;\n}): Promise<ACPBridgeConfiguration> {\n const serialized = env[ACP_BRIDGE_CONFIGURATION_ENV];\n if (serialized == null) return {};\n try {\n const result = bridgeConfigurationSchema.safeParse(JSON.parse(serialized));\n if (result.success) return result.data;\n } catch {}\n throw new Error('ACP bridge configuration environment is invalid.');\n}\n","import type { ACPProfileValue, ACPSerializableValue } from '../acp-v1-settings';\n\nexport type ACPGatewayValues = {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly clientAppName: string;\n readonly clientAppVersion: string;\n};\n\nexport function resolveACPProfileValue({\n value,\n gateway,\n}: {\n value: ACPProfileValue;\n gateway: ACPGatewayValues;\n}): ACPSerializableValue {\n if (Array.isArray(value)) {\n return value.map(item => resolveACPProfileValue({ value: item, gateway }));\n }\n if (value !== null && typeof value === 'object') {\n if (isValueSource(value)) {\n const sourceValue = resolveSource({ source: value.$source, gateway });\n const resolved = `${value.prefix ?? ''}${sourceValue}`;\n return value.ensureSuffix == null\n ? `${resolved}${value.suffix ?? ''}`\n : ensureSuffix({\n value: resolved,\n suffix: value.ensureSuffix,\n });\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n resolveACPProfileValue({ value: item, gateway }),\n ]),\n );\n }\n return value;\n}\n\nfunction isValueSource(value: object): value is {\n readonly $source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n readonly prefix?: string;\n readonly suffix?: string;\n readonly ensureSuffix?: string;\n} {\n return (\n '$source' in value &&\n typeof (value as { $source?: unknown }).$source === 'string'\n );\n}\n\nfunction ensureSuffix({\n value,\n suffix,\n}: {\n value: string;\n suffix: string;\n}): string {\n const normalized = value.replace(/\\/+$/, '');\n return normalized.endsWith(suffix) ? normalized : `${normalized}${suffix}`;\n}\n\nfunction resolveSource({\n source,\n gateway,\n}: {\n source:\n | 'gateway-api-key'\n | 'gateway-base-url'\n | 'gateway-authorization'\n | 'client-app'\n | 'client-app-name'\n | 'client-app-version';\n gateway: ACPGatewayValues;\n}): string {\n switch (source) {\n case 'gateway-api-key':\n return gateway.apiKey;\n case 'gateway-base-url':\n return gateway.baseUrl;\n case 'gateway-authorization':\n return `Bearer ${gateway.apiKey}`;\n case 'client-app':\n return `${gateway.clientAppName}/${gateway.clientAppVersion}`;\n case 'client-app-name':\n return gateway.clientAppName;\n case 'client-app-version':\n return gateway.clientAppVersion;\n }\n}\n","import type { ACPResolvedProviderAuthentication } from './acp-v1-bridge-environment';\nimport type { ACPClientApp } from '../../acp-auth';\nimport type { ACPAuthentication } from '../acp-v1-settings';\nimport {\n resolveACPProfileValue,\n type ACPGatewayValues,\n} from './profile-values';\n\nexport type ACPInitializeResult = {\n readonly protocolVersion: number;\n readonly authMethods?: ReadonlyArray<{ readonly id: string }> | null;\n readonly agentCapabilities?: Readonly<Record<string, unknown>> | null;\n};\n\nexport function createACPInitializeRequest({\n protocolVersion,\n clientApp,\n authentication,\n clientCapabilities: configuredClientCapabilities,\n supportsBooleanSessionConfigOptions = false,\n}: {\n protocolVersion: number;\n clientApp: ACPClientApp;\n authentication: ACPAuthentication | undefined;\n clientCapabilities?: Readonly<Record<string, unknown>>;\n supportsBooleanSessionConfigOptions?: boolean;\n}): {\n readonly protocolVersion: number;\n readonly clientInfo: {\n readonly name: string;\n readonly version: string;\n };\n readonly clientCapabilities: Readonly<Record<string, unknown>>;\n} {\n let clientCapabilities = mergeRecords({\n left: authentication?.clientCapabilities ?? {},\n right: configuredClientCapabilities ?? {},\n });\n if (supportsBooleanSessionConfigOptions) {\n clientCapabilities = mergeRecords({\n left: clientCapabilities,\n right: {\n session: {\n configOptions: {\n boolean: {},\n },\n },\n },\n });\n }\n return {\n protocolVersion,\n clientInfo: clientApp,\n clientCapabilities,\n };\n}\n\nexport function resolveACPLaunchEnvironment({\n providerAuthentication,\n gateway,\n}: {\n providerAuthentication: ACPResolvedProviderAuthentication | undefined;\n gateway: ACPGatewayValues | undefined;\n}): Record<string, string> {\n if (providerAuthentication?.type !== 'ai-gateway') {\n return {};\n }\n const resolved = asRecord(\n resolveACPProfileValue({\n value: providerAuthentication.env,\n gateway: requireGateway({ gateway }),\n }),\n );\n return Object.fromEntries(\n Object.entries(resolved).map(([key, value]) => [\n key,\n typeof value === 'string' ? value : JSON.stringify(value),\n ]),\n );\n}\n\nexport function validateACPProtocolVersion({\n requested,\n initialization,\n}: {\n requested: number;\n initialization: ACPInitializeResult;\n}): void {\n if (initialization.protocolVersion !== requested) {\n throw new Error(\n `ACP protocol negotiation failed: requested v${requested}, agent selected v${initialization.protocolVersion}.`,\n );\n }\n}\n\nexport function assertACPAuthenticationMethod({\n initialization,\n methodId,\n}: {\n initialization: ACPInitializeResult;\n methodId: string;\n}): void {\n if (!initialization.authMethods?.some(method => method.id === methodId)) {\n const advertised =\n initialization.authMethods?.map(method => method.id).join(', ') || 'none';\n throw new Error(\n `ACP authentication method ${JSON.stringify(methodId)} is not advertised by the agent. Advertised methods: ${advertised}.`,\n );\n }\n}\n\nfunction mergeRecords({\n left,\n right,\n}: {\n left: Readonly<Record<string, unknown>>;\n right: Readonly<Record<string, unknown>>;\n}): Readonly<Record<string, unknown>> {\n const result: Record<string, unknown> = { ...left };\n for (const [key, value] of Object.entries(right)) {\n const previous = result[key];\n result[key] =\n isRecord(previous) && isRecord(value)\n ? mergeRecords({ left: previous, right: value })\n : value;\n }\n return result;\n}\n\nfunction requireGateway({\n gateway,\n}: {\n gateway: ACPGatewayValues | undefined;\n}): ACPGatewayValues {\n if (gateway == null) {\n throw new Error('ACP Gateway profile values are unavailable.');\n }\n return gateway;\n}\n\nfunction asRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (!isRecord(value)) {\n throw new Error('ACP profile data must resolve to an object.');\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n","import { createHash } from 'node:crypto';\nimport type { HarnessV1DebugConfig, HarnessV1ToolSpec } from '@ai-sdk/harness';\nimport type { ACPAuthenticationProfileIdentity } from '../acp-auth';\nimport {\n acpSerializableToolSpecSchema,\n type ACPBuiltinToolMapping,\n type ACPColdSessionState,\n type ACPTurnStartConfig,\n type StartMessage,\n} from './acp-v1-bridge-protocol';\nimport type { ACPTextContentBlock } from './acp-v1-prompt';\nimport type {\n ACPInstructionMapping,\n ACPModelMapping,\n ACPOutputSchemaMapping,\n ACPPermissionModeMapping,\n ACPSerializableValue,\n} from './acp-v1-settings';\n\nexport function createACPTurnStartConfig({\n prompt,\n tools,\n builtinTools,\n permissionMode,\n permissionModeMapping,\n mcpServers,\n debug,\n authenticationProfile,\n sessionMeta,\n instructionMapping,\n responseFormat,\n outputSchemaMapping,\n model,\n modelMapping,\n}: {\n prompt: ReadonlyArray<ACPTextContentBlock>;\n tools: ReadonlyArray<HarnessV1ToolSpec>;\n builtinTools: ReadonlyArray<ACPBuiltinToolMapping>;\n permissionMode: NonNullable<StartMessage['permissionMode']>;\n permissionModeMapping: ACPPermissionModeMapping | undefined;\n mcpServers: Record<string, unknown> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n sessionMeta: Readonly<Record<string, ACPSerializableValue>> | undefined;\n instructionMapping: ACPInstructionMapping | undefined;\n responseFormat: StartMessage['responseFormat'];\n outputSchemaMapping: ACPOutputSchemaMapping | undefined;\n model: string | undefined;\n modelMapping: ACPModelMapping;\n}): ACPTurnStartConfig {\n return {\n version: 1,\n configurationFingerprint: createHash('sha256')\n .update(\n stableStringify({\n authenticationProfile,\n sessionMeta: sessionMeta ?? null,\n ...(instructionMapping == null ? {} : { instructionMapping }),\n ...(outputSchemaMapping == null ? {} : { outputSchemaMapping }),\n modelMapping,\n builtinTools,\n permissionModeMapping: permissionModeMapping ?? null,\n mcpServers: mcpServers ?? null,\n }),\n )\n .digest('hex'),\n prompt: [...prompt],\n tools: tools.map(tool => acpSerializableToolSpecSchema.parse(tool)),\n builtinTools: [...builtinTools],\n permissionMode,\n ...(model == null ? {} : { model, modelMapping }),\n ...(responseFormat == null ? {} : { responseFormat }),\n ...(outputSchemaMapping == null\n ? {}\n : {\n outputSchemaMapping: {\n type: outputSchemaMapping.type,\n path: [...outputSchemaMapping.path],\n },\n }),\n ...(permissionModeMapping == null ? {} : { permissionModeMapping }),\n ...(debug == null ? {} : { debug }),\n };\n}\n\nexport function createACPColdSessionState({\n turnStartConfig,\n}: {\n turnStartConfig: ACPTurnStartConfig;\n}): ACPColdSessionState {\n return {\n version: turnStartConfig.version,\n configurationFingerprint: turnStartConfig.configurationFingerprint,\n tools: turnStartConfig.tools,\n builtinTools: turnStartConfig.builtinTools,\n permissionMode: turnStartConfig.permissionMode,\n ...(turnStartConfig.responseFormat == null\n ? {}\n : { responseFormat: turnStartConfig.responseFormat }),\n ...(turnStartConfig.outputSchemaMapping == null\n ? {}\n : { outputSchemaMapping: turnStartConfig.outputSchemaMapping }),\n ...(turnStartConfig.permissionModeMapping == null\n ? {}\n : { permissionModeMapping: turnStartConfig.permissionModeMapping }),\n };\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(item => sortValue(item));\n }\n if (value != null && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, entry]) => [key, sortValue(entry)]),\n );\n }\n return value;\n}\n","import type { ACPAuthenticationProfileIdentity } from '../acp-auth';\nimport type {\n ACPColdSessionState,\n ACPTurnStartConfig,\n} from './acp-v1-bridge-protocol';\n\nexport type ACPPromptGuidanceLifecycleState = {\n readonly initialGuidanceApplied?: boolean;\n readonly instructionsFingerprint?: string;\n readonly skillsDirectory?: string;\n};\n\nexport type ACPBridgeCoordinates = {\n readonly port: number;\n readonly token: string;\n readonly lastSeenEventId: number;\n readonly sandboxId?: string;\n readonly stateDir?: string;\n};\n\nexport type ACPLifecycleData = ACPPromptGuidanceLifecycleState & {\n readonly implementationIdentity: string;\n readonly authenticationProfile?: ACPAuthenticationProfileIdentity;\n readonly sandboxCredentialEnvironment?: Readonly<Record<string, string>>;\n readonly acpSessionId?: string;\n readonly bridge?: ACPBridgeCoordinates;\n readonly coldSession?: ACPColdSessionState;\n readonly turnStartConfig?: ACPTurnStartConfig;\n readonly recovery?: {\n readonly mode: 'disk-replay' | 'lossy-rerun';\n readonly reason: string;\n };\n readonly restoration?: {\n readonly method: 'resume' | 'load';\n };\n};\n\nexport function resolveACPInitialGuidanceApplied({\n isResume,\n lifecycleState,\n}: {\n isResume: boolean;\n lifecycleState: ACPPromptGuidanceLifecycleState | undefined;\n}): boolean {\n if (!isResume) return false;\n return lifecycleState?.initialGuidanceApplied ?? true;\n}\n\nexport function validateACPLifecycleCompatibility({\n harnessId,\n lifecycleHarnessId,\n implementationIdentity,\n authenticationProfile,\n lifecycleData,\n sandboxId,\n}: {\n harnessId: string;\n lifecycleHarnessId: string;\n implementationIdentity: string;\n authenticationProfile: ACPAuthenticationProfileIdentity;\n lifecycleData: ACPLifecycleData;\n sandboxId: string | undefined;\n}): void {\n if (lifecycleHarnessId !== harnessId) {\n throw new Error(\n `ACP lifecycle state was produced by harness ${JSON.stringify(\n lifecycleHarnessId,\n )}, but this harness is ${JSON.stringify(harnessId)}.`,\n );\n }\n if (lifecycleData.implementationIdentity !== implementationIdentity) {\n throw new Error(\n 'ACP lifecycle state is incompatible with the configured implementation.',\n );\n }\n if (\n lifecycleData.authenticationProfile?.digest !== authenticationProfile.digest\n ) {\n throw new Error(\n 'ACP lifecycle state is incompatible with the configured authentication profile.',\n );\n }\n const expectedSandboxId = lifecycleData.bridge?.sandboxId;\n if (\n expectedSandboxId != null &&\n sandboxId != null &&\n expectedSandboxId !== sandboxId\n ) {\n throw new Error(\n `ACP lifecycle state belongs to sandbox ${JSON.stringify(\n expectedSandboxId,\n )}, not ${JSON.stringify(sandboxId)}.`,\n );\n }\n}\n","import { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport type { HarnessV1Skill } from '@ai-sdk/harness';\n\nexport const ACP_SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nexport const DEFAULT_ACP_SKILLS_DIRECTORY = '.agents/skills';\n\nexport function resolveACPPrivateSessionDirectory({\n sandboxHomeDir,\n harnessId,\n sessionId,\n}: {\n sandboxHomeDir: string;\n harnessId: string;\n sessionId: string;\n}): string {\n const sessionKey = createHash('sha256').update(sessionId).digest('hex');\n return path.posix.join(\n sandboxHomeDir,\n '.ai-sdk',\n 'harness-acp',\n harnessId,\n sessionKey,\n );\n}\n\nexport function resolveACPSkillsDirectory({\n implementationHomeDir,\n skillsDirectory = DEFAULT_ACP_SKILLS_DIRECTORY,\n}: {\n implementationHomeDir: string;\n skillsDirectory?: string;\n}): string {\n const containsTraversal = skillsDirectory\n .split(/[\\\\/]/)\n .some(segment => segment === '..');\n const normalizedDirectory = path.posix.normalize(skillsDirectory);\n if (\n skillsDirectory.length === 0 ||\n skillsDirectory.includes('\\\\') ||\n path.posix.isAbsolute(skillsDirectory) ||\n path.win32.isAbsolute(skillsDirectory) ||\n containsTraversal ||\n normalizedDirectory === '.' ||\n normalizedDirectory.startsWith('../') ||\n normalizedDirectory.includes('/../') ||\n normalizedDirectory.endsWith('/..')\n ) {\n throw new Error(\n `ACP skillsDirectory ${JSON.stringify(skillsDirectory)} must be a relative POSIX path without traversal.`,\n );\n }\n\n return path.posix.join(implementationHomeDir, normalizedDirectory);\n}\n\nexport function validateACPSkills({\n skills,\n}: {\n skills: ReadonlyArray<HarnessV1Skill>;\n}): void {\n const skillNames = new Set<string>();\n for (const skill of skills) {\n if (\n !ACP_SKILL_NAME_PATTERN.test(skill.name) ||\n skill.name === '.' ||\n skill.name === '..'\n ) {\n throw new Error(\n `Invalid ACP skill name ${JSON.stringify(skill.name)}: expected a kebab-case slug.`,\n );\n }\n if (skillNames.has(skill.name)) {\n throw new Error(\n `Duplicate ACP skill name ${JSON.stringify(skill.name)}.`,\n );\n }\n skillNames.add(skill.name);\n\n const filePaths = new Set<string>();\n for (const file of skill.files ?? []) {\n const normalizedPath = validateACPAttachedFilePath({\n skillName: skill.name,\n filePath: file.path,\n });\n if (normalizedPath === 'SKILL.md') {\n throw new Error(\n `Invalid ACP skill file path ${JSON.stringify(file.path)} for skill ${JSON.stringify(\n skill.name,\n )}: SKILL.md is reserved for the skill definition.`,\n );\n }\n if (filePaths.has(normalizedPath)) {\n throw new Error(\n `Duplicate ACP skill file path ${JSON.stringify(file.path)} for skill ${JSON.stringify(\n skill.name,\n )}.`,\n );\n }\n filePaths.add(normalizedPath);\n }\n }\n}\n\nfunction validateACPAttachedFilePath({\n skillName,\n filePath,\n}: {\n skillName: string;\n filePath: string;\n}): string {\n const containsTraversal = filePath\n .split(/[\\\\/]/)\n .some(segment => segment === '..');\n const normalizedPath = path.posix.normalize(filePath);\n const invalid =\n filePath.length === 0 ||\n filePath.endsWith('/') ||\n filePath.includes('\\\\') ||\n path.posix.isAbsolute(filePath) ||\n path.win32.isAbsolute(filePath) ||\n containsTraversal ||\n normalizedPath === '.' ||\n normalizedPath.startsWith('../') ||\n normalizedPath.includes('/../') ||\n normalizedPath.endsWith('/..');\n if (invalid) {\n throw new Error(\n `Invalid ACP skill file path ${JSON.stringify(filePath)} for skill ${JSON.stringify(\n skillName,\n )}: expected a relative POSIX path without traversal.`,\n );\n }\n return normalizedPath;\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","createHash","HarnessCapabilityUnsupportedError","createHash","stableStringify","z","z","z","createHash","createHash","stableStringify","sortValue","createHash","endpoint","proc","isRecord","createHash","HarnessCapabilityUnsupportedError","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/harness-acp",
3
- "version": "1.0.58",
3
+ "version": "1.0.59",
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.120",
29
+ "@ai-sdk/harness": "1.0.121",
30
30
  "@ai-sdk/provider-utils": "5.0.45",
31
31
  "ws": "^8.21.0"
32
32
  },
@@ -10,8 +10,15 @@ import {
10
10
  type ACPImplementation,
11
11
  } from './implementation';
12
12
 
13
+ /*
14
+ * Keep every asset URL literal so bundlers can emit each file separately.
15
+ * Dynamic new URL() paths can collapse multiple assets into one resolution.
16
+ */
13
17
  const readBridgeAsset = createReadBridgeAsset({
14
- resolveAssetUrl: name => new URL(`./bridge/${name}`, import.meta.url),
18
+ 'package.json': new URL('./bridge/package.json', import.meta.url),
19
+ 'pnpm-lock.yaml': new URL('./bridge/pnpm-lock.yaml', import.meta.url),
20
+ 'index.mjs': new URL('./bridge/index.mjs', import.meta.url),
21
+ 'host-tool-mcp.mjs': new URL('./bridge/host-tool-mcp.mjs', import.meta.url),
15
22
  });
16
23
 
17
24
  export function createACPBootstrap({