@enderfga/claw-orchestrator 7.5.3 → 7.5.5

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 (53) hide show
  1. package/README.md +21 -22
  2. package/configs/engines/README.md +7 -6
  3. package/dist/bin/cli.js +1 -1
  4. package/dist/bin/cli.js.map +1 -1
  5. package/dist/src/acp-server.d.ts +1 -1
  6. package/dist/src/acp-server.js +7 -5
  7. package/dist/src/acp-server.js.map +1 -1
  8. package/dist/src/autoloop/notify.d.ts +5 -7
  9. package/dist/src/autoloop/notify.js +21 -20
  10. package/dist/src/autoloop/notify.js.map +1 -1
  11. package/dist/src/embedded-server.js +8 -5
  12. package/dist/src/embedded-server.js.map +1 -1
  13. package/dist/src/fanout.d.ts +6 -0
  14. package/dist/src/fanout.js +1 -0
  15. package/dist/src/fanout.js.map +1 -1
  16. package/dist/src/index.js +21 -13
  17. package/dist/src/index.js.map +1 -1
  18. package/dist/src/kernel/engine.d.ts +39 -1
  19. package/dist/src/kernel/engine.js +120 -10
  20. package/dist/src/kernel/engine.js.map +1 -1
  21. package/dist/src/kernel/nodes/fanout.js +1 -0
  22. package/dist/src/kernel/nodes/fanout.js.map +1 -1
  23. package/dist/src/kernel/types.d.ts +9 -0
  24. package/dist/src/kernel/types.js.map +1 -1
  25. package/dist/src/openai-compat.d.ts +2 -2
  26. package/dist/src/openai-compat.js +5 -2
  27. package/dist/src/openai-compat.js.map +1 -1
  28. package/dist/src/session-manager.d.ts +7 -2
  29. package/dist/src/session-manager.js +21 -7
  30. package/dist/src/session-manager.js.map +1 -1
  31. package/dist/src/types.d.ts +2 -0
  32. package/openclaw.plugin.json +1 -1
  33. package/package.json +2 -2
  34. package/skills/SKILL.md +31 -32
  35. package/skills/references/acp.md +19 -36
  36. package/skills/references/autoloop.md +158 -180
  37. package/skills/references/claude-cli-tracking.md +27 -27
  38. package/skills/references/cli.md +62 -79
  39. package/skills/references/council.md +40 -63
  40. package/skills/references/dashboard.md +42 -55
  41. package/skills/references/getting-started.md +20 -14
  42. package/skills/references/inbox.md +6 -4
  43. package/skills/references/mcp.md +29 -24
  44. package/skills/references/multi-engine.md +105 -153
  45. package/skills/references/observability.md +42 -32
  46. package/skills/references/openai-compat.md +169 -303
  47. package/skills/references/sessions.md +20 -29
  48. package/skills/references/tools.md +67 -78
  49. package/skills/references/ultra.md +17 -16
  50. package/skills/references/ultraapp.md +59 -64
  51. package/skills/references/verification.md +29 -52
  52. package/skills/references/workflow.md +49 -107
  53. package/skills/ultraapp/SKILL.md +9 -10
@@ -80,7 +80,7 @@ import { SessionManager } from '@enderfga/claw-orchestrator';
80
80
 
81
81
  const manager = new SessionManager();
82
82
 
