cool-workflow 0.1.85 → 0.1.87

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 (69) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/README.md +53 -332
  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 +131 -3
  12. package/dist/capability-registry.js +108 -50
  13. package/dist/cli/command-surface.js +83 -10
  14. package/dist/cli.js +2 -1
  15. package/dist/doctor.js +50 -5
  16. package/dist/execution-backend.js +8 -0
  17. package/dist/mcp/tool-call.js +428 -0
  18. package/dist/mcp/tool-definitions.js +1027 -0
  19. package/dist/mcp-surface.js +5 -1442
  20. package/dist/onramp.js +421 -0
  21. package/dist/operator-ux/format.js +21 -15
  22. package/dist/operator-ux.js +2 -1
  23. package/dist/orchestrator.js +190 -87
  24. package/dist/term.js +93 -0
  25. package/dist/version.js +1 -1
  26. package/dist/workbench-host.js +1 -8
  27. package/docs/agent-delegation-drive.7.md +45 -8
  28. package/docs/cli-mcp-parity.7.md +41 -6
  29. package/docs/contract-migration-tooling.7.md +6 -0
  30. package/docs/control-plane-scheduling.7.md +6 -0
  31. package/docs/dogfood-one-real-repo.7.md +9 -1
  32. package/docs/durable-state-and-locking.7.md +6 -0
  33. package/docs/evidence-adoption-reasoning-chain.7.md +6 -0
  34. package/docs/execution-backends.7.md +6 -0
  35. package/docs/getting-started.md +40 -2
  36. package/docs/index.md +51 -38
  37. package/docs/multi-agent-cli-mcp-surface.7.md +6 -0
  38. package/docs/multi-agent-eval-replay-harness.7.md +6 -0
  39. package/docs/multi-agent-operator-ux.7.md +6 -0
  40. package/docs/node-snapshot-diff-replay.7.md +6 -0
  41. package/docs/observability-cost-accounting.7.md +6 -0
  42. package/docs/project-index.md +24 -7
  43. package/docs/real-execution-backends.7.md +6 -0
  44. package/docs/release-and-migration.7.md +7 -1
  45. package/docs/release-history.md +352 -0
  46. package/docs/release-tooling.7.md +28 -0
  47. package/docs/run-registry-control-plane.7.md +6 -0
  48. package/docs/run-retention-reclamation.7.md +6 -0
  49. package/docs/state-explosion-management.7.md +6 -0
  50. package/docs/team-collaboration.7.md +6 -0
  51. package/docs/web-desktop-workbench.7.md +6 -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/agents/agent-adapter-core.js +180 -0
  56. package/scripts/agents/builtin-templates.json +4 -1
  57. package/scripts/agents/codex-agent.js +134 -0
  58. package/scripts/agents/gemini-agent.js +115 -0
  59. package/scripts/agents/opencode-agent.js +119 -0
  60. package/scripts/architecture-review-fast.js +44 -2
  61. package/scripts/canonical-apps.js +4 -4
  62. package/scripts/dogfood-release.js +55 -133
  63. package/scripts/golden-path.js +4 -4
  64. package/scripts/onramp-check.js +47 -0
  65. package/scripts/parity-check.js +741 -2
  66. package/scripts/release-check.js +5 -3
  67. package/scripts/release-gate.sh +1 -1
  68. package/scripts/source-context.js +31 -5
  69. package/scripts/version-sync-check.js +4 -2
package/dist/doctor.js CHANGED
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.runDoctor = runDoctor;
7
7
  exports.formatDoctorReport = formatDoctorReport;
8
+ exports.formatDoctorFixes = formatDoctorFixes;
8
9
  // `cw doctor` — environment diagnostics, in the spirit of `brew doctor`.
9
10
  //
10
11
  // Homebrew's `doctor` turned "something is subtly wrong with your setup" into a
@@ -25,6 +26,8 @@ const node_os_1 = __importDefault(require("node:os"));
25
26
  const node_path_1 = __importDefault(require("node:path"));
26
27
  const node_child_process_1 = require("node:child_process");
27
28
  const agent_config_1 = require("./agent-config");
29
+ const onramp_1 = require("./onramp");
30
+ const term_1 = require("./term");
28
31
  /** Resolve a bare binary name against $PATH (or accept an explicit path). Returns
29
32
  * the resolved path, or undefined when not found. No spawning. */
