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.
- package/dist/{agent-registry-DU6mhZBL.js → agent-registry-DdKB-zia.js} +20 -17
- package/dist/agent-registry-DdKB-zia.js.map +1 -0
- package/dist/agent-registry.d.ts.map +1 -1
- package/dist/agent-registry.js +1 -1
- package/dist/{cli-CiyfEC7L.js → cli-8mVHeUXh.js} +5 -5
- package/dist/{cli-CiyfEC7L.js.map → cli-8mVHeUXh.js.map} +1 -1
- package/dist/cli.js +122 -94
- package/dist/cli.js.map +1 -1
- package/dist/{client-C6NUFqr-.d.ts → client-DeNKZZcu.d.ts} +19 -13
- package/dist/client-DeNKZZcu.d.ts.map +1 -0
- package/dist/{flows-CTOdIk-m.js → flows-WOQNzCMC.js} +5 -5
- package/dist/{flows-CTOdIk-m.js.map → flows-WOQNzCMC.js.map} +1 -1
- package/dist/flows.d.ts +1 -1
- package/dist/flows.js +1 -1
- package/dist/{invocation-options-DbCcOAzM.js → invocation-options-B6d7TI-y.js} +7 -6
- package/dist/{invocation-options-DbCcOAzM.js.map → invocation-options-B6d7TI-y.js.map} +1 -1
- package/dist/{ipc-D3akHMEq.js → ipc-BJrvfNXr.js} +307 -90
- package/dist/ipc-BJrvfNXr.js.map +1 -0
- package/dist/{output-BPPjvJTI.js → output-CL18YmsG.js} +9 -6
- package/dist/output-CL18YmsG.js.map +1 -0
- package/dist/{queue-owner-runtime--IbbndGz.js → queue-owner-runtime-Cr0dWJuL.js} +1008 -463
- package/dist/queue-owner-runtime-Cr0dWJuL.js.map +1 -0
- package/dist/runtime.d.ts +129 -39
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +378 -176
- package/dist/runtime.js.map +1 -1
- package/dist/{session-watch--UX5dh00.js → session-watch-B8Q_TsGf.js} +4 -4
- package/dist/{session-watch--UX5dh00.js.map → session-watch-B8Q_TsGf.js.map} +1 -1
- package/dist/{watch-BbBxO-kb.js → watch-Dp73ph8h.js} +2 -2
- package/dist/{watch-BbBxO-kb.js.map → watch-Dp73ph8h.js.map} +1 -1
- package/package.json +3 -3
- package/skills/acpx/SKILL.md +27 -7
- package/dist/agent-registry-DU6mhZBL.js.map +0 -1
- package/dist/client-C6NUFqr-.d.ts.map +0 -1
- package/dist/ipc-D3akHMEq.js.map +0 -1
- package/dist/output-BPPjvJTI.js.map +0 -1
- package/dist/queue-owner-runtime--IbbndGz.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as JsonMessageSanitizer, t as createOutputFormatter } from "./output-
|
|
2
|
-
import {
|
|
3
|
-
import { t as watchSession } from "./watch-
|
|
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
|
|
76
|
+
//# sourceMappingURL=session-watch-B8Q_TsGf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-watch
|
|
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 {
|
|
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-
|
|
32
|
+
//# sourceMappingURL=watch-Dp73ph8h.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch-
|
|
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.
|
|
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.
|
|
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.
|
|
107
|
+
"oxfmt": "^0.68.0",
|
|
108
108
|
"oxlint": "^1.82.0",
|
|
109
109
|
"oxlint-tsgolint": "^7.0.2001",
|
|
110
110
|
"react": "^19.3.0",
|
package/skills/acpx/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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>`:
|
|
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
|
|
299
|
-
|
|
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"}
|