acpx 0.7.0 → 0.9.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 (50) hide show
  1. package/README.md +14 -6
  2. package/dist/{cli-T-Z-9x6a.js → cli-Bf3yjqzE.js} +35 -10
  3. package/dist/cli-Bf3yjqzE.js.map +1 -0
  4. package/dist/cli.d.ts +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +724 -241
  7. package/dist/cli.js.map +1 -1
  8. package/dist/{client-COPilhO_.d.ts → client-BssohYqM.d.ts} +35 -4
  9. package/dist/client-BssohYqM.d.ts.map +1 -0
  10. package/dist/flags-C-rwARqg.js +260 -0
  11. package/dist/flags-C-rwARqg.js.map +1 -0
  12. package/dist/{flows-CF8w1rPI.js → flows-WLs26_5Y.js} +405 -337
  13. package/dist/flows-WLs26_5Y.js.map +1 -0
  14. package/dist/flows.d.ts +23 -2
  15. package/dist/flows.d.ts.map +1 -1
  16. package/dist/flows.js +1 -1
  17. package/dist/{prompt-turn-CVPMWdj1.js → live-checkpoint-D5d-K9s1.js} +2487 -609
  18. package/dist/live-checkpoint-D5d-K9s1.js.map +1 -0
  19. package/dist/output-DPg20dvn.js +4146 -0
  20. package/dist/output-DPg20dvn.js.map +1 -0
  21. package/dist/runtime.d.ts +56 -4
  22. package/dist/runtime.d.ts.map +1 -1
  23. package/dist/runtime.js +676 -393
  24. package/dist/runtime.js.map +1 -1
  25. package/dist/{types-CVBeQyi3.d.ts → session-options-CFudjdkU.d.ts} +62 -3
  26. package/dist/session-options-CFudjdkU.d.ts.map +1 -0
  27. package/package.json +30 -25
  28. package/skills/acpx/SKILL.md +211 -13
  29. package/dist/cli-T-Z-9x6a.js.map +0 -1
  30. package/dist/client-COPilhO_.d.ts.map +0 -1
  31. package/dist/flags-Dj-IXgo9.js +0 -163
  32. package/dist/flags-Dj-IXgo9.js.map +0 -1
  33. package/dist/flows-CF8w1rPI.js.map +0 -1
  34. package/dist/ipc-ABXlXzGP.js +0 -1290
  35. package/dist/ipc-ABXlXzGP.js.map +0 -1
  36. package/dist/jsonrpc-DSxh2w5R.js +0 -68
  37. package/dist/jsonrpc-DSxh2w5R.js.map +0 -1
  38. package/dist/output-DmHvT8vm.js +0 -807
  39. package/dist/output-DmHvT8vm.js.map +0 -1
  40. package/dist/perf-metrics-C2pXfxvR.js +0 -598
  41. package/dist/perf-metrics-C2pXfxvR.js.map +0 -1
  42. package/dist/prompt-turn-CVPMWdj1.js.map +0 -1
  43. package/dist/render-N5YwotCy.js +0 -172
  44. package/dist/render-N5YwotCy.js.map +0 -1
  45. package/dist/rolldown-runtime-CiIaOW0V.js +0 -13
  46. package/dist/session-CDaQe6BH.js +0 -1538
  47. package/dist/session-CDaQe6BH.js.map +0 -1
  48. package/dist/session-options-pCbHn_n7.d.ts +0 -13
  49. package/dist/session-options-pCbHn_n7.d.ts.map +0 -1
  50. package/dist/types-CVBeQyi3.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "acpx",
3
- "version": "0.7.0",
3
+ "version": "0.9.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",
@@ -36,31 +36,34 @@
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsdown src/cli.ts src/flows.ts src/runtime.ts --format esm --dts --clean --platform node --target node22 --no-fixedExtension",
39
+ "build:quiet": "tsdown --logLevel silent src/cli.ts src/flows.ts src/runtime.ts --format esm --dts --clean --platform node --target node22 --no-fixedExtension",
39
40
  "build:test": "node -e \"require('node:fs').rmSync('dist-test',{recursive:true,force:true})\" && tsgo -p tsconfig.test.json",
40
- "check": "pnpm run format:check && pnpm run typecheck && pnpm run lint && pnpm run build && pnpm run viewer:typecheck && pnpm run viewer:build && pnpm run test:coverage",
41
- "check:docs": "pnpm run format:docs:check && pnpm run lint:docs",
41
+ "check": "pnpm run format:check && pnpm run typecheck && pnpm run lint && pnpm run build && pnpm run viewer:typecheck && pnpm run viewer:build && pnpm run test:coverage && pnpm run mutate",
42
+ "check:docs": "pnpm run format:docs:check && pnpm run lint:docs && pnpm run docs:site",
42
43
  "conformance:run": "tsx conformance/runner/run.ts",
43
44
  "dev": "tsx src/cli.ts",
45
+ "docs:site": "node scripts/build-docs-site.mjs",
44
46
  "format": "oxfmt --write",
45
47
  "format:check": "oxfmt --check",
46
48
  "format:diff": "oxfmt --write && git --no-pager diff",
47
49
  "format:docs": "git ls-files 'docs/**/*.md' 'examples/flows/**/*.md' 'README.md' | xargs oxfmt --write",
48
50
  "format:docs:check": "git ls-files 'docs/**/*.md' 'examples/flows/**/*.md' 'README.md' | xargs oxfmt --check",
