@guyghost/swarm-dao-cli 0.4.5 → 0.6.0

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.
@@ -0,0 +1,265 @@
1
+ // Swarm DAO CLI — human-gate commands.
2
+ //
3
+ // These commands replace hand-written JSON signal files for every human
4
+ // channel event: they read the run state, show the exact decision inputs
5
+ // (hashes, reasons), require an explicit confirmation, and only then submit
6
+ // through the same runners the file-based flow uses. Nothing here bypasses a
7
+ // machine guard — a wrong state still ends as a machine rejection (exit 2).
8
+ import { createInterface } from "node:readline/promises";
9
+ import { createGraphRunner } from "@guyghost/swarm-dao-graph";
10
+ import { createImprovementRunner, OrchestratorRunner } from "@guyghost/swarm-dao-improvement";
11
+ import { c, GLYPH, truncateHash } from "./render.js";
12
+ import { CYCLE_ROOT_CANDIDATES, GRAPH_ROOT_CANDIDATES, locateRoot, readJsonOrNull, SERIES_ROOT_CANDIDATES, } from "./roots.js";
13
+ export class GateError extends Error {
14
+ }
15
+ function gateErr(msg) {
16
+ throw new GateError(msg);
17
+ }
18
+ const stringFlag = (flags, name) => {
19
+ const value = flags[name];
20
+ if (value === undefined)
21
+ return undefined;
22
+ if (typeof value !== "string" || value.trim().length === 0)
23
+ gateErr(`--${name} requires a value`);
24
+ return value;
25
+ };
26
+ const nowIso = () => new Date().toISOString();
27
+ /** Explicit confirmation; refuses to run non-interactively without --yes. */
28
+ export async function confirm(question, assumeYes) {
29
+ if (assumeYes)
30
+ return true;
31
+ if (process.stdin.isTTY !== true) {
32
+ gateErr("refusing to submit a human event non-interactively — review the inputs above, then re-run with --yes");
33
+ }
34
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
35
+ try {
36
+ const answer = await rl.question(`${question} [y/N] `);
37
+ return answer.trim().toLowerCase() === "y" || answer.trim().toLowerCase() === "yes";
38
+ }
39
+ finally {
40
+ rl.close();
41
+ }
42
+ }
43
+ function reportSubmission(accepted, beforeState, afterState, eventType) {
44
+ if (!accepted) {
45
+ process.stdout.write(`${GLYPH.fail} ${eventType} rejected by the machine (${beforeState} → ${afterState})\n`);
46
+ return 2;
47
+ }
48
+ process.stdout.write(`${GLYPH.ok} ${eventType} submitted — state is now ${c.info(afterState)}\n`);
49
+ return 0;
50
+ }
51
+ // ── Graph run gates ─────────────────────────────────────────
52
+ export async function cmdApprove(cwd, flags) {
53
+ const runId = stringFlag(flags, "run-id");
54
+ if (!runId)
55
+ gateErr("--run-id is required\nusage: swarm-dao approve --run-id <id> [--evidence-root <path>] [--yes]");
56
+ const evidenceRoot = stringFlag(flags, "evidence-root");
57
+ const located = await locateRoot(cwd, runId, GRAPH_ROOT_CANDIDATES, evidenceRoot);
58
+ const runner = await createGraphRunner({ evidenceRoot: located.root, runId });
59
+ const snapshot = runner.snapshot();
60
+ if (snapshot.state !== "awaitingApproval") {
61
+ gateErr(`run '${runId}' is '${snapshot.state}', not awaitingApproval — nothing to approve`);
62
+ }
63
+ const modelHash = String(snapshot.context.modelHash ?? "");
64
+ process.stdout.write(`run: ${c.bold(runId)} (${located.root})\n`);
65
+ process.stdout.write(`model: ${modelHash}\n`);
66
+ process.stdout.write(c.dim("verify this hash yourself before approving (it binds the exact frozen model)\n"));
67
+ const ok = await confirm(`Approve model ${truncateHash(modelHash)}?`, flags.yes === true);
68
+ if (!ok) {
69
+ process.stdout.write("aborted — nothing was submitted\n");
70
+ return 0;
71
+ }
72
+ const result = await runner.submit({
73
+ runId,
74
+ type: "MODEL_APPROVED",
75
+ source: "human",
76
+ producer: "human-owner",
77
+ occurredAt: nowIso(),
78
+ payload: { modelHash },
79
+ evidence: ["owner approval via swarm-dao approve"],
80
+ });
81
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "MODEL_APPROVED");
82
+ }
83
+ export async function cmdReject(cwd, flags) {
84
+ const runId = stringFlag(flags, "run-id");
85
+ const reason = stringFlag(flags, "reason");
86
+ if (!runId || !reason)
87
+ gateErr("--run-id and --reason are required\nusage: swarm-dao reject --run-id <id> --reason <text> [--yes]");
88
+ const evidenceRoot = stringFlag(flags, "evidence-root");
89
+ const located = await locateRoot(cwd, runId, GRAPH_ROOT_CANDIDATES, evidenceRoot);
90
+ const runner = await createGraphRunner({ evidenceRoot: located.root, runId });
91
+ const snapshot = runner.snapshot();
92
+ if (snapshot.state !== "awaitingApproval") {
93
+ gateErr(`run '${runId}' is '${snapshot.state}', not awaitingApproval — nothing to reject`);
94
+ }
95
+ process.stdout.write(`run: ${c.bold(runId)}\nreason: ${reason}\n`);
96
+ const ok = await confirm("Send the model back to draft?", flags.yes === true);
97
+ if (!ok) {
98
+ process.stdout.write("aborted — nothing was submitted\n");
99
+ return 0;
100
+ }
101
+ const result = await runner.submit({
102
+ runId,
103
+ type: "MODEL_REJECTED",
104
+ source: "human",
105
+ producer: "human-owner",
106
+ occurredAt: nowIso(),
107
+ payload: { reason },
108
+ evidence: ["owner rejection via swarm-dao reject"],
109
+ });
110
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "MODEL_REJECTED");
111
+ }
112
+ async function loadCycleRunner(cwd, cycleId, flags) {
113
+ const located = await locateRoot(cwd, cycleId, CYCLE_ROOT_CANDIDATES, stringFlag(flags, "cycle-root"));
114
+ const snapshot = (await readJsonOrNull(`${located.root}/${cycleId}/snapshot.json`));
115
+ if (!snapshot)
116
+ gateErr(`cycle '${cycleId}' not found (tried: ${located.tried.join(", ")})`);
117
+ const runner = await createImprovementRunner({
118
+ evidenceRoot: located.root,
119
+ cycleId,
120
+ scope: snapshot?.context.scope ?? "default",
121
+ referenceHash: snapshot?.context.referenceHash ?? "",
122
+ });
123
+ return { runner, snapshot: snapshot, root: located.root };
124
+ }
125
+ async function resolveCycleId(cwd, flags) {
126
+ const cycleId = stringFlag(flags, "cycle-id");
127
+ if (cycleId)
128
+ return cycleId;
129
+ const seriesId = stringFlag(flags, "series-id");
130
+ if (!seriesId) {
131
+ gateErr("--cycle-id (or --series-id to resolve the active cycle) is required");
132
+ }
133
+ const located = await locateRoot(cwd, seriesId, SERIES_ROOT_CANDIDATES, stringFlag(flags, "evidence-root"));
134
+ const snapshot = (await readJsonOrNull(`${located.root}/${seriesId}/snapshot.json`));
135
+ const active = snapshot?.context?.improvementCycleId;
136
+ if (!active)
137
+ gateErr(`series '${seriesId}' has no active cycle — use --cycle-id or check: swarm-dao improve status --series-id ${seriesId}`);
138
+ return active;
139
+ }
140
+ export async function cmdImproveRetry(cwd, flags) {
141
+ const cycleId = await resolveCycleId(cwd, flags);
142
+ const { runner, snapshot } = await loadCycleRunner(cwd, cycleId, flags);
143
+ if (snapshot.state !== "retrying") {
144
+ gateErr(`cycle '${cycleId}' is '${snapshot.state}', not retrying — nothing to authorize`);
145
+ }
146
+ process.stdout.write(`cycle: ${c.bold(cycleId)}\nretry: attempt ${(snapshot.context.attempt ?? 0) + 1} of ${(snapshot.context.maxRetries ?? 0) + 1} max\n`);
147
+ const ok = await confirm("Authorize the retry?", flags.yes === true);
148
+ if (!ok) {
149
+ process.stdout.write("aborted — nothing was submitted\n");
150
+ return 0;
151
+ }
152
+ const result = await runner.submit({
153
+ cycleId,
154
+ type: "RETRY_AUTHORIZED",
155
+ source: "human",
156
+ producer: "human-owner",
157
+ occurredAt: nowIso(),
158
+ payload: {},
159
+ evidence: ["owner authorization via swarm-dao improve retry"],
160
+ });
161
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "RETRY_AUTHORIZED");
162
+ }
163
+ export async function cmdImproveReference(cwd, flags) {
164
+ const decision = stringFlag(flags, "decision");
165
+ if (decision !== "approve" && decision !== "reject")
166
+ gateErr("--decision must be approve or reject");
167
+ const cycleId = await resolveCycleId(cwd, flags);
168
+ const { runner, snapshot } = await loadCycleRunner(cwd, cycleId, flags);
169
+ if (snapshot.state !== "adjusting") {
170
+ gateErr(`cycle '${cycleId}' is '${snapshot.state}', not adjusting — nothing to decide`);
171
+ }
172
+ const referenceHash = String(snapshot.context.referenceHash ?? "");
173
+ process.stdout.write(`cycle: ${c.bold(cycleId)}\nreference: ${referenceHash}\ndecision: ${decision}\n`);
174
+ if (decision === "reject") {
175
+ const reason = stringFlag(flags, "reason") ?? gateErr("--reason is required to reject a reference change");
176
+ process.stdout.write(`reason: ${reason}\n`);
177
+ const ok = await confirm("Reject this reference change?", flags.yes === true);
178
+ if (!ok) {
179
+ process.stdout.write("aborted — nothing was submitted\n");
180
+ return 0;
181
+ }
182
+ const result = await runner.submit({
183
+ cycleId,
184
+ type: "REFERENCE_CHANGE_REJECTED",
185
+ source: "human",
186
+ producer: "human-owner",
187
+ occurredAt: nowIso(),
188
+ payload: { reason },
189
+ evidence: ["owner rejection via swarm-dao improve reference"],
190
+ });
191
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "REFERENCE_CHANGE_REJECTED");
192
+ }
193
+ const ok = await confirm("Approve this exact reference?", flags.yes === true);
194
+ if (!ok) {
195
+ process.stdout.write("aborted — nothing was submitted\n");
196
+ return 0;
197
+ }
198
+ const result = await runner.submit({
199
+ cycleId,
200
+ type: "REFERENCE_CHANGE_APPROVED",
201
+ source: "human",
202
+ producer: "human-owner",
203
+ occurredAt: nowIso(),
204
+ payload: { referenceHash },
205
+ evidence: ["owner approval via swarm-dao improve reference"],
206
+ });
207
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "REFERENCE_CHANGE_APPROVED");
208
+ }
209
+ async function seriesRunner(cwd, flags) {
210
+ const seriesId = stringFlag(flags, "series-id");
211
+ if (!seriesId)
212
+ gateErr("--series-id is required");
213
+ const located = await locateRoot(cwd, seriesId, SERIES_ROOT_CANDIDATES, stringFlag(flags, "evidence-root"));
214
+ if (!located.found) {
215
+ gateErr(`series '${seriesId}' not found (tried: ${located.tried.join(", ")})`);
216
+ }
217
+ const runner = await OrchestratorRunner.create({ seriesId, evidenceRoot: located.root });
218
+ return { runner, snapshot: runner.snapshot(), root: located.root };
219
+ }
220
+ export async function cmdImproveRetryWorkers(cwd, flags) {
221
+ const { runner, snapshot } = await seriesRunner(cwd, flags);
222
+ if (snapshot.state !== "workerFailed") {
223
+ gateErr(`series '${snapshot.context.seriesId}' is '${snapshot.state}', not workerFailed — nothing to authorize`);
224
+ }
225
+ process.stdout.write(`series: ${c.bold(String(snapshot.context.seriesId))}\nfailure: ${snapshot.context.pendingReason ?? "unknown"}\n`);
226
+ const ok = await confirm("Retry the failed workers?", flags.yes === true);
227
+ if (!ok) {
228
+ process.stdout.write("aborted — nothing was submitted\n");
229
+ return 0;
230
+ }
231
+ const result = await runner.submit({ type: "RETRY_WORKERS", source: "human" });
232
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "RETRY_WORKERS");
233
+ }
234
+ export async function cmdImproveRestart(cwd, flags) {
235
+ const { runner, snapshot } = await seriesRunner(cwd, flags);
236
+ if (snapshot.state !== "halted") {
237
+ gateErr(`series '${snapshot.context.seriesId}' is '${snapshot.state}', not halted — restart applies to halted series only`);
238
+ }
239
+ process.stdout.write(`series: ${c.bold(String(snapshot.context.seriesId))}\nhalted: ${snapshot.context.pendingReason ?? "unknown"}\n`);
240
+ const ok = await confirm("Restart the series (preparing)?", flags.yes === true);
241
+ if (!ok) {
242
+ process.stdout.write("aborted — nothing was submitted\n");
243
+ return 0;
244
+ }
245
+ const result = await runner.submit({ type: "RESTART_SERIES", source: "human" });
246
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "RESTART_SERIES");
247
+ }
248
+ export async function cmdImproveCancel(cwd, flags) {
249
+ const reason = stringFlag(flags, "reason");
250
+ if (!reason)
251
+ gateErr("--reason is required (the journal records why the series was cancelled)");
252
+ const { runner, snapshot } = await seriesRunner(cwd, flags);
253
+ if (!snapshot.context.started) {
254
+ gateErr(`series '${snapshot.context.seriesId}' has not started — nothing to cancel`);
255
+ }
256
+ process.stdout.write(`series: ${c.bold(String(snapshot.context.seriesId))} (${snapshot.state})\nreason: ${reason}\n`);
257
+ const ok = await confirm("Cancel this series? This is terminal.", flags.yes === true);
258
+ if (!ok) {
259
+ process.stdout.write("aborted — nothing was submitted\n");
260
+ return 0;
261
+ }
262
+ const result = await runner.submit({ type: "CANCEL_SERIES", source: "human", reason });
263
+ return reportSubmission(result.accepted, snapshot.state, result.snapshot.state ?? "?", "CANCEL_SERIES");
264
+ }
265
+ //# sourceMappingURL=human-gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-gates.js","sourceRoot":"","sources":["../src/human-gates.ts"],"names":[],"mappings":"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"}
package/dist/next.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function cmdNext(cwd: string): Promise<number>;
2
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAqBA,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC1D"}
package/dist/next.js ADDED
@@ -0,0 +1,81 @@
1
+ // Swarm DAO CLI — `next`: what the machines need from you, and what is
2
+ // quietly progressing. Attention (human gates) first, then live-but-calm
3
+ // workflows (cooldown countdowns, in-flight runs), each with the exact
4
+ // command to copy. Read-only.
5
+ import { ATTENTION_SOURCES, collectAttention, FsAttentionStore } from "@guyghost/swarm-dao-core";
6
+ import { c, formatRemaining, GLYPH } from "./render.js";
7
+ import { locateRoot, readJsonOrNull, SERIES_ROOT_CANDIDATES } from "./roots.js";
8
+ const TERMINAL_STATES = {
9
+ "graph-engineering": new Set(["succeeded", "failed", "blocked", "cancelled"]),
10
+ "improvement-loop": new Set(["succeeded", "failed", "cancelled"]),
11
+ "improvement-series": new Set(["cancelled"]),
12
+ "product-loop": new Set(["succeeded", "failed", "abandoned"]),
13
+ };
14
+ export async function cmdNext(cwd) {
15
+ const store = new FsAttentionStore(cwd);
16
+ const items = await collectAttention(store);
17
+ const gated = new Set(items.map((i) => `${i.source}/${i.runId}`));
18
+ const progress = [];
19
+ for (const source of ATTENTION_SOURCES) {
20
+ const runIds = await store.listRuns(source).catch(() => []);
21
+ for (const runId of runIds) {
22
+ if (gated.has(`${source}/${runId}`))
23
+ continue;
24
+ const snapshot = (await store.readSnapshot(source, runId).catch(() => null));
25
+ if (!snapshot || TERMINAL_STATES[source]?.has(snapshot.state))
26
+ continue;
27
+ progress.push(...(await describeProgress(source, runId, snapshot)));
28
+ }
29
+ }
30
+ if (items.length === 0 && progress.length === 0) {
31
+ process.stdout.write("nothing pending — no human gates, no active workflows\n");
32
+ return 0;
33
+ }
34
+ if (items.length > 0) {
35
+ process.stdout.write(`${c.bold("Needs you")} — human gates\n`);
36
+ for (const item of items) {
37
+ process.stdout.write(` ${GLYPH.warn} ${c.bold(item.runId)} — ${item.action}${c.dim(` [${item.source}, ${item.state}]`)}\n`);
38
+ if (item.detail)
39
+ process.stdout.write(` ${c.dim(`detail: ${item.detail}`)}\n`);
40
+ if (item.command)
41
+ process.stdout.write(` ${GLYPH.arrow} ${item.command}\n`);
42
+ }
43
+ }
44
+ else {
45
+ process.stdout.write(`${c.bold("Needs you")} — nothing; no human gates are pending\n`);
46
+ }
47
+ if (progress.length > 0) {
48
+ process.stdout.write(`\n${c.bold("In progress")} — no action needed\n`);
49
+ for (const line of progress)
50
+ process.stdout.write(` ${GLYPH.wait} ${line}\n`);
51
+ }
52
+ return 0;
53
+ }
54
+ async function describeProgress(source, runId, snapshot) {
55
+ if (source === "improvement-series" && (snapshot.state === "idle" || snapshot.context.started === false)) {
56
+ // `improve status` materializes idle series storage on demand; a series
57
+ // that never started is not live progress.
58
+ return [];
59
+ }
60
+ if (source === "improvement-series" && snapshot.state === "cooldown") {
61
+ // The attention store drops top-level fields (cooldownEnteredAt); read
62
+ // the real series snapshot for the countdown and the next cycle number.
63
+ return cooldownProgress(runId);
64
+ }
65
+ return [`${runId} — ${c.info(snapshot.state)}${c.dim(` [${source}]`)}`];
66
+ }
67
+ async function cooldownProgress(seriesId) {
68
+ const located = await locateRoot(process.cwd(), seriesId, SERIES_ROOT_CANDIDATES);
69
+ const snapshot = (await readJsonOrNull(`${located.root}/${seriesId}/snapshot.json`));
70
+ if (!snapshot)
71
+ return [`${seriesId} — cooldown`];
72
+ const remaining = formatRemaining(snapshot.cooldownEnteredAt ?? null, snapshot.context?.cooldownMs ?? null, Date.now());
73
+ const nextCycle = (snapshot.context?.cycleSequence ?? 0) + 1;
74
+ if (remaining === "ready") {
75
+ return [`${seriesId} — cycle ${nextCycle} ready to start → swarm-dao improve once --series-id ${seriesId}`];
76
+ }
77
+ return [
78
+ `${seriesId} — cycle ${nextCycle} ready in ${c.info(remaining)} → swarm-dao improve once --series-id ${seriesId}`,
79
+ ];
80
+ }
81
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export declare const c: {
2
+ ok: (text: string) => string;
3
+ warn: (text: string) => string;
4
+ fail: (text: string) => string;
5
+ info: (text: string) => string;
6
+ dim: (text: string) => string;
7
+ bold: (text: string) => string;
8
+ };
9
+ export declare const GLYPH: {
10
+ readonly ok: "✓";
11
+ readonly warn: "⚠";
12
+ readonly wait: "⏳";
13
+ readonly fail: "✗";
14
+ readonly arrow: "→";
15
+ };
16
+ export declare function truncateHash(hash: string | null | undefined, keep?: number): string;
17
+ export declare function formatDuration(ms: number): string;
18
+ export declare function formatRemaining(fromIso: string | null | undefined, cooldownMs: number | null, now: number): string;
19
+ export interface SeriesStatusView {
20
+ seriesId: string;
21
+ state: string;
22
+ scope: string | null;
23
+ cycleSequence: number;
24
+ activeCycleId: string | null;
25
+ cooldownEnteredAt: string | null;
26
+ cooldownMs: number | null;
27
+ terminalReason: string | null;
28
+ }
29
+ export interface CycleStatusView {
30
+ cycleId: string;
31
+ state: string;
32
+ attempt: number;
33
+ maxRetries: number;
34
+ metricValue: string | null;
35
+ driftClass: string | null;
36
+ arbitration: string | null;
37
+ anchors: Record<string, {
38
+ status: string;
39
+ attempt: number;
40
+ }>;
41
+ terminalReason: string | null;
42
+ }
43
+ export declare function renderSeriesStatus(series: SeriesStatusView, cycle: CycleStatusView | null, opts: {
44
+ now: number;
45
+ found: boolean;
46
+ triedRoots?: readonly string[];
47
+ }): string[];
48
+ export interface GraphStatusView {
49
+ runId: string;
50
+ state: string;
51
+ modelHash: string | null;
52
+ approvedModelHash: string | null;
53
+ implementationHash: string | null;
54
+ anchors: Record<string, {
55
+ status: string;
56
+ }>;
57
+ }
58
+ export declare function renderGraphStatus(run: GraphStatusView): string[];
59
+ export interface CycleHistoryRow {
60
+ number: number;
61
+ cycleId: string;
62
+ state: string;
63
+ attempt: number;
64
+ metricValue: string | null;
65
+ driftClass: string | null;
66
+ arbitration: string | null;
67
+ durationMs: number | null;
68
+ }
69
+ export declare function renderCyclesTable(rows: readonly CycleHistoryRow[]): string[];
70
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,CAAC;eAHL,MAAM,KAAG,MAAM;iBAAf,MAAM,KAAG,MAAM;iBAAf,MAAM,KAAG,MAAM;iBAAf,MAAM,KAAG,MAAM;gBAAf,MAAM,KAAG,MAAM;iBAAf,MAAM,KAAG,MAAM;CAUvB,CAAC;AAEF,eAAO,MAAM,KAAK;;;;;;CAMR,CAAC;AAEX,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,SAAI,GAAG,MAAM,CAG9E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKlH;AAID,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAUD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,eAAe,GAAG,IAAI,EAC7B,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACpE,MAAM,EAAE,CAwCV;AAoBD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CA8BhE;AAID,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,EAAE,CA0B5E"}
package/dist/render.js ADDED
@@ -0,0 +1,166 @@
1
+ // Swarm DAO CLI — human-readable rendering.
2
+ //
3
+ // Pure formatting only (no filesystem access): callers read snapshots and
4
+ // journals, then hand plain values to these renderers. Machine output stays
5
+ // available everywhere via `--json`; pretty is the default because the CLI's
6
+ // primary audience is the human who governs the machines.
7
+ const useColor = !process.env.NO_COLOR && process.stdout.isTTY === true;
8
+ const paint = (code) => (text) => useColor ? `\x1b[${code}m${text}\x1b[0m` : text;
9
+ export const c = {
10
+ ok: paint("32"),
11
+ warn: paint("33"),
12
+ fail: paint("31"),
13
+ info: paint("36"),
14
+ dim: paint("2"),
15
+ bold: paint("1"),
16
+ };
17
+ export const GLYPH = {
18
+ ok: "✓",
19
+ warn: "⚠",
20
+ wait: "⏳",
21
+ fail: "✗",
22
+ arrow: "→",
23
+ };
24
+ export function truncateHash(hash, keep = 8) {
25
+ if (!hash)
26
+ return "—";
27
+ return hash.length <= keep ? hash : hash.slice(0, keep);
28
+ }
29
+ export function formatDuration(ms) {
30
+ if (!Number.isFinite(ms) || ms < 0)
31
+ return "—";
32
+ const totalSeconds = Math.round(ms / 1000);
33
+ if (totalSeconds < 60)
34
+ return `${totalSeconds}s`;
35
+ const minutes = Math.floor(totalSeconds / 60);
36
+ if (minutes < 60)
37
+ return `${minutes}m${String(totalSeconds % 60).padStart(2, "0")}s`;
38
+ const hours = Math.floor(minutes / 60);
39
+ return `${hours}h${String(minutes % 60).padStart(2, "0")}m`;
40
+ }
41
+ export function formatRemaining(fromIso, cooldownMs, now) {
42
+ if (!fromIso)
43
+ return "—";
44
+ const remaining = Date.parse(fromIso) + (cooldownMs ?? 0) - now;
45
+ if (remaining <= 0)
46
+ return "ready";
47
+ return formatDuration(remaining);
48
+ }
49
+ const SERIES_STATE_GLYPH = {
50
+ cooldown: GLYPH.wait,
51
+ halted: GLYPH.warn,
52
+ cancelled: GLYPH.fail,
53
+ workerFailed: GLYPH.warn,
54
+ awaitingHumanCycleDecision: GLYPH.warn,
55
+ };
56
+ export function renderSeriesStatus(series, cycle, opts) {
57
+ if (!opts.found) {
58
+ return [
59
+ `${c.bold(series.seriesId)} — ${c.warn("not found")} ${c.dim("(fresh idle snapshot)")}`,
60
+ `tried: ${c.dim((opts.triedRoots ?? []).join(", "))}`,
61
+ `start one: ${GLYPH.arrow} swarm-dao improve init --series-id ${series.seriesId} --scope <scope> --reference-hash <hash>`,
62
+ ];
63
+ }
64
+ const glyph = SERIES_STATE_GLYPH[series.state] ?? GLYPH.ok;
65
+ const lines = [
66
+ `${c.bold(series.seriesId)}${series.scope ? c.dim(` — ${series.scope}`) : ""}`,
67
+ `state: ${c.info(series.state)} ${glyph}${series.terminalReason ? c.dim(` (${series.terminalReason})`) : ""}`,
68
+ `cycles: ${series.cycleSequence} completed${series.activeCycleId ? ` | active: ${c.bold(series.activeCycleId)}` : ""}`,
69
+ ];
70
+ if (cycle) {
71
+ const passed = Object.values(cycle.anchors).filter((a) => a.status === "passed").length;
72
+ const total = Object.keys(cycle.anchors).length;
73
+ const anchorsPart = total > 0 ? ` | anchors ${passed}/${total} passed` : "";
74
+ const retryPart = cycle.attempt > 0 ? c.dim(` (retry ${cycle.attempt}/${cycle.maxRetries})`) : "";
75
+ lines.push(`cycle: ${c.info(cycle.state)}${retryPart}${anchorsPart}` +
76
+ (cycle.metricValue ? ` | metric ${cycle.metricValue}` : ""));
77
+ if (cycle.terminalReason)
78
+ lines.push(`reason: ${c.dim(cycle.terminalReason)}`);
79
+ }
80
+ if (series.state === "cooldown") {
81
+ const remaining = formatRemaining(series.cooldownEnteredAt, series.cooldownMs, opts.now);
82
+ lines.push(remaining === "ready"
83
+ ? `cooldown: ${c.ok("ready")} — the next cycle can start`
84
+ : `cooldown: ${c.warn(remaining)} remaining`);
85
+ }
86
+ const next = nextStepFor(series, cycle);
87
+ if (next)
88
+ lines.push(`next: ${GLYPH.arrow} ${next}`);
89
+ return lines;
90
+ }
91
+ function nextStepFor(series, cycle) {
92
+ switch (series.state) {
93
+ case "cooldown":
94
+ return `swarm-dao improve once --series-id ${series.seriesId}`;
95
+ case "awaitingHumanCycleDecision":
96
+ if (cycle?.state === "retrying")
97
+ return `swarm-dao improve retry --cycle-id ${cycle.cycleId}`;
98
+ return `swarm-dao improve status --series-id ${series.seriesId}`;
99
+ case "workerFailed":
100
+ return `swarm-dao improve retry-workers --series-id ${series.seriesId}`;
101
+ case "halted":
102
+ return `swarm-dao improve restart --series-id ${series.seriesId}`;
103
+ default:
104
+ return null;
105
+ }
106
+ }
107
+ export function renderGraphStatus(run) {
108
+ const terminal = run.state === "succeeded";
109
+ const glyph = run.state === "succeeded" ? GLYPH.ok : run.state === "awaitingApproval" ? GLYPH.warn : GLYPH.wait;
110
+ const lines = [
111
+ `${c.bold(run.runId)} — ${c.info(run.state)} ${glyph}`,
112
+ `model: ${truncateHash(run.modelHash)}` +
113
+ (run.approvedModelHash
114
+ ? ` ${c.ok(GLYPH.ok)} approved`
115
+ : run.state === "awaitingApproval"
116
+ ? ` ${c.warn("ACTION REQUIRED")}`
117
+ : "") +
118
+ (run.implementationHash ? c.dim(` · implemented (${truncateHash(run.implementationHash)})`) : ""),
119
+ ];
120
+ const anchorEntries = Object.entries(run.anchors);
121
+ if (anchorEntries.length > 0) {
122
+ const rendered = anchorEntries
123
+ .map(([name, a]) => `${name} ${a.status === "passed" ? c.ok(GLYPH.ok) : c.fail(GLYPH.fail)}`)
124
+ .join(" ");
125
+ lines.push(`anchors: ${rendered}`);
126
+ }
127
+ if (run.state === "awaitingApproval") {
128
+ lines.push(`next: ${GLYPH.arrow} swarm-dao approve --run-id ${run.runId}`);
129
+ }
130
+ if (run.state === "retrying") {
131
+ lines.push(`next: ${GLYPH.arrow} swarm-dao graph submit --run-id ${run.runId} --signal <signal.json>`);
132
+ }
133
+ if (terminal)
134
+ lines.push(c.dim("run is terminal; evidence is preserved under the evidence root"));
135
+ return lines;
136
+ }
137
+ export function renderCyclesTable(rows) {
138
+ if (rows.length === 0)
139
+ return [c.dim("no cycles recorded yet")];
140
+ const header = ["cycle", "state", "attempt", "metric", "drift", "arbitration", "duration"];
141
+ const cells = rows.map((r) => {
142
+ const stateGlyph = r.state === "succeeded"
143
+ ? c.ok(`${GLYPH.ok} ${r.state}`)
144
+ : r.state === "failed"
145
+ ? c.fail(`${GLYPH.fail} ${r.state}`)
146
+ : r.state;
147
+ return [
148
+ String(r.number),
149
+ stateGlyph,
150
+ String(r.attempt),
151
+ r.metricValue ?? "—",
152
+ r.driftClass ?? "—",
153
+ r.arbitration ?? "—",
154
+ r.durationMs === null ? "—" : formatDuration(r.durationMs),
155
+ ];
156
+ });
157
+ const widths = header.map((h, i) => Math.max(stripAnsi(h).length, ...cells.map((row) => stripAnsi(row[i] ?? "").length)));
158
+ const format = (row) => row.map((cell, i) => (i === row.length - 1 ? cell : cell.padEnd(widths[i] ?? 0, " "))).join(" ");
159
+ return [c.dim(format(header)), ...cells.map((row) => format(row))];
160
+ }
161
+ function stripAnsi(text) {
162
+ // ANSI SGR codes only — what `c` emits above.
163
+ const SGR = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, "g");
164
+ return text.replace(SGR, "");
165
+ }
166
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}