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.
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +18 -7
- package/apps/architecture-review/app.json +2 -2
- package/apps/architecture-review/workflow.js +12 -12
- package/apps/architecture-review-fast/app.json +1 -1
- package/apps/end-to-end-golden-path/app.json +1 -1
- package/apps/pr-review-fix-ci/app.json +1 -1
- package/apps/release-cut/app.json +1 -1
- package/apps/research-synthesis/app.json +1 -1
- package/dist/cli/dispatch.js +236 -0
- package/dist/cli/entry.js +120 -0
- package/dist/cli/io.js +21 -4
- package/dist/cli/parseargv.js +157 -0
- package/dist/cli.js +6 -33
- package/dist/core/capability-table.js +3518 -0
- package/dist/core/format/help.js +314 -0
- package/dist/{state-explosion/format.js → core/format/state-explosion-text.js} +10 -1
- package/dist/core/hash.js +137 -0
- package/dist/core/multi-agent/candidate-scoring.js +219 -0
- package/dist/core/multi-agent/collaboration.js +481 -0
- package/dist/core/multi-agent/coordinator.js +515 -0
- package/dist/core/multi-agent/eval-replay.js +306 -0
- package/dist/core/multi-agent/runtime.js +929 -0
- package/dist/core/multi-agent/topology.js +298 -0
- package/dist/core/multi-agent/trust-policy.js +197 -0
- package/dist/core/pipeline/commit-gate.js +320 -0
- package/dist/{pipeline-contract.js → core/pipeline/contract.js} +24 -37
- package/dist/core/pipeline/dispatch.js +103 -0
- package/dist/core/pipeline/drive-decide.js +227 -0
- package/dist/core/pipeline/error-feedback.js +161 -0
- package/dist/core/pipeline/loop-expansion.js +124 -0
- package/dist/{result-normalize.js → core/pipeline/result-normalize.js} +14 -37
- package/dist/core/pipeline/runner.js +230 -0
- package/dist/{contract-migration.js → core/state/contract-migration.js} +68 -92
- package/dist/{state-migrations.js → core/state/migrations.js} +103 -96
- package/dist/core/state/node-projection.js +95 -0
- package/dist/core/state/node-snapshot.js +230 -0
- package/dist/core/state/run-paths.js +93 -0
- package/dist/{schema-validate.js → core/state/schema-validate.js} +35 -28
- package/dist/core/state/schema.js +50 -0
- package/dist/core/state/state-explosion/digest.js +243 -0
- package/dist/core/state/state-explosion/graph.js +527 -0
- package/dist/{state-explosion → core/state/state-explosion}/helpers.js +34 -3
- package/dist/core/state/state-explosion/report.js +187 -0
- package/dist/{state-explosion → core/state/state-explosion}/size.js +25 -7
- package/dist/{state-node.js → core/state/state-node.js} +90 -113
- package/dist/core/state/types.js +19 -0
- package/dist/{validation.js → core/state/validation.js} +64 -131
- package/dist/core/trust/evidence-grounding.js +134 -0
- package/dist/core/trust/ledger.js +199 -0
- package/dist/{telemetry-attestation.js → core/trust/telemetry-attestation.js} +94 -68
- package/dist/core/trust/telemetry-ledger.js +127 -0
- package/dist/core/types.js +20 -0
- package/dist/core/version.js +16 -0
- package/dist/{workflow-app-framework.js → core/workflow-apps/app-schema.js} +337 -426
- package/dist/mcp/dispatch.js +104 -0
- package/dist/mcp/server.js +144 -0
- package/dist/mcp-server.js +6 -84
- package/dist/{agent-config.js → shell/agent-config.js} +118 -71
- package/dist/shell/app-run-cli.js +88 -0
- package/dist/shell/audit-cli.js +259 -0
- package/dist/shell/audit-provenance.js +83 -0
- package/dist/shell/candidate-scoring-io.js +459 -0
- package/dist/shell/collaboration-io.js +264 -0
- package/dist/shell/commit-summary.js +104 -0
- package/dist/shell/commit.js +290 -0
- package/dist/shell/coordinator-io.js +476 -0
- package/dist/shell/demo-cli.js +19 -0
- package/dist/shell/dispatch.js +162 -0
- package/dist/shell/doctor.js +292 -0
- package/dist/shell/drive.js +885 -0
- package/dist/shell/error-feedback-io.js +305 -0
- package/dist/shell/eval-io.js +473 -0
- package/dist/{multi-agent-eval/format.js → shell/eval-text.js} +78 -49
- package/dist/{evidence-reasoning.js → shell/evidence-reasoning.js} +124 -255
- package/dist/shell/exec-backend-cli.js +88 -0
- package/dist/shell/execution-backend/agent.js +507 -0
- package/dist/shell/execution-backend/ci.js +15 -0
- package/dist/shell/execution-backend/container.js +69 -0
- package/dist/shell/execution-backend/envelopes.js +55 -0
- package/dist/shell/execution-backend/local.js +113 -0
- package/dist/shell/execution-backend/probes.js +175 -0
- package/dist/shell/execution-backend/registry.js +402 -0
- package/dist/shell/execution-backend/remote.js +128 -0
- package/dist/shell/execution-backend/types.js +11 -0
- package/dist/shell/feedback-cli.js +81 -0
- package/dist/shell/feedback-operations.js +48 -0
- package/dist/shell/fs-atomic.js +276 -0
- package/dist/shell/harness.js +98 -0
- package/dist/shell/ledger-cli.js +212 -0
- package/dist/shell/ledger-io.js +169 -0
- package/dist/shell/man-cli.js +89 -0
- package/dist/shell/metrics-cli.js +100 -0
- package/dist/shell/multi-agent-cli.js +1002 -0
- package/dist/shell/multi-agent-host.js +563 -0
- package/dist/shell/multi-agent-io.js +387 -0
- package/dist/{multi-agent-operator-ux.js → shell/multi-agent-operator-ux.js} +234 -191
- package/dist/shell/node-store.js +124 -0
- package/dist/{observability/format.js → shell/observability-format.js} +7 -1
- package/dist/{observability/intake.js → shell/observability-intake.js} +79 -56
- package/dist/{observability.js → shell/observability.js} +159 -332
- package/dist/{onramp.js → shell/onramp.js} +11 -0
- package/dist/{operator-ux/format.js → shell/operator-ux-text.js} +250 -239
- package/dist/shell/operator-ux.js +431 -0
- package/dist/shell/orchestrator.js +231 -0
- package/dist/shell/pipeline-cli.js +667 -0
- package/dist/shell/pipeline.js +217 -0
- package/dist/shell/reclamation-io.js +1366 -0
- package/dist/shell/registry-cli.js +344 -0
- package/dist/{remote-source.js → shell/remote-source.js} +2 -2
- package/dist/shell/report-cli.js +101 -0
- package/dist/shell/report-view-cli.js +117 -0
- package/dist/{orchestrator → shell}/report.js +289 -282
- package/dist/shell/reporter.js +62 -0
- package/dist/shell/run-export-cli.js +106 -0
- package/dist/shell/run-export.js +680 -0
- package/dist/shell/run-registry-io.js +1014 -0
- package/dist/shell/run-store.js +164 -0
- package/dist/{sandbox-profile.js → shell/sandbox-profile.js} +134 -95
- package/dist/{scheduler.js → shell/scheduler-io.js} +257 -48
- package/dist/shell/scheduling-io.js +321 -0
- package/dist/shell/state-cli.js +181 -0
- package/dist/shell/state-explosion-cli.js +197 -0
- package/dist/shell/telemetry-cli.js +85 -0
- package/dist/{telemetry-demo.js → shell/telemetry-demo.js} +149 -119
- package/dist/shell/telemetry-ledger-io.js +132 -0
- package/dist/{term.js → shell/term.js} +36 -46
- package/dist/shell/topology-io.js +361 -0
- package/dist/shell/trust-audit.js +472 -0
- package/dist/{multi-agent-trust.js → shell/trust-policy-io.js} +67 -205
- package/dist/shell/verifier.js +48 -0
- package/dist/shell/workbench-host.js +258 -0
- package/dist/shell/workbench-text.js +18 -0
- package/dist/shell/workbench.js +170 -0
- package/dist/shell/worker-cli.js +124 -0
- package/dist/shell/worker-isolation.js +852 -0
- package/dist/shell/workflow-app-loader.js +650 -0
- package/docs/agent-delegation-drive.7.md +4 -0
- package/docs/cli-mcp-parity.7.md +282 -219
- package/docs/contract-migration-tooling.7.md +4 -0
- package/docs/control-plane-scheduling.7.md +4 -0
- package/docs/durable-state-and-locking.7.md +4 -0
- package/docs/evidence-adoption-reasoning-chain.7.md +4 -0
- package/docs/execution-backends.7.md +4 -0
- package/docs/multi-agent-cli-mcp-surface.7.md +4 -0
- package/docs/multi-agent-eval-replay-harness.7.md +4 -0
- package/docs/multi-agent-operator-ux.7.md +4 -0
- package/docs/node-snapshot-diff-replay.7.md +4 -0
- package/docs/observability-cost-accounting.7.md +6 -1
- package/docs/project-index.md +137 -71
- package/docs/real-execution-backends.7.md +4 -0
- package/docs/release-and-migration.7.md +4 -0
- package/docs/release-tooling.7.md +4 -0
- package/docs/remote-source-review.7.md +4 -4
- package/docs/report-verifiable-bundle.7.md +1 -1
- package/docs/run-registry-control-plane.7.md +4 -0
- package/docs/run-retention-reclamation.7.md +25 -0
- package/docs/security-trust-hardening.7.md +3 -1
- package/docs/state-explosion-management.7.md +4 -0
- package/docs/team-collaboration.7.md +4 -0
- package/docs/web-desktop-workbench.7.md +15 -1
- package/manifest/plugin.manifest.json +1 -1
- package/manifest/source-context-profiles.json +9 -13
- package/package.json +1 -1
- package/scripts/agents/agent-adapter-core.js +22 -2
- package/scripts/agents/claude-p-agent.js +8 -3
- package/scripts/agents/cw-attest-wrap.js +2 -2
- package/scripts/agents/gemini-agent.js +5 -1
- package/scripts/agents/opencode-agent.js +5 -1
- package/scripts/bump-version.js +4 -3
- package/scripts/canonical-apps.js +4 -4
- package/scripts/dogfood-architecture-review.js +2 -3
- package/scripts/dogfood-release.js +3 -3
- package/scripts/gen-parity-doc.js +15 -2
- package/scripts/golden-path.js +4 -4
- package/scripts/onramp-check.js +1 -1
- package/scripts/parity-check.js +38 -21
- package/scripts/release-flow.js +2 -2
- package/scripts/sync-project-index.js +51 -27
- package/scripts/validate-run-state-schema.js +2 -2
- package/scripts/version-sync-check.js +30 -30
- package/dist/candidate-scoring.js +0 -729
- package/dist/capability-core.js +0 -1189
- package/dist/capability-registry.js +0 -885
- package/dist/cli/command-surface.js +0 -494
- package/dist/cli/format.js +0 -56
- package/dist/cli/handlers/audit.js +0 -82
- package/dist/cli/handlers/blackboard.js +0 -81
- package/dist/cli/handlers/candidate.js +0 -40
- package/dist/cli/handlers/clones.js +0 -34
- package/dist/cli/handlers/collaboration.js +0 -61
- package/dist/cli/handlers/eval.js +0 -40
- package/dist/cli/handlers/ledger.js +0 -169
- package/dist/cli/handlers/maintenance.js +0 -107
- package/dist/cli/handlers/multi-agent.js +0 -165
- package/dist/cli/handlers/node.js +0 -41
- package/dist/cli/handlers/operational.js +0 -155
- package/dist/cli/handlers/operator.js +0 -146
- package/dist/cli/handlers/registry.js +0 -68
- package/dist/cli/handlers/run.js +0 -153
- package/dist/cli/handlers/scheduling.js +0 -132
- package/dist/cli/handlers/workbench.js +0 -41
- package/dist/cli/handlers/worker.js +0 -45
- package/dist/cli/run-summary.js +0 -45
- package/dist/clones.js +0 -162
- package/dist/collaboration.js +0 -726
- package/dist/commit.js +0 -592
- package/dist/compare.js +0 -18
- package/dist/coordinator/classify.js +0 -45
- package/dist/coordinator/paths.js +0 -42
- package/dist/coordinator/util.js +0 -126
- package/dist/coordinator.js +0 -990
- package/dist/daemon.js +0 -44
- package/dist/dispatch.js +0 -250
- package/dist/doctor.js +0 -212
- package/dist/drive.js +0 -864
- package/dist/error-feedback.js +0 -419
- package/dist/evidence-grounding.js +0 -184
- package/dist/execution-backend/agent.js +0 -354
- package/dist/execution-backend/probes.js +0 -112
- package/dist/execution-backend/util.js +0 -47
- package/dist/execution-backend.js +0 -961
- package/dist/gates.js +0 -48
- package/dist/harness.js +0 -61
- package/dist/ledger.js +0 -313
- package/dist/loop-expansion.js +0 -60
- package/dist/mcp/tool-call.js +0 -470
- package/dist/mcp/tool-definitions.js +0 -1066
- package/dist/mcp-surface.js +0 -30
- package/dist/multi-agent/graph.js +0 -84
- package/dist/multi-agent/helpers.js +0 -141
- package/dist/multi-agent/ids.js +0 -20
- package/dist/multi-agent/paths.js +0 -22
- package/dist/multi-agent-eval/normalize.js +0 -51
- package/dist/multi-agent-eval.js +0 -678
- package/dist/multi-agent-host.js +0 -777
- package/dist/multi-agent.js +0 -984
- package/dist/node-projection.js +0 -59
- package/dist/node-snapshot.js +0 -260
- package/dist/operator-ux.js +0 -631
- package/dist/orchestrator/app-operations.js +0 -211
- package/dist/orchestrator/audit-operations.js +0 -182
- package/dist/orchestrator/candidate-operations.js +0 -117
- package/dist/orchestrator/cli-options.js +0 -294
- package/dist/orchestrator/collaboration-operations.js +0 -86
- package/dist/orchestrator/feedback-operations.js +0 -81
- package/dist/orchestrator/host-operations.js +0 -78
- package/dist/orchestrator/lifecycle-operations.js +0 -650
- package/dist/orchestrator/migration-operations.js +0 -44
- package/dist/orchestrator/multi-agent-operations.js +0 -362
- package/dist/orchestrator/topology-operations.js +0 -84
- package/dist/orchestrator.js +0 -925
- package/dist/pipeline-runner.js +0 -285
- package/dist/reclamation/hash.js +0 -72
- package/dist/reclamation.js +0 -812
- package/dist/reporter.js +0 -67
- package/dist/run-export.js +0 -815
- package/dist/run-registry/derive.js +0 -175
- package/dist/run-registry/format.js +0 -124
- package/dist/run-registry/gc.js +0 -251
- package/dist/run-registry/policy.js +0 -16
- package/dist/run-registry/queue.js +0 -115
- package/dist/run-registry.js +0 -850
- package/dist/run-state-schema.js +0 -68
- package/dist/scheduling.js +0 -184
- package/dist/state-explosion.js +0 -1014
- package/dist/state.js +0 -367
- package/dist/telemetry-ledger.js +0 -196
- package/dist/topology.js +0 -565
- package/dist/triggers.js +0 -184
- package/dist/trust-audit.js +0 -644
- package/dist/types/blackboard.js +0 -2
- package/dist/types/candidate.js +0 -2
- package/dist/types/collaboration.js +0 -2
- package/dist/types/core.js +0 -2
- package/dist/types/drive.js +0 -10
- package/dist/types/error-feedback.js +0 -2
- package/dist/types/evidence-reasoning.js +0 -2
- package/dist/types/execution-backend.js +0 -2
- package/dist/types/multi-agent.js +0 -2
- package/dist/types/observability.js +0 -2
- package/dist/types/pipeline.js +0 -2
- package/dist/types/reclamation.js +0 -8
- package/dist/types/report-bundle.js +0 -6
- package/dist/types/result.js +0 -2
- package/dist/types/run-registry.js +0 -2
- package/dist/types/run.js +0 -2
- package/dist/types/sandbox.js +0 -2
- package/dist/types/schedule.js +0 -2
- package/dist/types/state-node.js +0 -2
- package/dist/types/topology.js +0 -2
- package/dist/types/trust.js +0 -2
- package/dist/types/workbench.js +0 -2
- package/dist/types/worker.js +0 -2
- package/dist/types/workflow-app.js +0 -2
- package/dist/types.js +0 -44
- package/dist/util/fingerprint.js +0 -19
- package/dist/util/fingerprint.test.js +0 -27
- package/dist/verifier.js +0 -78
- package/dist/version.js +0 -8
- package/dist/workbench-host.js +0 -192
- package/dist/workbench.js +0 -192
- package/dist/worker-accept/acceptance.js +0 -114
- package/dist/worker-accept/blackboard-fanout.js +0 -80
- package/dist/worker-accept/blackboard-linkage.js +0 -19
- package/dist/worker-accept/context.js +0 -2
- package/dist/worker-accept/telemetry-ledger.js +0 -126
- package/dist/worker-accept/validation.js +0 -77
- package/dist/worker-accept/verifier-completion.js +0 -73
- package/dist/worker-isolation/helpers.js +0 -51
- package/dist/worker-isolation/paths.js +0 -46
- package/dist/worker-isolation.js +0 -656
- package/dist/workflow-api.js +0 -131
- /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.
|
|
8
|
-
exports.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
""
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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)(
|
|
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
|
|
103
|
-
const lines = [`
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
121
|
-
return
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|
130
|
-
return
|
|
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
|
|
78
|
+
function formatCommitPanel(summary) {
|
|
133
79
|
const lines = [
|
|
134
|
-
"
|
|
135
|
-
` total=${summary.
|
|
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
|
|
142
|
-
lines.push(`
|
|
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
|
|
147
|
-
return
|
|
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
|
|
150
|
-
|
|
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
|
-
...
|
|
139
|
+
...formatAuditEventRows(arrayView(view.permissionDecisions)),
|
|
168
140
|
"",
|
|
169
141
|
"Blackboard Write Audit",
|
|
170
|
-
...
|
|
142
|
+
...formatAuditEventRows(arrayView(view.blackboardWrites)),
|
|
171
143
|
"",
|
|
172
144
|
"Message Provenance",
|
|
173
|
-
...
|
|
145
|
+
...formatAuditEventRows(arrayView(view.messageProvenance)),
|
|
174
146
|
"",
|
|
175
147
|
"Judge Rationales",
|
|
176
|
-
...
|
|
148
|
+
...formatAuditEventRows([...arrayView(view.judgeRationales), ...arrayView(view.panelDecisions)]),
|
|
177
149
|
"",
|
|
178
150
|
"Policy Violations",
|
|
179
|
-
...
|
|
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
|
-
|
|
247
|
-
|
|
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
|
|
250
|
-
|
|
274
|
+
function formatTaskList(tasks) {
|
|
275
|
+
const active = [...tasks.running, ...tasks.pending];
|
|
276
|
+
if (!active.length)
|
|
251
277
|
return [" none"];
|
|
252
|
-
return
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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
|
-
|
|
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
|
-
|
|
316
|
-
|
|
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
|
-
|
|
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
|
}
|