zidane 5.13.5 → 5.13.6

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.
@@ -976,6 +976,16 @@ const MODEL_CONFIG_ID = "model";
976
976
  const MODE_CONFIG_ID = "mode";
977
977
  const THINKING_CONFIG_ID = "thinking";
978
978
  const MODEL_OPTION_CONFIG_PREFIX = "model_option:";
979
+ const PLAN_MODE_ID = "plan";
980
+ const PLAN_READ_ONLY_TOOLS = new Set([
981
+ "read_file",
982
+ "list_files",
983
+ "grep",
984
+ "glob",
985
+ "web_search",
986
+ "fetch_url",
987
+ "skills_read"
988
+ ]);
979
989
  const DEFAULT_PERMISSION_OPTIONS = [
980
990
  {
981
991
  optionId: "allow_once",
@@ -1270,6 +1280,7 @@ var AcpServerImpl = class {
1270
1280
  prompt: mapped.prompt,
1271
1281
  ...runtime.runModel ? { model: runtime.runModel } : {},
1272
1282
  ...this.runConfig(runtime),
1283
+ ...this.toolsForMode(runtime),
1273
1284
  ...this.options.system ? { system: this.options.system } : {},
1274
1285
  signal: abortController.signal
1275
1286
  });
@@ -1359,6 +1370,10 @@ var AcpServerImpl = class {
1359
1370
  ...Object.keys(modelOptions).length > 0 ? { modelOptions } : {}
1360
1371
  };
1361
1372
  }
