cool-workflow 0.1.84 → 0.1.86

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 (63) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/README.md +47 -331
  4. package/apps/architecture-review/app.json +1 -1
  5. package/apps/architecture-review-fast/app.json +1 -1
  6. package/apps/architecture-review-fast/workflow.js +2 -0
  7. package/apps/end-to-end-golden-path/app.json +1 -1
  8. package/apps/pr-review-fix-ci/app.json +1 -1
  9. package/apps/release-cut/app.json +1 -1
  10. package/apps/research-synthesis/app.json +1 -1
  11. package/dist/capability-core.js +220 -5
  12. package/dist/capability-registry.js +90 -51
  13. package/dist/cli/command-surface.js +47 -2
  14. package/dist/doctor.js +37 -1
  15. package/dist/mcp/tool-call.js +428 -0
  16. package/dist/mcp/tool-definitions.js +1027 -0
  17. package/dist/mcp-surface.js +5 -1416
  18. package/dist/onramp.js +421 -0
  19. package/dist/orchestrator.js +20 -15
  20. package/dist/run-export.js +139 -1
  21. package/dist/telemetry-demo.js +119 -0
  22. package/dist/types/report-bundle.js +6 -0
  23. package/dist/types.js +1 -0
  24. package/dist/version.js +1 -1
  25. package/dist/workbench-host.js +1 -8
  26. package/docs/agent-delegation-drive.7.md +23 -2
  27. package/docs/cli-mcp-parity.7.md +38 -7
  28. package/docs/contract-migration-tooling.7.md +4 -0
  29. package/docs/control-plane-scheduling.7.md +4 -0
  30. package/docs/dogfood-one-real-repo.7.md +9 -1
  31. package/docs/durable-state-and-locking.7.md +4 -0
  32. package/docs/evidence-adoption-reasoning-chain.7.md +4 -0
  33. package/docs/execution-backends.7.md +4 -0
  34. package/docs/getting-started.md +40 -2
  35. package/docs/index.md +51 -37
  36. package/docs/multi-agent-cli-mcp-surface.7.md +4 -0
  37. package/docs/multi-agent-eval-replay-harness.7.md +4 -0
  38. package/docs/multi-agent-operator-ux.7.md +4 -0
  39. package/docs/node-snapshot-diff-replay.7.md +4 -0
  40. package/docs/observability-cost-accounting.7.md +4 -0
  41. package/docs/project-index.md +23 -7
  42. package/docs/real-execution-backends.7.md +4 -0
  43. package/docs/release-and-migration.7.md +5 -1
  44. package/docs/release-history.md +342 -0
  45. package/docs/release-tooling.7.md +18 -0
  46. package/docs/report-verifiable-bundle.7.md +123 -0
  47. package/docs/run-registry-control-plane.7.md +4 -0
  48. package/docs/run-retention-reclamation.7.md +4 -0
  49. package/docs/state-explosion-management.7.md +4 -0
  50. package/docs/team-collaboration.7.md +4 -0
  51. package/docs/web-desktop-workbench.7.md +4 -0
  52. package/manifest/plugin.manifest.json +1 -1
  53. package/manifest/source-context-profiles.json +1 -1
  54. package/package.json +2 -1
  55. package/scripts/architecture-review-fast.js +44 -2
  56. package/scripts/canonical-apps.js +4 -4
  57. package/scripts/dogfood-release.js +55 -133
  58. package/scripts/golden-path.js +4 -4
  59. package/scripts/onramp-check.js +47 -0
  60. package/scripts/parity-check.js +740 -2
  61. package/scripts/release-check.js +2 -0
  62. package/scripts/source-context.js +31 -5
  63. package/scripts/version-sync-check.js +4 -2
package/dist/doctor.js CHANGED
@@ -25,6 +25,7 @@ const node_os_1 = __importDefault(require("node:os"));
25
25
  const node_path_1 = __importDefault(require("node:path"));
26
26
  const node_child_process_1 = require("node:child_process");
27
27
  const agent_config_1 = require("./agent-config");
28
+ const onramp_1 = require("./onramp");
28
29
  /** Resolve a bare binary name against $PATH (or accept an explicit path). Returns
29
30
  * the resolved path, or undefined when not found. No spawning. */
