cool-workflow 0.1.98 → 0.2.1

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 (315) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/README.md +18 -7
  4. package/apps/architecture-review/app.json +2 -2
  5. package/apps/architecture-review/workflow.js +12 -12
  6. package/apps/architecture-review-fast/app.json +1 -1
  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/cli/dispatch.js +236 -0
  12. package/dist/cli/entry.js +120 -0
  13. package/dist/cli/io.js +21 -4
  14. package/dist/cli/parseargv.js +157 -0
  15. package/dist/cli.js +6 -33
  16. package/dist/core/capability-table.js +3518 -0
  17. package/dist/core/format/help.js +314 -0
  18. package/dist/{state-explosion/format.js → core/format/state-explosion-text.js} +10 -1
  19. package/dist/core/hash.js +137 -0
  20. package/dist/core/multi-agent/candidate-scoring.js +219 -0
  21. package/dist/core/multi-agent/collaboration.js +481 -0
  22. package/dist/core/multi-agent/coordinator.js +515 -0
  23. package/dist/core/multi-agent/eval-replay.js +306 -0
  24. package/dist/core/multi-agent/runtime.js +929 -0
  25. package/dist/core/multi-agent/topology.js +298 -0
  26. package/dist/core/multi-agent/trust-policy.js +197 -0
  27. package/dist/core/pipeline/commit-gate.js +320 -0
  28. package/dist/{pipeline-contract.js → core/pipeline/contract.js} +24 -37
  29. package/dist/core/pipeline/dispatch.js +103 -0
  30. package/dist/core/pipeline/drive-decide.js +227 -0
  31. package/dist/core/pipeline/error-feedback.js +161 -0
  32. package/dist/core/pipeline/loop-expansion.js +124 -0
  33. package/dist/{result-normalize.js → core/pipeline/result-normalize.js} +14 -37
  34. package/dist/core/pipeline/runner.js +230 -0
  35. package/dist/{contract-migration.js → core/state/contract-migration.js} +68 -92
  36. package/dist/{state-migrations.js → core/state/migrations.js} +103 -96
  37. package/dist/core/state/node-projection.js +95 -0
  38. package/dist/core/state/node-snapshot.js +230 -0
  39. package/dist/core/state/run-paths.js +93 -0
  40. package/dist/{schema-validate.js → core/state/schema-validate.js} +35 -28
  41. package/dist/core/state/schema.js +50 -0
  42. package/dist/core/state/state-explosion/digest.js +243 -0
  43. package/dist/core/state/state-explosion/graph.js +527 -0
  44. package/dist/{state-explosion → core/state/state-explosion}/helpers.js +34 -3
  45. package/dist/core/state/state-explosion/report.js +187 -0
  46. package/dist/{state-explosion → core/state/state-explosion}/size.js +25 -7
  47. package/dist/{state-node.js → core/state/state-node.js} +90 -113
  48. package/dist/core/state/types.js +19 -0
  49. package/dist/{validation.js → core/state/validation.js} +64 -131
  50. package/dist/core/trust/evidence-grounding.js +134 -0
  51. package/dist/core/trust/ledger.js +199 -0
  52. package/dist/{telemetry-attestation.js → core/trust/telemetry-attestation.js} +94 -68
  53. package/dist/core/trust/telemetry-ledger.js +127 -0
  54. package/dist/core/types.js +20 -0
  55. package/dist/core/version.js +16 -0
  56. package/dist/{workflow-app-framework.js → core/workflow-apps/app-schema.js} +337 -426
  57. package/dist/mcp/dispatch.js +104 -0
  58. package/dist/mcp/server.js +144 -0
  59. package/dist/mcp-server.js +6 -84
  60. package/dist/{agent-config.js → shell/agent-config.js} +118 -71
  61. package/dist/shell/app-run-cli.js +88 -0
  62. package/dist/shell/audit-cli.js +259 -0
  63. package/dist/shell/audit-provenance.js +83 -0
  64. package/dist/shell/candidate-scoring-io.js +459 -0
  65. package/dist/shell/collaboration-io.js +264 -0
  66. package/dist/shell/commit-summary.js +104 -0
  67. package/dist/shell/commit.js +290 -0
  68. package/dist/shell/coordinator-io.js +476 -0
  69. package/dist/shell/demo-cli.js +19 -0
  70. package/dist/shell/dispatch.js +162 -0
  71. package/dist/shell/doctor.js +292 -0
  72. package/dist/shell/drive.js +885 -0
  73. package/dist/shell/error-feedback-io.js +305 -0
  74. package/dist/shell/eval-io.js +473 -0
  75. package/dist/{multi-agent-eval/format.js → shell/eval-text.js} +78 -49
  76. package/dist/{evidence-reasoning.js → shell/evidence-reasoning.js} +124 -255
  77. package/dist/shell/exec-backend-cli.js +88 -0
  78. package/dist/shell/execution-backend/agent.js +507 -0
  79. package/dist/shell/execution-backend/ci.js +15 -0
  80. package/dist/shell/execution-backend/container.js +69 -0
  81. package/dist/shell/execution-backend/envelopes.js +55 -0
  82. package/dist/shell/execution-backend/local.js +113 -0
  83. package/dist/shell/execution-backend/probes.js +175 -0
  84. package/dist/shell/execution-backend/registry.js +402 -0
  85. package/dist/shell/execution-backend/remote.js +128 -0
  86. package/dist/shell/execution-backend/types.js +11 -0
  87. package/dist/shell/feedback-cli.js +81 -0
  88. package/dist/shell/feedback-operations.js +48 -0
  89. package/dist/shell/fs-atomic.js +276 -0
  90. package/dist/shell/harness.js +98 -0
  91. package/dist/shell/ledger-cli.js +212 -0
  92. package/dist/shell/ledger-io.js +169 -0
  93. package/dist/shell/man-cli.js +89 -0
  94. package/dist/shell/metrics-cli.js +100 -0
  95. package/dist/shell/multi-agent-cli.js +1002 -0
  96. package/dist/shell/multi-agent-host.js +563 -0
  97. package/dist/shell/multi-agent-io.js +387 -0
  98. package/dist/{multi-agent-operator-ux.js → shell/multi-agent-operator-ux.js} +234 -191
  99. package/dist/shell/node-store.js +124 -0
  100. package/dist/{observability/format.js → shell/observability-format.js} +7 -1
  101. package/dist/{observability/intake.js → shell/observability-intake.js} +79 -56
  102. package/dist/{observability.js → shell/observability.js} +159 -332
  103. package/dist/{onramp.js → shell/onramp.js} +11 -0
  104. package/dist/{operator-ux/format.js → shell/operator-ux-text.js} +250 -239
  105. package/dist/shell/operator-ux.js +431 -0
  106. package/dist/shell/orchestrator.js +231 -0
  107. package/dist/shell/pipeline-cli.js +667 -0
  108. package/dist/shell/pipeline.js +217 -0
  109. package/dist/shell/reclamation-io.js +1366 -0
  110. package/dist/shell/registry-cli.js +344 -0
  111. package/dist/{remote-source.js → shell/remote-source.js} +2 -2
  112. package/dist/shell/report-cli.js +101 -0
  113. package/dist/shell/report-view-cli.js +117 -0
  114. package/dist/{orchestrator → shell}/report.js +289 -282
  115. package/dist/shell/reporter.js +62 -0
  116. package/dist/shell/run-export-cli.js +106 -0
  117. package/dist/shell/run-export.js +680 -0
  118. package/dist/shell/run-registry-io.js +1014 -0
  119. package/dist/shell/run-store.js +164 -0
  120. package/dist/{sandbox-profile.js → shell/sandbox-profile.js} +134 -95
  121. package/dist/{scheduler.js → shell/scheduler-io.js} +257 -48
  122. package/dist/shell/scheduling-io.js +321 -0
  123. package/dist/shell/state-cli.js +181 -0
  124. package/dist/shell/state-explosion-cli.js +197 -0
  125. package/dist/shell/telemetry-cli.js +85 -0
  126. package/dist/{telemetry-demo.js → shell/telemetry-demo.js} +149 -119
  127. package/dist/shell/telemetry-ledger-io.js +132 -0
  128. package/dist/{term.js → shell/term.js} +36 -46
  129. package/dist/shell/topology-io.js +361 -0
  130. package/dist/shell/trust-audit.js +472 -0
  131. package/dist/{multi-agent-trust.js → shell/trust-policy-io.js} +67 -205
  132. package/dist/shell/verifier.js +48 -0
  133. package/dist/shell/workbench-host.js +258 -0
  134. package/dist/shell/workbench-text.js +18 -0
  135. package/dist/shell/workbench.js +170 -0
  136. package/dist/shell/worker-cli.js +124 -0
  137. package/dist/shell/worker-isolation.js +852 -0
  138. package/dist/shell/workflow-app-loader.js +650 -0
  139. package/docs/agent-delegation-drive.7.md +4 -0
  140. package/docs/cli-mcp-parity.7.md +282 -219
  141. package/docs/contract-migration-tooling.7.md +4 -0
  142. package/docs/control-plane-scheduling.7.md +4 -0
  143. package/docs/durable-state-and-locking.7.md +4 -0
  144. package/docs/evidence-adoption-reasoning-chain.7.md +4 -0
  145. package/docs/execution-backends.7.md +4 -0
  146. package/docs/multi-agent-cli-mcp-surface.7.md +4 -0
  147. package/docs/multi-agent-eval-replay-harness.7.md +4 -0
  148. package/docs/multi-agent-operator-ux.7.md +4 -0
  149. package/docs/node-snapshot-diff-replay.7.md +4 -0
  150. package/docs/observability-cost-accounting.7.md +6 -1
  151. package/docs/project-index.md +137 -71
  152. package/docs/real-execution-backends.7.md +4 -0
  153. package/docs/release-and-migration.7.md +4 -0
  154. package/docs/release-tooling.7.md +4 -0
  155. package/docs/remote-source-review.7.md +4 -4
  156. package/docs/report-verifiable-bundle.7.md +1 -1
  157. package/docs/run-registry-control-plane.7.md +4 -0
  158. package/docs/run-retention-reclamation.7.md +25 -0
  159. package/docs/security-trust-hardening.7.md +3 -1
  160. package/docs/state-explosion-management.7.md +4 -0
  161. package/docs/team-collaboration.7.md +4 -0
  162. package/docs/web-desktop-workbench.7.md +15 -1
  163. package/manifest/plugin.manifest.json +1 -1
  164. package/manifest/source-context-profiles.json +9 -13
  165. package/package.json +1 -1
  166. package/scripts/agents/agent-adapter-core.js +22 -2
  167. package/scripts/agents/claude-p-agent.js +8 -3
  168. package/scripts/agents/cw-attest-wrap.js +2 -2
  169. package/scripts/agents/gemini-agent.js +5 -1
  170. package/scripts/agents/opencode-agent.js +5 -1
  171. package/scripts/bump-version.js +4 -3
  172. package/scripts/canonical-apps.js +4 -4
  173. package/scripts/dogfood-architecture-review.js +2 -3
  174. package/scripts/dogfood-release.js +3 -3
  175. package/scripts/gen-parity-doc.js +15 -2
  176. package/scripts/golden-path.js +4 -4
  177. package/scripts/onramp-check.js +1 -1
  178. package/scripts/parity-check.js +38 -21
  179. package/scripts/release-flow.js +2 -2
  180. package/scripts/sync-project-index.js +51 -27
  181. package/scripts/validate-run-state-schema.js +2 -2
  182. package/scripts/version-sync-check.js +30 -30
  183. package/dist/candidate-scoring.js +0 -729
  184. package/dist/capability-core.js +0 -1189
  185. package/dist/capability-registry.js +0 -885
  186. package/dist/cli/command-surface.js +0 -494
  187. package/dist/cli/format.js +0 -56
  188. package/dist/cli/handlers/audit.js +0 -82
  189. package/dist/cli/handlers/blackboard.js +0 -81
  190. package/dist/cli/handlers/candidate.js +0 -40
  191. package/dist/cli/handlers/clones.js +0 -34
  192. package/dist/cli/handlers/collaboration.js +0 -61
  193. package/dist/cli/handlers/eval.js +0 -40
  194. package/dist/cli/handlers/ledger.js +0 -169
  195. package/dist/cli/handlers/maintenance.js +0 -107
  196. package/dist/cli/handlers/multi-agent.js +0 -165
  197. package/dist/cli/handlers/node.js +0 -41
  198. package/dist/cli/handlers/operational.js +0 -155
  199. package/dist/cli/handlers/operator.js +0 -146
  200. package/dist/cli/handlers/registry.js +0 -68
  201. package/dist/cli/handlers/run.js +0 -153
  202. package/dist/cli/handlers/scheduling.js +0 -132
  203. package/dist/cli/handlers/workbench.js +0 -41
  204. package/dist/cli/handlers/worker.js +0 -45
  205. package/dist/cli/run-summary.js +0 -45
  206. package/dist/clones.js +0 -162
  207. package/dist/collaboration.js +0 -726
  208. package/dist/commit.js +0 -592
  209. package/dist/compare.js +0 -18
  210. package/dist/coordinator/classify.js +0 -45
  211. package/dist/coordinator/paths.js +0 -42
  212. package/dist/coordinator/util.js +0 -126
  213. package/dist/coordinator.js +0 -990
  214. package/dist/daemon.js +0 -44
  215. package/dist/dispatch.js +0 -250
  216. package/dist/doctor.js +0 -212
  217. package/dist/drive.js +0 -864
  218. package/dist/error-feedback.js +0 -419
  219. package/dist/evidence-grounding.js +0 -184
  220. package/dist/execution-backend/agent.js +0 -354
  221. package/dist/execution-backend/probes.js +0 -112
  222. package/dist/execution-backend/util.js +0 -47
  223. package/dist/execution-backend.js +0 -961
  224. package/dist/gates.js +0 -48
  225. package/dist/harness.js +0 -61
  226. package/dist/ledger.js +0 -313
  227. package/dist/loop-expansion.js +0 -60
  228. package/dist/mcp/tool-call.js +0 -470
  229. package/dist/mcp/tool-definitions.js +0 -1066
  230. package/dist/mcp-surface.js +0 -30
  231. package/dist/multi-agent/graph.js +0 -84
  232. package/dist/multi-agent/helpers.js +0 -141
  233. package/dist/multi-agent/ids.js +0 -20
  234. package/dist/multi-agent/paths.js +0 -22
  235. package/dist/multi-agent-eval/normalize.js +0 -51
  236. package/dist/multi-agent-eval.js +0 -678
  237. package/dist/multi-agent-host.js +0 -777
  238. package/dist/multi-agent.js +0 -984
  239. package/dist/node-projection.js +0 -59
  240. package/dist/node-snapshot.js +0 -260
  241. package/dist/operator-ux.js +0 -631
  242. package/dist/orchestrator/app-operations.js +0 -211
  243. package/dist/orchestrator/audit-operations.js +0 -182
  244. package/dist/orchestrator/candidate-operations.js +0 -117
  245. package/dist/orchestrator/cli-options.js +0 -294
  246. package/dist/orchestrator/collaboration-operations.js +0 -86
  247. package/dist/orchestrator/feedback-operations.js +0 -81
  248. package/dist/orchestrator/host-operations.js +0 -78
  249. package/dist/orchestrator/lifecycle-operations.js +0 -650
  250. package/dist/orchestrator/migration-operations.js +0 -44
  251. package/dist/orchestrator/multi-agent-operations.js +0 -362
  252. package/dist/orchestrator/topology-operations.js +0 -84
  253. package/dist/orchestrator.js +0 -925
  254. package/dist/pipeline-runner.js +0 -285
  255. package/dist/reclamation/hash.js +0 -72
  256. package/dist/reclamation.js +0 -812
  257. package/dist/reporter.js +0 -67
  258. package/dist/run-export.js +0 -815
  259. package/dist/run-registry/derive.js +0 -175
  260. package/dist/run-registry/format.js +0 -124
  261. package/dist/run-registry/gc.js +0 -251
  262. package/dist/run-registry/policy.js +0 -16
  263. package/dist/run-registry/queue.js +0 -115
  264. package/dist/run-registry.js +0 -850
  265. package/dist/run-state-schema.js +0 -68
  266. package/dist/scheduling.js +0 -184
  267. package/dist/state-explosion.js +0 -1014
  268. package/dist/state.js +0 -367
  269. package/dist/telemetry-ledger.js +0 -196
  270. package/dist/topology.js +0 -565
  271. package/dist/triggers.js +0 -184
  272. package/dist/trust-audit.js +0 -644
  273. package/dist/types/blackboard.js +0 -2
  274. package/dist/types/candidate.js +0 -2
  275. package/dist/types/collaboration.js +0 -2
  276. package/dist/types/core.js +0 -2
  277. package/dist/types/drive.js +0 -10
  278. package/dist/types/error-feedback.js +0 -2
  279. package/dist/types/evidence-reasoning.js +0 -2
  280. package/dist/types/execution-backend.js +0 -2
  281. package/dist/types/multi-agent.js +0 -2
  282. package/dist/types/observability.js +0 -2
  283. package/dist/types/pipeline.js +0 -2
  284. package/dist/types/reclamation.js +0 -8
  285. package/dist/types/report-bundle.js +0 -6
  286. package/dist/types/result.js +0 -2
  287. package/dist/types/run-registry.js +0 -2
  288. package/dist/types/run.js +0 -2
  289. package/dist/types/sandbox.js +0 -2
  290. package/dist/types/schedule.js +0 -2
  291. package/dist/types/state-node.js +0 -2
  292. package/dist/types/topology.js +0 -2
  293. package/dist/types/trust.js +0 -2
  294. package/dist/types/workbench.js +0 -2
  295. package/dist/types/worker.js +0 -2
  296. package/dist/types/workflow-app.js +0 -2
  297. package/dist/types.js +0 -44
  298. package/dist/util/fingerprint.js +0 -19
  299. package/dist/util/fingerprint.test.js +0 -27
  300. package/dist/verifier.js +0 -78
  301. package/dist/version.js +0 -8
  302. package/dist/workbench-host.js +0 -192
  303. package/dist/workbench.js +0 -192
  304. package/dist/worker-accept/acceptance.js +0 -114
  305. package/dist/worker-accept/blackboard-fanout.js +0 -80
  306. package/dist/worker-accept/blackboard-linkage.js +0 -19
  307. package/dist/worker-accept/context.js +0 -2
  308. package/dist/worker-accept/telemetry-ledger.js +0 -126
  309. package/dist/worker-accept/validation.js +0 -77
  310. package/dist/worker-accept/verifier-completion.js +0 -73
  311. package/dist/worker-isolation/helpers.js +0 -51
  312. package/dist/worker-isolation/paths.js +0 -46
  313. package/dist/worker-isolation.js +0 -656
  314. package/dist/workflow-api.js +0 -131
  315. /package/dist/{types → core/types}/boundary.js +0 -0
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ // shell/onramp.ts — the change-contract onramp subsystem.
3
+ //
4
+ // Byte-exact port of the old flat build's src/onramp.ts (added in #198):
5
+ // evaluateOnrampContract, recommendSmokeTests, resolveChangedFiles,
6
+ // buildDoctorOnramp. Impure (git/fs reads), so it lives under shell/.
7
+ // The v2 rebuild dropped this module on purpose for a later milestone;
8
+ // this restores it and shell/doctor.ts wires --onramp back to it.
9
+ //
10
+ // The classification in evaluateOnrampContract works on path STRINGS only
11
+ // (it never stats files), so the old flat paths the smoke passes still
12
+ // classify correctly even though the real files moved under src/shell etc.
2
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
15
  };