49
- "lint": "oxlint --type-aware --deny-warnings src scripts examples test && pnpm run lint:persisted-key-casing && pnpm run lint:flow-schema-terms",
51
+ "lint": "oxlint --type-aware --deny-warnings src scripts examples test conformance && pnpm run lint:persisted-key-casing && pnpm run lint:flow-schema-terms",
50
52
  "lint:docs": "markdownlint-cli2 README.md docs/**/*.md examples/flows/**/*.md",
51
53
  "lint:fix": "oxlint --type-aware --fix src && pnpm run format",
52
54
  "lint:flow-schema-terms": "tsx scripts/lint-flow-schema-terms.ts",
53
55
  "lint:persisted-key-casing": "tsx scripts/lint-persisted-key-casing.ts",
56
+ "mutate": "stryker run",
54
57
  "perf:report": "tsx scripts/perf-report.ts",
55
58
  "precommit": "pnpm exec lint-staged && pnpm run -s build",
56
- "prepack": "pnpm run build",
59
+ "prepack": "tsdown --logLevel silent src/cli.ts src/flows.ts src/runtime.ts --format esm --dts --clean --platform node --target node22 --no-fixedExtension",
57
60
  "prepare": "husky",
58
- "test": "pnpm run build:test && node --test dist-test/test/*.test.js",
59
- "test:coverage": "pnpm run build:test && node --experimental-test-coverage --test-coverage-exclude=dist-test/test/**/*.js --test-coverage-lines=83 --test-coverage-branches=76 --test-coverage-functions=86 --test dist-test/test/*.test.js",
61
+ "test": "pnpm run build && pnpm run build:test && node --test dist-test/test/*.test.js",
62
+ "test:coverage": "pnpm run build && pnpm run build:test && node --test dist-test/test/*.test.js && c8 --all --check-coverage --lines 85 --branches 85 --functions 85 --statements 85 --include 'dist-test/src/flows/authoring.js' --include 'dist-test/src/flows/decision.js' --include 'dist-test/src/flows/definition.js' --include 'dist-test/src/flows/json.js' --include 'dist-test/src/flows/schema.js' --include 'dist-test/src/flows/store.js' --include 'dist-test/src/runtime/public/**/*.js' --include 'dist-test/src/runtime/engine/manager.js' --exclude 'dist-test/test/**/*.js' --exclude 'dist/**/*.js' node --test dist-test/test/flows.test.js dist-test/test/flows-store.test.js dist-test/test/runtime.test.js dist-test/test/runtime-events.test.js dist-test/test/runtime-manager.test.js dist-test/test/runtime-probe.test.js",
60
63
  "test:live": "pnpm run build:test && node --test dist-test/test/cursor-live.integration.js",
61
64
  "typecheck": "tsgo --noEmit",
62
65
  "typecheck:tsc": "tsgo --noEmit",
63
- "viewer": "tsx examples/flows/replay-viewer/server.ts start",
66
+ "viewer": "tsx examples/flows/replay-viewer/server.ts",
64
67
  "viewer:build": "vite build --config examples/flows/replay-viewer/vite.config.ts",
65
68
  "viewer:dev": "tsx examples/flows/replay-viewer/server.ts start",
66
69
  "viewer:open": "tsx examples/flows/replay-viewer/server.ts start --open",
@@ -70,36 +73,38 @@
70
73
  "viewer:typecheck": "tsgo -p examples/flows/replay-viewer/tsconfig.json --noEmit && tsgo -p examples/flows/replay-viewer/tsconfig.server.json --noEmit"
71
74
  },
72
75
  "dependencies": {
73
- "@agentclientprotocol/sdk": "^0.21.0",
76
+ "@agentclientprotocol/sdk": "^0.22.1",
74
77
  "commander": "^14.0.3",
75
78
  "skillflag": "^0.1.4",
76
- "tsx": "^4.21.0",
77
- "zod": "^4.4.2"
79
+ "tsx": "^4.22.0",
80
+ "zod": "^4.4.3"
78
81
  },
79
82
  "devDependencies": {
80
- "@types/node": "^25.6.0",
83
+ "@stryker-mutator/core": "^9.6.1",
84
+ "@types/node": "^25.9.0",
81
85
  "@types/react": "^19.2.14",
82
86
  "@types/react-dom": "^19.2.3",
83
87
  "@types/react-test-renderer": "^19.1.0",
84
88
  "@types/ws": "^8.18.1",
85
- "@typescript/native-preview": "7.0.0-dev.20260503.1",
86
- "@vitejs/plugin-react": "^6.0.1",
89
+ "@typescript/native-preview": "7.0.0-dev.20260519.1",
90
+ "@vitejs/plugin-react": "^6.0.2",
87
91
  "@xyflow/react": "^12.10.2",
92
+ "c8": "^11.0.0",
88
93
  "elkjs": "^0.11.1",
89
94
  "fast-json-patch": "^3.1.1",
90
95
  "husky": "^9.1.7",
91
- "lint-staged": "^16.4.0",
96
+ "lint-staged": "^17.0.5",
92
97
  "markdownlint-cli2": "^0.22.1",
93
- "oxfmt": "^0.47.0",
94
- "oxlint": "^1.62.0",
95
- "oxlint-tsgolint": "^0.22.1",
96
- "react": "^19.2.5",
97
- "react-dom": "^19.2.5",
98
- "react-test-renderer": "^19.2.5",
99
- "tsdown": "^0.21.10",
98
+ "oxfmt": "^0.51.0",
99
+ "oxlint": "^1.65.0",
100
+ "oxlint-tsgolint": "^0.23.0",
101
+ "react": "^19.2.6",
102
+ "react-dom": "^19.2.6",
103
+ "react-test-renderer": "^19.2.6",
104
+ "tsdown": "^0.22.0",
100
105
  "typescript": "^6.0.3",
101
- "vite": "^8.0.10",
102
- "ws": "^8.20.0"
106
+ "vite": "^8.0.13",
107
+ "ws": "^8.20.1"
103
108
  },
