@sensigo/realm-cli 0.23.0 → 0.24.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.
@@ -1,18 +1,49 @@
1
1
  import { Command } from 'commander';
2
2
  import type { RunRecord, RunStore, FailedAttemptRecord, TraceBufferStore } from '@sensigo/realm';
3
+ /** One artifact `buildExportBundle` could not read (issue #186) — never silently omitted. */
4
+ export interface ExportArtifactError {
5
+ /** A human label for the artifact — the STORE owns the actual on-disk path/filename; the
6
+ * command never reconstructs one, matching this file's own no-filename-layout discipline. */
7
+ artifact: string;
8
+ /** The errno/FsIoError code, or `'UNKNOWN'` if the thrown value carried none. */
9
+ code: string;
10
+ message: string;
11
+ }
3
12
  export interface ExportBundle {
4
- realm_export_version: 1;
13
+ /**
14
+ * Bumped 1 → 2 (issue #186): a v1 bundle predates the `complete`/`artifact_errors` fields, so a
15
+ * v1 bundle's completeness is UNKNOWN to a reader — it was written back when export was
16
+ * all-or-nothing (any read failure meant no bundle at all), so v1's mere existence was itself a
17
+ * (weaker) completeness signal, but nothing in a v1 bundle states it explicitly. v2 always
18
+ * states it explicitly via `complete`.
19
+ */
20
+ realm_export_version: 2;
5
21
  /** ISO-8601, stamped by the CLI at assembly time. */
6
22
  exported_at: string;
7
23
  /** The full RunRecord — steps, evidence, skip_details, claims, etc. */
8
24
  run: RunRecord;
9
- /** Parsed failed-attempt records; `[]` if none were ever recorded for this run. */
25
+ /** Parsed failed-attempt records; `[]` if none were ever recorded for this run OR if the sidecar
26
+ * read failed (see `artifact_errors` — the empty array does not by itself mean "none recorded"
27
+ * in that case; check `complete` first). */
10
28
  attempts: FailedAttemptRecord[];
11
29
  /** True if the run hit the failed-attempt sidecar's 256KB ceiling — later attempts were dropped
12
- * at write time (append-and-stop), so `attempts` is NOT exhaustive. */
30
+ * at write time (append-and-stop), so `attempts` is NOT exhaustive. Independent of `complete`:
31
+ * a sidecar can be BOTH fully readable AND capped (a known, positively-characterized
32
+ * truncation) — that is a different signal from a read that failed outright. */
13
33
  attempts_capped: boolean;
14
- /** `{ <stepId>: [...] }` — every buffered/WAL entry for the run, across all steps; `{}` if none. */
34
+ /** `{ <stepId>: [...] }` — every buffered/WAL entry for the run, across all steps; `{}` if none
35
+ * OR if the WAL read failed (see `artifact_errors` — check `complete` first). */
15
36
  wal: Record<string, unknown[]>;
37
+ /**
38
+ * False iff any artifact below (`attempts`/`wal`) could not be read (issue #186) — a real I/O
39
+ * failure, not a genuine ENOENT absence (an absent artifact is legitimately `[]`/`{}` and
40
+ * `complete: true`). The bundle NEVER lies by omission: every readable artifact is still
41
+ * written, and the run record itself is always present when `complete` is `false` (a run-record
42
+ * read failure means no bundle is written at all — see `buildExportBundle`).
43
+ */
44
+ complete: boolean;
45
+ /** The artifacts that failed to read; always `[]` when `complete` is `true`. */
46
+ artifact_errors: ExportArtifactError[];
16
47
  }