30
31
  function whichBinary(bin, env) {
@@ -136,7 +137,15 @@ function runDoctor(args = {}, env = process.env, cwd = process.cwd()) {
136
137
  ? "ready — all checks passed"
137
138
  : `ready, with ${warns} warning${warns === 1 ? "" : "s"}`
138
139
  : `${fails} blocking problem${fails === 1 ? "" : "s"} found`;
139
- return { schemaVersion: 1, ok, checks, summary };
140
+ return {
141
+ schemaVersion: 1,
142
+ ok,
143
+ checks,
144
+ summary,
145
+ ...((0, onramp_1.optionEnabled)(args.onramp)
146
+ ? { onramp: (0, onramp_1.buildDoctorOnramp)({ cwd, env, changedFrom: typeof args["changed-from"] === "string" ? args["changed-from"] : undefined }) }
147
+ : {})
148
+ };
140
149
  }
141
150
  /** Human rendering (TTY/default). `--json` callers use the report object directly. */
142
151
  function formatDoctorReport(report) {
@@ -149,5 +158,32 @@ function formatDoctorReport(report) {
149
158
  }
150
159
  lines.push("");
151
160
  lines.push(`${report.ok ? "✓" : "✗"} ${report.summary}`);
161
+ if (report.onramp) {
162
+ lines.push("");
163
+ lines.push("Onramp");
164
+ lines.push(` ${report.onramp.summary}`);
165
+ if (report.onramp.recommendedChecks) {
166
+ lines.push("");
167
+ lines.push(" Recommended Checks");
168
+ for (const command of report.onramp.recommendedChecks.commands)
169
+ lines.push(` - ${command}`);
170
+ }
171
+ if (report.onramp.contract && !report.onramp.contract.ok) {
172
+ lines.push("");
173
+ lines.push(" Contract Issues");
174
+ for (const issue of report.onramp.contract.issues) {
175
+ lines.push(` - ${issue.code}: ${issue.detail}`);
176
+ lines.push(` fix: ${issue.fix}`);
177
+ }
178
+ }
179
+ for (const section of report.onramp.sections) {
180
+ lines.push("");
181
+ lines.push(` ${section.title}: ${section.summary}`);
182
+ for (const action of section.actions) {
183
+ lines.push(` - ${action.command}`);
184
+ lines.push(` ${action.reason}`);
185
+ }
186
+ }
187
+ }
152
188
  return lines.join("\n");
153
189
  }
@@ -0,0 +1,428 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.callTool = callTool;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const orchestrator_1 = require("../orchestrator");
10
+ const scheduler_1 = require("../scheduler");
11
+ const triggers_1 = require("../triggers");
12
+ const workbench_1 = require("../workbench");
13
+ const capability_core_1 = require("../capability-core");
14
+ const baseRunner = new orchestrator_1.CoolWorkflowRunner({
15
+ pluginRoot: node_path_1.default.resolve(__dirname, "../..")
16
+ });
17
+ // This is an EXPLICIT switch by design, NOT a descriptor-driven generic dispatcher
18
+ // (FreeBSD-audit R1, assessed & closed as won't-do). A data-routing rewrite is
19
+ // ACTIVELY DANGEROUS here, not just risky: (1) `descriptor.entry` does NOT reliably
20
+ // name the function an arm calls (e.g. cw_app_run entry="validateApp" actually calls
21
+ // appRun; cw_commit entry="commit" calls commitEnvelope), so `runner[entry](args)`
22
+ // would silently call the WRONG method; (2) the parity gate is token-set-only +
23
+ // payload-probes ~30 read-only runId caps, so ~150 multi-positional/write arms are
24
+ // UNPROBED — a mis-marshalling generic dispatcher would pass BOTH gates green = the
25
+ // existential public false-green (a CW red line — see DIRECTION.md). The arms
26
+ // work and parity guards the surface; the real defect the audit flagged (a DEAD
27
+ // dispatcher) was already removed (#131). Cheap safe hardening, if ever wanted:
28
+ // broaden parity-check payload probes to cover multi-positional/write arms, and
29
+ // correct the wrong `entry` metadata — NOT a dispatch rewrite.
30
+ function callTool(name, args) {
31
+ const cwd = resolveInvocationCwd(args);
32
+ if (cwd)
33
+ args = { ...args, cwd };
34
+ const runner = baseRunner.withBaseDir(cwd);
35
+ const workCwd = cwd || process.cwd();
36
+ const scheduler = new scheduler_1.Scheduler(workCwd);
37
+ const triggers = new triggers_1.RoutineTriggerBridge(workCwd);
38
+ switch (name) {
39
+ case "cw_list":
40
+ return runner.listWorkflows();
41
+ case "cw_plan":
42
+ return (0, capability_core_1.planSummary)(runner, String(args.workflowId || ""), args);
43
+ case "cw_app_run":
44
+ return (0, capability_core_1.appRun)(runner, args);
45
+ case "cw_status":
46
+ return runner.status(String(args.runId || ""));
47
+ case "cw_init":
48
+ return runner.init(String(args.workflowId || ""), args);
49
+ case "cw_next":
50
+ return runner.next(String(args.runId || ""), args);
51
+ case "cw_state_check":
52
+ return runner.checkState(String(args.runId || ""), args);
53
+ case "cw_contract_show":
54
+ return runner.showContract(String(args.runId || ""), (0, capability_core_1.optionalString)(args.contractId));
55
+ case "cw_node_list":
56
+ return runner.listNodes(String(args.runId || ""));
57
+ case "cw_node_show":
58
+ return runner.showNode(String(args.runId || ""), String(args.nodeId || ""));
59
+ case "cw_node_graph":
60
+ return runner.graphNodes(String(args.runId || ""));
61
+ case "cw_node_snapshot":
62
+ return runner.nodeSnapshot(String(args.runId || ""), String(args.nodeId || ""), args);
63
+ case "cw_node_diff":
64
+ return runner.nodeDiff(String(args.runId || ""), String(args.baselineSnapshotId || args.baseline || ""), String(args.candidateSnapshotId || args.candidate || ""));
65
+ case "cw_node_replay":
66
+ return runner.nodeReplay(String(args.runId || ""), String(args.snapshotId || ""), args);
67
+ case "cw_node_replay_verify":
68
+ return runner.nodeReplayVerify(String(args.runId || ""), String(args.replayId || ""), args);
69
+ case "cw_migration_list":
70
+ return runner.migrationList();
71
+ case "cw_migration_check":
72
+ return runner.migrationCheck(String(args.target || args.runId || ""), args);
73
+ case "cw_migration_prove":
74
+ return runner.migrationProve(String(args.target || args.runId || ""), args);
75
+ case "cw_operator_status":
76
+ return runner.operatorStatus(String(args.runId || ""));
77
+ case "cw_operator_graph":
78
+ return runner.operatorGraph(String(args.runId || ""));
79
+ case "cw_operator_report":
80
+ return runner.operatorReport(String(args.runId || ""));
81
+ case "cw_worker_summary":
82
+ return runner.summarizeWorkerRecords(String(args.runId || ""));
83
+ case "cw_candidate_summary":
84
+ return runner.summarizeCandidateOperatorRecords(String(args.runId || ""));
85
+ case "cw_feedback_summary":
86
+ return runner.summarizeFeedbackRecords(String(args.runId || ""));
87
+ case "cw_commit_summary":
88
+ return runner.summarizeCommitRecords(String(args.runId || ""));
89
+ case "cw_multi_agent_summary":
90
+ return runner.multiAgentSummary(String(args.runId || ""));
91
+ case "cw_multi_agent_graph":
92
+ return runner.multiAgentOperatorGraph(String(args.runId || ""));
93
+ case "cw_multi_agent_dependencies":
94
+ return runner.multiAgentDependencies(String(args.runId || ""));
95
+ case "cw_multi_agent_failures":
96
+ return runner.multiAgentFailures(String(args.runId || ""));
97
+ case "cw_multi_agent_evidence":
98
+ return runner.multiAgentEvidence(String(args.runId || ""));
99
+ case "cw_evidence_reasoning":
100
+ return runner.multiAgentReasoning(String(args.runId || ""), args);
101
+ case "cw_evidence_reasoning_refresh":
102
+ return runner.multiAgentReasoningRefresh(String(args.runId || ""));
103
+ case "cw_multi_agent_run":
104
+ return runner.hostMultiAgentRun((0, capability_core_1.optionalString)(args.runId), args);
105
+ case "cw_multi_agent_status":
106
+ return runner.hostMultiAgentStatus(String(args.runId || ""));
107
+ case "cw_multi_agent_step":
108
+ return runner.hostMultiAgentStep(String(args.runId || ""), args);
109
+ case "cw_multi_agent_blackboard":
110
+ return runner.hostMultiAgentBlackboard(String(args.runId || ""), (0, capability_core_1.optionalString)(args.action || args.operation), args);
111
+ case "cw_multi_agent_score":
112
+ return runner.hostMultiAgentScore(String(args.runId || ""), args);
113
+ case "cw_multi_agent_select":
114
+ return runner.hostMultiAgentSelect(String(args.runId || ""), args);
115
+ case "cw_summary_refresh":
116
+ return runner.summaryRefresh(String(args.runId || ""), args);
117
+ case "cw_summary_show":
118
+ return runner.summaryShow(String(args.runId || ""));
119
+ case "cw_blackboard_summarize":
120
+ return runner.blackboardSummarize(String(args.runId || ""), args);
121
+ case "cw_multi_agent_summarize":
122
+ return runner.multiAgentSummarize(String(args.runId || ""));
123
+ case "cw_multi_agent_graph_compact":
124
+ return runner.multiAgentGraphView(String(args.runId || ""), args);
125
+ case "cw_eval_snapshot":
126
+ return runner.evalSnapshot(String(args.runId || ""), args);
127
+ case "cw_eval_replay":
128
+ return runner.evalReplay(String(args.snapshot || args.snapshotId || args.path || ""), args);
129
+ case "cw_eval_compare":
130
+ return runner.evalCompare(String(args.baseline || args.baselinePath || ""), String(args.replay || args.replayPath || ""));
131
+ case "cw_eval_score":
132
+ return runner.evalScore(String(args.replay || args.replayPath || args.path || ""));
133
+ case "cw_eval_gate":
134
+ return runner.evalGate(String(args.suite || args.suiteId || args.path || ""));
135
+ case "cw_eval_report":
136
+ return runner.evalReport(String(args.replay || args.replayPath || args.path || ""));
137
+ case "cw_multi_agent_run_create":
138
+ return runner.createMultiAgentRun(String(args.runId || ""), args);
139
+ case "cw_multi_agent_run_transition":
140
+ return runner.transitionMultiAgentRun(String(args.runId || ""), String(args.multiAgentRunId || args.id || ""), args);
141
+ case "cw_multi_agent_run_show":
142
+ return runner.showMultiAgentRun(String(args.runId || ""), String(args.multiAgentRunId || args.id || ""));
143
+ case "cw_multi_agent_role_create":
144
+ return runner.createAgentRole(String(args.runId || ""), args);
145
+ case "cw_multi_agent_role_show":
146
+ return runner.showAgentRole(String(args.runId || ""), String(args.roleId || args.id || ""));
147
+ case "cw_multi_agent_group_create":
148
+ return runner.createAgentGroup(String(args.runId || ""), args);
149
+ case "cw_multi_agent_group_show":
150
+ return runner.showAgentGroup(String(args.runId || ""), String(args.groupId || args.id || ""));
151
+ case "cw_multi_agent_membership_create":
152
+ return runner.assignAgentMembership(String(args.runId || ""), args);
153
+ case "cw_multi_agent_membership_show":
154
+ return runner.showAgentMembership(String(args.runId || ""), String(args.membershipId || args.id || ""));
155
+ case "cw_multi_agent_fanout_create":
156
+ return runner.createAgentFanout(String(args.runId || ""), args);
157
+ case "cw_multi_agent_fanout_show":
158
+ return runner.showAgentFanout(String(args.runId || ""), String(args.fanoutId || args.id || ""));
159
+ case "cw_multi_agent_fanin_collect":
160
+ return runner.collectAgentFanin(String(args.runId || ""), args);
161
+ case "cw_multi_agent_fanin_show":
162
+ return runner.showAgentFanin(String(args.runId || ""), String(args.faninId || args.id || ""));
163
+ case "cw_topology_list":
164
+ return runner.listTopologies();
165
+ case "cw_topology_show":
166
+ if (args.runId && (args.topologyRunId || args.id))
167
+ return runner.showTopologyRun(String(args.runId || ""), String(args.topologyRunId || args.id || ""));
168
+ return runner.showTopology(String(args.topologyId || args.id || ""));
169
+ case "cw_topology_validate":
170
+ return runner.validateTopology(String(args.topologyId || args.id || ""));
171
+ case "cw_topology_apply":
172
+ return runner.applyTopology(String(args.runId || ""), String(args.topologyId || args.id || ""), args);
173
+ case "cw_topology_summary":
174
+ return runner.topologySummary(String(args.runId || ""));
175
+ case "cw_topology_graph":
176
+ return runner.topologyGraph(String(args.runId || ""));
177
+ case "cw_blackboard_summary":
178
+ return runner.blackboardSummary(String(args.runId || ""), args);
179
+ case "cw_blackboard_graph":
180
+ return runner.blackboardGraph(String(args.runId || ""));
181
+ case "cw_blackboard_resolve":
182
+ return runner.resolveRunBlackboard(String(args.runId || ""), args);
183
+ case "cw_blackboard_topic_create":
184
+ return runner.createBlackboardTopic(String(args.runId || ""), args);
185
+ case "cw_blackboard_message_post":
186
+ return runner.postBlackboardMessage(String(args.runId || ""), args);
187
+ case "cw_blackboard_message_list":
188
+ return runner.listBlackboardMessages(String(args.runId || ""), args);
189
+ case "cw_blackboard_context_put":
190
+ return runner.putBlackboardContext(String(args.runId || ""), args);
191
+ case "cw_blackboard_artifact_add":
192
+ return runner.addBlackboardArtifact(String(args.runId || ""), args);
193
+ case "cw_blackboard_artifact_list":
194
+ return runner.listBlackboardArtifacts(String(args.runId || ""), args);
195
+ case "cw_blackboard_snapshot":
196
+ return runner.snapshotBlackboard(String(args.runId || ""), args);
197
+ case "cw_coordinator_summary":
198
+ return runner.coordinatorSummary(String(args.runId || ""), args);
199
+ case "cw_coordinator_decision":
200
+ return runner.recordCoordinatorDecision(String(args.runId || ""), args);
201
+ case "cw_audit_summary":
202
+ return runner.auditSummary(String(args.runId || ""));
203
+ case "cw_audit_verify":
204
+ return (0, capability_core_1.auditVerify)(runner, args);
205
+ case "cw_audit_worker":
206
+ return runner.workerAudit(String(args.runId || ""), String(args.workerId || ""));
207
+ case "cw_audit_provenance":
208
+ return runner.evidenceProvenance(String(args.runId || ""), args);
209
+ case "cw_audit_multi_agent":
210
+ return runner.auditMultiAgent(String(args.runId || ""));
211
+ case "cw_audit_policy":
212
+ return runner.auditPolicy(String(args.runId || ""));
213
+ case "cw_audit_role":
214
+ return runner.auditRole(String(args.runId || ""), String(args.roleId || args.id || ""));
215
+ case "cw_audit_blackboard":
216
+ return runner.auditBlackboard(String(args.runId || ""));
217
+ case "cw_audit_judge":
218
+ return runner.auditJudge(String(args.runId || ""));
219
+ case "cw_audit_attest":
220
+ return runner.recordAuditAttestation(String(args.runId || ""), args);
221
+ case "cw_audit_decision":
222
+ return runner.recordAuditDecision(String(args.runId || ""), String(args.workerId || ""), args);
223
+ case "cw_dispatch":
224
+ return runner.dispatch(String(args.runId || ""), args);
225
+ case "cw_sandbox_list":
226
+ return runner.listSandboxProfiles(args);
227
+ case "cw_sandbox_show":
228
+ return runner.showSandboxProfile(String(args.profileId || ""), args);
229
+ case "cw_sandbox_validate":
230
+ return runner.validateSandboxProfile(String(args.profileFile || ""), args);
231
+ case "cw_sandbox_choose":
232
+ case "cw_sandbox_resolve":
233
+ return (0, capability_core_1.sandboxChoose)(runner, args);
234
+ case "cw_backend_list":
235
+ return runner.listBackends(args);
236
+ case "cw_backend_show":
237
+ return runner.showBackend(String(args.backendId || args.backend || ""), args);
238
+ case "cw_backend_probe":
239
+ return runner.probeBackend((0, capability_core_1.optionalString)(args.backendId || args.backend), args);
240
+ case "cw_backend_agent_config_show":
241
+ return (0, capability_core_1.backendAgentConfigShow)(args);
242
+ case "cw_backend_agent_config_set":
243
+ return (0, capability_core_1.backendAgentConfigSet)(args);
244
+ case "cw_result":
245
+ return runner.recordResult(String(args.runId || ""), String(args.taskId || ""), String(args.resultPath || ""), args);
246
+ case "cw_commit":
247
+ return (0, capability_core_1.commitEnvelope)(runner, String(args.runId || ""), args);
248
+ case "cw_report":
249
+ return runner.report(String(args.runId || ""));
250
+ case "cw_app_list":
251
+ return runner.listApps();
252
+ case "cw_app_show":
253
+ return runner.showApp(String(args.appId || ""));
254
+ case "cw_app_validate":
255
+ return runner.validateApp(String(args.target || args.appId || args.path || ""));
256
+ case "cw_app_init":
257
+ return runner.initApp(String(args.appId || ""), args);
258
+ case "cw_app_package":
259
+ return runner.packageApp(String(args.appId || ""), args);
260
+ case "cw_worker_list":
261
+ return runner.listWorkers(String(args.runId || ""), args);
262
+ case "cw_worker_show":
263
+ return runner.showWorker(String(args.runId || ""), String(args.workerId || ""));
264
+ case "cw_worker_manifest":
265
+ return runner.showWorkerManifest(String(args.runId || ""), String(args.workerId || ""));
266
+ case "cw_worker_output":
267
+ return runner.recordWorkerOutput(String(args.runId || ""), String(args.workerId || ""), String(args.resultPath || ""), args);
268
+ case "cw_worker_fail":
269
+ return runner.recordWorkerFailure(String(args.runId || ""), String(args.workerId || ""), String(args.message || ""), args);
270
+ case "cw_worker_validate":
271
+ return runner.validateWorker(String(args.runId || ""), String(args.workerId || ""), (0, capability_core_1.optionalString)(args.path || args.resultPath));
272
+ case "cw_candidate_list":
273
+ return runner.listCandidates(String(args.runId || ""), args);
274
+ case "cw_candidate_show":
275
+ return runner.showCandidate(String(args.runId || ""), String(args.candidateId || ""));
276
+ case "cw_candidate_register":
277
+ return runner.registerCandidate(String(args.runId || ""), args);
278
+ case "cw_candidate_score":
279
+ return runner.scoreCandidate(String(args.runId || ""), String(args.candidateId || ""), args);
280
+ case "cw_candidate_rank":
281
+ return runner.rankCandidates(String(args.runId || ""), args);
282
+ case "cw_candidate_select":
283
+ return runner.selectCandidate(String(args.runId || ""), String(args.candidateId || ""), args);
284
+ case "cw_candidate_reject":
285
+ return runner.rejectCandidate(String(args.runId || ""), String(args.candidateId || ""), String(args.reason || "rejected"));
286
+ // ---- Team Collaboration (v0.1.32) ----
287
+ case "cw_approve":
288
+ return runner.collaborationApprove(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
289
+ case "cw_reject":
290
+ return runner.collaborationReject(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
291
+ case "cw_comment_add":
292
+ return runner.collaborationComment(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
293
+ case "cw_comment_list":
294
+ return runner.collaborationCommentList(String(args.runId || ""), args);
295
+ case "cw_handoff":
296
+ return runner.collaborationHandoff(String(args.runId || ""), String(args.targetKind || args.kind || ""), String(args.targetId || args.target || ""), args);
297
+ case "cw_review_status":
298
+ return runner.reviewStatus(String(args.runId || ""), args);
299
+ case "cw_review_policy":
300
+ return runner.reviewPolicy(String(args.runId || ""), args);
301
+ case "cw_feedback_list":
302
+ return runner.listFeedback(String(args.runId || ""), args);
303
+ case "cw_feedback_show":
304
+ return runner.showFeedback(String(args.runId || ""), String(args.feedbackId || ""));
305
+ case "cw_feedback_collect":
306
+ return runner.collectFeedback(String(args.runId || ""));
307
+ case "cw_feedback_task":
308
+ return runner.createFeedbackTask(String(args.runId || ""), String(args.feedbackId || ""), args);
309
+ case "cw_feedback_resolve":
310
+ return runner.resolveFeedback(String(args.runId || ""), String(args.feedbackId || ""), args);
311
+ case "cw_schedule_create":
312
+ return scheduler.create(args);
313
+ case "cw_schedule_list":
314
+ return scheduler.list(args.status ? String(args.status) : undefined);
315
+ case "cw_schedule_delete":
316
+ return scheduler.delete(String(args.id || ""));
317
+ case "cw_schedule_due":
318
+ return scheduler.due();
319
+ case "cw_schedule_complete":
320
+ return scheduler.complete(String(args.id || ""), args);
321
+ case "cw_schedule_pause":
322
+ return scheduler.pause(String(args.id || ""));
323
+ case "cw_schedule_resume":
324
+ return scheduler.resume(String(args.id || ""));
325
+ case "cw_schedule_run_now":
326
+ return scheduler.runNow(String(args.id || ""));
327
+ case "cw_schedule_history":
328
+ return scheduler.history(args.id ? String(args.id) : undefined);
329
+ case "cw_routine_create":
330
+ return triggers.create(args);
331
+ case "cw_routine_list":
332
+ return triggers.list(args.kind ? String(args.kind) : undefined);
333
+ case "cw_routine_delete":
334
+ return triggers.delete(String(args.id || ""));
335
+ case "cw_routine_fire":
336
+ return triggers.fire(String(args.kind || "api"), args.payload || args);
337
+ case "cw_routine_events":
338
+ return triggers.events(args.id ? String(args.id) : undefined);
339
+ case "cw_registry_refresh":
340
+ return (0, capability_core_1.runRegistryRefresh)((0, capability_core_1.runRegistryFor)(args, runner), args);
341
+ case "cw_registry_show":
342
+ return (0, capability_core_1.runRegistryShow)((0, capability_core_1.runRegistryFor)(args, runner), args);
343
+ case "cw_metrics_show":
344
+ return runner.metricsShow(String(args.runId || ""), args);
345
+ case "cw_metrics_summary":
346
+ return (0, capability_core_1.metricsSummary)((0, capability_core_1.runRegistryFor)(args, runner), runner, args);
347
+ case "cw_run_search":
348
+ return (0, capability_core_1.runSearch)((0, capability_core_1.runRegistryFor)(args, runner), args);
349
+ case "cw_run_list":
350
+ return (0, capability_core_1.runList)((0, capability_core_1.runRegistryFor)(args, runner), args);
351
+ case "cw_run_show":
352
+ return (0, capability_core_1.runShow)((0, capability_core_1.runRegistryFor)(args, runner), String(args.runId || ""), args);
353
+ case "cw_run_resume":
354
+ return (0, capability_core_1.runResume)((0, capability_core_1.runRegistryFor)(args, runner), runner, String(args.runId || ""), args);
355
+ case "cw_run_archive":
356
+ return (0, capability_core_1.runArchive)((0, capability_core_1.runRegistryFor)(args, runner), (0, capability_core_1.optionalString)(args.runId), args);
357
+ case "cw_run_rerun":
358
+ return (0, capability_core_1.runRerun)((0, capability_core_1.runRegistryFor)(args, runner), String(args.runId || ""), args);
359
+ case "cw_run_export":
360
+ return (0, capability_core_1.runExportArchive)(runner, String(args.runId || ""), args);
361
+ case "cw_run_import":
362
+ return (0, capability_core_1.runImportArchive)(runner, args);
363
+ case "cw_run_verify_import":
364
+ return (0, capability_core_1.runVerifyImport)(runner, String(args.runId || ""), args);
365
+ case "cw_run_inspect_archive":
366
+ return (0, capability_core_1.runInspectArchive)(runner, args);
367
+ case "cw_report_verify_bundle":
368
+ return (0, capability_core_1.runVerifyReportBundle)(runner, args);
369
+ case "cw_report_bundle":
370
+ return (0, capability_core_1.reportBundle)(runner, String(args.runId || ""), args);
371
+ case "cw_run_drive":
372
+ return (0, capability_core_1.runDrivePreview)(runner, args);
373
+ case "cw_run_drive_step":
374
+ return (0, capability_core_1.runDrive)(runner, args);
375
+ case "cw_queue_add":
376
+ return (0, capability_core_1.queueAdd)((0, capability_core_1.runRegistryFor)(args, runner), args);
377
+ case "cw_queue_list":
378
+ return (0, capability_core_1.queueList)((0, capability_core_1.runRegistryFor)(args, runner), args);
379
+ case "cw_queue_drain":
380
+ return (0, capability_core_1.queueDrain)((0, capability_core_1.runRegistryFor)(args, runner), args);
381
+ case "cw_queue_show":
382
+ return (0, capability_core_1.queueShow)((0, capability_core_1.runRegistryFor)(args, runner), String(args.id || ""));
383
+ case "cw_sched_plan":
384
+ return (0, capability_core_1.schedPlan)((0, capability_core_1.runRegistryFor)(args, runner), args);
385
+ case "cw_sched_lease":
386
+ return (0, capability_core_1.schedLease)((0, capability_core_1.runRegistryFor)(args, runner), args);
387
+ case "cw_sched_release":
388
+ return (0, capability_core_1.schedRelease)((0, capability_core_1.runRegistryFor)(args, runner), args);
389
+ case "cw_sched_complete":
390
+ return (0, capability_core_1.schedComplete)((0, capability_core_1.runRegistryFor)(args, runner), args);
391
+ case "cw_sched_reclaim":
392
+ return (0, capability_core_1.schedReclaim)((0, capability_core_1.runRegistryFor)(args, runner), args);
393
+ case "cw_sched_reset":
394
+ return (0, capability_core_1.schedReset)((0, capability_core_1.runRegistryFor)(args, runner), args);
395
+ case "cw_sched_policy_show":
396
+ return (0, capability_core_1.schedPolicyShow)((0, capability_core_1.runRegistryFor)(args, runner));
397
+ case "cw_sched_policy_set":
398
+ return (0, capability_core_1.schedPolicySet)((0, capability_core_1.runRegistryFor)(args, runner), args);
399
+ case "cw_gc_plan":
400
+ return (0, capability_core_1.gcPlan)((0, capability_core_1.runRegistryFor)(args, runner), (0, capability_core_1.optionalString)(args.runId), args);
401
+ case "cw_gc_run":
402
+ return (0, capability_core_1.gcRun)((0, capability_core_1.runRegistryFor)(args, runner), (0, capability_core_1.optionalString)(args.runId), args);
403
+ case "cw_gc_verify":
404
+ return (0, capability_core_1.gcVerify)((0, capability_core_1.runRegistryFor)(args, runner), String(args.runId || ""), args);
405
+ case "cw_telemetry_verify":
406
+ return (0, capability_core_1.telemetryVerify)(runner, args);
407
+ case "cw_history":
408
+ return (0, capability_core_1.runHistory)((0, capability_core_1.runRegistryFor)(args, runner), args);
409
+ case "cw_workbench_view":
410
+ return (0, workbench_1.buildWorkbenchRunView)(runner, String(args.runId || ""));
411
+ case "cw_workbench_serve":
412
+ // MCP cannot start a blocking server; it returns the descriptor only
413
+ // (identical to `cw workbench serve --json`). The CLI default additionally
414
+ // starts the localhost host — declared divergence (see capability-registry).
415
+ return (0, workbench_1.buildWorkbenchServeDescriptor)(runner, { ...args, once: true });
416
+ default:
417
+ throw new Error(`Unknown tool: ${name}`);
418
+ }
419
+ }
420
+ function resolveInvocationCwd(args) {
421
+ const value = (0, capability_core_1.optionalString)(args.cwd);
422
+ if (!value)
423
+ return undefined;
424
+ const resolved = node_path_1.default.resolve(value);
425
+ if (!node_fs_1.default.statSync(resolved).isDirectory())
426
+ throw new Error(`MCP cwd is not a directory: ${resolved}`);
427
+ return resolved;
428
+ }