104
109
  "lint-staged": {
105
110
  "*.{js,ts}": [
@@ -111,7 +116,7 @@
111
116
  ]
112
117
  },
113
118
  "engines": {
114
- "node": ">=22.12.0"
119
+ "node": ">=22.13.0"
115
120
  },
116
121
  "packageManager": "pnpm@10.33.2"
117
122
  }
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: acpx
3
- description: Use acpx as a headless ACP CLI for agent-to-agent communication, including prompt/exec/sessions workflows, session scoping, queueing, permissions, and output formats.
3
+ description: Use acpx as a headless ACP CLI for agent-to-agent communication, including prompt/exec/sessions workflows, session scoping, queueing, permissions, output formats, system-prompt overrides, and multi-agent flows authored with defineFlow/decision/decisionEdge.
4
4
  ---
5
5
 
6
6
  # acpx
7
7
 
8
8
  ## When to use this skill
9
9
 
10
- Use this skill when you need to run coding agents through `acpx`, manage persistent ACP sessions, queue prompts, or consume structured agent output from scripts.
10
+ Use this skill when you need to run coding agents through `acpx`, manage persistent ACP sessions, queue prompts, override the Claude system prompt, prune stale sessions, consume structured agent output from scripts, or compose multi-agent workflows declaratively with `acpx/flows`.
11
11
 
12
12
  ## What acpx is
13
13
 
@@ -18,6 +18,8 @@ Core capabilities:
18
18
  - Persistent multi-turn sessions per repo/cwd
19
19
  - One-shot execution mode (`exec`)
20
20
  - Named parallel sessions (`-s/--session`)
21
+ - Idempotent session creation (`sessions ensure`)
22
+ - Session retention controls (`sessions prune` with age filters and history cleanup)
21
23
  - Queue-aware prompt submission with optional fire-and-forget (`--no-wait`)
22
24
  - Cooperative cancel command (`cancel`) for in-flight turns
23
25
  - Graceful cancellation via ACP `session/cancel` on interrupt
@@ -31,7 +33,10 @@ Core capabilities:
31
33
  - Stable ACP `authenticate` handshake via env/config credentials
32
34
  - Structured streaming output (`text`, `json`, `quiet`) with optional `--suppress-reads`
33
35
  - Built-in agent registry plus raw `--agent` escape hatch
34
- - Experimental `flow run` support with `acpx/flows` helpers, including constrained-choice `decision()` branching
36
+ - Claude system prompt override via `--system-prompt` / `--append-system-prompt`
37
+ - Optional terminal capability disable via `--no-terminal` for review-only flows
38
+ - Tool whitelist (`--allowed-tools`), turn cap (`--max-turns`), retry on transient failures (`--prompt-retries`)
39
+ - Multi-agent flows via `acpx flow run` and the `acpx/flows` authoring API (`defineFlow`, `decision`, `decisionEdge`, `acp`, `action`, `compute`, `checkpoint`)
35
40
 
36
41
  ## Install
37
42
 
@@ -53,8 +58,9 @@ acpx [global_options] cancel [-s <name>]
53
58
  acpx [global_options] set-mode <mode> [-s <name>]
54
59
  acpx [global_options] set <key> <value> [-s <name>]
55
60
  acpx [global_options] status [-s <name>]
56
- acpx [global_options] sessions [list | new [--name <name>] | close [name] | show [name] | history [name] [--limit <count>]]
61
+ acpx [global_options] sessions [list | new [--name <name>] | ensure [--name <name>] | close [name] | show [name] | history [name] [--limit <count>] | prune [--dry-run] [--before <date> | --older-than <days>] [--include-history]]
57
62
  acpx [global_options] config [show | init]
63
+ acpx [global_options] flow run <file> [--input-json '<json>' | --input-file <path>] [--default-agent <name>]
58
64
 
59
65
  acpx [global_options] <agent> [prompt_options] [prompt_text...]
60
66
  acpx [global_options] <agent> prompt [prompt_options] [prompt_text...]
@@ -63,7 +69,7 @@ acpx [global_options] <agent> cancel [-s <name>]
63
69
  acpx [global_options] <agent> set-mode <mode> [-s <name>]
64
70
  acpx [global_options] <agent> set <key> <value> [-s <name>]
65
71
  acpx [global_options] <agent> status [-s <name>]
66
- acpx [global_options] <agent> sessions [list | new [--name <name>] | close [name] | show [name] | history [name] [--limit <count>]]
72
+ acpx [global_options] <agent> sessions [list | new [--name <name>] | ensure [--name <name>] | close [name] | show [name] | history [name] [--limit <count>] | prune [--dry-run] [--before <date> | --older-than <days>] [--include-history]]
67
73
  ```
68
74
 
69
75
  If prompt text is omitted and stdin is piped, `acpx` reads prompt text from stdin.
@@ -74,7 +80,7 @@ Friendly agent names resolve to commands:
74
80
 
75
81
  - `pi` -> `npx pi-acp`
76
82
  - `openclaw` -> `openclaw acp`
77
- - `codex` -> `npx @zed-industries/codex-acp`
83
+ - `codex` -> `npx -y @agentclientprotocol/codex-acp`
78
84
  - `claude` -> `npx -y @agentclientprotocol/claude-agent-acp` (ACPX-owned package range)
79
85
  - `gemini` -> `gemini --acp`
80
86
  - `cursor` -> `cursor-agent acp`
@@ -145,7 +151,7 @@ Behavior:
145
151
  ```bash
