cool-workflow 0.2.4 → 0.2.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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.gemini-plugin/mcp.json +10 -0
- package/.gemini-plugin/plugin.json +40 -0
- package/.opencode-plugin/mcp.json +10 -0
- package/.opencode-plugin/plugin.json +40 -0
- package/README.md +202 -48
- package/apps/architecture-review/app.json +1 -1
- package/apps/architecture-review-fast/app.json +1 -1
- package/apps/end-to-end-golden-path/app.json +1 -1
- package/apps/pr-review-fix-ci/app.json +1 -1
- package/apps/release-cut/app.json +1 -1
- package/apps/research-synthesis/app.json +1 -1
- package/dist/cli/dispatch.js +32 -4
- package/dist/cli/entry.js +11 -19
- package/dist/cli/global-flags.js +113 -0
- package/dist/cli/parseargv.js +7 -1
- package/dist/core/capability-data.js +337 -8
- package/dist/core/format/help.js +73 -3
- package/dist/core/format/recovery-hint.js +32 -0
- package/dist/core/multi-agent/collaboration.js +35 -6
- package/dist/core/multi-agent/runtime.js +7 -0
- package/dist/core/multi-agent/trust-policy.js +7 -1
- package/dist/core/pipeline/contract.js +7 -0
- package/dist/core/pipeline/error-feedback.js +2 -2
- package/dist/core/trust/evidence-grounding.js +13 -1
- package/dist/core/util/cli-args.js +22 -0
- package/dist/core/version.js +1 -1
- package/dist/mcp/dispatch.js +22 -2
- package/dist/mcp/server.js +124 -13
- package/dist/mcp-server.js +20 -0
- package/dist/shell/commit.js +8 -2
- package/dist/shell/coordinator-io.js +73 -1
- package/dist/shell/drive.js +120 -63
- package/dist/shell/error-feedback-io.js +6 -0
- package/dist/shell/execution-backend/agent.js +195 -23
- package/dist/shell/execution-backend/container.js +44 -10
- package/dist/shell/execution-backend/local.js +32 -0
- package/dist/shell/fs-atomic.js +93 -12
- package/dist/shell/ledger-cli.js +9 -2
- package/dist/shell/multi-agent-cli.js +5 -1
- package/dist/shell/onramp.js +48 -5
- package/dist/shell/pipeline.js +2 -1
- package/dist/shell/reclamation-io.js +10 -9
- package/dist/shell/run-export.js +52 -4
- package/dist/shell/run-store.js +156 -0
- package/dist/shell/scheduler-io.js +101 -10
- package/dist/shell/telemetry-ledger-io.js +36 -24
- package/dist/shell/trust-audit.js +104 -10
- package/dist/shell/workbench-host.js +121 -10
- package/dist/shell/workbench.js +79 -5
- package/dist/shell/worker-isolation.js +1 -1
- package/dist/wiring/capability-table/basics.js +5 -0
- package/dist/wiring/capability-table/exec-backend.js +40 -22
- package/dist/wiring/capability-table/pipeline.js +32 -0
- package/dist/wiring/capability-table/registry-core.js +26 -3
- package/dist/wiring/capability-table/reporting.js +7 -1
- package/dist/wiring/capability-table/scheduling-registry.js +8 -2
- package/dist/wiring/capability-table/trust-ledger.js +54 -12
- package/docs/agent-delegation-drive.7.md +15 -0
- package/docs/cli-mcp-parity.7.md +25 -0
- package/docs/contract-migration-tooling.7.md +2 -0
- package/docs/control-plane-scheduling.7.md +36 -0
- package/docs/cross-agent-ledger.7.md +20 -8
- package/docs/durable-state-and-locking.7.md +2 -0
- package/docs/evidence-adoption-reasoning-chain.7.md +2 -0
- package/docs/execution-backends.7.md +2 -0
- package/docs/fix.7.md +4 -4
- package/docs/getting-started.md +40 -32
- package/docs/index.md +17 -0
- package/docs/launch/demo.tape +4 -3
- package/docs/mcp-app-surface.7.md +6 -0
- package/docs/multi-agent-cli-mcp-surface.7.md +2 -0
- package/docs/multi-agent-eval-replay-harness.7.md +2 -0
- package/docs/multi-agent-operator-ux.7.md +2 -0
- package/docs/node-snapshot-diff-replay.7.md +2 -0
- package/docs/observability-cost-accounting.7.md +2 -0
- package/docs/project-index.md +39 -9
- package/docs/real-execution-backends.7.md +2 -0
- package/docs/release-and-migration.7.md +2 -0
- package/docs/release-tooling.7.md +2 -0
- package/docs/routine.7.md +22 -0
- package/docs/run-registry-control-plane.7.md +2 -0
- package/docs/run-retention-reclamation.7.md +10 -4
- package/docs/state-explosion-management.7.md +2 -0
- package/docs/team-collaboration.7.md +2 -0
- package/docs/trust-audit-anchor.7.md +2 -0
- package/docs/web-desktop-workbench.7.md +24 -2
- package/docs/workflow-app-framework.7.md +31 -0
- package/manifest/plugin.manifest.json +1 -1
- package/manifest/source-context-profiles.json +4 -3
- package/package.json +4 -2
- package/scripts/agents/agent-adapter-core.js +26 -0
- package/scripts/agents/claude-p-agent.js +4 -1
- package/scripts/agents/codex-agent.js +4 -0
- package/scripts/agents/cw-attest-wrap.js +1 -1
- package/scripts/agents/gemini-agent.js +4 -0
- package/scripts/agents/opencode-agent.js +5 -0
- package/scripts/block-unapproved-tag.js +160 -0
- package/scripts/canonical-apps.js +4 -4
- package/scripts/children/batch-delegate-child.js +72 -4
- package/scripts/children/http-batch-delegate-child.js +132 -0
- package/scripts/children/http-delegate-child.js +8 -0
- package/scripts/dogfood-release.js +2 -2
- package/scripts/fake-date-for-reproduction.js +1 -1
- package/scripts/golden-path.js +4 -4
- package/scripts/lang-policy-check.js +82 -0
- package/scripts/purity-gate.js +16 -3
- package/scripts/release-check.js +2 -1
- package/scripts/release-flow.js +128 -30
- package/scripts/release-gate.js +184 -0
- package/scripts/release-oneclick.js +38 -7
- package/scripts/release-tags.js +47 -0
- package/scripts/verdict-keygen.js +2 -2
- package/scripts/verify-bump-reproduction.js +193 -0
- package/scripts/verify-verdict-signature.js +1 -1
- package/ui/workbench/app.css +41 -9
- package/ui/workbench/app.js +160 -27
- package/ui/workbench/index.html +2 -2
- package/docs/agent-framework.md +0 -177
- package/docs/designs/handoff-ledger.md +0 -145
- package/docs/dogfood/resume-drive-real-agent-2026-06-14.md +0 -40
- package/docs/launch/launch-kit.md +0 -195
- package/docs/launch/pre-launch-checklist.md +0 -53
- package/docs/readme-v0.1.87-full.md +0 -301
- package/docs/routines.md +0 -101
- package/docs/scheduled-tasks.md +0 -80
- package/scripts/agents/claude-p-agent.sh +0 -9
- package/scripts/block-unapproved-tag.sh +0 -75
- package/scripts/release-gate.sh +0 -94
- package/scripts/verify-bump-reproduction.sh +0 -148
- package/scripts/verify-container-selfref.js +0 -64
package/dist/cli/entry.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// so byte content there is unaffected; cli-color-env.case.js exercises
|
|
16
16
|
// the FORCE_COLOR/NO_COLOR/CW_NO_COLOR branches explicitly.
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.recoveryHint =
|
|
18
|
+
exports.recoveryHint = void 0;
|
|
19
19
|
exports.runCli = runCli;
|
|
20
20
|
exports.main = main;
|
|
21
21
|
const parseargv_1 = require("./parseargv");
|
|
@@ -25,6 +25,13 @@ const parseargv_2 = require("./parseargv");
|
|
|
25
25
|
const capability_table_1 = require("../core/capability-table");
|
|
26
26
|
const term_1 = require("../shell/term");
|
|
27
27
|
const io_1 = require("./io");
|
|
28
|
+
const recovery_hint_1 = require("../core/format/recovery-hint");
|
|
29
|
+
// recoveryHint now lives in core/format/recovery-hint.ts (a core/-layer
|
|
30
|
+
// file, so mcp/server.ts can use it too without crossing the mcp/-may-
|
|
31
|
+
// never-import-cli/ layer rule). Re-exported here so every existing
|
|
32
|
+
// importer of `recoveryHint` from this file keeps working unchanged.
|
|
33
|
+
var recovery_hint_2 = require("../core/format/recovery-hint");
|
|
34
|
+
Object.defineProperty(exports, "recoveryHint", { enumerable: true, get: function () { return recovery_hint_2.recoveryHint; } });
|
|
28
35
|
/** MILESTONE 2: `version` is now a pure projection of the capability
|
|
29
36
|
* table's `version` row — there is exactly one place its print text
|
|
30
37
|
* lives (core/capability-table.ts's cli handler), not a second
|
|
@@ -39,23 +46,6 @@ function printVersion() {
|
|
|
39
46
|
const result = row?.cli?.handler({ positionals: [], options: {} });
|
|
40
47
|
process.stdout.write(result?.text ?? "");
|
|
41
48
|
}
|
|
42
|
-
/** src/cli.ts:18-29 — map a top-level error message to ONE copy-pasteable
|
|
43
|
-
* recovery command. Content-based so it stays correct regardless of which
|
|
44
|
-
* call site threw; returns undefined rather than a wrong guess. */
|
|
45
|
-
function recoveryHint(message) {
|
|
46
|
-
const m = message.toLowerCase();
|
|
47
|
-
if (m.startsWith("unknown command"))
|
|
48
|
-
return "cw help";
|
|
49
|
-
if (m.includes("not configured") || m.includes("agent backend"))
|
|
50
|
-
return "cw doctor";
|
|
51
|
-
if (m.includes("missing") && m.includes("repo"))
|
|
52
|
-
return 'cw -q "<question>" -dir <project-folder>';
|
|
53
|
-
if (m.includes("app") && (m.includes("not found") || m.includes("not available")))
|
|
54
|
-
return "cw app list";
|
|
55
|
-
if (m.includes("run id") || m.includes("run not found"))
|
|
56
|
-
return "cw run list";
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
49
|
async function runCli(argv = process.argv.slice(2)) {
|
|
60
50
|
const args = (0, parseargv_1.parseArgv)(argv);
|
|
61
51
|
// Top-level flags: accept --version / -v / --help / -h before command lookup.
|
|
@@ -77,6 +67,8 @@ async function runCli(argv = process.argv.slice(2)) {
|
|
|
77
67
|
args.options["agent-command"] = "builtin:codex";
|
|
78
68
|
if (args.options.gemini)
|
|
79
69
|
args.options["agent-command"] = "builtin:gemini";
|
|
70
|
+
if (args.options.opencode)
|
|
71
|
+
args.options["agent-command"] = "builtin:opencode";
|
|
80
72
|
if (args.options.deepseek)
|
|
81
73
|
args.options["agent-command"] = "builtin:deepseek";
|
|
82
74
|
// -dir / --dir / -d is a second name for --repo; an explicit --repo wins
|
|
@@ -152,7 +144,7 @@ function main(argv = process.argv.slice(2)) {
|
|
|
152
144
|
return;
|
|
153
145
|
const message = error instanceof Error ? error.message : String(error);
|
|
154
146
|
process.stderr.write(`${(0, term_1.bold)("cw:", process.stderr)} ${(0, term_1.red)(message, process.stderr)}\n`);
|
|
155
|
-
const hint = recoveryHint(message);
|
|
147
|
+
const hint = (0, recovery_hint_1.recoveryHint)(message);
|
|
156
148
|
if (hint)
|
|
157
149
|
process.stderr.write(` ${(0, term_1.dim)("Try:", process.stderr)} ${hint}\n`);
|
|
158
150
|
process.exitCode = 1;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// cli/global-flags.ts — the shared global CLI flag set, plus the TTY-gated
|
|
3
|
+
// unknown-flag warning for capability rows that declare `flagsComplete`
|
|
4
|
+
// (core/capability-data.ts's CliBinding).
|
|
5
|
+
//
|
|
6
|
+
// WHY: an unknown flag used to be dropped without a sound — `cw doctor
|
|
7
|
+
// --jsno` ran fine, printed the human report, and exited 0, so a typo of
|
|
8
|
+
// `--json` was easy to miss. A full allowlist check for EVERY command is
|
|
9
|
+
// not safe (a missed name means a FALSE warning, and many scripted and
|
|
10
|
+
// conformance callers assert stderr === ""), so the design here is
|
|
11
|
+
// incremental and fail-open:
|
|
12
|
+
// - only a row that declares `flagsComplete: true` is ever checked, and
|
|
13
|
+
// a row earns that mark only after its handler's option reads have
|
|
14
|
+
// been checked against source, one by one;
|
|
15
|
+
// - the warning is ONE line to stderr, printed ONLY when stderr is a
|
|
16
|
+
// real interactive terminal (same injectable-stream gate as
|
|
17
|
+
// shell/workbench-host.ts's printServeHint) — a piped, scripted, or
|
|
18
|
+
// conformance run can never see it;
|
|
19
|
+
// - stdout bytes and the exit code never change.
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.GLOBAL_CLI_FLAGS = void 0;
|
|
22
|
+
exports.unknownFlagKeys = unknownFlagKeys;
|
|
23
|
+
exports.warnUnknownFlags = warnUnknownFlags;
|
|
24
|
+
/** Every option key the shared CLI front door reads for ANY command, so a
|
|
25
|
+
* `flagsComplete` row's check never flags them. Built by reading the
|
|
26
|
+
* actual consumers:
|
|
27
|
+
* - cli/entry.ts: `version`/`v`, `help`/`h`, the vendor shorthands
|
|
28
|
+
* `claude`/`codex`/`gemini`/`deepseek` (each sets `agent-command`),
|
|
29
|
+
* `repo`/`dir` (`--dir`/`-d` is a global alias for `--repo`),
|
|
30
|
+
* `verbose`, `no-color`, `full`, `quiet`, `question` (`-q`), and the
|
|
31
|
+
* `--resume --run <id>` continuation pair;
|
|
32
|
+
* - cli/dispatch.ts + core/util/cli-args.ts's wantsJson: `json`,
|
|
33
|
+
* `format`;
|
|
34
|
+
* - cli/parseargv.ts's short-alias table: `link` (`-l`),
|
|
35
|
+
* `agent-command` (`-a`) — the short spellings map to these long
|
|
36
|
+
* names before any handler sees them;
|
|
37
|
+
* - the doctor/fix handlers' shared working-dir override: `cwd`.
|
|
38
|
+
* Keys are the POST-parse spellings (what lands in `args.options`). */
|
|
39
|
+
exports.GLOBAL_CLI_FLAGS = [
|
|
40
|
+
"agent-command",
|
|
41
|
+
"claude",
|
|
42
|
+
"codex",
|
|
43
|
+
"cwd",
|
|
44
|
+
"deepseek",
|
|
45
|
+
"dir",
|
|
46
|
+
"format",
|
|
47
|
+
"full",
|
|
48
|
+
"gemini",
|
|
49
|
+
"h",
|
|
50
|
+
"help",
|
|
51
|
+
"json",
|
|
52
|
+
"link",
|
|
53
|
+
"no-color",
|
|
54
|
+
"question",
|
|
55
|
+
"quiet",
|
|
56
|
+
"repo",
|
|
57
|
+
"resume",
|
|
58
|
+
"run",
|
|
59
|
+
"v",
|
|
60
|
+
"verbose",
|
|
61
|
+
"version",
|
|
62
|
+
];
|
|
63
|
+
/** "changed-from" -> "changedFrom". A name with no dash comes back as-is. */
|
|
64
|
+
function kebabToCamel(name) {
|
|
65
|
+
return name.replace(/-([a-z0-9])/g, (_, ch) => ch.toUpperCase());
|
|
66
|
+
}
|
|
67
|
+
/** "changedFrom" -> "changed-from". A name with no capitals comes back as-is. */
|
|
68
|
+
function camelToKebab(name) {
|
|
69
|
+
return name.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
70
|
+
}
|
|
71
|
+
/** The option key a declared flag help entry documents: the first token
|
|
72
|
+
* of its display name, without the leading dashes ("--changed-from REF"
|
|
73
|
+
* -> "changed-from"). */
|
|
74
|
+
function flagNameToKey(name) {
|
|
75
|
+
return name.trim().split(/\s+/)[0].replace(/^-+/, "");
|
|
76
|
+
}
|
|
77
|
+
/** The full accepted-key set for one row: the row's declared flags plus
|
|
78
|
+
* the global set, each in BOTH its kebab-case and camelCase spelling. */
|
|
79
|
+
function knownKeysFor(cli) {
|
|
80
|
+
const known = new Set();
|
|
81
|
+
const add = (key) => {
|
|
82
|
+
known.add(key);
|
|
83
|
+
known.add(kebabToCamel(key));
|
|
84
|
+
known.add(camelToKebab(key));
|
|
85
|
+
};
|
|
86
|
+
for (const name of exports.GLOBAL_CLI_FLAGS)
|
|
87
|
+
add(name);
|
|
88
|
+
for (const flag of cli.flags ?? [])
|
|
89
|
+
add(flagNameToKey(flag.name));
|
|
90
|
+
return known;
|
|
91
|
+
}
|
|
92
|
+
/** The option keys this row does not know about (pure; exported for unit
|
|
93
|
+
* tests). Empty unless the row declares `flagsComplete`. */
|
|
94
|
+
function unknownFlagKeys(cli, options) {
|
|
95
|
+
if (!cli.flagsComplete)
|
|
96
|
+
return [];
|
|
97
|
+
const known = knownKeysFor(cli);
|
|
98
|
+
return Object.keys(options).filter((key) => !known.has(key));
|
|
99
|
+
}
|
|
100
|
+
/** Write ONE warning line to `stream` when a `flagsComplete` row got an
|
|
101
|
+
* option it does not read — and only when the stream is a real TTY, so
|
|
102
|
+
* no piped caller, script, or conformance case can ever see it. stdout
|
|
103
|
+
* and the exit code are untouched either way. */
|
|
104
|
+
function warnUnknownFlags(cli, options, stream = process.stderr) {
|
|
105
|
+
if (!stream.isTTY)
|
|
106
|
+
return;
|
|
107
|
+
const unknown = unknownFlagKeys(cli, options);
|
|
108
|
+
if (unknown.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
const label = unknown.length === 1 ? "flag" : "flags";
|
|
111
|
+
const list = unknown.map((key) => `--${key}`).join(", ");
|
|
112
|
+
stream.write(`cw: warning: unknown ${label} ${list} (see: cw help ${cli.path[0]})\n`);
|
|
113
|
+
}
|
package/dist/cli/parseargv.js
CHANGED
|
@@ -140,13 +140,19 @@ function levenshtein(a, b) {
|
|
|
140
140
|
}
|
|
141
141
|
/** src/orchestrator.ts:875-887 — nearest known command by edit distance.
|
|
142
142
|
* Gives `undefined` when the input is under 2 chars, or when the best
|
|
143
|
-
* distance is over 3 or over half the input length.
|
|
143
|
+
* distance is over 3 or over half the input length. Never gives back the
|
|
144
|
+
* input itself: a caller only asks for a suggestion when the input did
|
|
145
|
+
* NOT resolve, so a distance-0 self-match (an alias token like
|
|
146
|
+
* `audit-run` that IS in KNOWN_COMMANDS but has no help rows of its own)
|
|
147
|
+
* was a hint that pointed at the very thing the user just typed. */
|
|
144
148
|
function suggestCommand(input) {
|
|
145
149
|
if (!input || input.length < 2)
|
|
146
150
|
return undefined;
|
|
147
151
|
let best;
|
|
148
152
|
let bestDistance = Infinity;
|
|
149
153
|
for (const candidate of exports.KNOWN_COMMANDS) {
|
|
154
|
+
if (candidate === input)
|
|
155
|
+
continue;
|
|
150
156
|
const distance = levenshtein(input, candidate);
|
|
151
157
|
if (distance < bestDistance) {
|
|
152
158
|
bestDistance = distance;
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
// capability is APPENDED after the transcript's last row (never inserted),
|
|
34
34
|
// so every existing position keeps its pinned order.
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.MCP_TOOL_DATA = exports.PROPERTY_OVERRIDES = exports.CapabilityNotImplementedError = void 0;
|
|
36
|
+
exports.MCP_TOOL_DATA = exports.MCP_TOOL_ANNOTATIONS = exports.COMMON_PROPERTY_TYPES = exports.PROPERTY_OVERRIDES = exports.CapabilityNotImplementedError = void 0;
|
|
37
37
|
exports.notYetImplemented = notYetImplemented;
|
|
38
38
|
exports.stringProperty = stringProperty;
|
|
39
39
|
/** Thrown by every not-yet-wired MCP tool handler. Never hit by this
|
|
@@ -55,8 +55,9 @@ function stringProperty(name) {
|
|
|
55
55
|
return { type: "string", description: name };
|
|
56
56
|
}
|
|
57
57
|
/** SPEC/mcp.md's two hand-written property-shape exceptions (see that
|
|
58
|
-
* file's "All 196 MCP tools" section header note):
|
|
59
|
-
*
|
|
58
|
+
* file's "All 196 MCP tools" section header note): these two properties
|
|
59
|
+
* win over `COMMON_PROPERTY_TYPES` below, since each is a one-off shape
|
|
60
|
+
* tied to its own tool, not a shape shared by the property name at large. */
|
|
60
61
|
exports.PROPERTY_OVERRIDES = {
|
|
61
62
|
cw_commit: {
|
|
62
63
|
allowUnverifiedCheckpoint: {
|
|
@@ -68,11 +69,339 @@ exports.PROPERTY_OVERRIDES = {
|
|
|
68
69
|
payload: { type: "object", description: "Event payload" },
|
|
69
70
|
},
|
|
70
71
|
};
|
|
72
|
+
/** A real type and a true, short, one-sentence description for every
|
|
73
|
+
* property name used anywhere in `MCP_TOOL_DATA` below, keyed by the
|
|
74
|
+
* PROPERTY NAME (not the tool name) — the same name means the same
|
|
75
|
+
* thing on every tool that uses it. `mcpToolDefinitions()` in
|
|
76
|
+
* wiring/capability-table/registry-core.ts looks a property up here
|
|
77
|
+
* only when `PROPERTY_OVERRIDES` has no entry for it on that tool; a
|
|
78
|
+
* name not found in either table falls back to the plain
|
|
79
|
+
* `stringProperty` form (there should be very few of those — the two
|
|
80
|
+
* names left out here, `allowUnverifiedCheckpoint` and `payload`, are
|
|
81
|
+
* already covered by `PROPERTY_OVERRIDES` on their one tool each). */
|
|
82
|
+
exports.COMMON_PROPERTY_TYPES = {
|
|
83
|
+
action: { type: "string", description: "which action to run" },
|
|
84
|
+
actor: { type: "string", description: "the name of the actor doing this" },
|
|
85
|
+
actorKind: { type: "string", description: "the kind of actor, such as agent or human" },
|
|
86
|
+
agentCommand: { type: "string", description: "the command template used to run the agent" },
|
|
87
|
+
agentEndpoint: { type: "string", description: "the network address of the agent service" },
|
|
88
|
+
agentModel: { type: "string", description: "the name of the agent model to use" },
|
|
89
|
+
all: { type: "boolean", description: "when true, act on every item, not only old ones" },
|
|
90
|
+
allowSelfApproval: { type: "boolean", description: "when true, let an actor approve their own work" },
|
|
91
|
+
allowUnverified: { type: "boolean", description: "when true, skip the check that needs a verifier" },
|
|
92
|
+
app: { type: "string", description: "the workflow app's id" },
|
|
93
|
+
appId: { type: "string", description: "the workflow app's id" },
|
|
94
|
+
appliesTo: { type: "string", description: "what this policy rule applies to" },
|
|
95
|
+
archive: { type: "string", description: "the path to the run archive file" },
|
|
96
|
+
artifact: { type: "object", description: "an artifact reference to attach as proof" },
|
|
97
|
+
attestation: { type: "string", description: "the attestation text or id for this actor" },
|
|
98
|
+
attested: { type: "boolean", description: "when true, mark the actor as host-attested" },
|
|
99
|
+
authorizedRoles: { type: "array", description: "the list of role names allowed to approve" },
|
|
100
|
+
backend: { type: "string", description: "the name of the execution backend" },
|
|
101
|
+
backendId: { type: "string", description: "the id of the execution backend" },
|
|
102
|
+
backoffBaseMs: { type: "number", description: "the starting wait time, in milliseconds, before a retry" },
|
|
103
|
+
backoffCapMs: { type: "number", description: "the largest wait time, in milliseconds, before a retry" },
|
|
104
|
+
backoffFactor: { type: "number", description: "the number the wait time is multiplied by after each retry" },
|
|
105
|
+
baseline: { type: "string", description: "the baseline snapshot's id" },
|
|
106
|
+
baselinePath: { type: "string", description: "the file path to the baseline snapshot" },
|
|
107
|
+
baselineSnapshotId: { type: "string", description: "the id of the baseline snapshot" },
|
|
108
|
+
blackboardId: { type: "string", description: "the id of the blackboard" },
|
|
109
|
+
body: { type: "string", description: "the text body of the message" },
|
|
110
|
+
bundle: { type: "string", description: "the path to the run bundle file" },
|
|
111
|
+
by: { type: "string", description: "the name of the actor who did this" },
|
|
112
|
+
candidate: { type: "string", description: "the candidate's id" },
|
|
113
|
+
candidateId: { type: "string", description: "the candidate's id" },
|
|
114
|
+
candidateSnapshotId: { type: "string", description: "the id of the candidate snapshot" },
|
|
115
|
+
code: { type: "string", description: "a short error or status code" },
|
|
116
|
+
collectInitialFanin: { type: "boolean", description: "when true, collect the first fan-in step right away" },
|
|
117
|
+
command: { type: "string", description: "the command that was run or checked" },
|
|
118
|
+
commit: { type: "string", description: "the commit's id" },
|
|
119
|
+
commitId: { type: "string", description: "the commit's id" },
|
|
120
|
+
concurrency: { type: "number", description: "the largest number of steps to run at once" },
|
|
121
|
+
contract: { type: "string", description: "the pipeline contract's id" },
|
|
122
|
+
contractId: { type: "string", description: "the pipeline contract's id" },
|
|
123
|
+
criteria: { type: "array", description: "the list of scoring criteria" },
|
|
124
|
+
criterion: { type: "string", description: "one scoring criterion's name" },
|
|
125
|
+
cron: { type: "string", description: "the cron schedule text" },
|
|
126
|
+
cwd: { type: "string", description: "the working directory to run in" },
|
|
127
|
+
debateRounds: { type: "number", description: "the number of debate rounds to run" },
|
|
128
|
+
delayMinutes: { type: "number", description: "the number of minutes to wait before the task runs" },
|
|
129
|
+
depth: { type: "number", description: "how many levels deep to read" },
|
|
130
|
+
description: { type: "string", description: "a short text that describes this item" },
|
|
131
|
+
diff: { type: "string", description: "the change text (diff) for this proposal" },
|
|
132
|
+
dir: { type: "string", description: "the path to one ledger directory" },
|
|
133
|
+
directory: { type: "string", description: "the directory path to write into" },
|
|
134
|
+
dirs: { type: "array", description: "the list of ledger directory paths" },
|
|
135
|
+
dispatchId: { type: "string", description: "the id of the dispatch record" },
|
|
136
|
+
displayName: { type: "string", description: "the actor's human-readable name" },
|
|
137
|
+
entry: { type: "string", description: "the ledger entry to check" },
|
|
138
|
+
env: { type: "object", description: "the environment variables for this step" },
|
|
139
|
+
evidence: { type: "array", description: "the list of evidence items backing this claim" },
|
|
140
|
+
expectCount: { type: "number", description: "the event count the chain must match" },
|
|
141
|
+
expectHead: { type: "string", description: "the head hash the chain must match" },
|
|
142
|
+
expectedArtifact: { type: "string", description: "the artifact this role is expected to produce" },
|
|
143
|
+
extractReport: { type: "boolean", description: "when true, also pull the plain report out of the bundle" },
|
|
144
|
+
failed: { type: "boolean", description: "when true, mark the lease as failed" },
|
|
145
|
+
faninId: { type: "string", description: "the id of the fan-in record" },
|
|
146
|
+
faninObligation: { type: "string", description: "what this role must supply at fan-in time" },
|
|
147
|
+
fanoutId: { type: "string", description: "the id of the fan-out record" },
|
|
148
|
+
feedbackId: { type: "string", description: "the id of the feedback record" },
|
|
149
|
+
file: { type: "string", description: "the path to the archive file" },
|
|
150
|
+
files: { type: "array", description: "the list of file paths this change touches" },
|
|
151
|
+
findings: { type: "array", description: "the list of review findings" },
|
|
152
|
+
focus: { type: "string", description: "the node id to center the view on" },
|
|
153
|
+
from: { type: "string", description: "the actor this comes from" },
|
|
154
|
+
groupId: { type: "string", description: "the id of the agent group" },
|
|
155
|
+
hostEnforced: { type: "boolean", description: "when true, the host, not the agent, enforced the sandbox rule" },
|
|
156
|
+
id: { type: "string", description: "the id of this item" },
|
|
157
|
+
includeArchived: { type: "boolean", description: "when true, also list archived runs" },
|
|
158
|
+
includeRejected: { type: "boolean", description: "when true, also list rejected candidates" },
|
|
159
|
+
inputs: { type: "object", description: "the structured input values for the app" },
|
|
160
|
+
intervalMinutes: { type: "number", description: "how often, in minutes, the task should repeat" },
|
|
161
|
+
judgeCount: { type: "number", description: "the number of judge agents to use" },
|
|
162
|
+
keepCommits: { type: "number", description: "the number of recent commits to keep" },
|
|
163
|
+
keepScratch: { type: "boolean", description: "when true, keep scratch files instead of freeing them" },
|
|
164
|
+
keepSnapshots: { type: "number", description: "the number of recent snapshots to keep" },
|
|
165
|
+
key: { type: "string", description: "the context frame's key" },
|
|
166
|
+
kind: { type: "string", description: "the kind of this item" },
|
|
167
|
+
leaseId: { type: "string", description: "the id of the queue lease" },
|
|
168
|
+
leaseTtlMs: { type: "number", description: "how long, in milliseconds, a lease stays valid" },
|
|
169
|
+
limit: { type: "number", description: "the largest number of items to return" },
|
|
170
|
+
locator: { type: "string", description: "where to find the artifact (a path or url)" },
|
|
171
|
+
mapperCount: { type: "number", description: "the number of mapper agents to use" },
|
|
172
|
+
match: { type: "string", description: "the text pattern used to match trigger events" },
|
|
173
|
+
max: { type: "number", description: "the largest allowed score" },
|
|
174
|
+
maxAttempts: { type: "number", description: "the largest number of retry attempts allowed" },
|
|
175
|
+
maxConcurrent: { type: "number", description: "the largest number of runs allowed at once" },
|
|
176
|
+
maxTotal: { type: "number", description: "the largest total score allowed" },
|
|
177
|
+
membershipId: { type: "string", description: "the id of the agent membership record" },
|
|
178
|
+
message: { type: "string", description: "the message text" },
|
|
179
|
+
minAgeMinutes: { type: "number", description: "the least age, in minutes, an item must have" },
|
|
180
|
+
minNormalized: { type: "number", description: "the least normalized score a candidate must have" },
|
|
181
|
+
multiAgentRun: { type: "string", description: "the multi-agent run's id" },
|
|
182
|
+
multiAgentRunId: { type: "string", description: "the multi-agent run's id" },
|
|
183
|
+
network: { type: "string", description: "the network access rule that was checked" },
|
|
184
|
+
node: { type: "string", description: "the state node's id" },
|
|
185
|
+
nodeId: { type: "string", description: "the state node's id" },
|
|
186
|
+
note: { type: "string", description: "a short free-text note" },
|
|
187
|
+
notes: { type: "string", description: "free-text notes about this score" },
|
|
188
|
+
now: { type: "string", description: "the time to treat as \"now\", for a stable, repeatable result" },
|
|
189
|
+
objective: { type: "string", description: "the goal text for this multi-agent run" },
|
|
190
|
+
offset: { type: "number", description: "how many items to skip before returning results" },
|
|
191
|
+
olderThanDays: { type: "number", description: "the least age, in days, an item must have" },
|
|
192
|
+
once: { type: "boolean", description: "when true, run only one step, then stop" },
|
|
193
|
+
outcome: { type: "string", description: "the decision's outcome" },
|
|
194
|
+
output: { type: "string", description: "the output file path to write" },
|
|
195
|
+
parent: { type: "string", description: "the id of the parent item this replies to" },
|
|
196
|
+
path: { type: "string", description: "a file path" },
|
|
197
|
+
phase: { type: "string", description: "the phase name for this agent group" },
|
|
198
|
+
port: { type: "number", description: "the network port to use" },
|
|
199
|
+
pricing: { type: "string", description: "the pricing table to use for cost figures" },
|
|
200
|
+
priority: { type: "number", description: "the queue order priority" },
|
|
201
|
+
profileFile: { type: "string", description: "the path to the sandbox profile file" },
|
|
202
|
+
profileId: { type: "string", description: "the id of the sandbox profile" },
|
|
203
|
+
prompt: { type: "string", description: "the prompt text for this task" },
|
|
204
|
+
pubkey: { type: "string", description: "the public key used to check a signature" },
|
|
205
|
+
question: { type: "string", description: "the question that starts the run" },
|
|
206
|
+
rationale: { type: "string", description: "the reason behind this decision" },
|
|
207
|
+
reason: { type: "string", description: "a short text that explains why" },
|
|
208
|
+
reclaimAfterArchiveDays: { type: "number", description: "how many days after archive before a run can be freed" },
|
|
209
|
+
refresh: { type: "boolean", description: "when true, rebuild the result instead of reading a cached one" },
|
|
210
|
+
replay: { type: "string", description: "the replay's id" },
|
|
211
|
+
replayId: { type: "string", description: "the replay's id" },
|
|
212
|
+
replayPath: { type: "string", description: "the file path to the replay" },
|
|
213
|
+
replyTo: { type: "string", description: "the id of the message this replies to" },
|
|
214
|
+
repo: { type: "string", description: "the path to the repo" },
|
|
215
|
+
requireAttestedActor: { type: "boolean", description: "when true, only let an attested actor approve" },
|
|
216
|
+
requireEvidence: { type: "boolean", description: "when true, require evidence before a candidate can rank" },
|
|
217
|
+
requireToken: { type: "boolean", description: "when true, require a token to reach the host" },
|
|
218
|
+
requireVerifierGate: { type: "boolean", description: "when true, require the verifier gate to pass first" },
|
|
219
|
+
requiredApprovals: { type: "number", description: "the number of approvals a target needs" },
|
|
220
|
+
requiredEvidence: { type: "array", description: "the list of evidence kinds this role must supply" },
|
|
221
|
+
requiredRole: { type: "string", description: "the role name that must be present at fan-in" },
|
|
222
|
+
responsibility: { type: "string", description: "what this role is responsible for" },
|
|
223
|
+
resultNode: { type: "string", description: "the id of the node holding the result" },
|
|
224
|
+
resultPath: { type: "string", description: "the file path to the result" },
|
|
225
|
+
retryable: { type: "boolean", description: "when true, mark this failure as safe to retry" },
|
|
226
|
+
role: { type: "string", description: "the actor's role name" },
|
|
227
|
+
roleId: { type: "string", description: "the agent role's id" },
|
|
228
|
+
runId: { type: "string", description: "the run's id" },
|
|
229
|
+
sandbox: { type: "string", description: "the sandbox profile choice" },
|
|
230
|
+
sandboxChoice: { type: "string", description: "the sandbox profile choice" },
|
|
231
|
+
sandboxProfile: { type: "string", description: "the sandbox profile's id" },
|
|
232
|
+
sandboxProfileHint: { type: "string", description: "a hint for which sandbox profile this role should use" },
|
|
233
|
+
sandboxProfileId: { type: "string", description: "the sandbox profile's id" },
|
|
234
|
+
scope: { type: "string", description: "which repos to search, such as this repo or all repos" },
|
|
235
|
+
score: { type: "string", description: "the score's id" },
|
|
236
|
+
scoreId: { type: "string", description: "the score's id" },
|
|
237
|
+
scorer: { type: "string", description: "the name of the actor giving this score" },
|
|
238
|
+
selectedBy: { type: "string", description: "the actor who made the selection" },
|
|
239
|
+
selection: { type: "string", description: "the selection's id" },
|
|
240
|
+
since: { type: "string", description: "the start of the time range to search" },
|
|
241
|
+
snapshot: { type: "string", description: "the snapshot's id" },
|
|
242
|
+
snapshotId: { type: "string", description: "the snapshot's id" },
|
|
243
|
+
source: { type: "string", description: "where this artifact came from" },
|
|
244
|
+
state: { type: "string", description: "the run state to check or set" },
|
|
245
|
+
status: { type: "string", description: "the status to filter or set" },
|
|
246
|
+
strategy: { type: "string", description: "the strategy used to collect fan-in" },
|
|
247
|
+
strictSignatures: { type: "boolean", description: "when true, fail closed if a signature cannot be checked" },
|
|
248
|
+
subject: { type: "string", description: "the subject of this decision" },
|
|
249
|
+
suite: { type: "string", description: "the eval suite's id" },
|
|
250
|
+
suiteId: { type: "string", description: "the eval suite's id" },
|
|
251
|
+
supersedes: { type: "string", description: "the id of the earlier item this replaces" },
|
|
252
|
+
tag: { type: "string", description: "a short label for this topic" },
|
|
253
|
+
target: { type: "string", description: "the id of the target this acts on" },
|
|
254
|
+
targetId: { type: "string", description: "the id of the target this acts on" },
|
|
255
|
+
targetKind: { type: "string", description: "the kind of the target, such as candidate or commit" },
|
|
256
|
+
task: { type: "string", description: "the task text or id" },
|
|
257
|
+
taskId: { type: "string", description: "the task's id" },
|
|
258
|
+
text: { type: "string", description: "free-text search terms" },
|
|
259
|
+
thread: { type: "string", description: "the id of the comment thread" },
|
|
260
|
+
tieBreaker: { type: "string", description: "the rule used to break a tie between candidates" },
|
|
261
|
+
title: { type: "string", description: "a short title for this item" },
|
|
262
|
+
to: { type: "string", description: "the actor this is handed to" },
|
|
263
|
+
toRole: { type: "string", description: "the role this is handed to" },
|
|
264
|
+
topic: { type: "string", description: "the blackboard topic's id" },
|
|
265
|
+
topicId: { type: "string", description: "the blackboard topic's id" },
|
|
266
|
+
topology: { type: "string", description: "the topology definition's id" },
|
|
267
|
+
topologyId: { type: "string", description: "the topology definition's id" },
|
|
268
|
+
topologyRunId: { type: "string", description: "the id of the topology run" },
|
|
269
|
+
trustKey: { type: "string", description: "the trust key used to seal the run" },
|
|
270
|
+
unarchive: { type: "boolean", description: "when true, undo an archive mark instead of setting one" },
|
|
271
|
+
until: { type: "string", description: "the end of the time range to search" },
|
|
272
|
+
value: { type: "string", description: "the value to store in this context frame" },
|
|
273
|
+
verdict: { type: "string", description: "the review verdict" },
|
|
274
|
+
verifier: { type: "string", description: "the name of the verifier" },
|
|
275
|
+
verifierNode: { type: "string", description: "the id of the node holding the verifier result" },
|
|
276
|
+
verify: { type: "boolean", description: "when true, also verify the result after this step" },
|
|
277
|
+
view: { type: "string", description: "which view of the data to return" },
|
|
278
|
+
visibility: { type: "string", description: "who can see this message" },
|
|
279
|
+
withTrustKey: { type: "boolean", description: "when true, seal the output with the trust key" },
|
|
280
|
+
worker: { type: "string", description: "the worker's id" },
|
|
281
|
+
workerId: { type: "string", description: "the worker's id" },
|
|
282
|
+
workflow: { type: "string", description: "the workflow definition's id" },
|
|
283
|
+
workflowId: { type: "string", description: "the workflow definition's id" },
|
|
284
|
+
write: { type: "boolean", description: "when true, save the result instead of only reading it" },
|
|
285
|
+
};
|
|
286
|
+
/** Behavior hints per MCP tool name, surfaced as the standard MCP
|
|
287
|
+
* `annotations` field on each `tools/list` entry. A side table (like
|
|
288
|
+
* `MCP_REAL_HANDLERS` in wiring/capability-table/registry-core.ts) so
|
|
289
|
+
* `MCP_TOOL_DATA` below stays a pure transcript of the spec table.
|
|
290
|
+
*
|
|
291
|
+
* The rule for this table is strict, because a wrong hint is a safety
|
|
292
|
+
* bug (a client may skip its confirmation step for a "read-only" tool):
|
|
293
|
+
* - `readOnlyHint: true` ONLY for a tool whose handler was read and
|
|
294
|
+
* seen to do no write at all (no saveCheckpoint, no writeJson, no
|
|
295
|
+
* writeReport, no fs write of any kind);
|
|
296
|
+
* - `destructiveHint: true` for a tool whose handler was read and seen
|
|
297
|
+
* to delete stored data (gc / delete sweeps);
|
|
298
|
+
* - every other tool is ABSENT from this table and gets no
|
|
299
|
+
* annotations. Absent beats wrong. Some absences that look like
|
|
300
|
+
* reads are deliberate: cw_metrics_show persists its derived report,
|
|
301
|
+
* cw_workbench_view calls the metrics.show handler for one panel,
|
|
302
|
+
* cw_operator_report re-writes report.md, cw_schedule_due marks
|
|
303
|
+
* expired tasks, cw_run_resume can take the opt-in --drive path, and
|
|
304
|
+
* cw_multi_agent_reasoning can take the opt-in refresh path. */
|
|
305
|
+
exports.MCP_TOOL_ANNOTATIONS = {
|
|
306
|
+
// pure reads, in MCP_TOOL_DATA order (each handler checked by hand)
|
|
307
|
+
cw_list: { readOnlyHint: true },
|
|
308
|
+
cw_status: { readOnlyHint: true },
|
|
309
|
+
cw_next: { readOnlyHint: true },
|
|
310
|
+
cw_contract_show: { readOnlyHint: true },
|
|
311
|
+
cw_node_list: { readOnlyHint: true },
|
|
312
|
+
cw_node_show: { readOnlyHint: true },
|
|
313
|
+
cw_node_graph: { readOnlyHint: true },
|
|
314
|
+
cw_migration_list: { readOnlyHint: true },
|
|
315
|
+
cw_operator_status: { readOnlyHint: true },
|
|
316
|
+
cw_operator_graph: { readOnlyHint: true },
|
|
317
|
+
cw_worker_summary: { readOnlyHint: true },
|
|
318
|
+
cw_candidate_summary: { readOnlyHint: true },
|
|
319
|
+
cw_feedback_summary: { readOnlyHint: true },
|
|
320
|
+
cw_commit_summary: { readOnlyHint: true },
|
|
321
|
+
cw_multi_agent_summary: { readOnlyHint: true },
|
|
322
|
+
cw_multi_agent_graph: { readOnlyHint: true },
|
|
323
|
+
cw_multi_agent_dependencies: { readOnlyHint: true },
|
|
324
|
+
cw_multi_agent_failures: { readOnlyHint: true },
|
|
325
|
+
cw_multi_agent_evidence: { readOnlyHint: true },
|
|
326
|
+
cw_summary_show: { readOnlyHint: true },
|
|
327
|
+
cw_blackboard_summarize: { readOnlyHint: true },
|
|
328
|
+
cw_multi_agent_summarize: { readOnlyHint: true },
|
|
329
|
+
cw_multi_agent_graph_compact: { readOnlyHint: true },
|
|
330
|
+
cw_multi_agent_status: { readOnlyHint: true },
|
|
331
|
+
cw_multi_agent_run_show: { readOnlyHint: true },
|
|
332
|
+
cw_topology_list: { readOnlyHint: true },
|
|
333
|
+
cw_topology_show: { readOnlyHint: true },
|
|
334
|
+
cw_topology_validate: { readOnlyHint: true },
|
|
335
|
+
cw_topology_summary: { readOnlyHint: true },
|
|
336
|
+
cw_topology_graph: { readOnlyHint: true },
|
|
337
|
+
cw_blackboard_summary: { readOnlyHint: true },
|
|
338
|
+
cw_blackboard_graph: { readOnlyHint: true },
|
|
339
|
+
cw_blackboard_message_list: { readOnlyHint: true },
|
|
340
|
+
cw_blackboard_artifact_list: { readOnlyHint: true },
|
|
341
|
+
cw_coordinator_summary: { readOnlyHint: true },
|
|
342
|
+
cw_audit_summary: { readOnlyHint: true },
|
|
343
|
+
cw_audit_verify: { readOnlyHint: true },
|
|
344
|
+
cw_audit_worker: { readOnlyHint: true },
|
|
345
|
+
cw_audit_provenance: { readOnlyHint: true },
|
|
346
|
+
cw_audit_multi_agent: { readOnlyHint: true },
|
|
347
|
+
cw_audit_policy: { readOnlyHint: true },
|
|
348
|
+
cw_audit_role: { readOnlyHint: true },
|
|
349
|
+
cw_audit_blackboard: { readOnlyHint: true },
|
|
350
|
+
cw_audit_judge: { readOnlyHint: true },
|
|
351
|
+
cw_sandbox_list: { readOnlyHint: true },
|
|
352
|
+
cw_sandbox_show: { readOnlyHint: true },
|
|
353
|
+
cw_sandbox_validate: { readOnlyHint: true },
|
|
354
|
+
cw_backend_list: { readOnlyHint: true },
|
|
355
|
+
cw_backend_show: { readOnlyHint: true },
|
|
356
|
+
cw_backend_agent_config_show: { readOnlyHint: true },
|
|
357
|
+
cw_app_list: { readOnlyHint: true },
|
|
358
|
+
cw_app_show: { readOnlyHint: true },
|
|
359
|
+
cw_app_validate: { readOnlyHint: true },
|
|
360
|
+
cw_worker_list: { readOnlyHint: true },
|
|
361
|
+
cw_worker_show: { readOnlyHint: true },
|
|
362
|
+
cw_candidate_list: { readOnlyHint: true },
|
|
363
|
+
cw_candidate_show: { readOnlyHint: true },
|
|
364
|
+
cw_comment_list: { readOnlyHint: true },
|
|
365
|
+
cw_review_status: { readOnlyHint: true },
|
|
366
|
+
cw_feedback_list: { readOnlyHint: true },
|
|
367
|
+
cw_feedback_show: { readOnlyHint: true },
|
|
368
|
+
cw_ledger_verify: { readOnlyHint: true },
|
|
369
|
+
cw_ledger_apply: { readOnlyHint: true },
|
|
370
|
+
cw_ledger_list: { readOnlyHint: true },
|
|
371
|
+
cw_schedule_list: { readOnlyHint: true },
|
|
372
|
+
cw_schedule_history: { readOnlyHint: true },
|
|
373
|
+
cw_routine_list: { readOnlyHint: true },
|
|
374
|
+
cw_routine_events: { readOnlyHint: true },
|
|
375
|
+
cw_registry_show: { readOnlyHint: true },
|
|
376
|
+
cw_metrics_summary: { readOnlyHint: true },
|
|
377
|
+
cw_run_search: { readOnlyHint: true },
|
|
378
|
+
cw_run_list: { readOnlyHint: true },
|
|
379
|
+
cw_run_show: { readOnlyHint: true },
|
|
380
|
+
cw_run_inspect_archive: { readOnlyHint: true },
|
|
381
|
+
cw_run_drive: { readOnlyHint: true },
|
|
382
|
+
cw_queue_list: { readOnlyHint: true },
|
|
383
|
+
cw_queue_show: { readOnlyHint: true },
|
|
384
|
+
cw_sched_plan: { readOnlyHint: true },
|
|
385
|
+
cw_sched_policy_show: { readOnlyHint: true },
|
|
386
|
+
cw_gc_plan: { readOnlyHint: true },
|
|
387
|
+
cw_gc_verify: { readOnlyHint: true },
|
|
388
|
+
cw_clones_list: { readOnlyHint: true },
|
|
389
|
+
cw_orphans_list: { readOnlyHint: true },
|
|
390
|
+
cw_telemetry_verify: { readOnlyHint: true },
|
|
391
|
+
cw_history: { readOnlyHint: true },
|
|
392
|
+
cw_audit_head: { readOnlyHint: true },
|
|
393
|
+
// delete sweeps (each handler checked by hand: all delete stored data)
|
|
394
|
+
cw_schedule_delete: { readOnlyHint: false, destructiveHint: true },
|
|
395
|
+
cw_routine_delete: { readOnlyHint: false, destructiveHint: true },
|
|
396
|
+
cw_gc_run: { readOnlyHint: false, destructiveHint: true },
|
|
397
|
+
cw_clones_gc: { readOnlyHint: false, destructiveHint: true },
|
|
398
|
+
cw_orphans_gc: { readOnlyHint: false, destructiveHint: true },
|
|
399
|
+
};
|
|
71
400
|
exports.MCP_TOOL_DATA = [
|
|
72
401
|
{ tool: "cw_list", capability: "list", requiredArgs: [], properties: [], description: "List bundled CW workflows." },
|
|
73
402
|
{ tool: "cw_plan", capability: "plan", requiredArgs: ["workflowId"], properties: ["workflowId", "repo", "question"], description: "Create a CW run and return its canonical plan summary." },
|
|
74
403
|
{ tool: "cw_app_run", capability: "app.run", requiredArgs: ["appId"], properties: ["cwd", "appId", "inputs", "sandbox", "sandboxProfile", "sandboxProfileId"], description: "Create a run from an app id + structured inputs." },
|
|
75
|
-
{ tool: "cw_status", capability: "status", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read run checkpoint status." },
|
|
404
|
+
{ tool: "cw_status", capability: "status", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read run checkpoint status. The quick first check on one run: lifecycle, task counts, and next actions. For the fuller operator view use cw_operator_status; for every panel in one call use cw_workbench_view." },
|
|
76
405
|
{ tool: "cw_init", capability: "init", requiredArgs: ["workflowId"], properties: ["workflowId", "title", "output"], description: "Scaffold a new workflow definition." },
|
|
77
406
|
{ tool: "cw_next", capability: "next", requiredArgs: ["runId"], properties: ["runId", "cwd", "limit"], description: "Read the next recommended tasks for a run." },
|
|
78
407
|
{ tool: "cw_state_check", capability: "state.check", requiredArgs: ["runId"], properties: ["runId", "cwd", "state", "write"], description: "Check run-state schema compatibility." },
|
|
@@ -87,11 +416,11 @@ exports.MCP_TOOL_DATA = [
|
|
|
87
416
|
{ tool: "cw_migration_list", capability: "migration.list", requiredArgs: [], properties: [], description: "List the declared migration registry." },
|
|
88
417
|
{ tool: "cw_migration_check", capability: "migration.check", requiredArgs: [], properties: ["target", "contract", "cwd"], description: "Dry-run migration verdict for a target." },
|
|
89
418
|
{ tool: "cw_migration_prove", capability: "migration.prove", requiredArgs: [], properties: ["target", "contract", "cwd"], description: "Round-trip / non-destruction migration proof for a target." },
|
|
90
|
-
{ tool: "cw_operator_status", capability: "operator.status", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the structured Operator UX run status." },
|
|
419
|
+
{ tool: "cw_operator_status", capability: "operator.status", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the structured Operator UX run status. Fuller than cw_status: workers, candidates, feedback, and commits in one operator view. For every panel in one call use cw_workbench_view; for agent-topology detail use cw_multi_agent_status." },
|
|
91
420
|
{ tool: "cw_operator_graph", capability: "graph", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the structured Operator UX run graph." },
|
|
92
421
|
{ tool: "cw_operator_report", capability: "operator.report", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Refresh and read the structured Operator UX report summary." },
|
|
93
422
|
{ tool: "cw_worker_summary", capability: "worker.summary", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the structured worker summary for a run." },
|
|
94
|
-
{ tool: "cw_workbench_view", capability: "workbench.view", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the read-only five-panel Workbench view of one run (graph, blackboard, worker, candidate, audit)." },
|
|
423
|
+
{ tool: "cw_workbench_view", capability: "workbench.view", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the read-only five-panel Workbench view of one run (graph, blackboard, worker, candidate, audit). The widest one-call overview; prefer it when you want everything at once. For one quick answer use cw_status or cw_operator_status instead." },
|
|
95
424
|
{ tool: "cw_workbench_serve", capability: "workbench.serve", requiredArgs: [], properties: ["cwd", "port", "scope", "requireToken"], description: "Describe/serve the optional localhost-only, read-only Workbench host. requireToken is a CLI-only opt-in (the MCP path never actually binds, so it is a no-op here)." },
|
|
96
425
|
{ tool: "cw_candidate_summary", capability: "candidate.summary", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the structured candidate summary for a run." },
|
|
97
426
|
{ tool: "cw_feedback_summary", capability: "feedback.summary", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the structured feedback summary for a run." },
|
|
@@ -109,7 +438,7 @@ exports.MCP_TOOL_DATA = [
|
|
|
109
438
|
{ tool: "cw_multi_agent_summarize", capability: "multi-agent.summarize", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read the combined state-explosion report." },
|
|
110
439
|
{ tool: "cw_multi_agent_graph_compact", capability: "multi-agent.graph.compact", requiredArgs: ["runId"], properties: ["runId", "cwd", "view", "focus", "depth"], description: "Read a compact/focused multi-agent graph view." },
|
|
111
440
|
{ tool: "cw_multi_agent_run", capability: "multi-agent.run", requiredArgs: [], properties: ["runId", "cwd", "app", "appId", "workflow", "workflowId", "topology", "topologyId", "task", "mapperCount", "judgeCount", "debateRounds"], description: "Create or attach a topology-backed multi-agent run." },
|
|
112
|
-
{ tool: "cw_multi_agent_status", capability: "multi-agent.status", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read combined topology/blackboard/worker status." },
|
|
441
|
+
{ tool: "cw_multi_agent_status", capability: "multi-agent.status", requiredArgs: ["runId"], properties: ["runId", "cwd"], description: "Read combined topology/blackboard/worker status. Best for a multi-agent run: what each agent group is doing and what is blocked. For a plain run use cw_status; for every panel in one call use cw_workbench_view." },
|
|
113
442
|
{ tool: "cw_multi_agent_step", capability: "multi-agent.step", requiredArgs: ["runId"], properties: ["runId", "cwd", "sandbox", "backend", "limit"], description: "Perform one safe deterministic host step." },
|
|
114
443
|
{ tool: "cw_multi_agent_blackboard", capability: "multi-agent.blackboard", requiredArgs: ["runId"], properties: ["runId", "cwd", "action", "blackboardId", "topicId", "body", "kind", "path", "evidence"], description: "Operate on the active multi-agent blackboard." },
|
|
115
444
|
{ tool: "cw_multi_agent_score", capability: "multi-agent.score", requiredArgs: ["runId"], properties: ["runId", "cwd", "candidate", "candidateId", "worker", "criterion", "criteria", "evidence", "maxTotal"], description: "Score a candidate with evidence." },
|
|
@@ -168,7 +497,7 @@ exports.MCP_TOOL_DATA = [
|
|
|
168
497
|
{ tool: "cw_sandbox_show", capability: "sandbox.show", requiredArgs: ["profileId"], properties: ["cwd", "profileId"], description: "Show a resolved sandbox profile." },
|
|
169
498
|
{ tool: "cw_sandbox_validate", capability: "sandbox.validate", requiredArgs: ["profileFile"], properties: ["cwd", "profileFile"], description: "Validate a sandbox profile JSON file." },
|
|
170
499
|
{ tool: "cw_sandbox_choose", capability: "sandbox.choose", requiredArgs: [], properties: ["cwd", "profileId", "sandbox", "sandboxProfile", "sandboxProfileId"], description: "Resolve and validate a sandbox profile choice." },
|
|
171
|
-
{ tool: "cw_sandbox_resolve", capability: "sandbox.resolve", requiredArgs: [], properties: ["cwd", "profileId", "sandbox", "sandboxProfile", "sandboxProfileId"], description: "Alias of sandbox.choose." },
|
|
500
|
+
{ tool: "cw_sandbox_resolve", capability: "sandbox.resolve", requiredArgs: [], properties: ["cwd", "profileId", "sandbox", "sandboxProfile", "sandboxProfileId"], description: "Alias of sandbox.choose: a pure alias with the same input and the same output. Prefer cw_sandbox_choose." },
|
|
172
501
|
{ tool: "cw_backend_list", capability: "backend.list", requiredArgs: [], properties: ["cwd"], description: "List available execution backends and their capabilities." },
|
|
173
502
|
{ tool: "cw_backend_show", capability: "backend.show", requiredArgs: [], properties: ["cwd", "backendId"], description: "Show one execution backend descriptor." },
|
|
174
503
|
{ tool: "cw_backend_probe", capability: "backend.probe", requiredArgs: [], properties: ["cwd", "backendId"], description: "Probe execution backend readiness (live, deterministic)." },
|