@@ -1,191 +1,166 @@
1
1
  "use strict";
2
+ // shell/operator-ux-text.ts — human-readable rendering for the operator
3
+ // console surface (`cw status`, `cw graph`, `cw operator status|report|
4
+ // graph`). Lives in shell/ (not core/format/) because it calls term.ts's
5
+ // `dim()`, which is TTY/env-aware.
6
+ //
7
+ // MILESTONE 11 (reporting/observability). Byte-exact port of the parts of
8
+ // the old build's src/operator-ux/format.ts this milestone's conformance
9
+ // surface exercises: formatOperatorSummary (`--summary`/`--brief`),
10
+ // formatOperatorStatus (full `cw status`), formatOperatorReport (`cw
11
+ // report --show`), formatOperatorGraph (`cw graph`).
12
+ //
13
+ // Evidence: SPEC/reporting-ux.md "Operator UX human text";
14
+ // plugins/cool-workflow/src/operator-ux/format.ts:1-132 (byte-exact
15
+ // source for the ported pieces).
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.formatOperatorStatus = formatOperatorStatus;
4
17
  exports.formatOperatorSummary = formatOperatorSummary;
18
+ exports.formatMultiAgentTrustAudit = formatMultiAgentTrustAudit;
19
+ exports.formatMultiAgentSummaryText = formatMultiAgentSummaryText;
20
+ exports.formatOperatorStatus = formatOperatorStatus;
5
21
  exports.formatOperatorReport = formatOperatorReport;