146
152
  acpx codex cancel
147
153
  acpx codex set-mode auto
148
- acpx codex set thought_level high
154
+ acpx codex set model gpt-5.2[high]
149
155
  acpx codex set model gpt-5.4
150
156
  ```
151
157
 
@@ -155,7 +161,7 @@ Behavior:
155
161
  - `set-mode`: calls ACP `session/set_mode`.
156
162
  - `set-mode` mode ids are adapter-defined; unsupported values are rejected by the adapter (often `Invalid params`).
157
163
  - `set`: calls ACP `session/set_config_option`.
158
- - For codex, `thought_level` is accepted as a compatibility alias for codex-acp `reasoning_effort`.
164
+ - For codex, reasoning effort is selected through advertised ACP model ids when the adapter reports model variants.
159
165
  - `--model <id>`: Claude-compatible adapters may consume session creation metadata; other agents must advertise ACP models and support `session/set_model`, otherwise `acpx` fails clearly instead of silently falling back.
160
166
  - `set model <id>`: calls `session/set_model`. This is the generic ACP method for mid-session model switching.
161
167
  - `set-mode`/`set` route through queue-owner IPC when active, otherwise reconnect directly.
@@ -165,32 +171,51 @@ Behavior:
165
171
  ```bash
166
172
  acpx sessions
167
173
  acpx sessions list
174
+ acpx sessions list --filter-cwd .
175
+ acpx sessions list --cursor <cursor>
176
+ acpx sessions list --local
168
177
  acpx sessions new
169
178
  acpx sessions new --name backend
179
+ acpx sessions ensure
180
+ acpx sessions ensure --name backend
170
181
  acpx sessions close
171
182
  acpx sessions close backend
172
183
  acpx sessions show
173
184
  acpx sessions history --limit 20
185
+ acpx sessions prune --dry-run --older-than 7
186
+ acpx sessions prune --older-than 30 --include-history
174
187
  acpx status
175
188
 
176
189
  acpx codex sessions
177
190
  acpx codex sessions new --name backend
191
+ acpx codex sessions ensure --name backend
178
192
  acpx codex sessions close backend
179
193
  acpx codex sessions show backend
180
194
  acpx codex sessions history backend --limit 20
195
+ acpx codex sessions prune --before 2026-04-01 --include-history
181
196
  acpx codex status
182
197
  ```
183
198
 
184
199
  Behavior:
185
200
 
186
201
  - `sessions` and `sessions list` are equivalent
202
+ - `sessions list` uses ACP `session/list` when the agent advertises it; JSON
203
+ includes agent `SessionInfo`, `_meta`, and `nextCursor`
204
+ - `sessions list --filter-cwd <dir>` applies the ACP cwd filter, and
205
+ `--cursor <cursor>` requests a specific page
206
+ - `sessions list --local` reads saved acpx records instead
187
207
  - `new` creates a fresh session for the current `(agentCommand, cwd, optional name)` scope
188
208
  - `new --name <name>` targets a named session scope
189
209
  - when `new` replaces an existing open session in that scope, the old one is soft-closed
210
+ - `ensure` returns the nearest matching active session for the scope, or creates one when none is open. Idempotent — safe to call before every prompt in scripts.
190
211
  - `close` targets current cwd default session
191
212
  - `close <name>` targets current cwd named session
192
213
  - `show [name]` prints stored metadata for that scoped session
193
214
  - `history [name]` prints stored turn history previews (default 20, use `--limit`)
215
+ - `prune` deletes closed session records to reclaim disk space
216
+ - `--dry-run` previews what would be deleted without touching disk
217
+ - `--older-than <days>` and `--before <date>` filter by close time, falling back to last-used time when a record was never explicitly closed
218
+ - `--include-history` also removes per-session event stream files (otherwise only the JSON record is removed)
194
219
 
195
220
  ## Global options
196
221
 
@@ -199,15 +224,55 @@ Behavior:
199
224
  - `--approve-all`: auto-approve all permission requests
200
225
  - `--approve-reads`: auto-approve reads/searches, prompt for writes (default mode)
201
226
  - `--deny-all`: deny all permission requests
227
+ - `--non-interactive-permissions <policy>`: when prompting is unavailable, choose `deny` or `fail`
228
+ - `--permission-policy <json-or-file>` / `--policy`: per-tool ACP permission rules (`autoApprove`, `autoDeny`, `escalate`, `defaultAction`)
202
229
  - `--format <fmt>`: output format (`text`, `json`, `quiet`)
230
+ - `--json-strict`: strict JSON mode; requires `--format json` and suppresses non-JSON stderr output
203
231
  - `--suppress-reads`: suppress raw read-file contents while preserving the selected format
204
232
  - `--timeout <seconds>`: max wait time (positive number)
205
233
  - `--ttl <seconds>`: queue owner idle TTL before shutdown (default `300`, `0` disables TTL)
206
234
  - `--model <id>`: request an agent model during session creation; non-Claude agents must advertise ACP models and support `session/set_model`
235
+ - `--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.
236
+ - `--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`.
237
+ - `--allowed-tools <list>`: comma-separated tool whitelist (use `""` for no tools)
238
+ - `--max-turns <count>`: cap session turn count
239
+ - `--prompt-retries <count>`: retry failed prompt turns on transient errors (default `0`)
240
+ - `--no-terminal`: do not advertise the ACP terminal capability — useful for review-only or sandboxed agent invocations
207
241
  - `--verbose`: verbose ACP/debug logs to stderr
