@enderfga/claw-orchestrator 7.5.3 → 7.5.4
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/README.md +21 -22
- package/configs/engines/README.md +7 -6
- package/dist/bin/cli.js +1 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/acp-server.d.ts +1 -1
- package/dist/src/acp-server.js +7 -5
- package/dist/src/acp-server.js.map +1 -1
- package/dist/src/autoloop/notify.d.ts +5 -7
- package/dist/src/autoloop/notify.js +21 -20
- package/dist/src/autoloop/notify.js.map +1 -1
- package/dist/src/embedded-server.js +7 -4
- package/dist/src/embedded-server.js.map +1 -1
- package/dist/src/fanout.d.ts +6 -0
- package/dist/src/fanout.js +1 -0
- package/dist/src/fanout.js.map +1 -1
- package/dist/src/index.js +19 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/kernel/nodes/fanout.js +1 -0
- package/dist/src/kernel/nodes/fanout.js.map +1 -1
- package/dist/src/kernel/types.d.ts +2 -0
- package/dist/src/kernel/types.js.map +1 -1
- package/dist/src/openai-compat.d.ts +2 -2
- package/dist/src/openai-compat.js +5 -2
- package/dist/src/openai-compat.js.map +1 -1
- package/dist/src/session-manager.js +14 -5
- package/dist/src/session-manager.js.map +1 -1
- package/dist/src/types.d.ts +2 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/skills/SKILL.md +31 -32
- package/skills/references/acp.md +19 -36
- package/skills/references/autoloop.md +158 -180
- package/skills/references/claude-cli-tracking.md +27 -27
- package/skills/references/cli.md +62 -79
- package/skills/references/council.md +40 -63
- package/skills/references/dashboard.md +42 -55
- package/skills/references/getting-started.md +20 -14
- package/skills/references/inbox.md +6 -4
- package/skills/references/mcp.md +29 -24
- package/skills/references/multi-engine.md +105 -153
- package/skills/references/observability.md +42 -32
- package/skills/references/openai-compat.md +169 -303
- package/skills/references/sessions.md +20 -29
- package/skills/references/tools.md +62 -76
- package/skills/references/ultra.md +17 -16
- package/skills/references/ultraapp.md +59 -64
- package/skills/references/verification.md +29 -52
- package/skills/references/workflow.md +37 -104
- 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` |
|
|
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
|
|
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
|
|
201
|
-
|
|
|
202
|
-
| §0
|
|
203
|
-
| §1
|
|
204
|
-
| §2 Parallel Coordination
|
|
205
|
-
| §3 Truth in Git
|
|
206
|
-
| §4
|
|
207
|
-
| §5 Cross-Review
|
|
208
|
-
| §6
|
|
209
|
-
| §7 Action Over Words
|
|
210
|
-
| §8 Efficient Tool Use
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
`consensusVotes`, each with the parse `source` (`strict` / `variant` / `none`)
|
|
236
|
-
a loosely
|
|
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
|
-
|
|
239
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
267
|
-
|
|
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
|
-
|
|
272
|
-
|
|
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`
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
283
|
-
|
|
284
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
69
|
-
to `~/.openclaw/server-token` (mode 0600). Same-user
|
|
70
|
-
read it and present it as `Authorization: Bearer <token>`
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
107
|
-
process that
|
|
108
|
-
The token is
|
|
109
|
-
|
|
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)
|
|
117
|
-
|
|
118
|
-
|
|
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.
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
the
|
|
141
|
-
|
|
142
|
-
|
|
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
|
|
159
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
169
|
+
## Runs tab
|
|
183
170
|
|
|
184
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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) —
|
|
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 (
|
|
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.
|
|
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
|
-
|
|
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
|
|
83
|
+
- **No TTL**: messages, read or unread, stay in memory until evicted or the process exits. They are not persisted to disk.
|
package/skills/references/mcp.md
CHANGED
|
@@ -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
|
|
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
|
-
|
|
|
42
|
-
|
|
|
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
|
|
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
|
|
218
|
-
|
|
|
219
|
-
| `ANTHROPIC_API_KEY`
|
|
220
|
-
| `OPENAI_API_KEY`
|
|
221
|
-
| `GEMINI_API_KEY`
|
|
222
|
-
| `GATEWAY_URL`, `GATEWAY_KEY`
|
|
223
|
-
| `CLAWO_MCP_TOOLS`
|
|
224
|
-
| `CLAWO_NO_EMBEDDED_SERVER`
|
|
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`, `
|
|
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
|
-
|
|
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`, `
|
|
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
|
|