6
22
  exports.formatOperatorGraph = formatOperatorGraph;
7
- exports.formatWorkerSummary = formatWorkerSummary;
8
- exports.formatCandidateSummary = formatCandidateSummary;
9
- exports.formatFeedbackSummary = formatFeedbackSummary;
10
- exports.formatCommitSummary = formatCommitSummary;
11
- exports.formatMultiAgentSummary = formatMultiAgentSummary;
12
- exports.formatTopologySummary = formatTopologySummary;
13
- exports.formatMultiAgentTrustAudit = formatMultiAgentTrustAudit;
14
- const multi_agent_operator_ux_1 = require("../multi-agent-operator-ux");
15
- const term_1 = require("../term");
16
- function formatOperatorStatus(summary) {
17
- return [
18
- formatOperatorSummary(summary),
19
- "",
20
- formatWorkerPanel(summary.workers),
21
- "",
22
- formatCandidatePanel(summary.candidates),
23
- "",
24
- formatFeedbackPanel(summary.feedback),
25
- "",
26
- formatCommitPanel(summary.commits),
27
- "",
28
- formatTopologyPanel(summary.topologies),
29
- "",
30
- formatMultiAgentPanel(summary.multiAgent),
31
- "",
32
- "Multi-Agent Operator UX",
33
- ` active=${operator(summary).activeMultiAgentRunIds.join(", ") || "none"}; topologies=${operator(summary).topologyRunIds.join(", ") || "none"}; blocked=${operator(summary).blocked ? "yes" : "no"}`,
34
- ` dependencies=${operator(summary).dependencies.length}; failures=${operator(summary).failures.length}; adoptedEvidence=${operator(summary).adoptedEvidence.length}; missingEvidence=${operator(summary).missingEvidence.length}${operator(summary).inspectableEvidence.length ? ` (inspectable=${operator(summary).inspectableEvidence.length})` : ""}`,
35
- ` next=${operator(summary).nextAction}`,
36
- "",
37
- formatBlackboardPanel(summary.blackboard),
38
- "",
39
- formatTrustPanel(summary.trust),
40
- "",
41
- formatMultiAgentTrustAudit(summary.multiAgentTrust),
42
- "",
43
- `Report: ${summary.reportPath}`
44
- ].join("\n");
23
+ exports.formatCandidateSummaryText = formatCandidateSummaryText;
24
+ exports.formatFeedbackSummaryText = formatFeedbackSummaryText;
25
+ const term_1 = require("./term");
26
+ const multi_agent_operator_ux_1 = require("./multi-agent-operator-ux");
27
+ function formatCounts(counts) {
28
+ const entries = Object.entries(counts).sort(([a], [b]) => a.localeCompare(b));
29
+ if (!entries.length)
30
+ return "none";
31
+ return entries.map(([k, v]) => `${k}=${v}`).join(", ");
32
+ }
33
+ function formatRecommendations(actions) {
34
+ if (!actions.length)
35
+ return [" none"];
36
+ const lines = [];
37
+ for (const action of actions) {
38
+ lines.push(` ${action.command}`);
39
+ lines.push(` reason: ${action.reason}`);
40
+ }
41
+ return lines;
45
42
  }
46
- function operator(summary) { return summary.multiAgentOperator; }
47
- /** Compact summary — the default `cw status` output. `cw status --verbose` shows the full panel. */
43
+ /** Compact summary `cw status <id> --summary`/`--brief`. Byte-exact
44
+ * port of formatOperatorSummary. */
48
45
  function formatOperatorSummary(summary) {
49
46
  return [
50
47
  `Run: ${summary.runId}`,
51
48
  `Workflow: ${summary.workflowId}${summary.appId ? ` (${summary.appId}@${summary.appVersion || "unknown"})` : ""}`,
52
49
  `Phase: ${summary.activePhase || "none"} | Stage: ${summary.loopStage} | Blocked: ${summary.blocked ? summary.blockedReasons.join("; ") : "no"}`,
53
50
  `Tasks: ${formatCounts(summary.tasks.byStatus)}; total=${summary.tasks.total}`,
54
- ...summary.phases.map((phase) => ` ${phase.name}: ${phase.status} (${phase.tasks.completed}/${phase.tasks.total} completed)`),
51
+ ...summary.phases.map((phase) => ` ${phase.name}: ${phase.status} (${phase.tasks.completed || 0}/${phase.tasks.total} completed)`),
55
52
  "",
56
53
  "Next Action",
57
54
  ...formatRecommendations(summary.nextActions),
58
55
  "",
59
- (0, term_1.dim)(`(use --verbose for full worker/candidate/feedback/commit/trust panels)`)
60
- ].join("\n");
61
- }
62
- function formatOperatorReport(summary) {
63
- return [
64
- formatOperatorStatus(summary),
65
- "",
66
- "Active and Pending Tasks",
67
- ...formatTaskList(summary.tasks),
68
- "",
69
- "Evidence",
70
- ...(summary.evidencePaths.length ? summary.evidencePaths.map((entry) => ` ${entry}`) : [" none recorded"]),
71
- "",
72
- (0, multi_agent_operator_ux_1.formatMultiAgentDependencies)(summary.multiAgentOperator.dependencies),
73
- "",
74
- (0, multi_agent_operator_ux_1.formatMultiAgentFailures)(summary.multiAgentOperator.failures),
75
- "",
76
- (0, multi_agent_operator_ux_1.formatMultiAgentEvidence)(summary.multiAgentOperator.evidence),
77
- "",
78
- "Resource Commands",
79
- ` node scripts/cw.js graph ${summary.runId}`,
80
- ` node scripts/cw.js worker summary ${summary.runId}`,
81
- ` node scripts/cw.js topology summary ${summary.runId}`,
82
- ` node scripts/cw.js topology graph ${summary.runId}`,
83
- ` node scripts/cw.js multi-agent summary ${summary.runId}`,
84
- ` node scripts/cw.js multi-agent graph ${summary.runId}`,
85
- ` node scripts/cw.js multi-agent dependencies ${summary.runId}`,
86
- ` node scripts/cw.js multi-agent failures ${summary.runId}`,
87
- ` node scripts/cw.js multi-agent evidence ${summary.runId}`,
88
- ` node scripts/cw.js blackboard summary ${summary.runId}`,
89
- ` node scripts/cw.js blackboard graph ${summary.runId}`,
90
- ` node scripts/cw.js coordinator summary ${summary.runId}`,
91
- ` node scripts/cw.js candidate summary ${summary.runId}`,
92
- ` node scripts/cw.js feedback summary ${summary.runId}`,
93
- ` node scripts/cw.js commit summary ${summary.runId}`,
94
- ` node scripts/cw.js audit summary ${summary.runId}`,
95
- ` node scripts/cw.js audit provenance ${summary.runId}`,
96
- ` node scripts/cw.js audit multi-agent ${summary.runId}`,
97
- ` node scripts/cw.js audit policy ${summary.runId}`,
98
- ` node scripts/cw.js audit blackboard ${summary.runId}`,
99
- ` node scripts/cw.js audit judge ${summary.runId}`
56
+ (0, term_1.dim)("(use --verbose for full worker/candidate/feedback/commit/trust panels)"),
100
57
  ].join("\n");
101
58
  }
102
- function formatOperatorGraph(graph) {
103
- const lines = [`Run Graph: ${graph.runId}`, "", "Nodes"];
104
- const groups = groupBy(graph.nodes, (node) => node.kind);
105
- for (const kind of Object.keys(groups).sort()) {
106
- lines.push(` ${kind}`);
107
- for (const node of groups[kind]) {
108
- const suffix = node.path ? ` -> ${node.path}` : "";
109
- lines.push(` [${node.status}] ${node.id} (${node.label})${suffix}`);
110
- }
111
- }
112
- lines.push("", "Edges");
113
- if (!graph.edges.length)
114
- lines.push(" none");
115
- for (const edge of graph.edges) {
116
- lines.push(` ${edge.from} -> ${edge.to}${edge.label ? ` (${edge.label})` : ""}`);
117
- }
59
+ function formatWorkerPanel(summary) {
60
+ const lines = ["Workers", ` Total: ${summary.total}`, ` By status: ${formatCounts(summary.byStatus)}`];
61
+ for (const worker of summary.workers)
62
+ lines.push(` - ${worker.id} (${worker.status}) task=${worker.taskId}`);
118
63
  return lines.join("\n");
119
64
  }
120
- function formatWorkerSummary(summary) {
121
- return formatWorkerPanel(summary);
122
- }
123
- function formatCandidateSummary(summary) {
124
- return formatCandidatePanel(summary);
125
- }
126
- function formatFeedbackSummary(summary) {
127
- return formatFeedbackPanel(summary);
65
+ function formatCandidatePanel(summary) {
66
+ return [
67
+ "Candidates",
68
+ ` Total: ${summary.total}`,
69
+ ` By status: ${formatCounts(summary.byStatus)}`,
70
+ ` By kind: ${formatCounts(summary.byKind)}`,
71
+ ` Selections: ${summary.selections}`,
72
+ ` ready for commit=${summary.readyForCommit.map((item) => `${item.candidateId}/${item.selectionId}`).join(", ") || "none"}`,
73
+ ].join("\n");
128
74
  }
129
- function formatCommitSummary(summary) {
130
- return formatCommitPanel(summary);
75
+ function formatFeedbackPanel(summary) {
76
+ return ["Feedback", ` Total: ${summary.total}`, ` By status: ${formatCounts(summary.byStatus)}`, ` By severity: ${formatCounts(summary.bySeverity)}`].join("\n");
131
77
  }
132
- function formatTrustPanel(summary) {
78
+ function formatCommitPanel(summary) {
133
79
  const lines = [
134
- "Trust Audit",
135
- ` total=${summary.eventCount}; decision=${formatCounts(summary.byDecision)}; source=${formatCounts(summary.bySource)}`,
136
- ` sandbox=${formatCounts(summary.bySandboxProfile)}`,
137
- ` multi-agent trust=${summary.multiAgentTrust ? formatCounts(summary.multiAgentTrust) : "none"}`,
138
- ` events=${summary.eventLogPath}`,
139
- ` summary=${summary.summaryPath}`
80
+ "Commits",
81
+ ` total=${summary.total}; verifier-gated=${summary.verifierGated}; checkpoints=${summary.checkpoints}`,
140
82
  ];
141
- for (const worker of summary.workers.slice(0, 6)) {
142
- lines.push(` worker ${worker.workerId}: sandbox=${worker.sandboxProfileId || "none"}, decisions=${formatCounts(worker.decisions)}, denied=${worker.denied}`);
143
- }
83
+ for (const commit of summary.commits)
84
+ lines.push(` - ${commit.id}: ${commit.reason}`);
144
85
  return lines.join("\n");
145
86
  }
146
- function formatMultiAgentSummary(summary) {
147
- return formatMultiAgentPanel(summary);
87
+ function formatTrustPanel(summary) {
88
+ return [
89
+ "Trust Audit",
90
+ ` Events: ${summary.eventCount}`,
91
+ ` Chain integrity: ${summary.integrity.verified ? "verified" : "FAILED"}`,
92
+ ].join("\n");
93
+ }
94
+ function arrayView(value) {
95
+ return Array.isArray(value) ? value : [];
96
+ }
97
+ function formatRolePolicyRows(rows) {
98
+ if (!rows.length)
99
+ return [" none"];
100
+ return rows.slice(0, 40).map((row) => {
101
+ const writes = Array.isArray(row.allowedWriteOperations) ? row.allowedWriteOperations.join(",") : "none";
102
+ const candidates = Array.isArray(row.allowedCandidateOperations) ? row.allowedCandidateOperations.join(",") : "none";
103
+ const judges = Array.isArray(row.allowedJudgeOperations) ? row.allowedJudgeOperations.join(",") : "none";
104
+ const topics = Array.isArray(row.allowedBlackboardTopicIds) ? row.allowedBlackboardTopicIds.join(",") : "none";
105
+ return ` ${String(row.policyRef || row.id || row.subjectId)} subject=${String(row.subjectKind || "unknown")}:${String(row.subjectId || "unknown")} topics=${topics} writes=${writes} candidates=${candidates} judges=${judges}`;
106
+ });
148
107
  }
149
- function formatTopologySummary(summary) {
150
- return formatTopologyPanel(summary);
108
+ function formatAuditEventRows(rows) {
109
+ if (!rows.length)
110
+ return [" none"];
111
+ return rows.slice(0, 60).map((row) => {
112
+ const metadata = row.metadata && typeof row.metadata === "object" ? row.metadata : {};
113
+ const ids = [
114
+ row.agentRoleId ? `role=${row.agentRoleId}` : "",
115
+ row.agentMembershipId ? `membership=${row.agentMembershipId}` : "",
116
+ row.blackboardMessageId ? `message=${row.blackboardMessageId}` : "",
117
+ row.blackboardContextId ? `context=${row.blackboardContextId}` : "",
118
+ row.blackboardArtifactRefId ? `artifact=${row.blackboardArtifactRefId}` : "",
119
+ row.coordinatorDecisionId ? `decision=${row.coordinatorDecisionId}` : "",
120
+ row.candidateId ? `candidate=${row.candidateId}` : "",
121
+ row.scoreId ? `score=${row.scoreId}` : "",
122
+ row.selectionId ? `selection=${row.selectionId}` : "",
123
+ ].filter(Boolean).join(" ");
124
+ const reason = metadata.reason ? ` reason=${String(metadata.reason)}` : "";
125
+ const operation = metadata.operation ? ` operation=${String(metadata.operation)}` : "";
126
+ return ` [${String(row.decision || "recorded")}] ${String(row.kind || "event")} ${String(row.id || "")}${operation}${ids ? ` ${ids}` : ""}${row.policyRef ? ` policy=${String(row.policyRef)}` : ""}${reason}`;
127
+ });
151
128
  }
129
+ /** `cw audit multi-agent|policy|role|blackboard|judge` human render — port
130
+ * of the old build's formatMultiAgentTrustAudit (operator-ux/format.ts). */
152
131
  function formatMultiAgentTrustAudit(view) {
153
- const rolePolicies = arrayView(view.rolePolicies);
154
- const permissionDecisions = arrayView(view.permissionDecisions);
155
- const blackboardWrites = arrayView(view.blackboardWrites);
156
- const messageProvenance = arrayView(view.messageProvenance);
157
- const judgeRationales = arrayView(view.judgeRationales);
158
- const panelDecisions = arrayView(view.panelDecisions);
159
- const policyViolations = arrayView(view.policyViolations);
160
132
  return [
161
133
  `Multi-Agent Trust: ${String(view.runId || "unknown")}`,
162
134
  "",
163
135
  "Role Policies",
164
- ...formatRolePolicyRows(rolePolicies),
136
+ ...formatRolePolicyRows(arrayView(view.rolePolicies)),
165
137
  "",
166
138
  "Permission Decisions",
167
- ...formatAuditRows(permissionDecisions),
139
+ ...formatAuditEventRows(arrayView(view.permissionDecisions)),
168
140
  "",
169
141
  "Blackboard Write Audit",
170
- ...formatAuditRows(blackboardWrites),
142
+ ...formatAuditEventRows(arrayView(view.blackboardWrites)),
171
143
  "",
172
144
  "Message Provenance",
173
- ...formatAuditRows(messageProvenance),
145
+ ...formatAuditEventRows(arrayView(view.messageProvenance)),
174
146
  "",
175
147
  "Judge Rationales",
176
- ...formatAuditRows([...judgeRationales, ...panelDecisions]),
148
+ ...formatAuditEventRows([...arrayView(view.judgeRationales), ...arrayView(view.panelDecisions)]),
177
149
  "",
178
150
  "Policy Violations",
179
- ...formatAuditRows(policyViolations),
151
+ ...formatAuditEventRows(arrayView(view.policyViolations)),
180
152
  "",
181
153
  "Next Action",
182
- ` ${String(view.nextAction || `node scripts/cw.js audit multi-agent ${String(view.runId || "<run-id>")} --json`)}`
154
+ ` ${String(view.nextAction || `node scripts/cw.js audit multi-agent ${String(view.runId || "<run-id>")} --json`)}`,
183
155
  ].join("\n");
184
156
  }
157
+ /** `Topologies` panel — port of the old build's formatTopologyPanel
158
+ * (operator-ux/format.ts): the topology-run rollup with per-run roles/
159
+ * topics/fanout/fanin/readiness. */
185
160
  function formatTopologyPanel(summary) {
186
161
  const lines = [
187
162
  "Topologies",
188
- ` runs=${summary.totalRuns}; status=${formatCounts(summary.runsByStatus)}; official=${summary.officialTopologies.join(", ")}`
163
+ ` runs=${summary.totalRuns}; status=${formatCounts(summary.runsByStatus)}; official=${summary.officialTopologies.join(", ")}`,
189
164
  ];
190
165
  for (const record of summary.active.slice(0, 6)) {
191
166
  lines.push(` ${record.id}: ${record.topologyId}, status=${record.status}, readiness=${record.readiness}`);
@@ -203,13 +178,16 @@ function formatTopologyPanel(summary) {
203
178
  lines.push(` next=${summary.nextAction}`);
204
179
  return lines.join("\n");
205
180
  }
181
+ /** `Multi-Agent` panel — port of the old build's formatMultiAgentPanel
182
+ * (operator-ux/format.ts): the run/role/group/membership/fanout/fanin
183
+ * rollup with per-group role coverage and blocked reasons. */
206
184
  function formatMultiAgentPanel(summary) {
207
185
  const lines = [
208
186
  "Multi-Agent",
209
187
  ` runs=${summary.totalRuns}; status=${formatCounts(summary.runsByStatus)}`,
210
188
  ` roles=${summary.roles}; groups=${summary.groups} (${formatCounts(summary.groupsByStatus)})`,
211
189
  ` memberships=${summary.memberships} (${formatCounts(summary.membershipsByStatus)})`,
212
- ` fanouts=${summary.fanouts}; fanins=${summary.fanins} (${formatCounts(summary.faninsByStatus)})`
190
+ ` fanouts=${summary.fanouts}; fanins=${summary.fanins} (${formatCounts(summary.faninsByStatus)})`,
213
191
  ];
214
192
  for (const group of summary.groupsDetail.slice(0, 6)) {
215
193
  lines.push(` group ${group.id}: ${group.status}, phase=${group.phase || "none"}, run=${group.multiAgentRunId}`);
@@ -224,6 +202,25 @@ function formatMultiAgentPanel(summary) {
224
202
  lines.push(` next=${summary.nextAction}`);
225
203
  return lines.join("\n");
226
204
  }
205
+ /** `cw multi-agent summary <run>` human text — the same `Multi-Agent`
206
+ * panel `cw status` shows, port of the old build's formatMultiAgentSummary
207
+ * (operator-ux/format.ts). */
208
+ function formatMultiAgentSummaryText(summary) {
209
+ return formatMultiAgentPanel(summary);
210
+ }
211
+ /** `Multi-Agent Operator UX` block — port of the old build's inline
212
+ * operator-status summary (operator-ux/format.ts:41-45): active runs,
213
+ * dependency/failure/evidence counts, and the next command. */
214
+ function formatMultiAgentOperatorBlock(operator) {
215
+ return [
216
+ "Multi-Agent Operator UX",
217
+ ` active=${operator.activeMultiAgentRunIds.join(", ") || "none"}; topologies=${operator.topologyRunIds.join(", ") || "none"}; blocked=${operator.blocked ? "yes" : "no"}`,
218
+ ` dependencies=${operator.dependencies.length}; failures=${operator.failures.length}; adoptedEvidence=${operator.adoptedEvidence.length}; missingEvidence=${operator.missingEvidence.length}${operator.inspectableEvidence.length ? ` (inspectable=${operator.inspectableEvidence.length})` : ""}`,
219
+ ` next=${operator.nextAction}`,
220
+ ].join("\n");
221
+ }
222
+ /** `Blackboard / Coordinator` panel — port of the old build's
223
+ * formatBlackboardPanel (operator-ux/format.ts). */
227
224
  function formatBlackboardPanel(summary) {
228
225
  const lines = [
229
226
  "Blackboard / Coordinator",
@@ -231,7 +228,7 @@ function formatBlackboardPanel(summary) {
231
228
  ` open questions=${summary.openQuestions.length}; conflicts=${summary.conflicts.length}; missing evidence=${summary.missingEvidence.length}`,
232
229
  ` ready for fanin=${summary.readyForFanin ? "yes" : "no"}`,
233
230
  ` index=${summary.indexPath || "none"}`,
234
- ` latest snapshot=${summary.latestSnapshotPath || "none"}`
231
+ ` latest snapshot=${summary.latestSnapshotPath || "none"}`,
235
232
  ];
236
233
  for (const question of summary.openQuestions.slice(0, 5))
237
234
  lines.push(` question ${question.id}: ${question.value}`);
@@ -243,65 +240,124 @@ function formatBlackboardPanel(summary) {
243
240
  lines.push(` next=${summary.nextAction}`);
244
241
  return lines.join("\n");
245
242
  }
246
- function arrayView(value) {
247
- return Array.isArray(value) ? value : [];
243
+ /** The full `cw status <id>` human render — port of formatOperatorStatus's
244
+ * panel order (worker/candidate/feedback/commit, then the
245
+ * multi-agent/operator-ux/blackboard sub-panels the operator-ux smokes
246
+ * pin, then trust and the report path). */
247
+ function formatOperatorStatus(summary) {
248
+ return [
249
+ formatOperatorSummary(summary),
250
+ "",
251
+ formatWorkerPanel(summary.workers),
252
+ "",
253
+ formatCandidatePanel(summary.candidates),
254
+ "",
255
+ formatFeedbackPanel(summary.feedback),
256
+ "",
257
+ formatCommitPanel(summary.commits),
258
+ "",
259
+ formatTopologyPanel(summary.multiAgentOperator.summaries.topologies),
260
+ "",
261
+ formatMultiAgentPanel(summary.multiAgent),
262
+ "",
263
+ formatMultiAgentOperatorBlock(summary.multiAgentOperator),
264
+ "",
265
+ formatBlackboardPanel(summary.blackboard),
266
+ "",
267
+ formatTrustPanel(summary.trust),
268
+ "",
269
+ formatMultiAgentTrustAudit(summary.multiAgentTrust),
270
+ "",
271
+ `Report: ${summary.reportPath}`,
272
+ ].join("\n");
248
273
  }
249
- function formatRolePolicyRows(rows) {
250
- if (!rows.length)
274
+ function formatTaskList(tasks) {
275
+ const active = [...tasks.running, ...tasks.pending];
276
+ if (!active.length)
251
277
  return [" none"];
252
- return rows.slice(0, 40).map((row) => {
253
- const writes = Array.isArray(row.allowedWriteOperations) ? row.allowedWriteOperations.join(",") : "none";
254
- const candidates = Array.isArray(row.allowedCandidateOperations) ? row.allowedCandidateOperations.join(",") : "none";
255
- const judges = Array.isArray(row.allowedJudgeOperations) ? row.allowedJudgeOperations.join(",") : "none";
256
- const topics = Array.isArray(row.allowedBlackboardTopicIds) ? row.allowedBlackboardTopicIds.join(",") : "none";
257
- return ` ${String(row.policyRef || row.id || row.subjectId)} subject=${String(row.subjectKind || "unknown")}:${String(row.subjectId || "unknown")} topics=${topics} writes=${writes} candidates=${candidates} judges=${judges}`;
258
- });
278
+ return active.map((id) => ` ${id}`);
259
279
  }
260
- function formatAuditRows(rows) {
261
- if (!rows.length)
262
- return [" none"];
263
- return rows.slice(0, 60).map((row) => {
264
- const metadata = row.metadata && typeof row.metadata === "object" ? row.metadata : {};
265
- const ids = [
266
- row.agentRoleId ? `role=${row.agentRoleId}` : "",
267
- row.agentMembershipId ? `membership=${row.agentMembershipId}` : "",
268
- row.blackboardMessageId ? `message=${row.blackboardMessageId}` : "",
269
- row.blackboardContextId ? `context=${row.blackboardContextId}` : "",
270
- row.blackboardArtifactRefId ? `artifact=${row.blackboardArtifactRefId}` : "",
271
- row.coordinatorDecisionId ? `decision=${row.coordinatorDecisionId}` : "",
272
- row.candidateId ? `candidate=${row.candidateId}` : "",
273
- row.scoreId ? `score=${row.scoreId}` : "",
274
- row.selectionId ? `selection=${row.selectionId}` : ""
275
- ].filter(Boolean).join(" ");
276
- const reason = metadata.reason ? ` reason=${String(metadata.reason)}` : "";
277
- const operation = metadata.operation ? ` operation=${String(metadata.operation)}` : "";
278
- return ` [${String(row.decision || "recorded")}] ${String(row.kind || "event")} ${String(row.id || "")}${operation}${ids ? ` ${ids}` : ""}${row.policyRef ? ` policy=${String(row.policyRef)}` : ""}${reason}`;
279
- });
280
+ /** `cw report <id> --show` — byte-exact port of formatOperatorReport's
281
+ * fixed 18-line Resource Commands tail plus Active/Pending Tasks and
282
+ * Evidence sections (multi-agent dependency/failure/evidence panels are
283
+ * scoped out of this milestone's port per the file header note). */
284
+ function formatOperatorReport(summary, evidencePaths) {
285
+ return [
286
+ formatOperatorStatus(summary),
287
+ "",
288
+ "Active and Pending Tasks",
289
+ ...formatTaskList(summary.tasks),
290
+ "",
291
+ "Evidence",
292
+ ...(evidencePaths.length ? evidencePaths.map((entry) => ` ${entry}`) : [" none recorded"]),
293
+ "",
294
+ (0, multi_agent_operator_ux_1.formatMultiAgentDependencies)(summary.multiAgentOperator.dependencies),
295
+ "",
296
+ (0, multi_agent_operator_ux_1.formatMultiAgentFailures)(summary.multiAgentOperator.failures),
297
+ "",
298
+ (0, multi_agent_operator_ux_1.formatMultiAgentEvidence)(summary.multiAgentOperator.evidence),
299
+ "",
300
+ "Resource Commands",
301
+ ` node scripts/cw.js graph ${summary.runId}`,
302
+ ` node scripts/cw.js worker summary ${summary.runId}`,
303
+ ` node scripts/cw.js topology summary ${summary.runId}`,
304
+ ` node scripts/cw.js topology graph ${summary.runId}`,
305
+ ` node scripts/cw.js multi-agent summary ${summary.runId}`,
306
+ ` node scripts/cw.js multi-agent graph ${summary.runId}`,
307
+ ` node scripts/cw.js multi-agent dependencies ${summary.runId}`,
308
+ ` node scripts/cw.js multi-agent failures ${summary.runId}`,
309
+ ` node scripts/cw.js multi-agent evidence ${summary.runId}`,
310
+ ` node scripts/cw.js blackboard summary ${summary.runId}`,
311
+ ` node scripts/cw.js blackboard graph ${summary.runId}`,
312
+ ` node scripts/cw.js coordinator summary ${summary.runId}`,
313
+ ` node scripts/cw.js candidate summary ${summary.runId}`,
314
+ ` node scripts/cw.js feedback summary ${summary.runId}`,
315
+ ` node scripts/cw.js commit summary ${summary.runId}`,
316
+ ` node scripts/cw.js audit summary ${summary.runId}`,
317
+ ` node scripts/cw.js audit provenance ${summary.runId}`,
318
+ ` node scripts/cw.js audit multi-agent ${summary.runId}`,
319
+ ` node scripts/cw.js audit policy ${summary.runId}`,
320
+ ` node scripts/cw.js audit blackboard ${summary.runId}`,
321
+ ` node scripts/cw.js audit judge ${summary.runId}`,
322
+ ].join("\n");
280
323
  }
281
- function formatWorkerPanel(summary) {
282
- const lines = [
283
- "Workers",
284
- ` total=${summary.total}; status=${formatCounts(summary.byStatus)}; sandbox=${formatCounts(summary.bySandboxProfile)}; backend=${formatCounts(summary.byBackend)}`
285
- ];
286
- for (const worker of summary.workers.slice(0, 8)) {
287
- const attestation = worker.backendAttestationStatus ? `/${worker.backendAttestationStatus}` : "";
288
- lines.push(` ${worker.id}: ${worker.status}, task=${worker.taskId}, sandbox=${worker.sandboxProfileId || "none"}, backend=${worker.backendId || "none"}${attestation}`);
289
- lines.push(` manifest=${worker.manifestPath}`);
290
- lines.push(` result=${worker.resultPath}`);
291
- if (worker.feedbackIds.length)
292
- lines.push(` feedback=${worker.feedbackIds.join(", ")}`);
324
+ function groupBy(values, key) {
325
+ const groups = {};
326
+ for (const value of values) {
327
+ const bucket = key(value);
328
+ (groups[bucket] ||= []).push(value);
329
+ }
330
+ return groups;
331
+ }
332
+ /** `cw graph <id>` human render — byte-exact port of formatOperatorGraph. */
333
+ function formatOperatorGraph(graph) {
334
+ const lines = [`Run Graph: ${graph.runId}`, "", "Nodes"];
335
+ const groups = groupBy(graph.nodes, (node) => node.kind);
336
+ for (const kind of Object.keys(groups).sort()) {
337
+ lines.push(` ${kind}`);
338
+ for (const node of groups[kind]) {
339
+ const suffix = node.path ? ` -> ${node.path}` : "";
340
+ lines.push(` [${node.status}] ${node.id} (${node.label})${suffix}`);
341
+ }
342
+ }
343
+ lines.push("", "Edges");
344
+ if (!graph.edges.length)
345
+ lines.push(" none");
346
+ for (const edge of graph.edges) {
347
+ lines.push(` ${edge.from} -> ${edge.to}${edge.label ? ` (${edge.label})` : ""}`);
293
348
  }
294
- if (summary.workers.length > 8)
295
- lines.push(` ... ${summary.workers.length - 8} more worker(s)`);
296
349
  return lines.join("\n");
297
350
  }
298
- function formatCandidatePanel(summary) {
351
+ /** `cw candidate summary <run>` human text — port of the old build's
352
+ * formatCandidatePanel (operator-ux/format.ts): a `Candidates` rollup with
353
+ * status/kind counts, the latest ranking, and the ready-for-commit list. */
354
+ function formatCandidateSummaryText(summary) {
299
355
  const lines = [
300
356
  "Candidates",
301
357
  ` total=${summary.total}; status=${formatCounts(summary.byStatus)}; kind=${formatCounts(summary.byKind)}`,
302
- ` latest ranking=${summary.latestRankingPath || "none"}`,
358
+ ` latest ranking=${summary.latestRankingPath || summary.rankingPath || "none"}`,
303
359
  ` selected=${summary.selected.map((selection) => `${selection.candidateId}/${selection.selectionId}`).join(", ") || "none"}`,
304
- ` ready for commit=${summary.readyForCommit.map((item) => `${item.candidateId}/${item.selectionId}`).join(", ") || "none"}`
360
+ ` ready for commit=${summary.readyForCommit.map((item) => `${item.candidateId}/${item.selectionId}`).join(", ") || "none"}`,
305
361
  ];
306
362
  for (const problem of summary.problems.slice(0, 5))
307
363
  lines.push(` problem: ${problem}`);
@@ -312,59 +368,14 @@ function formatCandidatePanel(summary) {
312
368
  lines.push(` ... ${summary.candidates.length - 8} more candidate(s)`);
313
369
  return lines.join("\n");
314
370
  }
315
- function formatFeedbackPanel(summary) {
316
- const lines = [
371
+ /** `cw feedback summary <run>` human text — port of the old build's
372
+ * formatFeedbackPanel (operator-ux/format.ts): a `Feedback` rollup with
373
+ * status/severity/classification counts. */
374
+ function formatFeedbackSummaryText(summary) {
375
+ return [
317
376
  "Feedback",
318
377
  ` total=${summary.total}; status=${formatCounts(summary.byStatus)}`,
319
378
  ` severity=${formatCounts(summary.bySeverity)}`,
320
379
  ` classification=${formatCounts(summary.byClassification)}`,
321
- ` retryable=${summary.retryable}; nonRetryable=${summary.nonRetryable}`
322
- ];
323
- for (const record of summary.open.slice(0, 6)) {
324
- lines.push(` ${record.id}: ${record.severity}/${record.classification}, retryable=${record.retryable ? "yes" : "no"}`);
325
- lines.push(` ${record.message}`);
326
- }
327
- return lines.join("\n");
328
- }
329
- function formatCommitPanel(summary) {
330
- const lines = [
331
- "Commits",
332
- ` total=${summary.total}; verifier-gated=${summary.verifierGated}; checkpoints=${summary.checkpoints}`,
333
- ` latest=${summary.latest ? `${summary.latest.id} (${summary.latest.kind}) ${summary.latest.snapshotPath}` : "none"}`
334
- ];
335
- for (const commit of summary.commits.slice(-8)) {
336
- lines.push(` ${commit.id}: ${commit.kind}, reason=${commit.reason}`);
337
- lines.push(` verifier=${commit.verifierNodeId || "none"} candidate=${commit.candidateId || "none"} selection=${commit.selectionId || "none"} evidence=${commit.evidenceCount}`);
338
- lines.push(` snapshot=${commit.snapshotPath}`);
339
- }
340
- return lines.join("\n");
341
- }
342
- function formatTaskList(summary) {
343
- const lines = [];
344
- for (const [label, values] of [
345
- ["pending", summary.pending],
346
- ["running", summary.running],
347
- ["failed", summary.failed]
348
- ]) {
349
- lines.push(` ${label}: ${values.length ? values.join(", ") : "none"}`);
350
- }
351
- return lines;
352
- }
353
- function formatRecommendations(actions) {
354
- return actions.length ? actions.map((action) => ` ${action.command}\n reason: ${action.reason}`) : [" none"];
355
- }
356
- function formatCounts(counts) {
357
- const entries = Object.entries(counts).filter(([, value]) => value > 0).sort(([left], [right]) => left.localeCompare(right));
358
- if (!entries.length)
359
- return "none";
360
- return entries.map(([key, value]) => `${key}=${value}`).join(", ");
361
- }
362
- function groupBy(items, getKey) {
363
- const groups = {};
364
- for (const item of items) {
365
- const key = getKey(item);
366
- groups[key] = groups[key] || [];
367
- groups[key].push(item);
368
- }
369
- return groups;
380
+ ].join("\n");
370
381
  }