cool-workflow 0.1.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.claude-plugin/plugin.json +20 -0
  2. package/.codex-plugin/mcp.json +10 -0
  3. package/.codex-plugin/plugin.json +38 -0
  4. package/.mcp.json +10 -0
  5. package/LICENSE +24 -0
  6. package/README.md +638 -0
  7. package/apps/architecture-review/app.json +51 -0
  8. package/apps/architecture-review/workflow.js +116 -0
  9. package/apps/end-to-end-golden-path/app.json +30 -0
  10. package/apps/end-to-end-golden-path/workflow.js +33 -0
  11. package/apps/pr-review-fix-ci/app.json +59 -0
  12. package/apps/pr-review-fix-ci/workflow.js +90 -0
  13. package/apps/release-cut/app.json +54 -0
  14. package/apps/release-cut/workflow.js +82 -0
  15. package/apps/research-synthesis/app.json +50 -0
  16. package/apps/research-synthesis/workflow.js +76 -0
  17. package/apps/workflow-app-framework-demo/app.json +29 -0
  18. package/apps/workflow-app-framework-demo/workflow.js +44 -0
  19. package/dist/agent-config.js +223 -0
  20. package/dist/candidate-scoring.js +715 -0
  21. package/dist/capability-core.js +630 -0
  22. package/dist/capability-dispatcher.js +86 -0
  23. package/dist/capability-registry.js +523 -0
  24. package/dist/cli.js +1276 -0
  25. package/dist/collaboration.js +727 -0
  26. package/dist/commit.js +570 -0
  27. package/dist/contract-migration.js +234 -0
  28. package/dist/coordinator.js +1163 -0
  29. package/dist/daemon.js +44 -0
  30. package/dist/dispatch.js +201 -0
  31. package/dist/drive.js +503 -0
  32. package/dist/error-feedback.js +415 -0
  33. package/dist/evidence-grounding.js +179 -0
  34. package/dist/evidence-reasoning.js +733 -0
  35. package/dist/execution-backend.js +1279 -0
  36. package/dist/harness.js +61 -0
  37. package/dist/mcp-server.js +1615 -0
  38. package/dist/multi-agent-eval.js +857 -0
  39. package/dist/multi-agent-host.js +764 -0
  40. package/dist/multi-agent-operator-ux.js +537 -0
  41. package/dist/multi-agent-trust.js +366 -0
  42. package/dist/multi-agent.js +1173 -0
  43. package/dist/node-snapshot.js +270 -0
  44. package/dist/observability.js +922 -0
  45. package/dist/operator-ux.js +971 -0
  46. package/dist/orchestrator/audit-operations.js +182 -0
  47. package/dist/orchestrator/candidate-operations.js +117 -0
  48. package/dist/orchestrator/cli-options.js +288 -0
  49. package/dist/orchestrator/collaboration-operations.js +86 -0
  50. package/dist/orchestrator/feedback-operations.js +81 -0
  51. package/dist/orchestrator/host-operations.js +78 -0
  52. package/dist/orchestrator/lifecycle-operations.js +462 -0
  53. package/dist/orchestrator/migration-operations.js +44 -0
  54. package/dist/orchestrator/multi-agent-operations.js +362 -0
  55. package/dist/orchestrator/report.js +369 -0
  56. package/dist/orchestrator/topology-operations.js +84 -0
  57. package/dist/orchestrator.js +874 -0
  58. package/dist/pipeline-contract.js +92 -0
  59. package/dist/pipeline-runner.js +285 -0
  60. package/dist/reclamation.js +882 -0
  61. package/dist/result-normalize.js +194 -0
  62. package/dist/run-export.js +64 -0
  63. package/dist/run-registry.js +1347 -0
  64. package/dist/run-state-schema.js +67 -0
  65. package/dist/sandbox-profile.js +471 -0
  66. package/dist/scheduler.js +266 -0
  67. package/dist/scheduling.js +184 -0
  68. package/dist/schema-validate.js +98 -0
  69. package/dist/state-explosion.js +1213 -0
  70. package/dist/state-migrations.js +463 -0
  71. package/dist/state-node.js +301 -0
  72. package/dist/state.js +308 -0
  73. package/dist/telemetry-attestation.js +156 -0
  74. package/dist/telemetry-ledger.js +145 -0
  75. package/dist/topology.js +527 -0
  76. package/dist/triggers.js +159 -0
  77. package/dist/trust-audit.js +475 -0
  78. package/dist/types/blackboard.js +2 -0
  79. package/dist/types/boundary.js +29 -0
  80. package/dist/types/candidate.js +2 -0
  81. package/dist/types/collaboration.js +2 -0
  82. package/dist/types/core.js +2 -0
  83. package/dist/types/drive.js +10 -0
  84. package/dist/types/error-feedback.js +2 -0
  85. package/dist/types/evidence-reasoning.js +2 -0
  86. package/dist/types/execution-backend.js +2 -0
  87. package/dist/types/multi-agent.js +2 -0
  88. package/dist/types/observability.js +2 -0
  89. package/dist/types/pipeline.js +2 -0
  90. package/dist/types/reclamation.js +8 -0
  91. package/dist/types/result.js +2 -0
  92. package/dist/types/run-registry.js +2 -0
  93. package/dist/types/run.js +2 -0
  94. package/dist/types/sandbox.js +2 -0
  95. package/dist/types/schedule.js +2 -0
  96. package/dist/types/state-node.js +2 -0
  97. package/dist/types/topology.js +2 -0
  98. package/dist/types/trust.js +2 -0
  99. package/dist/types/workbench.js +2 -0
  100. package/dist/types/worker.js +2 -0
  101. package/dist/types/workflow-app.js +2 -0
  102. package/dist/types.js +43 -0
  103. package/dist/verifier-registry.js +46 -0
  104. package/dist/verifier.js +78 -0
  105. package/dist/version.js +8 -0
  106. package/dist/workbench-host.js +172 -0
  107. package/dist/workbench.js +190 -0
  108. package/dist/worker-isolation.js +1028 -0
  109. package/dist/workflow-api.js +98 -0
  110. package/dist/workflow-app-framework.js +626 -0
  111. package/docs/agent-delegation-drive.7.md +190 -0
  112. package/docs/agent-framework.md +176 -0
  113. package/docs/candidate-scoring.7.md +106 -0
  114. package/docs/canonical-workflow-apps.7.md +137 -0
  115. package/docs/capability-topology-registry.7.md +168 -0
  116. package/docs/cli-mcp-parity.7.md +373 -0
  117. package/docs/contract-migration-tooling.7.md +123 -0
  118. package/docs/control-plane-scheduling.7.md +110 -0
  119. package/docs/coordinator-blackboard.7.md +183 -0
  120. package/docs/dogfood/architecture-review-cool-workflow.md +16 -0
  121. package/docs/dogfood-one-real-repo.7.md +168 -0
  122. package/docs/durable-state-and-locking.7.md +107 -0
  123. package/docs/end-to-end-golden-path.7.md +117 -0
  124. package/docs/error-feedback.7.md +153 -0
  125. package/docs/evidence-adoption-reasoning-chain.7.md +270 -0
  126. package/docs/execution-backends.7.md +300 -0
  127. package/docs/getting-started.md +99 -0
  128. package/docs/index.md +41 -0
  129. package/docs/mcp-app-surface.7.md +235 -0
  130. package/docs/multi-agent-cli-mcp-surface.7.md +265 -0
  131. package/docs/multi-agent-eval-replay-harness.7.md +302 -0
  132. package/docs/multi-agent-operator-ux.7.md +314 -0
  133. package/docs/multi-agent-runtime-core.7.md +231 -0
  134. package/docs/multi-agent-topologies.7.md +103 -0
  135. package/docs/multi-agent-trust-policy-audit.7.md +154 -0
  136. package/docs/node-snapshot-diff-replay.7.md +135 -0
  137. package/docs/observability-cost-accounting.7.md +194 -0
  138. package/docs/operator-ux.7.md +180 -0
  139. package/docs/pipeline-runner.7.md +136 -0
  140. package/docs/project-index.md +261 -0
  141. package/docs/real-execution-backends.7.md +142 -0
  142. package/docs/release-and-migration.7.md +280 -0
  143. package/docs/release-tooling.7.md +159 -0
  144. package/docs/routines.md +48 -0
  145. package/docs/run-registry-control-plane.7.md +312 -0
  146. package/docs/run-retention-reclamation.7.md +191 -0
  147. package/docs/sandbox-profiles.7.md +137 -0
  148. package/docs/scheduled-tasks.md +80 -0
  149. package/docs/security-trust-hardening.7.md +117 -0
  150. package/docs/state-explosion-management.7.md +264 -0
  151. package/docs/state-node.7.md +96 -0
  152. package/docs/team-collaboration.7.md +207 -0
  153. package/docs/unix-principles.md +192 -0
  154. package/docs/verifier-gated-commit.7.md +140 -0
  155. package/docs/web-desktop-workbench.7.md +215 -0
  156. package/docs/worker-isolation.7.md +167 -0
  157. package/docs/workflow-app-framework.7.md +274 -0
  158. package/manifest/README.md +43 -0
  159. package/manifest/plugin.manifest.json +316 -0
  160. package/manifest/pricing.policy.json +14 -0
  161. package/package.json +79 -0
  162. package/scripts/agents/claude-p-agent.js +104 -0
  163. package/scripts/agents/claude-p-agent.sh +9 -0
  164. package/scripts/agents/cw-attest-keygen.js +55 -0
  165. package/scripts/agents/cw-attest-wrap.js +143 -0
  166. package/scripts/block-unapproved-tag.sh +39 -0
  167. package/scripts/bump-version.js +249 -0
  168. package/scripts/canonical-apps.js +171 -0
  169. package/scripts/cw.js +4 -0
  170. package/scripts/dist-drift-check.js +79 -0
  171. package/scripts/dogfood-architecture-review.js +237 -0
  172. package/scripts/dogfood-release.js +624 -0
  173. package/scripts/forward-ref-docs.js +73 -0
  174. package/scripts/gen-manifests.js +232 -0
  175. package/scripts/golden-path.js +300 -0
  176. package/scripts/mcp-server.js +4 -0
  177. package/scripts/new-feature.js +121 -0
  178. package/scripts/parity-check.js +213 -0
  179. package/scripts/release-check.js +118 -0
  180. package/scripts/release-flow.js +272 -0
  181. package/scripts/release-gate.sh +85 -0
  182. package/scripts/sync-project-index.js +387 -0
  183. package/scripts/validate-run-state-schema.js +126 -0
  184. package/scripts/verify-container-selfref.js +64 -0
  185. package/scripts/version-sync-check.js +237 -0
  186. package/skills/cool-workflow/SKILL.md +162 -0
  187. package/skills/cool-workflow/references/commands.md +282 -0
  188. package/tsconfig.json +16 -0
  189. package/ui/workbench/app.css +76 -0
  190. package/ui/workbench/app.js +159 -0
  191. package/ui/workbench/index.html +32 -0
  192. package/workflows/architecture-review.workflow.js +84 -0
  193. package/workflows/research-synthesis.workflow.js +47 -0