208
242
 
209
243
  Permission flags are mutually exclusive.
210
244
 
245
+ ## System prompt override (Claude)
246
+
247
+ `--system-prompt` and `--append-system-prompt` let you specialize a Claude session without leaving lingering one-off state, while still benefiting from persistent session reuse.
248
+
249
+ ```bash
250
+ # Replace the system prompt for a named session, persisted across reuse
251
+ acpx --system-prompt "You are a code reviewer who challenges every implicit assumption." claude -s review
252
+
253
+ # Append a guideline on top of the default system prompt
254
+ acpx --append-system-prompt "Always explain trade-offs before recommending a fix." claude -s impl
255
+ ```
256
+
257
+ The override is forwarded via ACP `_meta.systemPrompt` (or `_meta.systemPrompt.append`) on `session/new` and stored in `session_options.system_prompt`. Subsequent `prompt`/`ensure` calls in the same scope keep the override unless you explicitly create a new session. Non-Claude adapters ignore the field, so the same flag is safe inside cross-agent scripts.
258
+
259
+ ## Sessions cleanup
260
+
261
+ Closed session records accumulate on disk by default. Use `sessions prune` to enforce retention:
262
+
263
+ ```bash
264
+ # Preview what would be deleted (no writes)
265
+ acpx codex sessions prune --dry-run --older-than 7
266
+
267
+ # Remove records closed more than 30 days ago, including their event-stream files
268
+ acpx codex sessions prune --older-than 30 --include-history
269
+
270
+ # Remove everything closed before a date
271
+ acpx codex sessions prune --before 2026-04-01
272
+ ```
273
+
274
+ Without `--include-history`, only the lightweight JSON record is removed; event-stream files are preserved for audit. With it, the per-session event log is also deleted to reclaim disk space.
275
+
211
276
  ## Config files
212
277
 
213
278
  Config files are merged in this order (later wins):
@@ -219,6 +284,7 @@ Supported keys:
219
284
 
220
285
  - `defaultAgent`
221
286
  - `defaultPermissions` (`approve-all`, `approve-reads`, `deny-all`)
287
+ - `nonInteractivePermissions` (`deny`, `fail`)
222
288
  - `ttl` (seconds)
223
289
  - `timeout` (seconds or `null`)
224
290
  - `format` (`text`, `json`, `quiet`)
@@ -245,7 +311,7 @@ Persistence:
245
311
  - Session records are stored in `~/.acpx/sessions/*.json`.
246
312
  - `-s/--session` creates parallel named conversations in the same repo.
247
313
  - Changing `--cwd` changes scope and therefore session lookup.
248
- - closed sessions are retained on disk with `closed: true` and `closedAt`.
314
+ - closed sessions are retained on disk with `closed: true` and `closedAt` until pruned.
249
315
  - auto-resume by scope skips closed sessions.
250
316
 
251
317
  Resume behavior:
@@ -282,6 +348,7 @@ Use `--format <fmt>`:
282
348
  - `json`: NDJSON event stream (good for automation)
283
349
  - `quiet`: final assistant text only
284
350
  - `--suppress-reads`: replace raw read-file contents with `[read output suppressed]` in `text` and `json` output
351
+ - `--json-strict`: pair with `--format json` to suppress non-JSON stderr noise (logs, banners) for downstream consumers
285
352
 
286
353
  Example automation:
287
354
 
@@ -295,9 +362,120 @@ acpx --format json codex exec 'review changed files' \
295
362
  - `--approve-all`: no interactive permission prompts
296
363
  - `--approve-reads` (default): approve reads/searches, prompt for writes
297
364
  - `--deny-all`: deny all permission requests
365
+ - `--non-interactive-permissions <deny|fail>`: chosen behavior when no TTY is available to prompt
366
+ - `--policy <json-or-file>`: match ACP permission requests by tool kind/title; non-interactive escalations add ACP response metadata
298
367
 
299
368
  If every permission request is denied/cancelled and none approved, `acpx` exits with permission-denied status.
300
369
 
