acpx 0.17.0 → 0.18.0

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.
Files changed (37) hide show
  1. package/dist/{agent-registry-DU6mhZBL.js → agent-registry-DdKB-zia.js} +20 -17
  2. package/dist/agent-registry-DdKB-zia.js.map +1 -0
  3. package/dist/agent-registry.d.ts.map +1 -1
  4. package/dist/agent-registry.js +1 -1
  5. package/dist/{cli-CiyfEC7L.js → cli-8mVHeUXh.js} +5 -5
  6. package/dist/{cli-CiyfEC7L.js.map → cli-8mVHeUXh.js.map} +1 -1
  7. package/dist/cli.js +122 -94
  8. package/dist/cli.js.map +1 -1
  9. package/dist/{client-C6NUFqr-.d.ts → client-DeNKZZcu.d.ts} +19 -13
  10. package/dist/client-DeNKZZcu.d.ts.map +1 -0
  11. package/dist/{flows-CTOdIk-m.js → flows-WOQNzCMC.js} +5 -5
  12. package/dist/{flows-CTOdIk-m.js.map → flows-WOQNzCMC.js.map} +1 -1
  13. package/dist/flows.d.ts +1 -1
  14. package/dist/flows.js +1 -1
  15. package/dist/{invocation-options-DbCcOAzM.js → invocation-options-B6d7TI-y.js} +7 -6
  16. package/dist/{invocation-options-DbCcOAzM.js.map → invocation-options-B6d7TI-y.js.map} +1 -1
  17. package/dist/{ipc-D3akHMEq.js → ipc-BJrvfNXr.js} +307 -90
  18. package/dist/ipc-BJrvfNXr.js.map +1 -0
  19. package/dist/{output-BPPjvJTI.js → output-CL18YmsG.js} +9 -6
  20. package/dist/output-CL18YmsG.js.map +1 -0
  21. package/dist/{queue-owner-runtime--IbbndGz.js → queue-owner-runtime-Cr0dWJuL.js} +1008 -463
  22. package/dist/queue-owner-runtime-Cr0dWJuL.js.map +1 -0
  23. package/dist/runtime.d.ts +129 -39
  24. package/dist/runtime.d.ts.map +1 -1
  25. package/dist/runtime.js +378 -176
  26. package/dist/runtime.js.map +1 -1
  27. package/dist/{session-watch--UX5dh00.js → session-watch-B8Q_TsGf.js} +4 -4
  28. package/dist/{session-watch--UX5dh00.js.map → session-watch-B8Q_TsGf.js.map} +1 -1
  29. package/dist/{watch-BbBxO-kb.js → watch-Dp73ph8h.js} +2 -2
  30. package/dist/{watch-BbBxO-kb.js.map → watch-Dp73ph8h.js.map} +1 -1
  31. package/package.json +3 -3
  32. package/skills/acpx/SKILL.md +27 -7
  33. package/dist/agent-registry-DU6mhZBL.js.map +0 -1
  34. package/dist/client-C6NUFqr-.d.ts.map +0 -1
  35. package/dist/ipc-D3akHMEq.js.map +0 -1
  36. package/dist/output-BPPjvJTI.js.map +0 -1
  37. package/dist/queue-owner-runtime--IbbndGz.js.map +0 -1
@@ -1,6 +1,6 @@
1
- import { i as JsonMessageSanitizer, t as createOutputFormatter } from "./output-BPPjvJTI.js";
2
- import { ot as parsePromptStopReason, tt as isAcpJsonRpcMessage } from "./ipc-D3akHMEq.js";
3
- import { t as watchSession } from "./watch-BbBxO-kb.js";
1
+ import { i as JsonMessageSanitizer, t as createOutputFormatter } from "./output-CL18YmsG.js";
2
+ import { nt as isAcpJsonRpcMessage, st as parsePromptStopReason } from "./ipc-BJrvfNXr.js";
3
+ import { t as watchSession } from "./watch-Dp73ph8h.js";
4
4
  import { once } from "node:events";
5
5
  //#region src/cli/session-watch.ts
