@enderfga/claw-orchestrator 7.14.0 → 7.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -135
- package/configs/autoloop-reviewer-prompt.md +1 -1
- package/configs/engines/README.md +31 -11
- package/dist/bin/acp-server.js +7 -12
- package/dist/bin/acp-server.js.map +1 -1
- package/dist/bin/cli.js +84 -46
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/mcp-server.js +2 -54
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/src/acp-server.d.ts +17 -9
- package/dist/src/acp-server.js +149 -30
- package/dist/src/acp-server.js.map +1 -1
- package/dist/src/autoloop/agent-tools.d.ts +2 -0
- package/dist/src/autoloop/agent-tools.js +7 -0
- package/dist/src/autoloop/agent-tools.js.map +1 -1
- package/dist/src/autoloop/dispatcher.d.ts +6 -0
- package/dist/src/autoloop/dispatcher.js +72 -9
- package/dist/src/autoloop/dispatcher.js.map +1 -1
- package/dist/src/autoloop/planner-tools.js +2 -0
- package/dist/src/autoloop/planner-tools.js.map +1 -1
- package/dist/src/claude-goal-session.d.ts +147 -0
- package/dist/src/claude-goal-session.js +355 -0
- package/dist/src/claude-goal-session.js.map +1 -0
- package/dist/src/council.d.ts +8 -0
- package/dist/src/council.js +45 -12
- package/dist/src/council.js.map +1 -1
- package/dist/src/dashboard/index.html +28 -14
- package/dist/src/embedded-server.js +27 -8
- package/dist/src/embedded-server.js.map +1 -1
- package/dist/src/engine-spawn.js +3 -1
- package/dist/src/engine-spawn.js.map +1 -1
- package/dist/src/fanout.d.ts +13 -3
- package/dist/src/fanout.js +10 -0
- package/dist/src/fanout.js.map +1 -1
- package/dist/src/inbox-manager.d.ts +9 -0
- package/dist/src/inbox-manager.js +8 -2
- package/dist/src/inbox-manager.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +135 -53
- package/dist/src/index.js.map +1 -1
- package/dist/src/kernel/agent-step.d.ts +6 -0
- package/dist/src/kernel/agent-step.js.map +1 -1
- package/dist/src/kernel/conditions.d.ts +1 -1
- package/dist/src/kernel/conditions.js +1 -1
- package/dist/src/kernel/engine.d.ts +28 -8
- package/dist/src/kernel/engine.js +93 -19
- package/dist/src/kernel/engine.js.map +1 -1
- package/dist/src/kernel/nodes/agent.js +2 -0
- package/dist/src/kernel/nodes/agent.js.map +1 -1
- package/dist/src/kernel/nodes/council.js +9 -4
- package/dist/src/kernel/nodes/council.js.map +1 -1
- package/dist/src/kernel/nodes/fanout.js +5 -0
- package/dist/src/kernel/nodes/fanout.js.map +1 -1
- package/dist/src/kernel/nodes/goal.d.ts +19 -5
- package/dist/src/kernel/nodes/goal.js +81 -34
- package/dist/src/kernel/nodes/goal.js.map +1 -1
- package/dist/src/kernel/nodes/subflow.js +9 -1
- package/dist/src/kernel/nodes/subflow.js.map +1 -1
- package/dist/src/kernel/nodes/ultraapp.d.ts +1 -0
- package/dist/src/kernel/nodes/ultraapp.js +1 -0
- package/dist/src/kernel/nodes/ultraapp.js.map +1 -1
- package/dist/src/kernel/nodes/verifier.js +5 -1
- package/dist/src/kernel/nodes/verifier.js.map +1 -1
- package/dist/src/kernel/projections.d.ts +1 -0
- package/dist/src/kernel/projections.js +7 -1
- package/dist/src/kernel/projections.js.map +1 -1
- package/dist/src/kernel/templates/index.d.ts +16 -11
- package/dist/src/kernel/templates/index.js +14 -8
- package/dist/src/kernel/templates/index.js.map +1 -1
- package/dist/src/kernel/types.d.ts +37 -13
- package/dist/src/kernel/types.js.map +1 -1
- package/dist/src/logger.d.ts +6 -0
- package/dist/src/logger.js +14 -0
- package/dist/src/logger.js.map +1 -1
- package/dist/src/mcp-annotations.d.ts +13 -0
- package/dist/src/mcp-annotations.js +100 -0
- package/dist/src/mcp-annotations.js.map +1 -0
- package/dist/src/models.d.ts +7 -0
- package/dist/src/models.js +9 -0
- package/dist/src/models.js.map +1 -1
- package/dist/src/openai-compat.d.ts +11 -5
- package/dist/src/openai-compat.js +55 -54
- package/dist/src/openai-compat.js.map +1 -1
- package/dist/src/persistent-acp-session.d.ts +7 -0
- package/dist/src/persistent-acp-session.js +26 -2
- package/dist/src/persistent-acp-session.js.map +1 -1
- package/dist/src/persistent-codex-app-session.d.ts +2 -0
- package/dist/src/persistent-codex-app-session.js +18 -9
- package/dist/src/persistent-codex-app-session.js.map +1 -1
- package/dist/src/persistent-codex-session.d.ts +14 -3
- package/dist/src/persistent-codex-session.js +22 -19
- package/dist/src/persistent-codex-session.js.map +1 -1
- package/dist/src/persistent-custom-session.d.ts +9 -0
- package/dist/src/persistent-custom-session.js +41 -21
- package/dist/src/persistent-custom-session.js.map +1 -1
- package/dist/src/persistent-grok-session.js +1 -1
- package/dist/src/persistent-grok-session.js.map +1 -1
- package/dist/src/persistent-session.d.ts +9 -0
- package/dist/src/persistent-session.js +23 -0
- package/dist/src/persistent-session.js.map +1 -1
- package/dist/src/run-ledger.d.ts +3 -3
- package/dist/src/session-manager.d.ts +45 -1
- package/dist/src/session-manager.js +199 -34
- package/dist/src/session-manager.js.map +1 -1
- package/dist/src/types.d.ts +34 -11
- package/dist/src/types.js.map +1 -1
- package/dist/src/ultraapp/build.d.ts +5 -11
- package/dist/src/ultraapp/build.js +5 -11
- package/dist/src/ultraapp/build.js.map +1 -1
- package/dist/src/ultraapp/council-adapter.d.ts +5 -2
- package/dist/src/ultraapp/council-adapter.js +6 -6
- package/dist/src/ultraapp/council-adapter.js.map +1 -1
- package/dist/src/ultraapp/files.d.ts +7 -0
- package/dist/src/ultraapp/files.js +7 -1
- package/dist/src/ultraapp/files.js.map +1 -1
- package/dist/src/ultraapp/manager.d.ts +23 -3
- package/dist/src/ultraapp/manager.js +170 -72
- package/dist/src/ultraapp/manager.js.map +1 -1
- package/dist/src/ultraapp/narrator.js +1 -1
- package/dist/src/ultraapp/narrator.js.map +1 -1
- package/dist/src/ultraapp/versions.d.ts +27 -5
- package/dist/src/ultraapp/versions.js +58 -13
- package/dist/src/ultraapp/versions.js.map +1 -1
- package/openclaw.plugin.json +4 -13
- package/package.json +13 -6
- package/skills/SKILL.md +52 -24
- package/skills/references/acp.md +140 -61
- package/skills/references/autoloop.md +148 -38
- package/skills/references/claude-cli-tracking.md +9 -6
- package/skills/references/cli.md +139 -108
- package/skills/references/council.md +44 -22
- package/skills/references/dashboard.md +37 -21
- package/skills/references/getting-started.md +49 -15
- package/skills/references/inbox.md +13 -8
- package/skills/references/mcp.md +25 -17
- package/skills/references/multi-engine.md +161 -145
- package/skills/references/observability.md +90 -58
- package/skills/references/openai-compat.md +172 -82
- package/skills/references/sessions.md +101 -65
- package/skills/references/tools.md +217 -158
- package/skills/references/ultra.md +7 -7
- package/skills/references/ultraapp.md +101 -56
- package/skills/references/verification.md +112 -56
- package/skills/references/workflow.md +275 -97
- package/assets/banner.jpg +0 -0
package/dist/src/index.js
CHANGED
|
@@ -22,12 +22,14 @@ export { SessionManager } from './session-manager.js';
|
|
|
22
22
|
export { PersistentClaudeSession } from './persistent-session.js';
|
|
23
23
|
export { BaseOneShotSession } from './base-oneshot-session.js';
|
|
24
24
|
export { PersistentCodexSession } from './persistent-codex-session.js';
|
|
25
|
+
export { PersistentCodexAppServerSession } from './persistent-codex-app-session.js';
|
|
25
26
|
export { PersistentGeminiSession } from './persistent-gemini-session.js';
|
|
26
27
|
export { PersistentAgySession } from './persistent-agy-session.js';
|
|
27
28
|
export { PersistentCursorSession } from './persistent-cursor-session.js';
|
|
28
29
|
export { PersistentGrokSession } from './persistent-grok-session.js';
|
|
29
30
|
export { PersistentOpencodeSession } from './persistent-opencode-session.js';
|
|
30
31
|
export { PersistentCustomSession } from './persistent-custom-session.js';
|
|
32
|
+
export { PersistentAcpSession } from './persistent-acp-session.js';
|
|
31
33
|
export { Council, getDefaultCouncilConfig } from './council.js';
|
|
32
34
|
export { AutoloopRunner } from './autoloop/runner.js';
|
|
33
35
|
export { ClaudeAgentDispatcher } from './autoloop/dispatcher.js';
|
|
@@ -71,6 +73,16 @@ const ACP_AGENT_SCHEMA = {
|
|
|
71
73
|
},
|
|
72
74
|
],
|
|
73
75
|
};
|
|
76
|
+
/**
|
|
77
|
+
* `acpAgent` on the surfaces that write their agents into a stored run spec
|
|
78
|
+
* (fan-out, council, workflow templates): a preset id only. An inline config can
|
|
79
|
+
* carry an environment, and the spec is written to disk.
|
|
80
|
+
*/
|
|
81
|
+
const AUTOLOOP_ENGINES = ENGINE_TYPES.filter((e) => e !== 'acp');
|
|
82
|
+
const ACP_AGENT_ID_SCHEMA = {
|
|
83
|
+
type: 'string',
|
|
84
|
+
description: 'With engine "acp": the id of a bundled ACP agent preset (`clawo engines`), such as kimi-code or dsh.',
|
|
85
|
+
};
|
|
74
86
|
const CUSTOM_ENGINE_SCHEMA = {
|
|
75
87
|
type: 'object',
|
|
76
88
|
description: 'Custom engine config (required when the corresponding engine is "custom").',
|
|
@@ -118,13 +130,23 @@ const CUSTOM_ENGINE_SCHEMA = {
|
|
|
118
130
|
},
|
|
119
131
|
required: ['name', 'bin', 'args'],
|
|
120
132
|
};
|
|
133
|
+
/**
|
|
134
|
+
* `customEngine` on the surfaces that also take a preset id: session_start,
|
|
135
|
+
* session_handoff and council agents all reach `_createSession`, which expands a
|
|
136
|
+
* string through resolveCustomEngine. Autoloop roles validate an inline config
|
|
137
|
+
* and take CUSTOM_ENGINE_SCHEMA itself.
|
|
138
|
+
*/
|
|
139
|
+
const CUSTOM_ENGINE_OR_PRESET_SCHEMA = {
|
|
140
|
+
description: 'Custom engine (required when engine is "custom"): the id of a bundled preset (`clawo engines`), or, from a local caller only, an inline config.',
|
|
141
|
+
oneOf: [{ type: 'string', description: 'Preset id, e.g. "zcode"' }, CUSTOM_ENGINE_SCHEMA],
|
|
142
|
+
};
|
|
121
143
|
/**
|
|
122
144
|
* OpenClaw plugin object — standard format
|
|
123
145
|
*/
|
|
124
146
|
const plugin = {
|
|
125
147
|
id: 'claw-orchestrator',
|
|
126
148
|
name: 'Claw Orchestrator',
|
|
127
|
-
description: 'Run Claude Code, Codex, Antigravity, Grok Build, OpenCode and custom coding CLIs as one unified runtime — persistent sessions, multi-agent council, worktree isolation, multi-model proxy',
|
|
149
|
+
description: 'Run Claude Code, Codex, Antigravity, Grok Build, OpenCode, any ACP agent and custom coding CLIs as one unified runtime — persistent sessions, multi-agent council, worktree isolation, multi-model proxy',
|
|
128
150
|
register(api) {
|
|
129
151
|
const rawConfig = (api.pluginConfig || {});
|
|
130
152
|
const registerTool = (definition) => {
|
|
@@ -216,7 +238,7 @@ const plugin = {
|
|
|
216
238
|
engine: {
|
|
217
239
|
type: 'string',
|
|
218
240
|
enum: ENGINE_TYPES,
|
|
219
|
-
description: 'Engine to use (default: claude). codex = `codex exec` per send (no /goal). codex-app = long-running `codex app-server` with /goal support. agy = Google Antigravity CLI (
|
|
241
|
+
description: 'Engine to use (default: claude). codex = `codex exec` per send (no /goal). codex-app = long-running `codex app-server` with /goal support. agy = Google Antigravity CLI (stream-json output with reported token usage; the conversation is resumed by its id on each send). grok = xAI Grok Build CLI (reports its own per-turn cost). opencode = sst/opencode CLI (provider-agnostic; pass model as `provider/model`). acp = any Agent Client Protocol agent, chosen with acpAgent. Use "custom" with customEngine config for any CLI. gemini and cursor are legacy, kept for existing callers: use agy and grok instead.',
|
|
220
242
|
},
|
|
221
243
|
model: { type: 'string', description: 'Model to use (opus, sonnet, haiku, gpt-5.5, agy-pro, etc.)' },
|
|
222
244
|
permissionMode: {
|
|
@@ -231,6 +253,16 @@ const plugin = {
|
|
|
231
253
|
description: 'Tools to auto-approve',
|
|
232
254
|
},
|
|
233
255
|
disallowedTools: { type: 'array', maxItems: 200, items: { type: 'string' }, description: 'Tools to deny' },
|
|
256
|
+
tools: {
|
|
257
|
+
type: ['string', 'array'],
|
|
258
|
+
items: { type: 'string' },
|
|
259
|
+
description: 'Claude engine only. The built-in tool set (`--tools`): names such as ["Bash", "Edit", "Read"], "" for none, or "default".',
|
|
260
|
+
},
|
|
261
|
+
addDir: {
|
|
262
|
+
type: 'array',
|
|
263
|
+
items: { type: 'string' },
|
|
264
|
+
description: 'Directories the session may use besides cwd (`--add-dir`). Claude and Codex; a resumed Codex thread keeps the directories its first turn opened.',
|
|
265
|
+
},
|
|
234
266
|
maxTurns: { type: 'number', description: 'Max agent loop turns' },
|
|
235
267
|
maxBudgetUsd: { type: 'number', description: 'Max API spend (USD)' },
|
|
236
268
|
autoCompactPercent: {
|
|
@@ -260,14 +292,24 @@ const plugin = {
|
|
|
260
292
|
description: 'MCP server config file(s)',
|
|
261
293
|
},
|
|
262
294
|
settings: { type: 'string', description: 'Settings.json path or inline JSON' },
|
|
295
|
+
pluginUrl: {
|
|
296
|
+
type: ['string', 'array'],
|
|
297
|
+
items: { type: 'string' },
|
|
298
|
+
description: 'Claude engine only. Plugin .zip URL(s) fetched for this session only (`--plugin-url`).',
|
|
299
|
+
},
|
|
263
300
|
ultracode: {
|
|
264
301
|
type: 'boolean',
|
|
265
|
-
description: 'Claude engine only. Enable "ultracode" / dynamic workflows: Claude plans a JS orchestration script per substantive task and fans out to subagents. Injected as the ultracode:true settings key (not a --effort value).',
|
|
302
|
+
description: 'Claude engine only. Enable "ultracode" / dynamic workflows: Claude plans a JS orchestration script per substantive task and fans out to subagents. Injected as the ultracode:true settings key (not a --effort value). A workflow runs in the background: session_send returns the launch reply, and the completion arrives later in a turn that no send returns.',
|
|
266
303
|
},
|
|
267
304
|
sandboxMode: {
|
|
268
305
|
type: 'string',
|
|
269
306
|
enum: ['read-only', 'workspace-write', 'danger-full-access'],
|
|
270
|
-
description: 'Sandbox policy. Codex supports all values
|
|
307
|
+
description: 'Sandbox policy. Codex supports all values (default workspace-write). read-only is enforced on claude, agy, grok and opencode through their own plan/read-only modes; a custom engine must map it via permissionModes or the session refuses to start. The acp engine refuses read-only, because the agent runs its own tools; its permission answers follow permissionMode.',
|
|
308
|
+
},
|
|
309
|
+
launcher: {
|
|
310
|
+
type: 'array',
|
|
311
|
+
items: { type: 'string' },
|
|
312
|
+
description: 'Argv prefix every engine process of this session runs under, e.g. a sandbox wrapper: ["/opt/sandbox.sh", "task"]. Any engine. It runs with your authority, like a contract command check.',
|
|
271
313
|
},
|
|
272
314
|
codexProfile: {
|
|
273
315
|
type: 'string',
|
|
@@ -356,11 +398,11 @@ const plugin = {
|
|
|
356
398
|
enum: ['default', 'flex', 'priority'],
|
|
357
399
|
description: 'AWS Bedrock service tier (sets ANTHROPIC_BEDROCK_SERVICE_TIER). Only effective when routing through Bedrock.',
|
|
358
400
|
},
|
|
359
|
-
customEngine:
|
|
401
|
+
customEngine: CUSTOM_ENGINE_OR_PRESET_SCHEMA,
|
|
360
402
|
acpAgent: ACP_AGENT_SCHEMA,
|
|
361
403
|
resumeSessionId: {
|
|
362
404
|
type: 'string',
|
|
363
|
-
description:
|
|
405
|
+
description: "Resume an earlier conversation by the engine's own id instead of starting fresh: a Claude Code session id (`--resume`), a Codex or codex-app thread id, an Antigravity conversation id, a Grok or OpenCode session id, an ACP agent's session id, or a custom engine's id when its config maps a resume flag.",
|
|
364
406
|
},
|
|
365
407
|
},
|
|
366
408
|
},
|
|
@@ -384,9 +426,12 @@ const plugin = {
|
|
|
384
426
|
effort: {
|
|
385
427
|
type: 'string',
|
|
386
428
|
enum: ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'],
|
|
387
|
-
description: 'Effort for this message',
|
|
429
|
+
description: 'Effort for this message. agy, grok and opencode pass it to the engine for this turn; on claude, high and above prefix the message with `ultrathink` (a persistent custom engine does the same for high and max). Other engines ignore it.',
|
|
430
|
+
},
|
|
431
|
+
plan: {
|
|
432
|
+
type: 'boolean',
|
|
433
|
+
description: 'Ask for a plan only: claude and persistent custom engines prefix the message with a plan-only instruction. The permission mode is unchanged (start with sandboxMode read-only to enforce it); other engines ignore this flag.',
|
|
388
434
|
},
|
|
389
|
-
plan: { type: 'boolean', description: 'Enable plan mode' },
|
|
390
435
|
timeout: { type: 'number', description: 'Timeout in ms (default 300000)' },
|
|
391
436
|
stream: {
|
|
392
437
|
type: 'boolean',
|
|
@@ -440,7 +485,8 @@ const plugin = {
|
|
|
440
485
|
type: 'number',
|
|
441
486
|
description: 'Upper bound on the carried history, in characters (default 240000, minimum 4000). When the conversation is longer, the opening request and the newest turns are kept and the turns between them are left out.',
|
|
442
487
|
},
|
|
443
|
-
customEngine:
|
|
488
|
+
customEngine: CUSTOM_ENGINE_OR_PRESET_SCHEMA,
|
|
489
|
+
acpAgent: ACP_AGENT_SCHEMA,
|
|
444
490
|
},
|
|
445
491
|
required: ['name', 'engine'],
|
|
446
492
|
},
|
|
@@ -452,6 +498,7 @@ const plugin = {
|
|
|
452
498
|
message: args.message,
|
|
453
499
|
maxChars: args.maxChars,
|
|
454
500
|
customEngine: args.customEngine,
|
|
501
|
+
acpAgent: args.acpAgent,
|
|
455
502
|
});
|
|
456
503
|
return { ok: true, ...result };
|
|
457
504
|
},
|
|
@@ -459,7 +506,7 @@ const plugin = {
|
|
|
459
506
|
// ─── Tool: session_stop ───────────────────────────────────────────────
|
|
460
507
|
registerTool({
|
|
461
508
|
name: 'session_stop',
|
|
462
|
-
description: 'Stop a persistent coding session',
|
|
509
|
+
description: 'Stop a persistent coding session and remove it from the resume registry, so a later session_start under the same name begins a new conversation',
|
|
463
510
|
parameters: {
|
|
464
511
|
type: 'object',
|
|
465
512
|
properties: { name: { type: 'string', description: 'Session name' } },
|
|
@@ -473,12 +520,11 @@ const plugin = {
|
|
|
473
520
|
// ─── Tool: session_list ───────────────────────────────────────────────
|
|
474
521
|
registerTool({
|
|
475
522
|
name: 'session_list',
|
|
476
|
-
description: 'List
|
|
523
|
+
description: 'List the active coding sessions, and the persisted ones that a session_start under the same name resumes',
|
|
477
524
|
parameters: { type: 'object', properties: {} },
|
|
478
525
|
execute: async (_id) => {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
return { ok: true, sessions: manager.listSessions(), persisted: manager.listPersistedSessions() };
|
|
526
|
+
const m = getManager();
|
|
527
|
+
return { ok: true, sessions: m.listSessions(), persisted: m.listPersistedSessions() };
|
|
482
528
|
},
|
|
483
529
|
});
|
|
484
530
|
// ─── Tool: sessions_overview ──────────────────────────────────────────
|
|
@@ -502,7 +548,7 @@ const plugin = {
|
|
|
502
548
|
// ─── Tool: coding_session_status ──────────────────────────────────────
|
|
503
549
|
registerTool({
|
|
504
550
|
name: 'coding_session_status',
|
|
505
|
-
description: 'Get detailed status of a coding session
|
|
551
|
+
description: 'Get detailed status of a coding session: context %, tokens, cost and spend cap, turns, tool calls, retries, start time and last activity',
|
|
506
552
|
parameters: {
|
|
507
553
|
type: 'object',
|
|
508
554
|
properties: { name: { type: 'string', description: 'Session name' } },
|
|
@@ -516,7 +562,7 @@ const plugin = {
|
|
|
516
562
|
// ─── Tool: session_grep ───────────────────────────────────────────────
|
|
517
563
|
registerTool({
|
|
518
564
|
name: 'session_grep',
|
|
519
|
-
description:
|
|
565
|
+
description: "Search the session's in-memory event history (its 100 most recent events) for a regex pattern, case-insensitive",
|
|
520
566
|
parameters: {
|
|
521
567
|
type: 'object',
|
|
522
568
|
properties: {
|
|
@@ -565,7 +611,7 @@ const plugin = {
|
|
|
565
611
|
// ─── Tool: team_list ──────────────────────────────────────────────────
|
|
566
612
|
registerTool({
|
|
567
613
|
name: 'team_list',
|
|
568
|
-
description:
|
|
614
|
+
description: "List the other active sessions as this session's teammates, with engine, idle/busy/paused state and turn count. Works on every engine; enableAgentTeams is not required.",
|
|
569
615
|
parameters: {
|
|
570
616
|
type: 'object',
|
|
571
617
|
properties: { name: { type: 'string', description: 'Session name' } },
|
|
@@ -579,7 +625,7 @@ const plugin = {
|
|
|
579
625
|
// ─── Tool: team_send ──────────────────────────────────────────────────
|
|
580
626
|
registerTool({
|
|
581
627
|
name: 'team_send',
|
|
582
|
-
description: 'Send a message to
|
|
628
|
+
description: 'Send a message to another active session through the cross-session inbox: delivered now if it is idle, queued if it is busy.',
|
|
583
629
|
parameters: {
|
|
584
630
|
type: 'object',
|
|
585
631
|
properties: {
|
|
@@ -597,7 +643,7 @@ const plugin = {
|
|
|
597
643
|
// ─── Tool: session_update_tools ───────────────────────────────────────
|
|
598
644
|
registerTool({
|
|
599
645
|
name: 'session_update_tools',
|
|
600
|
-
description: 'Update allowedTools or disallowedTools for a running session. Restarts the session process with --resume to apply the new tool constraints while preserving conversation history. Rejects if the session is currently busy.',
|
|
646
|
+
description: 'Update allowedTools or disallowedTools for a running session. Restarts the session process with --resume to apply the new tool constraints while preserving conversation history. Rejects if the session is currently busy. Without merge:true both lists are replaced, so a list you omit is cleared.',
|
|
601
647
|
parameters: {
|
|
602
648
|
type: 'object',
|
|
603
649
|
properties: {
|
|
@@ -657,7 +703,7 @@ const plugin = {
|
|
|
657
703
|
properties: {
|
|
658
704
|
path: {
|
|
659
705
|
type: 'string',
|
|
660
|
-
description:
|
|
706
|
+
description: "Project path to purge (resolved to absolute). Ignored when all=true. Defaults to the orchestrator process's working directory.",
|
|
661
707
|
},
|
|
662
708
|
all: {
|
|
663
709
|
type: 'boolean',
|
|
@@ -784,7 +830,7 @@ const plugin = {
|
|
|
784
830
|
// ─── Tool: codex_review ─────────────────────────────────────────────
|
|
785
831
|
registerTool({
|
|
786
832
|
name: 'codex_review',
|
|
787
|
-
description: 'Run a non-interactive Codex code review (`codex review`). Pick
|
|
833
|
+
description: 'Run a non-interactive Codex code review (`codex review`). Pick at most one diff scope — uncommitted (working-tree changes), base (vs branch), or commit (vs SHA); passing two is an error. Output is plain text — Codex `review` does not emit JSON.',
|
|
788
834
|
parameters: {
|
|
789
835
|
type: 'object',
|
|
790
836
|
properties: {
|
|
@@ -979,7 +1025,7 @@ const plugin = {
|
|
|
979
1025
|
agents: {
|
|
980
1026
|
type: 'array',
|
|
981
1027
|
maxItems: 16,
|
|
982
|
-
description:
|
|
1028
|
+
description: "Agent specs: { name, engine?, model?, effort?, prompt?, persona?, baseUrl?, permissionMode?, sandboxMode?, customEngine?, acpAgent? }. permissionMode uses each engine's own permission handling as in session_start; workers that must not write should set sandboxMode to read-only. sandboxMode uses the same values and per-engine behavior as session_start.",
|
|
983
1029
|
items: {
|
|
984
1030
|
type: 'object',
|
|
985
1031
|
properties: {
|
|
@@ -999,6 +1045,17 @@ const plugin = {
|
|
|
999
1045
|
description: 'Per-agent role instructions prepended to the shared task when no non-empty prompt is supplied.',
|
|
1000
1046
|
},
|
|
1001
1047
|
baseUrl: { type: 'string' },
|
|
1048
|
+
permissionMode: {
|
|
1049
|
+
type: 'string',
|
|
1050
|
+
enum: ['acceptEdits', 'bypassPermissions', 'default', 'manual', 'dontAsk', 'plan', 'auto'],
|
|
1051
|
+
description: "Per-agent permission mode (same values as session_start). Passed through to that engine's own permission handling; see session_start for per-engine mapping.",
|
|
1052
|
+
},
|
|
1053
|
+
sandboxMode: {
|
|
1054
|
+
type: 'string',
|
|
1055
|
+
enum: ['read-only', 'workspace-write', 'danger-full-access'],
|
|
1056
|
+
description: 'Same values and per-engine behavior as session_start. Use read-only for workers that must not write.',
|
|
1057
|
+
},
|
|
1058
|
+
acpAgent: ACP_AGENT_ID_SCHEMA,
|
|
1002
1059
|
},
|
|
1003
1060
|
required: ['name'],
|
|
1004
1061
|
},
|
|
@@ -1013,6 +1070,10 @@ const plugin = {
|
|
|
1013
1070
|
enum: ENGINE_TYPES,
|
|
1014
1071
|
description: 'Engine for the synthesis pass (default claude).',
|
|
1015
1072
|
},
|
|
1073
|
+
synthesisAcpAgent: {
|
|
1074
|
+
...ACP_AGENT_ID_SCHEMA,
|
|
1075
|
+
description: 'With synthesisEngine "acp": the ACP agent preset the synthesis pass starts.',
|
|
1076
|
+
},
|
|
1016
1077
|
agentTimeoutMs: { type: 'number', description: 'Per-agent timeout in ms (default 600000).' },
|
|
1017
1078
|
maxTurnsPerAgent: { type: 'number', description: 'Max agent loop turns (default 30).' },
|
|
1018
1079
|
maxBudgetUsd: { type: 'number', description: 'Per-agent spend cap (USD).' },
|
|
@@ -1027,6 +1088,7 @@ const plugin = {
|
|
|
1027
1088
|
synthesize: args.synthesize,
|
|
1028
1089
|
synthesisModel: args.synthesisModel,
|
|
1029
1090
|
synthesisEngine: args.synthesisEngine,
|
|
1091
|
+
synthesisAcpAgent: args.synthesisAcpAgent,
|
|
1030
1092
|
agentTimeoutMs: args.agentTimeoutMs,
|
|
1031
1093
|
maxTurnsPerAgent: args.maxTurnsPerAgent,
|
|
1032
1094
|
maxBudgetUsd: args.maxBudgetUsd,
|
|
@@ -1071,13 +1133,13 @@ const plugin = {
|
|
|
1071
1133
|
template: {
|
|
1072
1134
|
type: 'string',
|
|
1073
1135
|
enum: ['solve', 'council', 'fanout', 'goal'],
|
|
1074
|
-
description: 'Build a built-in workflow instead of supplying `spec`. `solve` = triage → implement → verify → repair-until-green
|
|
1136
|
+
description: 'Build a built-in workflow instead of supplying `spec`. `solve` = triage → implement → review → verify → repair-until-green. `goal` = a /goal on one Codex thread or Claude Code session (`task` is the objective) → verify → repair on the same thread.',
|
|
1075
1137
|
},
|
|
1076
1138
|
task: { type: 'string', description: 'Task text, when using `template`.' },
|
|
1077
1139
|
agents: {
|
|
1078
1140
|
type: 'array',
|
|
1079
1141
|
maxItems: 16,
|
|
1080
|
-
description: 'Agents for the template: { name, engine?, model?, effort?, persona? }.',
|
|
1142
|
+
description: 'Agents for the template: { name, engine?, model?, effort?, persona?, acpAgent? }.',
|
|
1081
1143
|
items: {
|
|
1082
1144
|
type: 'object',
|
|
1083
1145
|
properties: {
|
|
@@ -1086,6 +1148,7 @@ const plugin = {
|
|
|
1086
1148
|
model: { type: 'string' },
|
|
1087
1149
|
effort: { type: 'string', enum: EFFORT_LEVELS },
|
|
1088
1150
|
persona: { type: 'string' },
|
|
1151
|
+
acpAgent: ACP_AGENT_ID_SCHEMA,
|
|
1089
1152
|
},
|
|
1090
1153
|
required: ['name'],
|
|
1091
1154
|
},
|
|
@@ -1102,6 +1165,7 @@ const plugin = {
|
|
|
1102
1165
|
model: { type: 'string' },
|
|
1103
1166
|
effort: { type: 'string', enum: EFFORT_LEVELS },
|
|
1104
1167
|
persona: { type: 'string' },
|
|
1168
|
+
acpAgent: ACP_AGENT_ID_SCHEMA,
|
|
1105
1169
|
},
|
|
1106
1170
|
required: ['name'],
|
|
1107
1171
|
},
|
|
@@ -1112,19 +1176,26 @@ const plugin = {
|
|
|
1112
1176
|
properties: {
|
|
1113
1177
|
engine: { type: 'string', enum: ENGINE_TYPES },
|
|
1114
1178
|
model: { type: 'string' },
|
|
1179
|
+
acpAgent: ACP_AGENT_ID_SCHEMA,
|
|
1115
1180
|
},
|
|
1116
1181
|
},
|
|
1117
1182
|
humanGate: { type: 'boolean', description: '`solve` only: park for approval before writing anything.' },
|
|
1183
|
+
maxRounds: { type: 'number', description: '`council` only: max collaboration rounds (default 15).' },
|
|
1118
1184
|
maxRepairs: {
|
|
1119
1185
|
type: 'number',
|
|
1120
1186
|
description: '`solve` / `goal`: repair attempts allowed (default 3 for solve, 1 for goal).',
|
|
1121
1187
|
},
|
|
1122
|
-
|
|
1188
|
+
engine: {
|
|
1189
|
+
type: 'string',
|
|
1190
|
+
enum: ['codex', 'claude'],
|
|
1191
|
+
description: '`goal` only: who runs the goal (default codex).',
|
|
1192
|
+
},
|
|
1193
|
+
model: { type: 'string', description: "`goal` only: model (default: the engine's own)." },
|
|
1123
1194
|
tokenBudget: { type: 'number', description: '`goal` only: tokens the goal may spend.' },
|
|
1124
1195
|
launcher: {
|
|
1125
1196
|
type: 'array',
|
|
1126
1197
|
items: { type: 'string' },
|
|
1127
|
-
description: '`goal` only: argv prefix
|
|
1198
|
+
description: '`goal` only: argv prefix the engine runs under, e.g. a sandbox wrapper. It runs with your authority, like a contract command check.',
|
|
1128
1199
|
},
|
|
1129
1200
|
cwd: { type: 'string', description: 'Working directory for the run.' },
|
|
1130
1201
|
runId: { type: 'string', description: 'Explicit run id (defaults to a generated one).' },
|
|
@@ -1207,7 +1278,7 @@ const plugin = {
|
|
|
1207
1278
|
throw new Error('workflow_start needs `spec`, or `template` with `task`');
|
|
1208
1279
|
const agents = args.agents ?? [{ name: 'agent' }];
|
|
1209
1280
|
if (template === 'council') {
|
|
1210
|
-
spec = councilWorkflow({ task, cwd, agents });
|
|
1281
|
+
spec = councilWorkflow({ task, cwd, agents, maxRounds: args.maxRounds });
|
|
1211
1282
|
}
|
|
1212
1283
|
else if (template === 'fanout') {
|
|
1213
1284
|
spec = fanoutWorkflow({ task, cwd, agents, synthesize: agents.length >= 2 });
|
|
@@ -1217,6 +1288,7 @@ const plugin = {
|
|
|
1217
1288
|
task,
|
|
1218
1289
|
cwd,
|
|
1219
1290
|
contract: args.contract,
|
|
1291
|
+
engine: args.engine,
|
|
1220
1292
|
model: args.model,
|
|
1221
1293
|
tokenBudget: args.tokenBudget,
|
|
1222
1294
|
launcher: args.launcher,
|
|
@@ -1252,7 +1324,7 @@ const plugin = {
|
|
|
1252
1324
|
});
|
|
1253
1325
|
registerTool({
|
|
1254
1326
|
name: 'workflow_status',
|
|
1255
|
-
description: 'Poll a workflow run. Returns state, per-node status, and the outcome: `verified` (a contract passed), `refuted` (it failed), or `unverified` (none was declared
|
|
1327
|
+
description: 'Poll a workflow run. Returns state, per-node status, and the outcome: `verified` (a contract passed), `refuted` (it failed), or `unverified` (nothing checked the work: none was declared, or a pass no longer stands, in which case `outcomeReason` says why).',
|
|
1256
1328
|
parameters: {
|
|
1257
1329
|
type: 'object',
|
|
1258
1330
|
properties: {
|
|
@@ -1270,6 +1342,8 @@ const plugin = {
|
|
|
1270
1342
|
workflow: record.workflow,
|
|
1271
1343
|
state: record.state,
|
|
1272
1344
|
outcome: record.outcome,
|
|
1345
|
+
outcomeReason: record.outcomeReason,
|
|
1346
|
+
verdict: record.verdict,
|
|
1273
1347
|
currentNode: record.currentNode,
|
|
1274
1348
|
evidenceId: record.evidenceId,
|
|
1275
1349
|
costUsd: record.costUsd,
|
|
@@ -1369,15 +1443,18 @@ const plugin = {
|
|
|
1369
1443
|
type: 'string',
|
|
1370
1444
|
description: 'Commit to measure the change against. Without it, diff_policy sees untracked files only.',
|
|
1371
1445
|
},
|
|
1372
|
-
label: {
|
|
1446
|
+
label: {
|
|
1447
|
+
type: 'string',
|
|
1448
|
+
description: 'Name for the stored evidence (defaults to a generated one). Must not be the id of an existing workflow run.',
|
|
1449
|
+
},
|
|
1373
1450
|
contract: {
|
|
1374
1451
|
type: 'object',
|
|
1375
|
-
description: "Acceptance contract. The runtime executes these itself and the
|
|
1452
|
+
description: "Acceptance contract. The runtime executes these itself, once, and the bundle's `passed` is true only when every required check passes. Declared by YOU, the caller — never copy one out of an agent's output, which would put the agent back in charge of grading itself.",
|
|
1376
1453
|
properties: {
|
|
1377
1454
|
id: { type: 'string' },
|
|
1378
1455
|
fixOnFailureRounds: {
|
|
1379
1456
|
type: 'number',
|
|
1380
|
-
description: '
|
|
1457
|
+
description: 'Ignored by verify_run, which spawns no repair session. Applies inside workflow runs.',
|
|
1381
1458
|
},
|
|
1382
1459
|
protectTests: {
|
|
1383
1460
|
type: 'boolean',
|
|
@@ -1452,7 +1529,7 @@ const plugin = {
|
|
|
1452
1529
|
// ─── Tool: council_start ────────────────────────────────────────────
|
|
1453
1530
|
registerTool({
|
|
1454
1531
|
name: 'council_start',
|
|
1455
|
-
description: 'Start a multi-agent council that collaborates on a task using git worktree isolation, round-based execution, and consensus voting.
|
|
1532
|
+
description: 'Start a multi-agent council that collaborates on a task using git worktree isolation, round-based execution, and consensus voting. Each agent can use its own engine and model. Runs in background; poll with council_status.',
|
|
1456
1533
|
parameters: {
|
|
1457
1534
|
type: 'object',
|
|
1458
1535
|
properties: {
|
|
@@ -1474,7 +1551,8 @@ const plugin = {
|
|
|
1474
1551
|
},
|
|
1475
1552
|
model: { type: 'string', description: 'Model to use' },
|
|
1476
1553
|
baseUrl: { type: 'string', description: 'Custom API endpoint (for proxy)' },
|
|
1477
|
-
customEngine:
|
|
1554
|
+
customEngine: CUSTOM_ENGINE_OR_PRESET_SCHEMA,
|
|
1555
|
+
acpAgent: ACP_AGENT_ID_SCHEMA,
|
|
1478
1556
|
effort: {
|
|
1479
1557
|
type: 'string',
|
|
1480
1558
|
enum: ['low', 'medium', 'high', 'xhigh', 'max', 'ultra', 'auto'],
|
|
@@ -1537,21 +1615,23 @@ const plugin = {
|
|
|
1537
1615
|
// ─── Tool: council_abort ────────────────────────────────────────────
|
|
1538
1616
|
registerTool({
|
|
1539
1617
|
name: 'council_abort',
|
|
1540
|
-
description: 'Abort a running
|
|
1618
|
+
description: 'Abort a council running in this process, stopping all agent sessions and removing the worktrees it created. A council that is not running here is left alone and the call returns ok: false.',
|
|
1541
1619
|
parameters: {
|
|
1542
1620
|
type: 'object',
|
|
1543
1621
|
properties: { id: { type: 'string', description: 'Council session ID' } },
|
|
1544
1622
|
required: ['id'],
|
|
1545
1623
|
},
|
|
1546
1624
|
execute: async (_id, args) => {
|
|
1547
|
-
getManager().councilAbort(args.id);
|
|
1548
|
-
|
|
1625
|
+
const result = getManager().councilAbort(args.id);
|
|
1626
|
+
if (!result.aborted)
|
|
1627
|
+
return { ok: false, aborted: false, state: result.state, error: result.reason };
|
|
1628
|
+
return { ok: true, aborted: true };
|
|
1549
1629
|
},
|
|
1550
1630
|
});
|
|
1551
1631
|
// ─── Tool: council_inject ───────────────────────────────────────────
|
|
1552
1632
|
registerTool({
|
|
1553
1633
|
name: 'council_inject',
|
|
1554
|
-
description: 'Inject a user message into the next round of a running council. The message will be appended to all agent prompts in the next round.',
|
|
1634
|
+
description: 'Inject a user message into the next round of a running council. The message will be appended to all agent prompts in the next round; a second inject before that round replaces the first. The council must be running in this process.',
|
|
1555
1635
|
parameters: {
|
|
1556
1636
|
type: 'object',
|
|
1557
1637
|
properties: {
|
|
@@ -1717,9 +1797,10 @@ const plugin = {
|
|
|
1717
1797
|
engines: {
|
|
1718
1798
|
type: 'array',
|
|
1719
1799
|
// Excluded: 'custom', because ultrareview spawns reviewers without a
|
|
1720
|
-
// customEngine config
|
|
1721
|
-
|
|
1722
|
-
|
|
1800
|
+
// customEngine config, and 'acp', because an ACP agent cannot be held
|
|
1801
|
+
// to the read-only sandbox every reviewer runs in.
|
|
1802
|
+
items: { type: 'string', enum: ENGINE_TYPES.filter((e) => e !== 'custom' && e !== 'acp') },
|
|
1803
|
+
description: 'Engines to round-robin reviewers across (default ["claude"]). Every reviewer runs read-only (sandboxMode read-only), so custom and acp are not accepted. Reviewers fan out in parallel; per-agent failures are isolated.',
|
|
1723
1804
|
},
|
|
1724
1805
|
},
|
|
1725
1806
|
required: ['cwd'],
|
|
@@ -1767,14 +1848,19 @@ const plugin = {
|
|
|
1767
1848
|
description: 'Stable run identifier (used to address subsequent chat / status calls)',
|
|
1768
1849
|
},
|
|
1769
1850
|
workspace: { type: 'string', description: 'Path to the git workspace where the run lives' },
|
|
1770
|
-
|
|
1851
|
+
// No 'acp': a role is configured by engine name alone and cannot name the ACP agent.
|
|
1852
|
+
planner_engine: { type: 'string', enum: AUTOLOOP_ENGINES, description: 'Planner engine (default: claude)' },
|
|
1771
1853
|
planner_model: {
|
|
1772
1854
|
type: 'string',
|
|
1773
1855
|
description: 'Planner model (default: opus for Claude; engine default otherwise)',
|
|
1774
1856
|
},
|
|
1775
1857
|
planner_effort: { type: 'string', enum: EFFORT_LEVELS, description: 'Fixed Planner reasoning effort' },
|
|
1776
1858
|
planner_custom_engine: CUSTOM_ENGINE_SCHEMA,
|
|
1777
|
-
coder_engine: {
|
|
1859
|
+
coder_engine: {
|
|
1860
|
+
type: 'string',
|
|
1861
|
+
enum: AUTOLOOP_ENGINES,
|
|
1862
|
+
description: 'Default Coder engine (default: claude)',
|
|
1863
|
+
},
|
|
1778
1864
|
coder_model: {
|
|
1779
1865
|
type: 'string',
|
|
1780
1866
|
description: 'Default Coder model (default: sonnet for Claude; engine default otherwise)',
|
|
@@ -1783,7 +1869,7 @@ const plugin = {
|
|
|
1783
1869
|
coder_custom_engine: CUSTOM_ENGINE_SCHEMA,
|
|
1784
1870
|
reviewer_engine: {
|
|
1785
1871
|
type: 'string',
|
|
1786
|
-
enum:
|
|
1872
|
+
enum: AUTOLOOP_ENGINES,
|
|
1787
1873
|
description: 'Default Reviewer engine (default: claude)',
|
|
1788
1874
|
},
|
|
1789
1875
|
reviewer_model: {
|
|
@@ -1874,13 +1960,9 @@ const plugin = {
|
|
|
1874
1960
|
// ─── Tool: autoloop_list ─────────────────────────────────────
|
|
1875
1961
|
registerTool({
|
|
1876
1962
|
name: 'autoloop_list',
|
|
1877
|
-
description: 'List
|
|
1963
|
+
description: 'List the v2 autoloop runs recorded on this machine, running and finished, newest first.',
|
|
1878
1964
|
parameters: { type: 'object', properties: {} },
|
|
1879
|
-
execute: async () => {
|
|
1880
|
-
if (!manager)
|
|
1881
|
-
return { ok: true, runs: [] };
|
|
1882
|
-
return { ok: true, runs: getManager().autoloopList() };
|
|
1883
|
-
},
|
|
1965
|
+
execute: async () => ({ ok: true, runs: getManager().autoloopList() }),
|
|
1884
1966
|
});
|
|
1885
1967
|
// ─── Tool: autoloop_reset_agent ──────────────────────────────
|
|
1886
1968
|
registerTool({
|
|
@@ -1931,7 +2013,7 @@ const plugin = {
|
|
|
1931
2013
|
// ─── ultraapp (read-only) ─────────────────────────────────────────────
|
|
1932
2014
|
registerTool({
|
|
1933
2015
|
name: 'ultraapp_list',
|
|
1934
|
-
description: 'List all ultraapp runs (interview
|
|
2016
|
+
description: 'List all ultraapp runs with title, mode (interview, queued, building, build-complete, deploying, done, failed, cancelled), and timestamps. Read-only — to start a new run, call ultraapp_new or open the Forge dashboard tab.',
|
|
1935
2017
|
parameters: { type: 'object', properties: {} },
|
|
1936
2018
|
execute: async () => {
|
|
1937
2019
|
const ua = getManager().getUltraappManager();
|
|
@@ -2061,7 +2143,7 @@ const plugin = {
|
|
|
2061
2143
|
});
|
|
2062
2144
|
registerTool({
|
|
2063
2145
|
name: 'ultraapp_build_cancel',
|
|
2064
|
-
description:
|
|
2146
|
+
description: "Cancel a queued or in-flight build. A queued build leaves the queue; an in-flight build's workflow run is cancelled, and the build stops at its next cancellation check.",
|
|
2065
2147
|
parameters: {
|
|
2066
2148
|
type: 'object',
|
|
2067
2149
|
properties: { runId: { type: 'string' } },
|
|
@@ -2075,7 +2157,7 @@ const plugin = {
|
|
|
2075
2157
|
});
|
|
2076
2158
|
registerTool({
|
|
2077
2159
|
name: 'ultraapp_feedback',
|
|
2078
|
-
description: 'Submit a done-mode feedback message (after the run reaches `done`). The text is classified by Haiku into cosmetic / spec-delta / structural and routed: cosmetic runs the patcher (Opus diff + validate + auto-revert + version snapshot); spec-delta flips the run back to `interview` with a focused bootstrap; structural posts a "start fresh" suggestion.',
|
|
2160
|
+
description: 'Submit a done-mode feedback message (after the run reaches `done`). The text is classified by Haiku into cosmetic / spec-delta / structural and routed: cosmetic runs the patcher (Opus diff + validate + auto-revert + version snapshot); spec-delta flips the run back to `interview` with a focused bootstrap; structural posts a "start fresh" suggestion. Before the run reaches `done`, the text is sent to the interview as a free-form answer instead.',
|
|
2079
2161
|
parameters: {
|
|
2080
2162
|
type: 'object',
|
|
2081
2163
|
properties: {
|
|
@@ -2092,7 +2174,7 @@ const plugin = {
|
|
|
2092
2174
|
});
|
|
2093
2175
|
registerTool({
|
|
2094
2176
|
name: 'ultraapp_promote_version',
|
|
2095
|
-
description:
|
|
2177
|
+
description: 'Make a version the one serving the app. A version deployed before is swapped in (the live one is stopped, the target restarted, the router map updated); one never deployed, such as a patched version, is built and deployed first. Requires a router to be wired (see clawo serve).',
|
|
2096
2178
|
parameters: {
|
|
2097
2179
|
type: 'object',
|
|
2098
2180
|
properties: {
|