370
+ ## Flows (multi-agent workflows)
371
+
372
+ Flows let you declare a multi-agent workflow as a graph of typed nodes connected by edges, executed by the `acpx` runtime. The runtime owns persistence, retries, timeouts, and routing — the flow file declares the shape, not the engine.
373
+
374
+ ### Run a flow
375
+
376
+ ```bash
377
+ acpx flow run ./my-flow.flow.ts --input-file ./flow-input.json
378
+ acpx flow run ./my-flow.flow.ts --input-json '{"task":"FIX: add a regression test"}'
379
+ acpx --approve-all flow run examples/flows/pr-triage/pr-triage.flow.ts \
380
+ --input-json '{"repo":"openclaw/acpx","prNumber":150}'
381
+ acpx flow run ./my-flow.flow.ts --default-agent claude
382
+ ```
383
+
384
+ Run artifacts persist under `~/.acpx/flows/runs/<runId>/`. Default per-step timeout is 15 minutes when `--timeout` is unset; flows that declare permission requirements fail fast before starting.
385
+
386
+ ### Authoring a flow
387
+
388
+ The authoring surface lives in `acpx/flows`. The minimal example:
389
+
390
+ ```ts
391
+ import { acp, decision, decisionEdge, defineFlow, checkpoint, extractJsonObject } from "acpx/flows";
392
+
393
+ const choices = ["bug", "feat", "doc"] as const;
394
+
395
+ export default defineFlow({
396
+ name: "pr-triage",
397
+ startAt: "classify",
398
+ nodes: {
399
+ classify: decision({
400
+ choices,
401
+ question: ({ input }) =>
402
+ `Classify the PR description below. Reply with one of: ${choices.join(", ")}.\n\n${input.description}`,
403
+ }),
404
+ bug_lane: acp({
405
+ prompt: ({ outputs }) =>
406
+ `The PR is a bug. Write a regression test that reproduces it.\n\nDecision context: ${JSON.stringify(outputs.classify)}`,
407
+ parse: (text) => extractJsonObject(text),
408
+ }),
409
+ feat_lane: acp({
410
+ prompt: () => "List acceptance criteria for the feature, one bullet per criterion.",
411
+ }),
412
+ doc_lane: checkpoint({
413
+ summary: "doc change — needs human review",
414
+ run: ({ outputs }) => ({ route: "doc", note: outputs.classify }),
415
+ }),
416
+ },
417
+ edges: [
418
+ decisionEdge({
419
+ from: "classify",
420
+ choices,
421
+ cases: {
422
+ bug: "bug_lane",
423
+ feat: "feat_lane",
424
+ doc: "doc_lane",
425
+ },
426
+ }),
427
+ ],
428
+ });
429
+ ```
430
+
431
+ ### Node types
432
+
433
+ | Type | Purpose |
434
+ | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
435
+ | `acp({ prompt, parse?, agent?, cwd? })` | Model-driven step. The `prompt` builder receives `{ input, outputs }`. Optional `parse` coerces the raw text (e.g., `extractJsonObject`). |
436
+ | `decision({ choices, question })` | Constrained-choice LLM step. `choices` is a `readonly` tuple; the runtime validates the model's reply against it and TypeScript infers the union from `choices`. |
437
+ | `action(...)` | Runtime-supervised deterministic operation: shell, GitHub API, test execution, comment posting. |
438
+ | `compute(...)` | Pure local data transform: normalization, routing key derivation, signal reduction. |
439
+ | `checkpoint({ summary, run })` | Pause point for human or external trigger. `run` returns the outcome to record while paused. |
440
+
441
+ ### Edge shapes
442
+
443
+ ```ts
444
+ // Linear edge
445
+ { from: "node", to: "next" }
446
+
447
+ // JSONPath switch — non-decision routing
448
+ {
449
+ from: "node",
450
+ switch: {
451
+ on: "$.route",
452
+ cases: { "value-a": "branch_a", "value-b": "branch_b" },
453
+ },
454
+ }
455
+
456
+ // Decision edge — exhaustive at compile time
457
+ decisionEdge({
458
+ from: "classify",
459
+ choices, // same readonly tuple as decision()
460
+ cases: { // every choice must map to a node id
461
+ bug: "bug_lane",
462
+ feat: "feat_lane",
463
+ doc: "doc_lane",
464
+ },
465
+ })
466
+ ```
467
+
468
+ If a `decisionEdge` omits a case from `choices`, the TypeScript compiler refuses to compile — so a flow can't ship with a forgotten branch when new choices are added.
469
+
470
+ ### Why use flows
471
+
472
+ - **Cross-vendor by construction**: classify with `codex`, write code with `claude`, summarize with `gemini` — same flow file, no glue.
473
+ - **Persistence and replay**: every run streams events to disk, replayable via the flow viewer under `~/.acpx/flows/runs/`.
474
+ - **Permission preflight**: flows declaring permission requirements fail before any agent starts, instead of mid-run.
475
+ - **Typed routing**: the LLM is constrained to a literal union, the compiler verifies exhaustivity, the runtime validates the reply.
476
+
477
+ See `examples/flows/` in the repo for working samples (`branch.flow.ts`, `pr-triage/`, `two-turn.flow.ts`, `shell.flow.ts`, `workdir.flow.ts`).
478
+
301
479
  ## Practical workflows
302
480
 
303
481
  Persistent repo assistant:
@@ -314,6 +492,20 @@ acpx codex -s backend 'fix API pagination bug'
314
492
  acpx codex -s docs 'draft changelog entry for release'
315
493
  ```
316
494
 
495
+ Specialized Claude reviewer that survives session reuse:
496
+
497
+ ```bash
498
+ acpx --system-prompt "You are a reviewer who refuses to approve untested changes." claude -s reviewer
499
+ acpx claude -s reviewer 'review the diff in src/auth/'
500
+ ```
501
+
502
+ Idempotent session bootstrap (safe to call before every prompt in scripts):
503
+
504
+ ```bash
505
+ acpx codex sessions ensure -s ci
506
+ acpx codex -s ci 'run the smoke suite and report failures'
507
+ ```
508
+
317
509
  Queue follow-up without waiting:
318
510
 
319
511
  ```bash
@@ -330,7 +522,7 @@ acpx --format quiet exec 'summarize repo purpose in 3 lines'
330
522
  Machine-readable output for orchestration:
331
523
 
332
524
  ```bash
333
- acpx --format json codex 'review current branch changes' > events.ndjson
525
+ acpx --format json --json-strict codex 'review current branch changes' > events.ndjson
334
526
  ```
335
527
 
336
528
  Raw custom adapter command:
@@ -339,11 +531,17 @@ Raw custom adapter command:
339
531
  acpx --agent './bin/custom-acp-server --profile ci' 'run validation checks'
340
532
  ```
341
533
 
342
- Flow run:
534
+ Periodic cleanup:
535
+
536
+ ```bash
537
+ acpx codex sessions prune --dry-run --older-than 14
538
+ acpx codex sessions prune --older-than 30 --include-history
539
+ ```
540
+
541
+ Multi-agent triage flow:
343
542
 
344
543
  ```bash