6
6
  function watchRenderer(policy) {
@@ -73,4 +73,4 @@ async function runSessionWatch(record, options) {
73
73
  //#endregion
74
74
  export { runSessionWatch };
75
75
 
76
- //# sourceMappingURL=session-watch--UX5dh00.js.map
76
+ //# sourceMappingURL=session-watch-B8Q_TsGf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-watch--UX5dh00.js","names":[],"sources":["../src/cli/session-watch.ts"],"sourcesContent":["import { once } from \"node:events\";\nimport { isAcpJsonRpcMessage, parsePromptStopReason } from \"../acp/jsonrpc.js\";\nimport type { SessionWatchEvent } from \"../session/journal.js\";\nimport { watchSession } from \"../session/watch.js\";\nimport type { OutputFormatter, OutputPolicy, SessionRecord } from \"../types.js\";\nimport { JsonMessageSanitizer } from \"./output/json-formatter.js\";\nimport { createOutputFormatter } from \"./output/output.js\";\n\nfunction watchRenderer(policy: OutputPolicy): (event: SessionWatchEvent) => string[] {\n const chunks: string[] = [];\n const stdout = {\n write: (chunk: string) => {\n chunks.push(chunk);\n },\n };\n let sanitizer = new JsonMessageSanitizer(policy.suppressReads, true);\n let formatter = createOutputFormatter(policy.format, { stdout });\n return (event) => {\n chunks.length = 0;\n if (event.type === \"turn_started\") {\n sanitizer = new JsonMessageSanitizer(policy.suppressReads, true);\n formatter = createOutputFormatter(policy.format, { stdout });\n }\n if (policy.format === \"json\") {\n chunks.push(\n JSON.stringify(\n event.type === \"message\"\n ? { ...event, message: sanitizer.sanitize(event.message) }\n : event,\n ) + \"\\n\",\n );\n } else if (event.type === \"message\") {\n renderWatchMessage(event, sanitizer, formatter, policy.format === \"quiet\");\n } else {\n formatter.flush();\n if (policy.format !== \"quiet\") {\n chunks.push(watchLifecycleLine(event));\n }\n }\n return chunks;\n };\n}\n\nfunction renderWatchMessage(\n event: Extract<SessionWatchEvent, { type: \"message\" }>,\n sanitizer: JsonMessageSanitizer,\n formatter: OutputFormatter,\n quiet: boolean,\n): void {\n const message = sanitizer.sanitize(event.message);\n if (!isAcpJsonRpcMessage(message)) {\n throw new Error(\"Invalid sanitized session message\");\n }\n if (quiet || parsePromptStopReason(message) === undefined) {\n formatter.onAcpMessage(message);\n }\n}\n\nfunction watchLifecycleLine(event: Exclude<SessionWatchEvent, { type: \"message\" }>): string {\n if (event.type === \"turn_started\") {\n return `\\n[${event.requestId}] started cursor=${event.cursor}\\n`;\n }\n const detail =\n event.result.status === \"failed\" ? event.result.error.message : event.result.stopReason;\n return `\\n[${event.requestId}] ${event.result.status}${detail ? `: ${detail}` : \"\"} cursor=${event.cursor}\\n`;\n}\n\nexport async function runSessionWatch(\n record: SessionRecord,\n options: { cursor?: string; policy: OutputPolicy },\n): Promise<void> {\n const stopped = new AbortController();\n let outputError: Error | undefined;\n const stop = () => stopped.abort();\n const onOutputError = (error: Error) => {\n if ((error as NodeJS.ErrnoException).code !== \"EPIPE\") {\n outputError = error;\n }\n stop();\n };\n const render = watchRenderer(options.policy);\n process.on(\"SIGINT\", stop);\n process.on(\"SIGTERM\", stop);\n process.on(\"SIGHUP\", stop);\n process.stdout.on(\"error\", onOutputError);\n try {\n for await (const event of watchSession({\n record,\n cursor: options.cursor,\n signal: stopped.signal,\n })) {\n for (const chunk of render(event)) {\n if (stopped.signal.aborted) {\n break;\n }\n if (!process.stdout.write(chunk)) {\n await once(process.stdout, \"drain\", { signal: stopped.signal });\n }\n }\n }\n } catch (error) {\n if (!stopped.signal.aborted) {\n throw error;\n }\n } finally {\n process.off(\"SIGINT\", stop);\n process.off(\"SIGTERM\", stop);\n process.off(\"SIGHUP\", stop);\n process.stdout.off(\"error\", onOutputError);\n }\n if (outputError) {\n throw outputError;\n }\n}\n"],"mappings":";;;;;AAQA,SAAS,cAAc,QAA8D;CACnF,MAAM,SAAmB,CAAC;CAC1B,MAAM,SAAS,EACb,QAAQ,UAAkB;EACxB,OAAO,KAAK,KAAK;CACnB,EACF;CACA,IAAI,YAAY,IAAI,qBAAqB,OAAO,eAAe,IAAI;CACnE,IAAI,YAAY,sBAAsB,OAAO,QAAQ,EAAE,OAAO,CAAC;CAC/D,QAAQ,UAAU;EAChB,OAAO,SAAS;EAChB,IAAI,MAAM,SAAS,gBAAgB;GACjC,YAAY,IAAI,qBAAqB,OAAO,eAAe,IAAI;GAC/D,YAAY,sBAAsB,OAAO,QAAQ,EAAE,OAAO,CAAC;EAC7D;EACA,IAAI,OAAO,WAAW,QACpB,OAAO,KACL,KAAK,UACH,MAAM,SAAS,YACX;GAAE,GAAG;GAAO,SAAS,UAAU,SAAS,MAAM,OAAO;EAAE,IACvD,KACN,IAAI,IACN;OACK,IAAI,MAAM,SAAS,WACxB,mBAAmB,OAAO,WAAW,WAAW,OAAO,WAAW,OAAO;OACpE;GACL,UAAU,MAAM;GAChB,IAAI,OAAO,WAAW,SACpB,OAAO,KAAK,mBAAmB,KAAK,CAAC;EAEzC;EACA,OAAO;CACT;AACF;AAEA,SAAS,mBACP,OACA,WACA,WACA,OACM;CACN,MAAM,UAAU,UAAU,SAAS,MAAM,OAAO;CAChD,IAAI,CAAC,oBAAoB,OAAO,GAC9B,MAAM,IAAI,MAAM,mCAAmC;CAErD,IAAI,SAAS,sBAAsB,OAAO,MAAM,KAAA,GAC9C,UAAU,aAAa,OAAO;AAElC;AAEA,SAAS,mBAAmB,OAAgE;CAC1F,IAAI,MAAM,SAAS,gBACjB,OAAO,MAAM,MAAM,UAAU,mBAAmB,MAAM,OAAO;CAE/D,MAAM,SACJ,MAAM,OAAO,WAAW,WAAW,MAAM,OAAO,MAAM,UAAU,MAAM,OAAO;CAC/E,OAAO,MAAM,MAAM,UAAU,IAAI,MAAM,OAAO,SAAS,SAAS,KAAK,WAAW,GAAG,UAAU,MAAM,OAAO;AAC5G;AAEA,eAAsB,gBACpB,QACA,SACe;CACf,MAAM,UAAU,IAAI,gBAAgB;CACpC,IAAI;CACJ,MAAM,aAAa,QAAQ,MAAM;CACjC,MAAM,iBAAiB,UAAiB;EACtC,IAAK,MAAgC,SAAS,SAC5C,cAAc;EAEhB,KAAK;CACP;CACA,MAAM,SAAS,cAAc,QAAQ,MAAM;CAC3C,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,GAAG,WAAW,IAAI;CAC1B,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,OAAO,GAAG,SAAS,aAAa;CACxC,IAAI;EACF,WAAW,MAAM,SAAS,aAAa;GACrC;GACA,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;EAClB,CAAC,GACC,KAAK,MAAM,SAAS,OAAO,KAAK,GAAG;GACjC,IAAI,QAAQ,OAAO,SACjB;GAEF,IAAI,CAAC,QAAQ,OAAO,MAAM,KAAK,GAC7B,MAAM,KAAK,QAAQ,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,CAAC;EAElE;CAEJ,SAAS,OAAO;EACd,IAAI,CAAC,QAAQ,OAAO,SAClB,MAAM;CAEV,UAAU;EACR,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,IAAI,WAAW,IAAI;EAC3B,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,OAAO,IAAI,SAAS,aAAa;CAC3C;CACA,IAAI,aACF,MAAM;AAEV"}
1
+ {"version":3,"file":"session-watch-B8Q_TsGf.js","names":[],"sources":["../src/cli/session-watch.ts"],"sourcesContent":["import { once } from \"node:events\";\nimport { isAcpJsonRpcMessage, parsePromptStopReason } from \"../acp/jsonrpc.js\";\nimport type { SessionWatchEvent } from \"../session/journal.js\";\nimport { watchSession } from \"../session/watch.js\";\nimport type { OutputFormatter, OutputPolicy, SessionRecord } from \"../types.js\";\nimport { JsonMessageSanitizer } from \"./output/json-formatter.js\";\nimport { createOutputFormatter } from \"./output/output.js\";\n\nfunction watchRenderer(policy: OutputPolicy): (event: SessionWatchEvent) => string[] {\n const chunks: string[] = [];\n const stdout = {\n write: (chunk: string) => {\n chunks.push(chunk);\n },\n };\n let sanitizer = new JsonMessageSanitizer(policy.suppressReads, true);\n let formatter = createOutputFormatter(policy.format, { stdout });\n return (event) => {\n chunks.length = 0;\n if (event.type === \"turn_started\") {\n sanitizer = new JsonMessageSanitizer(policy.suppressReads, true);\n formatter = createOutputFormatter(policy.format, { stdout });\n }\n if (policy.format === \"json\") {\n chunks.push(\n JSON.stringify(\n event.type === \"message\"\n ? { ...event, message: sanitizer.sanitize(event.message) }\n : event,\n ) + \"\\n\",\n );\n } else if (event.type === \"message\") {\n renderWatchMessage(event, sanitizer, formatter, policy.format === \"quiet\");\n } else {\n formatter.flush();\n if (policy.format !== \"quiet\") {\n chunks.push(watchLifecycleLine(event));\n }\n }\n return chunks;\n };\n}\n\nfunction renderWatchMessage(\n event: Extract<SessionWatchEvent, { type: \"message\" }>,\n sanitizer: JsonMessageSanitizer,\n formatter: OutputFormatter,\n quiet: boolean,\n): void {\n const message = sanitizer.sanitize(event.message);\n if (!isAcpJsonRpcMessage(message)) {\n throw new Error(\"Invalid sanitized session message\");\n }\n if (quiet || parsePromptStopReason(message) === undefined) {\n formatter.onAcpMessage(message);\n }\n}\n\nfunction watchLifecycleLine(event: Exclude<SessionWatchEvent, { type: \"message\" }>): string {\n if (event.type === \"turn_started\") {\n return `\\n[${event.requestId}] started cursor=${event.cursor}\\n`;\n }\n const detail =\n event.result.status === \"failed\" ? event.result.error.message : event.result.stopReason;\n return `\\n[${event.requestId}] ${event.result.status}${detail ? `: ${detail}` : \"\"} cursor=${event.cursor}\\n`;\n}\n\nexport async function runSessionWatch(\n record: SessionRecord,\n options: { cursor?: string; policy: OutputPolicy },\n): Promise<void> {\n const stopped = new AbortController();\n let outputError: Error | undefined;\n const stop = () => stopped.abort();\n const onOutputError = (error: Error) => {\n if ((error as NodeJS.ErrnoException).code !== \"EPIPE\") {\n outputError = error;\n }\n stop();\n };\n const render = watchRenderer(options.policy);\n process.on(\"SIGINT\", stop);\n process.on(\"SIGTERM\", stop);\n process.on(\"SIGHUP\", stop);\n process.stdout.on(\"error\", onOutputError);\n try {\n for await (const event of watchSession({\n record,\n cursor: options.cursor,\n signal: stopped.signal,\n })) {\n for (const chunk of render(event)) {\n if (stopped.signal.aborted) {\n break;\n }\n if (!process.stdout.write(chunk)) {\n await once(process.stdout, \"drain\", { signal: stopped.signal });\n }\n }\n }\n } catch (error) {\n if (!stopped.signal.aborted) {\n throw error;\n }\n } finally {\n process.off(\"SIGINT\", stop);\n process.off(\"SIGTERM\", stop);\n process.off(\"SIGHUP\", stop);\n process.stdout.off(\"error\", onOutputError);\n }\n if (outputError) {\n throw outputError;\n }\n}\n"],"mappings":";;;;;AAQA,SAAS,cAAc,QAA8D;CACnF,MAAM,SAAmB,CAAC;CAC1B,MAAM,SAAS,EACb,QAAQ,UAAkB;EACxB,OAAO,KAAK,KAAK;CACnB,EACF;CACA,IAAI,YAAY,IAAI,qBAAqB,OAAO,eAAe,IAAI;CACnE,IAAI,YAAY,sBAAsB,OAAO,QAAQ,EAAE,OAAO,CAAC;CAC/D,QAAQ,UAAU;EAChB,OAAO,SAAS;EAChB,IAAI,MAAM,SAAS,gBAAgB;GACjC,YAAY,IAAI,qBAAqB,OAAO,eAAe,IAAI;GAC/D,YAAY,sBAAsB,OAAO,QAAQ,EAAE,OAAO,CAAC;EAC7D;EACA,IAAI,OAAO,WAAW,QACpB,OAAO,KACL,KAAK,UACH,MAAM,SAAS,YACX;GAAE,GAAG;GAAO,SAAS,UAAU,SAAS,MAAM,OAAO;EAAE,IACvD,KACN,IAAI,IACN;OACK,IAAI,MAAM,SAAS,WACxB,mBAAmB,OAAO,WAAW,WAAW,OAAO,WAAW,OAAO;OACpE;GACL,UAAU,MAAM;GAChB,IAAI,OAAO,WAAW,SACpB,OAAO,KAAK,mBAAmB,KAAK,CAAC;EAEzC;EACA,OAAO;CACT;AACF;AAEA,SAAS,mBACP,OACA,WACA,WACA,OACM;CACN,MAAM,UAAU,UAAU,SAAS,MAAM,OAAO;CAChD,IAAI,CAAC,oBAAoB,OAAO,GAC9B,MAAM,IAAI,MAAM,mCAAmC;CAErD,IAAI,SAAS,sBAAsB,OAAO,MAAM,KAAA,GAC9C,UAAU,aAAa,OAAO;AAElC;AAEA,SAAS,mBAAmB,OAAgE;CAC1F,IAAI,MAAM,SAAS,gBACjB,OAAO,MAAM,MAAM,UAAU,mBAAmB,MAAM,OAAO;CAE/D,MAAM,SACJ,MAAM,OAAO,WAAW,WAAW,MAAM,OAAO,MAAM,UAAU,MAAM,OAAO;CAC/E,OAAO,MAAM,MAAM,UAAU,IAAI,MAAM,OAAO,SAAS,SAAS,KAAK,WAAW,GAAG,UAAU,MAAM,OAAO;AAC5G;AAEA,eAAsB,gBACpB,QACA,SACe;CACf,MAAM,UAAU,IAAI,gBAAgB;CACpC,IAAI;CACJ,MAAM,aAAa,QAAQ,MAAM;CACjC,MAAM,iBAAiB,UAAiB;EACtC,IAAK,MAAgC,SAAS,SAC5C,cAAc;EAEhB,KAAK;CACP;CACA,MAAM,SAAS,cAAc,QAAQ,MAAM;CAC3C,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,GAAG,WAAW,IAAI;CAC1B,QAAQ,GAAG,UAAU,IAAI;CACzB,QAAQ,OAAO,GAAG,SAAS,aAAa;CACxC,IAAI;EACF,WAAW,MAAM,SAAS,aAAa;GACrC;GACA,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;EAClB,CAAC,GACC,KAAK,MAAM,SAAS,OAAO,KAAK,GAAG;GACjC,IAAI,QAAQ,OAAO,SACjB;GAEF,IAAI,CAAC,QAAQ,OAAO,MAAM,KAAK,GAC7B,MAAM,KAAK,QAAQ,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,CAAC;EAElE;CAEJ,SAAS,OAAO;EACd,IAAI,CAAC,QAAQ,OAAO,SAClB,MAAM;CAEV,UAAU;EACR,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,IAAI,WAAW,IAAI;EAC3B,QAAQ,IAAI,UAAU,IAAI;EAC1B,QAAQ,OAAO,IAAI,SAAS,aAAa;CAC3C;CACA,IAAI,aACF,MAAM;AAEV"}
@@ -1,4 +1,4 @@
1
- import { G as watchSession$1, Ht as SessionNotFoundError, P as readSessionRecord, W as SessionWatchError, d as readQueueOwnerRecord, ht as isProcessAlive } from "./ipc-D3akHMEq.js";
1
+ import { F as readSessionRecord, G as SessionWatchError, K as watchSession$1, Wt as SessionNotFoundError, d as readQueueOwnerRecord, gt as isProcessAlive } from "./ipc-BJrvfNXr.js";
2
2
  //#region src/session/watch.ts
3
3
  async function continueWatching(recordId, pendingRequestId, observation) {
4
4
  const owner = await readQueueOwnerRecord(recordId);
@@ -29,4 +29,4 @@ function watchSession(options) {
29
29
  //#endregion
30
30
  export { watchSession as t };
31
31
 
32
- //# sourceMappingURL=watch-BbBxO-kb.js.map
32
+ //# sourceMappingURL=watch-Dp73ph8h.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch-BbBxO-kb.js","names":["watchJournal"],"sources":["../src/session/watch.ts"],"sourcesContent":["import { SessionNotFoundError } from \"../errors.js\";\nimport { isProcessAlive } from \"../process-liveness.js\";\nimport type { SessionRecord } from \"../types.js\";\nimport {\n SessionWatchError,\n watchSession as watchJournal,\n type SessionWatchEvent,\n} from \"./journal.js\";\nimport { readSessionRecord } from \"./persistence.js\";\nimport { readQueueOwnerRecord } from \"./queue/lease-store.js\";\n\nasync function continueWatching(\n recordId: string,\n pendingRequestId: string | null,\n observation: { missingRequest: string | null },\n): Promise<boolean> {\n const owner = await readQueueOwnerRecord(recordId);\n if (owner && isProcessAlive(owner.pid)) {\n if (!owner.sessionWatch) {\n throw new SessionWatchError(\n \"WATCH_OWNER_UNSUPPORTED\",\n \"This running session owner predates passive watching. Let it expire when idle or explicitly close the session before starting new work.\",\n );\n }\n observation.missingRequest = null;\n return true;\n }\n if (pendingRequestId && pendingRequestId === observation.missingRequest) {\n throw new SessionWatchError(\n \"WATCH_OUTCOME_UNKNOWN\",\n `Session owner ended without a settled result for request ${pendingRequestId}; its outcome is unknown. Resume watching from the last cursor after recovery, and do not automatically replay the prompt.`,\n );\n }\n observation.missingRequest = pendingRequestId;\n if (pendingRequestId) {\n return true;\n }\n return await isSessionOpen(recordId);\n}\n\nasync function isSessionOpen(recordId: string): Promise<boolean> {\n const record = await readSessionRecord(recordId);\n if (!record || record.acpxRecordId !== recordId) {\n throw new SessionNotFoundError(recordId);\n }\n return record.closed !== true;\n}\n\nexport function watchSession(options: {\n record: SessionRecord | Promise<SessionRecord>;\n cursor?: string;\n signal?: AbortSignal;\n}): AsyncIterable<SessionWatchEvent> {\n return {\n [Symbol.asyncIterator]() {\n const observation: { missingRequest: string | null } = { missingRequest: null };\n return watchJournal({\n ...options,\n continueWatching: (record, requestId) =>\n continueWatching(record.acpxRecordId, requestId, observation),\n })[Symbol.asyncIterator]();\n },\n };\n}\n"],"mappings":";;AAWA,eAAe,iBACb,UACA,kBACA,aACkB;CAClB,MAAM,QAAQ,MAAM,qBAAqB,QAAQ;CACjD,IAAI,SAAS,eAAe,MAAM,GAAG,GAAG;EACtC,IAAI,CAAC,MAAM,cACT,MAAM,IAAI,kBACR,2BACA,yIACF;EAEF,YAAY,iBAAiB;EAC7B,OAAO;CACT;CACA,IAAI,oBAAoB,qBAAqB,YAAY,gBACvD,MAAM,IAAI,kBACR,yBACA,4DAA4D,iBAAiB,2HAC/E;CAEF,YAAY,iBAAiB;CAC7B,IAAI,kBACF,OAAO;CAET,OAAO,MAAM,cAAc,QAAQ;AACrC;AAEA,eAAe,cAAc,UAAoC;CAC/D,MAAM,SAAS,MAAM,kBAAkB,QAAQ;CAC/C,IAAI,CAAC,UAAU,OAAO,iBAAiB,UACrC,MAAM,IAAI,qBAAqB,QAAQ;CAEzC,OAAO,OAAO,WAAW;AAC3B;AAEA,SAAgB,aAAa,SAIQ;CACnC,OAAO,EACL,CAAC,OAAO,iBAAiB;EACvB,MAAM,cAAiD,EAAE,gBAAgB,KAAK;EAC9E,OAAOA,eAAa;GAClB,GAAG;GACH,mBAAmB,QAAQ,cACzB,iBAAiB,OAAO,cAAc,WAAW,WAAW;EAChE,CAAC,CAAC,CAAC,OAAO,cAAc,CAAC;CAC3B,EACF;AACF"}
1
+ {"version":3,"file":"watch-Dp73ph8h.js","names":["watchJournal"],"sources":["../src/session/watch.ts"],"sourcesContent":["import { SessionNotFoundError } from \"../errors.js\";\nimport { isProcessAlive } from \"../process-liveness.js\";\nimport type { SessionRecord } from \"../types.js\";\nimport {\n SessionWatchError,\n watchSession as watchJournal,\n type SessionWatchEvent,\n} from \"./journal.js\";\nimport { readSessionRecord } from \"./persistence.js\";\nimport { readQueueOwnerRecord } from \"./queue/lease-store.js\";\n\nasync function continueWatching(\n recordId: string,\n pendingRequestId: string | null,\n observation: { missingRequest: string | null },\n): Promise<boolean> {\n const owner = await readQueueOwnerRecord(recordId);\n if (owner && isProcessAlive(owner.pid)) {\n if (!owner.sessionWatch) {\n throw new SessionWatchError(\n \"WATCH_OWNER_UNSUPPORTED\",\n \"This running session owner predates passive watching. Let it expire when idle or explicitly close the session before starting new work.\",\n );\n }\n observation.missingRequest = null;\n return true;\n }\n if (pendingRequestId && pendingRequestId === observation.missingRequest) {\n throw new SessionWatchError(\n \"WATCH_OUTCOME_UNKNOWN\",\n `Session owner ended without a settled result for request ${pendingRequestId}; its outcome is unknown. Resume watching from the last cursor after recovery, and do not automatically replay the prompt.`,\n );\n }\n observation.missingRequest = pendingRequestId;\n if (pendingRequestId) {\n return true;\n }\n return await isSessionOpen(recordId);\n}\n\nasync function isSessionOpen(recordId: string): Promise<boolean> {\n const record = await readSessionRecord(recordId);\n if (!record || record.acpxRecordId !== recordId) {\n throw new SessionNotFoundError(recordId);\n }\n return record.closed !== true;\n}\n\nexport function watchSession(options: {\n record: SessionRecord | Promise<SessionRecord>;\n cursor?: string;\n signal?: AbortSignal;\n}): AsyncIterable<SessionWatchEvent> {\n return {\n [Symbol.asyncIterator]() {\n const observation: { missingRequest: string | null } = { missingRequest: null };\n return watchJournal({\n ...options,\n continueWatching: (record, requestId) =>\n continueWatching(record.acpxRecordId, requestId, observation),\n })[Symbol.asyncIterator]();\n },\n };\n}\n"],"mappings":";;AAWA,eAAe,iBACb,UACA,kBACA,aACkB;CAClB,MAAM,QAAQ,MAAM,qBAAqB,QAAQ;CACjD,IAAI,SAAS,eAAe,MAAM,GAAG,GAAG;EACtC,IAAI,CAAC,MAAM,cACT,MAAM,IAAI,kBACR,2BACA,yIACF;EAEF,YAAY,iBAAiB;EAC7B,OAAO;CACT;CACA,IAAI,oBAAoB,qBAAqB,YAAY,gBACvD,MAAM,IAAI,kBACR,yBACA,4DAA4D,iBAAiB,2HAC/E;CAEF,YAAY,iBAAiB;CAC7B,IAAI,kBACF,OAAO;CAET,OAAO,MAAM,cAAc,QAAQ;AACrC;AAEA,eAAe,cAAc,UAAoC;CAC/D,MAAM,SAAS,MAAM,kBAAkB,QAAQ;CAC/C,IAAI,CAAC,UAAU,OAAO,iBAAiB,UACrC,MAAM,IAAI,qBAAqB,QAAQ;CAEzC,OAAO,OAAO,WAAW;AAC3B;AAEA,SAAgB,aAAa,SAIQ;CACnC,OAAO,EACL,CAAC,OAAO,iBAAiB;EACvB,MAAM,cAAiD,EAAE,gBAAgB,KAAK;EAC9E,OAAOA,eAAa;GAClB,GAAG;GACH,mBAAmB,QAAQ,cACzB,iBAAiB,OAAO,cAAc,WAAW,WAAW;EAChE,CAAC,CAAC,CAAC,OAAO,cAAc,CAAC;CAC3B,EACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "acpx",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Headless CLI client for the Agent Client Protocol (ACP) — talk to coding agents from the command line",
5
5
  "keywords": [
6
6
  "acp",
@@ -82,7 +82,7 @@
82
82
  },
83
83
  "dependencies": {
84
84
  "@agentclientprotocol/sdk": "^1.4.0",
85
- "@openclaw/fs-safe": "^0.10.0",
85
+ "@openclaw/fs-safe": "^0.12.0",
86
86
  "commander": "^15.0.0",
87
87
  "skillflag": "^0.2.1",
88
88
  "tsx": "^4.23.13",
@@ -104,7 +104,7 @@
104
104
  "husky": "^9.1.7",
105
105
  "lint-staged": "^17.5.1",
106
106
  "markdownlint-cli2": "^0.23.2",
107
- "oxfmt": "^0.67.0",
107
+ "oxfmt": "^0.68.0",
108
108
  "oxlint": "^1.82.0",
109
109
  "oxlint-tsgolint": "^7.0.2001",
110
110
  "react": "^19.3.0",
@@ -31,7 +31,7 @@ Core capabilities:
31
31
  - Session metadata/history inspection (`sessions show`, `sessions history`)
32
32
  - Passive replay and live observation (`sessions watch -s <name> --cursor <cursor>`; omit the cursor for retained history)
33
33
  - Local agent process checks via `status`
34
- - Stable ACP client methods for filesystem and terminal requests
34
+ - Stable ACP client methods for filesystem and terminal requests; filesystem paths preserve symlink/parent traversal order within the working directory
35
35
  - Stable ACP `authenticate` handshake via env/config credentials
36
36
  - Structured streaming output (`text`, `json`, `quiet`) with optional `--suppress-reads`
37
37
  - Prompt-response `_meta` preservation across direct, queued, compare, and embedded-runtime results
@@ -90,6 +90,7 @@ Friendly agent names resolve to commands:
90
90
  - `gemini` -> `gemini --acp`
91
91
  - `cursor` -> `cursor-agent acp`
92
92
  - `copilot` -> `copilot --acp --stdio`
93
+ - `antigravity` -> `agy_acp_server.par` (`--uid=` on Linux; `agy_acp_server.exe` on Windows). Install the official runtime/helper pair and configure its own sign-in first; see [Antigravity](https://github.com/openclaw/acpx/blob/main/agents/Antigravity.md). Fixed-choice interaction questions are cancelled, including with `--approve-all`, host permission callbacks, and existing custom launchers; acpx cannot supply user answers through permission approval.
93
94
  - `devin` -> `devin acp`
94
95
  - `droid` -> `droid exec --output-format acp` (`factory-droid` and `factorydroid` also resolve to `droid`)
95
96
  - `fast-agent` -> `uvx fast-agent-mcp acp`
@@ -121,7 +122,15 @@ Rules:
121
122
 
122
123
  When embedding ACPX, import `createAgentRegistry` from `acpx/agent-registry` and use `inspect(agentId)` to obtain installed launch facts without starting an agent. Treat `undefined` as uninspectable. Check the returned missing command/package requirements before acquiring a session; recheck when launching because installed files can change. Authentication and native model discovery belong to session acquisition.
123
124
 
124
- Use `getStatus({ handle }).models.availableModels` when present for native display names, and pass the selected opaque model ID unchanged to `setModel`. Use `prepareFreshSession({ handle })` to persist a fresh-session request across restart, then ensure without `resumeSessionId`. Ordinary `close` retains session continuity; explicit remote discard requires the adapter’s optional close capability.
125
+ Custom registry names such as `constructor` and `__proto__` work with resolution, listing, and inspection. Without an explicit registry entry, unknown names remain raw commands.
126
+
127
+ Use `getStatus({ handle }).models.availableModels` when present for native display names, and pass the selected opaque model ID, including any slashes, unchanged to `setModel`. Model changes validate against the connected session's advertised models, including after reconnect. `setConfigOption` applies the same validation when `key` names the advertised model option and returns that operation's native ACP response with the accepted `configOptions`. Use the response to update model and reasoning controls together. Embedded callers can identify unknown or ambiguous model failures with `isRequestedModelUnsupportedError(error)` and `error.reason === "unadvertised-model"`. When a Cursor alias matches multiple advertised variants, the error also has `ambiguous: true`; a selector with no advertised match omits that flag. Claude ACP retains its forwarding exception for selectors absent from its advertised list.
128
+
129
+ Use `prepareFreshSession({ handle })` to persist a fresh-session request across restart, then ensure without `resumeSessionId`. Ordinary `close` retains session continuity; explicit remote discard requires the adapter’s optional close capability.
130
+
131
+ Embedded controls save accepted settings with the current conversation. Turn finalization and one-shot cleanup wait for admitted controls, preserving final output, usage, and selections in the saved session. Ordinary `close` can return before active prompt cancellation finishes; the later save preserves its close/reset markers.
132
+
133
+ For persistent sessions, compatible `ensureSession` calls may reuse an active record, including from permission callbacks during control reconnects. Changing its working directory, adapter invocation, or resume identity while turns or controls remain unfinished rejects with `ACP_SESSION_INIT_FAILED`; await that work or use a different key. After an active close, await its turn result before reopening. Idle replacement retires the old owner before initializing the successor; other records and distinct one-shot sessions remain independent.
125
134
 
126
135
  For installed entrypoints and prerequisites, read the matching [agent guide](https://github.com/openclaw/acpx/tree/main/agents). For resolver callbacks, custom command overrides, and lifecycle details, read [embedded agent discovery](https://github.com/openclaw/acpx/blob/main/docs/session-control.md#embedded-agent-discovery).
127
136
 
@@ -205,7 +214,7 @@ Behavior:
205
214
  - `set`: calls ACP `session/set_config_option`.
206
215
  - Current codex-acp releases expose `model` and `reasoning_effort` as separate config options.
207
216
  - `--model <id>`: Claude-compatible adapters may consume session creation metadata; other agents must advertise a model config option or legacy `models` metadata.
208
- - `set model <id>`: uses `session/set_config_option` for advertised model config options and preserves `session/set_model` for explicitly advertised legacy models.
217
+ - `set model <id>`: validates against the connected session's advertised models, uses `session/set_config_option` for model config options, and preserves `session/set_model` for explicitly advertised legacy models. Claude Code still accepts or rejects selectors absent from its advertised list.
209
218
  - Model switches can change or remove reasoning-effort controls. ACPX reconciles saved non-mode selections with the accepted response; select a supported effort again if needed.
210
219
  - After reconnect, ACPX restores the saved model when advertised and replays saved config selections before prompting. A replay failure is reported instead of silently using defaults.
211
220
  - `set-mode`/`set` route through queue-owner IPC when active, otherwise reconnect directly.
@@ -283,20 +292,23 @@ Behavior:
283
292
  - `--format <fmt>`: output format (`text`, `json`, `quiet`)
284
293
  - `--json-strict`: strict JSON mode; requires `--format json` and suppresses non-JSON stderr output
285
294
  - `--suppress-reads`: suppress raw read-file contents while preserving the selected format
286
- - `--timeout <seconds>`: max wait time (positive number)
295
+ - `--timeout <seconds>`: response deadline (positive number); partial text is not completion. A final response during the bounded drain keeps its actual outcome. Queued prompts wait for cancellation and retirement of unfinished connections before reconnecting to the saved session; cleanup can extend elapsed time beyond the deadline.
287
296
  - `--ttl <seconds>`: queue owner idle TTL before shutdown (default `300`, `0` disables TTL)
288
297
  - `--model <id>`: request an agent model during session creation; non-Claude agents must advertise a model config option or legacy `models` metadata
289
298
  - `--system-prompt <text>`: replace the agent system prompt. Forwarded to claude-agent-acp via ACP `_meta.systemPrompt`; persisted in `session_options.system_prompt` so reuse keeps the override. Other agents ignore the field.
290
299
  - `--append-system-prompt <text>`: append text to the agent system prompt. Forwarded to claude-agent-acp via ACP `_meta.systemPrompt.append`; same persistence rules as `--system-prompt`.
291
300
  - `--allowed-tools <list>`: comma-separated tool whitelist (use `""` for no tools)
292
301
  - `--max-turns <count>`: cap session turn count
293
- - `--prompt-retries <count>`: retry failed prompt turns on transient errors (default `0`)
302
+ - `--prompt-retries <count>`: retry failed prompt turns on transient errors (default `0`); cancelling a queued turn stops remaining attempts, while already-received final responses keep their outcome
294
303
  - `--no-fs`: advertise both ACP filesystem capabilities as disabled so compatible agents use their native file operations
295
304
  - `--no-terminal`: do not advertise the ACP terminal capability — useful for review-only or sandboxed agent invocations
296
305
  - `--verbose`: verbose ACP/debug logs to stderr
297
306
 
298
- Cursor may advertise bracketed model ids such as `composer-2.5[fast=false]`. A bare Cursor
299
- model name is normalized only when exactly one advertised bracketed variant matches it.
307
+ Cursor may advertise bracketed model IDs such as `composer-2.5[fast=false]`. An exact
308
+ advertised ID always wins. Only Cursor accepts a bare model name through a unique
309
+ advertised bracketed variant; unknown or ambiguous names are rejected before the
310
+ model change. This rule uses the current connected catalog for `set model`, embedded
311
+ `setModel`, and model selections through `setConfigOption`, including after reconnect.
300
312
 
301
313
  Permission flags are mutually exclusive.
302
314
 
@@ -408,8 +420,10 @@ Queueing is per persistent session.
408
420
  - Other invocations submit prompts over local IPC.
409
421
  - On Unix-like systems, queue IPC uses a Unix socket under `~/.acpx/queues/<hash>.sock`.
410
422
  - Ownership is coordinated with a lock file under `~/.acpx/queues/<hash>.lock`.
423
+ - Persistent turns retain a separate filesystem guard through checkpoint and cleanup. Waiting can be cancelled; admitted ownership ends only after cleanup. Live guards never expire by age, and ambiguous guard state is preserved. See [session ownership](../../docs/sessions.md#queue-ownership).
411
424
  - On Windows, named pipes are used instead of Unix sockets.
412
425
  - after the queue drains, owner shutdown is governed by TTL (default 300s, configurable with `--ttl`).
426
+ - Session controls use the retained adapter while active or idle, and the owner saves accepted settings before success. Idle controls keep the owner alive; prompt completion and close drain admitted controls. Treat timed-out settings as uncertain and do not repeat them automatically. Older callers or retained owners keep their previous persistence behavior.
413
427
 
414
428
  Submission behavior:
415
429
 
@@ -447,6 +461,12 @@ acpx --format json codex exec 'review changed files' \
447
461
 
448
462
  If every permission request is denied/cancelled and none approved, `acpx` exits with permission-denied status.
449
463
 
464
+ Interactive tool, file-write, and terminal questions are serialized within each acpx process. Each question needs a separate answer; EOF denies active and waiting questions.
465
+
466
+ Pending permissions, file operations, and terminal creation retain their admitting prompt's lifetime. Cancelled, completed, timed-out, superseded, or closed prompts cannot gain new mutation/spawn authority from late answers. Individual ACP request cancellation stays local to that request. Already-dispatched OS work is not rolled back.
467
+
468
+ When a tool kind is absent, read/search approval is inferred only from complete leading action words. Filenames or substrings in other action titles do not grant approval; ambiguous titles still require the normal permission decision.
469
+
450
470
  Codex refusals prefer an offered non-cancelling one-time rejection. If safe refusal uses cancellation, acpx explains the possible turn termination in text output, quiet stderr, JSON response `_meta.acpx.permissionNotice`, and embedded status events. Permission denial never grants the requested operation. See [Codex](https://github.com/openclaw/acpx/blob/main/agents/Codex.md#permission-refusals).
451
471
 
452
472
  ## Flows (multi-agent workflows)
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-registry-DU6mhZBL.js","names":[],"sources":["../src/acp/client-process.ts","../src/spawn-command-options.ts","../src/agent-registry.ts"],"sourcesContent":["import { execFile, type ChildProcess, type ChildProcessByStdio } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { Readable, Writable } from \"node:stream\";\n\nexport const PROCESS_HELPER_TIMEOUT_MS = 8_000;\nexport const PROCESS_HELPER_MAX_BUFFER_BYTES = 32 * 1024 * 1024;\n\nexport async function runTimedExecFile(\n command: string,\n args: readonly string[],\n options: {\n timeoutMs?: number;\n maxBufferBytes?: number;\n windowsHide?: boolean;\n } = {},\n): Promise<string> {\n const timeoutMs = Math.max(1, Math.round(options.timeoutMs ?? PROCESS_HELPER_TIMEOUT_MS));\n return await new Promise<string>((resolve, reject) => {\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const child = execFile(\n command,\n [...args],\n {\n encoding: \"utf8\",\n maxBuffer: options.maxBufferBytes ?? PROCESS_HELPER_MAX_BUFFER_BYTES,\n killSignal: \"SIGKILL\",\n windowsHide: options.windowsHide,\n },\n (error, stdout) => {\n if (settled) {\n return;\n }\n settled = true;\n if (timer) {\n clearTimeout(timer);\n }\n if (error) {\n reject(error);\n return;\n }\n resolve(stdout);\n },\n );\n\n timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n const killed = child.kill(\"SIGKILL\");\n child.stdout?.destroy();\n child.stderr?.destroy();\n child.unref();\n reject(\n Object.assign(new Error(`${command} timed out after ${timeoutMs}ms`), {\n code: \"ETIMEDOUT\",\n killed,\n signal: \"SIGKILL\" as const,\n }),\n );\n }, timeoutMs);\n });\n}\n\nexport type CommandParts = {\n command: string;\n args: string[];\n};\n\nexport function normalizeAgentCommandInput(value: string | readonly string[]): {\n agentCommand: string;\n agentArgv?: string[];\n} {\n if (typeof value === \"string\") {\n return { agentCommand: value };\n }\n const parts = toCommandParts([...value]);\n const argv = [parts.command, ...parts.args];\n return {\n agentCommand: renderArgvIdentity(argv),\n agentArgv: argv,\n };\n}\n\nconst IDENTITY_SAFE_ARG_RE = /^[A-Za-z0-9_@%+=:,./^~-]+$/u;\n\nexport function renderArgvIdentity(argv: readonly string[]): string {\n return argv.map((arg) => (IDENTITY_SAFE_ARG_RE.test(arg) ? arg : JSON.stringify(arg))).join(\" \");\n}\n\ntype ResolveSessionCwdOptions = {\n platform?: NodeJS.Platform;\n existsSync?: (filePath: string) => boolean;\n runWslpath?: (cwd: string) => Promise<string>;\n};\n\nexport function isoNow(): string {\n return new Date().toISOString();\n}\n\nexport function waitForSpawn(child: ChildProcess): Promise<void> {\n return new Promise((resolve, reject) => {\n const onSpawn = () => {\n child.off(\"error\", onError);\n resolve();\n };\n const onError = (error: Error) => {\n child.off(\"spawn\", onSpawn);\n reject(error);\n };\n\n child.once(\"spawn\", onSpawn);\n child.once(\"error\", onError);\n });\n}\n\nexport function isChildProcessRunning(child: ChildProcess): boolean {\n return child.exitCode == null && child.signalCode == null;\n}\n\nexport function requireAgentStdio(\n child: ChildProcess,\n): ChildProcessByStdio<Writable, Readable, Readable> {\n if (!child.stdin || !child.stdout || !child.stderr) {\n throw new Error(\"ACP agent must be spawned with piped stdin/stdout/stderr\");\n }\n return child as ChildProcessByStdio<Writable, Readable, Readable>;\n}\n\nexport function waitForChildExit(\n child: ChildProcessByStdio<Writable, Readable, Readable>,\n timeoutMs: number,\n): Promise<boolean> {\n if (!isChildProcessRunning(child)) {\n return Promise.resolve(true);\n }\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n const timer = setTimeout(\n () => {\n finish(false);\n },\n Math.max(0, timeoutMs),\n );\n\n const finish = (value: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n child.off(\"close\", onExitLike);\n child.off(\"exit\", onExitLike);\n clearTimeout(timer);\n resolve(value);\n };\n\n const onExitLike = () => {\n finish(true);\n };\n\n child.once(\"close\", onExitLike);\n child.once(\"exit\", onExitLike);\n });\n}\n\nexport function resolveAgentCommandParts(\n value: string,\n argv: readonly string[] | undefined,\n platform: NodeJS.Platform = process.platform,\n): CommandParts {\n if (argv) {\n const parts = toCommandParts([...argv]);\n assertWindowsLaunchableCommand(parts.command, platform);\n return parts;\n }\n if (platform === \"win32\") {\n throw new Error(\n 'Raw agent command strings are not supported on Windows. Configure the agent with an argv array, for example: \"argv\": [\"agent.exe\", \"--acp\"]. Legacy agents.<name>.args arrays are migrated automatically. Existing sessions without saved argv must be closed and recreated.',\n );\n }\n return splitCommandLine(value);\n}\n\nfunction assertWindowsLaunchableCommand(command: string, platform: NodeJS.Platform): void {\n if (platform === \"win32\" && path.extname(command).toLowerCase() === \".sh\") {\n throw new Error(\n `Windows cannot launch shell script executable \"${command}\" directly. Configure an explicit interpreter argv, for example: \"argv\": [\"bash\", \"${command}\"]. acpx does not infer interpreters.`,\n );\n }\n}\n\ntype CommandLineState = {\n current: string;\n quote: \"'\" | '\"' | null;\n escaping: boolean;\n parts: string[];\n hasPart: boolean;\n};\n\nexport function splitCommandLine(value: string): CommandParts {\n const state: CommandLineState = {\n current: \"\",\n quote: null,\n escaping: false,\n parts: [],\n hasPart: false,\n };\n for (const ch of value) {\n readCommandLineChar(state, ch);\n }\n\n if (state.escaping) {\n state.current += \"\\\\\";\n state.hasPart = true;\n }\n if (state.quote) {\n throw new Error(\"Invalid --agent command: unterminated quote\");\n }\n flushCommandLinePart(state);\n return toCommandParts(state.parts);\n}\n\nfunction toCommandParts(parts: string[]): CommandParts {\n if (parts.length === 0 || parts[0] === \"\") {\n throw new Error(\"Invalid --agent command: empty command\");\n }\n return {\n command: parts[0],\n args: parts.slice(1),\n };\n}\n\nfunction readCommandLineChar(state: CommandLineState, ch: string): void {\n if (state.escaping) {\n state.current += ch;\n state.escaping = false;\n state.hasPart = true;\n } else if (ch === \"\\\\\" && state.quote !== \"'\") {\n state.escaping = true;\n } else if (state.quote) {\n if (ch === state.quote) {\n state.quote = null;\n } else {\n state.current += ch;\n }\n state.hasPart = true;\n } else {\n readUnquotedCommandLineChar(state, ch);\n }\n}\n\nfunction readUnquotedCommandLineChar(state: CommandLineState, ch: string): void {\n if (ch === \"'\" || ch === '\"') {\n state.quote = ch;\n state.hasPart = true;\n } else if (/\\s/.test(ch)) {\n flushCommandLinePart(state);\n } else {\n state.current += ch;\n state.hasPart = true;\n }\n}\n\nfunction flushCommandLinePart(state: CommandLineState): void {\n if (state.hasPart) {\n state.parts.push(state.current);\n state.current = \"\";\n state.hasPart = false;\n }\n}\n\nexport function asAbsoluteCwd(cwd: string): string {\n return path.resolve(cwd);\n}\n\nexport async function resolveAgentSessionCwd(\n cwd: string,\n agentCommand: string,\n options: ResolveSessionCwdOptions = {},\n): Promise<string> {\n const resolved = asAbsoluteCwd(cwd);\n if (!shouldTranslateWslWindowsCwd(agentCommand, options)) {\n return resolved;\n }\n\n const translated = (await (options.runWslpath ?? runWslpath)(resolved)).trim();\n if (!translated) {\n throw new Error(`wslpath returned an empty Windows path for cwd: ${resolved}`);\n }\n return translated;\n}\n\nfunction shouldTranslateWslWindowsCwd(\n agentCommand: string,\n options: ResolveSessionCwdOptions,\n): boolean {\n if (!isWsl(options)) {\n return false;\n }\n\n try {\n const { command } = splitCommandLine(agentCommand);\n return isWindowsExecutableCommand(command);\n } catch {\n return false;\n }\n}\n\nfunction isWsl(options: ResolveSessionCwdOptions): boolean {\n const platform = options.platform ?? process.platform;\n if (platform !== \"linux\") {\n return false;\n }\n\n const existsSync = options.existsSync ?? fs.existsSync;\n return existsSync(\"/proc/sys/fs/binfmt_misc/WSLInterop\");\n}\n\nconst WINDOWS_EXECUTABLE_EXTENSION_RE = /\\.(?:exe|cmd|bat)$/u;\n\nfunction isWindowsExecutableCommand(command: string): boolean {\n const normalized = command.toLowerCase();\n return WINDOWS_EXECUTABLE_EXTENSION_RE.test(normalized);\n}\n\nasync function runWslpath(cwd: string): Promise<string> {\n return await runTimedExecFile(\"wslpath\", [\"-w\", cwd]);\n}\n\nexport function basenameToken(value: string): string {\n return path\n .basename(value)\n .toLowerCase()\n .replace(/\\.(cmd|exe|bat)$/u, \"\");\n}\n","import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport function readWindowsEnvValue(env: NodeJS.ProcessEnv, key: string): string | undefined {\n const matchedKey = Object.keys(env).find((entry) => entry.toUpperCase() === key);\n return matchedKey ? env[matchedKey] : undefined;\n}\n\nfunction windowsExecutableExtensions(env: NodeJS.ProcessEnv): string[] {\n return (readWindowsEnvValue(env, \"PATHEXT\") ?? \".COM;.EXE;.BAT;.CMD\")\n .split(\";\")\n .map((value) => value.trim().toLowerCase())\n .filter((value) => value.length > 0);\n}\n\nfunction commandCandidates(command: string, env: NodeJS.ProcessEnv): string[] {\n const commandExtension = path.extname(command);\n if (commandExtension.length > 0) {\n return [command];\n }\n return windowsExecutableExtensions(env).map((extension) => `${command}${extension}`);\n}\n\nfunction commandHasPath(command: string): boolean {\n return command.includes(\"/\") || command.includes(\"\\\\\") || path.isAbsolute(command);\n}\n\nfunction resolveWindowsPathCommand(command: string, env: NodeJS.ProcessEnv): string | undefined {\n const candidates = commandCandidates(command, env);\n const pathValue = readWindowsEnvValue(env, \"PATH\");\n if (!pathValue) {\n return undefined;\n }\n\n for (const directory of pathValue.split(\";\")) {\n const resolved = findExistingCommandInDirectory(directory, candidates);\n if (resolved) {\n return resolved;\n }\n }\n\n return undefined;\n}\n\nfunction findExistingCommandInDirectory(\n directory: string,\n candidates: string[],\n): string | undefined {\n const trimmedDirectory = directory.trim();\n if (trimmedDirectory.length === 0) {\n return undefined;\n }\n\n return candidates\n .map((candidate) => path.join(trimmedDirectory, candidate))\n .find((resolved) => fs.existsSync(resolved));\n}\n\nfunction resolveWindowsWrapperToken(token: string, wrapperPath: string): string | undefined {\n const relative = token.match(/%~?dp0%?\\s*[\\\\/]*(.*)$/i)?.[1]?.trim();\n if (!relative) {\n return undefined;\n }\n const candidate = path.resolve(\n path.dirname(wrapperPath),\n relative.replace(/[\\\\/]+/g, path.sep).replace(/^[\\\\/]+/, \"\"),\n );\n return path.extname(candidate).toLowerCase() === \".exe\" && fs.existsSync(candidate)\n ? candidate\n : undefined;\n}\n\nfunction resolveWindowsWrapperExecutable(wrapperPath: string): string | undefined {\n if (!fs.existsSync(wrapperPath)) {\n return undefined;\n }\n\n try {\n const content = fs.readFileSync(wrapperPath, \"utf8\");\n return [...content.matchAll(/\"([^\"\\r\\n]*)\"/g)]\n .map((match) => resolveWindowsWrapperToken(match[1] ?? \"\", wrapperPath))\n .find((candidate): candidate is string => candidate !== undefined);\n } catch {\n // Ignore unreadable wrapper scripts and let callers use their fallback.\n return undefined;\n }\n}\n\nexport function resolveWindowsCommand(\n command: string,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const candidates = commandCandidates(command, env);\n\n if (commandHasPath(command)) {\n return candidates.find((candidate) => fs.existsSync(candidate));\n }\n\n return resolveWindowsPathCommand(command, env);\n}\n\n/**\n * Resolve a Windows command to a native executable suitable for direct spawn.\n *\n * Batch and PowerShell shims are intentionally rejected unless they point at a\n * real `.exe` entrypoint. Callers that need shell execution should use the\n * command-specific shell policy instead.\n */\nexport function resolveWindowsExecutablePath(\n command: string,\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const resolved = resolveWindowsCommand(command, env);\n if (!resolved) {\n return undefined;\n }\n\n const absolute = path.resolve(resolved);\n const extension = path.extname(absolute).toLowerCase();\n if (extension === \".exe\") {\n return absolute;\n }\n if (extension !== \".cmd\" && extension !== \".bat\" && extension !== \".ps1\") {\n return undefined;\n }\n\n const siblingExecutable = `${absolute.slice(0, -extension.length)}.exe`;\n return fs.existsSync(siblingExecutable)\n ? siblingExecutable\n : resolveWindowsWrapperExecutable(absolute);\n}\n\nfunction shouldUseWindowsBatchShell(\n command: string,\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n if (platform !== \"win32\") {\n return false;\n }\n const resolvedCommand = resolveWindowsCommand(command, env) ?? command;\n const ext = path.extname(resolvedCommand).toLowerCase();\n return ext === \".cmd\" || ext === \".bat\";\n}\n\nexport type AgentSpawnCommand = {\n command: string;\n args: string[];\n windowsVerbatimArguments?: boolean;\n};\n\nconst CMD_META_CHAR_RE = /([()\\][%!^\"`<>&|;, *?])/gu;\nconst CMD_BACKSLASH_QUOTE_RE = /(?=(\\\\+?)?)\\1\"/gu;\nconst CMD_TRAILING_BACKSLASH_RE = /(?=(\\\\+?)?)\\1$/gu;\nconst CMD_SHIM_RE = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/iu;\n\nfunction escapeCmdCommand(value: string): string {\n return value.replace(CMD_META_CHAR_RE, \"^$1\");\n}\n\nfunction escapeCmdArgument(value: string, doubleEscapeMeta: boolean): string {\n const quoted = `\"${value\n .replace(CMD_BACKSLASH_QUOTE_RE, '$1$1\\\\\"')\n .replace(CMD_TRAILING_BACKSLASH_RE, \"$1$1\")}\"`;\n const escaped = quoted.replace(CMD_META_CHAR_RE, \"^$1\");\n return doubleEscapeMeta ? escaped.replace(CMD_META_CHAR_RE, \"^$1\") : escaped;\n}\n\nexport function buildAgentSpawnCommand(\n command: string,\n args: readonly string[],\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): AgentSpawnCommand {\n if (!shouldUseWindowsBatchShell(command, platform, env)) {\n return { command, args: [...args] };\n }\n const resolvedCommand = path.win32.normalize(resolveWindowsCommand(command, env) ?? command);\n const doubleEscapeMeta = CMD_SHIM_RE.test(resolvedCommand);\n const shellCommand = [\n escapeCmdCommand(resolvedCommand),\n ...args.map((arg) => escapeCmdArgument(arg, doubleEscapeMeta)),\n ].join(\" \");\n return {\n command: readWindowsEnvValue(env, \"COMSPEC\") ?? \"cmd.exe\",\n args: [\"/d\", \"/s\", \"/c\", `\"${shellCommand}\"`],\n windowsVerbatimArguments: true,\n };\n}\n\nexport function buildSpawnCommandOptions(\n command: string,\n options: Parameters<typeof spawn>[2],\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): Parameters<typeof spawn>[2] {\n if (!shouldUseWindowsBatchShell(command, platform, env)) {\n return options;\n }\n return {\n ...options,\n shell: true,\n };\n}\n\nexport type TerminalSpawnCommand = {\n command: string;\n args: string[];\n killProcessGroup: boolean;\n};\n\nexport function buildTerminalSpawnCommand(\n command: string,\n args: string[] | undefined,\n): TerminalSpawnCommand {\n return { command, args: args ?? [], killProcessGroup: false };\n}\n\nexport function buildTerminalShellSpawnCommand(\n command: string,\n platform: NodeJS.Platform = process.platform,\n): TerminalSpawnCommand {\n if (platform === \"win32\") {\n return { command: \"cmd.exe\", args: [\"/d\", \"/s\", \"/c\", command], killProcessGroup: true };\n }\n return { command: \"/bin/sh\", args: [\"-c\", command], killProcessGroup: true };\n}\n\n/** Finds an installed entrypoint without executing it. */\nexport function resolveInstalledExecutable(command: string): string | undefined {\n if (process.platform === \"win32\") {\n const resolved = resolveWindowsCommand(command);\n return resolved && fs.statSync(resolved, { throwIfNoEntry: false })?.isFile()\n ? path.resolve(resolved)\n : undefined;\n }\n const candidates = command.includes(\"/\")\n ? [path.resolve(command)]\n : (process.env.PATH ?? \"\")\n .split(path.delimiter)\n .map((directory) => path.resolve(directory, command));\n return candidates.find((candidate) => {\n try {\n fs.accessSync(candidate, fs.constants.X_OK);\n return fs.statSync(candidate).isFile();\n } catch {\n return false;\n }\n });\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { splitCommandLine } from \"./acp/client-process.js\";\nimport { resolveInstalledExecutable } from \"./spawn-command-options.js\";\n\nconst ACP_ADAPTER_PACKAGE_RANGES = {\n pi: \"^0.0.33\",\n codex: \"^1.1.5\",\n claude: \"^0.76.0\",\n mux: \"^0.28.0\",\n} as const;\n\ntype BuiltInAgentPackageSpec = {\n packageName: string;\n packageRange: string;\n preferredBinName: string;\n fallbackCommand: string;\n legacyFallbackCommands?: string[];\n};\n\ntype BuiltInAgentLaunch = {\n source: \"installed\" | \"package-exec\";\n command: string;\n args: string[];\n packageName: string;\n packageRange: string;\n packageVersion?: string;\n binPath?: string;\n npmCliPath?: string;\n};\n\ntype BuiltInLaunchResolverOptions = {\n existsSync?: (path: string) => boolean;\n readFileSync?: typeof fs.readFileSync;\n resolvePackageRoot?: (packageName: string) => string | undefined;\n execPath?: string;\n resolveNpmCliPath?: (execPath: string) => string;\n};\n\ntype AgentDefinition = {\n name: string;\n argv: string[];\n installedArgv?: string[];\n requiredCommands?: string[];\n package?: Omit<BuiltInAgentPackageSpec, \"fallbackCommand\">;\n packageExecFallback?: boolean;\n};\n\nconst AGENT_DEFINITIONS: Record<string, AgentDefinition> = {\n pi: {\n name: \"Pi\",\n argv: [\"npx\", `pi-acp@${ACP_ADAPTER_PACKAGE_RANGES.pi}`],\n installedArgv: [\"pi-acp\"],\n requiredCommands: [\"pi\"],\n package: {\n packageName: \"pi-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.pi,\n preferredBinName: \"pi-acp\",\n },\n },\n openclaw: { name: \"OpenClaw\", argv: [\"openclaw\", \"acp\"] },\n codex: {\n name: \"Codex\",\n argv: [\"npx\", \"-y\", `@agentclientprotocol/codex-acp@${ACP_ADAPTER_PACKAGE_RANGES.codex}`],\n installedArgv: [\"codex-acp\"],\n package: {\n packageName: \"@agentclientprotocol/codex-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.codex,\n preferredBinName: \"codex-acp\",\n legacyFallbackCommands: [],\n },\n packageExecFallback: true,\n },\n claude: {\n name: \"Claude Code\",\n argv: [\n \"npx\",\n \"-y\",\n `@agentclientprotocol/claude-agent-acp@${ACP_ADAPTER_PACKAGE_RANGES.claude}`,\n ],\n installedArgv: [\"claude-agent-acp\"],\n package: {\n packageName: \"@agentclientprotocol/claude-agent-acp\",\n packageRange: ACP_ADAPTER_PACKAGE_RANGES.claude,\n preferredBinName: \"claude-agent-acp\",\n legacyFallbackCommands: [\n `npm exec @agentclientprotocol/claude-agent-acp@${ACP_ADAPTER_PACKAGE_RANGES.claude}`,\n ],\n },\n packageExecFallback: true,\n },\n gemini: { name: \"Gemini CLI\", argv: [\"gemini\", \"--acp\"] },\n cursor: { name: \"Cursor\", argv: [\"cursor-agent\", \"acp\"] },\n copilot: { name: \"GitHub Copilot\", argv: [\"copilot\", \"--acp\", \"--stdio\"] },\n devin: { name: \"Devin\", argv: [\"devin\", \"acp\"] },\n droid: { name: \"Factory Droid\", argv: [\"droid\", \"exec\", \"--output-format\", \"acp\"] },\n \"fast-agent\": { name: \"Fast Agent\", argv: [\"uvx\", \"fast-agent-mcp\", \"acp\"] },\n fx: { name: \"fx\", argv: [\"fx\", \"acp\"] },\n \"grok-build\": { name: \"Grok Build\", argv: [\"grok\", \"agent\", \"stdio\"] },\n iflow: { name: \"iFlow\", argv: [\"iflow\", \"--experimental-acp\"] },\n junie: { name: \"Junie\", argv: [\"junie\", \"--acp=true\"] },\n kilocode: {\n name: \"Kilo Code\",\n argv: [\"npx\", \"-y\", \"@kilocode/cli\", \"acp\"],\n installedArgv: [\"kilo\", \"acp\"],\n },\n kimi: { name: \"Kimi Code\", argv: [\"kimi\", \"acp\"] },\n kiro: { name: \"Kiro\", argv: [\"kiro-cli-chat\", \"acp\"] },\n mcode: { name: \"MCode\", argv: [\"mcode\", \"acp\"] },\n mux: { name: \"Mux\", argv: [\"npx\", \"-y\", `mux@${ACP_ADAPTER_PACKAGE_RANGES.mux}`, \"acp\"] },\n opencode: {\n name: \"OpenCode\",\n argv: [\"npx\", \"-y\", \"opencode-ai\", \"acp\"],\n installedArgv: [\"opencode\", \"acp\"],\n },\n pool: { name: \"Poolside\", argv: [\"pool\", \"acp\"] },\n qoder: { name: \"Qoder\", argv: [\"qodercli\", \"--acp\"] },\n qwen: { name: \"Qwen Code\", argv: [\"qwen\", \"--acp\"] },\n trae: { name: \"Trae\", argv: [\"traecli\", \"acp\", \"serve\"] },\n zeroclaw: { name: \"ZeroClaw\", argv: [\"zeroclaw\", \"acp\"] },\n};\n\nexport const AGENT_ARGV_REGISTRY: Record<string, string[]> = Object.fromEntries(\n Object.entries(AGENT_DEFINITIONS).map(([id, definition]) => [id, [...definition.argv]]),\n);\nexport const AGENT_REGISTRY: Record<string, string> = Object.fromEntries(\n Object.entries(AGENT_DEFINITIONS).map(([id, definition]) => [id, definition.argv.join(\" \")]),\n);\nexport const BUILT_IN_AGENT_PACKAGES: Record<string, BuiltInAgentPackageSpec> = Object.fromEntries(\n Object.entries(AGENT_DEFINITIONS).flatMap(([id, definition]) =>\n definition.packageExecFallback && definition.package\n ? [[id, { ...definition.package, fallbackCommand: definition.argv.join(\" \") }]]\n : [],\n ),\n);\n\nexport type AcpAgentInspection = {\n id: string;\n name: string;\n launch:\n | { kind: \"installed\"; argv: string[] }\n | { kind: \"missing\"; requirements: Array<{ kind: \"command\" | \"package\"; name: string }> };\n};\n\nexport type AcpAgentInspectionOptions = {\n resolveExecutable?: (command: string) => string | undefined;\n resolvePackageRoot?: (packageName: string) => string | undefined;\n};\n\nfunction isPackageExecution(argv: string[]): boolean {\n const command = path.win32\n .basename(argv[0])\n .toLowerCase()\n .replace(/\\.(cmd|exe|bat)$/, \"\");\n if ([\"npx\", \"uvx\", \"npm\", \"pnpm\", \"bunx\"].includes(command)) {\n return true;\n }\n switch (command) {\n case \"bun\":\n return argv[1] === \"x\";\n case \"uv\":\n return argv[1] === \"tool\" && argv[2] === \"run\";\n case \"node\":\n return /(?:npm|npx)-cli\\.js$/u.test(argv[1] ?? \"\");\n default:\n return false;\n }\n}\n\nfunction inspectionDefinition(\n id: string,\n override: string | string[] | undefined,\n): AgentDefinition | undefined {\n const definition = Object.hasOwn(AGENT_DEFINITIONS, id) ? AGENT_DEFINITIONS[id] : undefined;\n if (!override) {\n return definition;\n }\n let argv = override;\n if (typeof argv === \"string\") {\n const parsed = splitCommandLine(argv);\n argv = [parsed.command, ...parsed.args];\n }\n return { name: definition?.name ?? id, argv };\n}\n\nfunction inspectAgent(\n agentId: string,\n override: string | string[] | undefined,\n options: AcpAgentInspectionOptions = {},\n): AcpAgentInspection | undefined {\n const id = resolveCanonicalAgentName(agentId);\n const definition = inspectionDefinition(id, override);\n if (!definition) {\n return undefined;\n }\n const argv = definition.installedArgv ?? definition.argv;\n if (isPackageExecution(argv)) {\n return undefined;\n }\n const spec = definition.package\n ? { ...definition.package, fallbackCommand: definition.argv.join(\" \") }\n : undefined;\n const launch = inspectLaunch(argv, spec, options);\n return {\n id,\n name: definition.name,\n launch: inspectPrerequisites(launch, definition.requiredCommands ?? [], options),\n };\n}\n\nfunction inspectPrerequisites(\n launch: AcpAgentInspection[\"launch\"],\n requiredCommands: string[],\n options: AcpAgentInspectionOptions,\n): AcpAgentInspection[\"launch\"] {\n const resolveExecutable = options.resolveExecutable ?? resolveInstalledExecutable;\n const missingCommands = requiredCommands\n .filter((command) => !resolveExecutable(command))\n .map((name) => ({ kind: \"command\" as const, name }));\n if (missingCommands.length === 0) {\n return launch;\n }\n return {\n kind: \"missing\",\n requirements: [...(launch.kind === \"missing\" ? launch.requirements : []), ...missingCommands],\n };\n}\n\nfunction inspectLaunch(\n argv: string[],\n spec: BuiltInAgentPackageSpec | undefined,\n options: AcpAgentInspectionOptions,\n): AcpAgentInspection[\"launch\"] {\n const command = (options.resolveExecutable ?? resolveInstalledExecutable)(argv[0]);\n if (command) {\n return { kind: \"installed\", argv: [command, ...argv.slice(1)] };\n }\n if (!spec) {\n return { kind: \"missing\", requirements: [{ kind: \"command\", name: argv[0] }] };\n }\n const installed = resolveInstalledBuiltInAgentLaunchForSpec(spec, options);\n return installed\n ? { kind: \"installed\", argv: [installed.command, ...installed.args] }\n : { kind: \"missing\", requirements: [{ kind: \"package\", name: spec.packageName }] };\n}\n\nconst AGENT_ALIASES: Record<string, string> = {\n \"factory-droid\": \"droid\",\n factorydroid: \"droid\",\n};\n\nexport const DEFAULT_AGENT_NAME = \"codex\";\n\nexport function normalizeAgentName(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport function resolveCanonicalAgentName(value: string): string {\n const normalized = normalizeAgentName(value);\n return Object.hasOwn(AGENT_ALIASES, normalized) ? AGENT_ALIASES[normalized] : normalized;\n}\n\nexport function mergeAgentRegistry(overrides?: Record<string, string>): Record<string, string> {\n if (!overrides) {\n return { ...AGENT_REGISTRY };\n }\n\n const merged = { ...AGENT_REGISTRY };\n for (const [name, command] of Object.entries(overrides)) {\n const normalized = normalizeAgentName(name);\n if (!normalized || !command.trim()) {\n continue;\n }\n merged[normalized] = command.trim();\n }\n return merged;\n}\n\nexport function resolveAgentCommand(agentName: string, overrides?: Record<string, string>): string {\n const normalized = normalizeAgentName(agentName);\n const registry = mergeAgentRegistry(overrides);\n return registry[normalized] ?? registry[AGENT_ALIASES[normalized] ?? normalized] ?? agentName;\n}\n\nexport function resolveAgentArgv(agentName: string): string[] | undefined {\n const normalized = normalizeAgentName(agentName);\n const argv =\n AGENT_ARGV_REGISTRY[normalized] ?? AGENT_ARGV_REGISTRY[resolveCanonicalAgentName(agentName)];\n return argv ? [...argv] : undefined;\n}\n\nexport function findBuiltInAgentPackage(agentCommand: string): BuiltInAgentPackageSpec | undefined {\n const normalized = agentCommand.trim();\n const builtInAgentPackages = Object.values(BUILT_IN_AGENT_PACKAGES);\n return builtInAgentPackages.find(\n (spec) =>\n spec.fallbackCommand === normalized || spec.legacyFallbackCommands?.includes(normalized),\n );\n}\n\nfunction defaultResolvePackageRoot(packageName: string): string {\n const segments = packageName.split(\"/\");\n let cursor = path.dirname(fileURLToPath(import.meta.url));\n\n while (true) {\n const candidateRoot = path.join(cursor, \"node_modules\", ...segments);\n const manifestPath = path.join(candidateRoot, \"package.json\");\n if (fs.existsSync(manifestPath)) {\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as {\n name?: string;\n };\n if (parsed.name === packageName) {\n return candidateRoot;\n }\n } catch {\n // best effort; keep walking upward\n }\n }\n\n const parent = path.dirname(cursor);\n if (parent === cursor) {\n throw new Error(`Built-in agent package not found: ${packageName}`);\n }\n cursor = parent;\n }\n}\n\nfunction resolvePackageBin(\n spec: BuiltInAgentPackageSpec,\n manifest: {\n bin?: string | Record<string, string>;\n },\n): string | undefined {\n if (typeof manifest.bin === \"string\") {\n return manifest.bin;\n }\n if (!manifest.bin || typeof manifest.bin !== \"object\") {\n return undefined;\n }\n return (\n manifest.bin[spec.preferredBinName] ??\n (Object.keys(manifest.bin).length === 1 ? Object.values(manifest.bin)[0] : undefined)\n );\n}\n\nfunction defaultResolveNpmCliPath(execPath: string): string {\n const candidate = path.resolve(\n path.dirname(execPath),\n \"..\",\n \"lib\",\n \"node_modules\",\n \"npm\",\n \"bin\",\n \"npm-cli.js\",\n );\n if (!fs.existsSync(candidate)) {\n throw new Error(`npm CLI not found for execPath: ${execPath}`);\n }\n return candidate;\n}\n\nexport function resolveInstalledBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n const spec = findBuiltInAgentPackage(agentCommand);\n if (!spec) {\n return undefined;\n }\n\n return resolveInstalledBuiltInAgentLaunchForSpec(spec, options);\n}\n\nfunction resolveInstalledBuiltInAgentLaunchForSpec(\n spec: BuiltInAgentPackageSpec,\n options: BuiltInLaunchResolverOptions,\n): BuiltInAgentLaunch | undefined {\n const readFileSync = options.readFileSync ?? fs.readFileSync;\n const existsSync = options.existsSync ?? fs.existsSync;\n const resolvePackageRoot = options.resolvePackageRoot ?? defaultResolvePackageRoot;\n\n try {\n const resolved = resolveInstalledBuiltInAgentPackage(spec, {\n readFileSync,\n existsSync,\n resolvePackageRoot,\n });\n if (!resolved) {\n return undefined;\n }\n\n return {\n source: \"installed\",\n command: process.execPath,\n args: [resolved.binPath],\n packageName: spec.packageName,\n packageRange: spec.packageRange,\n packageVersion: resolved.packageVersion,\n binPath: resolved.binPath,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction resolveInstalledBuiltInAgentPackage(\n spec: BuiltInAgentPackageSpec,\n options: Required<\n Pick<BuiltInLaunchResolverOptions, \"readFileSync\" | \"existsSync\" | \"resolvePackageRoot\">\n >,\n): { packageVersion?: string; binPath: string } | undefined {\n const packageRoot = options.resolvePackageRoot(spec.packageName);\n if (!packageRoot) {\n return undefined;\n }\n const manifest = JSON.parse(\n options.readFileSync(path.join(packageRoot, \"package.json\"), \"utf8\"),\n ) as {\n name?: string;\n version?: string;\n bin?: string | Record<string, string>;\n };\n if (manifest.name !== spec.packageName) {\n return undefined;\n }\n\n const relativeBinPath = resolvePackageBin(spec, manifest);\n if (!relativeBinPath) {\n return undefined;\n }\n\n const binPath = path.resolve(packageRoot, relativeBinPath);\n return options.existsSync(binPath) ? { packageVersion: manifest.version, binPath } : undefined;\n}\n\nexport function resolvePackageExecBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n const spec = findBuiltInAgentPackage(agentCommand);\n if (!spec) {\n return undefined;\n }\n\n const existsSync = options.existsSync ?? fs.existsSync;\n const execPath = options.execPath ?? process.execPath;\n const resolveNpmCliPath = options.resolveNpmCliPath ?? defaultResolveNpmCliPath;\n\n try {\n const npmCliPath = resolveNpmCliPath(execPath);\n if (!existsSync(npmCliPath)) {\n return undefined;\n }\n\n return {\n source: \"package-exec\",\n command: execPath,\n args: [\n npmCliPath,\n \"exec\",\n \"--yes\",\n `--package=${spec.packageName}@${spec.packageRange}`,\n \"--\",\n spec.preferredBinName,\n ],\n packageName: spec.packageName,\n packageRange: spec.packageRange,\n npmCliPath,\n };\n } catch {\n return undefined;\n }\n}\n\nexport function resolveBuiltInAgentLaunch(\n agentCommand: string,\n options: BuiltInLaunchResolverOptions = {},\n): BuiltInAgentLaunch | undefined {\n return (\n resolveInstalledBuiltInAgentLaunch(agentCommand, options) ??\n resolvePackageExecBuiltInAgentLaunch(agentCommand, options)\n );\n}\n\nexport function listBuiltInAgents(overrides?: Record<string, unknown>): string[] {\n return [...new Set([...Object.keys(AGENT_REGISTRY), ...Object.keys(overrides ?? {})])];\n}\n\nexport interface AcpAgentRegistry {\n resolve(agentName: string): string | string[];\n list(): string[];\n}\n\nexport type AcpInspectableAgentRegistry = AcpAgentRegistry & {\n inspect(agentId: string): AcpAgentInspection | undefined;\n};\n\nexport function createAgentRegistry(\n params?: {\n overrides?: Record<string, string | string[]>;\n } & AcpAgentInspectionOptions,\n): AcpInspectableAgentRegistry {\n const overrides = normalizeRegistryOverrides(params?.overrides);\n return {\n resolve(agentName: string) {\n const normalizedAgentName = normalizeAgentName(agentName);\n const override =\n overrides[normalizedAgentName] ?? overrides[resolveCanonicalAgentName(agentName)];\n return override ?? resolveAgentArgv(agentName) ?? resolveAgentCommand(agentName);\n },\n list() {\n return listBuiltInAgents(overrides);\n },\n inspect(agentId) {\n const normalized = normalizeAgentName(agentId);\n const canonical = resolveCanonicalAgentName(agentId);\n const override = Object.hasOwn(overrides, normalized)\n ? overrides[normalized]\n : Object.hasOwn(overrides, canonical)\n ? overrides[canonical]\n : undefined;\n return inspectAgent(agentId, override, params);\n },\n };\n}\n\nfunction normalizeRegistryOverrides(\n values: Record<string, string | string[]> | undefined,\n): Record<string, string | string[]> {\n const normalized: Record<string, string | string[]> = {};\n for (const [name, value] of Object.entries(values ?? {})) {\n const normalizedName = normalizeAgentName(name);\n if (!normalizedName) {\n continue;\n }\n const normalizedValue = normalizeRegistryOverride(value);\n if (normalizedValue) {\n normalized[normalizedName] = normalizedValue;\n }\n }\n return normalized;\n}\n\nfunction normalizeRegistryOverride(value: string | string[]): string | string[] | undefined {\n if (typeof value === \"string\") {\n return value.trim() || undefined;\n }\n return value.length > 0 && value[0]?.length ? [...value] : undefined;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-C6NUFqr-.d.ts","names":[],"sources":["../src/async-control.ts","../src/acp/model-support.ts","../src/acp/client.ts"],"mappings":";;;KAcY;EACV,SAAS;EACT;;;;KCbU;EACV;EACA;EACA,iBAAiB;IACf;IACA;;;cAaS;KAED,4CAA4C;cAE3C;KAKD,0CAA0C;cAEzC,uCAAuC;WACzC;WACA,QAAQ;EAEL,YAAA,iBAAiB,QAAQ;;iBAgBvB,iCACd,iBACC,SAAS;;;KC0JP;EACH;EACA;EACA;;KAGU;EACV;EACA;EACA,gBAAgB;EAChB,SAAS;EACT;EACA;;KAGU;EACV;EACA,gBAAgB;EAChB,SAAS;EACT;EACA;;KAGU,sBAAsB;KA8B7B;KA8EA,uBAAuB,KAAK,iCAC/B,QAAQ,KAAK;KAEH;EACV;EACA,QAAQ,OAAO;EACf;EACA,QAAQ;EACR;;KAGU;EACV;EACA;EACA;EACA,WAAW;;cA0CA;UACH;UACA;UACA;mBACS;mBACA;UACT;UACA;UACA;mBAQS;mBAMA;mBACA;UACT;UACA;UACA;UACA;UACA;UACA;mBACS;mBACA;mBACA;UACT;UACA;UACA;UACA;mBACS;mBACA;mBACA;mBACA;EAEL,YAAA,SAAS;MAmCjB,oBAAoB;EAIxB;EAIA,sBAAsB;EAItB,6BAA6B;EAW7B;EAIA;EAIA;EAIA;EAIA,iBACE,UAAU,KACR;EAWJ;EAIA,qBAAqB;IACnB,iBAAiB;IACjB,4BAA4B;IAC5B,mBAAmB;IACnB;IACA;IACA;IACA;;UAuBM;UASA;EAcR,mBAAmB;EASnB,gBAAgB;EAUhB;EAIA,qBAAqB;EASf,SAAS;UA6ED;UA6BN;UAiBM;UAcA;UAsDA;UAmBN;UAuDM;UAuBA;UAwBA;UA4BN;EAeF,cAAc,eAAyB,QAAQ;EA+C/C,YAAY,mBAAmB,eAAyB,QAAQ;EAKhE,uBACJ,mBACA,cACA,UAAS,qBACR,QAAQ;EAiCL,cAAc,mBAAmB,eAAyB,QAAQ;UAkBhE;UAWA;EAKF,OACJ,mBACA,QAAQ,sBACR,yBAAyB,sBACzB,gBAAgB,uBAChB,sBAAsB,uBACrB,QAAQ;UA4CH;UAmBA;UAaA;UAcA;UAuBA;UAYA;UAQA;EAOF,eACJ,mBACA,gBACA,YAAY,sBACX;EAaG,uBACJ,mBACA,kBACA,eACA,YAAY,sBACX,QAAQ;EAmBL,gBACJ,mBACA,iBACA,kBAAkB,sBAClB,YAAY,sBACX,QAAQ;UAyBG;UAqBA;UAqBN;UAoBA;UAgBA;UAeA;EAOF,OAAO,oBAAoB;EA0B3B,aAAa,oBAAoB;EAkBjC,aAAa,SAAQ,sBAA2B,QAAQ;EAOxD,6BAA6B;EAS7B,mBAAmB,kBAAiB,QAAQ;EAyC5C,SAAS;UAiDP;UAIA;UAIM;UAON;UAWM;UAgCN;UAYM;UAyBN;UAkBA;UAOA;UAOA;UAcA;UASA;UAqEM;UA0BN;UA2CA;UAQA;UAUA;UAcM;UA6BA;UAqBA;UAgCN;UAuBA;UAqBA;UAIA;UAwBM;UA6BN;UAsBA;UAmBM;UAiBN;UAqBA;UAQA;UAYA;UA+BA;UAmBA;UAyBA;UAKA;UAwBA;UASA;UAUM;UAqDN;UAYM;UAeA;UASA;UAWN;UASA;UAMA;UAaA;UAWM;UAkBA;EAgCR,0BAA0B;IAC9B;IACA;MACE"}