1373
+ toolsForMode(runtime) {
1374
+ if (runtime.modeId !== PLAN_MODE_ID) return {};
1375
+ return { tools: filterPlanTools(runtime.tools) };
1376
+ }
1362
1377
  refreshModelDependentConfigOptions(runtime, choiceId) {
1363
1378
  const insertAfter = (option) => option.id === MODEL_CONFIG_ID;
1364
1379
  const base = runtime.configOptions.filter((option) => option.id !== THINKING_CONFIG_ID && !isGeneratedModelOptionConfig(option.id));
@@ -1474,6 +1489,7 @@ var AcpServerImpl = class {
1474
1489
  execution,
1475
1490
  agent,
1476
1491
  provider,
1492
+ tools: wrappedTools,
1477
1493
  modeId: this.defaultModeId,
1478
1494
  configOptions: cloneConfigOptions(this.defaultConfigOptions),
1479
1495
  config: /* @__PURE__ */ new Map(),
@@ -1525,6 +1541,16 @@ var AcpServerImpl = class {
1525
1541
  }
1526
1542
  installHookAdapter(runtime) {
1527
1543
  const seenTools = /* @__PURE__ */ new Set();
1544
+ runtime.agent.hooks.hook("tool:gate", (ctx) => {
1545
+ if (runtime.modeId !== PLAN_MODE_ID || isPlanReadOnlyTool(ctx.name)) return;
1546
+ ctx.block = true;
1547
+ ctx.reason = `Plan mode is read-only. Switch to Build mode before using \`${ctx.name}\`.`;
1548
+ });
1549
+ runtime.agent.hooks.hook("mcp:tool:gate", (ctx) => {
1550
+ if (runtime.modeId !== PLAN_MODE_ID) return;
1551
+ ctx.block = true;
1552
+ ctx.reason = `Plan mode is read-only. Switch to Build mode before using MCP tool \`${ctx.tool}\`.`;
1553
+ });
1528
1554
  runtime.agent.hooks.hook("stream:text", ({ delta, turnId }) => {
1529
1555
  this.sessionUpdate(runtime.sessionId, {
1530
1556
  sessionUpdate: "agent_message_chunk",
@@ -1747,6 +1773,14 @@ function mergeMcpServers(...sources) {
1747
1773
  for (const source of sources) for (const server of source ?? []) byName.set(server.name, server);
1748
1774
  return [...byName.values()];
1749
1775
  }
1776
+ function filterPlanTools(tools) {
1777
+ const filtered = {};
1778
+ for (const [key, tool] of Object.entries(tools ?? {})) if (isPlanReadOnlyTool(tool.spec.name)) filtered[key] = tool;
1779
+ return filtered;
1780
+ }
1781
+ function isPlanReadOnlyTool(name) {
1782
+ return PLAN_READ_ONLY_TOOLS.has(name);
1783
+ }
1750
1784
  function cloneConfigOptions(options) {
1751
1785
  return options.map((option) => ({
1752
1786
  ...option,
@@ -1858,4 +1892,4 @@ function runAcpStdioServer(options) {
1858
1892
  //#endregion
1859
1893
  export { acpMcpServersToZidane as a, stopReasonFromRun as c, buildStartLocalOptions as d, parseStartArgValues as f, createJsonRpcConnection as g, JsonRpcRemoteError as h, wrapToolsForAcpClient as i, toolResultToAcpContent as l, startProviderNames as m, AcpProtocolError as n, acpPromptToPromptParts as o, startLocalArgOptions as p, createAcpServer as r, sessionBlocksToAcp as s, runAcpStdioServer as t, StartUsageError as u };
1860
1894
 
1861
- //# sourceMappingURL=acp-CJ1yHdpK.js.map
1895
+ //# sourceMappingURL=acp-BRQvvdnO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-BRQvvdnO.js","names":["isObject","lastFinishReason","basic"],"sources":["../src/acp/json-rpc.ts","../src/start/shared-options.ts","../src/acp/mapping.ts","../src/acp/client-tools.ts","../src/acp/server.ts","../src/acp/index.ts"],"sourcesContent":["import type { Readable, Writable } from 'node:stream'\nimport type { AcpPeer, JsonRpcFailure, JsonRpcId, JsonRpcMessage, JsonRpcRequest, JsonRpcResponse } from './types'\nimport { Buffer } from 'node:buffer'\nimport { AcpErrorCode } from './types'\n\nexport interface JsonRpcConnectionOptions {\n input: Readable\n output: Writable\n onRequest: (message: JsonRpcRequest) => Promise<JsonRpcResponse | null | undefined> | JsonRpcResponse | null | undefined\n onNotification?: (message: JsonRpcMessage & { method: string, id?: undefined }) => void | Promise<void>\n framing?: 'content-length' | 'newline'\n onError?: (error: Error) => void\n}\n\nexport interface JsonRpcConnection extends AcpPeer {\n start: () => void\n close: () => void\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n}\n\nexport function createJsonRpcConnection(options: JsonRpcConnectionOptions): JsonRpcConnection {\n let nextId = 1\n let closed = false\n let buffer: Buffer<ArrayBufferLike> = Buffer.alloc(0)\n const pending = new Map<JsonRpcId, PendingRequest>()\n\n const writeMessage = (message: JsonRpcMessage): void => {\n if (closed)\n return\n const json = JSON.stringify({ ...message, jsonrpc: '2.0' })\n // ACP stdio framing is newline-delimited JSON (NDJSON) and is the default.\n // `JSON.stringify` escapes any embedded newline, so a serialized message is\n // always a single line. LSP-style `Content-Length` framing is opt-in for\n // non-ACP transports only.\n if (options.framing === 'content-length') {\n const bytes = Buffer.byteLength(json)\n options.output.write(`Content-Length: ${bytes}\\r\\n\\r\\n${json}`)\n return\n }\n options.output.write(`${json}\\n`)\n }\n\n const handleParsed = async (message: unknown): Promise<void> => {\n if (!isObject(message)) {\n writeMessage(errorResponse(null, AcpErrorCode.InvalidRequest, 'Invalid JSON-RPC message.'))\n return\n }\n\n const msg = message as unknown as JsonRpcMessage\n if ('id' in msg && ('result' in msg || 'error' in msg)) {\n const request = pending.get(msg.id)\n if (!request)\n return\n pending.delete(msg.id)\n if ('error' in msg && msg.error) {\n request.reject(new JsonRpcRemoteError(msg.error.message, msg.error.code, msg.error.data))\n }\n else {\n request.resolve((msg as { result?: unknown }).result)\n }\n return\n }\n\n if (typeof (msg as { method?: unknown }).method !== 'string') {\n writeMessage(errorResponse(('id' in msg ? msg.id : null) ?? null, AcpErrorCode.InvalidRequest, 'Missing JSON-RPC method.'))\n return\n }\n\n if ('id' in msg) {\n try {\n const response = await options.onRequest(msg as JsonRpcRequest)\n if (response)\n writeMessage(response)\n }\n catch (err) {\n writeMessage(errorResponse(msg.id, AcpErrorCode.InternalError, err instanceof Error ? err.message : String(err)))\n }\n return\n }\n\n try {\n await options.onNotification?.(msg as JsonRpcMessage & { method: string, id?: undefined })\n }\n catch (err) {\n options.onError?.(err instanceof Error ? err : new Error(String(err)))\n }\n }\n\n const onData = (chunk: Buffer | string): void => {\n buffer = Buffer.concat([buffer, typeof chunk === 'string' ? Buffer.from(chunk) : chunk])\n for (;;) {\n let parsed: { message: unknown, rest: Buffer<ArrayBufferLike> } | null\n try {\n parsed = readNextMessage(buffer)\n }\n catch (err) {\n buffer = Buffer.alloc(0)\n writeMessage(errorResponse(null, AcpErrorCode.ParseError, err instanceof Error ? err.message : String(err)))\n break\n }\n if (!parsed)\n break\n buffer = parsed.rest\n void handleParsed(parsed.message)\n }\n }\n\n const onError = (err: Error): void => {\n options.onError?.(err)\n }\n\n return {\n start() {\n options.input.on('data', onData)\n options.input.on('error', onError)\n },\n close() {\n closed = true\n options.input.off('data', onData)\n options.input.off('error', onError)\n for (const request of pending.values())\n request.reject(new Error('JSON-RPC connection closed.'))\n pending.clear()\n },\n sendNotification(method: string, params?: unknown) {\n writeMessage({ jsonrpc: '2.0', method, ...(params !== undefined ? { params } : {}) })\n },\n sendRequest(method: string, params?: unknown) {\n if (closed)\n return Promise.reject(new Error('JSON-RPC connection is closed.'))\n const id = nextId++\n writeMessage({ jsonrpc: '2.0', id, method, ...(params !== undefined ? { params } : {}) })\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n })\n },\n }\n}\n\nexport class JsonRpcRemoteError extends Error {\n constructor(message: string, readonly code: number, readonly data?: unknown) {\n super(message)\n this.name = 'JsonRpcRemoteError'\n }\n}\n\nexport function successResponse(id: JsonRpcId, result: unknown = {}): JsonRpcResponse {\n return { jsonrpc: '2.0', id, result }\n}\n\nexport function errorResponse(id: JsonRpcId, code: number, message: string, data?: unknown): JsonRpcFailure {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n }\n}\n\nfunction readNextMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n if (input.length === 0)\n return null\n\n const headerEnd = input.indexOf('\\r\\n\\r\\n')\n if (headerEnd >= 0) {\n const header = input.subarray(0, headerEnd).toString('utf8')\n const match = /^Content-Length:\\s*(\\d+)/im.exec(header)\n if (!match)\n return readLineMessage(input)\n const length = Number(match[1])\n const bodyStart = headerEnd + 4\n const bodyEnd = bodyStart + length\n if (input.length < bodyEnd)\n return null\n const body = input.subarray(bodyStart, bodyEnd).toString('utf8')\n return { message: JSON.parse(body), rest: input.subarray(bodyEnd) }\n }\n\n if (/^Content-Length:/i.test(input.subarray(0, Math.min(input.length, 32)).toString('utf8')))\n return null\n\n return readLineMessage(input)\n}\n\nfunction readLineMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n let rest = input\n // Skip blank lines: NDJSON streams may contain stray newlines (e.g. a keep-\n // alive or a trailing separator). Emitting an error for those would be wrong.\n for (;;) {\n const lineEnd = rest.indexOf('\\n')\n if (lineEnd < 0)\n return null\n const line = rest.subarray(0, lineEnd).toString('utf8').trim()\n rest = rest.subarray(lineEnd + 1)\n if (line.length === 0)\n continue\n return { message: JSON.parse(line), rest }\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n","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', 'arcee', 'baseten', '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 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 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 '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': { 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 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 ...(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 json: values.json === true,\n streamJson: values['stream-json'] === true,\n format,\n }\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 ` --stream-json streams COMPLETE TURNS as JSONL (one line per turn), then the result.`,\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 { 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\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\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\nexport function sessionBlocksToAcp(blocks: readonly SessionContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = []\n for (const block of blocks) {\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\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\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 { resolveAcpPath } from './mapping'\n\nexport interface AcpClientToolOptions {\n client: AcpPeer\n sessionId: string\n capabilities: AcpClientCapabilities\n useClientFileSystem?: boolean\n useClientTerminal?: boolean\n}\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 return {\n ...base,\n async execute(input, ctx) {\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 line = lineOrDefault(input.offset)\n const limit = positiveNumberOrNull(input.limit)\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 const content = typeof response.content === 'string' ? response.content : ''\n seedReadState(ctx, absPath, content, line ?? 1, limit ?? Number.POSITIVE_INFINITY)\n if (input.lineNumbers === false)\n return content\n return withLineNumbers(content, line ?? 1)\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","import type { AgentOptions } from '../agent'\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 {\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 { createProcessContext } from '../contexts'\nimport { errorMessage } from '../errors'\nimport { basic } from '../presets'\nimport { defaultPromptMessage } from '../prompt'\nimport { createSession, loadSession } from '../session'\nimport { validThinkingLevels } from '../start/shared-options'\nimport { effectiveInputFromTurn } from '../stats'\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 { 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\nconst PLAN_MODE_ID = 'plan'\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\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\nexport interface AcpServer {\n setPeer: (peer: AcpPeer) => void\n handleMessage: (message: JsonRpcMessage) => Promise<JsonRpcResponse | null>\n handleRequest: (method: string, params?: unknown) => Promise<unknown>\n notify: (method: string, params?: unknown) => Promise<void>\n close: () => Promise<void>\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\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 },\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 }, 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 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 const ids = await store.list({ limit: 100, ...(params.cwd ? { projectRoot: params.cwd } : {}) })\n const sessions: SessionInfo[] = []\n for (const id of ids) {\n const loaded = await store.load(id)\n if (!loaded)\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 = 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 stats = await runtime.agent.run({\n prompt: mapped.prompt,\n ...(runtime.runModel ? { model: runtime.runModel } : {}),\n ...this.runConfig(runtime),\n ...this.toolsForMode(runtime),\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 toolsForMode(runtime: AcpSessionRuntime): { tools?: Record<string, ToolDef> } {\n if (runtime.modeId !== PLAN_MODE_ID)\n return {}\n return { tools: filterPlanTools(runtime.tools) }\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 return existing\n }\n }\n\n const mcpServers = acpMcpServersToZidane(params.mcpServers)\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 base = this.options.preset ?? basic\n const agentOptions = this.options.agentOptions ?? {}\n const tools = mergeTools(base.tools, agentOptions.tools, this.options.tools)\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 const behavior = { ...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 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 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 const created = await createSession({ id: sessionId, store, projectRoot: cwd, metadata: { title: 'ACP session' } })\n await created.save()\n return created\n }\n if (sessionId && mustExist)\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n const created = await createSession({ ...(sessionId ? { id: sessionId } : {}), ...(store ? { store } : {}), projectRoot: cwd, metadata: { title: 'ACP session' } })\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))\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))\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 const meta = runtime.provider.meta as { contextWindow?: unknown }\n if (typeof meta.contextWindow === 'number' && meta.contextWindow > 0)\n return meta.contextWindow\n return undefined\n }\n\n private shouldRequestPermission(name: string, input: Record<string, unknown>): boolean {\n const policy = this.options.permission\n if (policy?.enabled !== true || !this.peer)\n return false\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\nexport class AcpProtocolError extends Error {\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 filterPlanTools(tools: Record<string, ToolDef> | undefined): Record<string, ToolDef> {\n const filtered: Record<string, ToolDef> = {}\n for (const [key, tool] of Object.entries(tools ?? {})) {\n if (isPlanReadOnlyTool(tool.spec.name))\n filtered[key] = tool\n }\n return filtered\n}\n\nfunction isPlanReadOnlyTool(name: string): boolean {\n return PLAN_READ_ONLY_TOOLS.has(name)\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 isThinkingLevel(value: unknown): value is ThinkingLevel {\n return typeof value === 'string' && (validThinkingLevels as readonly string[]).includes(value)\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 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 { 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 } from './server'\nexport type { AcpServer } from './server'\nexport type * from './types'\n\nexport interface RunAcpStdioServerOptions extends AcpServerOptions {\n input?: Readable\n output?: Writable\n framing?: 'content-length' | 'newline'\n onError?: (error: Error) => void\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":";;;;;;;;;;;;;;AAwBA,SAAgB,wBAAwB,SAAsD;CAC5F,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,SAAkC,OAAO,MAAM,CAAC;CACpD,MAAM,0BAAU,IAAI,IAA+B;CAEnD,MAAM,gBAAgB,YAAkC;EACtD,IAAI,QACF;EACF,MAAM,OAAO,KAAK,UAAU;GAAE,GAAG;GAAS,SAAS;EAAM,CAAC;EAK1D,IAAI,QAAQ,YAAY,kBAAkB;GACxC,MAAM,QAAQ,OAAO,WAAW,IAAI;GACpC,QAAQ,OAAO,MAAM,mBAAmB,MAAM,UAAU,MAAM;GAC9D;EACF;EACA,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;CAClC;CAEA,MAAM,eAAe,OAAO,YAAoC;EAC9D,IAAI,CAACA,WAAS,OAAO,GAAG;GACtB,aAAa,cAAc,MAAA,QAAmC,2BAA2B,CAAC;GAC1F;EACF;EAEA,MAAM,MAAM;EACZ,IAAI,QAAQ,QAAQ,YAAY,OAAO,WAAW,MAAM;GACtD,MAAM,UAAU,QAAQ,IAAI,IAAI,EAAE;GAClC,IAAI,CAAC,SACH;GACF,QAAQ,OAAO,IAAI,EAAE;GACrB,IAAI,WAAW,OAAO,IAAI,OACxB,QAAQ,OAAO,IAAI,mBAAmB,IAAI,MAAM,SAAS,IAAI,MAAM,MAAM,IAAI,MAAM,IAAI,CAAC;QAGxF,QAAQ,QAAS,IAA6B,MAAM;GAEtD;EACF;EAEA,IAAI,OAAQ,IAA6B,WAAW,UAAU;GAC5D,aAAa,eAAe,QAAQ,MAAM,IAAI,KAAK,SAAS,MAAA,QAAmC,0BAA0B,CAAC;GAC1H;EACF;EAEA,IAAI,QAAQ,KAAK;GACf,IAAI;IACF,MAAM,WAAW,MAAM,QAAQ,UAAU,GAAqB;IAC9D,IAAI,UACF,aAAa,QAAQ;GACzB,SACO,KAAK;IACV,aAAa,cAAc,IAAI,IAAA,QAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;GAClH;GACA;EACF;EAEA,IAAI;GACF,MAAM,QAAQ,iBAAiB,GAA0D;EAC3F,SACO,KAAK;GACV,QAAQ,UAAU,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;EACvE;CACF;CAEA,MAAM,UAAU,UAAiC;EAC/C,SAAS,OAAO,OAAO,CAAC,QAAQ,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC;EACvF,SAAS;GACP,IAAI;GACJ,IAAI;IACF,SAAS,gBAAgB,MAAM;GACjC,SACO,KAAK;IACV,SAAS,OAAO,MAAM,CAAC;IACvB,aAAa,cAAc,MAAA,QAA+B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,CAAC;IAC3G;GACF;GACA,IAAI,CAAC,QACH;GACF,SAAS,OAAO;GAChB,aAAkB,OAAO,OAAO;EAClC;CACF;CAEA,MAAM,WAAW,QAAqB;EACpC,QAAQ,UAAU,GAAG;CACvB;CAEA,OAAO;EACL,QAAQ;GACN,QAAQ,MAAM,GAAG,QAAQ,MAAM;GAC/B,QAAQ,MAAM,GAAG,SAAS,OAAO;EACnC;EACA,QAAQ;GACN,SAAS;GACT,QAAQ,MAAM,IAAI,QAAQ,MAAM;GAChC,QAAQ,MAAM,IAAI,SAAS,OAAO;GAClC,KAAK,MAAM,WAAW,QAAQ,OAAO,GACnC,QAAQ,uBAAO,IAAI,MAAM,6BAA6B,CAAC;GACzD,QAAQ,MAAM;EAChB;EACA,iBAAiB,QAAgB,QAAkB;GACjD,aAAa;IAAE,SAAS;IAAO;IAAQ,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;GAAG,CAAC;EACtF;EACA,YAAY,QAAgB,QAAkB;GAC5C,IAAI,QACF,OAAO,QAAQ,uBAAO,IAAI,MAAM,gCAAgC,CAAC;GACnE,MAAM,KAAK;GACX,aAAa;IAAE,SAAS;IAAO;IAAI;IAAQ,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;GAAG,CAAC;GACxF,OAAO,IAAI,SAAS,SAAS,WAAW;IACtC,QAAQ,IAAI,IAAI;KAAE;KAAS;IAAO,CAAC;GACrC,CAAC;EACH;CACF;AACF;AAEA,IAAa,qBAAb,cAAwC,MAAM;CACN;CAAuB;CAA7D,YAAY,SAAiB,MAAuB,MAAyB;EAC3E,MAAM,OAAO;EADuB,KAAA,OAAA;EAAuB,KAAA,OAAA;EAE3D,KAAK,OAAO;CACd;AACF;AAEA,SAAgB,gBAAgB,IAAe,SAAkB,CAAC,GAAoB;CACpF,OAAO;EAAE,SAAS;EAAO;EAAI;CAAO;AACtC;AAEA,SAAgB,cAAc,IAAe,MAAc,SAAiB,MAAgC;CAC1G,OAAO;EACL,SAAS;EACT;EACA,OAAO;GACL;GACA;GACA,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;EACvC;CACF;AACF;AAEA,SAAS,gBAAgB,OAA4F;CACnH,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,MAAM,YAAY,MAAM,QAAQ,UAAU;CAC1C,IAAI,aAAa,GAAG;EAClB,MAAM,SAAS,MAAM,SAAS,GAAG,SAAS,EAAE,SAAS,MAAM;EAC3D,MAAM,QAAQ,6BAA6B,KAAK,MAAM;EACtD,IAAI,CAAC,OACH,OAAO,gBAAgB,KAAK;EAC9B,MAAM,SAAS,OAAO,MAAM,EAAE;EAC9B,MAAM,YAAY,YAAY;EAC9B,MAAM,UAAU,YAAY;EAC5B,IAAI,MAAM,SAAS,SACjB,OAAO;EACT,MAAM,OAAO,MAAM,SAAS,WAAW,OAAO,EAAE,SAAS,MAAM;EAC/D,OAAO;GAAE,SAAS,KAAK,MAAM,IAAI;GAAG,MAAM,MAAM,SAAS,OAAO;EAAE;CACpE;CAEA,IAAI,oBAAoB,KAAK,MAAM,SAAS,GAAG,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC,EAAE,SAAS,MAAM,CAAC,GACzF,OAAO;CAET,OAAO,gBAAgB,KAAK;AAC9B;AAEA,SAAS,gBAAgB,OAA4F;CACnH,IAAI,OAAO;CAGX,SAAS;EACP,MAAM,UAAU,KAAK,QAAQ,IAAI;EACjC,IAAI,UAAU,GACZ,OAAO;EACT,MAAM,OAAO,KAAK,SAAS,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK;EAC7D,OAAO,KAAK,SAAS,UAAU,CAAC;EAChC,IAAI,KAAK,WAAW,GAClB;EACF,OAAO;GAAE,SAAS,KAAK,MAAM,IAAI;GAAG;EAAK;CAC3C;AACF;AAEA,SAASA,WAAS,OAAkD;CAClE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AC3MA,MAAa,sBAAsB;CAAC;CAAO;CAAW;CAAO;CAAU;CAAQ;CAAS;CAAO;AAAU;AAEzG,MAAa,qBAAqB;CAAC;CAAa;CAAU;CAAc;CAAY;CAAO;CAAS;CAAW;CAAS;AAAe;AAGvI,MAAa,mBAAmB,CAAC,OAAO;AAGxC,MAAa,mBAAmB,CAAC,UAAU,UAAU;AAsCrD,IAAa,kBAAb,cAAqC,MAAM;CACzC,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,KAAK,OAAO;CACd;AACF;;;;;;;AAQA,MAAa,uBAAuB;CAClC,QAAQ;EAAE,MAAM;EAAW,OAAO;EAAK,SAAS;CAAM;CACtD,UAAU;EAAE,MAAM;EAAU,OAAO;CAAI;CACvC,SAAS;EAAE,MAAM;EAAU,OAAO;CAAI;CACtC,UAAU;EAAE,MAAM;EAAU,OAAO;EAAK,SAAS;CAAQ;CACzD,UAAU;EAAE,MAAM;EAAU,OAAO;CAAI;CACvC,YAAY;EAAE,MAAM;EAAU,SAAS;CAAM;CAC7C,YAAY;EAAE,MAAM;EAAU,SAAS;CAAY;CACnD,YAAY,EAAE,MAAM,SAAS;CAC7B,eAAe,EAAE,MAAM,SAAS;CAChC,eAAe,EAAE,MAAM,SAAS;CAChC,UAAU;EAAE,MAAM;EAAU,UAAU;CAAK;CAC3C,UAAU,EAAE,MAAM,UAAU;CAC5B,wBAAwB,EAAE,MAAM,UAAU;CAC1C,eAAe,EAAE,MAAM,SAAS;CAChC,QAAQ,EAAE,MAAM,SAAS;CACzB,WAAW;EAAE,MAAM;EAAU,OAAO;EAAK,SAAS;CAAU;CAC5D,SAAS,EAAE,MAAM,SAAS;CAC1B,OAAO,EAAE,MAAM,SAAS;CACxB,OAAO;EAAE,MAAM;EAAU,UAAU;CAAK;CACxC,YAAY;EAAE,MAAM;EAAU,UAAU;CAAK;CAC7C,WAAW,EAAE,MAAM,SAAS;CAC5B,WAAW,EAAE,MAAM,SAAS;CAC5B,sBAAsB,EAAE,MAAM,SAAS;CACvC,OAAO,EAAE,MAAM,SAAS;CACxB,cAAc,EAAE,MAAM,SAAS;CAC/B,cAAc,EAAE,MAAM,SAAS;CAC/B,QAAQ;EAAE,MAAM;EAAW,SAAS;CAAM;CAC1C,eAAe;EAAE,MAAM;EAAW,SAAS;CAAM;CACjD,UAAU;EAAE,MAAM;EAAU,SAAS;CAAS;AAChD;;;;;;;AAQA,SAAgB,oBACd,MACA,SACyB;CACzB,IAAI;EACF,MAAM,EAAE,WAAW,UAAU;GAC3B,MAAM,CAAC,GAAG,IAAI;GACd;GACA,QAAQ;EACV,CAAC;EACD,OAAO;CACT,SACO,KAAK;EAEV,MAAM,IAAI,gBAAgB,GADd,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAC1B,+BAA+B;CAClE;AACF;;AAUA,SAAgB,uBACd,QACA,SAAuC,CAAC,GACrB;CACnB,MAAM,EAAE,gBAAgB,MAAM,QAAQ,oBAAoB;CAE1D,IAAI,OAAO,SAAS,MAClB,MAAM,IAAI,gBAAgB,MAAM,CAAC;CAEnC,MAAM,SAAS,OAAO;CACtB,IAAI,kBAAkB,CAAC,UAAU,OAAO,KAAK,MAAM,KACjD,MAAM,IAAI,gBAAgB,MAAM,CAAC;CAEnC,MAAM,cAAe,OAAO,YAAmC;CAC/D,IAAI,CAAC,oBAAoB,SAAS,WAA4B,GAC5D,MAAM,IAAI,MAAM,2BAA2B,YAAY,eAAe,oBAAoB,KAAK,IAAI,GAAG;CAExG,MAAM,WAAa,OAAO,YAAmC;CAC7D,IAAI,CAAC,mBAAmB,SAAS,QAAQ,GACvC,MAAM,IAAI,MAAM,qBAAqB,SAAS,eAAe,mBAAmB,KAAK,IAAI,GAAG;CAE9F,MAAM,SAAW,OAAO,UAAiC;CACzD,IAAI,CAAC,iBAAiB,SAAS,MAAM,GACnC,MAAM,IAAI,MAAM,mBAAmB,OAAO,eAAe,iBAAiB,KAAK,IAAI,GAAG;CAExF,IAAI,OAAO,SAAS,QAAQ,OAAO,mBAAmB,MACpD,MAAM,IAAI,gBAAgB,mDAAmD;CAE/E,MAAM,SAAW,OAAO,UAAiC;CACzD,IAAI,CAAC,iBAAiB,SAAS,MAAM,GACnC,MAAM,IAAI,MAAM,mBAAmB,OAAO,eAAe,iBAAiB,KAAK,IAAI,GAAG;CAExF,MAAM,UAAU,OAAO;CACvB,MAAM,YAAY,OAAO;CACzB,MAAM,aAAa,OAAO;CAC1B,MAAM,eAAe,gBAAgB,OAAO,QAAgC,UAAU;CACtF,MAAM,cAAc,oBAAoB,OAAO,aAAmC,eAAe;CACjG,MAAM,OAAO,qBAAqB,OAAO,MAA4B,QAAQ;CAC7E,MAAM,MAAM,aAAa,OAAO,KAA6B,OAAO,WAAmC;CACvG,MAAM,UAAW,OAAO,WAAkC;CAC1D,MAAM,UAAU,YAAY,OAAO,SAA+B,OAAO;CACzE,MAAM,YAAY,iBAAiB,OAAO,SAA+B,OAAO;CAChF,MAAM,mBAAmB,wBAAwB,OAAO,uBAA6C,OAAO;CAE5G,OAAO;EACL,QAAQ,OAAO;EACf,QAAQ,UAAU;EAClB,OAAO,OAAO;EACd,GAAI,YAAY,KAAA,IAAY,EAAE,QAAQ,IAAI,CAAC;EAC3C,GAAI,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,CAAC;EAC/C,GAAI,eAAe,KAAA,IAAY,EAAE,WAAW,IAAI,CAAC;EACjD,GAAI,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;EAC/D,GAAI,OAAO,WAAW,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;EACjD,GAAI,OAAO,4BAA4B,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;EAC7E,GAAI,gBAAgB,KAAA,IAAY,EAAE,YAAY,IAAI,CAAC;EACnD,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;EACrC;EACA,UAAU;EACV;EACA;EACA,OAAO,OAAO;EACd,KAAK,OAAO;EACZ,GAAI,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,EAAE,IAAI,IAAI,CAAC;EAC7C,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC7B,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACjC,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;EAC/C,KAAK,eAAe,OAAO,GAAyB;EACpD,WAAW,OAAO;EAClB,WAAW,OAAO;EAClB,MAAM,OAAO,SAAS;EACtB,YAAY,OAAO,mBAAmB;EACtC;CACF;AACF;AAEA,SAAgB,kBAA0B;CACxC,OAAO;EACL;EACA,wBAAwB,mBAAmB,KAAK,GAAG,EAAE,+BAA+B,oBAAoB,KAAK,GAAG,EAAE;EAClH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;AACb;;;;;AAMA,SAAgB,eAAe,KAAwD;CACrF,IAAI,CAAC,KACH,OAAO,KAAA;CACT,IAAI,OAAO,IAAI,KAAK;CAEpB,IAAI,CAAC,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,GAC/C,OAAO,aAAa,MAAM,MAAM;CAClC,MAAM,SAAS,KAAK,MAAM,IAAI;CAC9B,MAAM,UAAU,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;CAExD,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,WAC1B,MAAM,IAAI,MAAM,sEAAsE,KAAK,UAAU,MAAM,GAAG;EAChH,IAAI,OAAO,cAAc,WAAW,CAAC,OAAO,SAC1C,MAAM,IAAI,MAAM,eAAe,OAAO,KAAK,sCAAsC;EACnF,KAAK,OAAO,cAAc,SAAS,OAAO,cAAc,sBAAsB,CAAC,OAAO,KACpF,MAAM,IAAI,MAAM,eAAe,OAAO,KAAK,KAAK,OAAO,UAAU,0BAA0B;CAC/F;CAEA,OAAO;AACT;AAEA,SAAS,oBAAoB,KAAyB,MAAkC;CACtF,IAAI,QAAQ,KAAA,GACV,OAAO,KAAA;CACT,MAAM,QAAQ,OAAO,GAAG;CACxB,IAAI,OAAO,MAAM,KAAK,GACpB,MAAM,IAAI,MAAM,GAAG,KAAK,0BAA0B,IAAI,GAAG;CAC3D,OAAO;AACT;AAIA,SAAS,qBAAqB,KAAyB,MAAkC;CACvF,IAAI,QAAQ,KAAA,GACV,OAAO,KAAA;CACT,MAAM,QAAQ,OAAO,GAAG;CACxB,IAAI,CAAC,OAAO,UAAU,KAAK,GACzB,MAAM,IAAI,MAAM,GAAG,KAAK,4BAA4B,IAAI,GAAG;CAC7D,OAAO;AACT;;;;;;;;AASA,SAAgB,aACd,SACA,aACA,SAA6C,QAAQ,KAC7B;CACxB,MAAM,MAA8B,CAAC;CAErC,KAAK,MAAM,QAAQ,eAAe,CAAC,GAAG;EACpC,MAAM,MAAM,KAAK,KAAK;EACtB,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,sCAAsC;EACxD,MAAM,QAAQ,OAAO;EACrB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,cAAc,IAAI,yBAAyB,IAAI,aAAa;EAC9E,IAAI,OAAO;CACb;CAEA,KAAK,MAAM,QAAQ,WAAW,CAAC,GAAG;EAChC,MAAM,KAAK,KAAK,QAAQ,GAAG;EAC3B,MAAM,MAAM,OAAO,KAAK,KAAK,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK;EACpD,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,8CAA8C,KAAK,GAAG;EACxE,IAAI,OAAO,KAAK,MAAM,KAAK,CAAC;CAC9B;CAEA,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,YACd,MACA,SAC+C;CAC/C,IAAI,CAAC,MACH,OAAO,KAAA;CACT,IAAI,CAAC,2BAA2B,OAAO,GAAG;EACxC,QAAQ,MAAM,uFAAuF,QAAQ,GAAG;EAChH;CACF;CACA,IAAI;CACJ,IAAI;EACF,UAAU,aAAa,MAAM,MAAM;CACrC,SACO,KAAK;EACV,MAAM,IAAI,MAAM,8BAA8B,KAAK,KAAM,IAAc,SAAS;CAClF;CACA,OAAO;EAAE,MAAM,SAAS,IAAI;EAAG;CAAQ;AACzC;;;;;;;;AASA,SAAgB,iBACd,KACA,SACoB;CACpB,MAAM,KAAK,KAAK,KAAK;CACrB,IAAI,CAAC,IACH,OAAO,KAAA;CACT,IAAI,CAAC,2BAA2B,OAAO,GAAG;EACxC,QAAQ,MAAM,uFAAuF,QAAQ,GAAG;EAChH;CACF;CACA,OAAO;AACT;AAEA,MAAM,8BAA8B;CAAC;CAAQ;CAAS;AAAO;;;;;;;AAS7D,SAAgB,wBACd,KACA,SACmC;CACnC,MAAM,QAAQ,KAAK,KAAK;CACxB,IAAI,CAAC,OACH,OAAO,KAAA;CACT,IAAI,CAAC,2BAA2B,OAAO,GAAG;EACxC,QAAQ,MAAM,kGAAkG,QAAQ,GAAG;EAC3H;CACF;CACA,IAAI,CAAC,4BAA4B,SAAS,KAA8B,GACtE,MAAM,IAAI,gBAAgB,uDAAuD,MAAM,GAAG;CAC5F,OAAO;AACT;AAEA,SAAS,2BAA2B,SAA0B;CAC5D,OAAO,YAAY,SAAS,YAAY;AAC1C;AAEA,SAAS,gBAAgB,KAA2B,MAAsC;CACxF,IAAI,CAAC,OAAO,IAAI,WAAW,GACzB,OAAO,CAAC;CAEV,MAAM,UAAkC,CAAC;CACzC,KAAK,MAAM,QAAQ,KAAK;EACtB,MAAM,QAAQ,KAAK,QAAQ,GAAG;EAC9B,MAAM,SAAS,KAAK,QAAQ,GAAG;EAC/B,MAAM,YAAY,UAAU,KAAK,SAAS,WAAW,KAAK,QAAQ,KAAK,IAAI,OAAO,MAAM;EACxF,IAAI,aAAa,GACf,MAAM,IAAI,MAAM,GAAG,KAAK,qDAAqD;EAE/E,MAAM,OAAO,KAAK,MAAM,GAAG,SAAS,EAAE,KAAK;EAC3C,MAAM,QAAQ,KAAK,MAAM,YAAY,CAAC,EAAE,KAAK;EAC7C,IAAI,CAAC,QAAQ,CAAC,OACZ,MAAM,IAAI,MAAM,GAAG,KAAK,4CAA4C;EACtE,QAAQ,QAAQ;CAClB;CACA,OAAO;AACT;;;AC3XA,SAAgB,sBAAsB,SAAiE;CACrG,IAAI,CAAC,SACH,OAAO,CAAC;CACV,OAAO,QAAQ,KAAK,WAA4B;EAC9C,IAAI,OAAO,SAAS,QAClB,OAAO;GACL,MAAM,OAAO;GACb,WAAW;GACX,KAAK,OAAO;GACZ,SAAS,gBAAgB,OAAO,OAAO;EACzC;EAEF,IAAI,OAAO,SAAS,OAClB,OAAO;GACL,MAAM,OAAO;GACb,WAAW;GACX,KAAK,OAAO;GACZ,SAAS,gBAAgB,OAAO,OAAO;EACzC;EAEF,MAAM,QAAQ;EACd,OAAO;GACL,MAAM,OAAO;GACb,WAAW;GACX,SAAS,MAAM;GACf,MAAM,MAAM,QAAQ,CAAC;GACrB,KAAK,YAAY,MAAM,GAAG;EAC5B;CACF,CAAC;AACH;AAEA,SAAgB,8BAA8B,cAAqF;CACjI,OAAO;EACL,OAAO,cAAc,WAAW;EAChC,OAAO,cAAc,UAAU;EAC/B,iBAAiB;CACnB;AACF;AAEA,SAAgB,kBAAmC;CACjD,OAAO;EAAE,MAAM;EAAM,KAAK;CAAK;AACjC;AAEA,SAAgB,aAAa,OAA0D;CACrF,OAAO,SAAS,MAAM,SAAS,IAC3B,CAAC,GAAG,KAAK,IACT,CACE;EAAE,IAAI;EAAS,MAAM;EAAS,aAAa;CAA4C,GACvF;EAAE,IAAI;EAAQ,MAAM;EAAQ,aAAa;CAA6D,CACxG;AACN;AAEA,SAAgB,cAAc,OAA+B,eAAyC;CACpG,OAAO;EAAE;EAAe,gBAAgB,CAAC,GAAG,KAAK;CAAE;AACrD;AAEA,SAAgB,mBACd,WACA,OACA,eACA,eACoB;CACpB,OAAO;EACL;EACA,OAAO,cAAc,OAAO,aAAa;EACzC,GAAI,iBAAiB,cAAc,SAAS,IAAI,EAAE,cAAc,IAAI,CAAC;CACvE;AACF;AAEA,SAAgB,uBAAuB,QAAmD;CACxF,MAAM,QAAsB,CAAC;CAC7B,MAAM,WAAqB,CAAC;CAE5B,KAAK,MAAM,SAAS,QAClB,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,MAAM,KAAK;IAAE,MAAM;IAAQ,MAAM,MAAM;GAAK,CAAC;GAC7C;EACF,KAAK;GACH,IAAI,MAAM,MACR,MAAM,KAAK;IAAE,MAAM;IAAS,WAAW,MAAM,YAAY;IAAa,MAAM,MAAM;GAAK,CAAC;QAErF;IACH,SAAS,KAAK,8CAA8C,MAAM,OAAO,eAAe;IACxF,MAAM,KAAK;KAAE,MAAM;KAAQ,MAAM,oBAAoB,MAAM,OAAO,cAAc;IAAG,CAAC;GACtF;GACA;EAEF,KAAK;GACH,IAAI,MAAM,MACR,MAAM,KAAK;IAAE,MAAM;IAAS,WAAW,MAAM,YAAY;IAAc,MAAM,MAAM;GAAK,CAAC;QAEtF;IACH,SAAS,KAAK,+DAA+D;IAC7E,MAAM,KAAK;KAAE,MAAM;KAAQ,MAAM;IAA6C,CAAC;GACjF;GACA;EAEF,KAAK;GACH,MAAM,KAAK;IAAE,MAAM;IAAQ,MAAM,mBAAmB,KAAK;GAAE,CAAC;GAC5D;EACF,KAAK;GACH,MAAM,KAAK,qBAAqB,KAAK,CAAC;GACtC;EACF;GACE,SAAS,KAAK,8CAA8C;GAC5D,MAAM,KAAK;IAAE,MAAM;IAAQ,MAAM,KAAK,UAAU,KAAgC;GAAE,CAAC;GACnF;CACJ;CAGF,OAAO;EAAE,QAAQ;EAAO;CAAS;AACnC;AAEA,SAAgB,mBAAmB,QAAwD;CACzF,MAAM,MAAsB,CAAC;CAC7B,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,SAAS,UAAU,MAAM,SAAS,YAC1C,IAAI,KAAK;EAAE,MAAM;EAAQ,MAAM,MAAM;CAAK,CAAC;MAExC,IAAI,MAAM,SAAS,SACtB,IAAI,KAAK,gBAAgB,MAAM,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAA,GAAW,SAAS,QAAQ,MAAM,MAAM,KAAA,GAAW,MAAM,IAAI,CAAC;MAEpI,IAAI,MAAM,SAAS;MAClB,MAAM,MACR,IAAI,KAAK;GAAE,MAAM;GAAS,UAAU,MAAM;GAAW,MAAM,MAAM;EAAK,CAAC;CAAA,OAEtE,IAAI,MAAM,SAAS,YACtB,IAAI,KAAK,mBAAmB,MAAM,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAA,GAAW,SAAS,QAAQ,MAAM,MAAM,KAAA,GAAW,MAAM,UAAU,MAAM,IAAI,CAAC;CAG9J,OAAO;AACT;AAEA,SAAgB,uBAAuB,SAA0D;CAC/F,IAAI,OAAO,YAAY,UACrB,OAAO,CAAC;EAAE,MAAM;EAAW,SAAS;GAAE,MAAM;GAAQ,MAAM;EAAQ;CAAE,CAAC;CAEvE,OAAO,QAAQ,KAAK,UAA2B;EAC7C,IAAI,MAAM,SAAS,QACjB,OAAO;GAAE,MAAM;GAAW,SAAS;IAAE,MAAM;IAAQ,MAAM,MAAM;GAAK;EAAE;EACxE,IAAI,MAAM,SAAS,SACjB,OAAO;GACL,MAAM;GACN,SAAS,gBAAgB,MAAM,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAA,GAAW,SAAS,QAAQ,MAAM,MAAM,KAAA,GAAW,UAAU,QAAQ,MAAM,OAAO,KAAA,CAAS;EACtK;EAEF,IAAI,MAAM,SAAS,WAAW,MAAM,MAClC,OAAO;GAAE,MAAM;GAAW,SAAS;IAAE,MAAM;IAAS,UAAU,MAAM;IAAW,MAAM,MAAM;GAAK;EAAE;EACpG,IAAI,MAAM,SAAS,YACjB,OAAO;GACL,MAAM;GACN,SAAS,mBAAmB,MAAM,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAA,GAAW,SAAS,QAAQ,MAAM,MAAM,KAAA,GAAW,MAAM,UAAU,UAAU,QAAQ,MAAM,OAAO,KAAA,CAAS;EACzL;EAEF,OAAO;GAAE,MAAM;GAAW,SAAS;IAAE,MAAM;IAAQ,MAAM,iBAAiB,CAAC,KAAK,CAAC;GAAE;EAAE;CACvF,CAAC;AACH;;;;;;;AAQA,SAAS,gBAAgB,UAAkB,MAA0B,KAAyB,MAAwC;CACpI,IAAI,MACF,OAAO;EAAE,MAAM;EAAS;EAAU;EAAM,GAAI,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;CAAG;CACvE,OAAO;EAAE,MAAM;EAAiB,KAAK,OAAO,gBAAgB,SAAS,IAAI;EAAG,MAAM,QAAQ;EAAS;CAAS;AAC9G;;;;;;;AAQA,SAAS,mBAAmB,UAAkB,MAA0B,KAAyB,UAAyC,MAAwC;CAChL,MAAM,MAAM,OAAO,gBAAgB,YAAY,IAAI;CACnD,IAAI,OAAO,SAAS,UAClB,OAAO;EAAE,MAAM;EAAiB;EAAK,MAAM,QAAQ;EAAY;CAAS;CAK1E,OAAO;EAAE,MAAM;EAAY,UAHgB,aAAa,SACpD;GAAE;GAAK,MAAM;GAAM;EAAS,IAC5B;GAAE;GAAK,MAAM;GAAM;EAAS;CACI;AACtC;AAEA,SAAS,gBAAgB,MAAc,MAAkC;CAEvE,OAAO,UAAU,KAAK,IADR,QAAQ,MAAM,QAAQ,aAAa,GACrB;AAC9B;AAEA,SAAgB,gBAAgB,MAAwB;CACtD,IAAI,SAAS,eAAe,SAAS,cACnC,OAAO;CACT,IAAI,SAAS,gBAAgB,SAAS,UAAU,SAAS,cACvD,OAAO;CACT,IAAI,SAAS,UAAU,SAAS,UAAU,SAAS,eACjD,OAAO;CACT,IAAI,SAAS,WAAW,SAAS,eAAe,SAAS,cACvD,OAAO;CACT,IAAI,SAAS,gBAAgB,SAAS,aACpC,OAAO;CACT,IAAI,SAAS,kBAAkB,SAAS,YACtC,OAAO;CACT,OAAO;AACT;AAEA,SAAgB,kBAAkB,OAA6F;CAC7H,IAAI,MAAM,SACR,OAAO;CACT,IAAI,MAAM,iBACR,OAAO;CAET,QADeC,mBAAiB,MAAM,SACzB,GAAb;EACE,KAAK,UACH,OAAO;EACT,KAAK;EACL,KAAK,SACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAEA,SAAgB,UAAU,MAAuC;CAC/D,IAAI,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,IAAI,GACnD,OAAO;CACT,OAAO;EAAE,QAAQ;EAAM,UAAU;CAAM;AACzC;AAEA,SAAgB,eAAe,KAAa,MAAsB;CAChE,OAAO,KAAK,WAAW,GAAG,IAAI,OAAO,QAAQ,KAAK,IAAI;AACxD;AAEA,SAASA,mBAAiB,WAAkE;CAC1F,KAAK,IAAI,KAAK,WAAW,UAAU,KAAK,GAAG,KAAK,GAAG,KAAK;EACtD,MAAM,SAAS,YAAY,IAAI;EAC/B,IAAI,QACF,OAAO;CACX;AAEF;AAEA,SAAS,gBAAgB,SAAyF;CAChH,MAAM,MAA8B,CAAC;CACrC,KAAK,MAAM,UAAU,WAAW,CAAC,GAC/B,IAAI,OAAO,QAAQ,OAAO;CAC5B,OAAO;AACT;AAEA,SAAS,YAAY,KAAqF;CACxG,MAAM,MAA8B,CAAC;CACrC,KAAK,MAAM,QAAQ,OAAO,CAAC,GACzB,IAAI,KAAK,QAAQ,KAAK;CACxB,OAAO;AACT;AAEA,SAAS,mBAAmB,OAAuG;CACjI,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,MAAM;CACjD,OAAO,MAAM,WACT,cAAc,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,SAAS,KACtD,cAAc,MAAM,IAAI,MAAM,IAAI;AACxC;AAEA,SAAS,qBAAqB,OAAqC;CACjE,MAAM,WAAW,MAAM;CACvB,MAAM,YAAY,SAAS,YAAY;CACvC,MAAM,OAAO,YAAY,SAAS,GAAG;CACrC,IAAI,UAAU,YAAY,OAAO,SAAS,SAAS,UACjD,OAAO;EACL,MAAM;EACN;EACA,MAAM,SAAS;EACf,UAAU;EACV,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;CACzB;CAEF,IAAI,UAAU,YAAY,OAAO,SAAS,SAAS,UACjD,OAAO;EACL,MAAM;EACN;EACA,MAAM,SAAS;EACf,UAAU;EACV,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;CACzB;CAEF,OAAO;EAAE,MAAM;EAAQ,MAAM,sBAAsB,SAAS,IAAI;CAAG;AACrE;AAEA,SAAS,YAAY,KAA6C;CAChE,IAAI,CAAC,KACH,OAAO,KAAA;CAET,MAAM,UADU,IAAI,QAAQ,WAAW,EACjB,EAAE,MAAM,OAAO,EAAE,IAAI;CAC3C,OAAO,WAAW,QAAQ,SAAS,IAAI,UAAU,KAAA;AACnD;;;AC/SA,SAAgB,sBAAsB,OAA4C,SAAoE;CACpJ,IAAI,CAAC,OACH,OAAO,KAAA;CAET,MAAM,UAAmC,EAAE,GAAG,MAAM;CACpD,MAAM,gBAAgB,cAAc,OAAO,WAAW;CACtD,MAAM,iBAAiB,cAAc,OAAO,YAAY;CACxD,MAAM,aAAa,cAAc,OAAO,OAAO;CAC/C,IAAI,QAAQ,wBAAwB,SAAS,QAAQ,aAAa,IAAI,gBAAgB,eACpF,QAAQ,cAAc,OAAO,aAAa,cAAc,MAAM,OAAO;CACvE,IAAI,QAAQ,wBAAwB,SAAS,QAAQ,aAAa,IAAI,iBAAiB,gBACrF,QAAQ,eAAe,OAAO,cAAc,eAAe,MAAM,OAAO;CAC1E,IAAI,QAAQ,sBAAsB,SAAS,QAAQ,aAAa,YAAY,YAC1E,QAAQ,WAAW,OAAO,UAAU,WAAW,MAAM,OAAO;CAC9D,OAAO;AACT;AAEA,SAAS,cAAc,OAAgC,eAA8D;CACnH,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAC5C,IAAI,QAAQ,iBAAiB,KAAK,KAAK,SAAS,eAC9C,OAAO;EAAE;EAAK;CAAK;CAEvB,OAAO;AACT;AAEA,SAAS,aAAa,MAAe,SAAwC;CAC3E,OAAO;EACL,GAAG;EACH,MAAM,QAAQ,OAAO,KAAK;GACxB,MAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;GAC3D,IAAI,CAAC,MACH,OAAO;GACT,MAAM,UAAU,eAAe,IAAI,OAAO,KAAK,IAAI;GACnD,MAAM,OAAO,cAAc,MAAM,MAAM;GACvC,MAAM,QAAQ,qBAAqB,MAAM,KAAK;GAC9C,MAAM,WAAW,MAAM,QAAQ,OAAO,YAAY,qBAAqB;IACrE,WAAW,QAAQ;IACnB,MAAM;IACN;IACA,GAAI,UAAU,OAAO,EAAE,MAAM,IAAI,CAAC;GACpC,CAAC;GACD,MAAM,UAAU,OAAO,SAAS,YAAY,WAAW,SAAS,UAAU;GAC1E,cAAc,KAAK,SAAS,SAAS,QAAQ,GAAG,SAAS,OAAO,iBAAiB;GACjF,IAAI,MAAM,gBAAgB,OACxB,OAAO;GACT,OAAO,gBAAgB,SAAS,QAAQ,CAAC;EAC3C;CACF;AACF;AAEA,SAAS,cAAc,MAAe,SAAwC;CAC5E,OAAO;EACL,GAAG;EACH,MAAM,QAAQ,OAAO,KAAK;GACxB,MAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;GAC3D,MAAM,UAAU,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;GACpE,IAAI,CAAC,MACH,OAAO;GACT,MAAM,UAAU,eAAe,IAAI,OAAO,KAAK,IAAI;GACnD,MAAM,QAAQ,OAAO,YAAY,sBAAsB;IACrD,WAAW,QAAQ;IACnB,MAAM;IACN;GACF,CAAC;GACD,cAAc,KAAK,SAAS,SAAS,GAAG,OAAO,iBAAiB;GAChE,IAAI,gBAAgB,SAAS;GAC7B,OAAO,SAAS,QAAQ,IAAI,OAAO,WAAW,OAAO,EAAE;EACzD;CACF;AACF;AAEA,SAAS,UAAU,MAAe,SAAwC;CACxE,OAAO;EACL,GAAG;EACH,MAAM,4BAA4B,KAAK,IAAI;EAC3C,MAAM,QAAQ,OAAO,KAAK;GACxB,MAAM,UAAU,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;GACpE,IAAI,CAAC,SACH,OAAO;GACT,IAAI,MAAM,sBAAsB,MAC9B,OAAO;GAET,MAAM,UAAiC;IACrC,WAAW,QAAQ;IACnB;IACA,KAAK,IAAI,OAAO;IAChB,iBAAiB,OAAO,MAAM,mBAAmB,WAAW,MAAM,iBAAiB;GACrF;GACA,MAAM,UAAU,MAAM,QAAQ,OAAO,YAAY,mBAAmB,OAAO;GAC3E,MAAM,aAAa,OAAO,QAAQ,eAAe,WAAW,QAAQ,aAAa;GACjF,IAAI,CAAC,YACH,OAAO;GAET,IAAI;IACF,MAAM,OAAO,MAAM,QAAQ,OAAO,YAAY,0BAA0B;KACtE,WAAW,QAAQ;KACnB;IACF,CAAC;IAKD,OAAO,qBAAqB,MAJP,QAAQ,OAAO,YAAY,mBAAmB;KACjE,WAAW,QAAQ;KACnB;IACF,CAAC,GACmC,IAAI;GAC1C,UACQ;IACN,MAAM,QAAQ,OAAO,YAAY,oBAAoB;KACnD,WAAW,QAAQ;KACnB;IACF,CAAC,EAAE,YAAY,KAAA,CAAS;GAC1B;EACF;CACF;AACF;AAEA,SAAS,qBAAqB,QAAgC,MAAoE;CAChI,MAAM,OAAO,OAAO,UAAU;CAC9B,MAAM,OAAO,KAAK,YAAY,OAAO,YAAY;CACjD,MAAM,SAAS,KAAK,UAAU,OAAO,YAAY;CACjD,MAAM,SAAS,SACX,aAAa,OAAO,KACpB,OAAO,SAAS,WACd,WAAW,KAAK,KAChB;CAEN,OAAO,GAAG,OADQ,OAAO,YAAY,uCAAuC,KAC/C;AAC/B;AAEA,SAAS,4BAA4B,MAAwC;CAC3E,MAAM,aAAa,SAAS,KAAK,YAAY,UAAU,IAAI,KAAK,YAAY,aAAa,KAAA;CACzF,IAAI,CAAC,cAAc,CAAC,OAAO,OAAO,YAAY,mBAAmB,GAC/D,OAAO;CAET,MAAM,EAAE,mBAAmB,kBAAkB,GAAG,mBAAmB;CACnE,MAAM,WAAW,MAAM,QAAQ,KAAK,YAAY,QAAQ,IACpD,KAAK,YAAY,SAAS,QAAO,SAAQ,SAAS,mBAAmB,IACrE,KAAK,YAAY;CAErB,OAAO;EACL,GAAG;EACH,aAAa,KAAK,YACf,MAAM,IAAI,EACV,QAAO,SACN,CAAC,KAAK,SAAS,mBAAmB,KAC/B,CAAC,KAAK,SAAS,qBAAqB,KACpC,CAAC,KAAK,SAAS,iBAAiB,CACrC,EACC,KAAK,IAAI;EACZ,aAAa;GACX,GAAG,KAAK;GACR,YAAY;GACZ,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EACjC;CACF;AACF;AAEA,SAAS,gBAAgB,SAAiB,OAAuB;CAC/D,OAAO,QACJ,MAAM,IAAI,EACV,KAAK,MAAM,UAAU,GAAG,QAAQ,MAAM,IAAI,MAAM,EAChD,KAAK,IAAI;AACd;AAEA,SAAS,cAAc,OAAwB;CAC7C,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,SAAS,IAAI,KAAK,MAAM,KAAK,IAAI;AACjG;AAEA,SAAS,qBAAqB,OAA+B;CAC3D,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI;AAChG;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,cAAc,KAAkB,MAAc,SAAiB,QAAgB,OAAqB;CAC3G,MAAM,YAAY,oBAAoB,GAAG;CACzC,IAAI,CAAC,WACH;CACF,UAAU,IAAI,aAAa,IAAI,OAAO,KAAK,IAAI,GAAG;EAChD,aAAa,YAAY,OAAO;EAChC;EACA;EACA,UAAU,OAAO;EACjB,SAAS,KAAK,IAAI;CACpB,CAAC;AACH;;;AC3IA,MAAM,oBAAoB;AAI1B,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAC3B,MAAM,6BAA6B;AAEnC,MAAM,eAAe;AACrB,MAAM,uBAAuB,IAAI,IAAI;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,6BAAiD;CACrD;EAAE,UAAU;EAAc,MAAM;EAAc,MAAM;CAAa;CACjE;EAAE,UAAU;EAAgB,MAAM;EAAgB,MAAM;CAAe;CACvE;EAAE,UAAU;EAAe,MAAM;EAAe,MAAM;CAAc;CACpE;EAAE,UAAU;EAAiB,MAAM;EAAiB,MAAM;CAAgB;AAC5E;AAUA,SAAgB,gBAAgB,SAAsC;CACpE,OAAO,IAAI,cAAc,OAAO;AAClC;AAEA,IAAM,gBAAN,MAAyC;CAaV;CAZ7B,OAA+B;CAC/B,qBAAoD,CAAC;CACrD,2BAAmB,IAAI,IAA+B;CACtD;CACA;CACA;CACA;CACA;CAGA,iCAAyB,IAAI,IAAsB;CAEnD,YAAY,SAA4C;EAA3B,KAAA,UAAA;EAC3B,KAAK,QAAQ,aAAa,QAAQ,KAAK;EACvC,KAAK,gBAAgB,QAAQ,iBAAiB,KAAK,MAAM,IAAI,MAAM;EACnE,KAAK,eAAe,QAAQ,UAAU,CAAC;EACvC,IAAI,KAAK,aAAa,WAAW,KAAK,QAAQ,aAAa,KAAA,GACzD,MAAM,IAAI,MAAM,0DAA0D;EAC5E,KAAK,uBAAuB,KAAK,4BAA4B,QAAQ,cAAc;EACnF,KAAK,uBAAuB,KAAK,0BAA0B,QAAQ,iBAAiB,CAAC,CAAC;CACxF;CAEA,4BAAoC,WAAmD;EACrF,IAAI,KAAK,aAAa,WAAW,GAC/B,OAAO,KAAA;EACT,IAAI,cAAc,KAAA,GAAW;GAC3B,IAAI,CAAC,KAAK,aAAa,MAAK,WAAU,OAAO,OAAO,SAAS,GAC3D,MAAM,IAAI,MAAM,mBAAmB,UAAU,yCAAyC;GACxF,OAAO;EACT;EAMA,SAHgB,KAAK,QAAQ,QACzB,KAAK,aAAa,MAAK,WAAU,OAAO,OAAO,KAAK,QAAQ,SAAS,OAAO,UAAU,KAAK,QAAQ,KAAK,IACxG,KAAA,MACe,KAAK,aAAa,IAAI;CAC3C;CAEA,0BAAkC,YAA0D;EAC1F,MAAM,WAAW,IAAI,IAAY,CAAC,cAAc,CAAC;EACjD,MAAM,UAAiC,CAAC;GACtC,IAAI;GACJ,MAAM;GACN,MAAM;GACN,UAAU;GACV,cAAc,KAAK;GACnB,SAAS,KAAK,MAAM,KAAI,UAAS;IAC/B,OAAO,KAAK;IACZ,MAAM,KAAK;IACX,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;GAC9D,EAAE;EACJ,CAAC;EAED,IAAI,KAAK,aAAa,SAAS,GAAG;GAChC,SAAS,IAAI,eAAe;GAC5B,QAAQ,KAAK;IAGX,IAAI;IACJ,MAAM;IACN,MAAM;IACN,UAAU;IACV,cAAc,KAAK;IACnB,SAAS,KAAK,aAAa,KAAI,YAAW;KAAE,OAAO,OAAO;KAAI,MAAM,OAAO,QAAQ,OAAO;IAAM,EAAE;GACpG,CAAC;EACH;EAEA,QAAQ,KAAK,GAAG,KAAK,4BAA4B,KAAK,oBAAoB,CAAC;EAE3E,OAAO,CAAC,GAAG,SAAS,GAAG,WAAW,QAAO,WAAU,CAAC,SAAS,IAAI,OAAO,EAAE,KAAK,CAAC,6BAA6B,OAAO,EAAE,KAAK,OAAO,OAAO,kBAAkB,CAAC;CAC9J;CAEA,oBAA4B,IAAsB;EAChD,MAAM,SAAS,KAAK,aAAa,MAAK,cAAa,UAAU,OAAO,EAAE;EACtE,IAAI,CAAC,QACH,MAAM,IAAI,iBAAA,QAA6C,kBAAkB,IAAI;EAC/E,IAAI,WAAW,KAAK,eAAe,IAAI,EAAE;EACzC,IAAI,CAAC,UAAU;GACb,WAAW,OAAO,OAAO,aAAa,aAAa,OAAO,SAAS,IAAI,OAAO;GAC9E,KAAK,eAAe,IAAI,IAAI,QAAQ;EACtC;EACA,OAAO;CACT;CAEA,QAAQ,MAAqB;EAC3B,KAAK,OAAO;CACd;CAEA,MAAM,cAAc,SAA0D;EAC5E,IAAI,CAAC,SAAS,OAAO,KAAK,OAAQ,QAAiC,WAAW,UAE5E,OAAO,cAAc,YADV,QAAS,UAAsB,QAA6B,KAAK,IACzC,GAAA,QAAgC,2BAA2B;EAGhG,IAAI,EAAE,QAAQ,UAAU;GACtB,MAAM,KAAK,mBAAmB,QAAQ,QAAS,QAAiC,MAAM;GACtF,OAAO;EACT;EAEA,MAAM,UAAU;EAChB,IAAI;GACF,MAAM,SAAS,MAAM,KAAK,cAAc,QAAQ,QAAQ,QAAQ,MAAM;GACtE,OAAO,gBAAgB,QAAQ,IAAI,MAAM;EAC3C,SACO,KAAK;GACV,MAAM,WAAW,WAAW,GAAG;GAC/B,OAAO,cAAc,QAAQ,IAAI,SAAS,MAAM,SAAS,SAAS,SAAS,IAAI;EACjF;CACF;CAEA,MAAM,cAAc,QAAgB,QAAoC;EACtE,QAAQ,QAAR;GACE,KAAK,cACH,OAAO,KAAK,WAAW,SAA4B,MAAM,CAAC;GAC5D,KAAK,gBACH,OAAO,KAAK,aAAa,SAA8B,MAAM,CAAC;GAChE,KAAK,UACH,OAAO,KAAK,OAAO;GACrB,KAAK,eACH,OAAO,KAAK,WAAW,SAA4B,MAAM,CAAC;GAC5D,KAAK,gBACH,OAAO,KAAK,oBAAoB,SAA6B,MAAM,CAAC;GACtE,KAAK,kBACH,OAAO,KAAK,cAAc,SAA+B,MAAM,CAAC;GAClE,KAAK,gBACH,OAAO,KAAK,aAAa,SAA8B,MAAM,CAAC;GAChE,KAAK,kBACH,OAAO,KAAK,cAAc,SAA+B,MAAM,CAAC;GAClE,KAAK,iBACH,OAAO,KAAK,aAAa,SAAgC,MAAM,CAAC;GAClE,KAAK,kBACH,OAAO,KAAK,OAAO,SAAwB,MAAM,CAAC;GACpD,KAAK,oBACH,OAAO,KAAK,QAAQ,SAAgC,MAAM,CAAC;GAC7D,KAAK,6BACH,OAAO,KAAK,gBAAgB,SAAwC,MAAM,CAAC;GAC7E,SACE,MAAM,IAAI,iBAAA,QAA8C,uBAAuB,QAAQ;EAC3F;CACF;CAEA,MAAM,OAAO,QAAgB,QAAiC;EAC5D,MAAM,KAAK,MAAM,iBAAiB,QAAQ,MAAM;CAClD;CAEA,MAAM,QAAuB;EAC3B,MAAM,WAAW,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;EAC3C,KAAK,SAAS,MAAM;EACpB,MAAM,QAAQ,WAAW,SAAS,IAAI,OAAO,YAAY;GACvD,QAAQ,iBAAiB,sBAAM,IAAI,MAAM,qBAAqB,CAAC;GAC/D,MAAM,QAAQ,MAAM,QAAQ;EAC9B,CAAC,CAAC;CACJ;CAEA,MAAc,mBAAmB,QAAgB,QAAiC;EAChF,QAAQ,QAAR;GACE,KAAK;IACH,KAAK,OAAO,SAA6B,MAAM,CAAC;IAChD;GACF,SACE;EACJ;CACF;CAEA,WAAmB,QAAoC;EACrD,KAAK,qBAAqB,OAAO,sBAAsB,CAAC;EACxD,MAAM,WAAW,KAAK,gBAAgB;EACtC,OAAO;GAGL,iBAAiB,OAAO,oBAAA,IAA2C,OAAO,kBAAA;GAC1E,mBAAmB;IACjB,aAAa;IACb,oBAAoB,8BAA8B,SAAS,KAAK,YAAY;IAC5E,iBAAiB,gBAAgB;IACjC,qBAAqB;KACnB,MAAM,CAAC;KACP,QAAQ,CAAC;KACT,QAAQ,CAAC;KACT,OAAO,CAAC;KACR,uBAAuB,CAAC;IAC1B;IACA,MAAM,EACJ,GAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,EAC9C;GACF;GACA,WAAW,KAAK,QAAQ,aAAa;IAAE,MAAM;IAAU,OAAO;IAAc,SAAS;GAAkB;GACvG,aAAa,KAAK,QAAQ,eAAe,CAAC;EAC5C;CACF;CAEA,MAAc,aAAa,QAA+C;EACxE,IAAI,CAAC,KAAK,QAAQ,cAChB,OAAO,CAAC;EACV,OAAO,MAAM,KAAK,QAAQ,aAAa,MAAM;CAC/C;CAEA,MAAc,SAA2B;EACvC,IAAI,CAAC,KAAK,QAAQ,QAChB,OAAO,CAAC;EACV,OAAO,MAAM,KAAK,QAAQ,OAAO;CACnC;CAEA,MAAc,WAAW,QAA6C;EACpE,MAAM,UAAU,MAAM,KAAK,cAAc,MAAM;EAC/C,KAAK,uBAAuB,QAAQ,SAAS;EAC7C,OAAO,mBAAmB,QAAQ,WAAW,KAAK,OAAO,QAAQ,QAAQ,QAAQ,aAAa;CAChG;CAEA,MAAc,oBAAoB,QAA8C;EAC9E,MAAM,UAAU,MAAM,KAAK,cAAc,QAAQ,OAAO,WAAW,IAAI;EAIvE,MAAM,KAAK,cAAc,OAAO;EAChC,KAAK,uBAAuB,QAAQ,SAAS;EAC7C,OAAO,KAAK,qBAAqB,OAAO;CAC1C;CAEA,MAAc,cAAc,QAAgD;EAC1E,MAAM,UAAU,MAAM,KAAK,cAAc;GACvC,KAAK,OAAO;GACZ,uBAAuB,OAAO;GAC9B,YAAY,OAAO,cAAc,CAAC;EACpC,GAAG,OAAO,WAAW,IAAI;EAGzB,KAAK,uBAAuB,QAAQ,SAAS;EAC7C,OAAO,KAAK,qBAAqB,OAAO;CAC1C;CAEA,qBAA6B,SAAgH;EAC3I,OAAO;GACL,OAAO,cAAc,KAAK,OAAO,QAAQ,MAAM;GAC/C,GAAI,QAAQ,cAAc,SAAS,IAAI,EAAE,eAAe,QAAQ,cAAc,IAAI,CAAC;EACrF;CACF;CAEA,uBAA+B,WAAyB;EACtD,IAAI,CAAC,KAAK,QAAQ,YAAY,KAAK,QAAQ,SAAS,WAAW,GAC7D;EACF,iBAAiB;GACf,KAAU,cAAc,WAAW;IACjC,eAAe;IACf,mBAAmB,KAAK,QAAQ;GAClC,CAAC;EACH,GAAG,CAAC;CACN;CAEA,MAAc,cAAc,SAA2C;EACrE,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO;GACxC,MAAM,SAAS,mBAAmB,KAAK,OAAO;GAC9C,IAAI,OAAO,WAAW,GACpB;GACF,MAAM,gBAAgB,KAAK,SAAS,cAAc,wBAAwB;GAC1E,KAAK,MAAM,WAAW,QACpB,MAAM,KAAK,cAAc,QAAQ,WAAW;IAAE;IAAe;GAAQ,CAAC;EAC1E;CACF;CAEA,MAAc,aAAa,QAA+C;EACxE,MAAM,QAAQ,KAAK,QAAQ;EAC3B,IAAI,CAAC,OACH,OAAO;GACL,UAAU,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EACjC,QAAO,YAAW,CAAC,OAAO,OAAO,QAAQ,QAAQ,OAAO,GAAG,EAC3D,KAAI,YAAW,YAAY,OAAO,CAAC;GACtC,YAAY;EACd;EAGF,MAAM,MAAM,MAAM,MAAM,KAAK;GAAE,OAAO;GAAK,GAAI,OAAO,MAAM,EAAE,aAAa,OAAO,IAAI,IAAI,CAAC;EAAG,CAAC;EAC/F,MAAM,WAA0B,CAAC;EACjC,KAAK,MAAM,MAAM,KAAK;GACpB,MAAM,SAAS,MAAM,MAAM,KAAK,EAAE;GAClC,IAAI,CAAC,QACH;GAIF,MAAM,MAAM,OAAO,eAAe,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,EAAE,GAAG;GAC9E,IAAI,CAAC,KACH;GACF,SAAS,KAAK;IACZ,WAAW,OAAO;IAClB;IACA,OAAO,OAAO,OAAO,SAAS,UAAU,WAAW,OAAO,SAAS,QAAQ;IAC3E,WAAW,IAAI,KAAK,OAAO,SAAS,EAAE,YAAY;GACpD,CAAC;EACH;EACA,OAAO;GAAE;GAAU,YAAY;EAAK;CACtC;CAEA,MAAc,cAAc,QAAgD;EAC1E,MAAM,UAAU,KAAK,SAAS,IAAI,OAAO,SAAS;EAClD,IAAI,SAAS;GACX,QAAQ,iBAAiB,sBAAM,IAAI,MAAM,sBAAsB,CAAC;GAChE,MAAM,QAAQ,MAAM,QAAQ;GAC5B,KAAK,SAAS,OAAO,OAAO,SAAS;EACvC;EACA,MAAM,KAAK,QAAQ,OAAO,OAAO,OAAO,SAAS;EACjD,OAAO,CAAC;CACV;CAEA,MAAc,aAAa,QAAiD;EAC1E,MAAM,UAAU,KAAK,eAAe,OAAO,SAAS;EACpD,QAAQ,iBAAiB,sBAAM,IAAI,MAAM,qBAAqB,CAAC;EAC/D,MAAM,QAAQ,MAAM,QAAQ;EAC5B,KAAK,SAAS,OAAO,OAAO,SAAS;EACrC,OAAO,CAAC;CACV;CAEA,MAAc,OAAO,QAAgD;EACnE,MAAM,UAAU,KAAK,eAAe,OAAO,SAAS;EACpD,IAAI,QAAQ,UACV,MAAM,IAAI,iBAAA,QAA8C,WAAW,OAAO,UAAU,kCAAkC;EAExH,MAAM,SAAS,uBAAuB,OAAO,MAAM;EACnD,MAAM,kBAAkB,IAAI,gBAAgB;EAC5C,QAAQ,kBAAkB;EAC1B,MAAM,MAAM,YAAqC;GAC/C,IAAI;GACJ,IAAI,UAAU;GACd,IAAI;IACF,KAAK,MAAM,WAAW,OAAO,UAC3B,MAAM,KAAK,cAAc,QAAQ,WAAW;KAC1C,eAAe;KACf,SAAS;MAAE,MAAM;MAAQ,MAAM;KAAQ;IACzC,CAAC;IAEH,QAAQ,MAAM,QAAQ,MAAM,IAAI;KAC9B,QAAQ,OAAO;KACf,GAAI,QAAQ,WAAW,EAAE,OAAO,QAAQ,SAAS,IAAI,CAAC;KACtD,GAAG,KAAK,UAAU,OAAO;KACzB,GAAG,KAAK,aAAa,OAAO;KAC5B,GAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,KAAK,QAAQ,OAAO,IAAI,CAAC;KAC7D,QAAQ,gBAAgB;IAC1B,CAAC;GACH,SACO,KAAK;IACV,UAAU,gBAAgB,OAAO;IACjC,IAAI,CAAC,SACH,MAAM;GACV,UACQ;IACN,QAAQ,kBAAkB,KAAA;IAC1B,QAAQ,WAAW,KAAA;GACrB;GAEA,OAAO,EACL,YAAY,kBAAkB;IAC5B,SAAS,WAAW,gBAAgB,OAAO;IAC3C,WAAW,OAAO;IAClB,iBAAiB,QAAQ,gBAAgB,OAAO,KAAK,QAAQ,QAAQ,IAAI;GAC3E,CAAC,EACH;EACF;EAEA,MAAM,WAAW,IAAI;EACrB,QAAQ,WAAW;EACnB,OAAO,MAAM;CACf;CAEA,OAAe,QAAkC;EAC/C,MAAM,UAAU,KAAK,SAAS,IAAI,OAAO,SAAS;EAClD,SAAS,iBAAiB,sBAAM,IAAI,MAAM,0BAA0B,CAAC;EACrE,SAAS,MAAM,MAAM;CACvB;CAEA,MAAc,QAAQ,QAAiD;EACrE,MAAM,UAAU,KAAK,eAAe,OAAO,SAAS;EACpD,MAAM,gBAAgB,KAAK,WAAW,SAAS,OAAO,MAAM;EAC5D,MAAM,KAAK,cAAc,OAAO,WAAW;GACzC,eAAe;GACf,eAAe,OAAO;EACxB,CAAC;EACD,MAAM,KAAK,cAAc,OAAO,WAAW;GACzC,eAAe;GACf;EACF,CAAC;EACD,OAAO,CAAC;CACV;CAEA,MAAc,gBAAgB,QAAyD;EACrF,MAAM,UAAU,KAAK,eAAe,OAAO,SAAS;EACpD,MAAM,gBAAgB,KAAK,aAAa,SAAS,KAAK,OAAO,aAAa;EAC1E,MAAM,eAAe,OAAO,aAAa;EAGzC,IAAI,iBAAiB,QAAQ,UAC3B,MAAM,IAAI,iBAAA,QAA8C,kDAAkD;EAC5G,IAAI,gBAAgB,KAAK,qBAAqB,SAAS,OAAO,UAAU,OAAO,KAAK;EACpF,IAAI,eACF,KAAK,YAAY,SAAS,OAAO,KAAK;EACxC,IAAI,cAAc;GAChB,QAAQ,SAAS,OAAO;GACxB,MAAM,KAAK,cAAc,OAAO,WAAW;IACzC,eAAe;IACf,eAAe,OAAO;GACxB,CAAC;EACH;EACA,QAAQ,OAAO,IAAI,OAAO,UAAU,OAAO,KAAK;EAChD,IAAI,eACF,gBAAgB,QAAQ;EAC1B,MAAM,KAAK,cAAc,OAAO,WAAW;GACzC,eAAe;GACf;EACF,CAAC;EACD,OAAO,EAAE,cAAc;CACzB;;;;;;CAOA,YAAoB,SAA4B,UAAwB;EACtE,MAAM,SAAS,KAAK,aAAa,MAAK,cAAa,UAAU,OAAO,QAAQ;EAC5E,IAAI,CAAC,QACH,MAAM,IAAI,iBAAA,QAA6C,kBAAkB,UAAU;EACrF,QAAQ,sBAAsB,KAAK,oBAAoB,OAAO,EAAE,CAAC;EACjE,QAAQ,WAAW,OAAO;EAC1B,KAAK,mCAAmC,SAAS,OAAO,EAAE;CAC5D;CAEA,WAAmB,SAA4B,QAAuC;EACpF,IAAI,CAAC,KAAK,MAAM,MAAK,SAAQ,KAAK,OAAO,MAAM,GAC7C,MAAM,IAAI,iBAAA,QAA6C,iBAAiB,QAAQ;EAClF,QAAQ,SAAS;EACjB,OAAO,KAAK,qBAAqB,SAAS,gBAAgB,MAAM;CAClE;CAEA,UAAkB,SAAkG;EAClH,MAAM,WAAW,YAAY,QAAQ,eAAe,kBAAkB;EACtE,MAAM,eAAwC,CAAC;EAC/C,KAAK,MAAM,UAAU,QAAQ,eAAe;GAC1C,IAAI,CAAC,6BAA6B,OAAO,EAAE,KAAK,OAAO,iBAAiB,MACtE;GACF,aAAa,OAAO,GAAG,MAAM,EAAiC,KAAK;EACrE;EACA,OAAO;GACL,GAAI,gBAAgB,QAAQ,IAAI,EAAE,SAAS,IAAI,CAAC;GAChD,GAAI,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;EACjE;CACF;CAEA,aAAqB,SAAiE;EACpF,IAAI,QAAQ,WAAW,cACrB,OAAO,CAAC;EACV,OAAO,EAAE,OAAO,gBAAgB,QAAQ,KAAK,EAAE;CACjD;CAEA,mCAA2C,SAA4B,UAAwB;EAC7F,MAAM,eAAe,WAAgC,OAAO,OAAO;EACnE,MAAM,OAAO,QAAQ,cAAc,QAAO,WAAU,OAAO,OAAO,sBAAsB,CAAC,6BAA6B,OAAO,EAAE,CAAC;EAChI,MAAM,YAAY,KAAK,4BAA4B,UAAU,QAAQ,MAAM;EAC3E,MAAM,QAAQ,KAAK,UAAU,WAAW;EACxC,QAAQ,gBAAgB,UAAU,KAC9B,CAAC,GAAG,MAAM,GAAG,SAAS,IACtB;GAAC,GAAG,KAAK,MAAM,GAAG,QAAQ,CAAC;GAAG,GAAG;GAAW,GAAG,KAAK,MAAM,QAAQ,CAAC;EAAC;CAC1E;CAEA,4BAAoC,UAA8B,UAAwD;EACxH,IAAI,CAAC,UACH,OAAO,CAAC;EACV,MAAM,SAAS,KAAK,aAAa,MAAK,cAAa,UAAU,OAAO,QAAQ;EAC5E,IAAI,CAAC,QACH,OAAO,CAAC;EACV,MAAM,UAAiC,CAAC;EACxC,IAAI,OAAO,cAAc,MAAM;GAC7B,MAAM,UAAU,UAAU,IAAI,kBAAkB;GAChD,QAAQ,KAAK;IACX,IAAI;IACJ,MAAM;IACN,MAAM;IACN,UAAU;IACV,cAAc,gBAAgB,OAAO,IAAI,UAAU;IACnD,SAAS,oBAAoB,KAAI,WAAU;KAAE,OAAO;KAAO,MAAM,cAAc,KAAK;IAAE,EAAE;GAC1F,CAAC;EACH;EACA,KAAK,MAAM,UAAU,OAAO,WAAW,CAAC,GAAG;GACzC,MAAM,KAAK,GAAG,6BAA6B,OAAO;GAClD,MAAM,UAAU,UAAU,IAAI,EAAE;GAChC,QAAQ,KAAK;IACX;IACA,MAAM,OAAO;IACb,MAAM;IACN,cAAc,YAAY,OAAO,OAAO;IACxC,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;IAChE,SAAS,CAAC;KAAE,OAAO;KAAO,MAAM;IAAM,GAAG;KAAE,OAAO;KAAM,MAAM;IAAK,CAAC;GACtE,CAAC;EACH;EACA,OAAO;CACT;;CAGA,qBAA6B,SAA4B,UAAkB,OAAsC;EAC/G,MAAM,SAAS,QAAQ,cAAc,MAAK,cAAa,UAAU,OAAO,QAAQ;EAChF,IAAI,CAAC,QACH,MAAM,IAAI,iBAAA,QAA6C,0BAA0B,UAAU;EAC7F,IAAI,CAAC,qBAAqB,QAAQ,KAAK,GACrC,MAAM,IAAI,iBAAA,QAA6C,mCAAmC,SAAS,IAAI,OAAO;EAChH,QAAQ,gBAAgB,QAAQ,cAAc,KAAI,cAChD,UAAU,OAAO,WAAW;GAAE,GAAG;GAAW,cAAc;EAAM,IAAI,SACtE;EACA,OAAO,QAAQ;CACjB;CAEA,MAAc,cAAc,QAAuE,oBAA6B,YAAY,OAAmC;EAC7K,IAAI,oBAAoB;GACtB,MAAM,WAAW,KAAK,SAAS,IAAI,kBAAkB;GACrD,IAAI,UAAU;IACZ,IAAI,SAAS,QAAQ,OAAO,KAC1B,MAAM,IAAI,iBAAA,QAA6C,WAAW,mBAAmB,kBAAkB,SAAS,IAAI,QAAQ,OAAO,IAAI,EAAE;IAC3I,MAAM,4BAA4B,OAAO,yBAAyB,SAAS;IAC3E,MAAM,iBAAiB,OAAO,eAAe,KAAA,IACzC,SAAS,aACT,sBAAsB,OAAO,UAAU;IAC3C,IAAI,CAAC,gBAAgB,SAAS,uBAAuB,yBAAyB,GAC5E,MAAM,IAAI,iBAAA,QAER,WAAW,mBAAmB,sGAChC;IAEF,IAAI,CAAC,SAAS,SAAS,YAAY,cAAc,GAC/C,MAAM,IAAI,iBAAA,QAER,WAAW,mBAAmB,wGAChC;IAEF,OAAO;GACT;EACF;EAEA,MAAM,aAAa,sBAAsB,OAAO,UAAU;EAC1D,MAAM,UAAU,MAAM,KAAK,eAAe,oBAAoB,OAAO,KAAK,SAAS;EACnF,MAAM,YAAY,KAAK,iBAAiB,MAAM;EAI9C,MAAM,kBAAkB,KAAK;EAC7B,MAAM,SAAS,oBAAoB,KAAA,IAC/B,qBAAqB,KAAK,oBAAoB,eAAe,CAAC,IAC9D,KAAA;EACJ,MAAM,WAAW,SAAS,OAAO,WAAW,KAAK,gBAAgB;EACjE,MAAM,WAAW,oBAAoB,KAAA,IACjC,KAAK,aAAa,MAAK,WAAU,OAAO,OAAO,eAAe,EAAG,QACjE,KAAK,QAAQ;EACjB,MAAM,YAAY,QAAQ;EAC1B,MAAM,OAAO,KAAK,QAAQ,UAAUC;EACpC,MAAM,eAAe,KAAK,QAAQ,gBAAgB,CAAC;EAEnD,MAAM,eAAe,sBADP,WAAW,KAAK,OAAO,aAAa,OAAO,KAAK,QAAQ,KACvB,GAAG;GAChD,QAAQ,KAAK,YAAY;GACzB;GACA,cAAc,KAAK;GACnB,qBAAqB,KAAK,QAAQ;GAClC,mBAAmB,KAAK,QAAQ;EAClC,CAAC;EACD,MAAM,WAAW;GAAE,GAAG,KAAK;GAAU,GAAG,aAAa;GAAU,GAAG,KAAK,QAAQ;EAAS;EACxF,MAAM,QAAQ,YAAY;GACxB,GAAG;GACH,GAAG;GACH;GACA;GACA;GACA,OAAO;GACP;GACA,YAAY,gBAAgB,KAAK,YAAY,aAAa,YAAY,KAAK,QAAQ,cAAc,YAAY,UAAU;GACvH,GAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,KAAK,QAAQ,OAAO,IAAI,CAAC;EAC/D,CAAC;EAED,MAAM,UAA6B;GACjC;GACA,KAAK,OAAO;GACZ,uBAAuB,OAAO,yBAAyB,CAAC;GACxD;GACA;GACA;GACA;GACA;GACA,OAAO;GACP,QAAQ,KAAK;GACb,eAAe,mBAAmB,KAAK,oBAAoB;GAC3D,wBAAQ,IAAI,IAAI;GAChB,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;GAC7C,GAAI,SAAS,EAAE,qBAAqB,OAAO,YAAY,IAAI,CAAC;EAC9D;EACA,KAAK,mBAAmB,OAAO;EAC/B,KAAK,SAAS,IAAI,WAAW,OAAO;EACpC,QAAQ,QAAQ,WAAW,OAAO,GAAG;EACrC,QAAQ,QAAQ,6BAA6B,OAAO,yBAAyB,CAAC,CAAC;EAC/E,IAAI,QAAQ,OACV,MAAM,QAAQ,KAAK,EAAE,YAAY,KAAA,CAAS;EAC5C,OAAO;CACT;CAEA,MAAc,eAAe,WAA+B,KAAa,WAAsC;EAC7G,MAAM,QAAQ,KAAK,QAAQ;EAC3B,IAAI,aAAa,KAAK,SAAS,IAAI,SAAS,GAC1C,OAAO,KAAK,SAAS,IAAI,SAAS,EAAG;EACvC,IAAI,aAAa,OAAO;GACtB,MAAM,WAAW,MAAM,YAAY,OAAO,SAAS;GACnD,IAAI,UACF,OAAO;GACT,IAAI,WACF,MAAM,IAAI,iBAAA,QAAgD,oBAAoB,WAAW;GAC3F,MAAM,UAAU,MAAM,cAAc;IAAE,IAAI;IAAW;IAAO,aAAa;IAAK,UAAU,EAAE,OAAO,cAAc;GAAE,CAAC;GAClH,MAAM,QAAQ,KAAK;GACnB,OAAO;EACT;EACA,IAAI,aAAa,WACf,MAAM,IAAI,iBAAA,QAAgD,oBAAoB,WAAW;EAC3F,MAAM,UAAU,MAAM,cAAc;GAAE,GAAI,YAAY,EAAE,IAAI,UAAU,IAAI,CAAC;GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;GAAI,aAAa;GAAK,UAAU,EAAE,OAAO,cAAc;EAAE,CAAC;EAClK,IAAI,OACF,MAAM,QAAQ,KAAK;EACrB,OAAO;CACT;CAEA,iBAAyB,QAAuE;EAC9F,IAAI,OAAO,KAAK,QAAQ,cAAc,YACpC,OAAO,KAAK,QAAQ,UAAU,MAAM;EACtC,OAAO,KAAK,QAAQ,aAAa,qBAAqB,EAAE,KAAK,OAAO,IAAI,CAAC;CAC3E;CAEA,kBAAoC;EAIlC,IAAI,KAAK,yBAAyB,KAAA,GAChC,OAAO,KAAK,oBAAoB,KAAK,oBAAoB;EAC3D,MAAM,WAAW,KAAK,QAAQ;EAC9B,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,iBAAA,QAA6C,yBAAyB;EAClF,OAAO,OAAO,aAAa,aAAa,SAAS,IAAI;CACvD;CAEA,mBAA2B,SAAkC;EAC3D,MAAM,4BAAY,IAAI,IAAY;EAElC,QAAQ,MAAM,MAAM,KAAK,cAAc,QAAQ;GAC7C,IAAI,QAAQ,WAAW,gBAAgB,mBAAmB,IAAI,IAAI,GAChE;GACF,IAAI,QAAQ;GACZ,IAAI,SAAS,+DAA+D,IAAI,KAAK;EACvF,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,kBAAkB,QAAQ;GACjD,IAAI,QAAQ,WAAW,cACrB;GACF,IAAI,QAAQ;GACZ,IAAI,SAAS,wEAAwE,IAAI,KAAK;EAChG,CAAC;EAED,QAAQ,MAAM,MAAM,KAAK,gBAAgB,EAAE,OAAO,aAAa;GAC7D,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf,WAAW;IACX,SAAS;KAAE,MAAM;KAAQ,MAAM;IAAM;GACvC,CAAC;EACH,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,oBAAoB,EAAE,OAAO,aAAa;GACjE,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf,WAAW;IACX,SAAS;KAAE,MAAM;KAAQ,MAAM;IAAM;GACvC,CAAC;EACH,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,aAAa,OAAO,QAAQ;GACnD,IAAI,CAAC,KAAK,wBAAwB,IAAI,MAAM,IAAI,KAAK,GACnD;GACF,MAAM,MAAM,cAAc,IAAI,MAAM,IAAI,KAAK;GAC7C,MAAM,SAAS,QAAQ,OAAO,IAAI,GAAG;GACrC,IAAI,WAAW,SACb;GACF,IAAI,WAAW,UAAU;IACvB,IAAI,QAAQ;IACZ,IAAI,SAAS;IACb;GACF;GACA,MAAM,UAAU,MAAM,KAAK,kBAAkB,SAAS;IACpD,YAAY,IAAI;IAChB,OAAO,IAAI;IACX,MAAM,gBAAgB,IAAI,IAAI;IAC9B,QAAQ;IACR,UAAU,IAAI;GAChB,CAAC;GACD,IAAI,QAAQ,YAAY,aAAa;IACnC,IAAI,QAAQ;IACZ,IAAI,SAAS;IACb;GACF;GACA,IAAI,QAAQ,aAAa,gBACvB,QAAQ,OAAO,IAAI,KAAK,OAAO;GACjC,IAAI,QAAQ,aAAa,iBACvB,QAAQ,OAAO,IAAI,KAAK,QAAQ;GAClC,IAAI,QAAQ,SAAS,WAAW,QAAQ,GAAG;IACzC,IAAI,QAAQ;IACZ,IAAI,SAAS;GACf;EACF,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,oBAAoB,QAAQ;GACnD,UAAU,IAAI,IAAI,MAAM;GACxB,MAAM,SAAS,IAAI,YAAY,gBAAgB,IAAI,YAAY,mBAAmB,IAAI,YAAY,YAAY,WAAW;GACzH,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf,YAAY,IAAI;IAChB,OAAO,IAAI;IACX,MAAM,gBAAgB,IAAI,IAAI;IAC9B;IACA,UAAU,IAAI;IACd,GAAI,WAAW,WAAW,EAAE,WAAW,IAAI,UAAU,IAAI,QAAQ,IAAI,CAAC;GACxE,CAAC;EACH,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,gBAAgB,QAAQ;GAC/C,IAAI,CAAC,UAAU,IAAI,IAAI,MAAM,GAAG;IAC9B,KAAU,cAAc,QAAQ,WAAW;KACzC,eAAe;KACf,YAAY,IAAI;KAChB,OAAO,IAAI;KACX,MAAM,gBAAgB,IAAI,IAAI;KAC9B,QAAQ;KACR,UAAU,IAAI;IAChB,CAAC;IACD;GACF;GACA,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf,YAAY,IAAI;IAChB,QAAQ;GACV,CAAC;EACH,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,eAAe,QAAQ;GAC9C,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf,YAAY,IAAI;IAChB,QAAQ;IACR,SAAS,uBAAuB,IAAI,MAAM;IAC1C,WAAW,IAAI;GACjB,CAAC;EACH,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,eAAe,QAAQ;GAC9C,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf,YAAY,IAAI;IAChB,QAAQ;IACR,WAAW,aAAa,IAAI,KAAK;GACnC,CAAC;EACH,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,mBAAmB,QAAQ;GAClD,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf,YAAY,IAAI;IAChB,QAAQ;IACR,WAAW,IAAI,UAAU;GAC3B,CAAC;EACH,CAAC;EACD,QAAQ,MAAM,MAAM,KAAK,eAAe,EAAE,OAAO,sBAAsB;GAQrE,MAAM,OAAO,KAAK,qBAAqB,OAAO;GAC9C,IAAI,SAAS,KAAA,GACX;GACF,MAAM,OAAO,uBAAuB,KAAK;GACzC,IAAI,QAAQ,GACV;GACF,MAAM,OAAO,UAAU,gBAAgB,IAAI;GAC3C,KAAU,cAAc,QAAQ,WAAW;IACzC,eAAe;IACf;IACA;IACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;GACzB,CAAC;EACH,CAAC;CACH;CAEA,qBAA6B,SAAgD;EAC3E,IAAI,OAAO,KAAK,QAAQ,kBAAkB,YAAY,KAAK,QAAQ,gBAAgB,GACjF,OAAO,KAAK,QAAQ;EACtB,MAAM,eAAe,KAAK,QAAQ,UAAU;EAC5C,IAAI,gBAAgB,OAAO,iBAAiB,YAAY,OAAO,aAAa,kBAAkB,YAAY,aAAa,gBAAgB,GACrI,OAAO,aAAa;EAGtB,MAAM,OAAO,QAAQ,SAAS;EAC9B,IAAI,OAAO,KAAK,kBAAkB,YAAY,KAAK,gBAAgB,GACjE,OAAO,KAAK;CAEhB;CAEA,wBAAgC,MAAc,OAAyC;EACrF,MAAM,SAAS,KAAK,QAAQ;EAC5B,IAAI,QAAQ,YAAY,QAAQ,CAAC,KAAK,MACpC,OAAO;EACT,IAAI,OAAO,aACT,OAAO,OAAO,YAAY,MAAM,KAAK;EACvC,OAAO,SAAS,WAAW,SAAS,gBAAgB,SAAS,UAAU,SAAS;CAClF;CAEA,MAAc,kBAAkB,SAA4B,UAA6D;EAEvH,MAAM,UADO,KAAK,YACC,EAAE,YAAY,8BAA8B;GAC7D,WAAW,QAAQ;GACnB;GACA,SAAS,KAAK,QAAQ,YAAY,WAAW;EAC/C,CAAC;EACD,MAAM,UAAU,IAAI,SAAgD,YAAY;GAC9E,MAAM,SAAS,QAAQ,iBAAiB;GACxC,IAAI,CAAC,QACH;GACF,IAAI,OAAO,SAAS;IAClB,QAAQ,EAAE,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IAC7C;GACF;GACA,OAAO,iBAAiB,eAAe,QAAQ,EAAE,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;EACvG,CAAC;EAED,QAAO,MADgB,QAAQ,KAAK,CAAC,SAAS,OAAO,CAAC,GACtC,WAAW,EAAE,SAAS,YAAY;CACpD;CAEA,MAAc,cAAc,WAAmB,QAAsC;EACnF,MAAM,KAAK,OAAO,kBAAkB;GAAE;GAAW;EAAO,CAAC;CAC3D;CAEA,eAAuB,WAAsC;EAC3D,MAAM,UAAU,KAAK,SAAS,IAAI,SAAS;EAC3C,IAAI,CAAC,SACH,MAAM,IAAI,iBAAA,QAAgD,oBAAoB,WAAW;EAC3F,OAAO;CACT;CAEA,cAA+B;EAC7B,IAAI,CAAC,KAAK,MACR,OAAO;GACL,wBAAwB,KAAA;GACxB,mBAAmB,QAAQ,OAAO,IAAI,iBAAA,QAA8C,iCAAiC,CAAC;EACxH;EAEF,OAAO,KAAK;CACd;AACF;AAEA,IAAa,mBAAb,cAAsC,MAAM;CACrB;CAAwC;CAA7D,YAAY,MAAuB,SAAiB,MAAyB;EAC3E,MAAM,OAAO;EADM,KAAA,OAAA;EAAwC,KAAA,OAAA;EAE3D,KAAK,OAAO;CACd;AACF;;;;;;;AAQA,SAAS,qBAAqB,SAAsF;CAClH,IAAI,WAAW;CAaf,OAAO;EAAE,UAAA;GAXP,IAAI,OAAO;IAAE,OAAO,SAAS;GAAK;GAClC,IAAI,OAAO;IAAE,OAAO,SAAS;GAAK;GAClC,cAAa,UAAS,SAAS,YAAY,KAAK;GAChD,cAAa,YAAW,SAAS,YAAY,OAAO;GACpD,mBAAkB,YAAW,SAAS,iBAAiB,OAAO;GAC9D,qBAAoB,YAAW,SAAS,mBAAmB,OAAO;GAClE,SAAS,SAAS,cAAc,SAAS,OAAO,SAAS,SAAS;GAClE,gBAAe,UAAS,mBAAmB,UAAU,KAAK;GAC1D,gBAAe,QAAQ,SAAS,gBAAgB,SAAS,cAAc,GAAG,IAAI;GAC9E,cAAc,SAAS,WAAY,SAAS,cAAc,SAAS,YAAY,SAAS,MAAM,IAAI,QAAQ,QAAQ,IAAI;EAExG;EAAG,cAAc,SAAS;GAAE,WAAW;EAAK;CAAE;AAChE;AAEA,SAAS,mBAAmB,UAAoB,OAAqB;CACnE,IAAI,SAAS,eACX,OAAO,SAAS,cAAc,KAAK;CACrC,OAAO,qBAAqB,KAAK;AACnC;AAEA,SAAS,WAAW,GAAG,SAA0F;CAC/G,MAAM,MAA+B,CAAC;CACtC,KAAK,MAAM,UAAU,SACnB,IAAI,QACF,OAAO,OAAO,KAAK,MAAM;CAE7B,OAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM,KAAA;AAC7C;AAEA,SAAS,gBAAgB,GAAG,SAA2E;CACrG,MAAM,yBAAS,IAAI,IAA6B;CAChD,KAAK,MAAM,UAAU,SACnB,KAAK,MAAM,UAAU,UAAU,CAAC,GAC9B,OAAO,IAAI,OAAO,MAAM,MAAM;CAElC,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEA,SAAS,gBAAgB,OAAqE;CAC5F,MAAM,WAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,SAAS,CAAC,CAAC,GAClD,IAAI,mBAAmB,KAAK,KAAK,IAAI,GACnC,SAAS,OAAO;CAEpB,OAAO;AACT;AAEA,SAAS,mBAAmB,MAAuB;CACjD,OAAO,qBAAqB,IAAI,IAAI;AACtC;AAEA,SAAS,mBAAmB,SAAgE;CAC1F,OAAO,QAAQ,KAAI,YAAW;EAC5B,GAAG;EACH,SAAS,OAAO,QAAQ,KAAI,SAAQ,WAAW,OAC3C;GAAE,GAAG;GAAM,SAAS,KAAK,QAAQ,KAAI,WAAU,EAAE,GAAG,MAAM,EAAE;EAAE,IAC9D,EAAE,GAAG,KAAK,CAAC;CACjB,EAAE;AACJ;AAEA,SAAS,qBAAqB,QAA6B,OAAwB;CACjF,KAAK,MAAM,QAAQ,OAAO,SACxB,IAAI,WAAW;MACT,KAAK,QAAQ,MAAK,UAAS,MAAM,UAAU,KAAK,GAClD,OAAO;CAAA,OAEN,IAAI,KAAK,UAAU,OACtB,OAAO;CAGX,OAAO;AACT;AAEA,SAAS,YAAY,SAAyC,IAAgC;CAC5F,OAAO,QAAQ,MAAK,WAAU,OAAO,OAAO,EAAE,GAAG;AACnD;AAEA,SAAS,6BAA6B,IAAqB;CACzD,OAAO,GAAG,WAAW,0BAA0B;AACjD;AAEA,SAAS,gBAAgB,OAAwC;CAC/D,OAAO,OAAO,UAAU,YAAa,oBAA0C,SAAS,KAAK;AAC/F;AAEA,SAAS,cAAc,OAA8B;CACnD,OAAO,UAAU,UACb,eACA,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AACnD;AAEA,SAAS,gBAAgB,MAAyB,OAAmC;CACnF,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,OAAO,UAAU,UAAU,MAAM,MAAM;AAC5F;AAEA,SAAS,SAAS,MAAe,OAAyB;CACxD,OAAO,gBAAgB,IAAI,MAAM,gBAAgB,KAAK;AACxD;AAEA,SAAS,SAAY,OAAmB;CACtC,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,iBAAA,QAA6C,6BAA6B;CACtF,OAAO;AACT;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,YAAY,IAAa;CAChC,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,YAAY,OAAO,OAAO,KAAK;AAChF;AAEA,SAAS,WAAW,KAAiE;CACnF,IAAI,eAAe,kBACjB,OAAO;EAAE,MAAM,IAAI;EAAM,SAAS,IAAI;EAAS,GAAI,IAAI,SAAS,KAAA,IAAY,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAAG;CACvG,OAAO;EAAE,MAAA;EAAkC,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;CAAE;AACvG;AAEA,SAAS,YAAY,SAAyC;CAC5D,OAAO;EACL,WAAW,QAAQ;EACnB,KAAK,QAAQ;EACb,uBAAuB,QAAQ;EAC/B,OAAO,OAAO,QAAQ,QAAQ,SAAS,UAAU,WAAW,QAAQ,QAAQ,SAAS,QAAQ;EAC7F,4BAAW,IAAI,KAAK,GAAE,YAAY;CACpC;AACF;AAEA,SAAS,cAAc,MAAc,OAAwC;CAC3E,OAAO,cAAc,KAAK,GAAG,gBAAgB,KAAK;AACpD;AAEA,SAAS,gBAAgB,OAAwB;CAC/C,IAAI,CAAC,SAAS,KAAK,GACjB,OAAO,KAAK,UAAU,KAAK;CAC7B,MAAM,OAAO,OAAO,KAAK,KAAK,EAAE,KAAK;CACrC,MAAM,MAA+B,CAAC;CACtC,KAAK,MAAM,OAAO,MAChB,IAAI,OAAO,MAAM;CACnB,OAAO,KAAK,UAAU,GAAG;AAC3B;AAEA,SAAS,gBAAgB,OAAmB,UAAyD;CACnG,MAAM,WAAW,UAAU;CAC3B,OAAO,OAAO,aAAa,YAAY,MAAM,SAAS,YAAY,iBAAiB,MAAM,SAAS,MAAM;AAC1G;AAEA,SAAS,iBAAiB,WAAoC;CAC5D,KAAK,IAAI,KAAK,WAAW,UAAU,KAAK,GAAG,KAAK,GAAG,KAAK;EACtD,MAAM,SAAS,YAAY,IAAI;EAC/B,IAAI,QACF,OAAO;CACX;AAEF;;;ACxkCA,SAAgB,kBAAkB,SAAmC;CACnE,MAAM,SAAS,gBAAgB,OAAO;CACtC,MAAM,aAAa,wBAAwB;EACzC,OAAO,QAAQ,SAAS,QAAQ;EAChC,QAAQ,QAAQ,UAAU,QAAQ;EAClC,SAAS,QAAQ;EACjB,SAAS,QAAQ;EACjB,YAAW,YAAW,OAAO,cAAc,OAAO;EAClD,gBAAgB,OAAO,YAAY;GACjC,MAAM,OAAO,cAAc,OAAO;EACpC;CACF,CAAC;CACD,OAAO,QAAQ,UAAU;CACzB,WAAW,MAAM;CACjB,OAAO;EACL;EACA;EACA,MAAM,QAAQ;GACZ,WAAW,MAAM;GACjB,MAAM,OAAO,MAAM;EACrB;CACF;AACF"}
package/dist/acp-cli.js CHANGED
@@ -4,7 +4,7 @@ import { n as createSandboxContext, r as createProcessContext } from "./contexts
4
4
  import { i as basic_default } from "./presets-HDIxliiq.js";
5
5
  import "./session-BDWZZaYa.js";
6
6
  import { f as arcee, i as openai, l as cerebras, p as anthropic, r as openrouter, t as xai, u as baseten } from "./providers-Cz-RNYZO.js";
7
- import { d as buildStartLocalOptions, f as parseStartArgValues, m as startProviderNames, p as startLocalArgOptions, t as runAcpStdioServer, u as StartUsageError } from "./acp-CJ1yHdpK.js";
7
+ import { d as buildStartLocalOptions, f as parseStartArgValues, m as startProviderNames, p as startLocalArgOptions, t as runAcpStdioServer, u as StartUsageError } from "./acp-BRQvvdnO.js";
8
8
  import { a as readCredentials, b as modelsForDescriptor, i as credentialsPath, n as resolveStorageDirs, p as credKeyOf, t as detectAuth, u as BUILTIN_PROVIDERS } from "./auth-QA4WuQK5.js";
9
9
  import { createDaytonaProvider } from "./contexts/daytona.js";
10
10
  import { createDockerContext } from "./contexts/docker.js";
package/dist/acp.d.ts CHANGED
@@ -498,6 +498,7 @@ interface AcpSessionRuntime {
498
498
  * so `resolveContextWindow` stays correct across `session/set_config_option`.
499
499
  */
500
500
  provider: Provider;
501
+ tools?: Record<string, ToolDef>;
501
502
  modeId: string;
502
503
  configOptions: SessionConfigOption[];
503
504
  config: Map<string, unknown>;
package/dist/acp.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"acp.d.ts","names":[],"sources":["../src/acp/types.ts","../src/acp/server.ts","../src/acp/json-rpc.ts","../src/acp/client-tools.ts","../src/acp/mapping.ts","../src/acp/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"acp.d.ts","names":[],"sources":["../src/acp/types.ts","../src/acp/server.ts","../src/acp/json-rpc.ts","../src/acp/client-tools.ts","../src/acp/mapping.ts","../src/acp/index.ts"],"mappings":"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"}
package/dist/acp.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as acpMcpServersToZidane, c as stopReasonFromRun, g as createJsonRpcConnection, h as JsonRpcRemoteError, i as wrapToolsForAcpClient, l as toolResultToAcpContent, n as AcpProtocolError, o as acpPromptToPromptParts, r as createAcpServer, s as sessionBlocksToAcp, t as runAcpStdioServer } from "./acp-CJ1yHdpK.js";
1
+ import { a as acpMcpServersToZidane, c as stopReasonFromRun, g as createJsonRpcConnection, h as JsonRpcRemoteError, i as wrapToolsForAcpClient, l as toolResultToAcpContent, n as AcpProtocolError, o as acpPromptToPromptParts, r as createAcpServer, s as sessionBlocksToAcp, t as runAcpStdioServer } from "./acp-BRQvvdnO.js";
2
2
  export { AcpProtocolError, JsonRpcRemoteError, acpMcpServersToZidane, acpPromptToPromptParts, createAcpServer, createJsonRpcConnection, runAcpStdioServer, sessionBlocksToAcp, stopReasonFromRun, toolResultToAcpContent, wrapToolsForAcpClient };
package/docs/ACP.md CHANGED
@@ -131,7 +131,9 @@ Zidane advertises the standard ACP session modes and mirrors them as a
131
131
  `category: "mode"` config option for clients that render dropdown controls:
132
132
 
133
133
  - `Build` — default implementation mode with normal tool access.
134
- - `Plan` — planning-oriented mode.
134
+ - `Plan` — planning-oriented, read-only mode. Zidane only advertises known
135
+ read/search/fetch tools and blocks mutating native/MCP tool calls as a
136
+ backstop.
135
137
 
136
138
  Clients may switch modes through either ACP `session/set_mode` or
137
139
  `session/set_config_option` with `configId: "mode"`; Zidane keeps both state
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zidane",
3
- "version": "5.13.5",
3
+ "version": "5.13.6",
4
4
  "description": "an agent that goes straight to the goal",
5
5
  "type": "module",
6
6
  "private": false,
@@ -1 +0,0 @@
1
- {"version":3,"file":"acp-CJ1yHdpK.js","names":["isObject","lastFinishReason","basic"],"sources":["../src/acp/json-rpc.ts","../src/start/shared-options.ts","../src/acp/mapping.ts","../src/acp/client-tools.ts","../src/acp/server.ts","../src/acp/index.ts"],"sourcesContent":["import type { Readable, Writable } from 'node:stream'\nimport type { AcpPeer, JsonRpcFailure, JsonRpcId, JsonRpcMessage, JsonRpcRequest, JsonRpcResponse } from './types'\nimport { Buffer } from 'node:buffer'\nimport { AcpErrorCode } from './types'\n\nexport interface JsonRpcConnectionOptions {\n input: Readable\n output: Writable\n onRequest: (message: JsonRpcRequest) => Promise<JsonRpcResponse | null | undefined> | JsonRpcResponse | null | undefined\n onNotification?: (message: JsonRpcMessage & { method: string, id?: undefined }) => void | Promise<void>\n framing?: 'content-length' | 'newline'\n onError?: (error: Error) => void\n}\n\nexport interface JsonRpcConnection extends AcpPeer {\n start: () => void\n close: () => void\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n}\n\nexport function createJsonRpcConnection(options: JsonRpcConnectionOptions): JsonRpcConnection {\n let nextId = 1\n let closed = false\n let buffer: Buffer<ArrayBufferLike> = Buffer.alloc(0)\n const pending = new Map<JsonRpcId, PendingRequest>()\n\n const writeMessage = (message: JsonRpcMessage): void => {\n if (closed)\n return\n const json = JSON.stringify({ ...message, jsonrpc: '2.0' })\n // ACP stdio framing is newline-delimited JSON (NDJSON) and is the default.\n // `JSON.stringify` escapes any embedded newline, so a serialized message is\n // always a single line. LSP-style `Content-Length` framing is opt-in for\n // non-ACP transports only.\n if (options.framing === 'content-length') {\n const bytes = Buffer.byteLength(json)\n options.output.write(`Content-Length: ${bytes}\\r\\n\\r\\n${json}`)\n return\n }\n options.output.write(`${json}\\n`)\n }\n\n const handleParsed = async (message: unknown): Promise<void> => {\n if (!isObject(message)) {\n writeMessage(errorResponse(null, AcpErrorCode.InvalidRequest, 'Invalid JSON-RPC message.'))\n return\n }\n\n const msg = message as unknown as JsonRpcMessage\n if ('id' in msg && ('result' in msg || 'error' in msg)) {\n const request = pending.get(msg.id)\n if (!request)\n return\n pending.delete(msg.id)\n if ('error' in msg && msg.error) {\n request.reject(new JsonRpcRemoteError(msg.error.message, msg.error.code, msg.error.data))\n }\n else {\n request.resolve((msg as { result?: unknown }).result)\n }\n return\n }\n\n if (typeof (msg as { method?: unknown }).method !== 'string') {\n writeMessage(errorResponse(('id' in msg ? msg.id : null) ?? null, AcpErrorCode.InvalidRequest, 'Missing JSON-RPC method.'))\n return\n }\n\n if ('id' in msg) {\n try {\n const response = await options.onRequest(msg as JsonRpcRequest)\n if (response)\n writeMessage(response)\n }\n catch (err) {\n writeMessage(errorResponse(msg.id, AcpErrorCode.InternalError, err instanceof Error ? err.message : String(err)))\n }\n return\n }\n\n try {\n await options.onNotification?.(msg as JsonRpcMessage & { method: string, id?: undefined })\n }\n catch (err) {\n options.onError?.(err instanceof Error ? err : new Error(String(err)))\n }\n }\n\n const onData = (chunk: Buffer | string): void => {\n buffer = Buffer.concat([buffer, typeof chunk === 'string' ? Buffer.from(chunk) : chunk])\n for (;;) {\n let parsed: { message: unknown, rest: Buffer<ArrayBufferLike> } | null\n try {\n parsed = readNextMessage(buffer)\n }\n catch (err) {\n buffer = Buffer.alloc(0)\n writeMessage(errorResponse(null, AcpErrorCode.ParseError, err instanceof Error ? err.message : String(err)))\n break\n }\n if (!parsed)\n break\n buffer = parsed.rest\n void handleParsed(parsed.message)\n }\n }\n\n const onError = (err: Error): void => {\n options.onError?.(err)\n }\n\n return {\n start() {\n options.input.on('data', onData)\n options.input.on('error', onError)\n },\n close() {\n closed = true\n options.input.off('data', onData)\n options.input.off('error', onError)\n for (const request of pending.values())\n request.reject(new Error('JSON-RPC connection closed.'))\n pending.clear()\n },\n sendNotification(method: string, params?: unknown) {\n writeMessage({ jsonrpc: '2.0', method, ...(params !== undefined ? { params } : {}) })\n },\n sendRequest(method: string, params?: unknown) {\n if (closed)\n return Promise.reject(new Error('JSON-RPC connection is closed.'))\n const id = nextId++\n writeMessage({ jsonrpc: '2.0', id, method, ...(params !== undefined ? { params } : {}) })\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n })\n },\n }\n}\n\nexport class JsonRpcRemoteError extends Error {\n constructor(message: string, readonly code: number, readonly data?: unknown) {\n super(message)\n this.name = 'JsonRpcRemoteError'\n }\n}\n\nexport function successResponse(id: JsonRpcId, result: unknown = {}): JsonRpcResponse {\n return { jsonrpc: '2.0', id, result }\n}\n\nexport function errorResponse(id: JsonRpcId, code: number, message: string, data?: unknown): JsonRpcFailure {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n }\n}\n\nfunction readNextMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n if (input.length === 0)\n return null\n\n const headerEnd = input.indexOf('\\r\\n\\r\\n')\n if (headerEnd >= 0) {\n const header = input.subarray(0, headerEnd).toString('utf8')\n const match = /^Content-Length:\\s*(\\d+)/im.exec(header)\n if (!match)\n return readLineMessage(input)\n const length = Number(match[1])\n const bodyStart = headerEnd + 4\n const bodyEnd = bodyStart + length\n if (input.length < bodyEnd)\n return null\n const body = input.subarray(bodyStart, bodyEnd).toString('utf8')\n return { message: JSON.parse(body), rest: input.subarray(bodyEnd) }\n }\n\n if (/^Content-Length:/i.test(input.subarray(0, Math.min(input.length, 32)).toString('utf8')))\n return null\n\n return readLineMessage(input)\n}\n\nfunction readLineMessage(input: Buffer<ArrayBufferLike>): { message: unknown, rest: Buffer<ArrayBufferLike> } | null {\n let rest = input\n // Skip blank lines: NDJSON streams may contain stray newlines (e.g. a keep-\n // alive or a trailing separator). Emitting an error for those would be wrong.\n for (;;) {\n const lineEnd = rest.indexOf('\\n')\n if (lineEnd < 0)\n return null\n const line = rest.subarray(0, lineEnd).toString('utf8').trim()\n rest = rest.subarray(lineEnd + 1)\n if (line.length === 0)\n continue\n return { message: JSON.parse(line), rest }\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n","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', 'arcee', 'baseten', '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 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 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 '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': { 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 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 ...(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 json: values.json === true,\n streamJson: values['stream-json'] === true,\n format,\n }\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 ` --stream-json streams COMPLETE TURNS as JSONL (one line per turn), then the result.`,\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 { 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\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\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\nexport function sessionBlocksToAcp(blocks: readonly SessionContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = []\n for (const block of blocks) {\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\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\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 { resolveAcpPath } from './mapping'\n\nexport interface AcpClientToolOptions {\n client: AcpPeer\n sessionId: string\n capabilities: AcpClientCapabilities\n useClientFileSystem?: boolean\n useClientTerminal?: boolean\n}\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 return {\n ...base,\n async execute(input, ctx) {\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 line = lineOrDefault(input.offset)\n const limit = positiveNumberOrNull(input.limit)\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 const content = typeof response.content === 'string' ? response.content : ''\n seedReadState(ctx, absPath, content, line ?? 1, limit ?? Number.POSITIVE_INFINITY)\n if (input.lineNumbers === false)\n return content\n return withLineNumbers(content, line ?? 1)\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","import type { AgentOptions } from '../agent'\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 {\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 { createProcessContext } from '../contexts'\nimport { errorMessage } from '../errors'\nimport { basic } from '../presets'\nimport { defaultPromptMessage } from '../prompt'\nimport { createSession, loadSession } from '../session'\nimport { validThinkingLevels } from '../start/shared-options'\nimport { effectiveInputFromTurn } from '../stats'\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 { 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\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\nexport interface AcpServer {\n setPeer: (peer: AcpPeer) => void\n handleMessage: (message: JsonRpcMessage) => Promise<JsonRpcResponse | null>\n handleRequest: (method: string, params?: unknown) => Promise<unknown>\n notify: (method: string, params?: unknown) => Promise<void>\n close: () => Promise<void>\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\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 },\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 }, 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 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 const ids = await store.list({ limit: 100, ...(params.cwd ? { projectRoot: params.cwd } : {}) })\n const sessions: SessionInfo[] = []\n for (const id of ids) {\n const loaded = await store.load(id)\n if (!loaded)\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 = 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 stats = await runtime.agent.run({\n prompt: mapped.prompt,\n ...(runtime.runModel ? { model: runtime.runModel } : {}),\n ...this.runConfig(runtime),\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 return existing\n }\n }\n\n const mcpServers = acpMcpServersToZidane(params.mcpServers)\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 base = this.options.preset ?? basic\n const agentOptions = this.options.agentOptions ?? {}\n const tools = mergeTools(base.tools, agentOptions.tools, this.options.tools)\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 const behavior = { ...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 session,\n execution,\n agent,\n provider,\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 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 const created = await createSession({ id: sessionId, store, projectRoot: cwd, metadata: { title: 'ACP session' } })\n await created.save()\n return created\n }\n if (sessionId && mustExist)\n throw new AcpProtocolError(AcpErrorCode.ResourceNotFound, `Unknown session: ${sessionId}`)\n const created = await createSession({ ...(sessionId ? { id: sessionId } : {}), ...(store ? { store } : {}), projectRoot: cwd, metadata: { title: 'ACP session' } })\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('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))\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 const meta = runtime.provider.meta as { contextWindow?: unknown }\n if (typeof meta.contextWindow === 'number' && meta.contextWindow > 0)\n return meta.contextWindow\n return undefined\n }\n\n private shouldRequestPermission(name: string, input: Record<string, unknown>): boolean {\n const policy = this.options.permission\n if (policy?.enabled !== true || !this.peer)\n return false\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\nexport class AcpProtocolError extends Error {\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 isThinkingLevel(value: unknown): value is ThinkingLevel {\n return typeof value === 'string' && (validThinkingLevels as readonly string[]).includes(value)\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 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 { 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 } from './server'\nexport type { AcpServer } from './server'\nexport type * from './types'\n\nexport interface RunAcpStdioServerOptions extends AcpServerOptions {\n input?: Readable\n output?: Writable\n framing?: 'content-length' | 'newline'\n onError?: (error: Error) => void\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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"}