17
48
  export interface ExportRunResult {
18
49
  bundle: ExportBundle;
@@ -39,6 +70,15 @@ export interface ExportStores {
39
70
  * Assembles the export bundle for `runId` from each store's existing read methods — never writes,
40
71
  * never locks, never touches `runsDir`. Throws `STATE_RUN_NOT_FOUND` (propagated from
41
72
  * `runStore.get`) for a nonexistent run; the CLI action maps that to an error message + exit(1).
73
+ *
74
+ * issue #186 — graceful degradation, never all-or-nothing: `run` is the bundle's core, so a
75
+ * failure reading IT propagates (there is genuinely nothing to hand off — no bundle at all). But
76
+ * `attempts` and `wal` are each read in their OWN try/catch: a real I/O failure on either (post
77
+ * #183, `failedAttemptStore.read`/`traceBufferStore.readAllForRun` throw on a genuine I/O error,
78
+ * not just a benign ENOENT-absence, which still legitimately yields `[]`/`{}`) substitutes the
79
+ * empty value, records the failure in `artifact_errors`, and the OTHER artifact is still
80
+ * attempted — the bundle self-describes its own incompleteness via `complete` instead of
81
+ * disappearing entirely.
42
82
  */
43
83
  export declare function buildExportBundle(runId: string, stores: ExportStores, now?: Date): Promise<ExportRunResult>;
44
84
  export interface ResolveExportPathOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGjG,MAAM,WAAW,YAAY;IAC3B,oBAAoB,EAAE,CAAC,CAAC;IACxB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,GAAG,EAAE,SAAS,CAAC;IACf,mFAAmF;IACnF,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;4EACwE;IACxE,eAAe,EAAE,OAAO,CAAC;IACzB,oGAAoG;IACpG,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChC,kBAAkB,EAAE;QAClB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACnF,CAAC;IACF,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;CAC3D;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,eAAe,CAAC,CAoB1B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAqCxE;AAQD,eAAO,MAAM,aAAa,SA2CtB,CAAC"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGjG,6FAA6F;AAC7F,MAAM,WAAW,mBAAmB;IAClC;kGAC8F;IAC9F,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,oBAAoB,EAAE,CAAC,CAAC;IACxB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,GAAG,EAAE,SAAS,CAAC;IACf;;iDAE6C;IAC7C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;qFAGiF;IACjF,eAAe,EAAE,OAAO,CAAC;IACzB;sFACkF;IAClF,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/B;;;;;;OAMG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,eAAe,EAAE,mBAAmB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAChC,kBAAkB,EAAE;QAClB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACnF,CAAC;IACF,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;CAC3D;AASD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,eAAe,CAAC,CA+C1B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAqCxE;AAQD,eAAO,MAAM,aAAa,SA4DtB,CAAC"}
@@ -20,23 +20,65 @@ import { existsSync, statSync } from 'node:fs';
20
20
  import { writeFile } from 'node:fs/promises';
21
21
  import { join, resolve, sep } from 'node:path';
22
22
  import { Command } from 'commander';
23
- import { WorkflowError, isTerminalPhase } from '@sensigo/realm';
23
+ import { WorkflowError, isTerminalPhase, FsIoError } from '@sensigo/realm';
24
+ /** Extracts an errno/FsIoError code from a thrown value; `'UNKNOWN'` if it carries none. */
25
+ function errnoCodeOf(err) {
26
+ if (err instanceof FsIoError)
27
+ return err.code;
28
+ const code = err?.code;
29
+ return typeof code === 'string' ? code : 'UNKNOWN';
30
+ }
24
31
  /**
25
32
  * Assembles the export bundle for `runId` from each store's existing read methods — never writes,
26
33
  * never locks, never touches `runsDir`. Throws `STATE_RUN_NOT_FOUND` (propagated from
27
34
  * `runStore.get`) for a nonexistent run; the CLI action maps that to an error message + exit(1).
35
+ *
36
+ * issue #186 — graceful degradation, never all-or-nothing: `run` is the bundle's core, so a
37
+ * failure reading IT propagates (there is genuinely nothing to hand off — no bundle at all). But
38
+ * `attempts` and `wal` are each read in their OWN try/catch: a real I/O failure on either (post
39
+ * #183, `failedAttemptStore.read`/`traceBufferStore.readAllForRun` throw on a genuine I/O error,
40
+ * not just a benign ENOENT-absence, which still legitimately yields `[]`/`{}`) substitutes the
41
+ * empty value, records the failure in `artifact_errors`, and the OTHER artifact is still
42
+ * attempted — the bundle self-describes its own incompleteness via `complete` instead of
43
+ * disappearing entirely.
28
44
  */
29
45
  export async function buildExportBundle(runId, stores, now = new Date()) {
30
46
  const run = await stores.runStore.get(runId);
31
- const { records: attempts, capped: attemptsCapped } = await stores.failedAttemptStore.read(runId);
32
- const wal = await stores.traceBufferStore.readAllForRun(runId);
47
+ const artifactErrors = [];
48
+ let attempts = [];
49
+ let attemptsCapped = false;
50
+ try {
51
+ const result = await stores.failedAttemptStore.read(runId);
52
+ attempts = result.records;
53
+ attemptsCapped = result.capped;
54
+ }
55
+ catch (err) {
56
+ artifactErrors.push({
57
+ artifact: 'failed-attempt sidecar',
58
+ code: errnoCodeOf(err),
59
+ message: err instanceof Error ? err.message : String(err),
60
+ });
61
+ }
62
+ let wal = {};
63
+ try {
64
+ wal = await stores.traceBufferStore.readAllForRun(runId);
65
+ }
66
+ catch (err) {
67
+ artifactErrors.push({
68
+ artifact: 'trace-buffer WAL',
69
+ code: errnoCodeOf(err),
70
+ message: err instanceof Error ? err.message : String(err),
71
+ });
72
+ }
33
73
  const bundle = {
34
- realm_export_version: 1,
74
+ realm_export_version: 2,
35
75
  exported_at: now.toISOString(),
36
76
  run,
37
77
  attempts,
38
78
  attempts_capped: attemptsCapped,
39
79
  wal,
80
+ complete: artifactErrors.length === 0,
81
+ artifact_errors: artifactErrors,
40
82
  };
41
83
  const warning = !isTerminalPhase(run.run_phase)
42
84
  ? `best-effort snapshot: run '${runId}' is still ${run.run_phase}; its artifacts are read at ` +
@@ -119,6 +161,18 @@ export const exportCommand = new Command('export')
119
161
  const target = resolveExportPath({ runId, out: opts.out, runsDir });
120
162
  const json = JSON.stringify(bundle, null, 2);
121
163
  await writeFile(target, json, 'utf8');
164
+ // issue #186: an incomplete bundle is still written (for recovery) but never reported as a
165
+ // plain success — the exit code carries the signal for CI/scripts, and the operator sees
166
+ // exactly which artifact(s) failed and why. No --allow-incomplete flag: honesty here is not
167
+ // opt-in.
168
+ if (!bundle.complete) {
169
+ console.error(`⚠ INCOMPLETE export: ${bundle.artifact_errors.length} artifact(s) could not be read`);
170
+ for (const e of bundle.artifact_errors) {
171
+ console.error(` ✗ ${e.artifact} (${e.code}): ${e.message}`);
172
+ }
173
+ console.error(`The bundle was still written to '${target}' — inspect it for what could be recovered.`);
174
+ process.exit(1);
175
+ }
122
176
  const walStepCount = Object.keys(bundle.wal).length;
123
177
  console.log(`Exported run '${runId}' to '${target}' (${formatBytes(Buffer.byteLength(json))}).\n` +
124
178
  ` phase: ${bundle.run.run_phase}, attempts: ${bundle.attempts.length}, WAL steps: ${walStepCount}`);
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Command } from 'commander';
2
+ import type { OrphanSweepableStore } from '@sensigo/realm';
2
3
  export interface SweepOrphansOptions {
3
4
  /** Minimum age (ms) a `.tmp` must have to be reaped. Rejected below `FLOOR_MS` — see above. */
4
5
  olderThanMs: number;
@@ -43,5 +44,54 @@ export interface SweepOrphansResult {
43
44
  * `unlink`ed — success → `reaped`; ENOENT → `already_gone`; anything else → `failed`.
44
45
  */
45
46
  export declare function sweepOrphans(runsDir: string, options: SweepOrphansOptions): Promise<SweepOrphansResult>;
47
+ /** One orphan artifact's outcome in a sweep report — carries the runId alongside the path so an
48
+ * operator can correlate a reaped file back to which run it belonged to. */
49
+ export interface OrphanArtifactEntry {
50
+ path: string;
51
+ runId: string;
52
+ }
53
+ export interface OrphanArtifactSweepResult {
54
+ /** Reaped (force mode) or would-be-reaped (dry-run) artifacts. */
55
+ reaped: OrphanArtifactEntry[];
56
+ /** A candidate vanished on its own (unlink hit ENOENT) — benign, never a failure. */
57
+ already_gone: OrphanArtifactEntry[];
58
+ /** A genuine delete failure (permissions, I/O) — loud, never silently swallowed. */
59
+ failed: Array<{
60
+ path: string;
61
+ runId: string;
62
+ error: string;
63
+ }>;
64
+ }
65
+ /**
66
+ * Reaps run-less orphaned WAL/sidecar artifacts (issue #163) — the second sweep behind
67
+ * `realm run gc`. `stores` is every `OrphanSweepableStore` gc knows about (today:
68
+ * `JsonTraceBufferStore`, `FailedAttemptStore`); `liveRunIds` is the caller's ALREADY-COMPUTED
69
+ * `JsonFileStore.listRunIds()` result (computed once, shared across every store, and — this is
70
+ * load-bearing — the caller's responsibility to have fail-closed on: see the CLI action for why
71
+ * this function never calls `listRunIds()` itself).
72
+ *
73
+ * **The floor is the create-temp-window guard.** `append_trace` calls `runStore.get(runId)`
74
+ * BEFORE ever writing a WAL entry, so a WAL's `<runId>.json` provably existed at WAL-creation
75
+ * time and exists for the run's entire life (see this module's own header for the full
76
+ * correctness backbone). The ONLY way "artifact present, run file absent" can be true for a
77
+ * FRESH run is the sub-second window between the run file being written as a temp
78
+ * (`<id>.json.<pid>.tmp`) and its atomic rename to `<id>.json` — during which `listRunIds()`
79
+ * would not yet see it. `FLOOR_MS` (1h) dwarfs that window by many orders of magnitude, so a
80
+ * fresh in-flight run's WAL is always younger than the floor and never selected; a WAL/sidecar
81
+ * OLDER than the floor with no matching run file is genuinely run-less.
82
+ *
83
+ * Each `OrphanSweepableStore.listOrphans()` call is fail-closed BY THE STORE'S OWN CONTRACT (see
84
+ * `orphan-sweepable-store.ts`) — a non-ENOENT enumeration/stat failure throws, propagating out of
85
+ * THIS function too (uncaught here, deliberately): this sweep has nothing safe to report if it
86
+ * cannot trust what "orphaned" even means for that store, so it aborts entirely rather than
87
+ * reaping a partial, possibly-wrong candidate set.
88
+ */
89
+ export declare function sweepOrphanArtifacts(stores: readonly OrphanSweepableStore[], liveRunIds: ReadonlySet<string>, options: SweepOrphansOptions): Promise<OrphanArtifactSweepResult>;
90
+ /** gc's exit code: non-zero iff gc could not complete a sweep it attempted (issue #163
91
+ * exit-code correction). A failed unlink in EITHER sweep, OR an aborted orphan sweep
92
+ * (enumeration failed — `artifactSweepError` set), is a failure. Merely *finding* reapable
93
+ * residue is NOT — that holds in both dry-run and `--force`, so this one helper decides both
94
+ * branches' exit code instead of each re-deriving its own (inline) predicate. */
95
+ export declare function gcExitCode(tempResult: SweepOrphansResult, artifactResult: OrphanArtifactSweepResult | undefined, artifactSweepError: string | undefined): number;
46
96
  export declare const gcCommand: Command;
47
97
  //# sourceMappingURL=gc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../../src/commands/gc.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,MAAM,WAAW,mBAAmB;IAClC,+FAA+F;IAC/F,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,8FAA8F;IAC9F,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;;wFAEoF;IACpF,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAuBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAsE7B;AA+DD,eAAO,MAAM,SAAS,SAwDlB,CAAC"}
1
+ {"version":3,"file":"gc.d.ts","sourceRoot":"","sources":["../../src/commands/gc.ts"],"names":[],"mappings":"AAiCA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,oBAAoB,EAAkB,MAAM,gBAAgB,CAAC;AAiC3E,MAAM,WAAW,mBAAmB;IAClC,+FAA+F;IAC/F,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,8FAA8F;IAC9F,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;;wFAEoF;IACpF,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAuBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA0D7B;AAED;6EAC6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,kEAAkE;IAClE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,qFAAqF;IACrF,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,oFAAoF;IACpF,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,oBAAoB,EAAE,EACvC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAC/B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,yBAAyB,CAAC,CA2CpC;AAqHD;;;;kFAIkF;AAClF,wBAAgB,UAAU,CACxB,UAAU,EAAE,kBAAkB,EAC9B,cAAc,EAAE,yBAAyB,GAAG,SAAS,EACrD,kBAAkB,EAAE,MAAM,GAAG,SAAS,GACrC,MAAM,CAMR;AAED,eAAO,MAAM,SAAS,SAuGlB,CAAC"}
@@ -1,5 +1,7 @@
1
- // gc command — sweep orphaned atomic-write temps (issue #160, Phase 1: .tmp only).
1
+ // gc command — sweep orphaned atomic-write temps (issue #160) AND run-less orphaned WAL/sidecar
2
+ // artifacts (issue #163). One operator command, two independent sweeps, same flags.
2
3
  //
4
+ // --- Sweep 1: atomic-write temps (issue #160, Phase 1: .tmp only) ---
3
5
  // atomicWriteFile (packages/core/src/store/atomic-write.ts) writes a unique sibling temp
4
6
  // (`${path}.<pid>.<counter>.tmp`) then POSIX-renames it over the target. A process dying between
5
7
  // the write and the rename orphans that temp forever — it is not runId-keyed for the key-pointer
@@ -14,23 +16,49 @@
14
16
  // torn file). Combined with the 1h floor below, an in-flight write's temp (age ≪ floor) is never
15
17
  // even selected.
16
18
  //
17
- // Phase 1 = `.tmp` only. `.lock` reaping is deliberately split to #164 (deferred — proper-lockfile
18
- // self-heals a live-path lock; only a purged-target's lock lingers, which is negligible). Run-less
19
- // `trace-buffer-*.jsonl` WAL cleanup is #163. Neither is this command's jobsee the report footer.
19
+ // --- Sweep 2: run-less orphaned WAL/sidecar artifacts (issue #163) ---
20
+ // #163 was ORIGINALLY filed on a premise that does not hold: it claimed a WAL could orphan
21
+ // "between WAL-create and run-file-create." That path does not exist`append_trace` calls
22
+ // `runStore.get(runId)` FIRST, so a WAL's `<runId>.json` provably existed at WAL-creation time and
23
+ // exists for the run's ENTIRE life. "Artifact present, run file absent" is therefore only true
24
+ // AFTER the run file has been deleted (a pre-#183 purge, a manual `rm`, disk corruption) or DURING
25
+ // the sub-second atomic-write temp-rename window (the run file is a `<id>.json.<pid>.tmp`, not yet
26
+ // renamed). This is remediation for the rare/residual case, not a rescue for an ongoing leak — the
27
+ // git history shows the pre-#183/#184 orphan-manufacturing window was ~48h and opt-in.
28
+ //
29
+ // `.lock` reaping is deliberately split to #164 (deferred — proper-lockfile self-heals a live-path
30
+ // lock; only a purged-target's lock lingers, which is negligible). Neither is this command's job
31
+ // yet — see the report footer.
20
32
  import { readdir, lstat, unlink, stat } from 'node:fs/promises';
21
33
  import { join } from 'node:path';
22
34
  import { Command } from 'commander';
23
- import { WorkflowError } from '@sensigo/realm';
35
+ import { WorkflowError, deleteIfExists } from '@sensigo/realm';
24
36
  import { parseDuration } from '../lib/parse-duration.js';
25
37
  /**
26
- * Minimum `--older-than` the sweep will ever honor (1 hour) — a conservative floor for hygiene of
27
- * non-urgent crash residue, and, forward-consistency-wise, the safety guard the deferred `.lock`
28
- * reaping (#164) will also require; enforcing it here means #164 inherits an already-tested guard.
29
- * Temps themselves are safe to reap at any age past a few seconds (see the module doc above) — this
30
- * floor is conservatism, not the temp-safety mechanism. Module-private: the only way to reach a
31
- * delete is through `sweepOrphans`, which checks this FIRST, before any filesystem access.
38
+ * Minimum `--older-than` EITHER sweep will ever honor (1 hour) — a conservative floor for hygiene
39
+ * of non-urgent crash residue, and, forward-consistency-wise, the safety guard the deferred
40
+ * `.lock` reaping (#164) will also require; enforcing it here means #164 inherits an
41
+ * already-tested guard. Temps themselves are safe to reap at any age past a few seconds (see the
42
+ * module doc above); a run-less WAL/sidecar past this floor is genuinely orphaned, not merely
43
+ * in-flight (see `sweepOrphanArtifacts`'s own doc for why the floor is exactly the create-window
44
+ * guard there) — either way this floor is conservatism, not the per-sweep safety mechanism.
45
+ * Module-private: the only way to reach a delete in EITHER sweep is through `assertOlderThanFloor`,
46
+ * checked FIRST, before any filesystem access.
32
47
  */
33
48
  const FLOOR_MS = 3_600_000;
49
+ /** Shared floor guard for both sweeps — checked before any filesystem access in either. */
50
+ function assertOlderThanFloor(olderThanMs, subject) {
51
+ if (olderThanMs < FLOOR_MS) {
52
+ throw new WorkflowError(`--older-than must resolve to at least 1h (got ${olderThanMs}ms) — gc refuses to reap ` +
53
+ `${subject} younger than that, even with --force.`, {
54
+ code: 'VALIDATION_INPUT_SCHEMA',
55
+ category: 'VALIDATION',
56
+ agentAction: 'provide_input',
57
+ retryable: false,
58
+ details: { olderThanMs, floorMs: FLOOR_MS },
59
+ });
60
+ }
61
+ }
34
62
  /**
35
63
  * Every top-level `*.tmp` in `runsDir`, plus one level of recursion into `runsDir/keys/*.tmp` —
36
64
  * `keys/` is the ONLY subdirectory any store ever creates in `runsDir` (verified: `JsonFileStore`'s
@@ -72,16 +100,7 @@ async function findTempCandidates(runsDir) {
72
100
  * `unlink`ed — success → `reaped`; ENOENT → `already_gone`; anything else → `failed`.
73
101
  */
74
102
  export async function sweepOrphans(runsDir, options) {
75
- if (options.olderThanMs < FLOOR_MS) {
76
- throw new WorkflowError(`--older-than must resolve to at least 1h (got ${options.olderThanMs}ms) — gc refuses to ` +
77
- `reap crash residue younger than that, even with --force.`, {
78
- code: 'VALIDATION_INPUT_SCHEMA',
79
- category: 'VALIDATION',
80
- agentAction: 'provide_input',
81
- retryable: false,
82
- details: { olderThanMs: options.olderThanMs, floorMs: FLOOR_MS },
83
- });
84
- }
103
+ assertOlderThanFloor(options.olderThanMs, 'crash residue');
85
104
  const now = options.now ?? new Date();
86
105
  const candidatePaths = await findTempCandidates(runsDir);
87
106
  const result = { reaped: [], already_gone: [], failed: [] };
@@ -136,6 +155,70 @@ export async function sweepOrphans(runsDir, options) {
136
155
  }
137
156
  return result;
138
157
  }
158
+ /**
159
+ * Reaps run-less orphaned WAL/sidecar artifacts (issue #163) — the second sweep behind
160
+ * `realm run gc`. `stores` is every `OrphanSweepableStore` gc knows about (today:
161
+ * `JsonTraceBufferStore`, `FailedAttemptStore`); `liveRunIds` is the caller's ALREADY-COMPUTED
162
+ * `JsonFileStore.listRunIds()` result (computed once, shared across every store, and — this is
163
+ * load-bearing — the caller's responsibility to have fail-closed on: see the CLI action for why
164
+ * this function never calls `listRunIds()` itself).
165
+ *
166
+ * **The floor is the create-temp-window guard.** `append_trace` calls `runStore.get(runId)`
167
+ * BEFORE ever writing a WAL entry, so a WAL's `<runId>.json` provably existed at WAL-creation
168
+ * time and exists for the run's entire life (see this module's own header for the full
169
+ * correctness backbone). The ONLY way "artifact present, run file absent" can be true for a
170
+ * FRESH run is the sub-second window between the run file being written as a temp
171
+ * (`<id>.json.<pid>.tmp`) and its atomic rename to `<id>.json` — during which `listRunIds()`
172
+ * would not yet see it. `FLOOR_MS` (1h) dwarfs that window by many orders of magnitude, so a
173
+ * fresh in-flight run's WAL is always younger than the floor and never selected; a WAL/sidecar
174
+ * OLDER than the floor with no matching run file is genuinely run-less.
175
+ *
176
+ * Each `OrphanSweepableStore.listOrphans()` call is fail-closed BY THE STORE'S OWN CONTRACT (see
177
+ * `orphan-sweepable-store.ts`) — a non-ENOENT enumeration/stat failure throws, propagating out of
178
+ * THIS function too (uncaught here, deliberately): this sweep has nothing safe to report if it
179
+ * cannot trust what "orphaned" even means for that store, so it aborts entirely rather than
180
+ * reaping a partial, possibly-wrong candidate set.
181
+ */
182
+ export async function sweepOrphanArtifacts(stores, liveRunIds, options) {
183
+ assertOlderThanFloor(options.olderThanMs, 'orphaned artifacts');
184
+ const now = options.now ?? new Date();
185
+ const candidates = [];
186
+ for (const store of stores) {
187
+ candidates.push(...(await store.listOrphans(liveRunIds)));
188
+ }
189
+ const result = { reaped: [], already_gone: [], failed: [] };
190
+ const toReap = [];
191
+ for (const artifact of candidates) {
192
+ const ageMs = now.getTime() - artifact.mtimeMs;
193
+ if (ageMs < 0)
194
+ continue; // future mtime (clock skew) — skip, never reap
195
+ if (ageMs <= options.olderThanMs)
196
+ continue; // too fresh — the create-temp-window guard above
197
+ toReap.push(artifact);
198
+ }
199
+ if (options.dryRun) {
200
+ result.reaped = toReap.map((a) => ({ path: a.path, runId: a.runId }));
201
+ return result;
202
+ }
203
+ for (const artifact of toReap) {
204
+ const entry = { path: artifact.path, runId: artifact.runId };
205
+ try {
206
+ // #183 discipline: deleteIfExists resolves false (not an error) on ENOENT — already gone
207
+ // is success, never a failure; any other errno throws.
208
+ const didDelete = await deleteIfExists(artifact.path);
209
+ if (didDelete) {
210
+ result.reaped.push(entry);
211
+ }
212
+ else {
213
+ result.already_gone.push(entry);
214
+ }
215
+ }
216
+ catch (err) {
217
+ result.failed.push({ ...entry, error: err instanceof Error ? err.message : String(err) });
218
+ }
219
+ }
220
+ return result;
221
+ }
139
222
  /** Best-effort total bytes for a known list of paths — reporting-only, never gates reaping.
140
223
  * Called against a fresh dry-run preview, so the paths are still on disk when stat'd. */
141
224
  async function statPathBytes(paths) {
@@ -159,12 +242,21 @@ function formatBytes(n) {
159
242
  return `${(n / (1024 * 1024)).toFixed(1)} MB`;
160
243
  }
161
244
  /** So an operator doesn't distrust the tool when `runsDir` still holds residue gc deliberately
162
- * does not touch — printed on every report, dry-run or force, empty or not. */
163
- const NOT_REAPED_FOOTER = 'gc does NOT reap orphaned .lock dirs (deferred issue #164) or run-less trace-buffer-*.jsonl ' +
164
- 'WAL files (issue #163). Their presence in runsDir is expected and not a sign gc is broken.';
245
+ * does not touch — printed on every report, dry-run or force, empty or not. issue #163: WALs and
246
+ * failed-attempt sidecars are now reaped (the second sweep above) only `.lock` dirs remain
247
+ * deferred (issue #164). */
248
+ const NOT_REAPED_FOOTER = 'gc does NOT yet reap orphaned .lock dirs (deferred — issue #164). Their presence in runsDir ' +
249
+ 'is expected and not a sign gc is broken.';
165
250
  /** Prints the dry-run / force report shared by both code paths. `previewBytes` always comes from
166
- * the initial (always non-destructive) preview pass — see the action below for why. */
167
- function printGcReport(result, previewBytes, dryRun) {
251
+ * the initial (always non-destructive) preview pass — see the action below for why.
252
+ *
253
+ * `artifactResult`/`artifactSweepError` are mutually exclusive (issue #163): a defined
254
+ * `artifactSweepError` means `listRunIds()` or a store's `listOrphans()` threw — the orphan
255
+ * sweep aborted loudly, reaping NOTHING, and there is no `artifactResult` to report. Both may be
256
+ * `undefined` only if the temp-only sweep somehow bypassed the orphan sweep entirely (never
257
+ * happens in the real CLI action — always one or the other).
258
+ */
259
+ function printGcReport(result, previewBytes, dryRun, artifactResult, artifactSweepError) {
168
260
  const nothingToReport = result.reaped.length === 0 && result.already_gone.length === 0 && result.failed.length === 0;
169
261
  if (nothingToReport) {
170
262
  console.log('No orphaned .tmp files found to reap.');
@@ -187,11 +279,54 @@ function printGcReport(result, previewBytes, dryRun) {
187
279
  if (dryRun && !nothingToReport) {
188
280
  console.log('\nRe-run with --force to actually delete.');
189
281
  }
282
+ // --- orphan-artifacts section (issue #163) ---
283
+ if (artifactSweepError !== undefined) {
284
+ console.error(`\n✗ orphan-artifact sweep ABORTED (reaped nothing from it): ${artifactSweepError}`);
285
+ }
286
+ else if (artifactResult !== undefined) {
287
+ const nothingToReportArtifacts = artifactResult.reaped.length === 0 &&
288
+ artifactResult.already_gone.length === 0 &&
289
+ artifactResult.failed.length === 0;
290
+ if (nothingToReportArtifacts) {
291
+ console.log('\nNo run-less orphaned WAL/sidecar artifacts found to reap.');
292
+ }
293
+ else if (dryRun) {
294
+ console.log(`\n${artifactResult.reaped.length} run-less orphaned artifact(s) WOULD be reaped:`);
295
+ for (const a of artifactResult.reaped)
296
+ console.log(` • ${a.path} (run ${a.runId})`);
297
+ if (artifactResult.already_gone.length > 0) {
298
+ console.log(`(${artifactResult.already_gone.length} candidate(s) already vanished on their own.)`);
299
+ }
300
+ }
301
+ else {
302
+ console.log(`\nReaped ${artifactResult.reaped.length} run-less orphaned artifact(s). ` +
303
+ `${artifactResult.already_gone.length} already gone, ${artifactResult.failed.length} failed.`);
304
+ for (const a of artifactResult.reaped)
305
+ console.log(` • ${a.path} (run ${a.runId})`);
306
+ }
307
+ for (const f of artifactResult.failed) {
308
+ console.error(` ✗ ${f.path} (run ${f.runId}): ${f.error}`);
309
+ }
310
+ if (dryRun && !nothingToReportArtifacts) {
311
+ console.log('Re-run with --force to actually delete.');
312
+ }
313
+ }
190
314
  console.log(`\n${NOT_REAPED_FOOTER}`);
191
315
  }
316
+ /** gc's exit code: non-zero iff gc could not complete a sweep it attempted (issue #163
317
+ * exit-code correction). A failed unlink in EITHER sweep, OR an aborted orphan sweep
318
+ * (enumeration failed — `artifactSweepError` set), is a failure. Merely *finding* reapable
319
+ * residue is NOT — that holds in both dry-run and `--force`, so this one helper decides both
320
+ * branches' exit code instead of each re-deriving its own (inline) predicate. */
321
+ export function gcExitCode(tempResult, artifactResult, artifactSweepError) {
322
+ const anyFailure = tempResult.failed.length > 0 ||
323
+ (artifactResult?.failed.length ?? 0) > 0 ||
324
+ artifactSweepError !== undefined;
325
+ return anyFailure ? 1 : 0;
326
+ }
192
327
  export const gcCommand = new Command('gc')
193
- .description('Sweep orphaned atomic-write .tmp files crash residue from a process that died mid-write (dry-run by default)')
194
- .requiredOption('--older-than <duration>', 'Reap temps idle at least this long (minimum 1h; e.g. 1h, 6h, 30d)')
328
+ .description('Sweep orphaned atomic-write .tmp files and run-less orphaned WAL/sidecar artifacts (dry-run by default)')
329
+ .requiredOption('--older-than <duration>', 'Reap residue idle at least this long (minimum 1h; e.g. 1h, 6h, 30d)')
195
330
  .option('--force', 'Actually delete (without this, gc only reports what WOULD be reaped)')
196
331
  .action(async (opts) => {
197
332
  let olderThanMs;
@@ -203,16 +338,22 @@ export const gcCommand = new Command('gc')
203
338
  process.exit(1);
204
339
  return;
205
340
  }
206
- // Defense-in-depth over sweepOrphans's own floor check — reject before touching the
207
- // filesystem at all, with a CLI-friendly message naming the flag the operator just typed.
341
+ // Defense-in-depth over sweepOrphans's/sweepOrphanArtifacts's own floor checks — reject
342
+ // before touching the filesystem at all, with a CLI-friendly message naming the flag the
343
+ // operator just typed.
208
344
  if (olderThanMs < FLOOR_MS) {
209
345
  console.error(`--older-than must be at least 1h (got '${opts.olderThan}'). gc refuses to reap crash ` +
210
346
  `residue younger than that, even with --force.`);
211
347
  process.exit(1);
212
348
  return;
213
349
  }
214
- const { JsonFileStore } = await import('@sensigo/realm');
215
- const runsDir = new JsonFileStore().runsDirPath;
350
+ const { JsonFileStore, FailedAttemptStore } = await import('@sensigo/realm');
351
+ const { JsonTraceBufferStore } = await import('@sensigo/realm-mcp');
352
+ const runStore = new JsonFileStore();
353
+ const runsDir = runStore.runsDirPath;
354
+ const failedAttemptStore = new FailedAttemptStore(runsDir);
355
+ const traceBufferStore = new JsonTraceBufferStore(runsDir);
356
+ const orphanSweepableStores = [traceBufferStore, failedAttemptStore];
216
357
  const now = new Date();
217
358
  try {
218
359
  // Always preview first — this NEVER mutates, in either mode — because it is the only
@@ -223,14 +364,53 @@ export const gcCommand = new Command('gc')
223
364
  // already_gone exists to absorb.
224
365
  const preview = await sweepOrphans(runsDir, { olderThanMs, dryRun: true, now });
225
366
  const bytes = await statPathBytes(preview.reaped);
367
+ // issue #163: FAIL-CLOSED. A `listRunIds()` (or a store's `listOrphans()`) failure aborts
368
+ // ONLY the orphan-artifact sweep, loudly — it must NEVER fabricate an empty `liveRunIds`,
369
+ // which would make every live run's artifacts look orphaned and reap them. The temp sweep
370
+ // above is fully independent of this and is completely unaffected either way.
371
+ let artifactPreview;
372
+ let artifactSweepError;
373
+ try {
374
+ const liveRunIds = await runStore.listRunIds();
375
+ artifactPreview = await sweepOrphanArtifacts(orphanSweepableStores, liveRunIds, {
376
+ olderThanMs,
377
+ dryRun: true,
378
+ now,
379
+ });
380
+ }
381
+ catch (err) {
382
+ artifactSweepError = err instanceof Error ? err.message : String(err);
383
+ }
226
384
  if (opts.force !== true) {
227
- printGcReport(preview, bytes, true);
385
+ printGcReport(preview, bytes, true, artifactPreview, artifactSweepError);
386
+ if (gcExitCode(preview, artifactPreview, artifactSweepError) !== 0) {
387
+ process.exit(1);
388
+ }
228
389
  return;
229
390
  }
230
391
  const result = await sweepOrphans(runsDir, { olderThanMs, dryRun: false, now });
231
- printGcReport(result, bytes, false);
232
- if (result.failed.length > 0)
392
+ let artifactResult;
393
+ if (artifactSweepError === undefined) {
394
+ // The preview above already proved listRunIds()/listOrphans() succeed — re-read for the
395
+ // real pass (a fresh liveRunIds, since force mode is a separate call; a run created or
396
+ // completed between the preview and here is a benign, narrow race — exactly the same
397
+ // shape the temp sweep's own preview/force split already accepts).
398
+ try {
399
+ const liveRunIds = await runStore.listRunIds();
400
+ artifactResult = await sweepOrphanArtifacts(orphanSweepableStores, liveRunIds, {
401
+ olderThanMs,
402
+ dryRun: false,
403
+ now,
404
+ });
405
+ }
406
+ catch (err) {
407
+ artifactSweepError = err instanceof Error ? err.message : String(err);
408
+ }
409
+ }
410
+ printGcReport(result, bytes, false, artifactResult, artifactSweepError);
411
+ if (gcExitCode(result, artifactResult, artifactSweepError) !== 0) {
233
412
  process.exit(1);
413
+ }
234
414
  }
235
415
  catch (err) {
236
416
  console.error(err instanceof Error ? err.message : String(err));
@@ -1 +1 @@
1
- {"version":3,"file":"gc.js","sourceRoot":"","sources":["../../src/commands/gc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gc.js","sourceRoot":"","sources":["../../src/commands/gc.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,16 @@ export interface PurgeRunsResult {
53
53
  purged: string[];
54
54
  /** Populated only when `dryRun` is false: a concurrent/prior purge had already removed it — never a failure. */
55
55
  already_purged: string[];
56
+ /**
57
+ * Populated only when `dryRun` is false (issue #184): the run could not be deleted right now
58
+ * because another writer holds its lock (`ELOCKED`), or because it is no longer terminal (a
59
+ * concurrent `realm resume` raced the purge) — `STATE_RUN_BUSY` from the anchor store. NEVER a
60
+ * failure: a live writer self-heals, and a stale lock is eventually stolen.
61
+ */
62
+ blocked: Array<{
63
+ runId: string;
64
+ reason: string;
65
+ }>;
56
66
  /** Populated only when `dryRun` is false: deletion genuinely failed. */
57
67
  failed: Array<{
58
68
  runId: string;
@@ -71,13 +81,20 @@ export interface PurgeRunsOptions {
71
81
  }
72
82
  /**
73
83
  * Selects eligible run(s) (single `runId` or a batch aged past `olderThan`), reports bytes and
74
- * resumability, and — when `dryRun` is false — deletes them via `artifactStores`, in the order
75
- * given (LOAD-BEARING: `runStore`, the `JsonFileStore` element, must be last see purge.ts's
76
- * command wiring and `purge-guard.test.ts`). Continue-on-error across the batch: a
77
- * `STATE_RUN_NOT_FOUND` hit while deleting (a concurrent purge already removed it) is bucketed as
78
- * `already_purged`, never `failed` a benign race must not be reported as a failure.
84
+ * resumability, and — when `dryRun` is false — deletes them. Deletion is anchor-structural (issue
85
+ * #184): every `artifactStores` entry (non-anchor stores only) must succeed BEFORE
86
+ * `anchorStore.deleteAllForRun` the `JsonFileStore` run file is ever called, and only on
87
+ * total success. Any throw before that point leaves the anchor (and therefore the run) intact
88
+ * the crash-anchor property is now structural (guaranteed by this function's control flow), not
89
+ * merely positional (an array-ordering convention a future edit could silently break — see
90
+ * `purge-guard.test.ts`'s ANCHOR checks for the source-text half of this guarantee).
91
+ *
92
+ * Continue-on-error across the batch: a `STATE_RUN_NOT_FOUND` hit while deleting (a concurrent
93
+ * purge already removed it) is bucketed as `already_purged`; a `STATE_RUN_BUSY` hit (another
94
+ * writer holds the lock, or the run was resumed since selection — issue #184) is bucketed as
95
+ * `blocked`; neither is ever a `failed`.
79
96
  */
80
- export declare function purgeRuns(options: PurgeRunsOptions, runStore: Pick<RunStore, 'get' | 'list'> & {
97
+ export declare function purgeRuns(options: PurgeRunsOptions, anchorStore: Pick<RunStore, 'get' | 'list'> & PerRunArtifactStore & {
81
98
  readonly runsDirPath: string;
82
99
  }, artifactStores: PerRunArtifactStore[]): Promise<PurgeRunsResult>;
83
100
  export declare const purgeCommand: Command;
@@ -1 +1 @@
1
- {"version":3,"file":"purge.d.ts","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAS/E,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC5D;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACtC,gBAAgB,CAiClB;AA+BD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,0EAA0E;IAC1E,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gHAAgH;IAChH,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,wEAAwE;IACxE,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC3E,cAAc,EAAE,mBAAmB,EAAE,GACpC,OAAO,CAAC,eAAe,CAAC,CAsF1B;AAuED,eAAO,MAAM,YAAY,SAoEtB,CAAC"}
1
+ {"version":3,"file":"purge.d.ts","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAS/E,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC5D;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACtC,gBAAgB,CAiClB;AA+BD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,0EAA0E;IAC1E,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,oEAAoE;IACpE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gHAAgH;IAChH,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;;;;;OAKG;IACH,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,wEAAwE;IACxE,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0FAA0F;IAC1F,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,EACzB,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,MAAM,CAAC,GACzC,mBAAmB,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACxD,cAAc,EAAE,mBAAmB,EAAE,GACpC,OAAO,CAAC,eAAe,CAAC,CAuG1B;AAoFD,eAAO,MAAM,YAAY,SAoEtB,CAAC"}
@@ -92,20 +92,27 @@ async function statMatchedBytes(runsDir, runId, dirEntries) {
92
92
  }
93
93
  /**
94
94
  * Selects eligible run(s) (single `runId` or a batch aged past `olderThan`), reports bytes and
95
- * resumability, and — when `dryRun` is false — deletes them via `artifactStores`, in the order
96
- * given (LOAD-BEARING: `runStore`, the `JsonFileStore` element, must be last see purge.ts's
97
- * command wiring and `purge-guard.test.ts`). Continue-on-error across the batch: a
98
- * `STATE_RUN_NOT_FOUND` hit while deleting (a concurrent purge already removed it) is bucketed as
99
- * `already_purged`, never `failed` a benign race must not be reported as a failure.
95
+ * resumability, and — when `dryRun` is false — deletes them. Deletion is anchor-structural (issue
96
+ * #184): every `artifactStores` entry (non-anchor stores only) must succeed BEFORE
97
+ * `anchorStore.deleteAllForRun` the `JsonFileStore` run file is ever called, and only on
98
+ * total success. Any throw before that point leaves the anchor (and therefore the run) intact
99
+ * the crash-anchor property is now structural (guaranteed by this function's control flow), not
100
+ * merely positional (an array-ordering convention a future edit could silently break — see
101
+ * `purge-guard.test.ts`'s ANCHOR checks for the source-text half of this guarantee).
102
+ *
103
+ * Continue-on-error across the batch: a `STATE_RUN_NOT_FOUND` hit while deleting (a concurrent
104
+ * purge already removed it) is bucketed as `already_purged`; a `STATE_RUN_BUSY` hit (another
105
+ * writer holds the lock, or the run was resumed since selection — issue #184) is bucketed as
106
+ * `blocked`; neither is ever a `failed`.
100
107
  */
101
- export async function purgeRuns(options, runStore, artifactStores) {
108
+ export async function purgeRuns(options, anchorStore, artifactStores) {
102
109
  const dryRun = options.dryRun ?? true;
103
110
  const now = new Date();
104
- const runsDir = runStore.runsDirPath;
111
+ const runsDir = anchorStore.runsDirPath;
105
112
  const candidates = [];
106
113
  const skipped = [];
107
114
  if (options.runId !== undefined) {
108
- const run = await runStore.get(options.runId);
115
+ const run = await anchorStore.get(options.runId);
109
116
  // explicit: true — the operator named this exact run, so a claim_unknown_age claim is an
110
117
  // eligible override, never a healthy one (issue #107 correction).
111
118
  const verdict = isPurgeEligible(run, { explicit: true, now });
@@ -118,7 +125,7 @@ export async function purgeRuns(options, runStore, artifactStores) {
118
125
  }
119
126
  else {
120
127
  const thresholdMs = options.olderThan !== undefined ? parseDuration(options.olderThan) : 0;
121
- const all = await runStore.list(options.workflow);
128
+ const all = await anchorStore.list(options.workflow);
122
129
  for (const run of all) {
123
130
  // explicit: false — a batch/cron sweep cannot prove an indeterminate-age claim's runner is
124
131
  // dead, so claim_unknown_age is refused here (skipped+warned below), not overridden.
@@ -157,7 +164,14 @@ export async function purgeRuns(options, runStore, artifactStores) {
157
164
  overriddenClaimStep,
158
165
  });
159
166
  }
160
- const result = { selected, skipped, purged: [], already_purged: [], failed: [] };
167
+ const result = {
168
+ selected,
169
+ skipped,
170
+ purged: [],
171
+ already_purged: [],
172
+ blocked: [],
173
+ failed: [],
174
+ };
161
175
  if (dryRun)
162
176
  return result;
163
177
  for (const { run } of selected) {
@@ -165,16 +179,27 @@ export async function purgeRuns(options, runStore, artifactStores) {
165
179
  // Re-check the run still exists immediately before deleting — closes the window against a
166
180
  // concurrent purge that already removed it between selection and here. A STATE_RUN_NOT_FOUND
167
181
  // surfacing here means "already gone," which the catch below routes to already_purged.
168
- await runStore.get(run.id);
182
+ await anchorStore.get(run.id);
169
183
  for (const store of artifactStores) {
170
184
  await store.deleteAllForRun(run.id, dirEntries);
171
185
  }
186
+ // The anchor LAST, and only on total success (issue #184) — structural crash-anchor: any
187
+ // throw above (from a non-anchor artifact store) never reaches this line, so the run file
188
+ // is guaranteed intact for re-enumeration on the next pass.
189
+ await anchorStore.deleteAllForRun(run.id, dirEntries);
172
190
  result.purged.push(run.id);
173
191
  }
174
192
  catch (err) {
175
193
  if (err instanceof WorkflowError && err.code === 'STATE_RUN_NOT_FOUND') {
176
194
  result.already_purged.push(run.id);
177
195
  }
196
+ else if (err instanceof WorkflowError && err.code === 'STATE_RUN_BUSY') {
197
+ const reason = err.details['reason'];
198
+ result.blocked.push({
199
+ runId: run.id,
200
+ reason: typeof reason === 'string' ? reason : err.message,
201
+ });
202
+ }
178
203
  else {
179
204
  result.failed.push({
180
205
  runId: run.id,
@@ -213,12 +238,14 @@ function printPurgeReport(result, dryRun) {
213
238
  console.log('No eligible runs found to purge.');
214
239
  return;
215
240
  }
216
- const totalBytes = result.selected.reduce((sum, c) => sum + c.bytes, 0);
217
241
  const resumableCount = result.selected.filter((c) => c.resumable).length;
218
242
  const resumableLine = `${resumableCount} of ${result.selected.length} selected run(s) ` +
219
243
  `${dryRun ? 'are' : 'were'} resumable via 'realm resume' — ` +
220
244
  `purging ${dryRun ? 'would destroy' : 'has destroyed'} that path ${dryRun ? 'permanently' : 'for them'}.`;
221
245
  if (dryRun) {
246
+ // Dry-run's "to free" total is a PROJECTION over every selected candidate — nothing has been
247
+ // purged yet, so the full selected total is the correct (and only sensible) figure here.
248
+ const totalBytes = result.selected.reduce((sum, c) => sum + c.bytes, 0);
222
249
  console.log(`${result.selected.length} run(s) WOULD be purged (${formatBytes(totalBytes)} to free):`);
223
250
  for (const c of result.selected) {
224
251
  const override = c.overriddenClaimStep !== undefined
@@ -229,13 +256,23 @@ function printPurgeReport(result, dryRun) {
229
256
  console.log(`\n${resumableLine}\nRe-run with --force to actually delete.`);
230
257
  return;
231
258
  }
232
- console.log(`Purged ${result.purged.length}/${result.selected.length} run(s) (${formatBytes(totalBytes)} freed). ` +
233
- `${result.already_purged.length} already gone, ${result.failed.length} failed.`);
259
+ // issue #184: sum bytes over ACTUALLY-PURGED runs only — `selected` also includes candidates
260
+ // that ended up already_purged/blocked/failed, whose bytes were never actually freed. Summing
261
+ // over `selected` here would over-report "freed" bytes for anything but a 100%-successful batch.
262
+ const purgedIds = new Set(result.purged);
263
+ const freedBytes = result.selected
264
+ .filter((c) => purgedIds.has(c.run.id))
265
+ .reduce((sum, c) => sum + c.bytes, 0);
266
+ console.log(`Purged ${result.purged.length}/${result.selected.length} run(s) (${formatBytes(freedBytes)} freed). ` +
267
+ `${result.already_purged.length} already gone, ${result.blocked.length} blocked, ${result.failed.length} failed.`);
234
268
  for (const c of result.selected) {
235
269
  if (c.overriddenClaimStep !== undefined) {
236
270
  console.log(` ⚠ ${c.run.id}: ${overriddenClaimPhrase(c.overriddenClaimStep, false)}`);
237
271
  }
238
272
  }
273
+ for (const b of result.blocked) {
274
+ console.error(` ⚠ ${b.runId}: ${b.reason}`);
275
+ }
239
276
  for (const f of result.failed) {
240
277
  console.error(` ✗ ${f.runId}: ${f.error}`);
241
278
  }
@@ -266,14 +303,14 @@ export const purgeCommand = new Command('purge')
266
303
  const runsDir = runStore.runsDirPath;
267
304
  const failedAttemptStore = new FailedAttemptStore(runsDir);
268
305
  const traceBufferStore = new JsonTraceBufferStore(runsDir);
269
- // Orchestration order is LOAD-BEARING (issue #107): runStore MUST be last — a crash mid-purge
270
- // leaves the run record in place, so the run is re-enumerated and the purge is retried
271
- // idempotently. purge-guard.test.ts asserts this exact order via source-textdo not
272
- // reorder these three lines without updating that test.
306
+ // The crash-anchor is now STRUCTURAL, not positional (issue #184): runStore (JsonFileStore)
307
+ // is passed to purgeRuns as the separate anchorStore argument, and purgeRuns's own control
308
+ // flow guarantees it is only ever deleted after every entry below has succeeded it is
309
+ // deliberately ABSENT from this array. purge-guard.test.ts's ANCHOR check asserts this
310
+ // absence via source-text; do not re-add it here.
273
311
  const artifactStores = [
274
312
  traceBufferStore, // JsonTraceBufferStore
275
313
  failedAttemptStore, // FailedAttemptStore
276
- runStore, // JsonFileStore — LAST: crash-anchor (issue #107)
277
314
  ];
278
315
  const dryRun = opts.force !== true;
279
316
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"purge.js","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"purge.js","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,EAAE;AACF,4FAA4F;AAC5F,mGAAmG;AACnG,+FAA+F;AAC/F,+FAA+F;AAC/F,2FAA2F;AAC3F,EAAE;AACF,mGAAmG;AACnG,oGAAoG;AACpG,+FAA+F;AAC/F,qGAAqG;AACrG,sGAAsG;AACtG,qFAAqF;AACrF,iGAAiG;AACjG,iGAAiG;AACjG,qEAAqE;AACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAMzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAc,EACd,IAAuC;IAEvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC/D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EACJ,gDAAgD,YAAY,CAAC,IAAI,IAAI;gBACrE,cAAc,YAAY,CAAC,QAAQ,2CAA2C;SACjF,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC,CAAC;IAC5E,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;gBACL,QAAQ,EAAE,KAAK;gBACf,MAAM,EACJ,mDAAmD,eAAe,CAAC,IAAI,IAAI;oBAC3E,0FAA0F;oBAC1F,wBAAwB,GAAG,CAAC,EAAE,mCAAmC;aACpE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,gBAAgB,CAC7B,OAAe,EACf,KAAa,EACb,UAA6B;IAE7B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AA6CD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAyB,EACzB,WACwD,EACxD,cAAqC;IAErC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC;IAExC,MAAM,UAAU,GAAwE,EAAE,CAAC;IAC3F,MAAM,OAAO,GAA6C,EAAE,CAAC;IAE7D,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjD,yFAAyF;QACzF,kEAAkE;QAClE,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9D,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrD,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,2FAA2F;YAC3F,qFAAqF;YACrF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACtB,wFAAwF;gBACxF,sFAAsF;gBACtF,oBAAoB;gBACpB,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;YAClE,IAAI,MAAM,GAAG,WAAW;gBAAE,SAAS;YACnC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,gGAAgG;IAChG,qFAAqF;IACrF,IAAI,UAAoB,CAAC;IACzB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,UAAU,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,KAAK;YACL,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;YAC9C,mBAAmB;SACpB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAoB;QAC9B,QAAQ;QACR,OAAO;QACP,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,EAAE;QAClB,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACX,CAAC;IACF,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,0FAA0F;YAC1F,6FAA6F;YAC7F,uFAAuF;YACvF,MAAM,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAClD,CAAC;YACD,yFAAyF;YACzF,0FAA0F;YAC1F,4DAA4D;YAC5D,MAAM,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBACvE,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,GAAG,YAAY,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACzE,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACrC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;oBAClB,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO;iBAC1D,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,KAAK,EAAE,GAAG,CAAC,EAAE;oBACb,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAChD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,IAAY,EAAE,MAAe;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,OAAO,CACL,GAAG,IAAI,gDAAgD,IAAI,qCAAqC;QAChG,mFAAmF,CACpF,CAAC;AACJ,CAAC;AAED,kFAAkF;AAClF,SAAS,gBAAgB,CAAC,MAAuB,EAAE,MAAe;IAChE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,aAAa,GACjB,GAAG,cAAc,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,mBAAmB;QACjE,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,kCAAkC;QAC5D,WAAW,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,cAAc,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC;IAE5G,IAAI,MAAM,EAAE,CAAC;QACX,6FAA6F;QAC7F,yFAAyF;QACzF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,4BAA4B,WAAW,CAAC,UAAU,CAAC,YAAY,CACzF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,QAAQ,GACZ,CAAC,CAAC,mBAAmB,KAAK,SAAS;gBACjC,CAAC,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE;gBAC5D,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,aAAa,2CAA2C,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,6FAA6F;IAC7F,8FAA8F;IAC9F,iGAAiG;IACjG,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SACtC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CACT,UAAU,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY,WAAW,CAAC,UAAU,CAAC,WAAW;QACpG,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,kBAAkB,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,UAAU,CACpH,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CACV,wGAAwG,CACzG;KACA,QAAQ,CAAC,UAAU,EAAE,qEAAqE,CAAC;KAC3F,MAAM,CAAC,SAAS,EAAE,0EAA0E,CAAC;KAC7F,MAAM,CACL,yBAAyB,EACzB,kFAAkF,CACnF;KACA,MAAM,CAAC,iBAAiB,EAAE,wDAAwD,CAAC;KACnF,MAAM,CACL,KAAK,EACH,KAAyB,EACzB,IAAgE,EAChE,EAAE;IACF,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7E,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC;IACrC,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,gBAAgB,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC3D,4FAA4F;IAC5F,2FAA2F;IAC3F,wFAAwF;IACxF,uFAAuF;IACvF,kDAAkD;IAClD,MAAM,cAAc,GAA0B;QAC5C,gBAAgB,EAAE,uBAAuB;QACzC,kBAAkB,EAAE,qBAAqB;KAC1C,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,EACrE,QAAQ,EACR,cAAc,CACf,CAAC;QAEF,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,uFAAuF;YACvF,mDAAmD;YACnD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,cAAc,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,sBAAsB,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC;YAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CACF,CAAC"}
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import 'dotenv/config';
4
4
  import { Command } from 'commander';
5
5
  import { workflowCommands, runCommands, topLevelCommands } from './commands-registry.js';
6
6
  const program = new Command();
7
- program.name('realm').description('Realm workflow engine CLI').version('0.23.0');
7
+ program.name('realm').description('Realm workflow engine CLI').version('0.24.0');
8
8
  // realm workflow — operations on workflow definitions
9
9
  const workflowCmd = new Command('workflow').description('Manage workflow definitions');
10
10
  for (const cmd of workflowCommands)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sensigo/realm-cli",
3
- "version": "0.23.0",
3
+ "version": "0.24.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -61,9 +61,9 @@
61
61
  "vitest": "^4.1.0"
62
62
  },
63
63
  "dependencies": {
64
- "@sensigo/realm": "^0.23.0",
65
- "@sensigo/realm-mcp": "^0.23.0",
66
- "@sensigo/realm-testing": "^0.23.0",
64
+ "@sensigo/realm": "^0.24.0",
65
+ "@sensigo/realm-mcp": "^0.24.0",
66
+ "@sensigo/realm-testing": "^0.24.0",
67
67
  "@modelcontextprotocol/sdk": "1.29.0",
68
68
  "chalk": "^5.0.0",
69
69
  "commander": "^14.0.3",