@@ -0,0 +1,1615 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const orchestrator_1 = require("./orchestrator");
9
+ const capability_registry_1 = require("./capability-registry");
10
+ const scheduler_1 = require("./scheduler");
11
+ const triggers_1 = require("./triggers");
12
+ const workbench_1 = require("./workbench");
13
+ const version_1 = require("./version");
14
+ const capability_core_1 = require("./capability-core");
15
+ const runner = new orchestrator_1.CoolWorkflowRunner({
16
+ pluginRoot: node_path_1.default.resolve(__dirname, "..")
17
+ });
18
+ process.stdin.setEncoding("utf8");
19
+ let buffer = "";
20
+ process.stdin.on("data", (chunk) => {
21
+ buffer += chunk;
22
+ let newlineIndex;
23
+ while ((newlineIndex = buffer.indexOf("\n")) >= 0) {
24
+ const line = buffer.slice(0, newlineIndex).trim();
25
+ buffer = buffer.slice(newlineIndex + 1);
26
+ if (line)
27
+ handleLine(line);
28
+ }
29
+ });
30
+ function handleLine(line) {
31
+ let message;
32
+ try {
33
+ message = JSON.parse(line);
34
+ }
35
+ catch (error) {
36
+ sendError(null, -32700, `Parse error: ${messageOf(error)}`);
37
+ return;
38
+ }
39
+ try {
40
+ if (message.method === "initialize") {
41
+ sendResult(message.id, {
42
+ protocolVersion: "2024-11-05",
43
+ capabilities: { tools: {} },
44
+ serverInfo: { name: "cool-workflow", version: version_1.CURRENT_COOL_WORKFLOW_VERSION }
45
+ });
46
+ return;
47
+ }
48
+ if (message.method === "tools/list") {
49
+ sendResult(message.id, { tools: toolDefinitions() });
50
+ return;
51
+ }
52
+ if (message.method === "tools/call") {
53
+ const toolName = requiredToolName(message.params?.name);
54
+ const toolArgs = requiredToolArguments(toolName, message.params?.arguments);
55
+ const result = callTool(toolName, toolArgs);
56
+ sendResult(message.id, {
57
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }]
58
+ });
59
+ return;
60
+ }
61
+ if (message.id !== undefined)
62
+ sendError(message.id, -32601, `Unknown method: ${message.method}`);
63
+ }
64
+ catch (error) {
65
+ sendError(message.id, -32000, messageOf(error));
66
+ }
67
+ }
68
+ function callTool(name, args) {
69
+ const previousCwd = process.cwd();
70
+ if (args.cwd)
71
+ process.chdir(String(args.cwd));
72
+ const scheduler = new scheduler_1.Scheduler(process.cwd());
73
+ const triggers = new triggers_1.RoutineTriggerBridge(process.cwd());
74
+ try {
75
+ switch (name) {
76
+ case "cw_list":
77
+ return runner.listWorkflows();
78
+ case "cw_plan":
79
+ return (0, capability_core_1.planSummary)(runner, String(args.workflowId || ""), args);
80
+ case "cw_app_run":
81
+ return (0, capability_core_1.appRun)(runner, args);
82
+ case "cw_status":
83
+ return runner.status(String(args.runId || ""));
84
+ case "cw_init":
85
+ return runner.init(String(args.workflowId || ""), args);
86
+ case "cw_next":
87
+ return runner.next(String(args.runId || ""), args);
88
+ case "cw_state_check":
89
+ return runner.checkState(String(args.runId || ""), args);
90
+ case "cw_contract_show":
91
+ return runner.showContract(String(args.runId || ""), (0, capability_core_1.optionalString)(args.contractId));
92
+ case "cw_node_list":
93
+ return runner.listNodes(String(args.runId || ""));
94
+ case "cw_node_show":
95
+ return runner.showNode(String(args.runId || ""), String(args.nodeId || ""));
96
+ case "cw_node_graph":
97
+ return runner.graphNodes(String(args.runId || ""));
98
+ case "cw_node_snapshot":
99
+ return runner.nodeSnapshot(String(args.runId || ""), String(args.nodeId || ""), args);
100
+ case "cw_node_diff":
101
+ return runner.nodeDiff(String(args.runId || ""), String(args.baselineSnapshotId || args.baseline || ""), String(args.candidateSnapshotId || args.candidate || ""));
102
+ case "cw_node_replay":
103
+ return runner.nodeReplay(String(args.runId || ""), String(args.snapshotId || ""), args);
104
+ case "cw_node_replay_verify":
105
+ return runner.nodeReplayVerify(String(args.runId || ""), String(args.replayId || ""), args);
106
+ case "cw_migration_list":
107
+ return runner.migrationList();
108
+ case "cw_migration_check":
109
+ return runner.migrationCheck(String(args.target || args.runId || ""), args);
110
+ case "cw_migration_prove":
111
+ return runner.migrationProve(String(args.target || args.runId || ""), args);
112
+ case "cw_operator_status":
113
+ return runner.operatorStatus(String(args.runId || ""));
114
+ case "cw_operator_graph":
115
+ return runner.operatorGraph(String(args.runId || ""));
116
+ case "cw_operator_report":
117
+ return runner.operatorReport(String(args.runId || ""));
118
+ case "cw_worker_summary":
119
+ return runner.summarizeWorkerRecords(String(args.runId || ""));
120
+ case "cw_candidate_summary":
121
+ return runner.summarizeCandidateOperatorRecords(String(args.runId || ""));
122
+ case "cw_feedback_summary":
123
+ return runner.summarizeFeedbackRecords(String(args.runId || ""));
124
+ case "cw_commit_summary":
125
+ return runner.summarizeCommitRecords(String(args.runId || ""));
126
+ case "cw_multi_agent_summary":
127
+ return runner.multiAgentSummary(String(args.runId || ""));
128
+ case "cw_multi_agent_graph":
129
+ return runner.multiAgentOperatorGraph(String(args.runId || ""));
130
+ case "cw_multi_agent_dependencies":
131
+ return runner.multiAgentDependencies(String(args.runId || ""));
132
+ case "cw_multi_agent_failures":
133
+ return runner.multiAgentFailures(String(args.runId || ""));
134
+ case "cw_multi_agent_evidence":
135
+ return runner.multiAgentEvidence(String(args.runId || ""));
136
+ case "cw_evidence_reasoning":
137
+ return runner.multiAgentReasoning(String(args.runId || ""), args);
138
+ case "cw_evidence_reasoning_refresh":
139
+ return runner.multiAgentReasoningRefresh(String(args.runId || ""));
140
+ case "cw_multi_agent_run":
141
+ return runner.hostMultiAgentRun((0, capability_core_1.optionalString)(args.runId), args);
142
+ case "cw_multi_agent_status":
143
+ return runner.hostMultiAgentStatus(String(args.runId || ""));
144
+ case "cw_multi_agent_step":
145
+ return runner.hostMultiAgentStep(String(args.runId || ""), args);
146
+ case "cw_multi_agent_blackboard":
147
+ return runner.hostMultiAgentBlackboard(String(args.runId || ""), (0, capability_core_1.optionalString)(args.action || args.operation), args);
148
+ case "cw_multi_agent_score":
149
+ return runner.hostMultiAgentScore(String(args.runId || ""), args);
150
+ case "cw_multi_agent_select":
151
+ return runner.hostMultiAgentSelect(String(args.runId || ""), args);
152
+ case "cw_summary_refresh":
153
+ return runner.summaryRefresh(String(args.runId || ""), args);
154
+ case "cw_summary_show":
155
+ return runner.summaryShow(String(args.runId || ""));
156
+ case "cw_blackboard_summarize":
157
+ return runner.blackboardSummarize(String(args.runId || ""), args);
158
+ case "cw_multi_agent_summarize":
159
+ return runner.multiAgentSummarize(String(args.runId || ""));
160
+ case "cw_multi_agent_graph_compact":
161
+ return runner.multiAgentGraphView(String(args.runId || ""), args);
162
+ case "cw_eval_snapshot":
163
+ return runner.evalSnapshot(String(args.runId || ""), args);
164
+ case "cw_eval_replay":
165
+ return runner.evalReplay(String(args.snapshot || args.snapshotId || args.path || ""), args);
166
+ case "cw_eval_compare":
167
+ return runner.evalCompare(String(args.baseline || args.baselinePath || ""), String(args.replay || args.replayPath || ""));
168
+ case "cw_eval_score":
169
+ return runner.evalScore(String(args.replay || args.replayPath || args.path || ""));
170
+ case "cw_eval_gate":
171
+ return runner.evalGate(String(args.suite || args.suiteId || args.path || ""));
172
+ case "cw_eval_report":
173
+ return runner.evalReport(String(args.replay || args.replayPath || args.path || ""));
174
+ case "cw_multi_agent_run_create":
175
+ return runner.createMultiAgentRun(String(args.runId || ""), args);
176
+ case "cw_multi_agent_run_transition":
177
+ return runner.transitionMultiAgentRun(String(args.runId || ""), String(args.multiAgentRunId || args.id || ""), args);
178
+ case "cw_multi_agent_run_show":
179
+ return runner.showMultiAgentRun(String(args.runId || ""), String(args.multiAgentRunId || args.id || ""));
180
+ case "cw_multi_agent_role_create":
181
+ return runner.createAgentRole(String(args.runId || ""), args);
182
+ case "cw_multi_agent_role_show":
183
+ return runner.showAgentRole(String(args.runId || ""), String(args.roleId || args.id || ""));
184
+ case "cw_multi_agent_group_create":
185
+ return runner.createAgentGroup(String(args.runId || ""), args);
186
+ case "cw_multi_agent_group_show":
187
+ return runner.showAgentGroup(String(args.runId || ""), String(args.groupId || args.id || ""));
188
+ case "cw_multi_agent_membership_create":
189
+ return runner.assignAgentMembership(String(args.runId || ""), args);
190
+ case "cw_multi_agent_membership_show":
191
+ return runner.showAgentMembership(String(args.runId || ""), String(args.membershipId || args.id || ""));
192
+ case "cw_multi_agent_fanout_create":
193
+ return runner.createAgentFanout(String(args.runId || ""), args);
194
+ case "cw_multi_agent_fanout_show":
195
+ return runner.showAgentFanout(String(args.runId || ""), String(args.fanoutId || args.id || ""));
196
+ case "cw_multi_agent_fanin_collect":
197
+ return runner.collectAgentFanin(String(args.runId || ""), args);
198
+ case "cw_multi_agent_fanin_show":
199
+ return runner.showAgentFanin(String(args.runId || ""), String(args.faninId || args.id || ""));
200
+ case "cw_topology_list":
201
+ return runner.listTopologies();
202
+ case "cw_topology_show":
203
+ if (args.runId && (args.topologyRunId || args.id))
204
+ return runner.showTopologyRun(String(args.runId || ""), String(args.topologyRunId || args.id || ""));
205
+ return runner.showTopology(String(args.topologyId || args.id || ""));
206
+ case "cw_topology_validate":
207
+ return runner.validateTopology(String(args.topologyId || args.id || ""));
208
+ case "cw_topology_apply":
209
+ return runner.applyTopology(String(args.runId || ""), String(args.topologyId || args.id || ""), args);
210
+ case "cw_topology_summary":
211
+ return runner.topologySummary(String(args.runId || ""));
212
+ case "cw_topology_graph":
213
+ return runner.topologyGraph(String(args.runId || ""));
214
+ case "cw_blackboard_summary":
215
+ return runner.blackboardSummary(String(args.runId || ""), args);
216
+ case "cw_blackboard_graph":
217
+ return runner.blackboardGraph(String(args.runId || ""));
218
+ case "cw_blackboard_resolve":
219
+ return runner.resolveRunBlackboard(String(args.runId || ""), args);
220
+ case "cw_blackboard_topic_create":
221
+ return runner.createBlackboardTopic(String(args.runId || ""), args);
222
+ case "cw_blackboard_message_post":
223
+ return runner.postBlackboardMessage(String(args.runId || ""), args);
224
+ case "cw_blackboard_message_list":
225
+ return runner.listBlackboardMessages(String(args.runId || ""), args);
226
+ case "cw_blackboard_context_put":
227
+ return runner.putBlackboardContext(String(args.runId || ""), args);
228
+ case "cw_blackboard_artifact_add":
229
+ return runner.addBlackboardArtifact(String(args.runId || ""), args);
230
+ case "cw_blackboard_artifact_list":
231
+ return runner.listBlackboardArtifacts(String(args.runId || ""), args);
232
+ case "cw_blackboard_snapshot":
233
+ return runner.snapshotBlackboard(String(args.runId || ""), args);
234
+ case "cw_coordinator_summary":
235
+ return runner.coordinatorSummary(String(args.runId || ""), args);
236
+ case "cw_coordinator_decision":
237
+ return runner.recordCoordinatorDecision(String(args.runId || ""), args);
238
+ case "cw_audit_summary":
239
+ return runner.auditSummary(String(args.runId || ""));
240
+ case "cw_audit_worker":
241
+ return runner.workerAudit(String(args.runId || ""), String(args.workerId || ""));
242
+ case "cw_audit_provenance":
243
+ return runner.evidenceProvenance(String(args.runId || ""), args);
244
+ case "cw_audit_multi_agent":
245
+ return runner.auditMultiAgent(String(args.runId || ""));
246
+ case "cw_audit_policy":
247
+ return runner.auditPolicy(String(args.runId || ""));
248
+ case "cw_audit_role":
249
+ return runner.auditRole(String(args.runId || ""), String(args.roleId || args.id || ""));
250
+ case "cw_audit_blackboard":
251
+ return runner.auditBlackboard(String(args.runId || ""));
252
+ case "cw_audit_judge":
253
+ return runner.auditJudge(String(args.runId || ""));
254
+ case "cw_audit_attest":
255
+ return runner.recordAuditAttestation(String(args.runId || ""), args);
256
+ case "cw_audit_decision":
257
+ return runner.recordAuditDecision(String(args.runId || ""), String(args.workerId || ""), args);
258
+ case "cw_dispatch":
259
+ return runner.dispatch(String(args.runId || ""), args);
260
+ case "cw_sandbox_list":
261
+ return runner.listSandboxProfiles(args);
262
+ case "cw_sandbox_show":
263
+ return runner.showSandboxProfile(String(args.profileId || ""), args);
264
+ case "cw_sandbox_validate":
265
+ return runner.validateSandboxProfile(String(args.profileFile || ""), args);
266
+ case "cw_sandbox_choose":
267
+ case "cw_sandbox_resolve":
268
+ return (0, capability_core_1.sandboxChoose)(runner, args);
269
+ case "cw_backend_list":
270
+ return runner.listBackends(args);
271
+ case "cw_backend_show":
272
+ return runner.showBackend(String(args.backendId || args.backend || ""), args);
273
+ case "cw_backend_probe":
274
+ return runner.probeBackend((0, capability_core_1.optionalString)(args.backendId || args.backend), args);
275
+ case "cw_backend_agent_config_show":
276
+ return (0, capability_core_1.backendAgentConfigShow)(args);
277
+ case "cw_backend_agent_config_set":
278
+ return (0, capability_core_1.backendAgentConfigSet)(args);
279
+ case "cw_result":
280
+ return runner.recordResult(String(args.runId || ""), String(args.taskId || ""), String(args.resultPath || ""), args);
281
+ case "cw_commit":
282
+ return (0, capability_core_1.commitEnvelope)(runner, String(args.runId || ""), args);
283
+ case "cw_report":
284
+ return runner.report(String(args.runId || ""));
285
+ case "cw_app_list":
286
+ return runner.listApps();
287
+ case "cw_app_show":
288
+ return runner.showApp(String(args.appId || ""));
289
+ case "cw_app_validate":
290
+ return runner.validateApp(String(args.target || args.appId || args.path || ""));
291
+ case "cw_app_init":
292
+ return runner.initApp(String(args.appId || ""), args);
293
+ case "cw_app_package":
294
+ return runner.packageApp(String(args.appId || ""), args);
295
+ case "cw_worker_list":
296
+ return runner.listWorkers(String(args.runId || ""), args);
297
+ case "cw_worker_show":
298
+ return runner.showWorker(String(args.runId || ""), String(args.workerId || ""));
299
+ case "cw_worker_manifest":
300
+ return runner.showWorkerManifest(String(args.runId || ""), String(args.workerId || ""));
301
+ case "cw_worker_output":
302
+ return runner.recordWorkerOutput(String(args.runId || ""), String(args.workerId || ""), String(args.resultPath || ""), args);
303
+ case "cw_worker_fail":
304
+ return runner.recordWorkerFailure(String(args.runId || ""), String(args.workerId || ""), String(args.message || ""), args);
305
+ case "cw_worker_validate":
306
+ return runner.validateWorker(String(args.runId || ""), String(args.workerId || ""), (0, capability_core_1.optionalString)(args.path || args.resultPath));
307
+ case "cw_candidate_list":
308
+ return runner.listCandidates(String(args.runId || ""), args);
309
+ case "cw_candidate_show":
310
+ return runner.showCandidate(String(args.runId || ""), String(args.candidateId || ""));
311
+ case "cw_candidate_register":
312
+ return runner.registerCandidate(String(args.runId || ""), args);
313
+ case "cw_candidate_score":
314
+ return runner.scoreCandidate(String(args.runId || ""), String(args.candidateId || ""), args);
315
+ case "cw_candidate_rank":
316
+ return runner.rankCandidates(String(args.runId || ""), args);
317
+ case "cw_candidate_select":
318
+ return runner.selectCandidate(String(args.runId || ""), String(args.candidateId || ""), args);
319
+ case "cw_candidate_reject":
320
+ return runner.rejectCandidate(String(args.runId || ""), String(args.candidateId || ""), String(args.reason || "rejected"));
321
+ // ---- Team Collaboration (v0.1.32) ----
322
+ case "cw_approve":
323
+ return runner.collaborationApprove(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
324
+ case "cw_reject":
325
+ return runner.collaborationReject(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
326
+ case "cw_comment_add":
327
+ return runner.collaborationComment(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
328
+ case "cw_comment_list":
329
+ return runner.collaborationCommentList(String(args.runId || ""), args);
330
+ case "cw_handoff":
331
+ return runner.collaborationHandoff(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
332
+ case "cw_review_status":
333
+ return runner.reviewStatus(String(args.runId || ""), args);
334
+ case "cw_review_policy":
335
+ return runner.reviewPolicy(String(args.runId || ""), args);
336
+ case "cw_feedback_list":
337
+ return runner.listFeedback(String(args.runId || ""), args);
338
+ case "cw_feedback_show":
339
+ return runner.showFeedback(String(args.runId || ""), String(args.feedbackId || ""));
340
+ case "cw_feedback_collect":
341
+ return runner.collectFeedback(String(args.runId || ""));
342
+ case "cw_feedback_task":
343
+ return runner.createFeedbackTask(String(args.runId || ""), String(args.feedbackId || ""), args);
344
+ case "cw_feedback_resolve":
345
+ return runner.resolveFeedback(String(args.runId || ""), String(args.feedbackId || ""), args);
346
+ case "cw_schedule_create":
347
+ return scheduler.create(args);
348
+ case "cw_schedule_list":
349
+ return scheduler.list(args.status ? String(args.status) : undefined);
350
+ case "cw_schedule_delete":
351
+ return scheduler.delete(String(args.id || ""));
352
+ case "cw_schedule_due":
353
+ return scheduler.due();
354
+ case "cw_schedule_complete":
355
+ return scheduler.complete(String(args.id || ""), args);
356
+ case "cw_schedule_pause":
357
+ return scheduler.pause(String(args.id || ""));
358
+ case "cw_schedule_resume":
359
+ return scheduler.resume(String(args.id || ""));
360
+ case "cw_schedule_run_now":
361
+ return scheduler.runNow(String(args.id || ""));
362
+ case "cw_schedule_history":
363
+ return scheduler.history(args.id ? String(args.id) : undefined);
364
+ case "cw_routine_create":
365
+ return triggers.create(args);
366
+ case "cw_routine_list":
367
+ return triggers.list(args.kind ? String(args.kind) : undefined);
368
+ case "cw_routine_delete":
369
+ return triggers.delete(String(args.id || ""));
370
+ case "cw_routine_fire":
371
+ return triggers.fire(String(args.kind || "api"), args.payload || args);
372
+ case "cw_routine_events":
373
+ return triggers.events(args.id ? String(args.id) : undefined);
374
+ case "cw_registry_refresh":
375
+ return (0, capability_core_1.runRegistryRefresh)((0, capability_core_1.runRegistryFor)(args, runner), args);
376
+ case "cw_registry_show":
377
+ return (0, capability_core_1.runRegistryShow)((0, capability_core_1.runRegistryFor)(args, runner), args);
378
+ case "cw_metrics_show":
379
+ return runner.metricsShow(String(args.runId || ""), args);
380
+ case "cw_metrics_summary":
381
+ return (0, capability_core_1.metricsSummary)((0, capability_core_1.runRegistryFor)(args, runner), runner, args);
382
+ case "cw_run_search":
383
+ return (0, capability_core_1.runSearch)((0, capability_core_1.runRegistryFor)(args, runner), args);
384
+ case "cw_run_list":
385
+ return (0, capability_core_1.runList)((0, capability_core_1.runRegistryFor)(args, runner), args);
386
+ case "cw_run_show":
387
+ return (0, capability_core_1.runShow)((0, capability_core_1.runRegistryFor)(args, runner), String(args.runId || ""), args);
388
+ case "cw_run_resume":
389
+ return (0, capability_core_1.runResume)((0, capability_core_1.runRegistryFor)(args, runner), String(args.runId || ""), args);
390
+ case "cw_run_archive":
391
+ return (0, capability_core_1.runArchive)((0, capability_core_1.runRegistryFor)(args, runner), (0, capability_core_1.optionalString)(args.runId), args);
392
+ case "cw_run_rerun":
393
+ return (0, capability_core_1.runRerun)((0, capability_core_1.runRegistryFor)(args, runner), String(args.runId || ""), args);
394
+ case "cw_run_drive":
395
+ return (0, capability_core_1.runDrivePreview)(runner, args);
396
+ case "cw_run_drive_step":
397
+ return (0, capability_core_1.runDrive)(runner, args);
398
+ case "cw_queue_add":
399
+ return (0, capability_core_1.queueAdd)((0, capability_core_1.runRegistryFor)(args, runner), args);
400
+ case "cw_queue_list":
401
+ return (0, capability_core_1.queueList)((0, capability_core_1.runRegistryFor)(args, runner), args);
402
+ case "cw_queue_drain":
403
+ return (0, capability_core_1.queueDrain)((0, capability_core_1.runRegistryFor)(args, runner), args);
404
+ case "cw_queue_show":
405
+ return (0, capability_core_1.queueShow)((0, capability_core_1.runRegistryFor)(args, runner), String(args.id || ""));
406
+ case "cw_sched_plan":
407
+ return (0, capability_core_1.schedPlan)((0, capability_core_1.runRegistryFor)(args, runner), args);
408
+ case "cw_sched_lease":
409
+ return (0, capability_core_1.schedLease)((0, capability_core_1.runRegistryFor)(args, runner), args);
410
+ case "cw_sched_release":
411
+ return (0, capability_core_1.schedRelease)((0, capability_core_1.runRegistryFor)(args, runner), args);
412
+ case "cw_sched_complete":
413
+ return (0, capability_core_1.schedComplete)((0, capability_core_1.runRegistryFor)(args, runner), args);
414
+ case "cw_sched_reclaim":
415
+ return (0, capability_core_1.schedReclaim)((0, capability_core_1.runRegistryFor)(args, runner), args);
416
+ case "cw_sched_reset":
417
+ return (0, capability_core_1.schedReset)((0, capability_core_1.runRegistryFor)(args, runner), args);
418
+ case "cw_sched_policy_show":
419
+ return (0, capability_core_1.schedPolicyShow)((0, capability_core_1.runRegistryFor)(args, runner));
420
+ case "cw_sched_policy_set":
421
+ return (0, capability_core_1.schedPolicySet)((0, capability_core_1.runRegistryFor)(args, runner), args);
422
+ case "cw_gc_plan":
423
+ return (0, capability_core_1.gcPlan)((0, capability_core_1.runRegistryFor)(args, runner), (0, capability_core_1.optionalString)(args.runId), args);
424
+ case "cw_gc_run":
425
+ return (0, capability_core_1.gcRun)((0, capability_core_1.runRegistryFor)(args, runner), (0, capability_core_1.optionalString)(args.runId), args);
426
+ case "cw_gc_verify":
427
+ return (0, capability_core_1.gcVerify)((0, capability_core_1.runRegistryFor)(args, runner), String(args.runId || ""), args);
428
+ case "cw_history":
429
+ return (0, capability_core_1.runHistory)((0, capability_core_1.runRegistryFor)(args, runner), args);
430
+ case "cw_workbench_view":
431
+ return (0, workbench_1.buildWorkbenchRunView)(runner, String(args.runId || ""));
432
+ case "cw_workbench_serve":
433
+ // MCP cannot start a blocking server; it returns the descriptor only
434
+ // (identical to `cw workbench serve --json`). The CLI default additionally
435
+ // starts the localhost host — declared divergence (see capability-registry).
436
+ return (0, workbench_1.buildWorkbenchServeDescriptor)(runner, { ...args, once: true });
437
+ default: {
438
+ // ---- Dynamic capability dispatch fallback (v0.1.53) ---------------
439
+ // Mechanism: try the capability registry before failing. Policy: which
440
+ // tools exist is declared via registerCapabilityHandler at load time.
441
+ const capabilityId = (0, capability_registry_1.resolveMcpTool)(name);
442
+ if (capabilityId) {
443
+ const handler = (0, capability_registry_1.getCapabilityHandler)(capabilityId);
444
+ if (handler) {
445
+ return (0, capability_registry_1.dispatchCapability)(capabilityId, args, {
446
+ runner,
447
+ cwd: process.cwd()
448
+ });
449
+ }
450
+ }
451
+ throw new Error(`Unknown tool: ${name}`);
452
+ }
453
+ }
454
+ }
455
+ finally {
456
+ process.chdir(previousCwd);
457
+ }
458
+ }
459
+ function requiredToolName(value) {
460
+ if (typeof value !== "string" || !value.trim())
461
+ throw new Error("MCP tools/call missing required field: name");
462
+ return value;
463
+ }
464
+ function requiredToolArguments(name, value) {
465
+ if (value === undefined || value === null)
466
+ value = {};
467
+ if (!(0, capability_core_1.isRecord)(value))
468
+ throw new Error(`MCP tool ${name} arguments must be an object.`);
469
+ const args = value;
470
+ for (const group of requiredArgsForTool(name)) {
471
+ const keys = group.split("|");
472
+ if (!keys.some((key) => args[key] !== undefined && args[key] !== null && args[key] !== "")) {
473
+ throw new Error(`MCP tool ${name} missing required argument: ${keys.join(" or ")}`);
474
+ }
475
+ }
476
+ return args;
477
+ }
478
+ function requiredArgsForTool(name) {
479
+ if (name === "cw_plan" || name === "cw_init")
480
+ return ["workflowId"];
481
+ if (name === "cw_app_run")
482
+ return ["appId"];
483
+ if (name === "cw_node_show")
484
+ return ["runId", "nodeId"];
485
+ if (name === "cw_eval_replay")
486
+ return ["snapshot|snapshotId|path"];
487
+ if (name === "cw_eval_compare")
488
+ return ["baseline|baselinePath", "replay|replayPath"];
489
+ if (name === "cw_eval_score" || name === "cw_eval_report")
490
+ return ["replay|replayPath|path"];
491
+ if (name === "cw_eval_gate")
492
+ return ["suite|suiteId|path"];
493
+ if (name === "cw_topology_show" || name === "cw_topology_validate")
494
+ return ["topologyId|id"];
495
+ if (name === "cw_topology_apply")
496
+ return ["runId", "topologyId|id"];
497
+ if (name === "cw_sandbox_show")
498
+ return ["profileId"];
499
+ if (name === "cw_sandbox_validate")
500
+ return ["profileFile"];
501
+ if (name === "cw_schedule_delete" || name === "cw_schedule_complete" || name === "cw_schedule_pause" || name === "cw_schedule_resume" || name === "cw_schedule_run_now")
502
+ return ["id"];
503
+ if (name === "cw_routine_delete")
504
+ return ["id"];
505
+ if (name === "cw_routine_fire")
506
+ return ["kind"];
507
+ if (name === "cw_approve" || name === "cw_reject")
508
+ return ["runId", "targetKind|kind", "targetId|target"];
509
+ if (name === "cw_comment_add")
510
+ return ["runId", "targetKind|kind", "targetId|target", "body|message|text"];
511
+ if (name === "cw_handoff")
512
+ return ["runId", "targetKind|kind", "targetId|target", "to|toActor"];
513
+ if (name === "cw_run_show" || name === "cw_run_resume" || name === "cw_run_rerun")
514
+ return ["runId"];
515
+ if (name === "cw_run_archive")
516
+ return ["runId|olderThanDays"];
517
+ if (name === "cw_gc_verify")
518
+ return ["runId"];
519
+ if (name === "cw_queue_show")
520
+ return ["id"];
521
+ if (name.endsWith("_show")) {
522
+ if (name.includes("_role_"))
523
+ return ["runId", "roleId"];
524
+ if (name.includes("_group_"))
525
+ return ["runId", "groupId"];
526
+ if (name.includes("_membership_"))
527
+ return ["runId", "membershipId"];
528
+ if (name.includes("_fanout_"))
529
+ return ["runId", "fanoutId"];
530
+ if (name.includes("_fanin_"))
531
+ return ["runId", "faninId"];
532
+ if (name.includes("_candidate_"))
533
+ return ["runId", "candidateId"];
534
+ if (name.includes("_feedback_"))
535
+ return ["runId", "feedbackId"];
536
+ if (name.includes("_worker_"))
537
+ return ["runId", "workerId"];
538
+ }
539
+ if (name.startsWith("cw_") && [
540
+ "cw_status",
541
+ "cw_next",
542
+ "cw_state_check",
543
+ "cw_contract_show",
544
+ "cw_node_list",
545
+ "cw_node_graph",
546
+ "cw_operator_status",
547
+ "cw_operator_graph",
548
+ "cw_operator_report",
549
+ "cw_worker_summary",
550
+ "cw_workbench_view",
551
+ "cw_candidate_summary",
552
+ "cw_feedback_summary",
553
+ "cw_commit_summary",
554
+ "cw_multi_agent_summary",
555
+ "cw_multi_agent_graph",
556
+ "cw_multi_agent_dependencies",
557
+ "cw_multi_agent_failures",
558
+ "cw_multi_agent_evidence",
559
+ "cw_evidence_reasoning",
560
+ "cw_evidence_reasoning_refresh",
561
+ "cw_summary_refresh",
562
+ "cw_summary_show",
563
+ "cw_metrics_show",
564
+ "cw_blackboard_summarize",
565
+ "cw_multi_agent_summarize",
566
+ "cw_multi_agent_graph_compact",
567
+ "cw_multi_agent_status",
568
+ "cw_multi_agent_step",
569
+ "cw_multi_agent_blackboard",
570
+ "cw_multi_agent_score",
571
+ "cw_multi_agent_select",
572
+ "cw_eval_snapshot",
573
+ "cw_multi_agent_run_create",
574
+ "cw_multi_agent_run_transition",
575
+ "cw_multi_agent_run_show",
576
+ "cw_multi_agent_role_create",
577
+ "cw_multi_agent_group_create",
578
+ "cw_multi_agent_membership_create",
579
+ "cw_multi_agent_fanout_create",
580
+ "cw_multi_agent_fanin_collect",
581
+ "cw_topology_summary",
582
+ "cw_topology_graph",
583
+ "cw_blackboard_summary",
584
+ "cw_blackboard_graph",
585
+ "cw_blackboard_resolve",
586
+ "cw_blackboard_topic_create",
587
+ "cw_blackboard_message_post",
588
+ "cw_blackboard_message_list",
589
+ "cw_blackboard_context_put",
590
+ "cw_blackboard_artifact_add",
591
+ "cw_blackboard_artifact_list",
592
+ "cw_blackboard_snapshot",
593
+ "cw_coordinator_summary",
594
+ "cw_coordinator_decision",
595
+ "cw_audit_summary",
596
+ "cw_audit_worker",
597
+ "cw_audit_provenance",
598
+ "cw_audit_multi_agent",
599
+ "cw_audit_policy",
600
+ "cw_audit_role",
601
+ "cw_audit_blackboard",
602
+ "cw_audit_judge",
603
+ "cw_audit_attest",
604
+ "cw_audit_decision",
605
+ "cw_dispatch",
606
+ "cw_result",
607
+ "cw_commit",
608
+ "cw_report",
609
+ "cw_worker_list",
610
+ "cw_worker_manifest",
611
+ "cw_worker_output",
612
+ "cw_worker_fail",
613
+ "cw_worker_validate",
614
+ "cw_candidate_list",
615
+ "cw_candidate_register",
616
+ "cw_candidate_score",
617
+ "cw_candidate_rank",
618
+ "cw_candidate_select",
619
+ "cw_candidate_reject",
620
+ "cw_review_status",
621
+ "cw_review_policy",
622
+ "cw_comment_list",
623
+ "cw_feedback_list",
624
+ "cw_feedback_collect",
625
+ "cw_feedback_task",
626
+ "cw_feedback_resolve"
627
+ ].includes(name))
628
+ return ["runId"];
629
+ return [];
630
+ }
631
+ function toolDefinitions() {
632
+ return [
633
+ tool("cw_list", "List bundled CW workflows.", {}),
634
+ tool("cw_plan", "Create a CW run.", {
635
+ workflowId: stringSchema("Workflow id"),
636
+ repo: stringSchema("Repository path"),
637
+ question: stringSchema("User question")
638
+ }),
639
+ tool("cw_app_run", "Create a CW run from a Workflow App framework app id and structured inputs.", {
640
+ cwd: stringSchema("Workspace"),
641
+ appId: stringSchema("Workflow app id"),
642
+ inputs: objectSchema("Workflow app inputs such as repo, question, version, source, or dryRun"),
643
+ sandbox: stringSchema("Optional sandbox profile id to validate for this run"),
644
+ sandboxProfile: stringSchema("Optional sandbox profile id to validate for this run"),
645
+ sandboxProfileId: stringSchema("Optional sandbox profile id to validate for this run")
646
+ }),
647
+ tool("cw_status", "Read run checkpoint status.", {
648
+ runId: stringSchema("Run id"),
649
+ cwd: stringSchema("Run workspace")
650
+ }),
651
+ tool("cw_init", "Scaffold a new workflow definition. Peer of `cw init`.", {
652
+ workflowId: stringSchema("Workflow id"),
653
+ title: stringSchema("Workflow title"),
654
+ output: stringSchema("Output directory")
655
+ }),
656
+ tool("cw_next", "Read the next recommended tasks for a run. Peer of `cw next`.", {
657
+ ...runIdSchema(),
658
+ limit: numberSchema("Maximum tasks to return")
659
+ }),
660
+ tool("cw_state_check", "Check run-state schema compatibility. Peer of `cw state check`.", {
661
+ ...runIdSchema(),
662
+ state: stringSchema("Explicit state file path"),
663
+ write: booleanSchema("Persist a migrated copy when supported")
664
+ }),
665
+ tool("cw_contract_show", "Show a run's pipeline contract. Peer of `cw contract show`.", {
666
+ ...runIdSchema(),
667
+ contractId: stringSchema("Optional contract id")
668
+ }),
669
+ tool("cw_node_list", "List state nodes for a run. Peer of `cw node list`.", runIdSchema()),
670
+ tool("cw_node_show", "Show one state node for a run. Peer of `cw node show`.", {
671
+ ...runIdSchema(),
672
+ nodeId: stringSchema("Node id")
673
+ }),
674
+ tool("cw_node_graph", "Read the state-node graph for a run. Peer of `cw node graph`.", runIdSchema()),
675
+ tool("cw_node_snapshot", "Snapshot one state node into a derived, sha256-fingerprinted projection. Peer of `cw node snapshot`.", {
676
+ ...runIdSchema(),
677
+ nodeId: stringSchema("Node id")
678
+ }),
679
+ tool("cw_node_diff", "Structurally diff two node snapshots (stable, sorted). Peer of `cw node diff`.", {
680
+ ...runIdSchema(),
681
+ baselineSnapshotId: stringSchema("Baseline snapshot id"),
682
+ candidateSnapshotId: stringSchema("Candidate snapshot id")
683
+ }),
684
+ tool("cw_node_replay", "Deterministically replay one node from a snapshot; fail-closed on source drift. Peer of `cw node replay`.", {
685
+ ...runIdSchema(),
686
+ snapshotId: stringSchema("Snapshot id")
687
+ }),
688
+ tool("cw_node_replay_verify", "Verify a node replay against a fresh snapshot of its source. Peer of `cw node verify`.", {
689
+ ...runIdSchema(),
690
+ replayId: stringSchema("Replay id")
691
+ }),
692
+ tool("cw_migration_list", "List the declared migration registry (contracts + edges + compatibility proofs). Peer of `cw migration list`.", {}),
693
+ tool("cw_migration_check", "Dry-run migration verdict for a run-state or workflow-app target; fail-closed on an unreachable version. Peer of `cw migration check`.", {
694
+ target: stringSchema("Run id, or path to a state.json / app.json"),
695
+ contract: stringSchema("run-state | workflow-app (default run-state)"),
696
+ cwd: stringSchema("Run workspace")
697
+ }),
698
+ tool("cw_migration_prove", "Round-trip / non-destruction migration proof for a target (validates-at-current, append-only, idempotent, source-immutable). Peer of `cw migration prove`.", {
699
+ target: stringSchema("Run id, or path to a state.json / app.json"),
700
+ contract: stringSchema("run-state | workflow-app (default run-state)"),
701
+ cwd: stringSchema("Run workspace")
702
+ }),
703
+ tool("cw_operator_status", "Read the structured Operator UX run status.", runIdSchema()),
704
+ tool("cw_operator_graph", "Read the structured Operator UX run graph.", runIdSchema()),
705
+ tool("cw_operator_report", "Refresh and read the structured Operator UX report summary.", runIdSchema()),
706
+ tool("cw_worker_summary", "Read the structured worker summary for a run.", runIdSchema()),
707
+ tool("cw_workbench_view", "Read the read-only five-panel Workbench view (graph, blackboard, worker, candidate, audit) for one run. Each panel embeds the verbatim `cw <cmd> --json` payload of one existing capability; absent panels are surfaced honestly. Peer of `cw workbench view`.", runIdSchema()),
708
+ tool("cw_workbench_serve", "Describe the optional localhost-only, read-only Workbench host (bind, scope, routes). Returns the serve descriptor identical to `cw workbench serve --json`; MCP never starts the blocking server.", {
709
+ cwd: stringSchema("Run workspace"),
710
+ port: numberSchema("Optional loopback port, defaults to 7717"),
711
+ scope: stringSchema("Registry scope: repo|home")
712
+ }),
713
+ tool("cw_candidate_summary", "Read the structured candidate summary for a run.", runIdSchema()),
714
+ tool("cw_feedback_summary", "Read the structured feedback summary for a run.", runIdSchema()),
715
+ tool("cw_commit_summary", "Read the structured commit summary for a run.", runIdSchema()),
716
+ tool("cw_multi_agent_summary", "Read the structured multi-agent runtime summary for a run.", runIdSchema()),
717
+ tool("cw_multi_agent_graph", "Read the structured multi-agent operator graph for a run.", runIdSchema()),
718
+ tool("cw_multi_agent_dependencies", "Read derived multi-agent dependency edges for operator inspection.", runIdSchema()),
719
+ tool("cw_multi_agent_failures", "Read failed, blocked, rejected, and ambiguous multi-agent records.", runIdSchema()),
720
+ tool("cw_multi_agent_evidence", "Read evidence adoption status from worker output through selection and commit. Each row carries a derived rationaleStatus (explained|unexplained|not-applicable).", runIdSchema()),
721
+ tool("cw_evidence_reasoning", "Explain WHY each evidence item was adopted/rejected/superseded/conflicting: a derived, fingerprinted reasoning chain with decision, basis, authority, rationale, and counterfactual per gate (fanin, candidate-score, selection, verifier, commit). Fails closed to `unexplained` when a rationale cannot be traced. Reads valid|stale|absent freshness against current source state.", {
722
+ ...runIdSchema(),
723
+ evidence: stringSchema("Optional evidence id/ref to explain a single adoption"),
724
+ refresh: stringSchema("Set to refresh the durable reasoning index before reading")
725
+ }),
726
+ tool("cw_evidence_reasoning_refresh", "Refresh the durable, versioned, provenance-backed Evidence Adoption Reasoning Chain index under .cw/runs/<id>/reasoning/ (index.json + per-chain records) without mutating raw state.", runIdSchema()),
727
+ tool("cw_summary_refresh", "Refresh durable, versioned, provenance-backed state-explosion summaries (blackboard digest, compact graph views, operator digest) without deleting raw records. Response includes source refs and expansion hints.", {
728
+ ...runIdSchema(),
729
+ cwd: stringSchema("Run workspace"),
730
+ view: arraySchema("Optional graph views to materialize (full, compact, critical-path, failures, evidence, trust, topology, blackboard, candidate, commit-gate)")
731
+ }),
732
+ tool("cw_summary_show", "Read the persisted state-explosion report and detect stale or missing summaries against current source state. Fails closed (status=stale) when source records changed.", runIdSchema()),
733
+ tool("cw_blackboard_summarize", "Read a deterministic blackboard digest (topic rollups, threads, conflicts, decisions, missing evidence, judge rationale) with source refs preserved.", {
734
+ ...runIdSchema(),
735
+ blackboardId: stringSchema("Optional blackboard id; omitted when unambiguous")
736
+ }),
737
+ tool("cw_multi_agent_summarize", "Read the combined state-explosion report (state size, compact graph, blackboard digest, critical path, failures, evidence, trust digest, hidden source records, expansion commands).", runIdSchema()),
738
+ tool("cw_multi_agent_graph_compact", "Read a compact or focused multi-agent graph view with synthetic summary nodes that expose collapsed counts, dominant status, blocked reason, and an expansion command.", {
739
+ ...runIdSchema(),
740
+ view: stringSchema("full, compact, critical-path, failures, evidence, trust, topology, blackboard, candidate, or commit-gate"),
741
+ focus: stringSchema("Optional node id to center the view on"),
742
+ depth: numberSchema("Neighborhood depth when focusing, defaults to 1")
743
+ }),
744
+ tool("cw_multi_agent_run", "Preferred host API: create or attach a high-level multi-agent run from an app/workflow run and topology without dispatching workers.", {
745
+ ...runIdSchema(),
746
+ cwd: stringSchema("Run workspace"),
747
+ app: stringSchema("Optional workflow app id when creating a new workflow run"),
748
+ appId: stringSchema("Optional workflow app id when creating a new workflow run"),
749
+ workflow: stringSchema("Optional workflow id when creating a new workflow run"),
750
+ workflowId: stringSchema("Optional workflow id when creating a new workflow run"),
751
+ topology: stringSchema("map-reduce, debate, or judge-panel"),
752
+ topologyId: stringSchema("Alias for topology"),
753
+ task: arraySchema("Optional task ids for topology materialization"),
754
+ mapperCount: numberSchema("Mapper count for map-reduce"),
755
+ judgeCount: numberSchema("Judge count for judge-panel"),
756
+ debateRounds: numberSchema("Debate rounds for debate")
757
+ }),
758
+ tool("cw_multi_agent_status", "Preferred host API: read combined topology, multi-agent, blackboard, worker, candidate, commit, and audit status.", runIdSchema()),
759
+ tool("cw_multi_agent_step", "Preferred host API: perform one deterministic safe step without spawning agents.", {
760
+ ...runIdSchema(),
761
+ sandbox: stringSchema("Sandbox profile for any dispatch manifest created by this step"),
762
+ backend: stringSchema("Execution backend for any dispatch manifest created by this step (node, bun, shell, container, remote, ci)"),
763
+ limit: numberSchema("Maximum dispatch tasks, defaults to 1")
764
+ }),
765
+ tool("cw_multi_agent_blackboard", "Preferred host API: operate on the active multi-agent blackboard while preserving provenance.", {
766
+ ...runIdSchema(),
767
+ action: stringSchema("summary, topics, messages, post, artifacts, add-artifact, context, or snapshot"),
768
+ blackboardId: stringSchema("Optional blackboard id; omitted only when unambiguous"),
769
+ topicId: stringSchema("Optional topic id; omitted only when unambiguous"),
770
+ body: stringSchema("Message or context body"),
771
+ kind: stringSchema("Artifact or context kind"),
772
+ path: stringSchema("Artifact path"),
773
+ evidence: arraySchema("Evidence refs")
774
+ }),
775
+ tool("cw_multi_agent_score", "Preferred host API: score a candidate with evidence; never selects automatically.", {
776
+ ...runIdSchema(),
777
+ candidate: stringSchema("Candidate id"),
778
+ candidateId: stringSchema("Alias for candidate"),
779
+ worker: stringSchema("Optional worker id to register as a candidate first"),
780
+ criterion: arraySchema("Score criteria as name=value"),
781
+ criteria: objectSchema("Structured score criteria"),
782
+ evidence: arraySchema("Required evidence refs"),
783
+ maxTotal: numberSchema("Optional max total")
784
+ }),
785
+ tool("cw_multi_agent_select", "Preferred host API: select a scored candidate only when verifier and score gates pass.", {
786
+ ...runIdSchema(),
787
+ candidate: stringSchema("Candidate id"),
788
+ candidateId: stringSchema("Alias for candidate"),
789
+ score: stringSchema("Optional score id"),
790
+ scoreId: stringSchema("Alias for score"),
791
+ reason: stringSchema("Acceptance rationale"),
792
+ allowUnverified: booleanSchema("Explicitly bypass verifier gate")
793
+ }),
794
+ tool("cw_eval_snapshot", "Create a deterministic multi-agent replay snapshot for a run.", {
795
+ ...runIdSchema(),
796
+ cwd: stringSchema("Run workspace"),
797
+ id: stringSchema("Snapshot or suite id")
798
+ }),
799
+ tool("cw_eval_replay", "Replay a multi-agent snapshot in an isolated replay directory without live agents.", {
800
+ cwd: stringSchema("Workspace"),
801
+ snapshot: stringSchema("Snapshot id or path"),
802
+ snapshotId: stringSchema("Alias for snapshot"),
803
+ path: stringSchema("Snapshot path"),
804
+ id: stringSchema("Replay id")
805
+ }),
806
+ tool("cw_eval_compare", "Compare a baseline snapshot and replay run with normalized deterministic rules.", {
807
+ cwd: stringSchema("Workspace"),
808
+ baseline: stringSchema("Baseline snapshot id or path"),
809
+ baselinePath: stringSchema("Baseline snapshot path"),
810
+ replay: stringSchema("Replay run id or path"),
811
+ replayPath: stringSchema("Replay run path")
812
+ }),
813
+ tool("cw_eval_score", "Score replay quality with explicit deterministic metrics.", {
814
+ cwd: stringSchema("Workspace"),
815
+ replay: stringSchema("Replay run id or path"),
816
+ replayPath: stringSchema("Replay run path"),
817
+ path: stringSchema("Replay run path")
818
+ }),
819
+ tool("cw_eval_gate", "Run the multi-agent eval/replay regression gate for a suite.", {
820
+ cwd: stringSchema("Workspace"),
821
+ suite: stringSchema("Suite id or path"),
822
+ suiteId: stringSchema("Alias for suite"),
823
+ path: stringSchema("Suite path")
824
+ }),
825
+ tool("cw_eval_report", "Render the multi-agent eval/replay report and return its path.", {
826
+ cwd: stringSchema("Workspace"),
827
+ replay: stringSchema("Replay run id or path"),
828
+ replayPath: stringSchema("Replay run path"),
829
+ path: stringSchema("Replay run path")
830
+ }),
831
+ tool("cw_multi_agent_run_create", "Create a MultiAgentRun state record.", {
832
+ ...runIdSchema(),
833
+ id: stringSchema("Optional MultiAgentRun id"),
834
+ title: stringSchema("Short title"),
835
+ objective: stringSchema("Objective or reason")
836
+ }),
837
+ tool("cw_multi_agent_run_transition", "Transition a MultiAgentRun lifecycle status.", {
838
+ ...runIdSchema(),
839
+ multiAgentRunId: stringSchema("MultiAgentRun id"),
840
+ id: stringSchema("Alias for multiAgentRunId"),
841
+ status: stringSchema("planned, forming, running, collecting, verifying, completed, failed, or cancelled"),
842
+ reason: stringSchema("Transition reason")
843
+ }),
844
+ tool("cw_multi_agent_run_show", "Show one MultiAgentRun record.", {
845
+ ...runIdSchema(),
846
+ multiAgentRunId: stringSchema("MultiAgentRun id"),
847
+ id: stringSchema("Alias for multiAgentRunId")
848
+ }),
849
+ tool("cw_multi_agent_role_create", "Create an AgentRole record.", {
850
+ ...runIdSchema(),
851
+ id: stringSchema("Optional AgentRole id"),
852
+ multiAgentRunId: stringSchema("MultiAgentRun id"),
853
+ multiAgentRun: stringSchema("Alias for multiAgentRunId"),
854
+ title: stringSchema("Role title"),
855
+ responsibility: arraySchema("Responsibilities"),
856
+ requiredEvidence: arraySchema("Required evidence locators or descriptions"),
857
+ sandboxProfileHint: arraySchema("Sandbox profile hints"),
858
+ expectedArtifact: arraySchema("Expected artifacts"),
859
+ faninObligation: arraySchema("Fanin obligations")
860
+ }),
861
+ tool("cw_multi_agent_role_show", "Show one AgentRole record.", {
862
+ ...runIdSchema(),
863
+ roleId: stringSchema("AgentRole id"),
864
+ id: stringSchema("Alias for roleId")
865
+ }),
866
+ tool("cw_multi_agent_group_create", "Create an AgentGroup record.", {
867
+ ...runIdSchema(),
868
+ id: stringSchema("Optional AgentGroup id"),
869
+ multiAgentRunId: stringSchema("MultiAgentRun id"),
870
+ multiAgentRun: stringSchema("Alias for multiAgentRunId"),
871
+ title: stringSchema("Group title"),
872
+ phase: stringSchema("Workflow phase"),
873
+ task: arraySchema("Task ids")
874
+ }),
875
+ tool("cw_multi_agent_group_show", "Show one AgentGroup record.", {
876
+ ...runIdSchema(),
877
+ groupId: stringSchema("AgentGroup id"),
878
+ id: stringSchema("Alias for groupId")
879
+ }),
880
+ tool("cw_multi_agent_membership_create", "Create an AgentMembership record.", {
881
+ ...runIdSchema(),
882
+ id: stringSchema("Optional AgentMembership id"),
883
+ groupId: stringSchema("AgentGroup id"),
884
+ roleId: stringSchema("AgentRole id"),
885
+ taskId: stringSchema("Task id"),
886
+ workerId: stringSchema("Optional worker id"),
887
+ dispatchId: stringSchema("Optional dispatch id"),
888
+ fanoutId: stringSchema("Optional fanout id")
889
+ }),
890
+ tool("cw_multi_agent_membership_show", "Show one AgentMembership record.", {
891
+ ...runIdSchema(),
892
+ membershipId: stringSchema("AgentMembership id"),
893
+ id: stringSchema("Alias for membershipId")
894
+ }),
895
+ tool("cw_multi_agent_fanout_create", "Create an AgentFanout record.", {
896
+ ...runIdSchema(),
897
+ id: stringSchema("Optional AgentFanout id"),
898
+ groupId: stringSchema("AgentGroup id"),
899
+ reason: stringSchema("Why work was split"),
900
+ role: arraySchema("Role ids"),
901
+ task: arraySchema("Task ids"),
902
+ limit: numberSchema("Concurrency limit"),
903
+ sandboxChoice: arraySchema("Sandbox choices as key=value")
904
+ }),
905
+ tool("cw_multi_agent_fanout_show", "Show one AgentFanout record.", {
906
+ ...runIdSchema(),
907
+ fanoutId: stringSchema("AgentFanout id"),
908
+ id: stringSchema("Alias for fanoutId")
909
+ }),
910
+ tool("cw_multi_agent_fanin_collect", "Collect AgentFanin evidence coverage and fail closed on missing role evidence.", {
911
+ ...runIdSchema(),
912
+ id: stringSchema("Optional AgentFanin id"),
913
+ groupId: stringSchema("AgentGroup id"),
914
+ fanoutId: stringSchema("Optional fanout id"),
915
+ requiredRole: arraySchema("Required role ids"),
916
+ strategy: stringSchema("Aggregation strategy")
917
+ }),
918
+ tool("cw_multi_agent_fanin_show", "Show one AgentFanin record.", {
919
+ ...runIdSchema(),
920
+ faninId: stringSchema("AgentFanin id"),
921
+ id: stringSchema("Alias for faninId")
922
+ }),
923
+ tool("cw_topology_list", "List official multi-agent topology definitions.", {}),
924
+ tool("cw_topology_show", "Show an official topology definition or a topology run when runId is provided.", {
925
+ ...runIdSchema(),
926
+ topologyId: stringSchema("Official topology id"),
927
+ topologyRunId: stringSchema("Topology run id"),
928
+ id: stringSchema("Alias for topologyId or topologyRunId")
929
+ }),
930
+ tool("cw_topology_validate", "Validate an official topology definition.", {
931
+ topologyId: stringSchema("Official topology id"),
932
+ id: stringSchema("Alias for topologyId")
933
+ }),
934
+ tool("cw_topology_apply", "Apply an official topology to a CW run using multi-agent and blackboard records.", {
935
+ ...runIdSchema(),
936
+ topologyId: stringSchema("map-reduce, debate, or judge-panel"),
937
+ id: stringSchema("Optional topology run id"),
938
+ task: arraySchema("Task ids"),
939
+ mapperCount: numberSchema("Mapper count for map-reduce"),
940
+ judgeCount: numberSchema("Judge count for judge-panel"),
941
+ debateRounds: numberSchema("Debate rounds for debate"),
942
+ blackboardId: stringSchema("Optional blackboard id"),
943
+ multiAgentRunId: stringSchema("Optional MultiAgentRun id"),
944
+ collectInitialFanin: booleanSchema("Collect an initial fail-closed fanin immediately")
945
+ }),
946
+ tool("cw_topology_summary", "Read topology progress and next actions for a run.", runIdSchema()),
947
+ tool("cw_topology_graph", "Read topology graph nodes and edges for a run.", runIdSchema()),
948
+ tool("cw_blackboard_summary", "Read blackboard/coordinator summary for a run.", runIdSchema()),
949
+ tool("cw_blackboard_graph", "Read blackboard/coordinator graph nodes and edges.", runIdSchema()),
950
+ tool("cw_blackboard_resolve", "Create or resolve the blackboard for a run or MultiAgentRun.", {
951
+ ...runIdSchema(),
952
+ id: stringSchema("Optional blackboard id"),
953
+ title: stringSchema("Blackboard title"),
954
+ multiAgentRunId: stringSchema("Optional MultiAgentRun id"),
955
+ groupId: stringSchema("Optional AgentGroup id"),
956
+ roleId: stringSchema("Optional AgentRole id"),
957
+ membershipId: stringSchema("Optional AgentMembership id")
958
+ }),
959
+ tool("cw_blackboard_topic_create", "Create a blackboard topic.", {
960
+ ...runIdSchema(),
961
+ id: stringSchema("Optional topic id"),
962
+ title: stringSchema("Topic title"),
963
+ description: stringSchema("Topic description"),
964
+ blackboardId: stringSchema("Optional blackboard id"),
965
+ tag: arraySchema("Tags")
966
+ }),
967
+ tool("cw_blackboard_message_post", "Post a blackboard message.", {
968
+ ...runIdSchema(),
969
+ id: stringSchema("Optional message id"),
970
+ topic: stringSchema("Topic id"),
971
+ topicId: stringSchema("Topic id"),
972
+ body: stringSchema("Message body"),
973
+ replyTo: stringSchema("Optional parent message id"),
974
+ visibility: stringSchema("public, group, role, or private"),
975
+ evidence: arraySchema("Linked evidence refs"),
976
+ artifact: arraySchema("Linked blackboard artifact ref ids")
977
+ }),
978
+ tool("cw_blackboard_message_list", "List blackboard messages.", {
979
+ ...runIdSchema(),
980
+ topic: stringSchema("Optional topic id"),
981
+ topicId: stringSchema("Optional topic id"),
982
+ blackboardId: stringSchema("Optional blackboard id")
983
+ }),
984
+ tool("cw_blackboard_context_put", "Publish a shared context frame.", {
985
+ ...runIdSchema(),
986
+ id: stringSchema("Optional context id"),
987
+ topic: stringSchema("Topic id"),
988
+ topicId: stringSchema("Topic id"),
989
+ kind: stringSchema("fact, constraint, assumption, question, or decision"),
990
+ key: stringSchema("Context key"),
991
+ value: stringSchema("Context value"),
992
+ supersedes: arraySchema("Context ids superseded by this update"),
993
+ evidence: arraySchema("Evidence refs"),
994
+ artifact: arraySchema("Blackboard artifact ref ids")
995
+ }),
996
+ tool("cw_blackboard_artifact_add", "Index an artifact in the blackboard.", {
997
+ ...runIdSchema(),
998
+ id: stringSchema("Optional artifact ref id"),
999
+ topic: stringSchema("Optional topic id"),
1000
+ kind: stringSchema("Artifact kind"),
1001
+ path: stringSchema("Local artifact path"),
1002
+ locator: stringSchema("External or logical locator"),
1003
+ source: stringSchema("Artifact source"),
1004
+ evidence: arraySchema("Evidence refs")
1005
+ }),
1006
+ tool("cw_blackboard_artifact_list", "List blackboard artifact refs.", {
1007
+ ...runIdSchema(),
1008
+ topic: stringSchema("Optional topic id"),
1009
+ blackboardId: stringSchema("Optional blackboard id")
1010
+ }),
1011
+ tool("cw_blackboard_snapshot", "Create a durable blackboard snapshot.", {
1012
+ ...runIdSchema(),
1013
+ blackboardId: stringSchema("Optional blackboard id")
1014
+ }),
1015
+ tool("cw_coordinator_summary", "Read coordinator summary for a run.", runIdSchema()),
1016
+ tool("cw_coordinator_decision", "Record a coordinator decision.", {
1017
+ ...runIdSchema(),
1018
+ id: stringSchema("Optional decision id"),
1019
+ kind: stringSchema("Decision kind"),
1020
+ outcome: stringSchema("accepted, rejected, superseded, conflicting, ready, or blocked"),
1021
+ reason: stringSchema("Decision rationale"),
1022
+ subject: arraySchema("Subject record ids"),
1023
+ evidence: arraySchema("Evidence refs"),
1024
+ artifact: arraySchema("Blackboard artifact ref ids"),
1025
+ message: arraySchema("Blackboard message ids")
1026
+ }),
1027
+ tool("cw_audit_summary", "Read durable trust/audit summary for a run.", runIdSchema()),
1028
+ tool("cw_audit_worker", "Read trust/audit events for one worker.", workerIdSchema()),
1029
+ tool("cw_audit_provenance", "Inspect evidence provenance for a run, worker, candidate, or commit.", {
1030
+ ...runIdSchema(),
1031
+ workerId: stringSchema("Optional worker id"),
1032
+ worker: stringSchema("Optional worker id"),
1033
+ candidateId: stringSchema("Optional candidate id"),
1034
+ candidate: stringSchema("Optional candidate id"),
1035
+ commitId: stringSchema("Optional commit id"),
1036
+ commit: stringSchema("Optional commit id")
1037
+ }),
1038
+ tool("cw_audit_multi_agent", "Read multi-agent trust, policy, blackboard write, provenance, judge, and violation audit projections.", runIdSchema()),
1039
+ tool("cw_audit_policy", "Read role policies, permission decisions, and policy violations for a run.", runIdSchema()),
1040
+ tool("cw_audit_role", "Read policy and audit events for one multi-agent role.", {
1041
+ ...runIdSchema(),
1042
+ roleId: stringSchema("Agent role id"),
1043
+ id: stringSchema("Agent role id")
1044
+ }),
1045
+ tool("cw_audit_blackboard", "Read blackboard write audit and message provenance for a run.", runIdSchema()),
1046
+ tool("cw_audit_judge", "Read judge rationale and panel decision audit records for a run.", runIdSchema()),
1047
+ tool("cw_audit_attest", "Record a host/operator sandbox attestation without storing secrets.", {
1048
+ ...runIdSchema(),
1049
+ workerId: stringSchema("Optional worker id"),
1050
+ worker: stringSchema("Optional worker id"),
1051
+ actor: stringSchema("Host/operator actor"),
1052
+ hostEnforced: booleanSchema("Whether the host says enforcement was active"),
1053
+ env: arraySchema("Environment variable names only"),
1054
+ note: stringSchema("Short attestation note")
1055
+ }),
1056
+ tool("cw_audit_decision", "Validate and record a sandbox path/command/network/env decision.", {
1057
+ ...workerIdSchema(),
1058
+ path: stringSchema("Path to validate"),
1059
+ command: stringSchema("Command to validate"),
1060
+ network: stringSchema("Network target to validate"),
1061
+ env: stringSchema("Environment variable name to validate"),
1062
+ kind: stringSchema("sandbox.path, sandbox.command, sandbox.network, or sandbox.env")
1063
+ }),
1064
+ tool("cw_dispatch", "Create a subagent dispatch manifest.", {
1065
+ runId: stringSchema("Run id"),
1066
+ cwd: stringSchema("Run workspace"),
1067
+ limit: numberSchema("Max tasks to dispatch"),
1068
+ sandbox: stringSchema("Sandbox profile id"),
1069
+ sandboxProfile: stringSchema("Sandbox profile id"),
1070
+ sandboxProfileId: stringSchema("Sandbox profile id"),
1071
+ backend: stringSchema("Execution backend id (node, bun, shell, container, remote, ci)"),
1072
+ backendId: stringSchema("Execution backend id")
1073
+ }),
1074
+ tool("cw_sandbox_list", "List bundled sandbox profiles.", {
1075
+ cwd: stringSchema("Workspace used to resolve profile paths")
1076
+ }),
1077
+ tool("cw_sandbox_show", "Show a resolved sandbox profile.", {
1078
+ cwd: stringSchema("Workspace used to resolve profile paths"),
1079
+ profileId: stringSchema("Sandbox profile id")
1080
+ }),
1081
+ tool("cw_sandbox_validate", "Validate a sandbox profile JSON file.", {
1082
+ cwd: stringSchema("Workspace used to resolve profile paths"),
1083
+ profileFile: stringSchema("Sandbox profile JSON file")
1084
+ }),
1085
+ tool("cw_sandbox_choose", "Resolve and validate a sandbox profile without dispatching work.", {
1086
+ cwd: stringSchema("Workspace used to resolve profile paths"),
1087
+ profileId: stringSchema("Sandbox profile id"),
1088
+ sandbox: stringSchema("Sandbox profile id"),
1089
+ sandboxProfile: stringSchema("Sandbox profile id"),
1090
+ sandboxProfileId: stringSchema("Sandbox profile id")
1091
+ }),
1092
+ tool("cw_sandbox_resolve", "Alias for cw_sandbox_choose.", {
1093
+ cwd: stringSchema("Workspace used to resolve profile paths"),
1094
+ profileId: stringSchema("Sandbox profile id"),
1095
+ sandbox: stringSchema("Sandbox profile id"),
1096
+ sandboxProfile: stringSchema("Sandbox profile id"),
1097
+ sandboxProfileId: stringSchema("Sandbox profile id")
1098
+ }),
1099
+ tool("cw_backend_list", "List available execution backends and their capabilities.", {
1100
+ cwd: stringSchema("Workspace")
1101
+ }),
1102
+ tool("cw_backend_show", "Show one execution backend descriptor.", {
1103
+ cwd: stringSchema("Workspace"),
1104
+ backendId: stringSchema("Execution backend id (node, bun, shell, container, remote, ci)")
1105
+ }),
1106
+ tool("cw_backend_probe", "Probe execution backend readiness (live, deterministic).", {
1107
+ cwd: stringSchema("Workspace"),
1108
+ backendId: stringSchema("Execution backend id; omit to probe all backends")
1109
+ }),
1110
+ tool("cw_backend_agent_config_show", "Show the effective agent delegation config (flags>env>file, secret-stripped, host-stable). Read-only.", {
1111
+ cwd: stringSchema("Workspace"),
1112
+ agentCommand: stringSchema("Override: agent command-template (e.g. 'claude -p --output-format json {{manifest}}')"),
1113
+ agentEndpoint: stringSchema("Override: agent HTTP endpoint"),
1114
+ agentModel: stringSchema("Override: operator-chosen model (policy, NOT the attested model)")
1115
+ }),
1116
+ tool("cw_backend_agent_config_set", "Persist the durable agent delegation config under $CW_HOME (command-template/endpoint/model). API keys are NEVER written — they come from the agent's own env. Mutating.", {
1117
+ cwd: stringSchema("Workspace"),
1118
+ agentCommand: stringSchema("Agent command-template (binary + argv with {{manifest}}/{{input}}/{{result}}/{{model}})"),
1119
+ agentEndpoint: stringSchema("Agent HTTP endpoint to POST the manifest to"),
1120
+ agentModel: stringSchema("Operator-chosen model interpolated into {{model}} (policy, not attested)")
1121
+ }),
1122
+ tool("cw_result", "Record a subagent result.", {
1123
+ runId: stringSchema("Run id"),
1124
+ taskId: stringSchema("Task id"),
1125
+ resultPath: stringSchema("Result markdown path"),
1126
+ cwd: stringSchema("Run workspace")
1127
+ }),
1128
+ tool("cw_commit", "Create a verifier-gated commit or explicit checkpoint.", {
1129
+ runId: stringSchema("Run id"),
1130
+ reason: stringSchema("Commit reason"),
1131
+ verifier: stringSchema("Verified verifier node id"),
1132
+ verifierNode: stringSchema("Verified verifier node id"),
1133
+ candidate: stringSchema("Verified candidate id"),
1134
+ selection: stringSchema("Verified candidate selection id"),
1135
+ allowUnverifiedCheckpoint: { type: "boolean", description: "Write a non-gated checkpoint instead of committed state" },
1136
+ cwd: stringSchema("Run workspace")
1137
+ }),
1138
+ tool("cw_report", "Render a run report.", {
1139
+ runId: stringSchema("Run id"),
1140
+ cwd: stringSchema("Run workspace")
1141
+ }),
1142
+ tool("cw_app_list", "List CW workflow apps and legacy workflow files.", {
1143
+ cwd: stringSchema("Workspace")
1144
+ }),
1145
+ tool("cw_app_show", "Show a CW workflow app contract.", {
1146
+ cwd: stringSchema("Workspace"),
1147
+ appId: stringSchema("Workflow app id")
1148
+ }),
1149
+ tool("cw_app_validate", "Validate a CW workflow app by path or id.", {
1150
+ cwd: stringSchema("Workspace"),
1151
+ target: stringSchema("Workflow app path or id")
1152
+ }),
1153
+ tool("cw_app_init", "Create a CW workflow app directory.", {
1154
+ cwd: stringSchema("Workspace"),
1155
+ appId: stringSchema("Workflow app id"),
1156
+ title: stringSchema("Workflow app title"),
1157
+ directory: stringSchema("Destination directory")
1158
+ }),
1159
+ tool("cw_app_package", "Package a CW workflow app as a JSON artifact.", {
1160
+ cwd: stringSchema("Workspace"),
1161
+ appId: stringSchema("Workflow app id"),
1162
+ output: stringSchema("Output package path")
1163
+ }),
1164
+ tool("cw_worker_list", "List worker isolation scopes for a run.", {
1165
+ ...runIdSchema(),
1166
+ status: stringSchema("Optional worker status filter")
1167
+ }),
1168
+ tool("cw_worker_show", "Show one worker isolation scope.", workerIdSchema()),
1169
+ tool("cw_worker_manifest", "Write and return one worker manifest.", workerIdSchema()),
1170
+ tool("cw_worker_output", "Record worker output from a result markdown path.", {
1171
+ ...workerIdSchema(),
1172
+ resultPath: stringSchema("Worker result markdown path")
1173
+ }),
1174
+ tool("cw_worker_fail", "Record a structured worker failure.", {
1175
+ ...workerIdSchema(),
1176
+ message: stringSchema("Failure message"),
1177
+ code: stringSchema("Failure code"),
1178
+ path: stringSchema("Related file path"),
1179
+ retryable: booleanSchema("Whether the failure can be retried")
1180
+ }),
1181
+ tool("cw_worker_validate", "Validate a worker output path against its sandbox boundary.", {
1182
+ ...workerIdSchema(),
1183
+ path: stringSchema("Path to validate"),
1184
+ resultPath: stringSchema("Result path to validate")
1185
+ }),
1186
+ tool("cw_candidate_list", "List candidates for a run.", {
1187
+ ...runIdSchema(),
1188
+ status: stringSchema("Optional candidate status filter"),
1189
+ kind: stringSchema("Optional candidate kind filter")
1190
+ }),
1191
+ tool("cw_candidate_show", "Show one candidate.", candidateIdSchema()),
1192
+ tool("cw_candidate_register", "Register a candidate from worker, task, or result evidence.", {
1193
+ ...runIdSchema(),
1194
+ id: stringSchema("Optional candidate id"),
1195
+ kind: stringSchema("Candidate kind"),
1196
+ worker: stringSchema("Worker id"),
1197
+ task: stringSchema("Task id"),
1198
+ resultNode: stringSchema("Result node id"),
1199
+ verifierNode: stringSchema("Verifier node id"),
1200
+ resultPath: stringSchema("Result markdown path")
1201
+ }),
1202
+ tool("cw_candidate_score", "Score a candidate with structured criteria and evidence locators.", {
1203
+ ...candidateIdSchema(),
1204
+ criteria: objectSchema("Criterion numeric values, for example { correctness: 4 }"),
1205
+ criterion: arraySchema("CLI-compatible name=value criterion strings"),
1206
+ evidence: arraySchema("Evidence locators"),
1207
+ maxTotal: numberSchema("Maximum possible total score"),
1208
+ max: numberSchema("Alias for maxTotal"),
1209
+ verdict: stringSchema("pass, warn, or fail"),
1210
+ notes: stringSchema("Score notes"),
1211
+ scorer: stringSchema("Scorer id")
1212
+ }),
1213
+ tool("cw_candidate_rank", "Rank candidates with evidence and verifier gate policy.", {
1214
+ ...runIdSchema(),
1215
+ includeRejected: booleanSchema("Include rejected candidates"),
1216
+ minNormalized: numberSchema("Minimum normalized score"),
1217
+ requireEvidence: booleanSchema("Require score evidence"),
1218
+ requireVerifierGate: booleanSchema("Require verified verifier node"),
1219
+ tieBreaker: stringSchema("Tie breaker policy")
1220
+ }),
1221
+ tool("cw_candidate_select", "Select a candidate with verifier-gated policy.", {
1222
+ ...candidateIdSchema(),
1223
+ reason: stringSchema("Selection reason"),
1224
+ selectedBy: stringSchema("Selector id"),
1225
+ by: stringSchema("Alias for selectedBy"),
1226
+ score: stringSchema("Score id"),
1227
+ allowUnverified: booleanSchema("Allow selection without a verifier gate"),
1228
+ minNormalized: numberSchema("Minimum normalized score"),
1229
+ requireVerifierGate: booleanSchema("Require verified verifier node")
1230
+ }),
1231
+ tool("cw_candidate_reject", "Reject a candidate with a durable reason.", {
1232
+ ...candidateIdSchema(),
1233
+ reason: stringSchema("Rejection reason")
1234
+ }),
1235
+ tool("cw_approve", "Append a host-attested approval of a candidate/commit/selection (review gate counts it).", {
1236
+ ...runIdSchema(),
1237
+ ...collaborationTargetSchema(),
1238
+ ...actorSchema(),
1239
+ rationale: stringSchema("Approval rationale"),
1240
+ supersedes: stringSchema("Prior approval record this revises")
1241
+ }),
1242
+ tool("cw_reject", "Append a host-attested rejection (a blocking veto) of a candidate/commit/selection.", {
1243
+ ...runIdSchema(),
1244
+ ...collaborationTargetSchema(),
1245
+ ...actorSchema(),
1246
+ rationale: stringSchema("Rejection rationale")
1247
+ }),
1248
+ tool("cw_comment_add", "Append a comment to a durable target (run/task/candidate/selection/commit/node).", {
1249
+ ...runIdSchema(),
1250
+ ...collaborationTargetSchema(),
1251
+ ...actorSchema(),
1252
+ body: stringSchema("Comment body"),
1253
+ thread: stringSchema("Thread id"),
1254
+ parent: stringSchema("Parent comment id")
1255
+ }),
1256
+ tool("cw_comment_list", "List append-only comments for a run (optionally one target).", {
1257
+ ...runIdSchema(),
1258
+ targetKind: stringSchema("Optional target kind filter"),
1259
+ target: stringSchema("Optional target id filter")
1260
+ }),
1261
+ tool("cw_handoff", "Record an ownership transfer (from-actor → to-actor) of a run/task.", {
1262
+ ...runIdSchema(),
1263
+ ...collaborationTargetSchema(),
1264
+ ...actorSchema(),
1265
+ to: stringSchema("To-actor id"),
1266
+ toRole: stringSchema("To-actor role"),
1267
+ from: stringSchema("From-actor id (defaults to recorder)"),
1268
+ reason: stringSchema("Handoff reason")
1269
+ }),
1270
+ tool("cw_review_status", "Read the derived per-target review state + collaboration timeline for a run.", {
1271
+ ...runIdSchema(),
1272
+ targetKind: stringSchema("Optional target kind filter"),
1273
+ target: stringSchema("Optional target id filter"),
1274
+ now: stringSchema("Injected ISO timestamp (deterministic reports)")
1275
+ }),
1276
+ tool("cw_review_policy", "Set the run's review-gate policy (data, not kernel): required approvals, authorized roles.", {
1277
+ ...runIdSchema(),
1278
+ requiredApprovals: numberSchema("Approvals required (0 = no gate)"),
1279
+ authorizedRoles: stringSchema("Comma-separated authorized roles; * = any"),
1280
+ allowSelfApproval: booleanSchema("Allow producers to approve their own work"),
1281
+ requireAttestedActor: booleanSchema("Require host-attested approvers"),
1282
+ appliesTo: stringSchema("Comma-separated target kinds (e.g. commit,selection)")
1283
+ }),
1284
+ tool("cw_feedback_list", "List run feedback records.", {
1285
+ runId: stringSchema("Run id"),
1286
+ cwd: stringSchema("Run workspace"),
1287
+ status: stringSchema("Optional status filter")
1288
+ }),
1289
+ tool("cw_feedback_show", "Show a run feedback record.", {
1290
+ runId: stringSchema("Run id"),
1291
+ feedbackId: stringSchema("Feedback id"),
1292
+ cwd: stringSchema("Run workspace")
1293
+ }),
1294
+ tool("cw_feedback_collect", "Collect feedback from failed state nodes.", {
1295
+ runId: stringSchema("Run id"),
1296
+ cwd: stringSchema("Run workspace")
1297
+ }),
1298
+ tool("cw_feedback_task", "Create a correction task for a feedback record.", {
1299
+ runId: stringSchema("Run id"),
1300
+ feedbackId: stringSchema("Feedback id"),
1301
+ cwd: stringSchema("Run workspace"),
1302
+ verify: stringSchema("Expected verification command")
1303
+ }),
1304
+ tool("cw_feedback_resolve", "Resolve or reject a feedback record.", {
1305
+ runId: stringSchema("Run id"),
1306
+ feedbackId: stringSchema("Feedback id"),
1307
+ cwd: stringSchema("Run workspace"),
1308
+ node: stringSchema("Verified or committed node id"),
1309
+ status: stringSchema("resolved or rejected")
1310
+ }),
1311
+ tool("cw_schedule_create", "Create a scheduled CW task.", {
1312
+ cwd: stringSchema("Workspace"),
1313
+ kind: stringSchema("loop, cron, or reminder"),
1314
+ prompt: stringSchema("Prompt to run"),
1315
+ intervalMinutes: numberSchema("Loop interval in minutes"),
1316
+ cron: stringSchema("5-field cron expression"),
1317
+ delayMinutes: numberSchema("Reminder delay in minutes")
1318
+ }),
1319
+ tool("cw_schedule_list", "List scheduled CW tasks.", {
1320
+ cwd: stringSchema("Workspace"),
1321
+ status: stringSchema("Optional status filter")
1322
+ }),
1323
+ tool("cw_schedule_due", "List due scheduled CW tasks.", {
1324
+ cwd: stringSchema("Workspace")
1325
+ }),
1326
+ tool("cw_schedule_complete", "Mark a scheduled CW task run complete and advance it.", {
1327
+ cwd: stringSchema("Workspace"),
1328
+ id: stringSchema("Schedule id")
1329
+ }),
1330
+ tool("cw_schedule_pause", "Pause a scheduled CW task.", {
1331
+ cwd: stringSchema("Workspace"),
1332
+ id: stringSchema("Schedule id")
1333
+ }),
1334
+ tool("cw_schedule_resume", "Resume a scheduled CW task.", {
1335
+ cwd: stringSchema("Workspace"),
1336
+ id: stringSchema("Schedule id")
1337
+ }),
1338
+ tool("cw_schedule_run_now", "Create an immediate scheduled-task run record.", {
1339
+ cwd: stringSchema("Workspace"),
1340
+ id: stringSchema("Schedule id")
1341
+ }),
1342
+ tool("cw_schedule_history", "List scheduled-task run history.", {
1343
+ cwd: stringSchema("Workspace"),
1344
+ id: stringSchema("Optional schedule id")
1345
+ }),
1346
+ tool("cw_schedule_delete", "Delete a scheduled CW task.", {
1347
+ cwd: stringSchema("Workspace"),
1348
+ id: stringSchema("Schedule id")
1349
+ }),
1350
+ tool("cw_routine_create", "Create a routine-style API or GitHub trigger.", {
1351
+ cwd: stringSchema("Workspace"),
1352
+ kind: stringSchema("api or github"),
1353
+ prompt: stringSchema("Prompt to run when the trigger matches"),
1354
+ match: stringSchema("Optional JSON object match rule")
1355
+ }),
1356
+ tool("cw_routine_list", "List routine-style triggers.", {
1357
+ cwd: stringSchema("Workspace"),
1358
+ kind: stringSchema("Optional api or github filter")
1359
+ }),
1360
+ tool("cw_routine_fire", "Record an API or GitHub trigger event.", {
1361
+ cwd: stringSchema("Workspace"),
1362
+ kind: stringSchema("api or github"),
1363
+ payload: { type: "object", description: "Event payload" }
1364
+ }),
1365
+ tool("cw_routine_events", "List routine trigger events.", {
1366
+ cwd: stringSchema("Workspace"),
1367
+ id: stringSchema("Optional trigger id")
1368
+ }),
1369
+ tool("cw_routine_delete", "Delete a routine-style trigger.", {
1370
+ cwd: stringSchema("Workspace"),
1371
+ id: stringSchema("Trigger id")
1372
+ }),
1373
+ tool("cw_registry_refresh", "Recompute and persist the derived run registry index from source state.json. Registers the current repo for cross-repo discovery. Never mutates source state.", {
1374
+ cwd: stringSchema("Repo workspace"),
1375
+ scope: stringSchema("repo (default) or home (cross-repo)")
1376
+ }),
1377
+ tool("cw_registry_show", "Read the run registry index with valid|stale|absent freshness against current source state. Fails closed: tampered/missing source surfaces as stale/missing with rebuild guidance, never a fabricated status.", {
1378
+ cwd: stringSchema("Repo workspace"),
1379
+ scope: stringSchema("repo (default) or home (cross-repo)")
1380
+ }),
1381
+ tool("cw_metrics_show", "Read the DERIVED per-run observability + attested-cost report: durations from recorded timestamps, failure/verifier/acceptance rates with sample counts (n/a on zero samples), attested token usage with coverage, and cost (attested vs estimated vs unreported). Deterministic over a fixed snapshot; never fabricates a counter.", {
1382
+ runId: stringSchema("Run id"),
1383
+ cwd: stringSchema("Repo workspace"),
1384
+ pricing: stringSchema("Pricing policy path, or 'default' for the bundled example (POLICY, optional). Absent ⇒ cost is unpriced/unreported, never guessed."),
1385
+ now: stringSchema("Optional injected ISO wall-clock for deterministic eval/replay (only affects generatedAt).")
1386
+ }),
1387
+ tool("cw_metrics_summary", "Read the cross-repo observability + cost rollup over the run registry, with per-app and per-backend breakdowns. Rates pool samples; usage/cost sum attested values with explicit coverage and unreported. Unreadable runs are counted, never dropped.", {
1388
+ cwd: stringSchema("Repo workspace"),
1389
+ scope: stringSchema("repo (default) or home (cross-repo)"),
1390
+ pricing: stringSchema("Pricing policy path or 'default' (POLICY, optional)."),
1391
+ now: stringSchema("Optional injected ISO wall-clock for deterministic eval/replay.")
1392
+ }),
1393
+ tool("cw_run_search", "Search runs by app, lifecycle status, time range, repo, and free-text over metadata. Deterministic and paginated; cross-repo by default. Re-derived from source.", {
1394
+ cwd: stringSchema("Repo workspace"),
1395
+ scope: stringSchema("home (default, cross-repo) or repo"),
1396
+ text: stringSchema("Free-text over runId/app/workflow/title/repo/lifecycle/inputs"),
1397
+ app: stringSchema("App or workflow id filter"),
1398
+ status: stringSchema("queued|running|blocked|completed|failed|archived"),
1399
+ repo: stringSchema("Repo root filter"),
1400
+ since: stringSchema("ISO lower bound on createdAt"),
1401
+ until: stringSchema("ISO upper bound on createdAt"),
1402
+ includeArchived: booleanSchema("Include archived runs (default true)"),
1403
+ limit: numberSchema("Page size (default 50)"),
1404
+ offset: numberSchema("Page offset (default 0)")
1405
+ }),
1406
+ tool("cw_run_list", "List indexed runs across repos (search with no filters), deterministic and paginated.", {
1407
+ cwd: stringSchema("Repo workspace"),
1408
+ scope: stringSchema("home (default, cross-repo) or repo"),
1409
+ includeArchived: booleanSchema("Include archived runs (default true)"),
1410
+ limit: numberSchema("Page size (default 50)"),
1411
+ offset: numberSchema("Page offset (default 0)")
1412
+ }),
1413
+ tool("cw_run_show", "Resolve one run by id across the registry; fail closed with found=false/freshness=missing when source state is gone (never a fabricated status).", {
1414
+ runId: stringSchema("Run id"),
1415
+ cwd: stringSchema("Repo workspace"),
1416
+ scope: stringSchema("home (default, cross-repo) or repo")
1417
+ }),
1418
+ tool("cw_run_resume", "Resolve a run by id and continue it from durable state: returns next runnable tasks and next actions. Read-only over source state.", {
1419
+ runId: stringSchema("Run id"),
1420
+ cwd: stringSchema("Repo workspace"),
1421
+ scope: stringSchema("home (default, cross-repo) or repo"),
1422
+ limit: numberSchema("Max next tasks to return (default 5)")
1423
+ }),
1424
+ tool("cw_run_archive", "Archive or unarchive a run via an overlay mark (never deletes source). With olderThanDays instead of runId, apply a retention policy. Archived runs stay searchable.", {
1425
+ runId: stringSchema("Run id to archive (omit to use a retention policy)"),
1426
+ cwd: stringSchema("Repo workspace"),
1427
+ scope: stringSchema("home (default, cross-repo) or repo"),
1428
+ reason: stringSchema("Archive reason"),
1429
+ unarchive: booleanSchema("Clear the archive overlay instead of setting it"),
1430
+ olderThanDays: numberSchema("Retention window: archive eligible runs older than N days"),
1431
+ state: stringSchema("Lifecycle states eligible for retention archiving")
1432
+ }),
1433
+ tool("cw_run_rerun", "Re-run a failed run as a NEW run that links to the original via provenance (inputs reused). The original failed run is preserved for audit.", {
1434
+ runId: stringSchema("Failed run id to rerun"),
1435
+ cwd: stringSchema("Repo workspace"),
1436
+ scope: stringSchema("home (default, cross-repo) or repo"),
1437
+ reason: stringSchema("Rerun reason")
1438
+ }),
1439
+ tool("cw_run_drive", "Preview the next agent-delegation drive step for a run (read-only, deterministic). Counts come from state; no spawn, no mutation.", {
1440
+ runId: stringSchema("Run id to preview"),
1441
+ cwd: stringSchema("Run workspace")
1442
+ }),
1443
+ tool("cw_run_drive_step", "Drive a run by delegating each worker to the agent backend (plan->dispatch->fulfill->accept->commit). The model runs in the external agent's process, never in CW. --once advances exactly one step. Mutating.", {
1444
+ runId: stringSchema("Run id to continue (omit to plan a fresh run for appId)"),
1445
+ appId: stringSchema("App id to plan + drive (e.g. architecture-review)"),
1446
+ repo: stringSchema("Target repository to analyze"),
1447
+ question: stringSchema("The question the audited report answers"),
1448
+ once: booleanSchema("Advance exactly one step then stop"),
1449
+ now: stringSchema("Injected ISO timestamp for deterministic scheduling"),
1450
+ cwd: stringSchema("Run workspace")
1451
+ }),
1452
+ tool("cw_queue_add", "Enqueue a pending/planned run with explicit ordering policy (lower priority drains first). Plain files; the host still executes workers.", {
1453
+ cwd: stringSchema("Repo workspace"),
1454
+ runId: stringSchema("Optional existing planned run id"),
1455
+ appId: stringSchema("App id to run"),
1456
+ workflowId: stringSchema("Workflow id to run"),
1457
+ repo: stringSchema("Repo root that owns the run (default cwd)"),
1458
+ priority: numberSchema("Ordering priority (lower drains first, default 100)"),
1459
+ note: stringSchema("Free-text note")
1460
+ }),
1461
+ tool("cw_queue_list", "List the durable run queue in policy order (priority asc, then enqueuedAt).", {
1462
+ cwd: stringSchema("Repo workspace"),
1463
+ status: stringSchema("pending|ready|draining|drained|cancelled"),
1464
+ repo: stringSchema("Repo root filter")
1465
+ }),
1466
+ tool("cw_queue_drain", "Mark the next ready queue entries drained in policy order and return them; the host executes the workers.", {
1467
+ cwd: stringSchema("Repo workspace"),
1468
+ limit: numberSchema("How many entries to drain (default 1)"),
1469
+ repo: stringSchema("Repo root filter")
1470
+ }),
1471
+ tool("cw_queue_show", "Show one durable queue entry.", {
1472
+ cwd: stringSchema("Repo workspace"),
1473
+ id: stringSchema("Queue entry id")
1474
+ }),
1475
+ tool("cw_sched_plan", "Read-only control-plane lease plan for the queue+policy+now (deterministic; concurrency-bounded). Peer of `cw sched plan`.", {
1476
+ cwd: stringSchema("Repo workspace")
1477
+ }),
1478
+ tool("cw_sched_lease", "Claim eligible queue entries as leases; never exceeds the concurrency ceiling. Peer of `cw sched lease`.", {
1479
+ cwd: stringSchema("Repo workspace"),
1480
+ limit: stringSchema("Max leases to grant")
1481
+ }),
1482
+ tool("cw_sched_release", "Release a held lease; failed=true increments attempts (retry/backoff or park). Peer of `cw sched release`.", {
1483
+ cwd: stringSchema("Repo workspace"),
1484
+ leaseId: stringSchema("Lease id"),
1485
+ failed: stringSchema("true to count a failed attempt"),
1486
+ reason: stringSchema("Release reason")
1487
+ }),
1488
+ tool("cw_sched_complete", "Complete a held lease (terminal success). Peer of `cw sched complete`.", {
1489
+ cwd: stringSchema("Repo workspace"),
1490
+ leaseId: stringSchema("Lease id")
1491
+ }),
1492
+ tool("cw_sched_reclaim", "Reclaim expired leases (host died); each counts one failed attempt. Peer of `cw sched reclaim`.", {
1493
+ cwd: stringSchema("Repo workspace")
1494
+ }),
1495
+ tool("cw_sched_reset", "Reset a parked entry back to ready (operator recovery; the only way back). Peer of `cw sched reset`.", {
1496
+ cwd: stringSchema("Repo workspace"),
1497
+ id: stringSchema("Queue entry id")
1498
+ }),
1499
+ tool("cw_sched_policy_show", "Show the scheduling policy (file or conservative default). Peer of `cw sched policy show`.", {
1500
+ cwd: stringSchema("Repo workspace")
1501
+ }),
1502
+ tool("cw_sched_policy_set", "Set scheduling policy fields (concurrency, attempts, lease TTL, backoff). Peer of `cw sched policy set`.", {
1503
+ cwd: stringSchema("Repo workspace"),
1504
+ maxConcurrent: stringSchema("Hard concurrency ceiling"),
1505
+ maxAttempts: stringSchema("Retry budget before park"),
1506
+ leaseTtlMs: stringSchema("Lease TTL (ms)"),
1507
+ backoffBaseMs: stringSchema("Backoff base (ms)"),
1508
+ backoffFactor: stringSchema("Backoff factor"),
1509
+ backoffCapMs: stringSchema("Backoff cap (ms)")
1510
+ }),
1511
+ tool("cw_gc_plan", "Read-only dry-run of run reclamation: eligible runs, per-kind bytes that WOULD be freed, and the capability downgrade. Frees NOTHING. Peer of `cw gc plan`.", {
1512
+ cwd: stringSchema("Repo workspace"),
1513
+ scope: stringSchema("home (default, cross-repo) or repo"),
1514
+ runId: stringSchema("Plan a single run (optional)"),
1515
+ reclaimAfterArchiveDays: stringSchema("Only reclaim runs archived at least this many days"),
1516
+ keepScratch: stringSchema("true to retain worker scratch"),
1517
+ keepSnapshots: stringSchema("true to retain node snapshots")
1518
+ }),
1519
+ tool("cw_gc_run", "Execute the write-ahead reclamation transaction (skeleton -> tombstone -> fsync -> free) for eligible runs. Bounded, fail-closed. Peer of `cw gc run`.", {
1520
+ cwd: stringSchema("Repo workspace"),
1521
+ scope: stringSchema("home (default, cross-repo) or repo"),
1522
+ runId: stringSchema("Reclaim a single run (optional)"),
1523
+ reclaimAfterArchiveDays: stringSchema("Only reclaim runs archived at least this many days"),
1524
+ keepScratch: stringSchema("true to retain worker scratch"),
1525
+ keepSnapshots: stringSchema("true to retain node snapshots"),
1526
+ limit: stringSchema("Max runs to reclaim in this pass"),
1527
+ actor: stringSchema("Operator recorded on the reclamation attestation")
1528
+ }),
1529
+ tool("cw_gc_verify", "Re-prove a reclaimed run: skeleton schema-complete, tombstone chain untampered, reconstructable artifacts re-derived from retained inputs. Peer of `cw gc verify`.", {
1530
+ cwd: stringSchema("Repo workspace"),
1531
+ scope: stringSchema("home (default, cross-repo) or repo"),
1532
+ runId: stringSchema("Run id to verify")
1533
+ }),
1534
+ tool("cw_history", "Read a cross-repo unified run timeline (newest first), deterministic and paginated, with provenance links.", {
1535
+ cwd: stringSchema("Repo workspace"),
1536
+ scope: stringSchema("home (default, cross-repo) or repo"),
1537
+ app: stringSchema("App or workflow id filter"),
1538
+ status: stringSchema("Lifecycle status filter"),
1539
+ limit: numberSchema("Page size (default 50)"),
1540
+ offset: numberSchema("Page offset (default 0)")
1541
+ })
1542
+ ];
1543
+ }
1544
+ function tool(name, description, properties) {
1545
+ return {
1546
+ name,
1547
+ description,
1548
+ inputSchema: {
1549
+ type: "object",
1550
+ properties,
1551
+ additionalProperties: true
1552
+ }
1553
+ };
1554
+ }
1555
+ function stringSchema(description) {
1556
+ return { type: "string", description };
1557
+ }
1558
+ function numberSchema(description) {
1559
+ return { type: "number", description };
1560
+ }
1561
+ function booleanSchema(description) {
1562
+ return { type: "boolean", description };
1563
+ }
1564
+ function objectSchema(description) {
1565
+ return { type: "object", description, additionalProperties: true };
1566
+ }
1567
+ function arraySchema(description) {
1568
+ return { type: "array", description, items: {} };
1569
+ }
1570
+ function runIdSchema() {
1571
+ return {
1572
+ runId: stringSchema("Run id"),
1573
+ cwd: stringSchema("Run workspace")
1574
+ };
1575
+ }
1576
+ function workerIdSchema() {
1577
+ return {
1578
+ ...runIdSchema(),
1579
+ workerId: stringSchema("Worker id")
1580
+ };
1581
+ }
1582
+ function candidateIdSchema() {
1583
+ return {
1584
+ ...runIdSchema(),
1585
+ candidateId: stringSchema("Candidate id")
1586
+ };
1587
+ }
1588
+ function collaborationTargetSchema() {
1589
+ return {
1590
+ targetKind: stringSchema("Target kind: run|task|candidate|selection|commit|node"),
1591
+ targetId: stringSchema("Target id")
1592
+ };
1593
+ }
1594
+ function actorSchema() {
1595
+ return {
1596
+ actor: stringSchema("Actor id (absent => unattributed)"),
1597
+ actorKind: stringSchema("Actor kind: operator|worker|role|membership|group|host|service"),
1598
+ role: stringSchema("Authorizing role id/title"),
1599
+ displayName: stringSchema("Actor display name"),
1600
+ attested: booleanSchema("Host attests this identity's provenance"),
1601
+ attestation: stringSchema("Attestation: host-attested|operator-recorded")
1602
+ };
1603
+ }
1604
+ function sendResult(id, result) {
1605
+ send({ jsonrpc: "2.0", id, result });
1606
+ }
1607
+ function sendError(id, code, message) {
1608
+ send({ jsonrpc: "2.0", id, error: { code, message } });
1609
+ }
1610
+ function send(message) {
1611
+ process.stdout.write(`${JSON.stringify(message)}\n`);
1612
+ }
1613
+ function messageOf(error) {
1614
+ return error instanceof Error ? error.message : String(error);
1615
+ }