zidane 8.2.2 → 8.2.4
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/dist/{acp-oYRjlh71.js → acp-BIInKhVI.js} +6 -6
- package/dist/{acp-oYRjlh71.js.map → acp-BIInKhVI.js.map} +1 -1
- package/dist/acp-cli.js +4 -4
- package/dist/acp.d.ts +2 -2
- package/dist/acp.js +1 -1
- package/dist/{agent-CBQglXtH.js → agent-CmhCOmyO.js} +10 -5
- package/dist/{agent-CBQglXtH.js.map → agent-CmhCOmyO.js.map} +1 -1
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/chat/pure.d.ts +4 -4
- package/dist/chat/pure.js +7 -7
- package/dist/chat.d.ts +3 -3
- package/dist/chat.js +16 -16
- package/dist/{cli-shared-E5m_pI8A.js → cli-shared-GOehTeqk.js} +2 -2
- package/dist/{cli-shared-E5m_pI8A.js.map → cli-shared-GOehTeqk.js.map} +1 -1
- package/dist/{client-core-BdD20sOv.d.ts → client-core-Dz8hELs4.d.ts} +15 -5
- package/dist/client-core-Dz8hELs4.d.ts.map +1 -0
- package/dist/codemode-worker.js +1 -1
- package/dist/codemode.js +1 -1
- package/dist/{connection-loop-DTk82YVl.d.ts → connection-loop-dm_TN-QD.d.ts} +3 -3
- package/dist/{connection-loop-DTk82YVl.d.ts.map → connection-loop-dm_TN-QD.d.ts.map} +1 -1
- package/dist/contexts/daytona.d.ts +1 -1
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/{credentials-B9DfBJP9.js → credentials-DxOQmset.js} +2 -2
- package/dist/{credentials-B9DfBJP9.js.map → credentials-DxOQmset.js.map} +1 -1
- package/dist/daemon-cli.js +2 -2
- package/dist/{dispatcher-BICXFGiJ.js → dispatcher-Dclv6HXn.js} +22 -18
- package/dist/dispatcher-Dclv6HXn.js.map +1 -0
- package/dist/{engine-QCX3GV-i.js → engine-C_U6kDfA.js} +6 -6
- package/dist/{engine-QCX3GV-i.js.map → engine-C_U6kDfA.js.map} +1 -1
- package/dist/{eval-CfQlBR81.js → eval-CIHIF_Ns.js} +3 -3
- package/dist/{eval-CfQlBR81.js.map → eval-CIHIF_Ns.js.map} +1 -1
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +1 -1
- package/dist/{executor-B8GoXaaE.js → executor-BFaR2nfc.js} +3 -3
- package/dist/{executor-B8GoXaaE.js.map → executor-BFaR2nfc.js.map} +1 -1
- package/dist/{extensions-BeH3D-bq.js → extensions-DIbpUj5R.js} +3 -3
- package/dist/{extensions-BeH3D-bq.js.map → extensions-DIbpUj5R.js.map} +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/{fold-rules-DSypi36k.d.ts → fold-rules-CMpWNPqk.d.ts} +2 -2
- package/dist/{fold-rules-DSypi36k.d.ts.map → fold-rules-CMpWNPqk.d.ts.map} +1 -1
- package/dist/{headless-R4pbpTkm.js → headless-Bs9Lb4vs.js} +4 -4
- package/dist/{headless-R4pbpTkm.js.map → headless-Bs9Lb4vs.js.map} +1 -1
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +1 -1
- package/dist/history-worker.js +1 -1
- package/dist/{host-scoped-settings-CCnaBkCV.js → host-scoped-settings-DxxI_yRo.js} +2 -2
- package/dist/{host-scoped-settings-CCnaBkCV.js.map → host-scoped-settings-DxxI_yRo.js.map} +1 -1
- package/dist/{host-signals-DI9JQvR9.js → host-signals-CQ2jZR-2.js} +5 -5
- package/dist/{host-signals-DI9JQvR9.js.map → host-signals-CQ2jZR-2.js.map} +1 -1
- package/dist/{index-DyQyDLX1.d.ts → index-4mDRyTGJ.d.ts} +1722 -1691
- package/dist/index-4mDRyTGJ.d.ts.map +1 -0
- package/dist/{index-lcuvhQfF.d.ts → index-Dlmu8HnG.d.ts} +5 -5
- package/dist/{index-lcuvhQfF.d.ts.map → index-Dlmu8HnG.d.ts.map} +1 -1
- package/dist/{index-BkNeiJYI.d.ts → index-QsAN9yjZ.d.ts} +3 -3
- package/dist/{index-BkNeiJYI.d.ts.map → index-QsAN9yjZ.d.ts.map} +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +8 -8
- package/dist/ipc/remote.d.ts +5 -5
- package/dist/ipc/remote.js +3 -3
- package/dist/ipc.d.ts +5 -5
- package/dist/ipc.js +9 -9
- package/dist/{links-CN5JFFde.js → links-D5itfH8P.js} +10 -10
- package/dist/{links-CN5JFFde.js.map → links-D5itfH8P.js.map} +1 -1
- package/dist/{mcp-allowlist-BQ5MvhHi.js → mcp-allowlist-BbnTBKNN.js} +15 -4
- package/dist/mcp-allowlist-BbnTBKNN.js.map +1 -0
- package/dist/mcp.d.ts +1 -1
- package/dist/{oauth-TVPPye84.js → oauth-Ck3wQX4Q.js} +133 -43
- package/dist/oauth-Ck3wQX4Q.js.map +1 -0
- package/dist/output/stream-json.d.ts +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/plugins.d.ts +1 -1
- package/dist/{prelude-HzY_JEGq.js → prelude-qjPUkw4f.js} +26 -2
- package/dist/prelude-qjPUkw4f.js.map +1 -0
- package/dist/{presets-DXeHsd24.js → presets-C4hkykN-.js} +2 -2
- package/dist/{presets-DXeHsd24.js.map → presets-C4hkykN-.js.map} +1 -1
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -1
- package/dist/{protocol-BIv1Yuvl.js → protocol-Do_i6Ras.js} +3 -1
- package/dist/protocol-Do_i6Ras.js.map +1 -0
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/google.d.ts +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/neuralwatt.d.ts +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/{registry-PNi9rsGi.js → registry-DxPP_tAt.js} +3 -3
- package/dist/{registry-PNi9rsGi.js.map → registry-DxPP_tAt.js.map} +1 -1
- package/dist/{remote-hosts-b6Luwdhu.js → remote-hosts-BkOwRszu.js} +4 -4
- package/dist/{remote-hosts-b6Luwdhu.js.map → remote-hosts-BkOwRszu.js.map} +1 -1
- package/dist/restate.d.ts +1 -1
- package/dist/{secret-shapes-CEoGmfEE.js → secret-shapes-HvaYVzwc.js} +17 -4
- package/dist/secret-shapes-HvaYVzwc.js.map +1 -0
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/{session-7TUHs42_.js → session-CCsKXID6.js} +6 -2
- package/dist/session-CCsKXID6.js.map +1 -0
- package/dist/{session-factory-CMwIXE-7.js → session-factory-Ct7J9CK1.js} +6 -6
- package/dist/{session-factory-CMwIXE-7.js.map → session-factory-Ct7J9CK1.js.map} +1 -1
- package/dist/session.d.ts +2 -2
- package/dist/session.js +1 -1
- package/dist/{settings-keys-DssjmqAV.js → settings-keys-QoGJ5n3e.js} +4 -4
- package/dist/{settings-keys-DssjmqAV.js.map → settings-keys-QoGJ5n3e.js.map} +1 -1
- package/dist/{shell-path-BUFwqU_A.js → shell-path-BXXtRmEA.js} +4 -4
- package/dist/{shell-path-BUFwqU_A.js.map → shell-path-BXXtRmEA.js.map} +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/{spaces-CyjMh5Zf.js → spaces-C_x2bvEl.js} +14 -4
- package/dist/spaces-C_x2bvEl.js.map +1 -0
- package/dist/{store-L01W0gGI.js → store-BpkWIaSH.js} +10 -30
- package/dist/store-BpkWIaSH.js.map +1 -0
- package/dist/{todo-edits-H77ROt6X.js → todo-edits-DKoxu7Ss.js} +3 -3
- package/dist/{todo-edits-H77ROt6X.js.map → todo-edits-DKoxu7Ss.js.map} +1 -1
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/{tools-pZVFIJ_K.js → tools-FHEIKGkh.js} +2 -2
- package/dist/{tools-pZVFIJ_K.js.map → tools-FHEIKGkh.js.map} +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +2 -2
- package/dist/{transcript-anchors-s-yxh0jt.js → transcript-anchors-D8jWLpe5.js} +10 -10
- package/dist/{transcript-anchors-s-yxh0jt.js.map → transcript-anchors-D8jWLpe5.js.map} +1 -1
- package/dist/{transcript-cache-DXdgVuoy.js → transcript-cache-CdHKtx9y.js} +4 -4
- package/dist/{transcript-cache-DXdgVuoy.js.map → transcript-cache-CdHKtx9y.js.map} +1 -1
- package/dist/{transcript-reconcile-DeFLIQ14.js → transcript-reconcile-D_SWw6dX.js} +11 -3
- package/dist/transcript-reconcile-D_SWw6dX.js.map +1 -0
- package/dist/tui.d.ts +7 -7
- package/dist/tui.js +24 -23
- package/dist/tui.js.map +1 -1
- package/dist/{turn-operations-BbGJ-KSt.d.ts → turn-operations-Dbk3xPKu.d.ts} +19 -4
- package/dist/turn-operations-Dbk3xPKu.d.ts.map +1 -0
- package/dist/{types-C0PJmBaO.d.ts → types-CMXR7A0b.d.ts} +2 -2
- package/dist/{types-C0PJmBaO.d.ts.map → types-CMXR7A0b.d.ts.map} +1 -1
- package/dist/types-CzmghX7C.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/{url-CLl0u4Z8.js → url-D4vG7lzO.js} +2 -2
- package/dist/{url-CLl0u4Z8.js.map → url-D4vG7lzO.js.map} +1 -1
- package/dist/{version-v77Y4A3C.js → version-DDRBX7K6.js} +2 -2
- package/dist/{version-v77Y4A3C.js.map → version-DDRBX7K6.js.map} +1 -1
- package/dist/{workspace-exec-stream-kqARO8iC.js → workspace-exec-stream-iHv9cooF.js} +5 -5
- package/dist/{workspace-exec-stream-kqARO8iC.js.map → workspace-exec-stream-iHv9cooF.js.map} +1 -1
- package/dist/{write-file-QYrcDdl3.js → write-file-ChtRPdEL.js} +3 -3
- package/dist/{write-file-QYrcDdl3.js.map → write-file-ChtRPdEL.js.map} +1 -1
- package/dist/{ws-BD9FN98u.js → ws-B2HB87nz.js} +6 -6
- package/dist/{ws-BD9FN98u.js.map → ws-B2HB87nz.js.map} +1 -1
- package/dist/{ws-client-D7eb2UbH.js → ws-client-DPC9ZJHr.js} +4 -4
- package/dist/{ws-client-D7eb2UbH.js.map → ws-client-DPC9ZJHr.js.map} +1 -1
- package/docs/CODEMODE.md +6 -0
- package/docs/IPC.md +2 -0
- package/docs/ONBOARDING.md +1 -1
- package/package.json +1 -1
- package/dist/client-core-BdD20sOv.d.ts.map +0 -1
- package/dist/dispatcher-BICXFGiJ.js.map +0 -1
- package/dist/index-DyQyDLX1.d.ts.map +0 -1
- package/dist/mcp-allowlist-BQ5MvhHi.js.map +0 -1
- package/dist/oauth-TVPPye84.js.map +0 -1
- package/dist/prelude-HzY_JEGq.js.map +0 -1
- package/dist/protocol-BIv1Yuvl.js.map +0 -1
- package/dist/secret-shapes-CEoGmfEE.js.map +0 -1
- package/dist/session-7TUHs42_.js.map +0 -1
- package/dist/spaces-CyjMh5Zf.js.map +0 -1
- package/dist/store-L01W0gGI.js.map +0 -1
- package/dist/transcript-reconcile-DeFLIQ14.js.map +0 -1
- package/dist/turn-operations-BbGJ-KSt.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-oYRjlh71.js","names":["isRecord","lastFinishReason","process","basic"],"sources":["../src/start/shared-options.ts","../src/acp/client-declared-tools.ts","../src/acp/mapping.ts","../src/acp/client-tools.ts","../src/acp/plan-mode.ts","../src/acp/prompt-cache.ts","../src/acp/server.ts","../src/acp/index.ts"],"sourcesContent":["import type { ParseArgsConfig } from 'node:util'\nimport type { McpServerConfig, ThinkingLevel } from '../types'\nimport { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport { parseArgs } from 'node:util'\n\nexport const validThinkingLevels = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max', 'adaptive'] as const satisfies readonly ThinkingLevel[]\n\nexport const startProviderNames = ['anthropic', 'openai', 'openrouter', 'cerebras', 'xai', 'google', 'google-vertex', 'arcee', 'baseten', 'neuralwatt', 'local', 'openai-compat'] as const\nexport type StartProviderName = typeof startProviderNames[number]\n\nexport const startPresetNames = ['basic'] as const\nexport type StartPresetName = typeof startPresetNames[number]\n\nexport const startFormatNames = ['zidane', 'provider'] as const\nexport type StartFormatName = typeof startFormatNames[number]\n\nexport interface StartLocalOptions {\n system?: string\n prompt: string\n model?: string\n baseURL?: string\n apiKeyEnv?: string\n headersEnv?: string\n extraHeaders?: Record<string, string>\n vision?: boolean\n imageInToolResult?: boolean\n /** Headless runs (`--json` / `--stream-json`): add the opt-in `codemode` tool (`behavior.codemode`). */\n codemode?: boolean\n temperature?: number\n seed?: number\n preset: StartPresetName\n thinking: ThinkingLevel\n provider: StartProviderName\n context: string\n image?: string\n cwd?: string\n env?: Record<string, string>\n pregame?: { name: string, content: string }\n sandboxId?: string\n sandboxOnDestroy?: 'kill' | 'pause' | 'leave'\n mcp?: McpServerConfig[]\n sessionDb?: string\n sessionId?: string\n schema?: Record<string, unknown>\n json: boolean\n streamJson: boolean\n format: StartFormatName\n}\n\nexport interface ParseStartLocalOptionsConfig {\n requirePrompt?: boolean\n usage?: () => string\n}\n\nexport class StartUsageError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'StartUsageError'\n }\n}\n\n/**\n * The shared `bun start` / `zidane run` option table. Exported so\n * `parseStartArgs` (start CLI) can compose it with the Restate-only options\n * and parse argv ONCE — two diverging tables would let new flags silently\n * drift between the two parsers.\n */\nexport const startLocalArgOptions = {\n 'help': { type: 'boolean', short: 'h', default: false },\n 'prompt': { type: 'string', short: 'p' },\n 'model': { type: 'string', short: 'm' },\n 'preset': { type: 'string', short: 't', default: 'basic' },\n 'system': { type: 'string', short: 's' },\n 'thinking': { type: 'string', default: 'off' },\n 'provider': { type: 'string', default: 'anthropic' },\n 'base-url': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'headers-env': { type: 'string' },\n 'header': { type: 'string', multiple: true },\n 'vision': { type: 'boolean' },\n 'image-in-tool-result': { type: 'boolean' },\n 'codemode': { type: 'boolean' },\n 'temperature': { type: 'string' },\n 'seed': { type: 'string' },\n 'context': { type: 'string', short: 'c', default: 'process' },\n 'image': { type: 'string' },\n 'cwd': { type: 'string' },\n 'env': { type: 'string', multiple: true },\n 'pass-env': { type: 'string', multiple: true },\n 'pregame': { type: 'string' },\n 'sandbox': { type: 'string' },\n 'sandbox-on-destroy': { type: 'string' },\n 'mcp': { type: 'string' },\n 'session-db': { type: 'string' },\n 'session-id': { type: 'string' },\n 'json-schema': { type: 'string' },\n 'schema': { type: 'string' },\n 'json': { type: 'boolean', default: false },\n 'stream-json': { type: 'boolean', default: false },\n 'format': { type: 'string', default: 'zidane' },\n} as const satisfies ParseArgsConfig['options']\n\n/**\n * Strict argv parse shared by the start CLIs. `strict: true` rejects unknown\n * flags and stray positionals loudly — without it, a typo'd flag's value\n * silently leaks into the run (e.g. as a bogus prompt). Parse failures are\n * rethrown as {@link StartUsageError}.\n */\nexport function parseStartArgValues(\n argv: readonly string[],\n options: ParseArgsConfig['options'],\n): Record<string, unknown> {\n try {\n const { values } = parseArgs({\n args: [...argv],\n options,\n strict: true,\n })\n return values\n }\n catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new StartUsageError(`${msg}\\n\\nRun with --help for usage.`)\n }\n}\n\nexport function parseStartLocalOptions(\n argv: readonly string[],\n config: ParseStartLocalOptionsConfig = {},\n): StartLocalOptions {\n return buildStartLocalOptions(parseStartArgValues(argv, startLocalArgOptions), config)\n}\n\n/** Assemble {@link StartLocalOptions} from already-parsed argv values. */\nexport function buildStartLocalOptions(\n values: Record<string, unknown>,\n config: ParseStartLocalOptionsConfig = {},\n): StartLocalOptions {\n const { requirePrompt = true, usage = startLocalUsage } = config\n\n if (values.help === true)\n throw new StartUsageError(usage())\n\n const prompt = values.prompt as string | undefined\n if (requirePrompt && (!prompt || prompt.trim() === ''))\n throw new StartUsageError(usage())\n\n const thinkingRaw = (values.thinking as string | undefined) || 'off'\n if (!validThinkingLevels.includes(thinkingRaw as ThinkingLevel))\n throw new Error(`Unknown thinking level: ${thinkingRaw}. Available: ${validThinkingLevels.join(', ')}`)\n\n const provider = ((values.provider as string | undefined) || 'anthropic') as StartProviderName\n if (!startProviderNames.includes(provider))\n throw new Error(`Unknown provider: ${provider}. Available: ${startProviderNames.join(', ')}`)\n\n const preset = ((values.preset as string | undefined) || 'basic') as StartPresetName\n if (!startPresetNames.includes(preset))\n throw new Error(`Unknown preset: ${preset}. Available: ${startPresetNames.join(', ')}`)\n\n if (values.json === true && values['stream-json'] === true)\n throw new StartUsageError('Use either `--json` or `--stream-json`, not both.')\n\n const schema = parseOutputSchema(values['json-schema'] as string | undefined, values.schema as string | undefined)\n\n const format = ((values.format as string | undefined) || 'zidane') as StartFormatName\n if (!startFormatNames.includes(format))\n throw new Error(`Unknown format: ${format}. Available: ${startFormatNames.join(', ')}`)\n\n const baseURL = values['base-url'] as string | undefined\n const apiKeyEnv = values['api-key-env'] as string | undefined\n const headersEnv = values['headers-env'] as string | undefined\n const extraHeaders = parseHeaderArgs(values.header as string[] | undefined, '--header')\n const temperature = parseOptionalNumber(values.temperature as string | undefined, '--temperature')\n const seed = parseOptionalInteger(values.seed as string | undefined, '--seed')\n const env = parseEnvArgs(values.env as string[] | undefined, values['pass-env'] as string[] | undefined)\n const context = (values.context as string | undefined) || 'process'\n const pregame = loadPregame(values.pregame as string | undefined, context)\n const sandboxId = resolveSandboxId(values.sandbox as string | undefined, context)\n const sandboxOnDestroy = resolveSandboxOnDestroy(values['sandbox-on-destroy'] as string | undefined, context)\n\n return {\n system: values.system as string | undefined,\n prompt: prompt ?? '',\n model: values.model as string | undefined,\n ...(baseURL !== undefined ? { baseURL } : {}),\n ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),\n ...(headersEnv !== undefined ? { headersEnv } : {}),\n ...(Object.keys(extraHeaders).length > 0 ? { extraHeaders } : {}),\n ...(values.vision === true ? { vision: true } : {}),\n ...(values['image-in-tool-result'] === true ? { imageInToolResult: true } : {}),\n ...(values.codemode === true ? { codemode: true } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(seed !== undefined ? { seed } : {}),\n preset,\n thinking: thinkingRaw as ThinkingLevel,\n provider,\n context,\n image: values.image as string | undefined,\n cwd: values.cwd as string | undefined,\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(pregame ? { pregame } : {}),\n ...(sandboxId ? { sandboxId } : {}),\n ...(sandboxOnDestroy ? { sandboxOnDestroy } : {}),\n mcp: parseMcpConfig(values.mcp as string | undefined),\n sessionDb: values['session-db'] as string | undefined,\n sessionId: values['session-id'] as string | undefined,\n ...(schema !== undefined ? { schema } : {}),\n json: values.json === true || (schema !== undefined && values['stream-json'] !== true),\n streamJson: values['stream-json'] === true,\n format,\n }\n}\n\nfunction parseOutputSchema(inline: string | undefined, path: string | undefined): Record<string, unknown> | undefined {\n if (inline !== undefined && path !== undefined)\n throw new StartUsageError('Use either --json-schema or --schema, not both.')\n if (inline === undefined && path === undefined)\n return undefined\n const flag = inline !== undefined ? '--json-schema' : '--schema'\n let schema: unknown\n try {\n schema = JSON.parse(inline ?? readFileSync(path!, 'utf8'))\n }\n catch (err) {\n throw new StartUsageError(`Invalid ${flag}: ${err instanceof Error ? err.message : String(err)}`)\n }\n if (!schema || typeof schema !== 'object' || Array.isArray(schema))\n throw new StartUsageError(`${flag} must contain a JSON Schema object.`)\n return schema as Record<string, unknown>\n}\n\nexport function startLocalUsage(): string {\n return [\n `Usage: bun start --prompt \"your message\" \\\\`,\n ` [--provider ${startProviderNames.join('|')}] [--model <id>] [--thinking ${validThinkingLevels.join('|')}]`,\n ` [--base-url <url>] [--api-key-env <NAME>] [--headers-env <NAME>] [--header 'Name: value']`,\n ` [--vision] [--image-in-tool-result] [--temperature <f>] [--seed <n>]`,\n ` [--context process|docker|e2b|daytona] [--image node:22] [--cwd /workspace]`,\n ` [--env KEY=VALUE ...] [--pass-env VARNAME ...] [--pregame setup.sh] [--sandbox <id>] [--sandbox-on-destroy kill|pause|leave]`,\n ` [--mcp '[...]'] [--session-db ./sessions.db] [--session-id <id>] [--json|--stream-json] [--format zidane|provider]`,\n ``,\n ` --json-schema '<JSON>' or --schema <file.json> enforces structured result.output (implies --json).`,\n ` --stream-json streams COMPLETE TURNS as JSONL (one line per turn), then the result.`,\n ` --codemode adds the codemode tool to a --json / --stream-json run.`,\n ` For the full event stream (text deltas, tool calls, …) use the headless CLI's`,\n ` --output-format stream-json instead.`,\n ].join('\\n')\n}\n\n/**\n * Parse the `--mcp` argument: inline JSON (object or array) or a path to a JSON\n * file. Validates that each server declares the fields its transport requires.\n */\nexport function parseMcpConfig(raw: string | undefined): McpServerConfig[] | undefined {\n if (!raw)\n return undefined\n let text = raw.trim()\n // A value that isn't JSON is treated as a file path.\n if (!text.startsWith('[') && !text.startsWith('{'))\n text = readFileSync(text, 'utf8')\n const parsed = JSON.parse(text)\n const configs = Array.isArray(parsed) ? parsed : [parsed]\n\n for (const config of configs) {\n if (!config.name || !config.transport)\n throw new Error(`Invalid MCP config: each server needs \"name\" and \"transport\". Got: ${JSON.stringify(config)}`)\n if (config.transport === 'stdio' && !config.command)\n throw new Error(`MCP server \"${config.name}\": stdio transport requires \"command\"`)\n if ((config.transport === 'sse' || config.transport === 'streamable-http') && !config.url)\n throw new Error(`MCP server \"${config.name}\": ${config.transport} transport requires \"url\"`)\n }\n\n return configs\n}\n\nfunction parseOptionalNumber(raw: string | undefined, flag: string): number | undefined {\n if (raw === undefined)\n return undefined\n const value = Number(raw)\n if (Number.isNaN(value))\n throw new Error(`${flag} must be a number, got '${raw}'.`)\n return value\n}\n\n// `Number()` instead of `parseInt` so trailing garbage ('42x') and decimals\n// ('0.5' → 0) are rejected instead of silently truncated.\nfunction parseOptionalInteger(raw: string | undefined, flag: string): number | undefined {\n if (raw === undefined)\n return undefined\n const value = Number(raw)\n if (!Number.isInteger(value))\n throw new Error(`${flag} must be an integer, got '${raw}'.`)\n return value\n}\n\n/**\n * Build the execution-context environment from `--pass-env VARNAME` (forward\n * the named variable from the current shell) and `--env KEY=VALUE` (set a\n * value explicitly). `--pass-env` is applied first so an explicit `--env`\n * wins when both name the same key. An unset `--pass-env` variable is a hard\n * error rather than a silently-empty value.\n */\nexport function parseEnvArgs(\n envArgs: string[] | undefined,\n passEnvArgs: string[] | undefined,\n source: Record<string, string | undefined> = process.env,\n): Record<string, string> {\n const env: Record<string, string> = {}\n\n for (const name of passEnvArgs ?? []) {\n const key = name.trim()\n if (!key)\n throw new Error('--pass-env requires a variable name.')\n const value = source[key]\n if (value === undefined)\n throw new Error(`--pass-env ${key}: environment variable ${key} is not set.`)\n env[key] = value\n }\n\n for (const item of envArgs ?? []) {\n const eq = item.indexOf('=')\n const key = eq === -1 ? '' : item.slice(0, eq).trim()\n if (!key)\n throw new Error(`--env must be formatted as KEY=VALUE, got '${item}'.`)\n env[key] = item.slice(eq + 1)\n }\n\n return env\n}\n\n/**\n * Resolve the `--pregame <file>` setup script. Returns `undefined` when no path\n * is given. The script only runs in remote sandbox contexts (it's uploaded into\n * the ready sandbox before prompting); for any other context this warns and\n * ignores it rather than failing. For supported contexts the file is read\n * eagerly — consistent with `--prompt-file`/`--schema` — so a missing or\n * unreadable file surfaces as a usage error up front rather than mid-spawn.\n * The returned `name` is the basename used for the uploaded file.\n */\nexport function loadPregame(\n path: string | undefined,\n context: string,\n): { name: string, content: string } | undefined {\n if (!path)\n return undefined\n if (!supportsRemoteSandboxFlags(context)) {\n console.error(`--pregame is only supported with --context e2b or daytona; ignoring it for context '${context}'.`)\n return undefined\n }\n let content: string\n try {\n content = readFileSync(path, 'utf8')\n }\n catch (err) {\n throw new Error(`--pregame: failed to read '${path}': ${(err as Error).message}`)\n }\n return { name: basename(path), content }\n}\n\n/**\n * Resolve the `--sandbox <id>` argument. Returns `undefined` when no id is\n * given. Connecting to a pre-existing sandbox is supported by the remote\n * sandbox providers; for any other context this warns and ignores it rather\n * than failing, mirroring {@link loadPregame}. A blank value (e.g.\n * `--sandbox ''`) is treated as absent.\n */\nexport function resolveSandboxId(\n raw: string | undefined,\n context: string,\n): string | undefined {\n const id = raw?.trim()\n if (!id)\n return undefined\n if (!supportsRemoteSandboxFlags(context)) {\n console.error(`--sandbox is only supported with --context e2b or daytona; ignoring it for context '${context}'.`)\n return undefined\n }\n return id\n}\n\nconst validSandboxOnDestroyValues = ['kill', 'pause', 'leave'] as const\nexport type SandboxOnDestroyValue = typeof validSandboxOnDestroyValues[number]\n\n/**\n * Resolve the `--sandbox-on-destroy kill|pause|leave` argument. Returns\n * `undefined` when not set (the provider defaults to `'kill'` / delete).\n * Applies to remote sandbox contexts; warns and ignores for any other context,\n * mirroring {@link resolveSandboxId} and {@link loadPregame}.\n */\nexport function resolveSandboxOnDestroy(\n raw: string | undefined,\n context: string,\n): SandboxOnDestroyValue | undefined {\n const value = raw?.trim()\n if (!value)\n return undefined\n if (!supportsRemoteSandboxFlags(context)) {\n console.error(`--sandbox-on-destroy is only supported with --context e2b or daytona; ignoring it for context '${context}'.`)\n return undefined\n }\n if (!validSandboxOnDestroyValues.includes(value as SandboxOnDestroyValue))\n throw new StartUsageError(`--sandbox-on-destroy must be kill|pause|leave, got '${value}'.`)\n return value as SandboxOnDestroyValue\n}\n\nfunction supportsRemoteSandboxFlags(context: string): boolean {\n return context === 'e2b' || context === 'daytona'\n}\n\nfunction parseHeaderArgs(raw: string[] | undefined, flag: string): Record<string, string> {\n if (!raw || raw.length === 0)\n return {}\n\n const headers: Record<string, string> = {}\n for (const item of raw) {\n const colon = item.indexOf(':')\n const equals = item.indexOf('=')\n const separator = colon === -1 ? equals : equals === -1 ? colon : Math.min(colon, equals)\n if (separator <= 0)\n throw new Error(`${flag} must be formatted as \"Name: value\" or \"Name=value\".`)\n\n const name = item.slice(0, separator).trim()\n const value = item.slice(separator + 1).trim()\n if (!name || !value)\n throw new Error(`${flag} must include both a header name and value.`)\n headers[name] = value\n }\n return headers\n}\n","import type { ToolDef } from '../tools'\nimport type { AcpPeer } from './types'\nimport { AcpErrorCode } from './types'\n\n/** JSON-RPC method the agent sends to the client to run a client-declared tool. */\nexport const CLIENT_TOOL_CALL_METHOD = '_zidane/tool_call'\n\n/** Notification the agent sends when it abandons a pending {@link CLIENT_TOOL_CALL_METHOD}. */\nexport const CLIENT_TOOL_CANCEL_METHOD = '_zidane/tool_call_cancel'\n\nconst TOOL_NAME_PATTERN = /^[a-z][\\w-]{0,63}$/i\n\n/**\n * A tool the ACP client declares in `session/new` / `session/load` /\n * `session/resume` under `_meta.zidane.clientTools`. The agent sees it like\n * any other tool; execution round-trips to the client over\n * {@link CLIENT_TOOL_CALL_METHOD}.\n */\nexport interface AcpClientToolSpec {\n /** Tool name the agent exposes. Must match `/^[a-z][\\w-]{0,63}$/i` and not collide with a host tool. */\n name: string\n /** What the tool does, shown to the model. Must be non-empty. */\n description: string\n /** JSON Schema for the tool input. The root `type` must be `\"object\"`. Defaults to an empty object schema when omitted. */\n inputSchema: Record<string, unknown>\n /** Mutating tools go through permission requests and are hidden in Plan mode. */\n mutating: boolean\n}\n\n/** Reply the client returns for a {@link CLIENT_TOOL_CALL_METHOD} request. */\nexport interface ClientToolCallResponse {\n /** Text result handed to the model. Ignored unless it is a string; a missing value becomes an empty string. */\n content?: unknown\n /** When `true`, the call fails and `content` becomes the error message. */\n isError?: unknown\n}\n\n/** Malformed or colliding `_meta.zidane.clientTools`. */\nexport class ClientToolSpecError extends Error {\n readonly code = AcpErrorCode.InvalidParams\n}\n\n/**\n * Validate `_meta.zidane.clientTools`. Returns `undefined` when the key is\n * absent (so resume can keep the existing set) and throws on malformed specs.\n * @param meta - The `_meta` object of the `session/new`, `session/load` or `session/resume` request.\n */\nexport function parseClientToolSpecs(meta: Record<string, unknown> | null | undefined): AcpClientToolSpec[] | undefined {\n const zidane = meta?.zidane\n if (zidane === undefined || zidane === null)\n return undefined\n if (!isRecord(zidane))\n throw new ClientToolSpecError('_meta.zidane must be an object.')\n const raw = zidane.clientTools\n if (raw === undefined)\n return undefined\n if (!Array.isArray(raw))\n throw new ClientToolSpecError('_meta.zidane.clientTools must be an array.')\n\n const seen = new Set<string>()\n return raw.map((entry, index) => {\n if (!isRecord(entry))\n throw new ClientToolSpecError(`clientTools[${index}] must be an object.`)\n const { name, description, inputSchema, mutating } = entry\n if (typeof name !== 'string' || !TOOL_NAME_PATTERN.test(name))\n throw new ClientToolSpecError(`clientTools[${index}].name must match ${TOOL_NAME_PATTERN}.`)\n if (seen.has(name))\n throw new ClientToolSpecError(`Duplicate client tool: ${name}`)\n seen.add(name)\n if (typeof description !== 'string' || description.length === 0)\n throw new ClientToolSpecError(`clientTools[${index}].description must be a non-empty string.`)\n if (inputSchema !== undefined && (!isRecord(inputSchema) || inputSchema.type !== 'object'))\n throw new ClientToolSpecError(`clientTools[${index}].inputSchema must be a JSON Schema with type \"object\".`)\n if (mutating !== undefined && typeof mutating !== 'boolean')\n throw new ClientToolSpecError(`clientTools[${index}].mutating must be a boolean.`)\n return {\n name,\n description,\n inputSchema: inputSchema ?? { type: 'object', properties: {} },\n mutating: mutating ?? false,\n }\n })\n}\n\n/** Client tools may add to the host tool set, never shadow it. */\nexport function assertNoClientToolClash(hostTools: Record<string, ToolDef> | undefined, specs: readonly AcpClientToolSpec[]): void {\n const taken = new Set<string>()\n for (const [key, tool] of Object.entries(hostTools ?? {})) {\n taken.add(key)\n taken.add(tool.spec.name)\n }\n const clash = specs.find(spec => taken.has(spec.name))\n if (clash)\n throw new ClientToolSpecError(`Client tool \"${clash.name}\" collides with a built-in tool.`)\n}\n\n/**\n * Builds agent tools for client-declared specs.\n * Each tool sends a {@link CLIENT_TOOL_CALL_METHOD} request to the client and returns the reply text. If the call is aborted, it sends {@link CLIENT_TOOL_CANCEL_METHOD} and rejects. A reply with `isError: true` throws.\n * @param specs - Validated specs, usually from {@link parseClientToolSpecs}.\n * @param options - The peer to send requests to and the ACP session id to tag them with.\n * @returns Tools keyed by spec name.\n */\nexport function createClientDeclaredTools(\n specs: readonly AcpClientToolSpec[],\n options: { client: AcpPeer, sessionId: string },\n): Record<string, ToolDef> {\n const tools: Record<string, ToolDef> = {}\n for (const spec of specs) {\n tools[spec.name] = {\n spec: { name: spec.name, description: spec.description, inputSchema: spec.inputSchema },\n async execute(input, ctx) {\n const request = options.client.sendRequest(CLIENT_TOOL_CALL_METHOD, {\n sessionId: options.sessionId,\n toolCallId: ctx.callId,\n name: spec.name,\n input,\n }) as Promise<ClientToolCallResponse | null | undefined>\n const response = await raceAbort(request, ctx.signal, () => notifyCancel(options, ctx.callId))\n const content = typeof response?.content === 'string' ? response.content : ''\n if (response?.isError === true)\n throw new Error(content || `${spec.name} failed in the client.`)\n return content\n },\n }\n }\n return tools\n}\n\n// Best effort: the call is already abandoned, a failed notification changes nothing.\nfunction notifyCancel(options: { client: AcpPeer, sessionId: string }, toolCallId: string): void {\n try {\n void Promise.resolve(options.client.sendNotification(CLIENT_TOOL_CANCEL_METHOD, { sessionId: options.sessionId, toolCallId }))\n .catch(() => {})\n }\n catch {}\n}\n\nfunction raceAbort<T>(promise: Promise<T>, signal: AbortSignal, onCancel: () => void): Promise<T> {\n if (signal.aborted)\n return Promise.reject(signal.reason ?? new Error('Aborted.'))\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n onCancel()\n reject(signal.reason ?? new Error('Aborted.'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (err) => {\n signal.removeEventListener('abort', onAbort)\n reject(err)\n },\n )\n })\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { McpServerConfig, PromptPart, SessionContentBlock, ToolResultContent, TurnFinishReason, TurnUsage } from '../types'\nimport type {\n AcpMcpServer,\n AcpPromptMapping,\n ContentBlock,\n Cost,\n EmbeddedResource,\n EmbeddedResourceResource,\n McpCapabilities,\n NewSessionResponse,\n PromptCapabilities,\n SessionMode,\n SessionModeState,\n StopReason,\n ToolCallContent,\n ToolKind,\n} from './types'\nimport { resolve } from 'node:path'\nimport { toolResultToText } from '../types'\n\n/**\n * Converts MCP server entries from an ACP session request to Zidane `McpServerConfig` values.\n * `http` becomes `streamable-http`, `sse` stays `sse`, and anything else is treated as a `stdio` command.\n * @param servers - MCP servers sent by the ACP client. May be undefined.\n * @returns One config per server, or an empty array when `servers` is undefined.\n */\nexport function acpMcpServersToZidane(servers: readonly AcpMcpServer[] | undefined): McpServerConfig[] {\n if (!servers)\n return []\n return servers.map((server): McpServerConfig => {\n if (server.type === 'http') {\n return {\n name: server.name,\n transport: 'streamable-http',\n url: server.url,\n headers: headersToRecord(server.headers),\n }\n }\n if (server.type === 'sse') {\n return {\n name: server.name,\n transport: 'sse',\n url: server.url,\n headers: headersToRecord(server.headers),\n }\n }\n const stdio = server as Extract<AcpMcpServer, { command: string }>\n return {\n name: server.name,\n transport: 'stdio',\n command: stdio.command,\n args: stdio.args ?? [],\n env: envToRecord(stdio.env),\n }\n })\n}\n\nexport function promptCapabilitiesForProvider(capabilities: { vision?: boolean, audio?: boolean } | undefined): PromptCapabilities {\n return {\n image: capabilities?.vision === true,\n audio: capabilities?.audio === true,\n embeddedContext: true,\n }\n}\n\nexport function mcpCapabilities(): McpCapabilities {\n return { http: true, sse: true }\n}\n\nexport function defaultModes(modes: readonly SessionMode[] | undefined): SessionMode[] {\n return modes && modes.length > 0\n ? [...modes]\n : [\n { id: 'build', name: 'Build', description: 'Full tool access for implementation work.' },\n { id: 'plan', name: 'Plan', description: 'Planning-oriented mode; hosts may narrow tools separately.' },\n ]\n}\n\nexport function makeModeState(modes: readonly SessionMode[], currentModeId: string): SessionModeState {\n return { currentModeId, availableModes: [...modes] }\n}\n\nexport function newSessionResponse(\n sessionId: string,\n modes: readonly SessionMode[],\n currentModeId: string,\n configOptions?: NewSessionResponse['configOptions'],\n): NewSessionResponse {\n return {\n sessionId,\n modes: makeModeState(modes, currentModeId),\n ...(configOptions && configOptions.length > 0 ? { configOptions } : {}),\n }\n}\n\n/**\n * Converts the ACP prompt content blocks of a `session/prompt` request to Zidane prompt parts.\n * Images and audio without embedded data, and unknown block types, become text parts and add a warning.\n * @param prompt - Content blocks from the client.\n * @returns The prompt parts and the warnings raised while converting.\n */\nexport function acpPromptToPromptParts(prompt: readonly ContentBlock[]): AcpPromptMapping {\n const parts: PromptPart[] = []\n const warnings: string[] = []\n\n for (const block of prompt) {\n switch (block.type) {\n case 'text':\n parts.push({ type: 'text', text: block.text })\n break\n case 'image': {\n if (block.data) {\n parts.push({ type: 'image', mediaType: block.mimeType || 'image/png', data: block.data })\n }\n else {\n warnings.push(`Image resource linked instead of embedded: ${block.uri ?? 'unknown URI'}`)\n parts.push({ type: 'text', text: `[image resource: ${block.uri ?? 'unavailable'}]` })\n }\n break\n }\n case 'audio': {\n if (block.data) {\n parts.push({ type: 'audio', mediaType: block.mimeType || 'audio/mpeg', data: block.data })\n }\n else {\n warnings.push('Audio block omitted because it did not include embedded data.')\n parts.push({ type: 'text', text: '[audio resource omitted: no embedded data]' })\n }\n break\n }\n case 'resource_link':\n parts.push({ type: 'text', text: renderResourceLink(block) })\n break\n case 'resource':\n parts.push(resourceToPromptPart(block))\n break\n default:\n warnings.push('Unknown ACP content block converted to text.')\n parts.push({ type: 'text', text: JSON.stringify(block as Record<string, unknown>) })\n break\n }\n }\n\n return { prompt: parts, warnings }\n}\n\n/**\n * Converts stored session content blocks to ACP content blocks, for replaying history.\n * Thinking blocks become text. Images and documents without data become `resource_link` blocks. Audio without data and system notes are dropped.\n * @param blocks - Session content blocks.\n * @returns The matching ACP content blocks.\n */\nexport function sessionBlocksToAcp(blocks: readonly SessionContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = []\n for (const block of blocks) {\n // System notes are the harness talking to the model (mode, catalog\n // changes), not part of the user's message: they don't replay.\n if (block.type === 'text' && block.systemNote)\n continue\n if (block.type === 'text' || block.type === 'thinking') {\n out.push({ type: 'text', text: block.text })\n }\n else if (block.type === 'image') {\n out.push(imageBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, block.name))\n }\n else if (block.type === 'audio') {\n if (block.data)\n out.push({ type: 'audio', mimeType: block.mediaType, data: block.data })\n }\n else if (block.type === 'document') {\n out.push(documentBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, block.encoding, block.name))\n }\n }\n return out\n}\n\n/**\n * Converts a tool result to ACP tool call content.\n * A string becomes one text content item. Block arrays map block by block, and unsupported blocks fall back to their text form.\n * @param content - Tool result as a string or an array of result blocks.\n * @returns ACP tool call content items.\n */\nexport function toolResultToAcpContent(content: string | ToolResultContent[]): ToolCallContent[] {\n if (typeof content === 'string')\n return [{ type: 'content', content: { type: 'text', text: content } }]\n\n return content.map((block): ToolCallContent => {\n if (block.type === 'text')\n return { type: 'content', content: { type: 'text', text: block.text } }\n if (block.type === 'image') {\n return {\n type: 'content',\n content: imageBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, 'name' in block ? block.name : undefined),\n }\n }\n if (block.type === 'audio' && block.data)\n return { type: 'content', content: { type: 'audio', mimeType: block.mediaType, data: block.data } }\n if (block.type === 'document') {\n return {\n type: 'content',\n content: documentBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, block.encoding, 'name' in block ? block.name : undefined),\n }\n }\n return { type: 'content', content: { type: 'text', text: toolResultToText([block]) } }\n })\n}\n\n/**\n * Build a spec-valid ACP image block. `ImageContent` requires `data` +\n * `mimeType`; when we only have a reference (`ref`/uri) we fall back to a\n * `resource_link` (which requires `name` + `uri`) so we never emit an image\n * block missing its required `data`.\n */\nfunction imageBlockToAcp(mimeType: string, data: string | undefined, ref: string | undefined, name: string | undefined): ContentBlock {\n if (data)\n return { type: 'image', mimeType, data, ...(ref ? { uri: ref } : {}) }\n return { type: 'resource_link', uri: ref ?? acpSyntheticUri('image', name), name: name ?? 'image', mimeType }\n}\n\n/**\n * Build a spec-valid embedded `resource` (or a `resource_link` fallback for\n * reference-only documents). `EmbeddedResource.resource` requires a `uri`\n * plus either `text` (text payload) or `blob` (base64), so a synthetic URI is\n * minted when the source block has none.\n */\nfunction documentBlockToAcp(mimeType: string, data: string | undefined, ref: string | undefined, encoding: 'base64' | 'text' | undefined, name: string | undefined): ContentBlock {\n const uri = ref ?? acpSyntheticUri('document', name)\n if (typeof data !== 'string') {\n return { type: 'resource_link', uri, name: name ?? 'document', mimeType }\n }\n const resource: EmbeddedResourceResource = encoding === 'text'\n ? { uri, text: data, mimeType }\n : { uri, blob: data, mimeType }\n return { type: 'resource', resource }\n}\n\nfunction acpSyntheticUri(kind: string, name: string | undefined): string {\n const slug = (name ?? kind).replace(/[^\\w.-]+/g, '_')\n return `acp:///${kind}/${slug}`\n}\n\nexport function toolKindForName(name: string): ToolKind {\n if (name === 'read_file' || name === 'list_files')\n return 'read'\n if (name === 'write_file' || name === 'edit' || name === 'multi_edit')\n return 'edit'\n if (name === 'grep' || name === 'glob' || name === 'tool_search')\n return 'search'\n if (name === 'shell' || name === 'wait_task' || name === 'shell_kill')\n return 'execute'\n if (name === 'web_search' || name === 'fetch_url')\n return 'fetch'\n if (name === 'present_plan' || name === 'ask_user')\n return 'think'\n return 'other'\n}\n\n/**\n * Maps the outcome of an agent run to an ACP stop reason.\n * An abort gives `cancelled`, reaching the turn limit gives `max_turn_requests`. Otherwise the last turn finish reason decides: `length` gives `max_tokens`, `content-filter` and `error` give `refusal`, and anything else gives `end_turn`.\n * @param input - Run outcome.\n * @param input.aborted - Whether the run was cancelled.\n * @param input.turnUsage - Per-turn usage records, used for the last finish reason.\n * @param input.maxTurnsReached - Whether the run stopped at its turn limit.\n * @returns The stop reason to send in the prompt response.\n */\nexport function stopReasonFromRun(input: { aborted: boolean, turnUsage?: TurnUsage[], maxTurnsReached?: boolean }): StopReason {\n if (input.aborted)\n return 'cancelled'\n if (input.maxTurnsReached)\n return 'max_turn_requests'\n const finish = lastFinishReason(input.turnUsage)\n switch (finish) {\n case 'length':\n return 'max_tokens'\n case 'content-filter':\n case 'error':\n return 'refusal'\n default:\n return 'end_turn'\n }\n}\n\nexport function usageCost(cost: number | undefined): Cost | null {\n if (typeof cost !== 'number' || !Number.isFinite(cost))\n return null\n return { amount: cost, currency: 'USD' }\n}\n\nexport function resolveAcpPath(cwd: string, path: string): string {\n return path.startsWith('/') ? path : resolve(cwd, path)\n}\n\nfunction lastFinishReason(turnUsage: TurnUsage[] | undefined): TurnFinishReason | undefined {\n for (let i = (turnUsage?.length ?? 0) - 1; i >= 0; i--) {\n const reason = turnUsage?.[i]?.finishReason\n if (reason)\n return reason\n }\n return undefined\n}\n\nfunction headersToRecord(headers: readonly { name: string, value: string }[] | undefined): Record<string, string> {\n const out: Record<string, string> = {}\n for (const header of headers ?? [])\n out[header.name] = header.value\n return out\n}\n\nfunction envToRecord(env: readonly { name: string, value: string }[] | undefined): Record<string, string> {\n const out: Record<string, string> = {}\n for (const item of env ?? [])\n out[item.name] = item.value\n return out\n}\n\nfunction renderResourceLink(block: { uri: string, name?: string | null, title?: string | null, mimeType?: string | null }): string {\n const label = block.title ?? block.name ?? block.uri\n return block.mimeType\n ? `[resource: ${label}](${block.uri}) (${block.mimeType})`\n : `[resource: ${label}](${block.uri})`\n}\n\nfunction resourceToPromptPart(block: EmbeddedResource): PromptPart {\n const resource = block.resource\n const mediaType = resource.mimeType ?? 'text/plain'\n const name = nameFromUri(resource.uri)\n if ('text' in resource && typeof resource.text === 'string') {\n return {\n type: 'document',\n mediaType,\n data: resource.text,\n encoding: 'text',\n ...(name ? { name } : {}),\n }\n }\n if ('blob' in resource && typeof resource.blob === 'string') {\n return {\n type: 'document',\n mediaType,\n data: resource.blob,\n encoding: 'base64',\n ...(name ? { name } : {}),\n }\n }\n return { type: 'text', text: `[resource omitted: ${resource.uri}]` }\n}\n\nfunction nameFromUri(uri: string | undefined): string | undefined {\n if (!uri)\n return undefined\n const trimmed = uri.replace(/[/\\\\]+$/, '')\n const segment = trimmed.split(/[/\\\\]/).pop()\n return segment && segment.length > 0 ? segment : undefined\n}\n","import type { ToolContext, ToolDef } from '../tools'\nimport type { AcpClientCapabilities, AcpPeer, CreateTerminalRequest, TerminalOutputResponse } from './types'\nimport { Buffer } from 'node:buffer'\nimport { hashContent, readStateKey, resolveReadStateMap } from '../tools'\nimport { readFileLineNumbers } from '../tools/read-file'\nimport { READ_FILE_MAX_BATCH, readFileBatchHeader, readFileTargets } from '../tools/read-file-targets'\nimport { wholeReadRefusal } from '../tools/whole-read-guard'\nimport { resolveAcpPath } from './mapping'\n\n/** Options for {@link wrapToolsForAcpClient}. */\nexport interface AcpClientToolOptions {\n /** Peer used to send `fs/*` and `terminal/*` requests to the ACP client. */\n client: AcpPeer\n /** ACP session id attached to every request sent to the client. */\n sessionId: string\n /** Capabilities the client declared at `initialize`. A tool is only routed to the client when the matching capability is present. */\n capabilities: AcpClientCapabilities\n /**\n * Route `read_file` and `write_file` through the client when it supports `fs.readTextFile` / `fs.writeTextFile`. Set `false` to keep the local tools.\n * @default true\n */\n useClientFileSystem?: boolean\n /**\n * Route `shell` through a client terminal when the client declares the `terminal` capability. Set `false` to keep the local tool.\n * @default true\n */\n useClientTerminal?: boolean\n}\n\n/**\n * Replaces the `read_file`, `write_file` and `shell` tools with versions that run on the ACP client.\n * Uses the client file system and terminal so the user sees editor state and terminal output. Tools the client cannot back, or that are missing from `tools`, are left as they are.\n * @param tools - Tool set to wrap. Not modified.\n * @param options - Client peer, session id and routing switches.\n * @returns A new tool set, or `undefined` when `tools` is undefined.\n */\nexport function wrapToolsForAcpClient(tools: Record<string, ToolDef> | undefined, options: AcpClientToolOptions): Record<string, ToolDef> | undefined {\n if (!tools)\n return undefined\n\n const wrapped: Record<string, ToolDef> = { ...tools }\n const readFileEntry = findToolEntry(tools, 'read_file')\n const writeFileEntry = findToolEntry(tools, 'write_file')\n const shellEntry = findToolEntry(tools, 'shell')\n if (options.useClientFileSystem !== false && options.capabilities.fs?.readTextFile && readFileEntry)\n wrapped[readFileEntry.key] = wrapReadFile(readFileEntry.tool, options)\n if (options.useClientFileSystem !== false && options.capabilities.fs?.writeTextFile && writeFileEntry)\n wrapped[writeFileEntry.key] = wrapWriteFile(writeFileEntry.tool, options)\n if (options.useClientTerminal !== false && options.capabilities.terminal && shellEntry)\n wrapped[shellEntry.key] = wrapShell(shellEntry.tool, options)\n return wrapped\n}\n\nfunction findToolEntry(tools: Record<string, ToolDef>, canonicalName: string): { key: string, tool: ToolDef } | null {\n for (const [key, tool] of Object.entries(tools)) {\n if (key === canonicalName || tool.spec.name === canonicalName)\n return { key, tool }\n }\n return null\n}\n\nfunction wrapReadFile(base: ToolDef, options: AcpClientToolOptions): ToolDef {\n const readOne = async (input: Record<string, unknown>, ctx: ToolContext): Promise<string> => {\n const path = typeof input.path === 'string' ? input.path : ''\n if (!path)\n return 'Read error: missing path.'\n const absPath = resolveAcpPath(ctx.handle.cwd, path)\n const limit = positiveNumberOrNull(input.limit)\n const fromEnd = typeof input.offset === 'number' && Number.isFinite(input.offset) && input.offset < 0\n let line = lineOrDefault(input.offset)\n let content: string\n if (fromEnd) {\n // Negative offset counts from the end (`-50` = last 50 lines): the\n // client protocol has no tail read, so fetch the whole file and slice,\n // behind the same whole-read size guard as the native tool.\n const refusal = await wholeReadRefusal(ctx.execution, ctx.handle, path, 'read')\n if (refusal)\n return refusal\n const response = await options.client.sendRequest('fs/read_text_file', {\n sessionId: options.sessionId,\n path: absPath,\n }) as { content?: unknown }\n const whole = typeof response.content === 'string' ? response.content : ''\n const lines = whole.split('\\n')\n if (whole.endsWith('\\n'))\n lines.pop()\n line = Math.max(1, lines.length + Math.floor(input.offset as number) + 1)\n content = lines.slice(line - 1, limit !== null ? line - 1 + limit : undefined).join('\\n')\n }\n else {\n const response = await options.client.sendRequest('fs/read_text_file', {\n sessionId: options.sessionId,\n path: absPath,\n line,\n ...(limit !== null ? { limit } : {}),\n }) as { content?: unknown }\n content = typeof response.content === 'string' ? response.content : ''\n }\n seedReadState(ctx, absPath, content, line, limit ?? Number.POSITIVE_INFINITY)\n return readFileLineNumbers(input.lineNumbers, ctx) ? withLineNumbers(content, line) : content\n }\n return {\n ...base,\n async execute(input, ctx) {\n if (input.paths === undefined)\n return readOne(input, ctx)\n // `paths` batch: one client read per entry, rendered like the native tool.\n if (Array.isArray(input.paths) && input.paths.length > READ_FILE_MAX_BATCH)\n return `Read error: \\`paths\\` holds ${input.paths.length} entries; the limit is ${READ_FILE_MAX_BATCH} per call. Split the batch.`\n const targets = readFileTargets(input)\n if (targets.length === 0)\n return 'Read error: `paths` must be a non-empty array of `{ path, offset?, limit? }` entries.'\n const sections: string[] = []\n for (const target of targets) {\n const body = await readOne({ path: target.path, offset: target.offset, limit: target.limit, lineNumbers: input.lineNumbers }, ctx)\n sections.push(`${readFileBatchHeader(target.path)}\\n${body}`)\n }\n return sections.join('\\n\\n')\n },\n }\n}\n\nfunction wrapWriteFile(base: ToolDef, options: AcpClientToolOptions): ToolDef {\n return {\n ...base,\n async execute(input, ctx) {\n const path = typeof input.path === 'string' ? input.path : ''\n const content = typeof input.content === 'string' ? input.content : ''\n if (!path)\n return 'Write error: missing path.'\n const absPath = resolveAcpPath(ctx.handle.cwd, path)\n await options.client.sendRequest('fs/write_text_file', {\n sessionId: options.sessionId,\n path: absPath,\n content,\n })\n seedReadState(ctx, absPath, content, 0, Number.POSITIVE_INFINITY)\n ctx.reportOutcome?.('updated')\n return `Wrote ${absPath} (${Buffer.byteLength(content)} bytes).`\n },\n }\n}\n\nfunction wrapShell(base: ToolDef, options: AcpClientToolOptions): ToolDef {\n return {\n ...base,\n spec: withoutShellBackgroundInput(base.spec),\n async execute(input, ctx) {\n const command = typeof input.command === 'string' ? input.command : ''\n if (!command)\n return 'shell error: missing command.'\n if (input.run_in_background === true)\n return 'shell error: background mode is not supported through ACP terminal callbacks. Run the command in the foreground.'\n\n const request: CreateTerminalRequest = {\n sessionId: options.sessionId,\n command,\n cwd: ctx.handle.cwd,\n outputByteLimit: typeof input.maxOutputBytes === 'number' ? input.maxOutputBytes : null,\n }\n const created = await options.client.sendRequest('terminal/create', request) as { terminalId?: unknown }\n const terminalId = typeof created.terminalId === 'string' ? created.terminalId : ''\n if (!terminalId)\n return 'shell error: ACP client did not return a terminal id.'\n\n try {\n const exit = await options.client.sendRequest('terminal/wait_for_exit', {\n sessionId: options.sessionId,\n terminalId,\n }) as { exitCode?: number | null, signal?: string | null }\n const output = await options.client.sendRequest('terminal/output', {\n sessionId: options.sessionId,\n terminalId,\n }) as TerminalOutputResponse\n return formatTerminalOutput(output, exit)\n }\n finally {\n await options.client.sendRequest('terminal/release', {\n sessionId: options.sessionId,\n terminalId,\n }).catch(() => undefined)\n }\n },\n }\n}\n\nfunction formatTerminalOutput(output: TerminalOutputResponse, exit: { exitCode?: number | null, signal?: string | null }): string {\n const body = output.output || '(no output)'\n const code = exit.exitCode ?? output.exitStatus?.exitCode\n const signal = exit.signal ?? output.exitStatus?.signal\n const suffix = signal\n ? `\\n(signal ${signal})`\n : typeof code === 'number'\n ? `\\n(exit ${code})`\n : ''\n const truncated = output.truncated ? '\\n(output truncated by ACP client)' : ''\n return `${body}${truncated}${suffix}`\n}\n\nfunction withoutShellBackgroundInput(spec: ToolDef['spec']): ToolDef['spec'] {\n const properties = isRecord(spec.inputSchema.properties) ? spec.inputSchema.properties : undefined\n if (!properties || !Object.hasOwn(properties, 'run_in_background'))\n return spec\n\n const { run_in_background: _runInBackground, ...nextProperties } = properties\n const required = Array.isArray(spec.inputSchema.required)\n ? spec.inputSchema.required.filter(name => name !== 'run_in_background')\n : spec.inputSchema.required\n\n return {\n ...spec,\n description: spec.description\n .split('\\n')\n .filter(line =>\n !line.includes('run_in_background')\n && !line.includes('<task-notification>')\n && !line.includes('background task'),\n )\n .join('\\n'),\n inputSchema: {\n ...spec.inputSchema,\n properties: nextProperties,\n ...(required ? { required } : {}),\n },\n }\n}\n\nfunction withLineNumbers(content: string, start: number): string {\n return content\n .split('\\n')\n .map((line, index) => `${start + index}\\t${line}`)\n .join('\\n')\n}\n\nfunction lineOrDefault(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 1 ? Math.trunc(value) : 1\n}\n\nfunction positiveNumberOrNull(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.trunc(value) : null\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction seedReadState(ctx: ToolContext, path: string, content: string, offset: number, limit: number): void {\n const readState = resolveReadStateMap(ctx)\n if (!readState)\n return\n readState.set(readStateKey(ctx.handle.cwd, path), {\n contentHash: hashContent(content),\n offset,\n limit,\n maxBytes: Number.POSITIVE_INFINITY,\n mtimeMs: Date.now(),\n })\n}\n","/**\n * ACP plan mode. Both modes send the same tools, so a switch keeps the prompt\n * cache; the gates enforce Plan mode and the mode reaches the model as a note\n * on the next prompt (`AgentRunOptions.systemNotes`).\n */\nimport type { SessionTurn, SystemNote } from '../types'\nimport type { AcpSessionRuntime } from './types'\nimport { applyCompactSummaryCutoff } from '../loop-compaction'\n\nexport const PLAN_MODE_ID = 'plan'\n\n/** A note with its text, as `AgentRunOptions.systemNotes` takes it. */\nexport type ModeNote = SystemNote & { text: string }\n\nconst MODE_NOTE_KIND_PREFIX = 'mode:'\n\nconst PLAN_READ_ONLY_TOOLS = new Set([\n 'read_file',\n 'list_files',\n 'grep',\n 'glob',\n 'web_search',\n 'fetch_url',\n 'skills_read',\n])\n\nexport function isPlanReadOnlyTool(name: string, runtime: AcpSessionRuntime): boolean {\n return PLAN_READ_ONLY_TOOLS.has(name)\n || runtime.clientTools.some(tool => tool.name === name && !tool.mutating)\n}\n\n/**\n * The plan-mode rules as a note: read-only, investigate, then propose. A\n * condensed form of the Plan profile's doctrine (`buildPlanSystem`). The\n * plan gate refuses `present_plan` and `ask_user`, so the plan is\n * written in the final response.\n *\n * @param tools - The tools the plan-mode gate lets through (wire names).\n */\nexport function planModeNote(tools: readonly string[]): ModeNote {\n const allowed = `Allowed tools: ${tools.map(name => `\\`${name}\\``).join(', ')}. Any other call is refused.`\n const text = `# Plan mode (read-only)\nYou are now in PLAN mode: investigate and design a proposal. You CANNOT modify files, run mutating commands, or spawn subagents until the user switches back to Build mode. ${allowed}\n\n1. Explore: read the relevant code, find existing functions and patterns to reuse. Check current docs via web search when the plan depends on external libraries.\n2. Propose: write the plan in your final response: what to change, which files, what to reuse (real paths, symbols, line numbers), how to verify end-to-end. Recommend one approach, not every alternative. Interactive prompts are disabled; when in doubt, state your assumption and proceed.\n- Search first (\\`grep\\` / \\`glob\\`), then \\`read_file\\` the specific file. Don't re-read files or re-run searches whose output is still visible above.\n\nThe user switches to Build mode to execute the plan.`\n return { kind: `${MODE_NOTE_KIND_PREFIX}plan`, label: 'Plan mode', text }\n}\n\n/** The note that ends plan mode. */\nexport function buildModeNote(): ModeNote {\n return {\n kind: `${MODE_NOTE_KIND_PREFIX}build`,\n label: 'Build mode',\n text: 'Plan mode is off. You are back in Build mode: every tool is available again, edits included.',\n }\n}\n\n/**\n * The mode the model was last told about: the newest mode note in `turns`.\n * No note means Build, the mode a conversation starts in.\n *\n * @param turns - The session's turns, oldest first.\n */\nexport function lastAnnouncedMode(turns: readonly SessionTurn[]): 'build' | 'plan' {\n for (let i = turns.length - 1; i >= 0; i--) {\n const content = turns[i]!.content\n for (let j = content.length - 1; j >= 0; j--) {\n const block = content[j]!\n if (block.type === 'text' && block.systemNote?.kind.startsWith(MODE_NOTE_KIND_PREFIX))\n return block.systemNote.kind === `${MODE_NOTE_KIND_PREFIX}plan` ? 'plan' : 'build'\n }\n }\n return 'build'\n}\n\n/**\n * The mode note the next prompt carries, `undefined` when the session's turns\n * already told the model its current mode. Reads the wire view: a note\n * compacted into a summary no longer reaches the model, so it is sent again.\n */\nexport function modeNoteForPrompt(runtime: AcpSessionRuntime): ModeNote | undefined {\n const mode = runtime.modeId === PLAN_MODE_ID ? 'plan' : 'build'\n if (lastAnnouncedMode(applyCompactSummaryCutoff(runtime.session.turns)) === mode)\n return undefined\n if (mode === 'build')\n return buildModeNote()\n const tools = Object.values(runtime.tools ?? {})\n .map(tool => tool.spec.name)\n .filter(name => isPlanReadOnlyTool(name, runtime))\n return planModeNote(tools)\n}\n","/**\n * Prompt-cache care for ACP sessions: the cache lifetime, cache-break logging\n * under `ZIDANE_DEBUG`, and each session's frozen system prompt (see\n * `AgentRunOptions.systemFreeze`).\n *\n * The first run of a session captures its prompt into a snapshot turn; later runs send\n * that text again and announce catalog changes (skills, searchable tools,\n * MCP instructions) as notes, so the provider's prompt cache keeps hitting.\n *\n * ACP does not compose the base prompt itself (it is the embedder's preset,\n * agent options or `system`), so the base is tracked as the fresh prompt with\n * the SDK-appended catalogs removed. When it changed since the snapshot (a\n * server restarted with a new prompt), the run re-captures instead of sending\n * the stale one.\n */\n\nimport type { Agent } from '../agent'\nimport type { Session } from '../session'\nimport type { AgentRunOptions, CacheTtl, FrozenPromptSections } from '../types'\nimport process from 'node:process'\nimport { installCacheBreakLogger } from '../cache-telemetry'\nimport { catalogChangeNotes, FROZEN_PROMPT_SECTION_KINDS, latestSystemSnapshot, sectionDigests, systemSnapshotTurn } from '../system-freeze'\n\n/**\n * Default prompt-cache lifetime of ACP sessions. An editor session is\n * human-paced: the user reads, edits and thinks between prompts, often for\n * longer than the default 5-minute cache entry lives, so a 1-hour entry keeps\n * those gaps on cache reads instead of full re-reads.\n */\nexport const ACP_CACHE_TTL: CacheTtl = '1h'\n\n/** Digest kind of the base prompt: the fresh prompt without the SDK-appended catalogs. */\nconst BASE_SECTION = 'base'\n\n/**\n * Write one debug line to stderr when `ZIDANE_DEBUG` is set. Never stdout:\n * that is the ACP protocol stream.\n *\n * @param line - The line to write.\n */\nfunction acpDebug(line: string): void {\n if (process.env.ZIDANE_DEBUG)\n process.stderr.write(`[zidane-acp] ${line}\\n`)\n}\n\n/** The fresh prompt without the sections the SDK appended to it. */\nfunction basePrompt(fresh: string, sections: FrozenPromptSections): string {\n let base = fresh\n for (const kind of FROZEN_PROMPT_SECTION_KINDS) {\n const text = sections[kind]\n if (!text)\n continue\n const joined = base.indexOf(`\\n\\n${text}`)\n base = joined >= 0\n ? base.slice(0, joined) + base.slice(joined + text.length + 2)\n : base.replace(text, () => '')\n }\n return base\n}\n\nfunction snapshotDigests(fresh: string, sections: FrozenPromptSections): Record<string, string> {\n return sectionDigests({ ...sections, [BASE_SECTION]: basePrompt(fresh, sections) })\n}\n\n/** A session's prompt freeze: the `systemFreeze` options of its next run. */\nexport interface AcpPromptFreeze {\n /** The `systemFreeze` options for the session's next run. */\n runOptions: () => Pick<AgentRunOptions, 'systemFreeze'>\n}\n\n/**\n * Freeze the system prompt of an ACP session's runs.\n *\n * @param input - The session and the snapshot key.\n * @param input.session - The session holding the snapshot turns.\n * @param input.key - Stable id of the server's agent composition, which keys the snapshots.\n */\nfunction createAcpPromptFreeze(input: { session: Session, key: string }): AcpPromptFreeze {\n const { session, key } = input\n const capture = async (fresh: string, sections: FrozenPromptSections): Promise<void> => {\n await session.appendTurns([systemSnapshotTurn({\n id: await session.generateTurnId(),\n createdAt: Date.now(),\n system: fresh,\n snapshot: { key, digests: snapshotDigests(fresh, sections) },\n })])\n }\n\n return {\n runOptions: () => {\n const frozen = latestSystemSnapshot(session.turns, key)\n if (!frozen)\n return { systemFreeze: { onCapture: capture } }\n return {\n systemFreeze: {\n // A changed base prompt makes the frozen text stale: send the fresh\n // one and capture it (the provider re-reads the conversation once).\n system: (fresh, sections) => {\n if (snapshotDigests(fresh, sections)[BASE_SECTION] === frozen.snapshot.digests[BASE_SECTION])\n return frozen.text\n acpDebug(`session ${session.id}: base system prompt changed since it was frozen; re-capturing (the provider re-reads the whole conversation once)`)\n return undefined\n },\n onCapture: capture,\n notes: (_fresh, sections) => catalogChangeNotes({ frozen, turns: session.turns, sections }),\n },\n }\n },\n }\n}\n\n/**\n * Set up an ACP session's agent for prompt caching: a cache-break logger on\n * stderr when `ZIDANE_DEBUG` is set, and the session's prompt freeze unless\n * `freeze` is `false`.\n *\n * @param input - The session's agent and session, the snapshot key, and whether to freeze.\n * @param input.agent - The session's agent.\n * @param input.session - The session holding the snapshot turns.\n * @param input.key - Stable id of the server's agent composition, which keys the snapshots.\n * @param input.freeze - Freeze the session's system prompt.\n * @returns The session's prompt freeze, `undefined` when `freeze` is `false`.\n */\nexport function installAcpPromptCache(input: { agent: Agent, session: Session, key: string, freeze: boolean }): AcpPromptFreeze | undefined {\n const { agent, session, key, freeze } = input\n if (process.env.ZIDANE_DEBUG)\n installCacheBreakLogger(agent.hooks, { log: line => acpDebug(`session ${session.id}: ${line}`) })\n return freeze ? createAcpPromptFreeze({ session, key }) : undefined\n}\n","import type { AgentOptions } from '../agent'\nimport type { Preset } from '../presets'\nimport type { Provider } from '../providers'\nimport type { Session } from '../session'\nimport type { ToolDef } from '../tools'\nimport type { AgentStats, McpServerConfig, PromptPart, ThinkingLevel, TurnUsage } from '../types'\nimport type { AcpPromptFreeze } from './prompt-cache'\nimport type {\n AcpClientCapabilities,\n AcpModelChoice,\n AcpPeer,\n AcpServerOptions,\n AcpSessionRuntime,\n AuthenticateRequest,\n CancelNotification,\n DeleteSessionRequest,\n InitializeRequest,\n JsonRpcMessage,\n JsonRpcRequest,\n JsonRpcResponse,\n ListSessionsRequest,\n LoadSessionRequest,\n NewSessionRequest,\n PermissionOption,\n PromptRequest,\n PromptResponse,\n RequestPermissionOutcome,\n ResumeSessionRequest,\n SessionConfigOption,\n SessionInfo,\n SessionMode,\n SessionUpdate,\n SetSessionConfigOptionRequest,\n SetSessionModeRequest,\n ToolCallUpdate,\n} from './types'\nimport { createAgent } from '../agent'\nimport { findGitRoot, projectRootOf } from '../chat/project-root'\nimport { newSession } from '../chat/session-factory'\nimport { createProcessContext } from '../contexts'\nimport { errorMessage } from '../errors'\nimport { basic } from '../presets'\nimport { defaultPromptMessage } from '../prompt'\nimport { loadSession } from '../session'\nimport { validThinkingLevels } from '../start/shared-options'\nimport { effectiveInputFromTurn } from '../stats'\nimport { fetchUrl } from '../tools/fetch-url'\nimport { webSearch } from '../tools/web-search'\nimport { isThinkingLevel } from '../types'\nimport { assertNoClientToolClash, ClientToolSpecError, createClientDeclaredTools, parseClientToolSpecs } from './client-declared-tools'\nimport { wrapToolsForAcpClient } from './client-tools'\nimport { errorResponse, successResponse } from './json-rpc'\nimport {\n acpMcpServersToZidane,\n acpPromptToPromptParts,\n defaultModes,\n makeModeState,\n mcpCapabilities,\n newSessionResponse,\n promptCapabilitiesForProvider,\n sessionBlocksToAcp,\n stopReasonFromRun,\n toolKindForName,\n toolResultToAcpContent,\n usageCost,\n} from './mapping'\nimport { isPlanReadOnlyTool, modeNoteForPrompt, PLAN_MODE_ID } from './plan-mode'\nimport { ACP_CACHE_TTL, installAcpPromptCache } from './prompt-cache'\nimport { ACP_PROTOCOL_VERSION, AcpErrorCode } from './types'\n\nconst ACP_AGENT_VERSION = '1'\n\n// Reserved id for the auto-generated model selector config option. The registry\n// owns this id; a user-supplied config option with the same id is dropped.\nconst MODEL_CONFIG_ID = 'model'\nconst MODE_CONFIG_ID = 'mode'\nconst THINKING_CONFIG_ID = 'thinking'\nconst MODEL_OPTION_CONFIG_PREFIX = 'model_option:'\n\n/**\n * Search/fetch tools layered onto the DEFAULT ACP session (i.e. only when the\n * host passes no `preset` of its own). The `basic` preset ships neither — they\n * are opt-in at the SDK layer — but an editor-facing ACP agent should match the\n * TUI. `web_search` in particular is the trigger that makes Anthropic-backed\n * sessions use the native server-side `web_search_20250305` tool: without a\n * registered `web_search` ToolDef the provider has nothing to upgrade.\n */\nconst ACP_DEFAULT_EXTRA_TOOLS: Record<string, ToolDef> = { webSearch, fetchUrl }\n\n/**\n * Return `preset` with the default ACP search/fetch tools filled in. The\n * preset's own tools win on name collision, so this only adds what's missing.\n * Applied to the default base and by the `zidane-acp` CLI — never to a\n * host-provided `AcpServerOptions.preset`, which is honored verbatim.\n * @param preset - Base preset to extend. Not modified.\n * @returns A new preset with `web_search` and `fetch_url` added when absent.\n */\nexport function withAcpDefaultTools(preset: Preset): Preset {\n return { ...preset, tools: { ...ACP_DEFAULT_EXTRA_TOOLS, ...preset.tools } }\n}\n\nconst DEFAULT_PERMISSION_OPTIONS: PermissionOption[] = [\n { optionId: 'allow_once', name: 'Allow once', kind: 'allow_once' },\n { optionId: 'allow_always', name: 'Always allow', kind: 'allow_always' },\n { optionId: 'reject_once', name: 'Reject once', kind: 'reject_once' },\n { optionId: 'reject_always', name: 'Always reject', kind: 'reject_always' },\n]\n\n/** The ACP agent side. Handles requests and notifications from an ACP client and sends updates back through a peer. */\nexport interface AcpServer {\n /** Sets the peer used to send requests and notifications to the client. Must be called before a session is created. */\n setPeer: (peer: AcpPeer) => void\n /** Handles one incoming JSON-RPC message. Returns the response for a request, or `null` for a notification. */\n handleMessage: (message: JsonRpcMessage) => Promise<JsonRpcResponse | null>\n /** Handles one ACP request by method name and returns its result. Throws {@link AcpProtocolError} for an unknown method or invalid params. */\n handleRequest: (method: string, params?: unknown) => Promise<unknown>\n /** Sends a notification to the client through the peer. Does nothing when no peer is set. */\n notify: (method: string, params?: unknown) => Promise<void>\n /** Aborts any running prompts and destroys every open session. */\n close: () => Promise<void>\n}\n\n/**\n * Creates an ACP agent server.\n * The server speaks ACP v1: `initialize`, `authenticate`, `logout`, `session/new`, `session/load`, `session/resume`, `session/list`, `session/delete`, `session/close`, `session/prompt`, `session/set_mode`, `session/set_config_option`, and the `session/cancel` notification. It does no I/O itself, so connect it to a transport with {@link createJsonRpcConnection} or use {@link runAcpStdioServer}.\n * Throws when neither `provider` nor `models` is set, or when `defaultModelId` is not in `models`.\n * @param options - Provider or model registry, tools, session store and ACP behavior.\n * @returns The server.\n * @example\n * ```ts\n * import { createAcpServer } from 'zidane/acp'\n * import { anthropic } from 'zidane/providers'\n *\n * const server = createAcpServer({ provider: anthropic() })\n * const response = await server.handleMessage({\n * jsonrpc: '2.0',\n * id: 1,\n * method: 'initialize',\n * params: { protocolVersion: 1 },\n * })\n * ```\n */\nexport function createAcpServer(options: AcpServerOptions): AcpServer {\n return new AcpServerImpl(options)\n}\n\nclass AcpServerImpl implements AcpServer {\n private peer: AcpPeer | null = null\n private clientCapabilities: AcpClientCapabilities = {}\n private sessions = new Map<string, AcpSessionRuntime>()\n private modes: SessionMode[]\n private defaultModeId: string\n private defaultConfigOptions: SessionConfigOption[]\n private modelChoices: AcpModelChoice[]\n private defaultModelChoiceId: string | undefined\n // Provider instances memoized by choice id so a provider (and its\n // credentials) is constructed once and reused across sessions/switches.\n private builtProviders = new Map<string, Provider>()\n // Frozen system prompt of each session runtime, when `freezeSystemPrompt` is on.\n private promptFreezes = new WeakMap<AcpSessionRuntime, AcpPromptFreeze>()\n\n constructor(private readonly options: AcpServerOptions) {\n this.modes = defaultModes(options.modes)\n this.defaultModeId = options.defaultModeId ?? this.modes[0]?.id ?? 'build'\n this.modelChoices = options.models ?? []\n if (this.modelChoices.length === 0 && options.provider === undefined)\n throw new Error('AcpServerOptions requires either `provider` or `models`.')\n this.defaultModelChoiceId = this.resolveDefaultModelChoiceId(options.defaultModelId)\n this.defaultConfigOptions = this.buildDefaultConfigOptions(options.configOptions ?? [])\n }\n\n private resolveDefaultModelChoiceId(requested: string | undefined): string | undefined {\n if (this.modelChoices.length === 0)\n return undefined\n if (requested !== undefined) {\n if (!this.modelChoices.some(choice => choice.id === requested))\n throw new Error(`defaultModelId \"${requested}\" is not present in the models registry.`)\n return requested\n }\n // No explicit default: prefer a choice matching `options.model` (by id or\n // model string), else the first registered entry.\n const matched = this.options.model\n ? this.modelChoices.find(choice => choice.id === this.options.model || choice.model === this.options.model)\n : undefined\n return (matched ?? this.modelChoices[0]).id\n }\n\n private buildDefaultConfigOptions(userConfig: SessionConfigOption[]): SessionConfigOption[] {\n const reserved = new Set<string>([MODE_CONFIG_ID])\n const options: SessionConfigOption[] = [{\n id: MODE_CONFIG_ID,\n name: 'Mode',\n type: 'select',\n category: 'mode',\n currentValue: this.defaultModeId,\n options: this.modes.map(mode => ({\n value: mode.id,\n name: mode.name,\n ...(mode.description ? { description: mode.description } : {}),\n })),\n }]\n\n if (this.modelChoices.length > 0) {\n reserved.add(MODEL_CONFIG_ID)\n options.push({\n // Model selector follows mode. The registry reserves the `model` id,\n // so a colliding user option is dropped.\n id: MODEL_CONFIG_ID,\n name: 'Model',\n type: 'select',\n category: 'model',\n currentValue: this.defaultModelChoiceId!,\n options: this.modelChoices.map(choice => ({ value: choice.id, name: choice.name ?? choice.model })),\n })\n }\n\n options.push(...this.modelDependentConfigOptions(this.defaultModelChoiceId))\n\n return [...options, ...userConfig.filter(option => !reserved.has(option.id) && !isGeneratedModelOptionConfig(option.id) && option.id !== THINKING_CONFIG_ID)]\n }\n\n private providerForChoiceId(id: string): Provider {\n const choice = this.modelChoices.find(candidate => candidate.id === id)\n if (!choice)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown model: ${id}`)\n let provider = this.builtProviders.get(id)\n if (!provider) {\n provider = typeof choice.provider === 'function' ? choice.provider() : choice.provider\n this.builtProviders.set(id, provider)\n }\n return provider\n }\n\n setPeer(peer: AcpPeer): void {\n this.peer = peer\n }\n\n async handleMessage(message: JsonRpcMessage): Promise<JsonRpcResponse | null> {\n if (!isObject(message) || typeof (message as { method?: unknown }).method !== 'string') {\n const id = 'id' in (message as object) ? (message as { id?: unknown }).id : null\n return errorResponse(normalizeId(id), AcpErrorCode.InvalidRequest, 'Invalid JSON-RPC request.')\n }\n\n if (!('id' in message)) {\n await this.handleNotification(message.method, (message as { params?: unknown }).params)\n return null\n }\n\n const request = message as JsonRpcRequest\n try {\n const result = await this.handleRequest(request.method, request.params)\n return successResponse(request.id, result)\n }\n catch (err) {\n const rpcError = toRpcError(err)\n return errorResponse(request.id, rpcError.code, rpcError.message, rpcError.data)\n }\n }\n\n async handleRequest(method: string, params?: unknown): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return this.initialize(asObject<InitializeRequest>(params))\n case 'authenticate':\n return this.authenticate(asObject<AuthenticateRequest>(params))\n case 'logout':\n return this.logout()\n case 'session/new':\n return this.newSession(asObject<NewSessionRequest>(params))\n case 'session/load':\n return this.loadExistingSession(asObject<LoadSessionRequest>(params))\n case 'session/resume':\n return this.resumeSession(asObject<ResumeSessionRequest>(params))\n case 'session/list':\n return this.listSessions(asObject<ListSessionsRequest>(params))\n case 'session/delete':\n return this.deleteSession(asObject<DeleteSessionRequest>(params))\n case 'session/close':\n return this.closeSession(asObject<{ sessionId: string }>(params))\n case 'session/prompt':\n return this.prompt(asObject<PromptRequest>(params))\n case 'session/set_mode':\n return this.setMode(asObject<SetSessionModeRequest>(params))\n case 'session/set_config_option':\n return this.setConfigOption(asObject<SetSessionConfigOptionRequest>(params))\n default:\n throw new AcpProtocolError(AcpErrorCode.MethodNotFound, `Unknown ACP method: ${method}`)\n }\n }\n\n async notify(method: string, params?: unknown): Promise<void> {\n await this.peer?.sendNotification(method, params)\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessions.values()]\n this.sessions.clear()\n await Promise.allSettled(sessions.map(async (runtime) => {\n runtime.abortController?.abort(new Error('ACP server closing.'))\n await runtime.agent.destroy()\n }))\n }\n\n private async handleNotification(method: string, params?: unknown): Promise<void> {\n switch (method) {\n case 'session/cancel':\n this.cancel(asObject<CancelNotification>(params))\n break\n default:\n break\n }\n }\n\n private initialize(params: InitializeRequest): unknown {\n this.clientCapabilities = params.clientCapabilities ?? {}\n const provider = this.resolveProvider()\n return {\n // We currently speak ACP v1 only. Per ACP, return the requested version\n // only if supported; otherwise advertise the latest supported version.\n protocolVersion: params.protocolVersion === ACP_PROTOCOL_VERSION ? params.protocolVersion : ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: promptCapabilitiesForProvider(provider.meta.capabilities),\n mcpCapabilities: mcpCapabilities(),\n sessionCapabilities: {\n list: {},\n delete: {},\n resume: {},\n close: {},\n additionalDirectories: {},\n },\n auth: {\n ...(this.options.logout ? { logout: {} } : {}),\n },\n // Tells clients they may declare tools under `_meta.zidane.clientTools`.\n _meta: { zidane: { clientTools: true } },\n },\n agentInfo: this.options.agentInfo ?? { name: 'zidane', title: 'Zidane ACP', version: ACP_AGENT_VERSION },\n authMethods: this.options.authMethods ?? [],\n }\n }\n\n private async authenticate(params: AuthenticateRequest): Promise<unknown> {\n if (!this.options.authenticate)\n return {}\n return await this.options.authenticate(params)\n }\n\n private async logout(): Promise<unknown> {\n if (!this.options.logout)\n return {}\n return await this.options.logout()\n }\n\n private async newSession(params: NewSessionRequest): Promise<unknown> {\n const runtime = await this.createRuntime(params)\n this.deferAvailableCommands(runtime.sessionId)\n return newSessionResponse(runtime.sessionId, this.modes, runtime.modeId, runtime.configOptions)\n }\n\n private async loadExistingSession(params: LoadSessionRequest): Promise<unknown> {\n const runtime = await this.createRuntime(params, params.sessionId, true)\n // ACP `session/load` replays the full history through `session/update`\n // notifications BEFORE the response resolves; the response itself only\n // carries mode/config state (no inline `messages`).\n await this.replayHistory(runtime)\n this.deferAvailableCommands(runtime.sessionId)\n return this.sessionStateResponse(runtime)\n }\n\n private async resumeSession(params: ResumeSessionRequest): Promise<unknown> {\n const runtime = await this.createRuntime({\n cwd: params.cwd,\n additionalDirectories: params.additionalDirectories,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n }, params.sessionId, true)\n // `session/resume` does not replay history (unlike `session/load`); it only\n // reports current mode state.\n this.deferAvailableCommands(runtime.sessionId)\n return this.sessionStateResponse(runtime)\n }\n\n private sessionStateResponse(runtime: AcpSessionRuntime): { modes: ReturnType<typeof makeModeState>, configOptions?: SessionConfigOption[] } {\n return {\n modes: makeModeState(this.modes, runtime.modeId),\n ...(runtime.configOptions.length > 0 ? { configOptions: runtime.configOptions } : {}),\n }\n }\n\n private deferAvailableCommands(sessionId: string): void {\n if (!this.options.commands || this.options.commands.length === 0)\n return\n setTimeout(() => {\n void this.sessionUpdate(sessionId, {\n sessionUpdate: 'available_commands_update',\n availableCommands: this.options.commands!,\n })\n }, 0)\n }\n\n private async replayHistory(runtime: AcpSessionRuntime): Promise<void> {\n for (const turn of runtime.session.turns) {\n // Frozen system prompt snapshots are bookkeeping, not conversation.\n if (turn.role === 'system')\n continue\n const blocks = sessionBlocksToAcp(turn.content)\n if (blocks.length === 0)\n continue\n const sessionUpdate = turn.role === 'assistant' ? 'agent_message_chunk' : 'user_message_chunk'\n for (const content of blocks)\n await this.sessionUpdate(runtime.sessionId, { sessionUpdate, content })\n }\n }\n\n private async listSessions(params: ListSessionsRequest): Promise<unknown> {\n const store = this.options.store\n if (!store) {\n return {\n sessions: [...this.sessions.values()]\n .filter(runtime => !params.cwd || runtime.cwd === params.cwd)\n .map(runtime => sessionInfo(runtime)),\n nextCursor: null,\n }\n }\n\n // Sessions are grouped by project root (`newSession`), but the editor asks\n // by its own cwd, which may be a subfolder or a linked worktree. Query the\n // root the factory would derive, plus the older tags — the checkout root\n // and the raw cwd (the projectRoot ACP stamped before the factory) — then\n // match on the stamped cwd.\n const roots = params.cwd ? [...new Set([projectRootOf(params.cwd), findGitRoot(params.cwd) ?? params.cwd, params.cwd])] : [undefined]\n const idLists = await Promise.all(roots.map(root => store.list({ limit: 100, ...(root ? { projectRoot: root } : {}) })))\n const ids = [...new Set(idLists.flat())]\n const sessions: SessionInfo[] = []\n for (const id of ids) {\n const loaded = await store.load(id)\n if (!loaded)\n continue\n const stampedCwd = typeof loaded.metadata.cwd === 'string' && loaded.metadata.cwd ? loaded.metadata.cwd : undefined\n if (params.cwd && (stampedCwd ?? loaded.projectRoot) !== params.cwd)\n continue\n // `SessionInfo.cwd` is required and must be absolute; fall back to the\n // requested filter cwd, then the live runtime cwd. Skip sessions we\n // cannot attribute to a working directory rather than emit an invalid one.\n const cwd = stampedCwd ?? loaded.projectRoot ?? params.cwd ?? this.sessions.get(loaded.id)?.cwd\n if (!cwd)\n continue\n sessions.push({\n sessionId: loaded.id,\n cwd,\n title: typeof loaded.metadata.title === 'string' ? loaded.metadata.title : null,\n updatedAt: new Date(loaded.updatedAt).toISOString(),\n })\n }\n return { sessions, nextCursor: null }\n }\n\n private async deleteSession(params: DeleteSessionRequest): Promise<unknown> {\n const runtime = this.sessions.get(params.sessionId)\n if (runtime) {\n runtime.abortController?.abort(new Error('ACP session deleted.'))\n await runtime.agent.destroy()\n this.sessions.delete(params.sessionId)\n }\n await this.options.store?.delete(params.sessionId)\n return {}\n }\n\n private async closeSession(params: { sessionId: string }): Promise<unknown> {\n const runtime = this.requireSession(params.sessionId)\n runtime.abortController?.abort(new Error('ACP session closed.'))\n await runtime.agent.destroy()\n this.sessions.delete(params.sessionId)\n return {}\n }\n\n private async prompt(params: PromptRequest): Promise<PromptResponse> {\n const runtime = this.requireSession(params.sessionId)\n if (runtime.inFlight)\n throw new AcpProtocolError(AcpErrorCode.InvalidRequest, `Session ${params.sessionId} already has an in-flight prompt.`)\n\n const mapped = acpPromptToPromptParts(params.prompt)\n const abortController = new AbortController()\n runtime.abortController = abortController\n const run = async (): Promise<PromptResponse> => {\n let stats: AgentStats | undefined\n let aborted = false\n try {\n for (const warning of mapped.warnings) {\n await this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'agent_thought_chunk',\n content: { type: 'text', text: warning },\n })\n }\n const modeNote = modeNoteForPrompt(runtime)\n stats = await runtime.agent.run({\n prompt: mapped.prompt,\n ...(runtime.runModel ? { model: runtime.runModel } : {}),\n ...this.runConfig(runtime),\n ...(modeNote ? { systemNotes: [modeNote] } : {}),\n ...this.promptFreezes.get(runtime)?.runOptions(),\n ...(this.options.system ? { system: this.options.system } : {}),\n signal: abortController.signal,\n })\n }\n catch (err) {\n aborted = abortController.signal.aborted\n if (!aborted)\n throw err\n }\n finally {\n runtime.abortController = undefined\n runtime.inFlight = undefined\n }\n\n return {\n stopReason: stopReasonFromRun({\n aborted: aborted || abortController.signal.aborted,\n turnUsage: stats?.turnUsage,\n maxTurnsReached: stats ? reachedMaxTurns(stats, this.options.behavior) : false,\n }),\n }\n }\n\n const inFlight = run()\n runtime.inFlight = inFlight\n return await inFlight\n }\n\n private cancel(params: CancelNotification): void {\n const runtime = this.sessions.get(params.sessionId)\n runtime?.abortController?.abort(new Error('Cancelled by ACP client.'))\n runtime?.agent.abort()\n }\n\n private async setMode(params: SetSessionModeRequest): Promise<unknown> {\n const runtime = this.requireSession(params.sessionId)\n const configOptions = this.selectMode(runtime, params.modeId)\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'current_mode_update',\n currentModeId: params.modeId,\n })\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'config_option_update',\n configOptions,\n })\n return {}\n }\n\n private async setConfigOption(params: SetSessionConfigOptionRequest): Promise<unknown> {\n const runtime = this.requireSession(params.sessionId)\n const isModelSwitch = this.modelChoices.length > 0 && params.configId === MODEL_CONFIG_ID\n const isModeSwitch = params.configId === MODE_CONFIG_ID\n // A model switch rebinds the agent's provider; refuse mid-prompt so we never\n // swap the provider out from under an in-flight stream.\n if (isModelSwitch && runtime.inFlight)\n throw new AcpProtocolError(AcpErrorCode.InvalidRequest, 'Cannot switch model while a prompt is in flight.')\n let configOptions = this.applyConfigSelection(runtime, params.configId, params.value)\n if (isModelSwitch)\n this.selectModel(runtime, params.value)\n if (isModeSwitch) {\n runtime.modeId = params.value\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'current_mode_update',\n currentModeId: params.value,\n })\n }\n runtime.config.set(params.configId, params.value)\n if (isModelSwitch)\n configOptions = runtime.configOptions\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'config_option_update',\n configOptions,\n })\n return { configOptions }\n }\n\n /**\n * Rebind a live session to the provider + model of the selected registry\n * choice. The agent is NOT rebuilt — only the router's delegate and the run\n * model change — so execution handles and background tasks survive a switch.\n */\n private selectModel(runtime: AcpSessionRuntime, choiceId: string): void {\n const choice = this.modelChoices.find(candidate => candidate.id === choiceId)\n if (!choice)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown model: ${choiceId}`)\n runtime.setProviderDelegate?.(this.providerForChoiceId(choice.id))\n runtime.runModel = choice.model\n this.refreshModelDependentConfigOptions(runtime, choice.id)\n }\n\n private selectMode(runtime: AcpSessionRuntime, modeId: string): SessionConfigOption[] {\n if (!this.modes.some(mode => mode.id === modeId))\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown mode: ${modeId}`)\n runtime.modeId = modeId\n return this.applyConfigSelection(runtime, MODE_CONFIG_ID, modeId)\n }\n\n private runConfig(runtime: AcpSessionRuntime): { thinking?: ThinkingLevel, modelOptions?: Record<string, boolean> } {\n const thinking = configValue(runtime.configOptions, THINKING_CONFIG_ID)\n const modelOptions: Record<string, boolean> = {}\n for (const option of runtime.configOptions) {\n if (!isGeneratedModelOptionConfig(option.id) || option.currentValue !== 'on')\n continue\n modelOptions[option.id.slice(MODEL_OPTION_CONFIG_PREFIX.length)] = true\n }\n return {\n ...(isThinkingLevel(thinking) ? { thinking } : {}),\n ...(Object.keys(modelOptions).length > 0 ? { modelOptions } : {}),\n }\n }\n\n private refreshModelDependentConfigOptions(runtime: AcpSessionRuntime, choiceId: string): void {\n const insertAfter = (option: SessionConfigOption) => option.id === MODEL_CONFIG_ID\n const base = runtime.configOptions.filter(option => option.id !== THINKING_CONFIG_ID && !isGeneratedModelOptionConfig(option.id))\n const generated = this.modelDependentConfigOptions(choiceId, runtime.config)\n const index = base.findIndex(insertAfter)\n runtime.configOptions = index === -1\n ? [...base, ...generated]\n : [...base.slice(0, index + 1), ...generated, ...base.slice(index + 1)]\n }\n\n private modelDependentConfigOptions(choiceId: string | undefined, previous?: Map<string, unknown>): SessionConfigOption[] {\n if (!choiceId)\n return []\n const choice = this.modelChoices.find(candidate => candidate.id === choiceId)\n if (!choice)\n return []\n const options: SessionConfigOption[] = []\n if (choice.reasoning === true) {\n const current = previous?.get(THINKING_CONFIG_ID)\n options.push({\n id: THINKING_CONFIG_ID,\n name: 'Thinking',\n type: 'select',\n category: 'thought_level',\n currentValue: isThinkingLevel(current) ? current : 'off',\n options: validThinkingLevels.map(level => ({ value: level, name: thinkingLabel(level) })),\n })\n }\n for (const option of choice.options ?? []) {\n const id = `${MODEL_OPTION_CONFIG_PREFIX}${option.id}`\n const current = previous?.get(id)\n options.push({\n id,\n name: option.label,\n type: 'select',\n currentValue: current === 'on' ? 'on' : 'off',\n ...(option.description ? { description: option.description } : {}),\n options: [{ value: 'off', name: 'Off' }, { value: 'on', name: 'On' }],\n })\n }\n return options\n }\n\n /** Reflect a `select` choice back into the advertised option set's `currentValue`. */\n private applyConfigSelection(runtime: AcpSessionRuntime, configId: string, value: string): SessionConfigOption[] {\n const option = runtime.configOptions.find(candidate => candidate.id === configId)\n if (!option)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown config option: ${configId}`)\n if (!configOptionHasValue(option, value))\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Invalid value for config option ${configId}: ${value}`)\n runtime.configOptions = runtime.configOptions.map(candidate =>\n candidate.id === configId ? { ...candidate, currentValue: value } : candidate,\n )\n return runtime.configOptions\n }\n\n private async createRuntime(params: NewSessionRequest | LoadSessionRequest | ResumeSessionRequest, requestedSessionId?: string, mustExist = false): Promise<AcpSessionRuntime> {\n if (requestedSessionId) {\n const existing = this.sessions.get(requestedSessionId)\n if (existing) {\n if (existing.cwd !== params.cwd)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Session ${requestedSessionId} belongs to cwd ${existing.cwd}, not ${params.cwd}.`)\n const nextAdditionalDirectories = params.additionalDirectories ?? existing.additionalDirectories\n const nextMcpServers = params.mcpServers === undefined\n ? existing.mcpServers\n : acpMcpServersToZidane(params.mcpServers)\n if (!sameStringArray(existing.additionalDirectories, nextAdditionalDirectories)) {\n throw new AcpProtocolError(\n AcpErrorCode.InvalidParams,\n `Session ${requestedSessionId} is already active with different additionalDirectories; close it before resuming with changed roots.`,\n )\n }\n if (!sameJson(existing.mcpServers, nextMcpServers)) {\n throw new AcpProtocolError(\n AcpErrorCode.InvalidParams,\n `Session ${requestedSessionId} is already active with different MCP servers; close it before resuming with changed MCP configuration.`,\n )\n }\n const nextClientTools = parseClientToolSpecs(params._meta) ?? existing.clientTools\n if (!sameJson(existing.clientTools, nextClientTools)) {\n throw new AcpProtocolError(\n AcpErrorCode.InvalidParams,\n `Session ${requestedSessionId} is already active with different client tools; close it before resuming with changed tools.`,\n )\n }\n return existing\n }\n }\n\n const mcpServers = acpMcpServersToZidane(params.mcpServers)\n const clientTools = parseClientToolSpecs(params._meta) ?? []\n const base = this.options.preset ?? withAcpDefaultTools(basic)\n const agentOptions = this.options.agentOptions ?? {}\n const hostTools = mergeTools(base.tools, agentOptions.tools, this.options.tools)\n assertNoClientToolClash(hostTools, clientTools)\n const session = await this.resolveSession(requestedSessionId, params.cwd, mustExist)\n const execution = this.resolveExecution(params)\n // In model-registry mode, bind the agent to a per-session router so a later\n // `session/set_config_option` can swap the provider WITHOUT rebuilding the\n // agent (a rebuild would destroy the execution handle + background tasks).\n const initialChoiceId = this.defaultModelChoiceId\n const router = initialChoiceId !== undefined\n ? createProviderRouter(this.providerForChoiceId(initialChoiceId))\n : undefined\n const provider = router ? router.provider : this.resolveProvider()\n const runModel = initialChoiceId !== undefined\n ? this.modelChoices.find(choice => choice.id === initialChoiceId)!.model\n : this.options.model\n const sessionId = session.id\n const tools = clientTools.length > 0\n ? { ...hostTools, ...createClientDeclaredTools(clientTools, { client: this.requirePeer(), sessionId }) }\n : hostTools\n const wrappedTools = wrapToolsForAcpClient(tools, {\n client: this.requirePeer(),\n sessionId,\n capabilities: this.clientCapabilities,\n useClientFileSystem: this.options.useClientFileSystem,\n useClientTerminal: this.options.useClientTerminal,\n })\n // Overridable: the preset, `agentOptions` and `behavior` all win over the ACP default.\n const behavior = { cacheTtl: ACP_CACHE_TTL, ...base.behavior, ...agentOptions.behavior, ...this.options.behavior }\n const agent = createAgent({\n ...base,\n ...agentOptions,\n provider,\n execution,\n session,\n tools: wrappedTools,\n behavior,\n mcpServers: mergeMcpServers(base.mcpServers, agentOptions.mcpServers, this.options.agentOptions?.mcpServers, mcpServers),\n ...(this.options.system ? { system: this.options.system } : {}),\n })\n\n const runtime: AcpSessionRuntime = {\n sessionId,\n cwd: params.cwd,\n additionalDirectories: params.additionalDirectories ?? [],\n mcpServers,\n clientTools,\n session,\n execution,\n agent,\n provider,\n tools: wrappedTools,\n modeId: this.defaultModeId,\n configOptions: cloneConfigOptions(this.defaultConfigOptions),\n config: new Map(),\n ...(runModel !== undefined ? { runModel } : {}),\n ...(router ? { setProviderDelegate: router.setDelegate } : {}),\n }\n this.installHookAdapter(runtime)\n const promptFreeze = installAcpPromptCache({ agent, session, key: `acp:${agentOptions.name ?? base.name ?? 'agent'}`, freeze: this.options.freezeSystemPrompt !== false })\n if (promptFreeze)\n this.promptFreezes.set(runtime, promptFreeze)\n this.sessions.set(sessionId, runtime)\n session.setMeta('acp.cwd', params.cwd)\n session.setMeta('acp.additionalDirectories', params.additionalDirectories ?? [])\n if (session.store)\n await session.save().catch(() => undefined)\n return runtime\n }\n\n private async resolveSession(sessionId: string | undefined, cwd: string, mustExist: boolean): Promise<Session> {\n const store = this.options.store\n if (sessionId && this.sessions.has(sessionId))\n return this.sessions.get(sessionId)!.session\n if (sessionId && store) {\n const existing = await loadSession(store, sessionId)\n if (existing)\n return existing\n if (mustExist)\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n }\n else if (sessionId && mustExist) {\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n }\n // The shared lifecycle factory: cwd + project root (the editor's\n // workspace), default agent, title — same stamping as every surface.\n const created = await newSession(store, { cwd, title: 'ACP session', ...(sessionId ? { id: sessionId } : {}) })\n if (store)\n await created.save()\n return created\n }\n\n private resolveExecution(params: NewSessionRequest | LoadSessionRequest | ResumeSessionRequest) {\n if (typeof this.options.execution === 'function')\n return this.options.execution(params)\n return this.options.execution ?? createProcessContext({ cwd: params.cwd })\n }\n\n private resolveProvider(): Provider {\n // Registry mode: the default choice's provider backs initialization-time\n // reads (e.g. prompt capabilities). Per-session routing is handled in\n // `createRuntime`/`selectModel`.\n if (this.defaultModelChoiceId !== undefined)\n return this.providerForChoiceId(this.defaultModelChoiceId)\n const provider = this.options.provider\n if (provider === undefined)\n throw new AcpProtocolError(AcpErrorCode.InternalError, 'No provider configured.')\n return typeof provider === 'function' ? provider() : provider\n }\n\n private installHookAdapter(runtime: AcpSessionRuntime): void {\n const seenTools = new Set<string>()\n\n runtime.agent.hooks.hook('tool:gate', (ctx) => {\n if (runtime.modeId !== PLAN_MODE_ID || isPlanReadOnlyTool(ctx.name, runtime))\n return\n ctx.block = true\n ctx.reason = `Plan mode is read-only. Switch to Build mode before using \\`${ctx.name}\\`.`\n })\n runtime.agent.hooks.hook('mcp:tool:gate', (ctx) => {\n if (runtime.modeId !== PLAN_MODE_ID)\n return\n ctx.block = true\n ctx.reason = `Plan mode is read-only. Switch to Build mode before using MCP tool \\`${ctx.tool}\\`.`\n })\n\n runtime.agent.hooks.hook('stream:text', ({ delta, turnId }) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'agent_message_chunk',\n messageId: turnId,\n content: { type: 'text', text: delta },\n })\n })\n runtime.agent.hooks.hook('stream:thinking', ({ delta, turnId }) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'agent_thought_chunk',\n messageId: turnId,\n content: { type: 'text', text: delta },\n })\n })\n runtime.agent.hooks.hook('tool:gate', async (ctx) => {\n if (!this.shouldRequestPermission(ctx.name, ctx.input, runtime))\n return\n const key = permissionKey(ctx.name, ctx.input)\n const cached = runtime.config.get(key)\n if (cached === 'allow')\n return\n if (cached === 'reject') {\n ctx.block = true\n ctx.reason = 'Rejected by prior ACP permission decision.'\n return\n }\n const outcome = await this.requestPermission(runtime, {\n toolCallId: ctx.callId,\n title: ctx.name,\n kind: toolKindForName(ctx.name),\n status: 'pending',\n rawInput: ctx.input,\n })\n if (outcome.outcome === 'cancelled') {\n ctx.block = true\n ctx.reason = 'Cancelled by ACP client.'\n return\n }\n if (outcome.optionId === 'allow_always')\n runtime.config.set(key, 'allow')\n if (outcome.optionId === 'reject_always')\n runtime.config.set(key, 'reject')\n if (outcome.optionId.startsWith('reject')) {\n ctx.block = true\n ctx.reason = 'Rejected by ACP client.'\n }\n })\n runtime.agent.hooks.hook('tool:dispatched', (ctx) => {\n seenTools.add(ctx.callId)\n const status = ctx.outcome === 'gate-block' || ctx.outcome === 'invalid-input' || ctx.outcome === 'unknown' ? 'failed' : 'pending'\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call',\n toolCallId: ctx.callId,\n title: ctx.name,\n kind: toolKindForName(ctx.name),\n status,\n rawInput: ctx.input,\n ...(status === 'failed' ? { rawOutput: ctx.reason ?? ctx.outcome } : {}),\n })\n })\n runtime.agent.hooks.hook('tool:before', (ctx) => {\n if (!seenTools.has(ctx.callId)) {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call',\n toolCallId: ctx.callId,\n title: ctx.name,\n kind: toolKindForName(ctx.name),\n status: 'in_progress',\n rawInput: ctx.input,\n })\n return\n }\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'in_progress',\n })\n })\n runtime.agent.hooks.hook('tool:after', (ctx) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'completed',\n content: toolResultToAcpContent(ctx.result),\n rawOutput: ctx.result,\n })\n })\n runtime.agent.hooks.hook('tool:error', (ctx) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'failed',\n rawOutput: errorMessage(ctx.error),\n })\n })\n runtime.agent.hooks.hook('tool:cancelled', (ctx) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'failed',\n rawOutput: ctx.reason ?? 'cancelled',\n })\n })\n runtime.agent.hooks.hook('turn:after', ({ usage, cumulativeUsage }) => {\n // ACP `usage_update.used` is \"tokens currently in context\" and must track\n // `size`. Report the latest turn's effective input (input + cache read +\n // cache creation) — NOT the run-cumulative total, which would climb past\n // the window across turns. `cost` stays cumulative per the ACP spec.\n // Emit only when a window size is resolvable (never fabricate `size`) and\n // when occupancy is known (skip 0-token placeholder/aborted turns so we\n // don't reset the client's context meter).\n const size = this.resolveContextWindow(runtime)\n if (size === undefined)\n return\n const used = effectiveInputFromTurn(usage)\n if (used <= 0)\n return\n const cost = usageCost(cumulativeUsage.cost)\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'usage_update',\n used,\n size,\n ...(cost ? { cost } : {}),\n })\n })\n }\n\n private resolveContextWindow(runtime: AcpSessionRuntime): number | undefined {\n if (typeof this.options.contextWindow === 'number' && this.options.contextWindow > 0)\n return this.options.contextWindow\n const fromBehavior = this.options.behavior?.autoCompact\n if (fromBehavior && typeof fromBehavior === 'object' && typeof fromBehavior.contextWindow === 'number' && fromBehavior.contextWindow > 0)\n return fromBehavior.contextWindow\n // Read the session's CURRENT provider (router-aware) so usage `size` tracks\n // the selected model's window after a `session/set_config_option` switch.\n // `typeof` despite the declared type: `Provider.meta` carries an open\n // `Record<string, unknown>` tail, so a third-party provider can still put a\n // string or null under `contextWindow` at runtime. This value feeds\n // `usage_update.size` directly, with no downstream validation.\n const fromMeta = runtime.provider.meta.contextWindow\n if (typeof fromMeta === 'number' && Number.isFinite(fromMeta) && fromMeta > 0)\n return fromMeta\n return undefined\n }\n\n private shouldRequestPermission(name: string, input: Record<string, unknown>, runtime: AcpSessionRuntime): boolean {\n const policy = this.options.permission\n if (policy?.enabled !== true || !this.peer)\n return false\n if (runtime.clientTools.some(tool => tool.name === name && tool.mutating))\n return true\n if (policy.toolMatcher)\n return policy.toolMatcher(name, input)\n return name === 'shell' || name === 'write_file' || name === 'edit' || name === 'multi_edit'\n }\n\n private async requestPermission(runtime: AcpSessionRuntime, toolCall: ToolCallUpdate): Promise<RequestPermissionOutcome> {\n const peer = this.requirePeer()\n const request = peer.sendRequest('session/request_permission', {\n sessionId: runtime.sessionId,\n toolCall,\n options: this.options.permission?.options ?? DEFAULT_PERMISSION_OPTIONS,\n }) as Promise<{ outcome?: RequestPermissionOutcome }>\n const aborted = new Promise<{ outcome: RequestPermissionOutcome }>((resolve) => {\n const signal = runtime.abortController?.signal\n if (!signal)\n return\n if (signal.aborted) {\n resolve({ outcome: { outcome: 'cancelled' } })\n return\n }\n signal.addEventListener('abort', () => resolve({ outcome: { outcome: 'cancelled' } }), { once: true })\n })\n const response = await Promise.race([request, aborted])\n return response.outcome ?? { outcome: 'cancelled' }\n }\n\n private async sessionUpdate(sessionId: string, update: SessionUpdate): Promise<void> {\n await this.notify('session/update', { sessionId, update })\n }\n\n private requireSession(sessionId: string): AcpSessionRuntime {\n const runtime = this.sessions.get(sessionId)\n if (!runtime)\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n return runtime\n }\n\n private requirePeer(): AcpPeer {\n if (!this.peer) {\n return {\n sendNotification: () => undefined,\n sendRequest: () => Promise.reject(new AcpProtocolError(AcpErrorCode.MethodNotFound, 'No ACP client peer is attached.')),\n }\n }\n return this.peer\n }\n}\n\n/** Error with a JSON-RPC error code. Throwing it from a handler produces an error response with that code and data. */\nexport class AcpProtocolError extends Error {\n /**\n * @param code - JSON-RPC error code, usually an `AcpErrorCode` value.\n * @param message - Human-readable error message.\n * @param data - Optional extra data sent in the error response.\n */\n constructor(readonly code: number, message: string, readonly data?: unknown) {\n super(message)\n this.name = 'AcpProtocolError'\n }\n}\n\n/**\n * A provider that forwards every call to a swappable delegate. Lets a session\n * change its underlying provider (and thus credentials) on a model switch\n * without rebuilding the agent — the loop reads `formatTools` / message builders\n * / `meta` / `stream` fresh each run, and switches only happen between prompts.\n */\nfunction createProviderRouter(initial: Provider): { provider: Provider, setDelegate: (provider: Provider) => void } {\n let delegate = initial\n const provider: Provider = {\n get name() { return delegate.name },\n get meta() { return delegate.meta },\n formatTools: tools => delegate.formatTools(tools),\n userMessage: content => delegate.userMessage(content),\n assistantMessage: content => delegate.assistantMessage(content),\n toolResultsMessage: results => delegate.toolResultsMessage(results),\n stream: (options, callbacks) => delegate.stream(options, callbacks),\n promptMessage: parts => routePromptMessage(delegate, parts),\n classifyError: err => (delegate.classifyError ? delegate.classifyError(err) : null),\n countTokens: (payload, signal) => (delegate.countTokens ? delegate.countTokens(payload, signal) : Promise.resolve(null)),\n }\n return { provider, setDelegate: (next) => { delegate = next } }\n}\n\nfunction routePromptMessage(delegate: Provider, parts: PromptPart[]) {\n if (delegate.promptMessage)\n return delegate.promptMessage(parts)\n return defaultPromptMessage(parts)\n}\n\nfunction mergeTools(...sources: Array<Record<string, ToolDef> | undefined>): Record<string, ToolDef> | undefined {\n const out: Record<string, ToolDef> = {}\n for (const source of sources) {\n if (source)\n Object.assign(out, source)\n }\n return Object.keys(out).length > 0 ? out : undefined\n}\n\nfunction mergeMcpServers(...sources: Array<readonly McpServerConfig[] | undefined>): McpServerConfig[] {\n const byName = new Map<string, McpServerConfig>()\n for (const source of sources) {\n for (const server of source ?? [])\n byName.set(server.name, server)\n }\n return [...byName.values()]\n}\n\nfunction cloneConfigOptions(options: readonly SessionConfigOption[]): SessionConfigOption[] {\n return options.map(option => ({\n ...option,\n options: option.options.map(item => 'group' in item\n ? { ...item, options: item.options.map(child => ({ ...child })) }\n : { ...item }) as SessionConfigOption['options'],\n }))\n}\n\nfunction configOptionHasValue(option: SessionConfigOption, value: string): boolean {\n for (const item of option.options) {\n if ('group' in item) {\n if (item.options.some(child => child.value === value))\n return true\n }\n else if (item.value === value) {\n return true\n }\n }\n return false\n}\n\nfunction configValue(options: readonly SessionConfigOption[], id: string): string | undefined {\n return options.find(option => option.id === id)?.currentValue\n}\n\nfunction isGeneratedModelOptionConfig(id: string): boolean {\n return id.startsWith(MODEL_OPTION_CONFIG_PREFIX)\n}\n\nfunction thinkingLabel(level: ThinkingLevel): string {\n return level === 'xhigh'\n ? 'Extra high'\n : level.charAt(0).toUpperCase() + level.slice(1)\n}\n\nfunction sameStringArray(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index])\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n return stableStringify(left) === stableStringify(right)\n}\n\nfunction asObject<T>(value: unknown): T {\n if (!isObject(value))\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, 'Expected object parameters.')\n return value as T\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeId(id: unknown) {\n return typeof id === 'string' || typeof id === 'number' || id === null ? id : null\n}\n\nfunction toRpcError(err: unknown): { code: number, message: string, data?: unknown } {\n if (err instanceof AcpProtocolError)\n return { code: err.code, message: err.message, ...(err.data !== undefined ? { data: err.data } : {}) }\n if (err instanceof ClientToolSpecError)\n return { code: err.code, message: err.message }\n return { code: AcpErrorCode.InternalError, message: err instanceof Error ? err.message : String(err) }\n}\n\nfunction sessionInfo(runtime: AcpSessionRuntime): SessionInfo {\n return {\n sessionId: runtime.sessionId,\n cwd: runtime.cwd,\n additionalDirectories: runtime.additionalDirectories,\n title: typeof runtime.session.metadata.title === 'string' ? runtime.session.metadata.title : null,\n updatedAt: new Date().toISOString(),\n }\n}\n\nfunction permissionKey(name: string, input: Record<string, unknown>): string {\n return `permission:${name}:${stableStringify(input)}`\n}\n\nfunction stableStringify(value: unknown): string {\n if (!isObject(value))\n return JSON.stringify(value)\n const keys = Object.keys(value).sort()\n const out: Record<string, unknown> = {}\n for (const key of keys)\n out[key] = value[key]\n return JSON.stringify(out)\n}\n\nfunction reachedMaxTurns(stats: AgentStats, behavior: AgentOptions['behavior'] | undefined): boolean {\n const maxTurns = behavior?.maxTurns\n return typeof maxTurns === 'number' && stats.turns >= maxTurns && lastFinishReason(stats.turnUsage) !== 'length'\n}\n\nfunction lastFinishReason(turnUsage: TurnUsage[] | undefined) {\n for (let i = (turnUsage?.length ?? 0) - 1; i >= 0; i--) {\n const reason = turnUsage?.[i]?.finishReason\n if (reason)\n return reason\n }\n return undefined\n}\n","import type { Readable, Writable } from 'node:stream'\nimport type { AcpServerOptions } from './types'\nimport { createJsonRpcConnection } from './json-rpc'\nimport { createAcpServer } from './server'\n\nexport { CLIENT_TOOL_CALL_METHOD, CLIENT_TOOL_CANCEL_METHOD, createClientDeclaredTools, parseClientToolSpecs } from './client-declared-tools'\nexport type { AcpClientToolSpec, ClientToolCallResponse } from './client-declared-tools'\nexport { wrapToolsForAcpClient } from './client-tools'\nexport type { AcpClientToolOptions } from './client-tools'\nexport { createJsonRpcConnection, JsonRpcRemoteError } from './json-rpc'\nexport type { JsonRpcConnection, JsonRpcConnectionOptions } from './json-rpc'\nexport { acpMcpServersToZidane, acpPromptToPromptParts, sessionBlocksToAcp, stopReasonFromRun, toolResultToAcpContent } from './mapping'\nexport { AcpProtocolError, createAcpServer, withAcpDefaultTools } from './server'\nexport type { AcpServer } from './server'\nexport type * from './types'\n\n/** Options for {@link runAcpStdioServer}: the {@link AcpServerOptions} plus the stdio transport settings. */\nexport interface RunAcpStdioServerOptions extends AcpServerOptions {\n /**\n * Stream to read client messages from.\n * @default process.stdin\n */\n input?: Readable\n /**\n * Stream to write agent messages to.\n * @default process.stdout\n */\n output?: Writable\n /**\n * Wire framing. `'newline'` is newline-delimited JSON, as ACP stdio requires.\n * @default 'newline'\n */\n framing?: 'content-length' | 'newline'\n /** Called with transport errors and failures that cannot be answered over the wire. */\n onError?: (error: Error) => void\n}\n\n/**\n * Runs an ACP agent over stdio, usually as the entry point of an editor-facing agent process.\n * Creates the server with {@link createAcpServer}, connects it to a JSON-RPC connection on `input` and `output`, and starts reading. Throws if neither `provider` nor `models` is set.\n * @param options - Server options plus the stdio streams and framing.\n * @returns The server, the connection, and a `close` function that closes the connection and destroys every open session.\n * @example\n * ```ts\n * import { runAcpStdioServer } from 'zidane/acp'\n * import { anthropic } from 'zidane/providers'\n *\n * const { close } = runAcpStdioServer({\n * provider: anthropic(),\n * model: 'claude-sonnet-4-5',\n * })\n *\n * process.on('SIGINT', () => {\n * void close().then(() => process.exit(0))\n * })\n * ```\n */\nexport function runAcpStdioServer(options: RunAcpStdioServerOptions) {\n const server = createAcpServer(options)\n const connection = createJsonRpcConnection({\n input: options.input ?? process.stdin,\n output: options.output ?? process.stdout,\n framing: options.framing,\n onError: options.onError,\n onRequest: message => server.handleMessage(message),\n onNotification: async (message) => {\n await server.handleMessage(message)\n },\n })\n server.setPeer(connection)\n connection.start()\n return {\n server,\n connection,\n async close() {\n connection.close()\n await server.close()\n },\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acp-BIInKhVI.js","names":["isRecord","lastFinishReason","process","basic"],"sources":["../src/start/shared-options.ts","../src/acp/client-declared-tools.ts","../src/acp/mapping.ts","../src/acp/client-tools.ts","../src/acp/plan-mode.ts","../src/acp/prompt-cache.ts","../src/acp/server.ts","../src/acp/index.ts"],"sourcesContent":["import type { ParseArgsConfig } from 'node:util'\nimport type { McpServerConfig, ThinkingLevel } from '../types'\nimport { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport { parseArgs } from 'node:util'\n\nexport const validThinkingLevels = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max', 'adaptive'] as const satisfies readonly ThinkingLevel[]\n\nexport const startProviderNames = ['anthropic', 'openai', 'openrouter', 'cerebras', 'xai', 'google', 'google-vertex', 'arcee', 'baseten', 'neuralwatt', 'local', 'openai-compat'] as const\nexport type StartProviderName = typeof startProviderNames[number]\n\nexport const startPresetNames = ['basic'] as const\nexport type StartPresetName = typeof startPresetNames[number]\n\nexport const startFormatNames = ['zidane', 'provider'] as const\nexport type StartFormatName = typeof startFormatNames[number]\n\nexport interface StartLocalOptions {\n system?: string\n prompt: string\n model?: string\n baseURL?: string\n apiKeyEnv?: string\n headersEnv?: string\n extraHeaders?: Record<string, string>\n vision?: boolean\n imageInToolResult?: boolean\n /** Headless runs (`--json` / `--stream-json`): add the opt-in `codemode` tool (`behavior.codemode`). */\n codemode?: boolean\n temperature?: number\n seed?: number\n preset: StartPresetName\n thinking: ThinkingLevel\n provider: StartProviderName\n context: string\n image?: string\n cwd?: string\n env?: Record<string, string>\n pregame?: { name: string, content: string }\n sandboxId?: string\n sandboxOnDestroy?: 'kill' | 'pause' | 'leave'\n mcp?: McpServerConfig[]\n sessionDb?: string\n sessionId?: string\n schema?: Record<string, unknown>\n json: boolean\n streamJson: boolean\n format: StartFormatName\n}\n\nexport interface ParseStartLocalOptionsConfig {\n requirePrompt?: boolean\n usage?: () => string\n}\n\nexport class StartUsageError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'StartUsageError'\n }\n}\n\n/**\n * The shared `bun start` / `zidane run` option table. Exported so\n * `parseStartArgs` (start CLI) can compose it with the Restate-only options\n * and parse argv ONCE — two diverging tables would let new flags silently\n * drift between the two parsers.\n */\nexport const startLocalArgOptions = {\n 'help': { type: 'boolean', short: 'h', default: false },\n 'prompt': { type: 'string', short: 'p' },\n 'model': { type: 'string', short: 'm' },\n 'preset': { type: 'string', short: 't', default: 'basic' },\n 'system': { type: 'string', short: 's' },\n 'thinking': { type: 'string', default: 'off' },\n 'provider': { type: 'string', default: 'anthropic' },\n 'base-url': { type: 'string' },\n 'api-key-env': { type: 'string' },\n 'headers-env': { type: 'string' },\n 'header': { type: 'string', multiple: true },\n 'vision': { type: 'boolean' },\n 'image-in-tool-result': { type: 'boolean' },\n 'codemode': { type: 'boolean' },\n 'temperature': { type: 'string' },\n 'seed': { type: 'string' },\n 'context': { type: 'string', short: 'c', default: 'process' },\n 'image': { type: 'string' },\n 'cwd': { type: 'string' },\n 'env': { type: 'string', multiple: true },\n 'pass-env': { type: 'string', multiple: true },\n 'pregame': { type: 'string' },\n 'sandbox': { type: 'string' },\n 'sandbox-on-destroy': { type: 'string' },\n 'mcp': { type: 'string' },\n 'session-db': { type: 'string' },\n 'session-id': { type: 'string' },\n 'json-schema': { type: 'string' },\n 'schema': { type: 'string' },\n 'json': { type: 'boolean', default: false },\n 'stream-json': { type: 'boolean', default: false },\n 'format': { type: 'string', default: 'zidane' },\n} as const satisfies ParseArgsConfig['options']\n\n/**\n * Strict argv parse shared by the start CLIs. `strict: true` rejects unknown\n * flags and stray positionals loudly — without it, a typo'd flag's value\n * silently leaks into the run (e.g. as a bogus prompt). Parse failures are\n * rethrown as {@link StartUsageError}.\n */\nexport function parseStartArgValues(\n argv: readonly string[],\n options: ParseArgsConfig['options'],\n): Record<string, unknown> {\n try {\n const { values } = parseArgs({\n args: [...argv],\n options,\n strict: true,\n })\n return values\n }\n catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n throw new StartUsageError(`${msg}\\n\\nRun with --help for usage.`)\n }\n}\n\nexport function parseStartLocalOptions(\n argv: readonly string[],\n config: ParseStartLocalOptionsConfig = {},\n): StartLocalOptions {\n return buildStartLocalOptions(parseStartArgValues(argv, startLocalArgOptions), config)\n}\n\n/** Assemble {@link StartLocalOptions} from already-parsed argv values. */\nexport function buildStartLocalOptions(\n values: Record<string, unknown>,\n config: ParseStartLocalOptionsConfig = {},\n): StartLocalOptions {\n const { requirePrompt = true, usage = startLocalUsage } = config\n\n if (values.help === true)\n throw new StartUsageError(usage())\n\n const prompt = values.prompt as string | undefined\n if (requirePrompt && (!prompt || prompt.trim() === ''))\n throw new StartUsageError(usage())\n\n const thinkingRaw = (values.thinking as string | undefined) || 'off'\n if (!validThinkingLevels.includes(thinkingRaw as ThinkingLevel))\n throw new Error(`Unknown thinking level: ${thinkingRaw}. Available: ${validThinkingLevels.join(', ')}`)\n\n const provider = ((values.provider as string | undefined) || 'anthropic') as StartProviderName\n if (!startProviderNames.includes(provider))\n throw new Error(`Unknown provider: ${provider}. Available: ${startProviderNames.join(', ')}`)\n\n const preset = ((values.preset as string | undefined) || 'basic') as StartPresetName\n if (!startPresetNames.includes(preset))\n throw new Error(`Unknown preset: ${preset}. Available: ${startPresetNames.join(', ')}`)\n\n if (values.json === true && values['stream-json'] === true)\n throw new StartUsageError('Use either `--json` or `--stream-json`, not both.')\n\n const schema = parseOutputSchema(values['json-schema'] as string | undefined, values.schema as string | undefined)\n\n const format = ((values.format as string | undefined) || 'zidane') as StartFormatName\n if (!startFormatNames.includes(format))\n throw new Error(`Unknown format: ${format}. Available: ${startFormatNames.join(', ')}`)\n\n const baseURL = values['base-url'] as string | undefined\n const apiKeyEnv = values['api-key-env'] as string | undefined\n const headersEnv = values['headers-env'] as string | undefined\n const extraHeaders = parseHeaderArgs(values.header as string[] | undefined, '--header')\n const temperature = parseOptionalNumber(values.temperature as string | undefined, '--temperature')\n const seed = parseOptionalInteger(values.seed as string | undefined, '--seed')\n const env = parseEnvArgs(values.env as string[] | undefined, values['pass-env'] as string[] | undefined)\n const context = (values.context as string | undefined) || 'process'\n const pregame = loadPregame(values.pregame as string | undefined, context)\n const sandboxId = resolveSandboxId(values.sandbox as string | undefined, context)\n const sandboxOnDestroy = resolveSandboxOnDestroy(values['sandbox-on-destroy'] as string | undefined, context)\n\n return {\n system: values.system as string | undefined,\n prompt: prompt ?? '',\n model: values.model as string | undefined,\n ...(baseURL !== undefined ? { baseURL } : {}),\n ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),\n ...(headersEnv !== undefined ? { headersEnv } : {}),\n ...(Object.keys(extraHeaders).length > 0 ? { extraHeaders } : {}),\n ...(values.vision === true ? { vision: true } : {}),\n ...(values['image-in-tool-result'] === true ? { imageInToolResult: true } : {}),\n ...(values.codemode === true ? { codemode: true } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n ...(seed !== undefined ? { seed } : {}),\n preset,\n thinking: thinkingRaw as ThinkingLevel,\n provider,\n context,\n image: values.image as string | undefined,\n cwd: values.cwd as string | undefined,\n ...(Object.keys(env).length > 0 ? { env } : {}),\n ...(pregame ? { pregame } : {}),\n ...(sandboxId ? { sandboxId } : {}),\n ...(sandboxOnDestroy ? { sandboxOnDestroy } : {}),\n mcp: parseMcpConfig(values.mcp as string | undefined),\n sessionDb: values['session-db'] as string | undefined,\n sessionId: values['session-id'] as string | undefined,\n ...(schema !== undefined ? { schema } : {}),\n json: values.json === true || (schema !== undefined && values['stream-json'] !== true),\n streamJson: values['stream-json'] === true,\n format,\n }\n}\n\nfunction parseOutputSchema(inline: string | undefined, path: string | undefined): Record<string, unknown> | undefined {\n if (inline !== undefined && path !== undefined)\n throw new StartUsageError('Use either --json-schema or --schema, not both.')\n if (inline === undefined && path === undefined)\n return undefined\n const flag = inline !== undefined ? '--json-schema' : '--schema'\n let schema: unknown\n try {\n schema = JSON.parse(inline ?? readFileSync(path!, 'utf8'))\n }\n catch (err) {\n throw new StartUsageError(`Invalid ${flag}: ${err instanceof Error ? err.message : String(err)}`)\n }\n if (!schema || typeof schema !== 'object' || Array.isArray(schema))\n throw new StartUsageError(`${flag} must contain a JSON Schema object.`)\n return schema as Record<string, unknown>\n}\n\nexport function startLocalUsage(): string {\n return [\n `Usage: bun start --prompt \"your message\" \\\\`,\n ` [--provider ${startProviderNames.join('|')}] [--model <id>] [--thinking ${validThinkingLevels.join('|')}]`,\n ` [--base-url <url>] [--api-key-env <NAME>] [--headers-env <NAME>] [--header 'Name: value']`,\n ` [--vision] [--image-in-tool-result] [--temperature <f>] [--seed <n>]`,\n ` [--context process|docker|e2b|daytona] [--image node:22] [--cwd /workspace]`,\n ` [--env KEY=VALUE ...] [--pass-env VARNAME ...] [--pregame setup.sh] [--sandbox <id>] [--sandbox-on-destroy kill|pause|leave]`,\n ` [--mcp '[...]'] [--session-db ./sessions.db] [--session-id <id>] [--json|--stream-json] [--format zidane|provider]`,\n ``,\n ` --json-schema '<JSON>' or --schema <file.json> enforces structured result.output (implies --json).`,\n ` --stream-json streams COMPLETE TURNS as JSONL (one line per turn), then the result.`,\n ` --codemode adds the codemode tool to a --json / --stream-json run.`,\n ` For the full event stream (text deltas, tool calls, …) use the headless CLI's`,\n ` --output-format stream-json instead.`,\n ].join('\\n')\n}\n\n/**\n * Parse the `--mcp` argument: inline JSON (object or array) or a path to a JSON\n * file. Validates that each server declares the fields its transport requires.\n */\nexport function parseMcpConfig(raw: string | undefined): McpServerConfig[] | undefined {\n if (!raw)\n return undefined\n let text = raw.trim()\n // A value that isn't JSON is treated as a file path.\n if (!text.startsWith('[') && !text.startsWith('{'))\n text = readFileSync(text, 'utf8')\n const parsed = JSON.parse(text)\n const configs = Array.isArray(parsed) ? parsed : [parsed]\n\n for (const config of configs) {\n if (!config.name || !config.transport)\n throw new Error(`Invalid MCP config: each server needs \"name\" and \"transport\". Got: ${JSON.stringify(config)}`)\n if (config.transport === 'stdio' && !config.command)\n throw new Error(`MCP server \"${config.name}\": stdio transport requires \"command\"`)\n if ((config.transport === 'sse' || config.transport === 'streamable-http') && !config.url)\n throw new Error(`MCP server \"${config.name}\": ${config.transport} transport requires \"url\"`)\n }\n\n return configs\n}\n\nfunction parseOptionalNumber(raw: string | undefined, flag: string): number | undefined {\n if (raw === undefined)\n return undefined\n const value = Number(raw)\n if (Number.isNaN(value))\n throw new Error(`${flag} must be a number, got '${raw}'.`)\n return value\n}\n\n// `Number()` instead of `parseInt` so trailing garbage ('42x') and decimals\n// ('0.5' → 0) are rejected instead of silently truncated.\nfunction parseOptionalInteger(raw: string | undefined, flag: string): number | undefined {\n if (raw === undefined)\n return undefined\n const value = Number(raw)\n if (!Number.isInteger(value))\n throw new Error(`${flag} must be an integer, got '${raw}'.`)\n return value\n}\n\n/**\n * Build the execution-context environment from `--pass-env VARNAME` (forward\n * the named variable from the current shell) and `--env KEY=VALUE` (set a\n * value explicitly). `--pass-env` is applied first so an explicit `--env`\n * wins when both name the same key. An unset `--pass-env` variable is a hard\n * error rather than a silently-empty value.\n */\nexport function parseEnvArgs(\n envArgs: string[] | undefined,\n passEnvArgs: string[] | undefined,\n source: Record<string, string | undefined> = process.env,\n): Record<string, string> {\n const env: Record<string, string> = {}\n\n for (const name of passEnvArgs ?? []) {\n const key = name.trim()\n if (!key)\n throw new Error('--pass-env requires a variable name.')\n const value = source[key]\n if (value === undefined)\n throw new Error(`--pass-env ${key}: environment variable ${key} is not set.`)\n env[key] = value\n }\n\n for (const item of envArgs ?? []) {\n const eq = item.indexOf('=')\n const key = eq === -1 ? '' : item.slice(0, eq).trim()\n if (!key)\n throw new Error(`--env must be formatted as KEY=VALUE, got '${item}'.`)\n env[key] = item.slice(eq + 1)\n }\n\n return env\n}\n\n/**\n * Resolve the `--pregame <file>` setup script. Returns `undefined` when no path\n * is given. The script only runs in remote sandbox contexts (it's uploaded into\n * the ready sandbox before prompting); for any other context this warns and\n * ignores it rather than failing. For supported contexts the file is read\n * eagerly — consistent with `--prompt-file`/`--schema` — so a missing or\n * unreadable file surfaces as a usage error up front rather than mid-spawn.\n * The returned `name` is the basename used for the uploaded file.\n */\nexport function loadPregame(\n path: string | undefined,\n context: string,\n): { name: string, content: string } | undefined {\n if (!path)\n return undefined\n if (!supportsRemoteSandboxFlags(context)) {\n console.error(`--pregame is only supported with --context e2b or daytona; ignoring it for context '${context}'.`)\n return undefined\n }\n let content: string\n try {\n content = readFileSync(path, 'utf8')\n }\n catch (err) {\n throw new Error(`--pregame: failed to read '${path}': ${(err as Error).message}`)\n }\n return { name: basename(path), content }\n}\n\n/**\n * Resolve the `--sandbox <id>` argument. Returns `undefined` when no id is\n * given. Connecting to a pre-existing sandbox is supported by the remote\n * sandbox providers; for any other context this warns and ignores it rather\n * than failing, mirroring {@link loadPregame}. A blank value (e.g.\n * `--sandbox ''`) is treated as absent.\n */\nexport function resolveSandboxId(\n raw: string | undefined,\n context: string,\n): string | undefined {\n const id = raw?.trim()\n if (!id)\n return undefined\n if (!supportsRemoteSandboxFlags(context)) {\n console.error(`--sandbox is only supported with --context e2b or daytona; ignoring it for context '${context}'.`)\n return undefined\n }\n return id\n}\n\nconst validSandboxOnDestroyValues = ['kill', 'pause', 'leave'] as const\nexport type SandboxOnDestroyValue = typeof validSandboxOnDestroyValues[number]\n\n/**\n * Resolve the `--sandbox-on-destroy kill|pause|leave` argument. Returns\n * `undefined` when not set (the provider defaults to `'kill'` / delete).\n * Applies to remote sandbox contexts; warns and ignores for any other context,\n * mirroring {@link resolveSandboxId} and {@link loadPregame}.\n */\nexport function resolveSandboxOnDestroy(\n raw: string | undefined,\n context: string,\n): SandboxOnDestroyValue | undefined {\n const value = raw?.trim()\n if (!value)\n return undefined\n if (!supportsRemoteSandboxFlags(context)) {\n console.error(`--sandbox-on-destroy is only supported with --context e2b or daytona; ignoring it for context '${context}'.`)\n return undefined\n }\n if (!validSandboxOnDestroyValues.includes(value as SandboxOnDestroyValue))\n throw new StartUsageError(`--sandbox-on-destroy must be kill|pause|leave, got '${value}'.`)\n return value as SandboxOnDestroyValue\n}\n\nfunction supportsRemoteSandboxFlags(context: string): boolean {\n return context === 'e2b' || context === 'daytona'\n}\n\nfunction parseHeaderArgs(raw: string[] | undefined, flag: string): Record<string, string> {\n if (!raw || raw.length === 0)\n return {}\n\n const headers: Record<string, string> = {}\n for (const item of raw) {\n const colon = item.indexOf(':')\n const equals = item.indexOf('=')\n const separator = colon === -1 ? equals : equals === -1 ? colon : Math.min(colon, equals)\n if (separator <= 0)\n throw new Error(`${flag} must be formatted as \"Name: value\" or \"Name=value\".`)\n\n const name = item.slice(0, separator).trim()\n const value = item.slice(separator + 1).trim()\n if (!name || !value)\n throw new Error(`${flag} must include both a header name and value.`)\n headers[name] = value\n }\n return headers\n}\n","import type { ToolDef } from '../tools'\nimport type { AcpPeer } from './types'\nimport { AcpErrorCode } from './types'\n\n/** JSON-RPC method the agent sends to the client to run a client-declared tool. */\nexport const CLIENT_TOOL_CALL_METHOD = '_zidane/tool_call'\n\n/** Notification the agent sends when it abandons a pending {@link CLIENT_TOOL_CALL_METHOD}. */\nexport const CLIENT_TOOL_CANCEL_METHOD = '_zidane/tool_call_cancel'\n\nconst TOOL_NAME_PATTERN = /^[a-z][\\w-]{0,63}$/i\n\n/**\n * A tool the ACP client declares in `session/new` / `session/load` /\n * `session/resume` under `_meta.zidane.clientTools`. The agent sees it like\n * any other tool; execution round-trips to the client over\n * {@link CLIENT_TOOL_CALL_METHOD}.\n */\nexport interface AcpClientToolSpec {\n /** Tool name the agent exposes. Must match `/^[a-z][\\w-]{0,63}$/i` and not collide with a host tool. */\n name: string\n /** What the tool does, shown to the model. Must be non-empty. */\n description: string\n /** JSON Schema for the tool input. The root `type` must be `\"object\"`. Defaults to an empty object schema when omitted. */\n inputSchema: Record<string, unknown>\n /** Mutating tools go through permission requests and are hidden in Plan mode. */\n mutating: boolean\n}\n\n/** Reply the client returns for a {@link CLIENT_TOOL_CALL_METHOD} request. */\nexport interface ClientToolCallResponse {\n /** Text result handed to the model. Ignored unless it is a string; a missing value becomes an empty string. */\n content?: unknown\n /** When `true`, the call fails and `content` becomes the error message. */\n isError?: unknown\n}\n\n/** Malformed or colliding `_meta.zidane.clientTools`. */\nexport class ClientToolSpecError extends Error {\n readonly code = AcpErrorCode.InvalidParams\n}\n\n/**\n * Validate `_meta.zidane.clientTools`. Returns `undefined` when the key is\n * absent (so resume can keep the existing set) and throws on malformed specs.\n * @param meta - The `_meta` object of the `session/new`, `session/load` or `session/resume` request.\n */\nexport function parseClientToolSpecs(meta: Record<string, unknown> | null | undefined): AcpClientToolSpec[] | undefined {\n const zidane = meta?.zidane\n if (zidane === undefined || zidane === null)\n return undefined\n if (!isRecord(zidane))\n throw new ClientToolSpecError('_meta.zidane must be an object.')\n const raw = zidane.clientTools\n if (raw === undefined)\n return undefined\n if (!Array.isArray(raw))\n throw new ClientToolSpecError('_meta.zidane.clientTools must be an array.')\n\n const seen = new Set<string>()\n return raw.map((entry, index) => {\n if (!isRecord(entry))\n throw new ClientToolSpecError(`clientTools[${index}] must be an object.`)\n const { name, description, inputSchema, mutating } = entry\n if (typeof name !== 'string' || !TOOL_NAME_PATTERN.test(name))\n throw new ClientToolSpecError(`clientTools[${index}].name must match ${TOOL_NAME_PATTERN}.`)\n if (seen.has(name))\n throw new ClientToolSpecError(`Duplicate client tool: ${name}`)\n seen.add(name)\n if (typeof description !== 'string' || description.length === 0)\n throw new ClientToolSpecError(`clientTools[${index}].description must be a non-empty string.`)\n if (inputSchema !== undefined && (!isRecord(inputSchema) || inputSchema.type !== 'object'))\n throw new ClientToolSpecError(`clientTools[${index}].inputSchema must be a JSON Schema with type \"object\".`)\n if (mutating !== undefined && typeof mutating !== 'boolean')\n throw new ClientToolSpecError(`clientTools[${index}].mutating must be a boolean.`)\n return {\n name,\n description,\n inputSchema: inputSchema ?? { type: 'object', properties: {} },\n mutating: mutating ?? false,\n }\n })\n}\n\n/** Client tools may add to the host tool set, never shadow it. */\nexport function assertNoClientToolClash(hostTools: Record<string, ToolDef> | undefined, specs: readonly AcpClientToolSpec[]): void {\n const taken = new Set<string>()\n for (const [key, tool] of Object.entries(hostTools ?? {})) {\n taken.add(key)\n taken.add(tool.spec.name)\n }\n const clash = specs.find(spec => taken.has(spec.name))\n if (clash)\n throw new ClientToolSpecError(`Client tool \"${clash.name}\" collides with a built-in tool.`)\n}\n\n/**\n * Builds agent tools for client-declared specs.\n * Each tool sends a {@link CLIENT_TOOL_CALL_METHOD} request to the client and returns the reply text. If the call is aborted, it sends {@link CLIENT_TOOL_CANCEL_METHOD} and rejects. A reply with `isError: true` throws.\n * @param specs - Validated specs, usually from {@link parseClientToolSpecs}.\n * @param options - The peer to send requests to and the ACP session id to tag them with.\n * @returns Tools keyed by spec name.\n */\nexport function createClientDeclaredTools(\n specs: readonly AcpClientToolSpec[],\n options: { client: AcpPeer, sessionId: string },\n): Record<string, ToolDef> {\n const tools: Record<string, ToolDef> = {}\n for (const spec of specs) {\n tools[spec.name] = {\n spec: { name: spec.name, description: spec.description, inputSchema: spec.inputSchema },\n async execute(input, ctx) {\n const request = options.client.sendRequest(CLIENT_TOOL_CALL_METHOD, {\n sessionId: options.sessionId,\n toolCallId: ctx.callId,\n name: spec.name,\n input,\n }) as Promise<ClientToolCallResponse | null | undefined>\n const response = await raceAbort(request, ctx.signal, () => notifyCancel(options, ctx.callId))\n const content = typeof response?.content === 'string' ? response.content : ''\n if (response?.isError === true)\n throw new Error(content || `${spec.name} failed in the client.`)\n return content\n },\n }\n }\n return tools\n}\n\n// Best effort: the call is already abandoned, a failed notification changes nothing.\nfunction notifyCancel(options: { client: AcpPeer, sessionId: string }, toolCallId: string): void {\n try {\n void Promise.resolve(options.client.sendNotification(CLIENT_TOOL_CANCEL_METHOD, { sessionId: options.sessionId, toolCallId }))\n .catch(() => {})\n }\n catch {}\n}\n\nfunction raceAbort<T>(promise: Promise<T>, signal: AbortSignal, onCancel: () => void): Promise<T> {\n if (signal.aborted)\n return Promise.reject(signal.reason ?? new Error('Aborted.'))\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => {\n onCancel()\n reject(signal.reason ?? new Error('Aborted.'))\n }\n signal.addEventListener('abort', onAbort, { once: true })\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (err) => {\n signal.removeEventListener('abort', onAbort)\n reject(err)\n },\n )\n })\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import type { McpServerConfig, PromptPart, SessionContentBlock, ToolResultContent, TurnFinishReason, TurnUsage } from '../types'\nimport type {\n AcpMcpServer,\n AcpPromptMapping,\n ContentBlock,\n Cost,\n EmbeddedResource,\n EmbeddedResourceResource,\n McpCapabilities,\n NewSessionResponse,\n PromptCapabilities,\n SessionMode,\n SessionModeState,\n StopReason,\n ToolCallContent,\n ToolKind,\n} from './types'\nimport { resolve } from 'node:path'\nimport { toolResultToText } from '../types'\n\n/**\n * Converts MCP server entries from an ACP session request to Zidane `McpServerConfig` values.\n * `http` becomes `streamable-http`, `sse` stays `sse`, and anything else is treated as a `stdio` command.\n * @param servers - MCP servers sent by the ACP client. May be undefined.\n * @returns One config per server, or an empty array when `servers` is undefined.\n */\nexport function acpMcpServersToZidane(servers: readonly AcpMcpServer[] | undefined): McpServerConfig[] {\n if (!servers)\n return []\n return servers.map((server): McpServerConfig => {\n if (server.type === 'http') {\n return {\n name: server.name,\n transport: 'streamable-http',\n url: server.url,\n headers: headersToRecord(server.headers),\n }\n }\n if (server.type === 'sse') {\n return {\n name: server.name,\n transport: 'sse',\n url: server.url,\n headers: headersToRecord(server.headers),\n }\n }\n const stdio = server as Extract<AcpMcpServer, { command: string }>\n return {\n name: server.name,\n transport: 'stdio',\n command: stdio.command,\n args: stdio.args ?? [],\n env: envToRecord(stdio.env),\n }\n })\n}\n\nexport function promptCapabilitiesForProvider(capabilities: { vision?: boolean, audio?: boolean } | undefined): PromptCapabilities {\n return {\n image: capabilities?.vision === true,\n audio: capabilities?.audio === true,\n embeddedContext: true,\n }\n}\n\nexport function mcpCapabilities(): McpCapabilities {\n return { http: true, sse: true }\n}\n\nexport function defaultModes(modes: readonly SessionMode[] | undefined): SessionMode[] {\n return modes && modes.length > 0\n ? [...modes]\n : [\n { id: 'build', name: 'Build', description: 'Full tool access for implementation work.' },\n { id: 'plan', name: 'Plan', description: 'Planning-oriented mode; hosts may narrow tools separately.' },\n ]\n}\n\nexport function makeModeState(modes: readonly SessionMode[], currentModeId: string): SessionModeState {\n return { currentModeId, availableModes: [...modes] }\n}\n\nexport function newSessionResponse(\n sessionId: string,\n modes: readonly SessionMode[],\n currentModeId: string,\n configOptions?: NewSessionResponse['configOptions'],\n): NewSessionResponse {\n return {\n sessionId,\n modes: makeModeState(modes, currentModeId),\n ...(configOptions && configOptions.length > 0 ? { configOptions } : {}),\n }\n}\n\n/**\n * Converts the ACP prompt content blocks of a `session/prompt` request to Zidane prompt parts.\n * Images and audio without embedded data, and unknown block types, become text parts and add a warning.\n * @param prompt - Content blocks from the client.\n * @returns The prompt parts and the warnings raised while converting.\n */\nexport function acpPromptToPromptParts(prompt: readonly ContentBlock[]): AcpPromptMapping {\n const parts: PromptPart[] = []\n const warnings: string[] = []\n\n for (const block of prompt) {\n switch (block.type) {\n case 'text':\n parts.push({ type: 'text', text: block.text })\n break\n case 'image': {\n if (block.data) {\n parts.push({ type: 'image', mediaType: block.mimeType || 'image/png', data: block.data })\n }\n else {\n warnings.push(`Image resource linked instead of embedded: ${block.uri ?? 'unknown URI'}`)\n parts.push({ type: 'text', text: `[image resource: ${block.uri ?? 'unavailable'}]` })\n }\n break\n }\n case 'audio': {\n if (block.data) {\n parts.push({ type: 'audio', mediaType: block.mimeType || 'audio/mpeg', data: block.data })\n }\n else {\n warnings.push('Audio block omitted because it did not include embedded data.')\n parts.push({ type: 'text', text: '[audio resource omitted: no embedded data]' })\n }\n break\n }\n case 'resource_link':\n parts.push({ type: 'text', text: renderResourceLink(block) })\n break\n case 'resource':\n parts.push(resourceToPromptPart(block))\n break\n default:\n warnings.push('Unknown ACP content block converted to text.')\n parts.push({ type: 'text', text: JSON.stringify(block as Record<string, unknown>) })\n break\n }\n }\n\n return { prompt: parts, warnings }\n}\n\n/**\n * Converts stored session content blocks to ACP content blocks, for replaying history.\n * Thinking blocks become text. Images and documents without data become `resource_link` blocks. Audio without data and system notes are dropped.\n * @param blocks - Session content blocks.\n * @returns The matching ACP content blocks.\n */\nexport function sessionBlocksToAcp(blocks: readonly SessionContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = []\n for (const block of blocks) {\n // System notes are the harness talking to the model (mode, catalog\n // changes), not part of the user's message: they don't replay.\n if (block.type === 'text' && block.systemNote)\n continue\n if (block.type === 'text' || block.type === 'thinking') {\n out.push({ type: 'text', text: block.text })\n }\n else if (block.type === 'image') {\n out.push(imageBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, block.name))\n }\n else if (block.type === 'audio') {\n if (block.data)\n out.push({ type: 'audio', mimeType: block.mediaType, data: block.data })\n }\n else if (block.type === 'document') {\n out.push(documentBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, block.encoding, block.name))\n }\n }\n return out\n}\n\n/**\n * Converts a tool result to ACP tool call content.\n * A string becomes one text content item. Block arrays map block by block, and unsupported blocks fall back to their text form.\n * @param content - Tool result as a string or an array of result blocks.\n * @returns ACP tool call content items.\n */\nexport function toolResultToAcpContent(content: string | ToolResultContent[]): ToolCallContent[] {\n if (typeof content === 'string')\n return [{ type: 'content', content: { type: 'text', text: content } }]\n\n return content.map((block): ToolCallContent => {\n if (block.type === 'text')\n return { type: 'content', content: { type: 'text', text: block.text } }\n if (block.type === 'image') {\n return {\n type: 'content',\n content: imageBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, 'name' in block ? block.name : undefined),\n }\n }\n if (block.type === 'audio' && block.data)\n return { type: 'content', content: { type: 'audio', mimeType: block.mediaType, data: block.data } }\n if (block.type === 'document') {\n return {\n type: 'content',\n content: documentBlockToAcp(block.mediaType, 'data' in block ? block.data : undefined, 'ref' in block ? block.ref : undefined, block.encoding, 'name' in block ? block.name : undefined),\n }\n }\n return { type: 'content', content: { type: 'text', text: toolResultToText([block]) } }\n })\n}\n\n/**\n * Build a spec-valid ACP image block. `ImageContent` requires `data` +\n * `mimeType`; when we only have a reference (`ref`/uri) we fall back to a\n * `resource_link` (which requires `name` + `uri`) so we never emit an image\n * block missing its required `data`.\n */\nfunction imageBlockToAcp(mimeType: string, data: string | undefined, ref: string | undefined, name: string | undefined): ContentBlock {\n if (data)\n return { type: 'image', mimeType, data, ...(ref ? { uri: ref } : {}) }\n return { type: 'resource_link', uri: ref ?? acpSyntheticUri('image', name), name: name ?? 'image', mimeType }\n}\n\n/**\n * Build a spec-valid embedded `resource` (or a `resource_link` fallback for\n * reference-only documents). `EmbeddedResource.resource` requires a `uri`\n * plus either `text` (text payload) or `blob` (base64), so a synthetic URI is\n * minted when the source block has none.\n */\nfunction documentBlockToAcp(mimeType: string, data: string | undefined, ref: string | undefined, encoding: 'base64' | 'text' | undefined, name: string | undefined): ContentBlock {\n const uri = ref ?? acpSyntheticUri('document', name)\n if (typeof data !== 'string') {\n return { type: 'resource_link', uri, name: name ?? 'document', mimeType }\n }\n const resource: EmbeddedResourceResource = encoding === 'text'\n ? { uri, text: data, mimeType }\n : { uri, blob: data, mimeType }\n return { type: 'resource', resource }\n}\n\nfunction acpSyntheticUri(kind: string, name: string | undefined): string {\n const slug = (name ?? kind).replace(/[^\\w.-]+/g, '_')\n return `acp:///${kind}/${slug}`\n}\n\nexport function toolKindForName(name: string): ToolKind {\n if (name === 'read_file' || name === 'list_files')\n return 'read'\n if (name === 'write_file' || name === 'edit' || name === 'multi_edit')\n return 'edit'\n if (name === 'grep' || name === 'glob' || name === 'tool_search')\n return 'search'\n if (name === 'shell' || name === 'wait_task' || name === 'shell_kill')\n return 'execute'\n if (name === 'web_search' || name === 'fetch_url')\n return 'fetch'\n if (name === 'present_plan' || name === 'ask_user')\n return 'think'\n return 'other'\n}\n\n/**\n * Maps the outcome of an agent run to an ACP stop reason.\n * An abort gives `cancelled`, reaching the turn limit gives `max_turn_requests`. Otherwise the last turn finish reason decides: `length` gives `max_tokens`, `content-filter` and `error` give `refusal`, and anything else gives `end_turn`.\n * @param input - Run outcome.\n * @param input.aborted - Whether the run was cancelled.\n * @param input.turnUsage - Per-turn usage records, used for the last finish reason.\n * @param input.maxTurnsReached - Whether the run stopped at its turn limit.\n * @returns The stop reason to send in the prompt response.\n */\nexport function stopReasonFromRun(input: { aborted: boolean, turnUsage?: TurnUsage[], maxTurnsReached?: boolean }): StopReason {\n if (input.aborted)\n return 'cancelled'\n if (input.maxTurnsReached)\n return 'max_turn_requests'\n const finish = lastFinishReason(input.turnUsage)\n switch (finish) {\n case 'length':\n return 'max_tokens'\n case 'content-filter':\n case 'error':\n return 'refusal'\n default:\n return 'end_turn'\n }\n}\n\nexport function usageCost(cost: number | undefined): Cost | null {\n if (typeof cost !== 'number' || !Number.isFinite(cost))\n return null\n return { amount: cost, currency: 'USD' }\n}\n\nexport function resolveAcpPath(cwd: string, path: string): string {\n return path.startsWith('/') ? path : resolve(cwd, path)\n}\n\nfunction lastFinishReason(turnUsage: TurnUsage[] | undefined): TurnFinishReason | undefined {\n for (let i = (turnUsage?.length ?? 0) - 1; i >= 0; i--) {\n const reason = turnUsage?.[i]?.finishReason\n if (reason)\n return reason\n }\n return undefined\n}\n\nfunction headersToRecord(headers: readonly { name: string, value: string }[] | undefined): Record<string, string> {\n const out: Record<string, string> = {}\n for (const header of headers ?? [])\n out[header.name] = header.value\n return out\n}\n\nfunction envToRecord(env: readonly { name: string, value: string }[] | undefined): Record<string, string> {\n const out: Record<string, string> = {}\n for (const item of env ?? [])\n out[item.name] = item.value\n return out\n}\n\nfunction renderResourceLink(block: { uri: string, name?: string | null, title?: string | null, mimeType?: string | null }): string {\n const label = block.title ?? block.name ?? block.uri\n return block.mimeType\n ? `[resource: ${label}](${block.uri}) (${block.mimeType})`\n : `[resource: ${label}](${block.uri})`\n}\n\nfunction resourceToPromptPart(block: EmbeddedResource): PromptPart {\n const resource = block.resource\n const mediaType = resource.mimeType ?? 'text/plain'\n const name = nameFromUri(resource.uri)\n if ('text' in resource && typeof resource.text === 'string') {\n return {\n type: 'document',\n mediaType,\n data: resource.text,\n encoding: 'text',\n ...(name ? { name } : {}),\n }\n }\n if ('blob' in resource && typeof resource.blob === 'string') {\n return {\n type: 'document',\n mediaType,\n data: resource.blob,\n encoding: 'base64',\n ...(name ? { name } : {}),\n }\n }\n return { type: 'text', text: `[resource omitted: ${resource.uri}]` }\n}\n\nfunction nameFromUri(uri: string | undefined): string | undefined {\n if (!uri)\n return undefined\n const trimmed = uri.replace(/[/\\\\]+$/, '')\n const segment = trimmed.split(/[/\\\\]/).pop()\n return segment && segment.length > 0 ? segment : undefined\n}\n","import type { ToolContext, ToolDef } from '../tools'\nimport type { AcpClientCapabilities, AcpPeer, CreateTerminalRequest, TerminalOutputResponse } from './types'\nimport { Buffer } from 'node:buffer'\nimport { hashContent, readStateKey, resolveReadStateMap } from '../tools'\nimport { readFileLineNumbers } from '../tools/read-file'\nimport { READ_FILE_MAX_BATCH, readFileBatchHeader, readFileTargets } from '../tools/read-file-targets'\nimport { wholeReadRefusal } from '../tools/whole-read-guard'\nimport { resolveAcpPath } from './mapping'\n\n/** Options for {@link wrapToolsForAcpClient}. */\nexport interface AcpClientToolOptions {\n /** Peer used to send `fs/*` and `terminal/*` requests to the ACP client. */\n client: AcpPeer\n /** ACP session id attached to every request sent to the client. */\n sessionId: string\n /** Capabilities the client declared at `initialize`. A tool is only routed to the client when the matching capability is present. */\n capabilities: AcpClientCapabilities\n /**\n * Route `read_file` and `write_file` through the client when it supports `fs.readTextFile` / `fs.writeTextFile`. Set `false` to keep the local tools.\n * @default true\n */\n useClientFileSystem?: boolean\n /**\n * Route `shell` through a client terminal when the client declares the `terminal` capability. Set `false` to keep the local tool.\n * @default true\n */\n useClientTerminal?: boolean\n}\n\n/**\n * Replaces the `read_file`, `write_file` and `shell` tools with versions that run on the ACP client.\n * Uses the client file system and terminal so the user sees editor state and terminal output. Tools the client cannot back, or that are missing from `tools`, are left as they are.\n * @param tools - Tool set to wrap. Not modified.\n * @param options - Client peer, session id and routing switches.\n * @returns A new tool set, or `undefined` when `tools` is undefined.\n */\nexport function wrapToolsForAcpClient(tools: Record<string, ToolDef> | undefined, options: AcpClientToolOptions): Record<string, ToolDef> | undefined {\n if (!tools)\n return undefined\n\n const wrapped: Record<string, ToolDef> = { ...tools }\n const readFileEntry = findToolEntry(tools, 'read_file')\n const writeFileEntry = findToolEntry(tools, 'write_file')\n const shellEntry = findToolEntry(tools, 'shell')\n if (options.useClientFileSystem !== false && options.capabilities.fs?.readTextFile && readFileEntry)\n wrapped[readFileEntry.key] = wrapReadFile(readFileEntry.tool, options)\n if (options.useClientFileSystem !== false && options.capabilities.fs?.writeTextFile && writeFileEntry)\n wrapped[writeFileEntry.key] = wrapWriteFile(writeFileEntry.tool, options)\n if (options.useClientTerminal !== false && options.capabilities.terminal && shellEntry)\n wrapped[shellEntry.key] = wrapShell(shellEntry.tool, options)\n return wrapped\n}\n\nfunction findToolEntry(tools: Record<string, ToolDef>, canonicalName: string): { key: string, tool: ToolDef } | null {\n for (const [key, tool] of Object.entries(tools)) {\n if (key === canonicalName || tool.spec.name === canonicalName)\n return { key, tool }\n }\n return null\n}\n\nfunction wrapReadFile(base: ToolDef, options: AcpClientToolOptions): ToolDef {\n const readOne = async (input: Record<string, unknown>, ctx: ToolContext): Promise<string> => {\n const path = typeof input.path === 'string' ? input.path : ''\n if (!path)\n return 'Read error: missing path.'\n const absPath = resolveAcpPath(ctx.handle.cwd, path)\n const limit = positiveNumberOrNull(input.limit)\n const fromEnd = typeof input.offset === 'number' && Number.isFinite(input.offset) && input.offset < 0\n let line = lineOrDefault(input.offset)\n let content: string\n if (fromEnd) {\n // Negative offset counts from the end (`-50` = last 50 lines): the\n // client protocol has no tail read, so fetch the whole file and slice,\n // behind the same whole-read size guard as the native tool.\n const refusal = await wholeReadRefusal(ctx.execution, ctx.handle, path, 'read')\n if (refusal)\n return refusal\n const response = await options.client.sendRequest('fs/read_text_file', {\n sessionId: options.sessionId,\n path: absPath,\n }) as { content?: unknown }\n const whole = typeof response.content === 'string' ? response.content : ''\n const lines = whole.split('\\n')\n if (whole.endsWith('\\n'))\n lines.pop()\n line = Math.max(1, lines.length + Math.floor(input.offset as number) + 1)\n content = lines.slice(line - 1, limit !== null ? line - 1 + limit : undefined).join('\\n')\n }\n else {\n const response = await options.client.sendRequest('fs/read_text_file', {\n sessionId: options.sessionId,\n path: absPath,\n line,\n ...(limit !== null ? { limit } : {}),\n }) as { content?: unknown }\n content = typeof response.content === 'string' ? response.content : ''\n }\n seedReadState(ctx, absPath, content, line, limit ?? Number.POSITIVE_INFINITY)\n return readFileLineNumbers(input.lineNumbers, ctx) ? withLineNumbers(content, line) : content\n }\n return {\n ...base,\n async execute(input, ctx) {\n if (input.paths === undefined)\n return readOne(input, ctx)\n // `paths` batch: one client read per entry, rendered like the native tool.\n if (Array.isArray(input.paths) && input.paths.length > READ_FILE_MAX_BATCH)\n return `Read error: \\`paths\\` holds ${input.paths.length} entries; the limit is ${READ_FILE_MAX_BATCH} per call. Split the batch.`\n const targets = readFileTargets(input)\n if (targets.length === 0)\n return 'Read error: `paths` must be a non-empty array of `{ path, offset?, limit? }` entries.'\n const sections: string[] = []\n for (const target of targets) {\n const body = await readOne({ path: target.path, offset: target.offset, limit: target.limit, lineNumbers: input.lineNumbers }, ctx)\n sections.push(`${readFileBatchHeader(target.path)}\\n${body}`)\n }\n return sections.join('\\n\\n')\n },\n }\n}\n\nfunction wrapWriteFile(base: ToolDef, options: AcpClientToolOptions): ToolDef {\n return {\n ...base,\n async execute(input, ctx) {\n const path = typeof input.path === 'string' ? input.path : ''\n const content = typeof input.content === 'string' ? input.content : ''\n if (!path)\n return 'Write error: missing path.'\n const absPath = resolveAcpPath(ctx.handle.cwd, path)\n await options.client.sendRequest('fs/write_text_file', {\n sessionId: options.sessionId,\n path: absPath,\n content,\n })\n seedReadState(ctx, absPath, content, 0, Number.POSITIVE_INFINITY)\n ctx.reportOutcome?.('updated')\n return `Wrote ${absPath} (${Buffer.byteLength(content)} bytes).`\n },\n }\n}\n\nfunction wrapShell(base: ToolDef, options: AcpClientToolOptions): ToolDef {\n return {\n ...base,\n spec: withoutShellBackgroundInput(base.spec),\n async execute(input, ctx) {\n const command = typeof input.command === 'string' ? input.command : ''\n if (!command)\n return 'shell error: missing command.'\n if (input.run_in_background === true)\n return 'shell error: background mode is not supported through ACP terminal callbacks. Run the command in the foreground.'\n\n const request: CreateTerminalRequest = {\n sessionId: options.sessionId,\n command,\n cwd: ctx.handle.cwd,\n outputByteLimit: typeof input.maxOutputBytes === 'number' ? input.maxOutputBytes : null,\n }\n const created = await options.client.sendRequest('terminal/create', request) as { terminalId?: unknown }\n const terminalId = typeof created.terminalId === 'string' ? created.terminalId : ''\n if (!terminalId)\n return 'shell error: ACP client did not return a terminal id.'\n\n try {\n const exit = await options.client.sendRequest('terminal/wait_for_exit', {\n sessionId: options.sessionId,\n terminalId,\n }) as { exitCode?: number | null, signal?: string | null }\n const output = await options.client.sendRequest('terminal/output', {\n sessionId: options.sessionId,\n terminalId,\n }) as TerminalOutputResponse\n return formatTerminalOutput(output, exit)\n }\n finally {\n await options.client.sendRequest('terminal/release', {\n sessionId: options.sessionId,\n terminalId,\n }).catch(() => undefined)\n }\n },\n }\n}\n\nfunction formatTerminalOutput(output: TerminalOutputResponse, exit: { exitCode?: number | null, signal?: string | null }): string {\n const body = output.output || '(no output)'\n const code = exit.exitCode ?? output.exitStatus?.exitCode\n const signal = exit.signal ?? output.exitStatus?.signal\n const suffix = signal\n ? `\\n(signal ${signal})`\n : typeof code === 'number'\n ? `\\n(exit ${code})`\n : ''\n const truncated = output.truncated ? '\\n(output truncated by ACP client)' : ''\n return `${body}${truncated}${suffix}`\n}\n\nfunction withoutShellBackgroundInput(spec: ToolDef['spec']): ToolDef['spec'] {\n const properties = isRecord(spec.inputSchema.properties) ? spec.inputSchema.properties : undefined\n if (!properties || !Object.hasOwn(properties, 'run_in_background'))\n return spec\n\n const { run_in_background: _runInBackground, ...nextProperties } = properties\n const required = Array.isArray(spec.inputSchema.required)\n ? spec.inputSchema.required.filter(name => name !== 'run_in_background')\n : spec.inputSchema.required\n\n return {\n ...spec,\n description: spec.description\n .split('\\n')\n .filter(line =>\n !line.includes('run_in_background')\n && !line.includes('<task-notification>')\n && !line.includes('background task'),\n )\n .join('\\n'),\n inputSchema: {\n ...spec.inputSchema,\n properties: nextProperties,\n ...(required ? { required } : {}),\n },\n }\n}\n\nfunction withLineNumbers(content: string, start: number): string {\n return content\n .split('\\n')\n .map((line, index) => `${start + index}\\t${line}`)\n .join('\\n')\n}\n\nfunction lineOrDefault(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 1 ? Math.trunc(value) : 1\n}\n\nfunction positiveNumberOrNull(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.trunc(value) : null\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction seedReadState(ctx: ToolContext, path: string, content: string, offset: number, limit: number): void {\n const readState = resolveReadStateMap(ctx)\n if (!readState)\n return\n readState.set(readStateKey(ctx.handle.cwd, path), {\n contentHash: hashContent(content),\n offset,\n limit,\n maxBytes: Number.POSITIVE_INFINITY,\n mtimeMs: Date.now(),\n })\n}\n","/**\n * ACP plan mode. Both modes send the same tools, so a switch keeps the prompt\n * cache; the gates enforce Plan mode and the mode reaches the model as a note\n * on the next prompt (`AgentRunOptions.systemNotes`).\n */\nimport type { SessionTurn, SystemNote } from '../types'\nimport type { AcpSessionRuntime } from './types'\nimport { applyCompactSummaryCutoff } from '../loop-compaction'\n\nexport const PLAN_MODE_ID = 'plan'\n\n/** A note with its text, as `AgentRunOptions.systemNotes` takes it. */\nexport type ModeNote = SystemNote & { text: string }\n\nconst MODE_NOTE_KIND_PREFIX = 'mode:'\n\nconst PLAN_READ_ONLY_TOOLS = new Set([\n 'read_file',\n 'list_files',\n 'grep',\n 'glob',\n 'web_search',\n 'fetch_url',\n 'skills_read',\n])\n\nexport function isPlanReadOnlyTool(name: string, runtime: AcpSessionRuntime): boolean {\n return PLAN_READ_ONLY_TOOLS.has(name)\n || runtime.clientTools.some(tool => tool.name === name && !tool.mutating)\n}\n\n/**\n * The plan-mode rules as a note: read-only, investigate, then propose. A\n * condensed form of the Plan profile's doctrine (`buildPlanSystem`). The\n * plan gate refuses `present_plan` and `ask_user`, so the plan is\n * written in the final response.\n *\n * @param tools - The tools the plan-mode gate lets through (wire names).\n */\nexport function planModeNote(tools: readonly string[]): ModeNote {\n const allowed = `Allowed tools: ${tools.map(name => `\\`${name}\\``).join(', ')}. Any other call is refused.`\n const text = `# Plan mode (read-only)\nYou are now in PLAN mode: investigate and design a proposal. You CANNOT modify files, run mutating commands, or spawn subagents until the user switches back to Build mode. ${allowed}\n\n1. Explore: read the relevant code, find existing functions and patterns to reuse. Check current docs via web search when the plan depends on external libraries.\n2. Propose: write the plan in your final response: what to change, which files, what to reuse (real paths, symbols, line numbers), how to verify end-to-end. Recommend one approach, not every alternative. Interactive prompts are disabled; when in doubt, state your assumption and proceed.\n- Search first (\\`grep\\` / \\`glob\\`), then \\`read_file\\` the specific file. Don't re-read files or re-run searches whose output is still visible above.\n\nThe user switches to Build mode to execute the plan.`\n return { kind: `${MODE_NOTE_KIND_PREFIX}plan`, label: 'Plan mode', text }\n}\n\n/** The note that ends plan mode. */\nexport function buildModeNote(): ModeNote {\n return {\n kind: `${MODE_NOTE_KIND_PREFIX}build`,\n label: 'Build mode',\n text: 'Plan mode is off. You are back in Build mode: every tool is available again, edits included.',\n }\n}\n\n/**\n * The mode the model was last told about: the newest mode note in `turns`.\n * No note means Build, the mode a conversation starts in.\n *\n * @param turns - The session's turns, oldest first.\n */\nexport function lastAnnouncedMode(turns: readonly SessionTurn[]): 'build' | 'plan' {\n for (let i = turns.length - 1; i >= 0; i--) {\n const content = turns[i]!.content\n for (let j = content.length - 1; j >= 0; j--) {\n const block = content[j]!\n if (block.type === 'text' && block.systemNote?.kind.startsWith(MODE_NOTE_KIND_PREFIX))\n return block.systemNote.kind === `${MODE_NOTE_KIND_PREFIX}plan` ? 'plan' : 'build'\n }\n }\n return 'build'\n}\n\n/**\n * The mode note the next prompt carries, `undefined` when the session's turns\n * already told the model its current mode. Reads the wire view: a note\n * compacted into a summary no longer reaches the model, so it is sent again.\n */\nexport function modeNoteForPrompt(runtime: AcpSessionRuntime): ModeNote | undefined {\n const mode = runtime.modeId === PLAN_MODE_ID ? 'plan' : 'build'\n if (lastAnnouncedMode(applyCompactSummaryCutoff(runtime.session.turns)) === mode)\n return undefined\n if (mode === 'build')\n return buildModeNote()\n const tools = Object.values(runtime.tools ?? {})\n .map(tool => tool.spec.name)\n .filter(name => isPlanReadOnlyTool(name, runtime))\n return planModeNote(tools)\n}\n","/**\n * Prompt-cache care for ACP sessions: the cache lifetime, cache-break logging\n * under `ZIDANE_DEBUG`, and each session's frozen system prompt (see\n * `AgentRunOptions.systemFreeze`).\n *\n * The first run of a session captures its prompt into a snapshot turn; later runs send\n * that text again and announce catalog changes (skills, searchable tools,\n * MCP instructions) as notes, so the provider's prompt cache keeps hitting.\n *\n * ACP does not compose the base prompt itself (it is the embedder's preset,\n * agent options or `system`), so the base is tracked as the fresh prompt with\n * the SDK-appended catalogs removed. When it changed since the snapshot (a\n * server restarted with a new prompt), the run re-captures instead of sending\n * the stale one.\n */\n\nimport type { Agent } from '../agent'\nimport type { Session } from '../session'\nimport type { AgentRunOptions, CacheTtl, FrozenPromptSections } from '../types'\nimport process from 'node:process'\nimport { installCacheBreakLogger } from '../cache-telemetry'\nimport { catalogChangeNotes, FROZEN_PROMPT_SECTION_KINDS, latestSystemSnapshot, sectionDigests, systemSnapshotTurn } from '../system-freeze'\n\n/**\n * Default prompt-cache lifetime of ACP sessions. An editor session is\n * human-paced: the user reads, edits and thinks between prompts, often for\n * longer than the default 5-minute cache entry lives, so a 1-hour entry keeps\n * those gaps on cache reads instead of full re-reads.\n */\nexport const ACP_CACHE_TTL: CacheTtl = '1h'\n\n/** Digest kind of the base prompt: the fresh prompt without the SDK-appended catalogs. */\nconst BASE_SECTION = 'base'\n\n/**\n * Write one debug line to stderr when `ZIDANE_DEBUG` is set. Never stdout:\n * that is the ACP protocol stream.\n *\n * @param line - The line to write.\n */\nfunction acpDebug(line: string): void {\n if (process.env.ZIDANE_DEBUG)\n process.stderr.write(`[zidane-acp] ${line}\\n`)\n}\n\n/** The fresh prompt without the sections the SDK appended to it. */\nfunction basePrompt(fresh: string, sections: FrozenPromptSections): string {\n let base = fresh\n for (const kind of FROZEN_PROMPT_SECTION_KINDS) {\n const text = sections[kind]\n if (!text)\n continue\n const joined = base.indexOf(`\\n\\n${text}`)\n base = joined >= 0\n ? base.slice(0, joined) + base.slice(joined + text.length + 2)\n : base.replace(text, () => '')\n }\n return base\n}\n\nfunction snapshotDigests(fresh: string, sections: FrozenPromptSections): Record<string, string> {\n return sectionDigests({ ...sections, [BASE_SECTION]: basePrompt(fresh, sections) })\n}\n\n/** A session's prompt freeze: the `systemFreeze` options of its next run. */\nexport interface AcpPromptFreeze {\n /** The `systemFreeze` options for the session's next run. */\n runOptions: () => Pick<AgentRunOptions, 'systemFreeze'>\n}\n\n/**\n * Freeze the system prompt of an ACP session's runs.\n *\n * @param input - The session and the snapshot key.\n * @param input.session - The session holding the snapshot turns.\n * @param input.key - Stable id of the server's agent composition, which keys the snapshots.\n */\nfunction createAcpPromptFreeze(input: { session: Session, key: string }): AcpPromptFreeze {\n const { session, key } = input\n const capture = async (fresh: string, sections: FrozenPromptSections): Promise<void> => {\n await session.appendTurns([systemSnapshotTurn({\n id: await session.generateTurnId(),\n createdAt: Date.now(),\n system: fresh,\n snapshot: { key, digests: snapshotDigests(fresh, sections) },\n })])\n }\n\n return {\n runOptions: () => {\n const frozen = latestSystemSnapshot(session.turns, key)\n if (!frozen)\n return { systemFreeze: { onCapture: capture } }\n return {\n systemFreeze: {\n // A changed base prompt makes the frozen text stale: send the fresh\n // one and capture it (the provider re-reads the conversation once).\n system: (fresh, sections) => {\n if (snapshotDigests(fresh, sections)[BASE_SECTION] === frozen.snapshot.digests[BASE_SECTION])\n return frozen.text\n acpDebug(`session ${session.id}: base system prompt changed since it was frozen; re-capturing (the provider re-reads the whole conversation once)`)\n return undefined\n },\n onCapture: capture,\n notes: (_fresh, sections) => catalogChangeNotes({ frozen, turns: session.turns, sections }),\n },\n }\n },\n }\n}\n\n/**\n * Set up an ACP session's agent for prompt caching: a cache-break logger on\n * stderr when `ZIDANE_DEBUG` is set, and the session's prompt freeze unless\n * `freeze` is `false`.\n *\n * @param input - The session's agent and session, the snapshot key, and whether to freeze.\n * @param input.agent - The session's agent.\n * @param input.session - The session holding the snapshot turns.\n * @param input.key - Stable id of the server's agent composition, which keys the snapshots.\n * @param input.freeze - Freeze the session's system prompt.\n * @returns The session's prompt freeze, `undefined` when `freeze` is `false`.\n */\nexport function installAcpPromptCache(input: { agent: Agent, session: Session, key: string, freeze: boolean }): AcpPromptFreeze | undefined {\n const { agent, session, key, freeze } = input\n if (process.env.ZIDANE_DEBUG)\n installCacheBreakLogger(agent.hooks, { log: line => acpDebug(`session ${session.id}: ${line}`) })\n return freeze ? createAcpPromptFreeze({ session, key }) : undefined\n}\n","import type { AgentOptions } from '../agent'\nimport type { Preset } from '../presets'\nimport type { Provider } from '../providers'\nimport type { Session } from '../session'\nimport type { ToolDef } from '../tools'\nimport type { AgentStats, McpServerConfig, PromptPart, ThinkingLevel, TurnUsage } from '../types'\nimport type { AcpPromptFreeze } from './prompt-cache'\nimport type {\n AcpClientCapabilities,\n AcpModelChoice,\n AcpPeer,\n AcpServerOptions,\n AcpSessionRuntime,\n AuthenticateRequest,\n CancelNotification,\n DeleteSessionRequest,\n InitializeRequest,\n JsonRpcMessage,\n JsonRpcRequest,\n JsonRpcResponse,\n ListSessionsRequest,\n LoadSessionRequest,\n NewSessionRequest,\n PermissionOption,\n PromptRequest,\n PromptResponse,\n RequestPermissionOutcome,\n ResumeSessionRequest,\n SessionConfigOption,\n SessionInfo,\n SessionMode,\n SessionUpdate,\n SetSessionConfigOptionRequest,\n SetSessionModeRequest,\n ToolCallUpdate,\n} from './types'\nimport { createAgent } from '../agent'\nimport { findGitRoot, projectRootOf } from '../chat/project-root'\nimport { newSession } from '../chat/session-factory'\nimport { createProcessContext } from '../contexts'\nimport { errorMessage } from '../errors'\nimport { basic } from '../presets'\nimport { defaultPromptMessage } from '../prompt'\nimport { loadSession } from '../session'\nimport { validThinkingLevels } from '../start/shared-options'\nimport { effectiveInputFromTurn } from '../stats'\nimport { fetchUrl } from '../tools/fetch-url'\nimport { webSearch } from '../tools/web-search'\nimport { isThinkingLevel } from '../types'\nimport { assertNoClientToolClash, ClientToolSpecError, createClientDeclaredTools, parseClientToolSpecs } from './client-declared-tools'\nimport { wrapToolsForAcpClient } from './client-tools'\nimport { errorResponse, successResponse } from './json-rpc'\nimport {\n acpMcpServersToZidane,\n acpPromptToPromptParts,\n defaultModes,\n makeModeState,\n mcpCapabilities,\n newSessionResponse,\n promptCapabilitiesForProvider,\n sessionBlocksToAcp,\n stopReasonFromRun,\n toolKindForName,\n toolResultToAcpContent,\n usageCost,\n} from './mapping'\nimport { isPlanReadOnlyTool, modeNoteForPrompt, PLAN_MODE_ID } from './plan-mode'\nimport { ACP_CACHE_TTL, installAcpPromptCache } from './prompt-cache'\nimport { ACP_PROTOCOL_VERSION, AcpErrorCode } from './types'\n\nconst ACP_AGENT_VERSION = '1'\n\n// Reserved id for the auto-generated model selector config option. The registry\n// owns this id; a user-supplied config option with the same id is dropped.\nconst MODEL_CONFIG_ID = 'model'\nconst MODE_CONFIG_ID = 'mode'\nconst THINKING_CONFIG_ID = 'thinking'\nconst MODEL_OPTION_CONFIG_PREFIX = 'model_option:'\n\n/**\n * Search/fetch tools layered onto the DEFAULT ACP session (i.e. only when the\n * host passes no `preset` of its own). The `basic` preset ships neither — they\n * are opt-in at the SDK layer — but an editor-facing ACP agent should match the\n * TUI. `web_search` in particular is the trigger that makes Anthropic-backed\n * sessions use the native server-side `web_search_20250305` tool: without a\n * registered `web_search` ToolDef the provider has nothing to upgrade.\n */\nconst ACP_DEFAULT_EXTRA_TOOLS: Record<string, ToolDef> = { webSearch, fetchUrl }\n\n/**\n * Return `preset` with the default ACP search/fetch tools filled in. The\n * preset's own tools win on name collision, so this only adds what's missing.\n * Applied to the default base and by the `zidane-acp` CLI — never to a\n * host-provided `AcpServerOptions.preset`, which is honored verbatim.\n * @param preset - Base preset to extend. Not modified.\n * @returns A new preset with `web_search` and `fetch_url` added when absent.\n */\nexport function withAcpDefaultTools(preset: Preset): Preset {\n return { ...preset, tools: { ...ACP_DEFAULT_EXTRA_TOOLS, ...preset.tools } }\n}\n\nconst DEFAULT_PERMISSION_OPTIONS: PermissionOption[] = [\n { optionId: 'allow_once', name: 'Allow once', kind: 'allow_once' },\n { optionId: 'allow_always', name: 'Always allow', kind: 'allow_always' },\n { optionId: 'reject_once', name: 'Reject once', kind: 'reject_once' },\n { optionId: 'reject_always', name: 'Always reject', kind: 'reject_always' },\n]\n\n/** The ACP agent side. Handles requests and notifications from an ACP client and sends updates back through a peer. */\nexport interface AcpServer {\n /** Sets the peer used to send requests and notifications to the client. Must be called before a session is created. */\n setPeer: (peer: AcpPeer) => void\n /** Handles one incoming JSON-RPC message. Returns the response for a request, or `null` for a notification. */\n handleMessage: (message: JsonRpcMessage) => Promise<JsonRpcResponse | null>\n /** Handles one ACP request by method name and returns its result. Throws {@link AcpProtocolError} for an unknown method or invalid params. */\n handleRequest: (method: string, params?: unknown) => Promise<unknown>\n /** Sends a notification to the client through the peer. Does nothing when no peer is set. */\n notify: (method: string, params?: unknown) => Promise<void>\n /** Aborts any running prompts and destroys every open session. */\n close: () => Promise<void>\n}\n\n/**\n * Creates an ACP agent server.\n * The server speaks ACP v1: `initialize`, `authenticate`, `logout`, `session/new`, `session/load`, `session/resume`, `session/list`, `session/delete`, `session/close`, `session/prompt`, `session/set_mode`, `session/set_config_option`, and the `session/cancel` notification. It does no I/O itself, so connect it to a transport with {@link createJsonRpcConnection} or use {@link runAcpStdioServer}.\n * Throws when neither `provider` nor `models` is set, or when `defaultModelId` is not in `models`.\n * @param options - Provider or model registry, tools, session store and ACP behavior.\n * @returns The server.\n * @example\n * ```ts\n * import { createAcpServer } from 'zidane/acp'\n * import { anthropic } from 'zidane/providers'\n *\n * const server = createAcpServer({ provider: anthropic() })\n * const response = await server.handleMessage({\n * jsonrpc: '2.0',\n * id: 1,\n * method: 'initialize',\n * params: { protocolVersion: 1 },\n * })\n * ```\n */\nexport function createAcpServer(options: AcpServerOptions): AcpServer {\n return new AcpServerImpl(options)\n}\n\nclass AcpServerImpl implements AcpServer {\n private peer: AcpPeer | null = null\n private clientCapabilities: AcpClientCapabilities = {}\n private sessions = new Map<string, AcpSessionRuntime>()\n private modes: SessionMode[]\n private defaultModeId: string\n private defaultConfigOptions: SessionConfigOption[]\n private modelChoices: AcpModelChoice[]\n private defaultModelChoiceId: string | undefined\n // Provider instances memoized by choice id so a provider (and its\n // credentials) is constructed once and reused across sessions/switches.\n private builtProviders = new Map<string, Provider>()\n // Frozen system prompt of each session runtime, when `freezeSystemPrompt` is on.\n private promptFreezes = new WeakMap<AcpSessionRuntime, AcpPromptFreeze>()\n\n constructor(private readonly options: AcpServerOptions) {\n this.modes = defaultModes(options.modes)\n this.defaultModeId = options.defaultModeId ?? this.modes[0]?.id ?? 'build'\n this.modelChoices = options.models ?? []\n if (this.modelChoices.length === 0 && options.provider === undefined)\n throw new Error('AcpServerOptions requires either `provider` or `models`.')\n this.defaultModelChoiceId = this.resolveDefaultModelChoiceId(options.defaultModelId)\n this.defaultConfigOptions = this.buildDefaultConfigOptions(options.configOptions ?? [])\n }\n\n private resolveDefaultModelChoiceId(requested: string | undefined): string | undefined {\n if (this.modelChoices.length === 0)\n return undefined\n if (requested !== undefined) {\n if (!this.modelChoices.some(choice => choice.id === requested))\n throw new Error(`defaultModelId \"${requested}\" is not present in the models registry.`)\n return requested\n }\n // No explicit default: prefer a choice matching `options.model` (by id or\n // model string), else the first registered entry.\n const matched = this.options.model\n ? this.modelChoices.find(choice => choice.id === this.options.model || choice.model === this.options.model)\n : undefined\n return (matched ?? this.modelChoices[0]).id\n }\n\n private buildDefaultConfigOptions(userConfig: SessionConfigOption[]): SessionConfigOption[] {\n const reserved = new Set<string>([MODE_CONFIG_ID])\n const options: SessionConfigOption[] = [{\n id: MODE_CONFIG_ID,\n name: 'Mode',\n type: 'select',\n category: 'mode',\n currentValue: this.defaultModeId,\n options: this.modes.map(mode => ({\n value: mode.id,\n name: mode.name,\n ...(mode.description ? { description: mode.description } : {}),\n })),\n }]\n\n if (this.modelChoices.length > 0) {\n reserved.add(MODEL_CONFIG_ID)\n options.push({\n // Model selector follows mode. The registry reserves the `model` id,\n // so a colliding user option is dropped.\n id: MODEL_CONFIG_ID,\n name: 'Model',\n type: 'select',\n category: 'model',\n currentValue: this.defaultModelChoiceId!,\n options: this.modelChoices.map(choice => ({ value: choice.id, name: choice.name ?? choice.model })),\n })\n }\n\n options.push(...this.modelDependentConfigOptions(this.defaultModelChoiceId))\n\n return [...options, ...userConfig.filter(option => !reserved.has(option.id) && !isGeneratedModelOptionConfig(option.id) && option.id !== THINKING_CONFIG_ID)]\n }\n\n private providerForChoiceId(id: string): Provider {\n const choice = this.modelChoices.find(candidate => candidate.id === id)\n if (!choice)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown model: ${id}`)\n let provider = this.builtProviders.get(id)\n if (!provider) {\n provider = typeof choice.provider === 'function' ? choice.provider() : choice.provider\n this.builtProviders.set(id, provider)\n }\n return provider\n }\n\n setPeer(peer: AcpPeer): void {\n this.peer = peer\n }\n\n async handleMessage(message: JsonRpcMessage): Promise<JsonRpcResponse | null> {\n if (!isObject(message) || typeof (message as { method?: unknown }).method !== 'string') {\n const id = 'id' in (message as object) ? (message as { id?: unknown }).id : null\n return errorResponse(normalizeId(id), AcpErrorCode.InvalidRequest, 'Invalid JSON-RPC request.')\n }\n\n if (!('id' in message)) {\n await this.handleNotification(message.method, (message as { params?: unknown }).params)\n return null\n }\n\n const request = message as JsonRpcRequest\n try {\n const result = await this.handleRequest(request.method, request.params)\n return successResponse(request.id, result)\n }\n catch (err) {\n const rpcError = toRpcError(err)\n return errorResponse(request.id, rpcError.code, rpcError.message, rpcError.data)\n }\n }\n\n async handleRequest(method: string, params?: unknown): Promise<unknown> {\n switch (method) {\n case 'initialize':\n return this.initialize(asObject<InitializeRequest>(params))\n case 'authenticate':\n return this.authenticate(asObject<AuthenticateRequest>(params))\n case 'logout':\n return this.logout()\n case 'session/new':\n return this.newSession(asObject<NewSessionRequest>(params))\n case 'session/load':\n return this.loadExistingSession(asObject<LoadSessionRequest>(params))\n case 'session/resume':\n return this.resumeSession(asObject<ResumeSessionRequest>(params))\n case 'session/list':\n return this.listSessions(asObject<ListSessionsRequest>(params))\n case 'session/delete':\n return this.deleteSession(asObject<DeleteSessionRequest>(params))\n case 'session/close':\n return this.closeSession(asObject<{ sessionId: string }>(params))\n case 'session/prompt':\n return this.prompt(asObject<PromptRequest>(params))\n case 'session/set_mode':\n return this.setMode(asObject<SetSessionModeRequest>(params))\n case 'session/set_config_option':\n return this.setConfigOption(asObject<SetSessionConfigOptionRequest>(params))\n default:\n throw new AcpProtocolError(AcpErrorCode.MethodNotFound, `Unknown ACP method: ${method}`)\n }\n }\n\n async notify(method: string, params?: unknown): Promise<void> {\n await this.peer?.sendNotification(method, params)\n }\n\n async close(): Promise<void> {\n const sessions = [...this.sessions.values()]\n this.sessions.clear()\n await Promise.allSettled(sessions.map(async (runtime) => {\n runtime.abortController?.abort(new Error('ACP server closing.'))\n await runtime.agent.destroy()\n }))\n }\n\n private async handleNotification(method: string, params?: unknown): Promise<void> {\n switch (method) {\n case 'session/cancel':\n this.cancel(asObject<CancelNotification>(params))\n break\n default:\n break\n }\n }\n\n private initialize(params: InitializeRequest): unknown {\n this.clientCapabilities = params.clientCapabilities ?? {}\n const provider = this.resolveProvider()\n return {\n // We currently speak ACP v1 only. Per ACP, return the requested version\n // only if supported; otherwise advertise the latest supported version.\n protocolVersion: params.protocolVersion === ACP_PROTOCOL_VERSION ? params.protocolVersion : ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: promptCapabilitiesForProvider(provider.meta.capabilities),\n mcpCapabilities: mcpCapabilities(),\n sessionCapabilities: {\n list: {},\n delete: {},\n resume: {},\n close: {},\n additionalDirectories: {},\n },\n auth: {\n ...(this.options.logout ? { logout: {} } : {}),\n },\n // Tells clients they may declare tools under `_meta.zidane.clientTools`.\n _meta: { zidane: { clientTools: true } },\n },\n agentInfo: this.options.agentInfo ?? { name: 'zidane', title: 'Zidane ACP', version: ACP_AGENT_VERSION },\n authMethods: this.options.authMethods ?? [],\n }\n }\n\n private async authenticate(params: AuthenticateRequest): Promise<unknown> {\n if (!this.options.authenticate)\n return {}\n return await this.options.authenticate(params)\n }\n\n private async logout(): Promise<unknown> {\n if (!this.options.logout)\n return {}\n return await this.options.logout()\n }\n\n private async newSession(params: NewSessionRequest): Promise<unknown> {\n const runtime = await this.createRuntime(params)\n this.deferAvailableCommands(runtime.sessionId)\n return newSessionResponse(runtime.sessionId, this.modes, runtime.modeId, runtime.configOptions)\n }\n\n private async loadExistingSession(params: LoadSessionRequest): Promise<unknown> {\n const runtime = await this.createRuntime(params, params.sessionId, true)\n // ACP `session/load` replays the full history through `session/update`\n // notifications BEFORE the response resolves; the response itself only\n // carries mode/config state (no inline `messages`).\n await this.replayHistory(runtime)\n this.deferAvailableCommands(runtime.sessionId)\n return this.sessionStateResponse(runtime)\n }\n\n private async resumeSession(params: ResumeSessionRequest): Promise<unknown> {\n const runtime = await this.createRuntime({\n cwd: params.cwd,\n additionalDirectories: params.additionalDirectories,\n mcpServers: params.mcpServers ?? [],\n _meta: params._meta,\n }, params.sessionId, true)\n // `session/resume` does not replay history (unlike `session/load`); it only\n // reports current mode state.\n this.deferAvailableCommands(runtime.sessionId)\n return this.sessionStateResponse(runtime)\n }\n\n private sessionStateResponse(runtime: AcpSessionRuntime): { modes: ReturnType<typeof makeModeState>, configOptions?: SessionConfigOption[] } {\n return {\n modes: makeModeState(this.modes, runtime.modeId),\n ...(runtime.configOptions.length > 0 ? { configOptions: runtime.configOptions } : {}),\n }\n }\n\n private deferAvailableCommands(sessionId: string): void {\n if (!this.options.commands || this.options.commands.length === 0)\n return\n setTimeout(() => {\n void this.sessionUpdate(sessionId, {\n sessionUpdate: 'available_commands_update',\n availableCommands: this.options.commands!,\n })\n }, 0)\n }\n\n private async replayHistory(runtime: AcpSessionRuntime): Promise<void> {\n for (const turn of runtime.session.turns) {\n // Frozen system prompt snapshots are bookkeeping, not conversation.\n if (turn.role === 'system')\n continue\n const blocks = sessionBlocksToAcp(turn.content)\n if (blocks.length === 0)\n continue\n const sessionUpdate = turn.role === 'assistant' ? 'agent_message_chunk' : 'user_message_chunk'\n for (const content of blocks)\n await this.sessionUpdate(runtime.sessionId, { sessionUpdate, content })\n }\n }\n\n private async listSessions(params: ListSessionsRequest): Promise<unknown> {\n const store = this.options.store\n if (!store) {\n return {\n sessions: [...this.sessions.values()]\n .filter(runtime => !params.cwd || runtime.cwd === params.cwd)\n .map(runtime => sessionInfo(runtime)),\n nextCursor: null,\n }\n }\n\n // Sessions are grouped by project root (`newSession`), but the editor asks\n // by its own cwd, which may be a subfolder or a linked worktree. Query the\n // root the factory would derive, plus the older tags — the checkout root\n // and the raw cwd (the projectRoot ACP stamped before the factory) — then\n // match on the stamped cwd.\n const roots = params.cwd ? [...new Set([projectRootOf(params.cwd), findGitRoot(params.cwd) ?? params.cwd, params.cwd])] : [undefined]\n const idLists = await Promise.all(roots.map(root => store.list({ limit: 100, ...(root ? { projectRoot: root } : {}) })))\n const ids = [...new Set(idLists.flat())]\n const sessions: SessionInfo[] = []\n for (const id of ids) {\n const loaded = await store.load(id)\n if (!loaded)\n continue\n const stampedCwd = typeof loaded.metadata.cwd === 'string' && loaded.metadata.cwd ? loaded.metadata.cwd : undefined\n if (params.cwd && (stampedCwd ?? loaded.projectRoot) !== params.cwd)\n continue\n // `SessionInfo.cwd` is required and must be absolute; fall back to the\n // requested filter cwd, then the live runtime cwd. Skip sessions we\n // cannot attribute to a working directory rather than emit an invalid one.\n const cwd = stampedCwd ?? loaded.projectRoot ?? params.cwd ?? this.sessions.get(loaded.id)?.cwd\n if (!cwd)\n continue\n sessions.push({\n sessionId: loaded.id,\n cwd,\n title: typeof loaded.metadata.title === 'string' ? loaded.metadata.title : null,\n updatedAt: new Date(loaded.updatedAt).toISOString(),\n })\n }\n return { sessions, nextCursor: null }\n }\n\n private async deleteSession(params: DeleteSessionRequest): Promise<unknown> {\n const runtime = this.sessions.get(params.sessionId)\n if (runtime) {\n runtime.abortController?.abort(new Error('ACP session deleted.'))\n await runtime.agent.destroy()\n this.sessions.delete(params.sessionId)\n }\n await this.options.store?.delete(params.sessionId)\n return {}\n }\n\n private async closeSession(params: { sessionId: string }): Promise<unknown> {\n const runtime = this.requireSession(params.sessionId)\n runtime.abortController?.abort(new Error('ACP session closed.'))\n await runtime.agent.destroy()\n this.sessions.delete(params.sessionId)\n return {}\n }\n\n private async prompt(params: PromptRequest): Promise<PromptResponse> {\n const runtime = this.requireSession(params.sessionId)\n if (runtime.inFlight)\n throw new AcpProtocolError(AcpErrorCode.InvalidRequest, `Session ${params.sessionId} already has an in-flight prompt.`)\n\n const mapped = acpPromptToPromptParts(params.prompt)\n const abortController = new AbortController()\n runtime.abortController = abortController\n const run = async (): Promise<PromptResponse> => {\n let stats: AgentStats | undefined\n let aborted = false\n try {\n for (const warning of mapped.warnings) {\n await this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'agent_thought_chunk',\n content: { type: 'text', text: warning },\n })\n }\n const modeNote = modeNoteForPrompt(runtime)\n stats = await runtime.agent.run({\n prompt: mapped.prompt,\n ...(runtime.runModel ? { model: runtime.runModel } : {}),\n ...this.runConfig(runtime),\n ...(modeNote ? { systemNotes: [modeNote] } : {}),\n ...this.promptFreezes.get(runtime)?.runOptions(),\n ...(this.options.system ? { system: this.options.system } : {}),\n signal: abortController.signal,\n })\n }\n catch (err) {\n aborted = abortController.signal.aborted\n if (!aborted)\n throw err\n }\n finally {\n runtime.abortController = undefined\n runtime.inFlight = undefined\n }\n\n return {\n stopReason: stopReasonFromRun({\n aborted: aborted || abortController.signal.aborted,\n turnUsage: stats?.turnUsage,\n maxTurnsReached: stats ? reachedMaxTurns(stats, this.options.behavior) : false,\n }),\n }\n }\n\n const inFlight = run()\n runtime.inFlight = inFlight\n return await inFlight\n }\n\n private cancel(params: CancelNotification): void {\n const runtime = this.sessions.get(params.sessionId)\n runtime?.abortController?.abort(new Error('Cancelled by ACP client.'))\n runtime?.agent.abort()\n }\n\n private async setMode(params: SetSessionModeRequest): Promise<unknown> {\n const runtime = this.requireSession(params.sessionId)\n const configOptions = this.selectMode(runtime, params.modeId)\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'current_mode_update',\n currentModeId: params.modeId,\n })\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'config_option_update',\n configOptions,\n })\n return {}\n }\n\n private async setConfigOption(params: SetSessionConfigOptionRequest): Promise<unknown> {\n const runtime = this.requireSession(params.sessionId)\n const isModelSwitch = this.modelChoices.length > 0 && params.configId === MODEL_CONFIG_ID\n const isModeSwitch = params.configId === MODE_CONFIG_ID\n // A model switch rebinds the agent's provider; refuse mid-prompt so we never\n // swap the provider out from under an in-flight stream.\n if (isModelSwitch && runtime.inFlight)\n throw new AcpProtocolError(AcpErrorCode.InvalidRequest, 'Cannot switch model while a prompt is in flight.')\n let configOptions = this.applyConfigSelection(runtime, params.configId, params.value)\n if (isModelSwitch)\n this.selectModel(runtime, params.value)\n if (isModeSwitch) {\n runtime.modeId = params.value\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'current_mode_update',\n currentModeId: params.value,\n })\n }\n runtime.config.set(params.configId, params.value)\n if (isModelSwitch)\n configOptions = runtime.configOptions\n await this.sessionUpdate(params.sessionId, {\n sessionUpdate: 'config_option_update',\n configOptions,\n })\n return { configOptions }\n }\n\n /**\n * Rebind a live session to the provider + model of the selected registry\n * choice. The agent is NOT rebuilt — only the router's delegate and the run\n * model change — so execution handles and background tasks survive a switch.\n */\n private selectModel(runtime: AcpSessionRuntime, choiceId: string): void {\n const choice = this.modelChoices.find(candidate => candidate.id === choiceId)\n if (!choice)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown model: ${choiceId}`)\n runtime.setProviderDelegate?.(this.providerForChoiceId(choice.id))\n runtime.runModel = choice.model\n this.refreshModelDependentConfigOptions(runtime, choice.id)\n }\n\n private selectMode(runtime: AcpSessionRuntime, modeId: string): SessionConfigOption[] {\n if (!this.modes.some(mode => mode.id === modeId))\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown mode: ${modeId}`)\n runtime.modeId = modeId\n return this.applyConfigSelection(runtime, MODE_CONFIG_ID, modeId)\n }\n\n private runConfig(runtime: AcpSessionRuntime): { thinking?: ThinkingLevel, modelOptions?: Record<string, boolean> } {\n const thinking = configValue(runtime.configOptions, THINKING_CONFIG_ID)\n const modelOptions: Record<string, boolean> = {}\n for (const option of runtime.configOptions) {\n if (!isGeneratedModelOptionConfig(option.id) || option.currentValue !== 'on')\n continue\n modelOptions[option.id.slice(MODEL_OPTION_CONFIG_PREFIX.length)] = true\n }\n return {\n ...(isThinkingLevel(thinking) ? { thinking } : {}),\n ...(Object.keys(modelOptions).length > 0 ? { modelOptions } : {}),\n }\n }\n\n private refreshModelDependentConfigOptions(runtime: AcpSessionRuntime, choiceId: string): void {\n const insertAfter = (option: SessionConfigOption) => option.id === MODEL_CONFIG_ID\n const base = runtime.configOptions.filter(option => option.id !== THINKING_CONFIG_ID && !isGeneratedModelOptionConfig(option.id))\n const generated = this.modelDependentConfigOptions(choiceId, runtime.config)\n const index = base.findIndex(insertAfter)\n runtime.configOptions = index === -1\n ? [...base, ...generated]\n : [...base.slice(0, index + 1), ...generated, ...base.slice(index + 1)]\n }\n\n private modelDependentConfigOptions(choiceId: string | undefined, previous?: Map<string, unknown>): SessionConfigOption[] {\n if (!choiceId)\n return []\n const choice = this.modelChoices.find(candidate => candidate.id === choiceId)\n if (!choice)\n return []\n const options: SessionConfigOption[] = []\n if (choice.reasoning === true) {\n const current = previous?.get(THINKING_CONFIG_ID)\n options.push({\n id: THINKING_CONFIG_ID,\n name: 'Thinking',\n type: 'select',\n category: 'thought_level',\n currentValue: isThinkingLevel(current) ? current : 'off',\n options: validThinkingLevels.map(level => ({ value: level, name: thinkingLabel(level) })),\n })\n }\n for (const option of choice.options ?? []) {\n const id = `${MODEL_OPTION_CONFIG_PREFIX}${option.id}`\n const current = previous?.get(id)\n options.push({\n id,\n name: option.label,\n type: 'select',\n currentValue: current === 'on' ? 'on' : 'off',\n ...(option.description ? { description: option.description } : {}),\n options: [{ value: 'off', name: 'Off' }, { value: 'on', name: 'On' }],\n })\n }\n return options\n }\n\n /** Reflect a `select` choice back into the advertised option set's `currentValue`. */\n private applyConfigSelection(runtime: AcpSessionRuntime, configId: string, value: string): SessionConfigOption[] {\n const option = runtime.configOptions.find(candidate => candidate.id === configId)\n if (!option)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Unknown config option: ${configId}`)\n if (!configOptionHasValue(option, value))\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Invalid value for config option ${configId}: ${value}`)\n runtime.configOptions = runtime.configOptions.map(candidate =>\n candidate.id === configId ? { ...candidate, currentValue: value } : candidate,\n )\n return runtime.configOptions\n }\n\n private async createRuntime(params: NewSessionRequest | LoadSessionRequest | ResumeSessionRequest, requestedSessionId?: string, mustExist = false): Promise<AcpSessionRuntime> {\n if (requestedSessionId) {\n const existing = this.sessions.get(requestedSessionId)\n if (existing) {\n if (existing.cwd !== params.cwd)\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, `Session ${requestedSessionId} belongs to cwd ${existing.cwd}, not ${params.cwd}.`)\n const nextAdditionalDirectories = params.additionalDirectories ?? existing.additionalDirectories\n const nextMcpServers = params.mcpServers === undefined\n ? existing.mcpServers\n : acpMcpServersToZidane(params.mcpServers)\n if (!sameStringArray(existing.additionalDirectories, nextAdditionalDirectories)) {\n throw new AcpProtocolError(\n AcpErrorCode.InvalidParams,\n `Session ${requestedSessionId} is already active with different additionalDirectories; close it before resuming with changed roots.`,\n )\n }\n if (!sameJson(existing.mcpServers, nextMcpServers)) {\n throw new AcpProtocolError(\n AcpErrorCode.InvalidParams,\n `Session ${requestedSessionId} is already active with different MCP servers; close it before resuming with changed MCP configuration.`,\n )\n }\n const nextClientTools = parseClientToolSpecs(params._meta) ?? existing.clientTools\n if (!sameJson(existing.clientTools, nextClientTools)) {\n throw new AcpProtocolError(\n AcpErrorCode.InvalidParams,\n `Session ${requestedSessionId} is already active with different client tools; close it before resuming with changed tools.`,\n )\n }\n return existing\n }\n }\n\n const mcpServers = acpMcpServersToZidane(params.mcpServers)\n const clientTools = parseClientToolSpecs(params._meta) ?? []\n const base = this.options.preset ?? withAcpDefaultTools(basic)\n const agentOptions = this.options.agentOptions ?? {}\n const hostTools = mergeTools(base.tools, agentOptions.tools, this.options.tools)\n assertNoClientToolClash(hostTools, clientTools)\n const session = await this.resolveSession(requestedSessionId, params.cwd, mustExist)\n const execution = this.resolveExecution(params)\n // In model-registry mode, bind the agent to a per-session router so a later\n // `session/set_config_option` can swap the provider WITHOUT rebuilding the\n // agent (a rebuild would destroy the execution handle + background tasks).\n const initialChoiceId = this.defaultModelChoiceId\n const router = initialChoiceId !== undefined\n ? createProviderRouter(this.providerForChoiceId(initialChoiceId))\n : undefined\n const provider = router ? router.provider : this.resolveProvider()\n const runModel = initialChoiceId !== undefined\n ? this.modelChoices.find(choice => choice.id === initialChoiceId)!.model\n : this.options.model\n const sessionId = session.id\n const tools = clientTools.length > 0\n ? { ...hostTools, ...createClientDeclaredTools(clientTools, { client: this.requirePeer(), sessionId }) }\n : hostTools\n const wrappedTools = wrapToolsForAcpClient(tools, {\n client: this.requirePeer(),\n sessionId,\n capabilities: this.clientCapabilities,\n useClientFileSystem: this.options.useClientFileSystem,\n useClientTerminal: this.options.useClientTerminal,\n })\n // Overridable: the preset, `agentOptions` and `behavior` all win over the ACP default.\n const behavior = { cacheTtl: ACP_CACHE_TTL, ...base.behavior, ...agentOptions.behavior, ...this.options.behavior }\n const agent = createAgent({\n ...base,\n ...agentOptions,\n provider,\n execution,\n session,\n tools: wrappedTools,\n behavior,\n mcpServers: mergeMcpServers(base.mcpServers, agentOptions.mcpServers, this.options.agentOptions?.mcpServers, mcpServers),\n ...(this.options.system ? { system: this.options.system } : {}),\n })\n\n const runtime: AcpSessionRuntime = {\n sessionId,\n cwd: params.cwd,\n additionalDirectories: params.additionalDirectories ?? [],\n mcpServers,\n clientTools,\n session,\n execution,\n agent,\n provider,\n tools: wrappedTools,\n modeId: this.defaultModeId,\n configOptions: cloneConfigOptions(this.defaultConfigOptions),\n config: new Map(),\n ...(runModel !== undefined ? { runModel } : {}),\n ...(router ? { setProviderDelegate: router.setDelegate } : {}),\n }\n this.installHookAdapter(runtime)\n const promptFreeze = installAcpPromptCache({ agent, session, key: `acp:${agentOptions.name ?? base.name ?? 'agent'}`, freeze: this.options.freezeSystemPrompt !== false })\n if (promptFreeze)\n this.promptFreezes.set(runtime, promptFreeze)\n this.sessions.set(sessionId, runtime)\n session.setMeta('acp.cwd', params.cwd)\n session.setMeta('acp.additionalDirectories', params.additionalDirectories ?? [])\n if (session.store)\n await session.save().catch(() => undefined)\n return runtime\n }\n\n private async resolveSession(sessionId: string | undefined, cwd: string, mustExist: boolean): Promise<Session> {\n const store = this.options.store\n if (sessionId && this.sessions.has(sessionId))\n return this.sessions.get(sessionId)!.session\n if (sessionId && store) {\n const existing = await loadSession(store, sessionId)\n if (existing)\n return existing\n if (mustExist)\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n }\n else if (sessionId && mustExist) {\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n }\n // The shared lifecycle factory: cwd + project root (the editor's\n // workspace), default agent, title — same stamping as every surface.\n const created = await newSession(store, { cwd, title: 'ACP session', ...(sessionId ? { id: sessionId } : {}) })\n if (store)\n await created.save()\n return created\n }\n\n private resolveExecution(params: NewSessionRequest | LoadSessionRequest | ResumeSessionRequest) {\n if (typeof this.options.execution === 'function')\n return this.options.execution(params)\n return this.options.execution ?? createProcessContext({ cwd: params.cwd })\n }\n\n private resolveProvider(): Provider {\n // Registry mode: the default choice's provider backs initialization-time\n // reads (e.g. prompt capabilities). Per-session routing is handled in\n // `createRuntime`/`selectModel`.\n if (this.defaultModelChoiceId !== undefined)\n return this.providerForChoiceId(this.defaultModelChoiceId)\n const provider = this.options.provider\n if (provider === undefined)\n throw new AcpProtocolError(AcpErrorCode.InternalError, 'No provider configured.')\n return typeof provider === 'function' ? provider() : provider\n }\n\n private installHookAdapter(runtime: AcpSessionRuntime): void {\n const seenTools = new Set<string>()\n\n runtime.agent.hooks.hook('tool:gate', (ctx) => {\n if (runtime.modeId !== PLAN_MODE_ID || isPlanReadOnlyTool(ctx.name, runtime))\n return\n ctx.block = true\n ctx.reason = `Plan mode is read-only. Switch to Build mode before using \\`${ctx.name}\\`.`\n })\n runtime.agent.hooks.hook('mcp:tool:gate', (ctx) => {\n if (runtime.modeId !== PLAN_MODE_ID)\n return\n ctx.block = true\n ctx.reason = `Plan mode is read-only. Switch to Build mode before using MCP tool \\`${ctx.tool}\\`.`\n })\n\n runtime.agent.hooks.hook('stream:text', ({ delta, turnId }) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'agent_message_chunk',\n messageId: turnId,\n content: { type: 'text', text: delta },\n })\n })\n runtime.agent.hooks.hook('stream:thinking', ({ delta, turnId }) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'agent_thought_chunk',\n messageId: turnId,\n content: { type: 'text', text: delta },\n })\n })\n runtime.agent.hooks.hook('tool:gate', async (ctx) => {\n if (!this.shouldRequestPermission(ctx.name, ctx.input, runtime))\n return\n const key = permissionKey(ctx.name, ctx.input)\n const cached = runtime.config.get(key)\n if (cached === 'allow')\n return\n if (cached === 'reject') {\n ctx.block = true\n ctx.reason = 'Rejected by prior ACP permission decision.'\n return\n }\n const outcome = await this.requestPermission(runtime, {\n toolCallId: ctx.callId,\n title: ctx.name,\n kind: toolKindForName(ctx.name),\n status: 'pending',\n rawInput: ctx.input,\n })\n if (outcome.outcome === 'cancelled') {\n ctx.block = true\n ctx.reason = 'Cancelled by ACP client.'\n return\n }\n if (outcome.optionId === 'allow_always')\n runtime.config.set(key, 'allow')\n if (outcome.optionId === 'reject_always')\n runtime.config.set(key, 'reject')\n if (outcome.optionId.startsWith('reject')) {\n ctx.block = true\n ctx.reason = 'Rejected by ACP client.'\n }\n })\n runtime.agent.hooks.hook('tool:dispatched', (ctx) => {\n seenTools.add(ctx.callId)\n const status = ctx.outcome === 'gate-block' || ctx.outcome === 'invalid-input' || ctx.outcome === 'unknown' ? 'failed' : 'pending'\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call',\n toolCallId: ctx.callId,\n title: ctx.name,\n kind: toolKindForName(ctx.name),\n status,\n rawInput: ctx.input,\n ...(status === 'failed' ? { rawOutput: ctx.reason ?? ctx.outcome } : {}),\n })\n })\n runtime.agent.hooks.hook('tool:before', (ctx) => {\n if (!seenTools.has(ctx.callId)) {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call',\n toolCallId: ctx.callId,\n title: ctx.name,\n kind: toolKindForName(ctx.name),\n status: 'in_progress',\n rawInput: ctx.input,\n })\n return\n }\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'in_progress',\n })\n })\n runtime.agent.hooks.hook('tool:after', (ctx) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'completed',\n content: toolResultToAcpContent(ctx.result),\n rawOutput: ctx.result,\n })\n })\n runtime.agent.hooks.hook('tool:error', (ctx) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'failed',\n rawOutput: errorMessage(ctx.error),\n })\n })\n runtime.agent.hooks.hook('tool:cancelled', (ctx) => {\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'tool_call_update',\n toolCallId: ctx.callId,\n status: 'failed',\n rawOutput: ctx.reason ?? 'cancelled',\n })\n })\n runtime.agent.hooks.hook('turn:after', ({ usage, cumulativeUsage }) => {\n // ACP `usage_update.used` is \"tokens currently in context\" and must track\n // `size`. Report the latest turn's effective input (input + cache read +\n // cache creation) — NOT the run-cumulative total, which would climb past\n // the window across turns. `cost` stays cumulative per the ACP spec.\n // Emit only when a window size is resolvable (never fabricate `size`) and\n // when occupancy is known (skip 0-token placeholder/aborted turns so we\n // don't reset the client's context meter).\n const size = this.resolveContextWindow(runtime)\n if (size === undefined)\n return\n const used = effectiveInputFromTurn(usage)\n if (used <= 0)\n return\n const cost = usageCost(cumulativeUsage.cost)\n void this.sessionUpdate(runtime.sessionId, {\n sessionUpdate: 'usage_update',\n used,\n size,\n ...(cost ? { cost } : {}),\n })\n })\n }\n\n private resolveContextWindow(runtime: AcpSessionRuntime): number | undefined {\n if (typeof this.options.contextWindow === 'number' && this.options.contextWindow > 0)\n return this.options.contextWindow\n const fromBehavior = this.options.behavior?.autoCompact\n if (fromBehavior && typeof fromBehavior === 'object' && typeof fromBehavior.contextWindow === 'number' && fromBehavior.contextWindow > 0)\n return fromBehavior.contextWindow\n // Read the session's CURRENT provider (router-aware) so usage `size` tracks\n // the selected model's window after a `session/set_config_option` switch.\n // `typeof` despite the declared type: `Provider.meta` carries an open\n // `Record<string, unknown>` tail, so a third-party provider can still put a\n // string or null under `contextWindow` at runtime. This value feeds\n // `usage_update.size` directly, with no downstream validation.\n const fromMeta = runtime.provider.meta.contextWindow\n if (typeof fromMeta === 'number' && Number.isFinite(fromMeta) && fromMeta > 0)\n return fromMeta\n return undefined\n }\n\n private shouldRequestPermission(name: string, input: Record<string, unknown>, runtime: AcpSessionRuntime): boolean {\n const policy = this.options.permission\n if (policy?.enabled !== true || !this.peer)\n return false\n if (runtime.clientTools.some(tool => tool.name === name && tool.mutating))\n return true\n if (policy.toolMatcher)\n return policy.toolMatcher(name, input)\n return name === 'shell' || name === 'write_file' || name === 'edit' || name === 'multi_edit'\n }\n\n private async requestPermission(runtime: AcpSessionRuntime, toolCall: ToolCallUpdate): Promise<RequestPermissionOutcome> {\n const peer = this.requirePeer()\n const request = peer.sendRequest('session/request_permission', {\n sessionId: runtime.sessionId,\n toolCall,\n options: this.options.permission?.options ?? DEFAULT_PERMISSION_OPTIONS,\n }) as Promise<{ outcome?: RequestPermissionOutcome }>\n const aborted = new Promise<{ outcome: RequestPermissionOutcome }>((resolve) => {\n const signal = runtime.abortController?.signal\n if (!signal)\n return\n if (signal.aborted) {\n resolve({ outcome: { outcome: 'cancelled' } })\n return\n }\n signal.addEventListener('abort', () => resolve({ outcome: { outcome: 'cancelled' } }), { once: true })\n })\n const response = await Promise.race([request, aborted])\n return response.outcome ?? { outcome: 'cancelled' }\n }\n\n private async sessionUpdate(sessionId: string, update: SessionUpdate): Promise<void> {\n await this.notify('session/update', { sessionId, update })\n }\n\n private requireSession(sessionId: string): AcpSessionRuntime {\n const runtime = this.sessions.get(sessionId)\n if (!runtime)\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n return runtime\n }\n\n private requirePeer(): AcpPeer {\n if (!this.peer) {\n return {\n sendNotification: () => undefined,\n sendRequest: () => Promise.reject(new AcpProtocolError(AcpErrorCode.MethodNotFound, 'No ACP client peer is attached.')),\n }\n }\n return this.peer\n }\n}\n\n/** Error with a JSON-RPC error code. Throwing it from a handler produces an error response with that code and data. */\nexport class AcpProtocolError extends Error {\n /**\n * @param code - JSON-RPC error code, usually an `AcpErrorCode` value.\n * @param message - Human-readable error message.\n * @param data - Optional extra data sent in the error response.\n */\n constructor(readonly code: number, message: string, readonly data?: unknown) {\n super(message)\n this.name = 'AcpProtocolError'\n }\n}\n\n/**\n * A provider that forwards every call to a swappable delegate. Lets a session\n * change its underlying provider (and thus credentials) on a model switch\n * without rebuilding the agent — the loop reads `formatTools` / message builders\n * / `meta` / `stream` fresh each run, and switches only happen between prompts.\n */\nfunction createProviderRouter(initial: Provider): { provider: Provider, setDelegate: (provider: Provider) => void } {\n let delegate = initial\n const provider: Provider = {\n get name() { return delegate.name },\n get meta() { return delegate.meta },\n formatTools: tools => delegate.formatTools(tools),\n userMessage: content => delegate.userMessage(content),\n assistantMessage: content => delegate.assistantMessage(content),\n toolResultsMessage: results => delegate.toolResultsMessage(results),\n stream: (options, callbacks) => delegate.stream(options, callbacks),\n promptMessage: parts => routePromptMessage(delegate, parts),\n classifyError: err => (delegate.classifyError ? delegate.classifyError(err) : null),\n countTokens: (payload, signal) => (delegate.countTokens ? delegate.countTokens(payload, signal) : Promise.resolve(null)),\n }\n return { provider, setDelegate: (next) => { delegate = next } }\n}\n\nfunction routePromptMessage(delegate: Provider, parts: PromptPart[]) {\n if (delegate.promptMessage)\n return delegate.promptMessage(parts)\n return defaultPromptMessage(parts)\n}\n\nfunction mergeTools(...sources: Array<Record<string, ToolDef> | undefined>): Record<string, ToolDef> | undefined {\n const out: Record<string, ToolDef> = {}\n for (const source of sources) {\n if (source)\n Object.assign(out, source)\n }\n return Object.keys(out).length > 0 ? out : undefined\n}\n\nfunction mergeMcpServers(...sources: Array<readonly McpServerConfig[] | undefined>): McpServerConfig[] {\n const byName = new Map<string, McpServerConfig>()\n for (const source of sources) {\n for (const server of source ?? [])\n byName.set(server.name, server)\n }\n return [...byName.values()]\n}\n\nfunction cloneConfigOptions(options: readonly SessionConfigOption[]): SessionConfigOption[] {\n return options.map(option => ({\n ...option,\n options: option.options.map(item => 'group' in item\n ? { ...item, options: item.options.map(child => ({ ...child })) }\n : { ...item }) as SessionConfigOption['options'],\n }))\n}\n\nfunction configOptionHasValue(option: SessionConfigOption, value: string): boolean {\n for (const item of option.options) {\n if ('group' in item) {\n if (item.options.some(child => child.value === value))\n return true\n }\n else if (item.value === value) {\n return true\n }\n }\n return false\n}\n\nfunction configValue(options: readonly SessionConfigOption[], id: string): string | undefined {\n return options.find(option => option.id === id)?.currentValue\n}\n\nfunction isGeneratedModelOptionConfig(id: string): boolean {\n return id.startsWith(MODEL_OPTION_CONFIG_PREFIX)\n}\n\nfunction thinkingLabel(level: ThinkingLevel): string {\n return level === 'xhigh'\n ? 'Extra high'\n : level.charAt(0).toUpperCase() + level.slice(1)\n}\n\nfunction sameStringArray(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index])\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n return stableStringify(left) === stableStringify(right)\n}\n\nfunction asObject<T>(value: unknown): T {\n if (!isObject(value))\n throw new AcpProtocolError(AcpErrorCode.InvalidParams, 'Expected object parameters.')\n return value as T\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction normalizeId(id: unknown) {\n return typeof id === 'string' || typeof id === 'number' || id === null ? id : null\n}\n\nfunction toRpcError(err: unknown): { code: number, message: string, data?: unknown } {\n if (err instanceof AcpProtocolError)\n return { code: err.code, message: err.message, ...(err.data !== undefined ? { data: err.data } : {}) }\n if (err instanceof ClientToolSpecError)\n return { code: err.code, message: err.message }\n return { code: AcpErrorCode.InternalError, message: err instanceof Error ? err.message : String(err) }\n}\n\nfunction sessionInfo(runtime: AcpSessionRuntime): SessionInfo {\n return {\n sessionId: runtime.sessionId,\n cwd: runtime.cwd,\n additionalDirectories: runtime.additionalDirectories,\n title: typeof runtime.session.metadata.title === 'string' ? runtime.session.metadata.title : null,\n updatedAt: new Date().toISOString(),\n }\n}\n\nfunction permissionKey(name: string, input: Record<string, unknown>): string {\n return `permission:${name}:${stableStringify(input)}`\n}\n\nfunction stableStringify(value: unknown): string {\n if (!isObject(value))\n return JSON.stringify(value)\n const keys = Object.keys(value).sort()\n const out: Record<string, unknown> = {}\n for (const key of keys)\n out[key] = value[key]\n return JSON.stringify(out)\n}\n\nfunction reachedMaxTurns(stats: AgentStats, behavior: AgentOptions['behavior'] | undefined): boolean {\n const maxTurns = behavior?.maxTurns\n return typeof maxTurns === 'number' && stats.turns >= maxTurns && lastFinishReason(stats.turnUsage) !== 'length'\n}\n\nfunction lastFinishReason(turnUsage: TurnUsage[] | undefined) {\n for (let i = (turnUsage?.length ?? 0) - 1; i >= 0; i--) {\n const reason = turnUsage?.[i]?.finishReason\n if (reason)\n return reason\n }\n return undefined\n}\n","import type { Readable, Writable } from 'node:stream'\nimport type { AcpServerOptions } from './types'\nimport { createJsonRpcConnection } from './json-rpc'\nimport { createAcpServer } from './server'\n\nexport { CLIENT_TOOL_CALL_METHOD, CLIENT_TOOL_CANCEL_METHOD, createClientDeclaredTools, parseClientToolSpecs } from './client-declared-tools'\nexport type { AcpClientToolSpec, ClientToolCallResponse } from './client-declared-tools'\nexport { wrapToolsForAcpClient } from './client-tools'\nexport type { AcpClientToolOptions } from './client-tools'\nexport { createJsonRpcConnection, JsonRpcRemoteError } from './json-rpc'\nexport type { JsonRpcConnection, JsonRpcConnectionOptions } from './json-rpc'\nexport { acpMcpServersToZidane, acpPromptToPromptParts, sessionBlocksToAcp, stopReasonFromRun, toolResultToAcpContent } from './mapping'\nexport { AcpProtocolError, createAcpServer, withAcpDefaultTools } from './server'\nexport type { AcpServer } from './server'\nexport type * from './types'\n\n/** Options for {@link runAcpStdioServer}: the {@link AcpServerOptions} plus the stdio transport settings. */\nexport interface RunAcpStdioServerOptions extends AcpServerOptions {\n /**\n * Stream to read client messages from.\n * @default process.stdin\n */\n input?: Readable\n /**\n * Stream to write agent messages to.\n * @default process.stdout\n */\n output?: Writable\n /**\n * Wire framing. `'newline'` is newline-delimited JSON, as ACP stdio requires.\n * @default 'newline'\n */\n framing?: 'content-length' | 'newline'\n /** Called with transport errors and failures that cannot be answered over the wire. */\n onError?: (error: Error) => void\n}\n\n/**\n * Runs an ACP agent over stdio, usually as the entry point of an editor-facing agent process.\n * Creates the server with {@link createAcpServer}, connects it to a JSON-RPC connection on `input` and `output`, and starts reading. Throws if neither `provider` nor `models` is set.\n * @param options - Server options plus the stdio streams and framing.\n * @returns The server, the connection, and a `close` function that closes the connection and destroys every open session.\n * @example\n * ```ts\n * import { runAcpStdioServer } from 'zidane/acp'\n * import { anthropic } from 'zidane/providers'\n *\n * const { close } = runAcpStdioServer({\n * provider: anthropic(),\n * model: 'claude-sonnet-4-5',\n * })\n *\n * process.on('SIGINT', () => {\n * void close().then(() => process.exit(0))\n * })\n * ```\n */\nexport function runAcpStdioServer(options: RunAcpStdioServerOptions) {\n const server = createAcpServer(options)\n const connection = createJsonRpcConnection({\n input: options.input ?? process.stdin,\n output: options.output ?? process.stdout,\n framing: options.framing,\n onError: options.onError,\n onRequest: message => server.handleMessage(message),\n onNotification: async (message) => {\n await server.handleMessage(message)\n },\n })\n server.setPeer(connection)\n connection.start()\n return {\n server,\n connection,\n async close() {\n connection.close()\n await server.close()\n },\n }\n}\n"],"mappings":"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"}
|