30
33
  function whichBinary(bin, env) {
@@ -136,18 +139,60 @@ function runDoctor(args = {}, env = process.env, cwd = process.cwd()) {
136
139
  ? "ready — all checks passed"
137
140
  : `ready, with ${warns} warning${warns === 1 ? "" : "s"}`
138
141
  : `${fails} blocking problem${fails === 1 ? "" : "s"} found`;
139
- return { schemaVersion: 1, ok, checks, summary };
142
+ return {
143
+ schemaVersion: 1,
144
+ ok,
145
+ checks,
146
+ summary,
147
+ ...((0, onramp_1.optionEnabled)(args.onramp)
148
+ ? { onramp: (0, onramp_1.buildDoctorOnramp)({ cwd, env, changedFrom: typeof args["changed-from"] === "string" ? args["changed-from"] : undefined }) }
149
+ : {})
150
+ };
140
151
  }
141
152
  /** Human rendering (TTY/default). `--json` callers use the report object directly. */
142
153
  function formatDoctorReport(report) {
143
- const glyph = { ok: "✓", warn: "!", fail: "✗" };
144
- const lines = ["cw doctor"];
154
+ const lines = [(0, term_1.bold)("cw doctor")];
145
155
  for (const check of report.checks) {
146
- lines.push(` ${glyph[check.status]} ${check.name}: ${check.detail}`);
156
+ lines.push(` ${(0, term_1.doctorGlyph)(check.status)} ${check.name}: ${check.detail}`);
147
157
  if (check.fix && check.status !== "ok")
148
158
  lines.push(` fix: ${check.fix}`);
149
159
  }
150
160
  lines.push("");
151
- lines.push(`${report.ok ? "✓" : "✗"} ${report.summary}`);
161
+ const summaryGlyph = report.ok ? (0, term_1.green)("✓") : (0, term_1.red)("✗");
162
+ lines.push(`${summaryGlyph} ${report.summary}`);
163
+ if (report.onramp) {
164
+ lines.push("");
165
+ lines.push("Onramp");
166
+ lines.push(` ${report.onramp.summary}`);
167
+ if (report.onramp.recommendedChecks) {
168
+ lines.push("");
169
+ lines.push(" Recommended Checks");
170
+ for (const command of report.onramp.recommendedChecks.commands)
171
+ lines.push(` - ${command}`);
172
+ }
173
+ if (report.onramp.contract && !report.onramp.contract.ok) {
174
+ lines.push("");
175
+ lines.push(" Contract Issues");
176
+ for (const issue of report.onramp.contract.issues) {
177
+ lines.push(` - ${issue.code}: ${issue.detail}`);
178
+ lines.push(` fix: ${issue.fix}`);
179
+ }
180
+ }
181
+ for (const section of report.onramp.sections) {
182
+ lines.push("");
183
+ lines.push(` ${section.title}: ${section.summary}`);
184
+ for (const action of section.actions) {
185
+ lines.push(` - ${action.command}`);
186
+ lines.push(` ${action.reason}`);
187
+ }
188
+ }
189
+ }
152
190
  return lines.join("\n");
153
191
  }
192
+ /** `--fix` rendering: consolidates all fix strings into an actionable block. */
193
+ function formatDoctorFixes(report) {
194
+ const fixes = report.checks.filter((c) => c.fix && c.status !== "ok").map((c) => c.fix);
195
+ if (!fixes.length)
196
+ return "No fixes needed.";
197
+ return [(0, term_1.bold)("Fix Commands"), ...fixes.map((f, i) => ` ${i + 1}. ${f}`), ""].join("\n");
198
+ }
@@ -411,9 +411,17 @@ function executeLocal(descriptor, policy, request, label, attestation) {
411
411
  // shell backend runs via /bin/sh -c; node/bun run the command directly
412
412
  // (bun is Node-compatible by default so evidence stays byte-stable with node).
413
413
  // spawnStyle comes from the registered driver, not a hardcoded id check.
414
+ const isTTY = process.stderr.isTTY;
415
+ const shortLabel = command.split("/").pop() || command;
416
+ if (isTTY)
417
+ process.stderr.write(`● Running ${shortLabel}...\n`);
418
+ const startedAt = process.hrtime.bigint();
414
419
  const result = getBackendDriver(descriptor.id)?.spawnStyle === "shell"
415
420
  ? (0, node_child_process_1.spawnSync)([command, ...args].join(" "), { ...options, shell: true })
416
421
  : (0, node_child_process_1.spawnSync)(command, args, { ...options, shell: false });
422
+ const elapsedMs = Number((process.hrtime.bigint() - startedAt) / 1000000n);
423
+ if (isTTY)
424
+ process.stderr.write(`✓ Done (${elapsedMs}ms)\n`);
417
425
  const exitCode = typeof result.status === "number" ? result.status : null;
418
426
  const spawnError = result.error ? (0, util_1.messageOf)(result.error) : undefined;
419
427
  const stdout = String(result.stdout || "");
@@ -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
+ }