345
- acpx flow run ./my-flow.ts --input-file ./flow-input.json
346
- acpx flow run examples/flows/branch.flow.ts --input-json '{"task":"FIX: add a regression test"}'
544
+ acpx --approve-all flow run ./pr-triage.flow.ts --input-json '{"prNumber": 842}'
347
545
  ```
348
546
 
349
547
  Repo-scoped review with permissive mode:
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-T-Z-9x6a.js","names":[],"sources":["../src/flows/cli.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { InvalidArgumentError, type Command } from \"commander\";\nimport type { ResolvedAcpxConfig } from \"../cli/config.js\";\nimport {\n hasExplicitPermissionModeFlag,\n resolveAgentInvocation,\n resolveGlobalFlags,\n resolveOutputPolicy,\n resolvePermissionMode,\n type GlobalFlags,\n} from \"../cli/flags.js\";\nimport { type FlowDefinition, FlowRunner } from \"../flows.js\";\nimport { permissionModeSatisfies } from \"../permissions.js\";\nimport type { PermissionMode } from \"../types.js\";\nimport { isDefinedFlow } from \"./authoring.js\";\nimport { validateFlowDefinition } from \"./graph.js\";\n\ntype FlowRunFlags = {\n inputJson?: string;\n inputFile?: string;\n defaultAgent?: string;\n};\n\nconst FLOW_RUNTIME_SPECIFIER = \"acpx/flows\";\nconst TEXT_MODULE_EXTENSIONS = new Set([\".js\", \".mjs\", \".cjs\", \".ts\", \".tsx\", \".mts\", \".cts\"]);\n\nexport async function handleFlowRun(\n flowFile: string,\n flags: FlowRunFlags,\n command: Command,\n config: ResolvedAcpxConfig,\n): Promise<void> {\n const globalFlags = resolveGlobalFlags(command, config);\n const permissionMode = resolvePermissionMode(globalFlags, config.defaultPermissions);\n const outputPolicy = resolveOutputPolicy(globalFlags.format, globalFlags.jsonStrict === true);\n const input = await readFlowInput(flags);\n const flowPath = path.resolve(flowFile);\n const flow = await loadFlowModule(flowPath);\n assertFlowPermissionRequirements(flow, permissionMode, globalFlags);\n\n const runner = new FlowRunner({\n resolveAgent: (profile?: string) => {\n return resolveAgentInvocation(profile ?? flags.defaultAgent, globalFlags, config);\n },\n permissionMode,\n mcpServers: config.mcpServers,\n nonInteractivePermissions: globalFlags.nonInteractivePermissions,\n authCredentials: config.auth,\n authPolicy: globalFlags.authPolicy,\n timeoutMs: globalFlags.timeout,\n ttlMs: globalFlags.ttl,\n verbose: globalFlags.verbose,\n suppressSdkConsoleErrors: outputPolicy.suppressSdkConsoleErrors,\n sessionOptions: {\n model: globalFlags.model,\n allowedTools: globalFlags.allowedTools,\n maxTurns: globalFlags.maxTurns,\n },\n });\n\n const result = await runner.run(flow, input, {\n flowPath,\n });\n\n printFlowRunResult(result, globalFlags);\n}\n\nfunction assertFlowPermissionRequirements(\n flow: FlowDefinition,\n permissionMode: PermissionMode,\n globalFlags: GlobalFlags,\n): void {\n const permissions = flow.permissions;\n if (!permissions) {\n return;\n }\n\n if (permissions.requireExplicitGrant && !hasExplicitPermissionModeFlag(globalFlags)) {\n throw new InvalidArgumentError(\n buildFlowPermissionFailureMessage(flow, permissions.requiredMode, permissions.reason, true),\n );\n }\n\n if (!permissionModeSatisfies(permissionMode, permissions.requiredMode)) {\n throw new InvalidArgumentError(\n buildFlowPermissionFailureMessage(flow, permissions.requiredMode, permissions.reason, false),\n );\n }\n}\n\nfunction buildFlowPermissionFailureMessage(\n flow: FlowDefinition,\n requiredMode: PermissionMode,\n reason?: string,\n explicit = false,\n): string {\n return [\n explicit\n ? `Flow \"${flow.name}\" requires an explicit ${requiredMode} grant.`\n : `Flow \"${flow.name}\" requires permission mode ${requiredMode}.`,\n `Rerun with --${requiredMode}.`,\n ...(reason ? [`Reason: ${reason}`] : []),\n ].join(\" \");\n}\n\nasync function readFlowInput(flags: FlowRunFlags): Promise<unknown> {\n if (flags.inputJson && flags.inputFile) {\n throw new InvalidArgumentError(\"Use only one of --input-json or --input-file\");\n }\n\n if (flags.inputJson) {\n return parseJsonInput(flags.inputJson, \"--input-json\");\n }\n\n if (flags.inputFile) {\n const inputPath = path.resolve(flags.inputFile);\n const payload = await fs.readFile(inputPath, \"utf8\");\n return parseJsonInput(payload, \"--input-file\");\n }\n\n return {};\n}\n\nasync function loadFlowModule(flowPath: string): Promise<FlowDefinition> {\n const extension = path.extname(flowPath).toLowerCase();\n const prepared = await prepareFlowModuleImport(flowPath, extension);\n try {\n const module = await loadFlowRuntimeModule(prepared.flowUrl, extension);\n\n const candidate = findFlowDefinition(module);\n if (!candidate) {\n throw new Error(\n `Flow module must export default defineFlow({...}) from \"acpx/flows\": ${flowPath}`,\n );\n }\n validateFlowDefinition(candidate);\n return candidate;\n } finally {\n await prepared.cleanup?.();\n }\n}\n\nasync function prepareFlowModuleImport(\n flowPath: string,\n extension: string,\n): Promise<{\n flowUrl: string;\n cleanup?: () => Promise<void>;\n}> {\n const flowUrl = pathToFileURL(flowPath).href;\n if (!TEXT_MODULE_EXTENSIONS.has(extension)) {\n return { flowUrl };\n }\n\n const source = await fs.readFile(flowPath, \"utf8\");\n if (!source.includes(FLOW_RUNTIME_SPECIFIER)) {\n return { flowUrl };\n }\n\n const runtimeSpecifier = resolveFlowRuntimeImportSpecifier();\n const rewritten = source.replaceAll(\n /([\"'])acpx\\/flows\\1/g,\n (_match, quote: string) => `${quote}${runtimeSpecifier}${quote}`,\n );\n if (rewritten === source) {\n return { flowUrl };\n }\n\n const tempPath = path.join(path.dirname(flowPath), `.acpx-flow-load-${randomUUID()}${extension}`);\n await fs.writeFile(tempPath, rewritten, \"utf8\");\n return {\n flowUrl: pathToFileURL(tempPath).href,\n cleanup: async () => {\n await fs.rm(tempPath, { force: true });\n },\n };\n}\n\nfunction resolveFlowRuntimeImportSpecifier(): string {\n const selfPath = fileURLToPath(import.meta.url);\n\n if (selfPath.endsWith(`${path.sep}src${path.sep}flows${path.sep}cli.ts`)) {\n return new URL(\"../flows.ts\", import.meta.url).href;\n }\n if (selfPath.endsWith(`${path.sep}src${path.sep}flows${path.sep}cli.js`)) {\n return new URL(\"../flows.js\", import.meta.url).href;\n }\n return new URL(\"./flows.js\", import.meta.url).href;\n}\n\nasync function loadFlowRuntimeModule(\n flowUrl: string,\n extension: string,\n): Promise<{\n default?: unknown;\n \"module.exports\"?: unknown;\n}> {\n if (extension === \".ts\" || extension === \".tsx\" || extension === \".mts\" || extension === \".cts\") {\n const { tsImport } = (await import(\"tsx/esm/api\")) as {\n tsImport: (\n specifier: string,\n parentURL: string,\n ) => Promise<{\n default?: unknown;\n \"module.exports\"?: unknown;\n }>;\n };\n return (await tsImport(flowUrl, import.meta.url)) as {\n default?: unknown;\n \"module.exports\"?: unknown;\n };\n }\n\n return (await import(flowUrl)) as {\n default?: unknown;\n \"module.exports\"?: unknown;\n };\n}\n\nfunction findFlowDefinition(module: {\n default?: unknown;\n \"module.exports\"?: unknown;\n}): FlowDefinition | null {\n const candidates = [\n module.default,\n module[\"module.exports\"],\n getNestedDefault(module.default),\n getNestedDefault(module[\"module.exports\"]),\n ];\n\n for (const candidate of candidates) {\n if (isDefinedFlow(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction getNestedDefault(value: unknown): unknown {\n if (!value || typeof value !== \"object\" || !(\"default\" in value)) {\n return null;\n }\n return (value as { default?: unknown }).default ?? null;\n}\n\nfunction parseJsonInput(raw: string, label: string): unknown {\n try {\n return JSON.parse(raw);\n } catch (error) {\n throw new InvalidArgumentError(\n `${label} must contain valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nfunction printFlowRunResult(\n result: Awaited<ReturnType<FlowRunner[\"run\"]>>,\n globalFlags: GlobalFlags,\n): void {\n const payload = {\n action: \"flow_run_result\",\n runId: result.state.runId,\n flowName: result.state.flowName,\n runTitle: result.state.runTitle,\n flowPath: result.state.flowPath,\n status: result.state.status,\n currentNode: result.state.currentNode,\n currentNodeType: result.state.currentNodeType,\n currentNodeStartedAt: result.state.currentNodeStartedAt,\n lastHeartbeatAt: result.state.lastHeartbeatAt,\n statusDetail: result.state.statusDetail,\n waitingOn: result.state.waitingOn,\n runDir: result.runDir,\n outputs: result.state.outputs,\n sessionBindings: result.state.sessionBindings,\n };\n\n if (globalFlags.format === \"json\") {\n process.stdout.write(`${JSON.stringify(payload)}\\n`);\n return;\n }\n\n if (globalFlags.format === \"quiet\") {\n process.stdout.write(`${result.state.runId}\\n`);\n return;\n }\n\n process.stdout.write(`runId: ${payload.runId}\\n`);\n process.stdout.write(`flow: ${payload.flowName}\\n`);\n if (payload.runTitle) {\n process.stdout.write(`title: ${payload.runTitle}\\n`);\n }\n process.stdout.write(`status: ${payload.status}\\n`);\n process.stdout.write(`runDir: ${payload.runDir}\\n`);\n if (payload.currentNode) {\n process.stdout.write(`currentNode: ${payload.currentNode}\\n`);\n }\n if (payload.statusDetail) {\n process.stdout.write(`statusDetail: ${payload.statusDetail}\\n`);\n }\n if (payload.waitingOn) {\n process.stdout.write(`waitingOn: ${payload.waitingOn}\\n`);\n }\n process.stdout.write(`${JSON.stringify(payload.outputs, null, 2)}\\n`);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-COPilhO_.d.ts","names":[],"sources":["../src/acp/client.ts"],"mappings":"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"}