83
- const session = manager.councilStart('Build a REST API with authentication', {
83
+ const session = await manager.councilStart('Build a REST API with authentication', {
84
84
  agents: [
85
85
  {
86
86
  name: 'Planner',
@@ -173,7 +173,7 @@ Rewrites `plan.md` with rejection feedback and commits it. All worktrees and bra
173
173
  | ------------------ | ------------------ | ---------------------------------- |
174
174
  | `maxRounds` | 15 | Maximum collaboration rounds |
175
175
  | `agentTimeoutMs` | 1,800,000 (30 min) | Per-agent timeout per round |
176
- | `maxTurnsPerAgent` | 30 | Max tool turns per agent per round |
176
+ | `maxTurnsPerAgent` | 50 | Max tool turns per agent per round |
177
177
  | `maxBudgetUsd` | — | API spend limit per agent |
178
178
 
179
179
  ### defaultPermissionMode
@@ -181,7 +181,7 @@ Rewrites `plan.md` with rejection feedback and commits it. All worktrees and bra
181
181
  Optional. Sets the default permission mode for council agents when individual agents don't specify one. Defaults to `bypassPermissions`.
182
182
 
183
183
  ```typescript
184
- manager.councilStart('task', {
184
+ await manager.councilStart('task', {
185
185
  agents: [...],
186
186
  maxRounds: 10,
187
187
  projectDir: '/project',
@@ -191,52 +191,41 @@ manager.councilStart('task', {
191
191
 
192
192
  Permission priority: agent-level `permissionMode` > `defaultPermissionMode` > `'bypassPermissions'`
193
193
 
194
- > **Note (Claude CLI 2.1.121+):** When agent personas are persisted as Claude agent files with frontmatter, the `permissionMode`, `tools`, and `disallowedTools` fields are now **enforced** by `--agent` and `--print` modes (previously advisory). If you write agent files with restrictive `tools` lists, expect those agents to refuse calls to other tools at runtime.
195
-
196
194
  ## System Prompt
197
195
 
198
- The council system prompt is loaded from `configs/council-system-prompt.md` and supports hot-editing. It includes 9 charter sections tuned through extensive multi-agent collaboration testing:
196
+ The council system prompt is loaded from `configs/council-system-prompt.md` and supports hot-editing. It has 9 charter sections:
199
197
 
200
- | Section | Purpose |
201
- | --------------------------- | ---------------------------------------------- |
202
- | §0 No Hallucination | Agents must use tools, never fabricate results |
203
- | §1 Plan First | Two-phase protocol with plan.md |
204
- | §2 Parallel Coordination | Claim/done protocol for concurrent work |
205
- | §3 Truth in Git | Git state over conversation memory |
206
- | §4 Merge to Main | Local only, never push |
207
- | §5 Cross-Review | Structured APPROVE/REQUEST_CHANGES |
208
- | §6 Auto-Conflict Resolution | Never stop on merge conflicts |
209
- | §7 Action Over Words | Never ask permission, just work |
210
- | §8 Efficient Tool Use | Minimum necessary principle |
198
+ | Section | Purpose |
199
+ | --------------------------------- | ---------------------------------------------- |
200
+ | §0 Must Use Tools to Execute | Agents must use tools, never fabricate results |
201
+ | §1 Blueprint First | Two-phase protocol with plan.md |
202
+ | §2 Parallel Coordination | Claim/done protocol for concurrent work |
203
+ | §3 Truth in Git | Git state over conversation memory |
204
+ | §4 Integration Is Completion | Local only, never push |
205
+ | §5 Cross-Review | Structured APPROVE/REQUEST_CHANGES |
206
+ | §6 Autonomous Conflict Resolution | Never stop on merge conflicts |
207
+ | §7 Action Over Words | Never ask permission, just work |
208
+ | §8 Efficient Tool Use | Minimum necessary principle |
211
209
 
212
210
  Placeholders: `{{emoji}}`, `{{name}}`, `{{persona}}`, `{{workDir}}`, `{{projectDir}}`, `{{otherBranches}}`
213
211
 
214
212
  The charter is each seat's only instruction channel, and it reaches every engine through `appendSystemPrompt`:
215
213
  natively on Claude Code and Grok, as the top of the seat's first message on Codex, Antigravity and OpenCode.
216
- Nothing is written into the worktrees. Seats used to get their identity and workspace boundary from a
217
- generated `<worktree>/.claude/CLAUDE.md`, which only Claude Code reads and which an agent could commit
218
- into the project.
214
+ Nothing is written into the worktrees.
219
215
 
220
216
  ## Transcript Logging
221
217
 
222
- All council sessions save transcripts to `~/.openclaw/council-logs/council-<timestamp>.md`. Completed councils remain queryable via `council_status` for 30 minutes after completion.
223
-
224
- ## Consensus is advisory (6.0.0)
218
+ All council sessions save transcripts to `~/.openclaw/council-logs/council-<timestamp>.md`. Transcripts are for humans to read; nothing parses them. Completed councils stay queryable via `council_status` indefinitely — the run record is on disk.
225
219
 
226
- Through 5.1.0 a council ended when `parseConsensus` found `[CONSENSUS: YES]` in
227
- every agent's reply — that is, the termination condition was a regex over agent
228
- prose. Two things made that weaker than it looked: the fallback patterns match a
229
- bare `consensus: yes` anywhere in the text, and when a reply came back short and
230
- unmarked the orchestrator re-prompted twice _asking for the token_, which is
231
- demanding a vote rather than checking anything.
220
+ ## Votes end the rounds; contracts decide the verdict
232
221
 
233
- Votes are still collected and still recorded — they are what the agents were
234
- asked for, and they are useful. They are recorded on the run as
235
- `consensusVotes`, each with the parse `source` (`strict` / `variant` / `none`) so
236
- a loosely-detected vote is visible as such.
222
+ A council stops early when every agent votes YES, but the votes do not decide
223
+ whether the work is acceptable. They are recorded on the run as
224
+ `consensusVotes`, each with the parse `source` (`strict` / `variant` / `none`),
225
+ so a loosely detected vote is visible as such.
237
226
 
238
- What changed is that they no longer decide whether the work is acceptable. Give
239
- the run an acceptance contract and the runtime checks the result itself:
227
+ To have the result checked, give the run an acceptance contract and the runtime
228
+ runs the checks itself:
240
229
 
241
230
  ```jsonc
242
231
  workflow_start({
@@ -247,42 +236,30 @@ workflow_start({
247
236
  })
248
237
  ```
249
238
 
250
- Without a contract the council behaves exactly as before and the run completes
251
- `unverified` — nothing checked it.
252
-
253
- `council_start` and the rest of the `council_*` tools keep their signatures, with
254
- one change forced by the cutover: **`councilStart` is now async** (it creates a
255
- durable run before returning). The same applies to `fanoutStart`,
256
- `ultraplanStart` and `ultrareviewStart`. Tool callers are unaffected; direct
257
- TypeScript callers need an `await`.
239
+ Without a contract the run completes `unverified` — nothing checked it.
258
240
 
259
- ## Lifecycle moved to the kernel
241
+ `councilStart`, `fanoutStart`, `ultraplanStart` and `ultrareviewStart` are
242
+ async (each creates a durable run before returning); direct TypeScript callers
243
+ need `await`.
260
244
 
261
- A council is a kernel run. `councils`, its 30-minute eviction timer, and
262
- `listCouncilsFromDisk` — which read `~/.openclaw/council-logs/*.md` with a regex
263
- and fabricated a stub session with no responses and an empty config — are gone.
264
- `council_list` returns real records, from disk, across processes.
245
+ ## Durable runs
265
246
 
266
- `council_review` / `accept` / `reject` work after a restart now. They act on the
267
- git state a finished council left behind, not on live agents, so they run against
268
- a `Council` rebuilt from the record. Only `council_inject` still needs the live
269
- engine, and it says so plainly when there isn't one.
247
+ A council is a durable kernel run. `GET /council/list` (and the dashboard)
248
+ returns real records from disk, across processes.
270
249
 
271
- Transcripts are still written to `~/.openclaw/council-logs/` for humans. Nothing
272
- parses them.
250
+ `council_review` / `council_accept` / `council_reject` work after a restart:
251
+ they act on the git state the council left behind, not on live agents.
252
+ `council_inject` needs the live run and says so plainly when there is none.
273
253
 
274
254
  ## Changed-file reporting
275
255
 
276
- `council_review` used to diff `HEAD~20..HEAD` with a `HEAD~10` fallback: a magic
277
- window unrelated to when the council started, which returned nothing at all on a
278
- shallow or young history. It now diffs against the **merge-base** of `HEAD` and
279
- the first `council/*` branch — the actual fork point — and includes files the
280
- agents created, which a tracked-file diff cannot see.
256
+ `council_review` diffs against the **merge-base** of `HEAD` and the first
257
+ `council/*` branch — the point where the council's work started — and includes
258
+ files the agents created, which a tracked-file diff cannot see.
281
259
 
282
- `CouncilChangedFile.status` was previously hardcoded to `'clean'` for every
283
- entry, which read as "reviewed and found fine" when nothing had looked at it. It
284
- is now optional and left undefined until a reviewer assesses the file; the new
285
- `change` field carries git's own account (`added` / `modified` / `deleted`).
260
+ Each `CouncilChangedFile` carries `change` — git's own account (`added` /
261
+ `modified` / `deleted`). `status` is optional and stays undefined until a
262
+ reviewer assesses the file.
286
263
 
287
264
  ## Related
288
265
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  The dashboard is a single-page HTML app served by the orchestrator's embedded
4
4
  HTTP server. It lets you **launch and observe** Council sessions, Autoloop
5
- runs, and Forge (Ultraapp) builds from a browser — no CLI, no webchat, no
6
- plugin tool calls needed.
5
+ runs and Forge (Ultraapp) builds, and browse durable workflow runs, from a
6
+ browser — no CLI, no webchat, no plugin tool calls needed.
7
7
 
8
8
  URL: `http://127.0.0.1:18796/dash` (local) or whatever public hostname you
9
9
  front the embedded server with (the recommended setup uses a path-based
@@ -16,8 +16,10 @@ reverse proxy, e.g. `https://<your-host>/dash`).
16
16
  | Autoloop | `SessionManager.autoloopStart()` | `POST /autoloop/new` |
17
17
  | Council | `SessionManager.councilStart()` | `POST /council/new` |
18
18
  | Forge | `UltraappManager.createRun()` | `POST /ultraapp/new` |
19
+ | Runs | `GET /workflow/list` | — (view only) |
19
20
 
20
- Each tab has a `+ New` button in the sidebar. Council and Autoloop open a
21
+ Autoloop, Council and Forge each have a `+ New` button in the sidebar; Runs is
22
+ view-only (start runs with `workflow_start`). Council and Autoloop open a
21
23
  modal form (because they need workspace/task input); Forge POSTs an empty
22
24
  body and drops you into an interview (the spec is built conversationally).
23
25
 
@@ -65,10 +67,14 @@ launchctl print "gui/$(id -u)/com.clawo.serve" | grep state
65
67
 
66
68
  ## Auth
67
69
 
68
- The embedded server self-generates a 32-byte token at startup and writes it
69
- to `~/.openclaw/server-token` (mode 0600). Same-user processes on the box
70
- read it and present it as `Authorization: Bearer <token>` (or
71
- `?token=<v>` query / `clawo_auth` cookie).
70
+ On first start the embedded server generates a 32-byte token and writes it
71
+ to `~/.openclaw/server-token` (mode 0600); later starts reuse it. Same-user
72
+ processes on the box read it and present it as `Authorization: Bearer <token>`
73
+ (or `?token=<v>` query / `clawo_auth` cookie).
74
+
75
+ `OPENCLAW_SERVER_TOKEN=<v>` sets an explicit token instead.
76
+ `OPENCLAW_SERVER_TOKEN=disabled` turns authentication off entirely — only safe
77
+ on a trusted single-user host.
72
78
 
73
79
  ### Local access
74
80
 
@@ -76,24 +82,25 @@ read it and present it as `Authorization: Bearer <token>` (or
76
82
  http://127.0.0.1:18796/dash?token=$(cat ~/.openclaw/server-token)
77
83
  ```
78
84
 
79
- The server sets a `clawo_auth` cookie on the first query-token request, so
80
- the bookmark `/dash` works on subsequent visits.
85
+ The server sets a `clawo_auth` cookie on the first query-token request, so a
86
+ bookmarked `/dash` works for the next 24 hours (the cookie's lifetime).
81
87
 
82
88
  ### Hosted access via reverse proxy (recommended)
83
89
 
84
90
  Don't expose the token to the public internet. Instead, gate the public
85
- hostname with whatever auth layer you already trust (CF Access passkey,
91
+ hostname with whatever auth layer you already trust (Cloudflare Access,
86
92
  Tailscale, mTLS, etc.) and have the reverse proxy **inject the Bearer
87
93
  token on behalf of the user** when forwarding to port 18796. The browser
88
94
  authenticates only against your edge auth; the dashboard's own token stays
89
95
  inside the box.
90
96
 
91
- Example sasha-doctor pattern (matches the user-side setup):
97
+ Example reverse-proxy pattern (Node):
92
98
 
93
99
  ```js
94
100
  // after the edge auth check passes:
95
101
  if (!req.headers.authorization) {
96
- req.headers.authorization = 'Bearer ' + fs.readFileSync('~/.openclaw/server-token', 'utf-8').trim();
102
+ const tokenFile = path.join(os.homedir(), '.openclaw', 'server-token');
103
+ req.headers.authorization = 'Bearer ' + fs.readFileSync(tokenFile, 'utf-8').trim();
97
104
  }
98
105
  proxyHTTP(req, res, 18796);
99
106
  ```
@@ -103,20 +110,17 @@ quick one-shot setups (works locally and through proxies that DON'T inject
103
110
  the Bearer for you), but the proxy-injects-Bearer pattern is preferred
104
111
  because users never see or paste the token.
105
112
 
106
- Token-file write is deferred to the `listen()`-success callback so a second
107
- process that loses the EADDRINUSE race does NOT clobber the winner's token.
108
- The token is also re-read from disk on every request so that if a different
109
- clawo instance (test runner, nohup launch, etc.) writes a new value mid-life,
110
- the proxy and the server stay in agreement on the next request — no restart
111
- required.
113
+ The token file is written only after the server has bound its port, so a
114
+ second process that fails to bind does not overwrite the running server's
115
+ token. The token is read from disk on every request, so a server and a proxy
116
+ that both read the file always agree.
112
117
 
113
118
  ## Resuming a terminated autoloop run
114
119
 
115
120
  Opening a run whose `status` is `terminated` (because its process has
116
- exited, or because you're viewing it cross-process) no longer hangs on
117
- "Waiting…". The dashboard fetches `/autoloop/<id>/chat_history`, replays
118
- the conversation into the Planner pane, and surfaces a green **Resume
119
- run** button in the topbar. Clicking it POSTs `/autoloop/<id>/resume`;
121
+ exited, or because you're viewing it cross-process) fetches
122
+ `/autoloop/<id>/chat_history`, replays the conversation into the Planner pane,
123
+ and shows a green **Resume run** button in the topbar. Clicking it POSTs `/autoloop/<id>/resume`;
120
124
  the orchestrator re-attaches the Planner (reusing the persisted Claude
121
125
  session ID when available, so Claude's context picks up where it left
122
126
  off) and the dashboard reconnects to `/events` for live updates.
@@ -124,42 +128,27 @@ off) and the dashboard reconnects to `/events` for live updates.
124
128
  If the run used a **custom engine** for any role, the button first asks
125
129
  `/autoloop/<id>/resume-requirements` and prompts for one reference name per
126
130
  role — the name of a `CLAWO_CUSTOM_ENGINE_<NAME>` variable on the orchestrator
127
- host. The config itself is never stored and never sent; only the name is. Until
128
- this existed the button sent an empty body unconditionally, so a custom-engine
129
- run was resumable from the library and the HTTP API but not from the UI that
130
- offers the button.
131
+ host. The config itself is never stored and never sent; only the name is.
131
132
 
132
- Runs that pre-date this feature have no `chat.jsonl` and no persisted
133
- session — they still resume cleanly, but with a blank Planner pane and a
134
- fresh Claude context. New runs going forward retain both.
133
+ A run without a `chat.jsonl` or a persisted session still resumes, with a blank
134
+ Planner pane and a fresh Claude context.
135
135
 
136
136
  ## Cross-process visibility
137
137
 
138
- When the dashboard runs in a different process from where you spawn runs
139
- (e.g. you started a council via the OpenClaw plugin tool from webchat, but
140
- the dashboard is in `clawo serve`), the run state is invisible across
141
- in-memory boundaries. The dashboard fixes this by unioning in-memory state
142
- with on-disk records on every list call:
143
-
144
- - **Councils**: `~/.openclaw/council-logs/council-*.md` — parsed for
145
- `- **ID**:`, `- **Time**:`, `- **Task**:`, `- **Status**:` headers.
146
- Legacy transcripts (pre-v4.0) fall back to a filename-derived id.
147
- - **Autoloops**: `~/.claw-orchestrator/autoloop-registry.jsonl` — an
148
- append-only JSONL index written by `autoloopStart()`. Stale entries
149
- whose ledger directory no longer exists are filtered out at read time.
150
- - **Forge**: `UltraappStore.listRuns()` already reads from disk
151
- (`~/.claw-orchestrator/ultraapps/`).
152
-
153
- Result: any run you've ever started — from any process — shows up in the
154
- sidebar, sorted newest-first, until the underlying files are deleted.
138
+ Every council, autoloop and workflow run is a durable kernel run stored under
139
+ `~/.claw-orchestrator/wf/`, so the dashboard lists runs started by any process —
140
+ the OpenClaw plugin, `clawo serve`, or the CLI — sorted newest-first, until the
141
+ run records are deleted. Forge runs are read from
142
+ `~/.claw-orchestrator/ultraapps/`.
155
143
 
156
144
  ## Reverse-proxy integration
157
145
 
158
- If you front the embedded server with sasha-doctor (or another reverse
159
- proxy), route these paths to `127.0.0.1:18796`:
146
+ If you front the embedded server with a reverse proxy, route these paths to
147
+ `127.0.0.1:18796`:
160
148
 
161
149
  - `/dashboard`, `/dash`, `/login`
162
150
  - `/autoloop/*`, `/council/*`, `/ultraapp/*`
151
+ - `/workflow/*`, `/runs`
163
152
 
164
153
  The dashboard's relative `fetch()` calls expect the proxy to preserve the
165
154
  path verbatim — no prefix stripping. `/v1/openclaw/*` should keep routing
@@ -167,21 +156,19 @@ to the OpenClaw gateway, not the embedded server.
167
156
 
168
157
  ## Reset
169
158
 
170
- To wipe dashboard state without touching real run data:
159
+ To rotate the auth token, delete the token file and restart the server — a
160
+ restart alone reuses the existing token:
171
161
 
172
162
  ```sh
173
- # Forget all known autoloops (council/forge unchanged).
174
- rm ~/.claw-orchestrator/autoloop-registry.jsonl
175
-
176
- # Force the standalone server to mint a fresh auth token.
163
+ rm ~/.openclaw/server-token
177
164
  launchctl kickstart -k "gui/$(id -u)/com.clawo.serve"
178
165
  # Then visit /login?token=$(cat ~/.openclaw/server-token)&redirect=/dash once
179
166
  # to refresh the cookie.
180
167
  ```
181
168
 
182
- ## Runs tab (6.0.0)
169
+ ## Runs tab
183
170
 
184
- A fourth tab listing durable workflow runs. Because runs are checkpointed to
171
+ Lists durable workflow runs. Because runs are checkpointed to
185
172
  disk, this sees runs started by other processes and by earlier sessions, not just
186
173
  what the current server started.
187
174
 
@@ -7,7 +7,7 @@
7
7
  ```bash
8
8
  npm install -g @enderfga/claw-orchestrator
9
9
 
10
- # Start the embedded server
10
+ # Start the embedded server (keeps running; use a second terminal for the commands below)
11
11
  clawo serve
12
12
 
13
13
  # Drive sessions from the command line
@@ -32,7 +32,7 @@ Agents automatically get access to all session, council, and management tools.
32
32
  ```typescript
33
33
  import { SessionManager } from '@enderfga/claw-orchestrator';
34
34
 
35
- const manager = new SessionManager({ defaultModel: 'claude-sonnet-4-6' });
35
+ const manager = new SessionManager({ defaultModel: 'claude-sonnet-5' });
36
36
 
37
37
  const session = await manager.startSession({
38
38
  name: 'backend-fix',
@@ -53,6 +53,8 @@ await manager.stopSession('backend-fix');
53
53
  - **OpenClaw >= 2026.3.0** — for plugin mode (optional)
54
54
  - **OpenAI Codex CLI >= 0.112** — `npm install -g @openai/codex` (optional, for codex engine)
55
55
  - **Antigravity CLI** — `curl -fsSL https://antigravity.google/cli/install.sh | bash` (optional, for the `agy` engine — Google's successor to the sunset Gemini CLI)
56
+ - **Grok Build CLI** — optional, for the `grok` engine
57
+ - **OpenCode CLI** — `npm install -g opencode-ai` (optional, for the `opencode` engine)
56
58
 
57
59
  ### Engine Authentication
58
60
 
@@ -61,18 +63,20 @@ Each engine requires its own authentication before use:
61
63
  - **Claude Code** — run `claude /login` or set `ANTHROPIC_API_KEY`
62
64
  - **Codex** — run `codex login` or set `OPENAI_API_KEY`
63
65
  - **Antigravity** — run `agy` once and complete the Google OAuth login
66
+ - **Grok** — run `grok` once and sign in (grok.com account or `XAI_API_KEY`)
67
+ - **OpenCode** — run `opencode auth login`, or set a provider key such as `ANTHROPIC_API_KEY`
64
68
 
65
69
  The plugin does not manage authentication — it expects each CLI to be ready to run.
66
70
 
67
71
  ### Embedded Server Authentication
68
72
 
69
- The embedded HTTP server (used by CLI and standalone mode) optionally supports bearer token authentication:
73
+ Authentication on the embedded HTTP server (used by the CLI and standalone mode) is on by default:
70
74
 
71
- | Variable | Purpose |
72
- | ----------------------- | ------------------------------------------------------------------------------------------------------------- |
73
- | `OPENCLAW_SERVER_TOKEN` | Set to enable bearer token auth. All requests (except `/health`) must include `Authorization: Bearer <token>` |
75
+ | Variable | Purpose |
76
+ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
77
+ | `OPENCLAW_SERVER_TOKEN` | Unset: a random token is generated. Set to a value: use that token. Set to `disabled`: turn auth off (single-user hosts only) |
74
78
 
75
- When set, the token is also written to `~/.openclaw/server-token` for the CLI to read automatically. Default: no auth (localhost binding is the primary security boundary).
79
+ On start the server writes the token to `~/.openclaw/server-token` (mode 0600) and reuses it across restarts; the CLI reads it automatically. Every request except `/health` must carry it as `Authorization: Bearer <token>` or the `clawo_auth` cookie. Browsers sign in once via `/login?token=<token>&redirect=/dashboard`, which sets the cookie.
76
80
 
77
81
  ### OpenAI-Compatible Endpoint
78
82
 
@@ -83,11 +87,11 @@ The server exposes an OpenAI-compatible API at `/v1/chat/completions`. It serves
83
87
 
84
88
  Quick config for any client:
85
89
 
86
- | Setting | Value |
87
- | ------------ | -------------------------------------------------------------------------------- |
88
- | API Base URL | `http://127.0.0.1:18796/v1` |
89
- | API Key | The value of `OPENCLAW_SERVER_TOKEN`, or any string if auth is disabled |
90
- | Model | `claude-fable-5`, `claude-opus-5`, `claude-sonnet-5`, `gpt-5.5`, `agy-pro`, etc. |
90
+ | Setting | Value |
91
+ | ------------ | ------------------------------------------------------------------------------------- |
92
+ | API Base URL | `http://127.0.0.1:18796/v1` |
93
+ | API Key | The server token (from `~/.openclaw/server-token`), or any string if auth is disabled |
94
+ | Model | `claude-fable-5-1`, `claude-opus-5-5`, `claude-sonnet-5`, `gpt-5.5`, `agy-pro`, etc. |
91
95
 
92
96
  See [openai-compat.md](./openai-compat.md) for the full session-keying rules, `X-Session-Reset` semantics, the legacy-heuristic env var, and the `/v1/sessions` inspection endpoint.
93
97
 
@@ -124,8 +128,10 @@ In `~/.openclaw/openclaw.json`:
124
128
 
125
129
  - [Sessions](./sessions.md) — persistent session lifecycle and management
126
130
  - [Session Inbox](./inbox.md) — cross-session messaging
127
- - [Multi-Engine](./multi-engine.md) — using Claude Code and Codex side by side
131
+ - [Multi-Engine](./multi-engine.md) — one interface over Claude Code, Codex, Antigravity, Grok Build, OpenCode and custom CLIs
128
132
  - [Council](./council.md) — multi-agent collaboration with consensus voting
129
133
  - [Ultraplan & Ultrareview](./ultra.md) — deep planning and fleet code review
130
- - [Tools Reference](./tools.md) — complete tool API reference (27 tools)
134
+ - [Tools Reference](./tools.md) — complete tool API reference (78 tools)
131
135
  - [CLI Reference](./cli.md) — command-line interface
136
+ - [MCP Server](./mcp.md) — expose the tools to any MCP host
137
+ - [ACP Agent](./acp.md) — run the orchestrator as an Agent Client Protocol agent
@@ -1,6 +1,6 @@
1
1
  # Session Inbox
2
2
 
3
- Cross-session messaging allows different sessions to communicate with each other. Inspired by Claude Code's UDS Inbox feature.
3
+ Cross-session messaging allows different sessions to communicate with each other.
4
4
 
5
5
  ## How It Works
6
6
 
@@ -21,7 +21,9 @@ Session A (planner) SessionManager Session B (coder)
21
21
  - **Idle sessions** receive messages immediately as a new user turn
22
22
  - **Busy sessions** have messages queued in an inbox (max 200 messages)
23
23
  - Messages are wrapped in `<cross-session-message>` XML tags
24
- - Supports broadcast to all sessions via `to: "*"`
24
+ - Supports broadcast to all sessions via `to: "*"`; a broadcast skips the sender
25
+ - Sender and target must be existing sessions, otherwise the call fails
26
+ - Returns `{ delivered, queued }`
25
27
 
26
28
  ## Usage
27
29
 
@@ -72,10 +74,10 @@ The auth module needs rate limiting. Please add a token bucket...
72
74
  </cross-session-message>
73
75
  ```
74
76
 
75
- Attributes are properly escaped to prevent XML injection.
77
+ Attribute values are XML-escaped, and any `cross-session-message` tag inside the body is escaped, so a sender cannot forge a second envelope.
76
78
 
77
79
  ## Inbox Limits
78
80
 
79
81
  - **Max size**: 200 messages per session
80
82
  - **Eviction**: oldest read messages dropped first, then oldest unread
81
- - **No TTL**: messages persist until read or evicted (in-memory only, not persisted to disk)
83
+ - **No TTL**: messages, read or unread, stay in memory until evicted or the process exits. They are not persisted to disk.
@@ -1,6 +1,6 @@
1
1
  # MCP integration
2
2
 
3
- Claw Orchestrator ships a Model Context Protocol (MCP) server (`clawo-mcp`) so any MCP-compatible host can drive its 55 tools.
3
+ Claw Orchestrator ships a Model Context Protocol (MCP) server (`clawo-mcp`) so any MCP-compatible host can drive its 78 tools.
4
4
 
5
5
  This document covers:
6
6
 
@@ -29,17 +29,22 @@ This document covers:
29
29
 
30
30
  Tools fall into a few groups:
31
31
 
32
- | Group | Examples |
33
- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
34
- | Session lifecycle | `session_start`, `session_send`, `session_stop`, `session_list`, `session_grep`, `session_compact`, `session_update_tools`, `session_switch_model` |
35
- | Cross-session messaging | `session_send_to`, `session_inbox`, `session_deliver_inbox` |
36
- | Status / introspection | `sessions_overview`, `coding_session_status`, `coding_agents_list` |
37
- | Multi-agent council | `council_start`, `council_status`, `council_abort`, `council_inject`, `council_review`, `council_accept`, `council_reject` |
38
- | Ultraplan / ultrareview | `ultraplan_start`, `ultraplan_status`, `ultrareview_start`, `ultrareview_status` |
39
- | Autoloop | `autoloop_start`, `autoloop_chat`, `autoloop_status`, `autoloop_list`, `autoloop_reset_agent`, `autoloop_stop` |
40
- | Codex specifics | `codex_resume`, `codex_review`, `codex_goal_set`, `codex_goal_get`, `codex_goal_pause`, `codex_goal_resume`, `codex_goal_clear` |
41
- | Agent teams | `team_list`, `team_send` |
42
- | Maintenance | `project_purge` |
32
+ | Group | Examples |
33
+ | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
34
+ | Session lifecycle | `session_start`, `session_send`, `session_handoff`, `session_stop`, `session_list`, `session_grep`, `session_compact`, `session_update_tools`, `session_switch_model` |
35
+ | Cross-session messaging | `session_send_to`, `session_inbox`, `session_deliver_inbox` |
36
+ | Status / introspection | `sessions_overview`, `coding_session_status`, `coding_agents_list` |
37
+ | Multi-agent council | `council_start`, `council_status`, `council_abort`, `council_inject`, `council_review`, `council_accept`, `council_reject` |
38
+ | Ultraplan / ultrareview | `ultraplan_start`, `ultraplan_status`, `ultrareview_start`, `ultrareview_status` |
39
+ | Autoloop | `autoloop_start`, `autoloop_chat`, `autoloop_status`, `autoloop_list`, `autoloop_reset_agent`, `autoloop_stop` |
40
+ | Codex specifics | `codex_resume`, `codex_review`, `codex_goal_set`, `codex_goal_get`, `codex_goal_pause`, `codex_goal_resume`, `codex_goal_clear` |
41
+ | Codex app-server | `codex_interrupt`, `codex_steer`, `codex_fork`, `codex_rollback`, `codex_models`, `codex_thread_list` |
42
+ | Claude specifics | `claude_goal_set`, `claude_goal_status`, `claude_goal_clear`, `claude_agents_list`, `plugin_details` |
43
+ | Fan-out | `fanout_start`, `fanout_status`, `fanout_abort` |
44
+ | Workflow & verification | `workflow_start`, `workflow_status`, `workflow_list`, `workflow_resume`, `workflow_cancel`, `workflow_steer`, `workflow_approve`, `verify_run` |
45
+ | Ultraapp | `ultraapp_*` (14 tools) — see [`ultraapp.md`](./ultraapp.md) |
46
+ | Agent teams | `team_list`, `team_send` |
47
+ | Maintenance | `project_purge` |
43
48
 
44
49
  Full per-tool parameter documentation lives in [`tools.md`](./tools.md).
45
50
 
@@ -47,7 +52,7 @@ Install once:
47
52
 
48
53
  ```bash
49
54
  npm install -g @enderfga/claw-orchestrator
50
- # `clawo-mcp` is on PATH; the OpenClaw `clawo` CLI is also installed
55
+ # `clawo-mcp` is on PATH; the `clawo` CLI is also installed
51
56
  ```
52
57
 
53
58
  When invoked, `clawo-mcp`:
@@ -214,22 +219,22 @@ Check your host's MCP docs for the exact key names (`command`/`cmd`, `env`/`envs
214
219
 
215
220
  Hosts deliberately do not forward your full shell environment to MCP subprocesses. Pass every variable your engines need explicitly under the host's `env` block.
216
221
 
217
- | Variable | Used by |
218
- | -------------------------------------- | -------------------------------------------------------------------------- |
219
- | `ANTHROPIC_API_KEY` | Claude Code engine |
220
- | `OPENAI_API_KEY` | Codex engine |
221
- | `GEMINI_API_KEY` (or `GOOGLE_API_KEY`) | Gemini engine |
222
- | `GATEWAY_URL`, `GATEWAY_KEY` | Routing through an OpenClaw / Anthropic-style gateway |
223
- | `CLAWO_MCP_TOOLS` | Comma-separated allowlist of tool names; unlisted tools are not advertised |
224
- | `CLAWO_NO_EMBEDDED_SERVER` | Suppresses port 18796 binding. `clawo-mcp` sets this automatically |
222
+ | Variable | Used by |
223
+ | ---------------------------- | -------------------------------------------------------------------------- |
224
+ | `ANTHROPIC_API_KEY` | Claude Code engine |
225
+ | `OPENAI_API_KEY` | Codex engine |
226
+ | `GEMINI_API_KEY` | Multi-model proxy (Gemini models) |
227
+ | `GATEWAY_URL`, `GATEWAY_KEY` | Routing through an OpenClaw / Anthropic-style gateway |
228
+ | `CLAWO_MCP_TOOLS` | Comma-separated allowlist of tool names; unlisted tools are not advertised |
229
+ | `CLAWO_NO_EMBEDDED_SERVER` | Suppresses port 18796 binding. `clawo-mcp` sets this automatically |
225
230
 
226
- The engines themselves (`claude`, `codex`, `gemini`, `agy`, `agent`, `opencode`) must also be installed and authenticated on the host machine — `clawo-mcp` spawns them as subprocesses, it does not bundle them.
231
+ The engines themselves (`claude`, `codex`, `agy`, `grok`, `opencode`) must also be installed and authenticated on the host machine — `clawo-mcp` spawns them as subprocesses, it does not bundle them.
227
232
 
228
233
  ---
229
234
 
230
235
  ## Tool filtering
231
236
 
232
- 55 tools is a lot for a small context window. Reduce noise either at the host level (most hosts have an `include` / `exclude` filter — see Hermes example above) or at the server level via `CLAWO_MCP_TOOLS`:
237
+ 78 tools is a lot for a small context window. Reduce noise either at the host level (most hosts have an `include` / `exclude` filter — see Hermes example above) or at the server level via `CLAWO_MCP_TOOLS`:
233
238
 
234
239
  ```bash
235
240
  CLAWO_MCP_TOOLS="session_start,session_send,session_stop,council_start,council_status" clawo-mcp
@@ -272,7 +277,7 @@ For "let the model commission an ultrareview before merging":
272
277
 
273
278
  **Engine starts but fails with `command not found`**
274
279
 
275
- - The underlying coding CLI (`claude`, `codex`, `gemini`, etc.) is not on PATH in the host's subprocess environment. Either install globally or set `claudeBin` / `codexBin` etc. via `customEngine.bin` per session, or pass an explicit `PATH` in the host's `env` block.
280
+ - The underlying coding CLI (`claude`, `codex`, `agy`, etc.) is not on PATH in the host's subprocess environment. Either install globally, pass an explicit `PATH` in the host's `env` block, or point at the binary with `CLAUDE_BIN` / `CODEX_BIN` / `AGY_BIN` / `GROK_BIN` / `OPENCODE_BIN`.
276
281
 
277
282
  **`401` / `auth` errors from a session**
278
283