@sensigo/realm-cli 0.14.1 → 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.
- package/dist/agent/gate/slack-gate-notifier.d.ts +9 -9
- package/dist/agent/gate/slack-gate-notifier.d.ts.map +1 -1
- package/dist/agent/gate/slack-gate-notifier.js +69 -12
- package/dist/agent/gate/slack-gate-notifier.js.map +1 -1
- package/dist/agent/providers/agent-utils.d.ts +22 -4
- package/dist/agent/providers/agent-utils.d.ts.map +1 -1
- package/dist/agent/providers/agent-utils.js +106 -13
- package/dist/agent/providers/agent-utils.js.map +1 -1
- package/dist/agent/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/agent/providers/anthropic-provider.js +93 -35
- package/dist/agent/providers/anthropic-provider.js.map +1 -1
- package/dist/agent/providers/openai-provider.d.ts.map +1 -1
- package/dist/agent/providers/openai-provider.js +20 -24
- package/dist/agent/providers/openai-provider.js.map +1 -1
- package/dist/agent/providers/openai-reasoning-provider.d.ts.map +1 -1
- package/dist/agent/providers/openai-reasoning-provider.js +18 -22
- package/dist/agent/providers/openai-reasoning-provider.js.map +1 -1
- package/dist/agent/run-agent.d.ts.map +1 -1
- package/dist/agent/run-agent.js +58 -6
- package/dist/agent/run-agent.js.map +1 -1
- package/dist/commands/agent.d.ts +2 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +3 -0
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +45 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/reclaim.d.ts +23 -0
- package/dist/commands/reclaim.d.ts.map +1 -0
- package/dist/commands/reclaim.js +224 -0
- package/dist/commands/reclaim.js.map +1 -0
- package/dist/commands/respond.d.ts +4 -1
- package/dist/commands/respond.d.ts.map +1 -1
- package/dist/commands/respond.js +16 -1
- package/dist/commands/respond.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +10 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +29 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands-registry.d.ts.map +1 -1
- package/dist/commands-registry.js +2 -0
- package/dist/commands-registry.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import type { RunRecord, StepDefinition, InProgressClaimInfo } from '@sensigo/realm';
|
|
3
|
+
/**
|
|
4
|
+
* The SAFETY-CRITICAL selection rule for `--all` auto-reclaim (issue #101 Phase 2, §3).
|
|
5
|
+
* A claim is auto-reclaimable IFF ALL hold:
|
|
6
|
+
* 1. the run is non-terminal;
|
|
7
|
+
* 2. the step is an in-progress claim (guaranteed — `claim` comes from classifyInProgressClaims);
|
|
8
|
+
* 3. the claim carries a CONCRETE deadline that has passed — i.e. state === 'claim_stale'
|
|
9
|
+
* (never 'claim_unknown_age' [null/absent deadline] and never 'healthy' [within deadline]);
|
|
10
|
+
* 4. if `--older-than` is set, additionally (now − deadline) ≥ the grace margin;
|
|
11
|
+
* 5. the step is author-declared `idempotent: true` in the workflow definition;
|
|
12
|
+
* 6. the step is NOT the open gate.
|
|
13
|
+
* `--force` acts on exactly this set — it NEVER widens it to unknown-age / non-idempotent / healthy /
|
|
14
|
+
* gated claims (those remain per-step `--step <S> --force` only). A null/absent deadline is never
|
|
15
|
+
* past-deadline, so the finalizer crash-wedge (deadline: null ⇒ claim_unknown_age) is structurally
|
|
16
|
+
* excluded from the cron — intended, not a gap.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isAutoReclaimable(run: Pick<RunRecord, 'terminal_state' | 'pending_gate'>, claim: InProgressClaimInfo, stepDef: StepDefinition | undefined, opts: {
|
|
19
|
+
olderThanMs?: number;
|
|
20
|
+
now: number;
|
|
21
|
+
}): boolean;
|
|
22
|
+
export declare const reclaimCommand: Command;
|
|
23
|
+
//# sourceMappingURL=reclaim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reclaim.d.ts","sourceRoot":"","sources":["../../src/commands/reclaim.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAerF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,cAAc,CAAC,EACvD,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAWT;AAED,eAAO,MAAM,cAAc,SA8NxB,CAAC"}
|
|
@@ -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":"AAAA,yEAAyE;AACzE,EAAE;AACF,sGAAsG;AACtG,qGAAqG;AACrG,+FAA+F;AAC/F,gGAAgG;AAChG,qGAAqG;AACrG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC;sGACsG;AACtG,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,mDAAmD,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACvB,MAAM,WAAW,GAA2B,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACvF,OAAO,KAAK,GAAG,WAAW,CAAC,IAAI,CAAE,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAuD,EACvD,KAA0B,EAC1B,OAAmC,EACnC,IAA2C;IAE3C,IAAI,GAAG,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC,CAAC,OAAO;IAC7C,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC,CAAC,+CAA+C;IAChG,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,YAAY,EAAE,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,8BAA8B;IAC5F,IAAI,OAAO,EAAE,UAAU,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,CAAC,0CAA0C;IAC1F,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,mGAAmG;QACnG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,mEAAmE,CAAC;KAChF,QAAQ,CAAC,UAAU,EAAE,sEAAsE,CAAC;KAC5F,MAAM,CAAC,eAAe,EAAE,4DAA4D,CAAC;KACrF,MAAM,CAAC,SAAS,EAAE,mEAAmE,CAAC;KACtF,MAAM,CACL,OAAO,EACP,8GAA8G,CAC/G;KACA,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;KAC5E,MAAM,CACL,yBAAyB,EACzB,gEAAgE,CACjE;KACA,MAAM,CACL,KAAK,EACH,KAAyB,EACzB,IAMC,EACD,EAAE;IACF,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,wBAAwB,EAAE,GAC/E,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAElC,4FAA4F;IAC5F,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CACX,qFAAqF,CACtF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iFAAiF;IACjF,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,WAA+B,CAAC;QACpC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAyD,EAAE,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,CAAC,cAAc;oBAAE,SAAS;gBACjC,MAAM,MAAM,GAAG,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAClC,sFAAsF;gBACtF,oFAAoF;gBACpF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,MAAM,OAAO,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;oBAC3E,IAAI,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;wBACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CACT,qFAAqF,CACtF,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,qEAAqE;YACrE,OAAO,CAAC,GAAG,CACT,GAAG,QAAQ,CAAC,MAAM,6EAA6E,CAChG,CAAC;YACF,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,QAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CACT,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,QAAQ,KAAK,MAAM,SAAS,CAC5E,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CACT,+EAA+E;gBAC7E,gGAAgG,CACnG,CAAC;YACF,OAAO;QACT,CAAC;QAED,uFAAuF;QACvF,OAAO,CAAC,IAAI,CACV,qBAAqB,QAAQ,CAAC,MAAM,oEAAoE,CACzG,CAAC;QACF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW;oBAAE,SAAS,IAAI,CAAC,CAAC;gBACnD,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,SAAS,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;YAC1F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,wEAAwE;gBACxE,OAAO,CAAC,KAAK,CACX,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAClF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,IAAI,QAAQ,CAAC,MAAM,qBAAqB,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,iFAAiF;IACjF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0FAA0F;IAC1F,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,CAAC,KAAK,CACX,kGAAkG,CACnG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEnC,2CAA2C;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CACX,wBAAwB,IAAI,CAAC,IAAI,wDAAwD;oBACvF,sDAAsD,CACzD,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,IAAI,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7E,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CACV,MAAM,IAAI,CAAC,IAAI,qEAAqE;oBAClF,0DAA0D,CAC7D,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CACV,iBAAiB,IAAI,CAAC,IAAI,aAAa,KAAK,+BAA+B;gBACzE,8BAA8B,CACjC,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CACT,cAAc,IAAI,CAAC,IAAI,UAAU,MAAM,CAAC,UAAU,qCAAqC;oBACrF,wCAAwC,KAAK,sBAAsB,CACtE,CAAC;YACJ,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CACT,IAAI,IAAI,CAAC,IAAI,qEAAqE,CACnF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,IAAI,IAAI,CAAC,IAAI,kFAAkF,CAChG,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,8EAA8E;QAC9E,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,QAAQ,KAAK,kBAAkB,GAAG,CAAC,SAAS,iCAAiC,CAC9E,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,QAAQ,KAAK,MAAM,GAAG,CAAC,SAAS,kDAAkD,CACnF,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,GAAG,CAAC,SAAS,yBAAyB,CAAC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,EAAE,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC;YACrD,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,oBAAoB,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,gBAAgB,QAAQ,GAAG,CAAC,CAAC;YAClE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,oDAAoD,KAAK,iBAAiB,CAAC,CAAC;YAC1F,CAAC;iBAAM,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,WAAW,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CACT,wEAAwE;YACtE,wFAAwF,CAC3F,CAAC;IACJ,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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import type { RunStore } from '@sensigo/realm';
|
|
3
3
|
import type { WorkflowRegistrar } from '@sensigo/realm';
|
|
4
|
+
import type { ExtensionRegistry } from '@sensigo/realm';
|
|
4
5
|
/**
|
|
5
6
|
* Submits a human choice response for a gate-waiting run.
|
|
6
7
|
* @param runId The run awaiting a gate response.
|
|
@@ -12,7 +13,9 @@ import type { WorkflowRegistrar } from '@sensigo/realm';
|
|
|
12
13
|
export declare function respondToGate(runId: string, options: {
|
|
13
14
|
gate: string;
|
|
14
15
|
choice: string;
|
|
15
|
-
|
|
16
|
+
project?: string;
|
|
17
|
+
extensionsModule?: string;
|
|
18
|
+
}, runStore: RunStore, workflowStore: WorkflowRegistrar, registry?: ExtensionRegistry): Promise<{
|
|
16
19
|
choice: string;
|
|
17
20
|
newState: string;
|
|
18
21
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,EACtF,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,iBAAiB,EAChC,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC/C;AAED,eAAO,MAAM,cAAc,SA6BxB,CAAC"}
|
package/dist/commands/respond.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// respond command — submits a human gate response for a gate-waiting run.
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { WorkflowError, submitHumanResponse } from '@sensigo/realm';
|
|
4
|
+
import { loadProjectExtensions } from '../extensions/load-project-extensions.js';
|
|
4
5
|
/**
|
|
5
6
|
* Submits a human choice response for a gate-waiting run.
|
|
6
7
|
* @param runId The run awaiting a gate response.
|
|
@@ -9,13 +10,25 @@ import { WorkflowError, submitHumanResponse } from '@sensigo/realm';
|
|
|
9
10
|
* @param workflowStore Registrar for workflow definitions.
|
|
10
11
|
* @returns The choice submitted and the new run state after the gate advances.
|
|
11
12
|
*/
|
|
12
|
-
export async function respondToGate(runId, options, runStore, workflowStore) {
|
|
13
|
+
export async function respondToGate(runId, options, runStore, workflowStore, registry) {
|
|
13
14
|
const run = await runStore.get(runId);
|
|
14
15
|
const workflow = await workflowStore.get(run.workflow_id);
|
|
16
|
+
// Resolve the project registry (unless a caller/test injected one) so that resolving a gate
|
|
17
|
+
// which COMPLETES the run fires its finalizers with project handlers — consistent with
|
|
18
|
+
// `realm run`. Same options/cwd handling as run.ts; reuses loadProjectExtensions so the
|
|
19
|
+
// orphan-manifest topology guard is honoured (no hand-rolled registry).
|
|
20
|
+
const effectiveRegistry = registry ??
|
|
21
|
+
(await loadProjectExtensions(workflow, {
|
|
22
|
+
...(options.extensionsModule !== undefined
|
|
23
|
+
? { overrideModule: options.extensionsModule }
|
|
24
|
+
: {}),
|
|
25
|
+
projectDir: options.project ?? process.cwd(),
|
|
26
|
+
})).registry;
|
|
15
27
|
const result = await submitHumanResponse(runStore, workflow, {
|
|
16
28
|
runId,
|
|
17
29
|
gateId: options.gate,
|
|
18
30
|
choice: options.choice,
|
|
31
|
+
registry: effectiveRegistry,
|
|
19
32
|
});
|
|
20
33
|
if (result.status !== 'ok') {
|
|
21
34
|
throw new WorkflowError(result.errors[0] ?? 'Gate response failed', {
|
|
@@ -33,6 +46,8 @@ export const respondCommand = new Command('respond')
|
|
|
33
46
|
.argument('<run-id>', 'ID of the run waiting at a gate')
|
|
34
47
|
.requiredOption('--gate <gate-id>', 'Gate ID from the confirm_required response')
|
|
35
48
|
.requiredOption('--choice <choice>', 'The choice to submit (e.g. approve, reject)')
|
|
49
|
+
.option('--project <dir>', 'CONFIG anchor: deployment root whose realm.yaml applies to definitions without a stored trust_root (default: current directory)')
|
|
50
|
+
.option('--extensions-module <path>', "CODE override: module that REPLACES the workflow's declared 'extensions' modules (repair tool)")
|
|
36
51
|
.action(async (runId, opts) => {
|
|
37
52
|
const { JsonFileStore, JsonWorkflowStore } = await import('@sensigo/realm');
|
|
38
53
|
const runStore = new JsonFileStore();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/commands/respond.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;
|
|
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"}
|
package/dist/commands/run.js
CHANGED
|
@@ -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
|
|
@@ -73,6 +79,9 @@ export const runCommand = new Command('run')
|
|
|
73
79
|
runId,
|
|
74
80
|
gateId: g.gate_id,
|
|
75
81
|
choice,
|
|
82
|
+
// Thread the resolved project registry so a gate-completed run fires its
|
|
83
|
+
// finalizers with project handlers (same registry passed to executeChain below).
|
|
84
|
+
registry,
|
|
76
85
|
});
|
|
77
86
|
if (respondResult.status === 'ok') {
|
|
78
87
|
run = await store.get(runId);
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,iFAAiF;AACjF,EAAE;AACF,yFAAyF;AACzF,qFAAqF;AACrF,uFAAuF;AACvF,wFAAwF;AACxF,4EAA4E;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,aAAa,EACb,aAAa,
|
|
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":"
|
|
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.
|
|
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.
|
|
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.
|
|
65
|
-
"@sensigo/realm-mcp": "^0.
|
|
66
|
-
"@sensigo/realm-testing": "^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",
|