@sensigo/realm-cli 0.15.0 → 0.16.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.
Files changed (38) hide show
  1. package/dist/agent/gate/slack-gate-notifier.d.ts +0 -8
  2. package/dist/agent/gate/slack-gate-notifier.d.ts.map +1 -1
  3. package/dist/agent/gate/slack-gate-notifier.js +66 -11
  4. package/dist/agent/gate/slack-gate-notifier.js.map +1 -1
  5. package/dist/agent/providers/agent-utils.d.ts +22 -4
  6. package/dist/agent/providers/agent-utils.d.ts.map +1 -1
  7. package/dist/agent/providers/agent-utils.js +106 -13
  8. package/dist/agent/providers/agent-utils.js.map +1 -1
  9. package/dist/agent/providers/anthropic-provider.d.ts.map +1 -1
  10. package/dist/agent/providers/anthropic-provider.js +93 -35
  11. package/dist/agent/providers/anthropic-provider.js.map +1 -1
  12. package/dist/agent/providers/openai-provider.d.ts.map +1 -1
  13. package/dist/agent/providers/openai-provider.js +20 -24
  14. package/dist/agent/providers/openai-provider.js.map +1 -1
  15. package/dist/agent/providers/openai-reasoning-provider.d.ts.map +1 -1
  16. package/dist/agent/providers/openai-reasoning-provider.js +18 -22
  17. package/dist/agent/providers/openai-reasoning-provider.js.map +1 -1
  18. package/dist/agent/run-agent.d.ts.map +1 -1
  19. package/dist/agent/run-agent.js +58 -6
  20. package/dist/agent/run-agent.js.map +1 -1
  21. package/dist/commands/list.d.ts.map +1 -1
  22. package/dist/commands/list.js +45 -2
  23. package/dist/commands/list.js.map +1 -1
  24. package/dist/commands/reclaim.d.ts +23 -0
  25. package/dist/commands/reclaim.d.ts.map +1 -0
  26. package/dist/commands/reclaim.js +224 -0
  27. package/dist/commands/reclaim.js.map +1 -0
  28. package/dist/commands/run.d.ts.map +1 -1
  29. package/dist/commands/run.js +7 -1
  30. package/dist/commands/run.js.map +1 -1
  31. package/dist/commands/validate.d.ts.map +1 -1
  32. package/dist/commands/validate.js +29 -3
  33. package/dist/commands/validate.js.map +1 -1
  34. package/dist/commands-registry.d.ts.map +1 -1
  35. package/dist/commands-registry.js +2 -0
  36. package/dist/commands-registry.js.map +1 -1
  37. package/dist/index.js +1 -1
  38. package/package.json +4 -4
@@ -0,0 +1,224 @@
1
+ // reclaim command — detect or recover an after-claim wedge (issue #101).
2
+ //
3
+ // Phase 1 (per-step): `realm run reclaim <run-id>` is a DRY-RUN; `--step <name> --force` reclaims one
4
+ // named claim (the ONLY way to override an unknown-age / non-idempotent / healthy claim, by explicit
5
+ // human judgment). Phase 2 (batch): `realm run reclaim --all [...]` auto-reclaims — DRY-RUN by
6
+ // default, `--force` to act — ONLY claims that are provably safe: author-declared `idempotent`,
7
+ // carrying a concrete past-deadline (`claim_stale`), non-gated. Everything else stays per-step-only.
8
+ import { Command } from 'commander';
9
+ /** Parses a duration string such as "30d", "6h", or "10m" into milliseconds.
10
+ * Mirrors cleanup.ts's private parseDuration (kept local — cleanup.ts is out of this PR's scope). */
11
+ function parseDuration(s) {
12
+ const match = /^(\d+)(d|h|m)$/.exec(s);
13
+ if (match === null) {
14
+ throw new Error(`Invalid duration '${s}'. Use format: <number>(d|h|m), e.g. 30d, 6h, 10m`);
15
+ }
16
+ const value = parseInt(match[1], 10);
17
+ const unit = match[2];
18
+ const multipliers = { d: 86_400_000, h: 3_600_000, m: 60_000 };
19
+ return value * multipliers[unit];
20
+ }
21
+ /**
22
+ * The SAFETY-CRITICAL selection rule for `--all` auto-reclaim (issue #101 Phase 2, §3).
23
+ * A claim is auto-reclaimable IFF ALL hold:
24
+ * 1. the run is non-terminal;
25
+ * 2. the step is an in-progress claim (guaranteed — `claim` comes from classifyInProgressClaims);
26
+ * 3. the claim carries a CONCRETE deadline that has passed — i.e. state === 'claim_stale'
27
+ * (never 'claim_unknown_age' [null/absent deadline] and never 'healthy' [within deadline]);
28
+ * 4. if `--older-than` is set, additionally (now − deadline) ≥ the grace margin;
29
+ * 5. the step is author-declared `idempotent: true` in the workflow definition;
30
+ * 6. the step is NOT the open gate.
31
+ * `--force` acts on exactly this set — it NEVER widens it to unknown-age / non-idempotent / healthy /
32
+ * gated claims (those remain per-step `--step <S> --force` only). A null/absent deadline is never
33
+ * past-deadline, so the finalizer crash-wedge (deadline: null ⇒ claim_unknown_age) is structurally
34
+ * excluded from the cron — intended, not a gap.
35
+ */
36
+ export function isAutoReclaimable(run, claim, stepDef, opts) {
37
+ if (run.terminal_state)
38
+ return false; // §3.1
39
+ if (claim.state !== 'claim_stale')
40
+ return false; // §3.3 + §3.4a — concrete deadline AND past it
41
+ if (claim.step === run.pending_gate?.step_name)
42
+ return false; // §3.6 — never the gated step
43
+ if (stepDef?.idempotent !== true)
44
+ return false; // §3.5 — requires the resolved definition
45
+ if (opts.olderThanMs !== undefined) {
46
+ // §3.4b — a null deadline is NEVER "old enough" (defensive; claim_stale already implies concrete).
47
+ if (claim.deadline === null)
48
+ return false;
49
+ if (opts.now - new Date(claim.deadline).getTime() < opts.olderThanMs)
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ export const reclaimCommand = new Command('reclaim')
55
+ .description('Detect or recover a wedged run (a step claimed but never settled)')
56
+ .argument('[run-id]', 'ID of the run to inspect (default) or reclaim; omit when using --all')
57
+ .option('--step <name>', 'Reclaim this specific in-progress claim (requires --force)')
58
+ .option('--force', 'Actually reclaim — re-drives the step(s); side effects may repeat')
59
+ .option('--all', 'Batch mode: auto-reclaim every idempotent, concrete-past-deadline, non-gated claim (dry-run without --force)')
60
+ .option('--workflow <id>', 'With --all: only consider runs of this workflow')
61
+ .option('--older-than <duration>', 'With --all: only claims past deadline by ≥ this (e.g. 30m, 6h)')
62
+ .action(async (runId, opts) => {
63
+ const { JsonFileStore, JsonWorkflowStore, reclaimStep, classifyInProgressClaims } = await import('@sensigo/realm');
64
+ const store = new JsonFileStore();
65
+ // Loud-fail on a store that cannot persist the claim clock (liveness recovery unavailable).
66
+ if (!store.persistsClaims) {
67
+ console.error('This store does not persist claims; liveness recovery is unavailable on this store.');
68
+ process.exit(1);
69
+ }
70
+ // ============================ Batch mode (Phase 2) ============================
71
+ if (opts.all === true) {
72
+ if (runId !== undefined) {
73
+ console.error('Cannot combine a <run-id> with --all. Use one or the other.');
74
+ process.exit(1);
75
+ }
76
+ if (opts.step !== undefined) {
77
+ console.error('--step is a per-run flag; it cannot be combined with --all.');
78
+ process.exit(1);
79
+ }
80
+ let olderThanMs;
81
+ if (opts.olderThan !== undefined) {
82
+ try {
83
+ olderThanMs = parseDuration(opts.olderThan);
84
+ }
85
+ catch (err) {
86
+ console.error(err instanceof Error ? err.message : String(err));
87
+ process.exit(1);
88
+ }
89
+ }
90
+ const workflowStore = new JsonWorkflowStore();
91
+ const now = Date.now();
92
+ const nowDate = new Date(now);
93
+ const selected = [];
94
+ try {
95
+ const runs = await store.list(opts.workflow);
96
+ for (const run of runs) {
97
+ if (run.terminal_state)
98
+ continue;
99
+ const claims = classifyInProgressClaims(run, nowDate);
100
+ if (claims.length === 0)
101
+ continue;
102
+ // Resolve the definition to read the `idempotent` hint. Unresolvable → cannot confirm
103
+ // idempotent → exclude every claim (safe: never auto-reclaim an unverifiable step).
104
+ const def = await workflowStore.get(run.workflow_id).catch(() => undefined);
105
+ for (const claim of claims) {
106
+ const stepDef = def?.steps[claim.step];
107
+ const selOpts = olderThanMs !== undefined ? { olderThanMs, now } : { now };
108
+ if (isAutoReclaimable(run, claim, stepDef, selOpts)) {
109
+ selected.push({ runId: run.id, claim });
110
+ }
111
+ }
112
+ }
113
+ }
114
+ catch (err) {
115
+ console.error(err instanceof Error ? err.message : String(err));
116
+ process.exit(1);
117
+ }
118
+ if (selected.length === 0) {
119
+ console.log('No auto-reclaimable claims found (idempotent ∧ concrete-past-deadline ∧ non-gated).');
120
+ return;
121
+ }
122
+ if (opts.force !== true) {
123
+ // DRY-RUN (default): report what WOULD be reclaimed; mutate nothing.
124
+ console.log(`${selected.length} claim(s) WOULD be auto-reclaimed (idempotent ∧ past-deadline ∧ non-gated):`);
125
+ for (const { runId: rid, claim } of selected) {
126
+ const ageMin = Math.round((now - new Date(claim.deadline).getTime()) / 60_000);
127
+ console.log(` • ${rid} / ${claim.step} (deadline ${claim.deadline}, ${ageMin}m past)`);
128
+ }
129
+ console.log(`\nRe-run with --force to reclaim them. WARNING: each re-executes its handler ` +
130
+ `at-least-once with NO per-step human judgment — enable only for genuinely idempotent handlers.`);
131
+ return;
132
+ }
133
+ // --force: reclaim each selected claim, one CAS each, continue-on-error across claims.
134
+ console.warn(`⚠ Auto-reclaiming ${selected.length} claim(s); each re-executes its handler — side effects may repeat.`);
135
+ let reclaimed = 0;
136
+ for (const { runId: rid, claim } of selected) {
137
+ try {
138
+ const result = await reclaimStep(store, rid, claim.step);
139
+ if (result.outcome === 'reclaimed')
140
+ reclaimed += 1;
141
+ console.log(` ✓ ${rid} / ${claim.step}: ${result.outcome} (was ${result.priorState})`);
142
+ }
143
+ catch (err) {
144
+ // continue-on-error: one CAS mismatch/failure must not abort the batch.
145
+ console.error(` ✗ ${rid} / ${claim.step}: ${err instanceof Error ? err.message : String(err)}`);
146
+ }
147
+ }
148
+ console.log(`Reclaimed ${reclaimed}/${selected.length} selected claim(s).`);
149
+ return;
150
+ }
151
+ // ==================== Per-step / single-run mode (Phase 1) ====================
152
+ if (opts.workflow !== undefined || opts.olderThan !== undefined) {
153
+ console.error('--workflow and --older-than are only valid with --all.');
154
+ process.exit(1);
155
+ }
156
+ if (runId === undefined) {
157
+ console.error('Provide a <run-id> to inspect/reclaim, or use --all for batch mode.');
158
+ process.exit(1);
159
+ }
160
+ // --force without --step: refuse (must name the claim to act on — no blanket sweep here).
161
+ if (opts.force === true && opts.step === undefined) {
162
+ console.error('--force requires --step <name> (or use --all for batch). Run without arguments to see a dry-run.');
163
+ process.exit(1);
164
+ }
165
+ try {
166
+ const run = await store.get(runId);
167
+ // --- Reclaim path: --step (+ --force) ---
168
+ if (opts.step !== undefined) {
169
+ if (opts.force !== true) {
170
+ console.error(`Refusing to reclaim '${opts.step}' without --force. Re-run with --force to re-drive it ` +
171
+ `(the step re-executes; its side effects may repeat).`);
172
+ process.exit(1);
173
+ }
174
+ const info = classifyInProgressClaims(run).find((c) => c.step === opts.step);
175
+ if (info?.state === 'healthy') {
176
+ console.warn(`⚠ '${opts.step}' currently has a HEALTHY claim (a live runner is presumed on it). ` +
177
+ `--force will override it and may double-drive live work.`);
178
+ }
179
+ console.warn(`⚠ Reclaiming '${opts.step}' on run '${runId}' — this re-drives the step; ` +
180
+ `its side effects may repeat.`);
181
+ const result = await reclaimStep(store, runId, opts.step);
182
+ if (result.outcome === 'reclaimed') {
183
+ console.log(`Reclaimed '${opts.step}' (was ${result.priorState}). It is eligible again — the next ` +
184
+ `driver (or 'realm run agent --run-id ${runId}') will re-drive it.`);
185
+ }
186
+ else if (result.outcome === 'already_settled') {
187
+ console.log(`'${opts.step}' is not an active claim (already settled or reclaimed). No change.`);
188
+ }
189
+ else {
190
+ console.log(`'${opts.step}' was re-claimed by a live driver during reclaim — left untouched (not stomped).`);
191
+ }
192
+ return;
193
+ }
194
+ // --- Dry-run (default): report the run's in-progress claims, no mutation ---
195
+ if (run.terminal_state) {
196
+ console.log(`Run '${runId}' is terminal (${run.run_phase}); it has no reclaimable claim.`);
197
+ return;
198
+ }
199
+ const infos = classifyInProgressClaims(run);
200
+ if (infos.length === 0) {
201
+ console.log(`Run '${runId}' (${run.run_phase}) has no in-progress claims. Nothing to reclaim.`);
202
+ return;
203
+ }
204
+ console.log(`Run '${runId}' (${run.run_phase}) — in-progress claims:`);
205
+ for (const c of infos) {
206
+ const gated = run.pending_gate?.step_name === c.step;
207
+ const deadline = c.deadline ?? 'none (unknown age)';
208
+ console.log(` • ${c.step}: ${c.state} (deadline: ${deadline})`);
209
+ if (gated) {
210
+ console.log(` open gate — resolve via 'realm run respond ${runId}', not reclaim.`);
211
+ }
212
+ else if (c.state !== 'healthy') {
213
+ console.log(` reclaim: realm run reclaim ${runId} --step ${c.step} --force`);
214
+ }
215
+ }
216
+ console.log(`\nReclaim re-drives a step (at-least-once — side effects may repeat). ` +
217
+ `Use --step <name> --force to act on a specific claim, or --all for batch auto-reclaim.`);
218
+ }
219
+ catch (err) {
220
+ console.error(err instanceof Error ? err.message : String(err));
221
+ process.exit(1);
222
+ }
223
+ });
224
+ //# sourceMappingURL=reclaim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reclaim.js","sourceRoot":"","sources":["../../src/commands/reclaim.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,UAAU,SAwKpB,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,UAAU,SA+KpB,CAAC"}
@@ -2,7 +2,7 @@
2
2
  import { Command } from 'commander';
3
3
  import { createInterface } from 'node:readline/promises';
4
4
  import { join } from 'node:path';
5
- import { loadWorkflowFromFile, JsonFileStore, findEligibleSteps, executeChain, submitHumanResponse, } from '@sensigo/realm';
5
+ import { loadWorkflowFromFile, JsonFileStore, findEligibleSteps, executeChain, submitHumanResponse, unmetCapabilities, capabilityWarning, } from '@sensigo/realm';
6
6
  import { loadProjectExtensions } from '../extensions/load-project-extensions.js';
7
7
  export const runCommand = new Command('run')
8
8
  .argument('<path>', 'Path to workflow directory or workflow.yaml file')
@@ -56,6 +56,12 @@ export const runCommand = new Command('run')
56
56
  const runId = initialRecord.id;
57
57
  console.log(`\nRealm — ${definition.name} v${definition.version}`);
58
58
  console.log(`Run ID: ${runId}\n`);
59
+ // #134 pre-flight (WARN-only, never refuse): surface capability gaps up front so a dev sees them
60
+ // before a step blocks recoverably. `registry` here is always a real registry (loadProjectExtensions
61
+ // returns one or the CLI has already exited), so the `?? createDefaultRegistry()` invariant holds.
62
+ for (const req of unmetCapabilities(definition, registry)) {
63
+ console.warn(`⚠ ${capabilityWarning(req)}`);
64
+ }
59
65
  // 4. Set up readline
60
66
  const rl = createInterface({ input: process.stdin, output: process.stdout });
61
67
  // 5. Execution loop
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC,eAAO,MAAM,eAAe,SAyExB,CAAC"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoEpC,eAAO,MAAM,eAAe,SAqExB,CAAC"}
@@ -9,8 +9,34 @@ import { Command } from 'commander';
9
9
  import { dirname, join, resolve } from 'node:path';
10
10
  import { readFileSync } from 'node:fs';
11
11
  import { load } from 'js-yaml';
12
- import { loadWorkflowFromString, loadWorkflowFromFile, findTrustRoot, WorkflowError, } from '@sensigo/realm';
12
+ import { loadWorkflowFromString, loadWorkflowFromFile, findTrustRoot, WorkflowError, shouldEnforceTimeout, DEFAULT_EXECUTION_TIMEOUT_SECONDS, } from '@sensigo/realm';
13
13
  import { loadProjectExtensions, checkForOrphanedManifests, } from '../extensions/load-project-extensions.js';
14
+ /**
15
+ * Advisory (issue A3, never rejects): an auto step declaring `retry:` but no `timeout_seconds`
16
+ * has EVERY attempt bounded by the generous DEFAULT_EXECUTION_TIMEOUT_SECONDS default — a hung
17
+ * attempt can take up to that long before the retry loop even considers the next one. Surfaces
18
+ * one warning per such step so the author can opt into a tighter explicit timeout_seconds.
19
+ */
20
+ function warnRetryWithoutExplicitTimeout(definition) {
21
+ for (const [stepName, step] of Object.entries(definition.steps)) {
22
+ if (shouldEnforceTimeout(step) &&
23
+ step.retry !== undefined &&
24
+ step.timeout_seconds === undefined) {
25
+ console.warn(`⚠ Step '${stepName}': declares 'retry' but no 'timeout_seconds' — each attempt is ` +
26
+ `bounded by the default execution timeout (${DEFAULT_EXECUTION_TIMEOUT_SECONDS}s). ` +
27
+ `Consider an explicit 'timeout_seconds' if attempts should fail faster.`);
28
+ }
29
+ }
30
+ }
31
+ /**
32
+ * The single success site BOTH validation branches (extension-free and file-based) share: the
33
+ * advisory warning is structurally inseparable from the `Valid:` line it accompanies — a branch
34
+ * cannot drop the advisory without also dropping the `Valid:` print that existing tests assert.
35
+ */
36
+ function printValidationSuccess(definition) {
37
+ warnRetryWithoutExplicitTimeout(definition);
38
+ console.log(`Valid: ${definition.id} v${definition.version} (${Object.keys(definition.steps).length} steps)`);
39
+ }
14
40
  /** Pre-scan: does the YAML carry a top-level `extensions` key? (Parse errors → false; the
15
41
  * real loader below reports them with its existing error surface.) */
16
42
  function hasTopLevelExtensions(content) {
@@ -55,7 +81,7 @@ export const validateCommand = new Command('validate')
55
81
  const definition = loadWorkflowFromString(content);
56
82
  const workflowDir = dirname(resolve(filePath));
57
83
  checkForOrphanedManifests(workflowDir, findTrustRoot(workflowDir));
58
- console.log(`Valid: ${definition.id} v${definition.version} (${Object.keys(definition.steps).length} steps)`);
84
+ printValidationSuccess(definition);
59
85
  }
60
86
  catch (err) {
61
87
  if (err instanceof WorkflowError) {
@@ -78,7 +104,7 @@ export const validateCommand = new Command('validate')
78
104
  console.warn(`⚠ ${warning}`);
79
105
  // Pass 2: step config validated against each resolved adapter's config_schema.
80
106
  loadWorkflowFromFile(filePath, registry);
81
- console.log(`Valid: ${definition.id} v${definition.version} (${Object.keys(definition.steps).length} steps)`);
107
+ printValidationSuccess(definition);
82
108
  if (manifest.modules.length > 0) {
83
109
  console.log(`Extensions: ${manifest.modules.map((m) => m.declared).join(', ')} ` +
84
110
  `(adapters: ${manifest.adapters.length}, handlers: ${manifest.handlers.length}, ` +
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"commands-registry.d.ts","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AA0BA,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,+BAQ5B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,WAAW,+BAWvB,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,+BAM5B,CAAC"}
1
+ {"version":3,"file":"commands-registry.d.ts","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AA2BA,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,+BAQ5B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,WAAW,+BAYvB,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,+BAM5B,CAAC"}
@@ -6,6 +6,7 @@ import { registerCommand } from './commands/register.js';
6
6
  import { runCommand } from './commands/run.js';
7
7
  import { resumeCommand } from './commands/resume.js';
8
8
  import { abandonCommand } from './commands/abandon.js';
9
+ import { reclaimCommand } from './commands/reclaim.js';
9
10
  import { cleanupCommand } from './commands/cleanup.js';
10
11
  import { reconcileCommand } from './commands/reconcile.js';
11
12
  import { attemptsCommand } from './commands/attempts.js';
@@ -41,6 +42,7 @@ export const runCommands = [
41
42
  diffCommand,
42
43
  resumeCommand,
43
44
  abandonCommand,
45
+ reclaimCommand,
44
46
  respondCommand,
45
47
  cleanupCommand,
46
48
  reconcileCommand,
@@ -1 +1 @@
1
- {"version":3,"file":"commands-registry.js","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,+EAA+E;AAC/E,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;CACf,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,aAAa;CACd,CAAC"}
1
+ {"version":3,"file":"commands-registry.js","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,+EAA+E;AAC/E,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;CACf,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,aAAa;CACd,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.15.0');
7
+ program.name('realm').description('Realm workflow engine CLI').version('0.16.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.15.0",
3
+ "version": "0.16.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.15.0",
65
- "@sensigo/realm-mcp": "^0.15.0",
66
- "@sensigo/realm-testing": "^0.15.0",
64
+ "@sensigo/realm": "^0.16.0",
65
+ "@sensigo/realm-mcp": "^0.16.0",
66
+ "@sensigo/realm-testing": "^0.16.0",
67
67
  "@modelcontextprotocol/sdk": "1.29.0",
68
68
  "chalk": "^5.0.0",
69
69
  "commander": "^14.0.3",