@smartmemory/stratum 0.3.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/cli/guard.js +91 -0
- package/dist/cli/guard.js.map +1 -0
- package/dist/cli/mcp_install.js +302 -0
- package/dist/cli/mcp_install.js.map +1 -0
- package/dist/cli/query_gate.js +316 -0
- package/dist/cli/query_gate.js.map +1 -0
- package/dist/cli/stratum.js +291 -0
- package/dist/cli/stratum.js.map +1 -0
- package/dist/connectors/background.js +531 -0
- package/dist/connectors/background.js.map +1 -0
- package/dist/connectors/base.js +12 -0
- package/dist/connectors/base.js.map +1 -0
- package/dist/connectors/claude-bg-worker.js +99 -0
- package/dist/connectors/claude-bg-worker.js.map +1 -0
- package/dist/connectors/claude.js +170 -0
- package/dist/connectors/claude.js.map +1 -0
- package/dist/connectors/codex.js +319 -0
- package/dist/connectors/codex.js.map +1 -0
- package/dist/connectors/index.js +7 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/proc_identity.js +90 -0
- package/dist/connectors/proc_identity.js.map +1 -0
- package/dist/connectors/runner.js +63 -0
- package/dist/connectors/runner.js.map +1 -0
- package/dist/contracts/events.json +65 -0
- package/dist/contracts/mcp-surface.json +215 -0
- package/dist/engine/checkpoint.js +50 -0
- package/dist/engine/checkpoint.js.map +1 -0
- package/dist/engine/engine.js +2356 -0
- package/dist/engine/engine.js.map +1 -0
- package/dist/engine/ledger.js +36 -0
- package/dist/engine/ledger.js.map +1 -0
- package/dist/engine/state.js +42 -0
- package/dist/engine/state.js.map +1 -0
- package/dist/eval/expr.js +679 -0
- package/dist/eval/expr.js.map +1 -0
- package/dist/eval/files.js +130 -0
- package/dist/eval/files.js.map +1 -0
- package/dist/guard/canonical.js +116 -0
- package/dist/guard/canonical.js.map +1 -0
- package/dist/guard/errors.js +80 -0
- package/dist/guard/errors.js.map +1 -0
- package/dist/guard/evidence.js +475 -0
- package/dist/guard/evidence.js.map +1 -0
- package/dist/guard/fingerprint.js +13 -0
- package/dist/guard/fingerprint.js.map +1 -0
- package/dist/guard/lock.js +360 -0
- package/dist/guard/lock.js.map +1 -0
- package/dist/guard/store.js +396 -0
- package/dist/guard/store.js.map +1 -0
- package/dist/guard/transition.js +477 -0
- package/dist/guard/transition.js.map +1 -0
- package/dist/ir/refs.js +69 -0
- package/dist/ir/refs.js.map +1 -0
- package/dist/ir/schema.js +123 -0
- package/dist/ir/schema.js.map +1 -0
- package/dist/ir/validate.js +595 -0
- package/dist/ir/validate.js.map +1 -0
- package/dist/judge/codex_judged.js +85 -0
- package/dist/judge/codex_judged.js.map +1 -0
- package/dist/judge/fixture_judged.js +62 -0
- package/dist/judge/fixture_judged.js.map +1 -0
- package/dist/judge/judged.js +89 -0
- package/dist/judge/judged.js.map +1 -0
- package/dist/judge/pricing.js +22 -0
- package/dist/judge/pricing.js.map +1 -0
- package/dist/mcp/contracts.js +162 -0
- package/dist/mcp/contracts.js.map +1 -0
- package/dist/mcp/main.js +7 -0
- package/dist/mcp/main.js.map +1 -0
- package/dist/mcp/server.js +370 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/migrate/check.js +164 -0
- package/dist/migrate/check.js.map +1 -0
- package/dist/parallel/certificate.js +37 -0
- package/dist/parallel/certificate.js.map +1 -0
- package/dist/parallel/evaluate.js +73 -0
- package/dist/parallel/evaluate.js.map +1 -0
- package/dist/speckit/compiler.js +162 -0
- package/dist/speckit/compiler.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { StratumEngine } from "../engine/engine.js";
|
|
3
|
+
import { StateStore } from "../engine/state.js";
|
|
4
|
+
import { createEvaluator } from "../eval/expr.js";
|
|
5
|
+
import { validateSpec } from "../ir/validate.js";
|
|
6
|
+
function stateRoot() {
|
|
7
|
+
return process.env.STRATUM_STATE_ROOT || new StateStore().root;
|
|
8
|
+
}
|
|
9
|
+
function flowFor(run) {
|
|
10
|
+
const spec = run.spec;
|
|
11
|
+
const flow = spec.flows?.[run.flowName];
|
|
12
|
+
return typeof flow === "object" && flow !== null && Array.isArray(flow.steps) ? flow : undefined;
|
|
13
|
+
}
|
|
14
|
+
function flowName(run) {
|
|
15
|
+
return typeof run.flowName === "string" && run.flowName ? run.flowName : run.id;
|
|
16
|
+
}
|
|
17
|
+
function isKilled(run) {
|
|
18
|
+
if (run.status !== "failed" || run.failure?.attempt !== 0)
|
|
19
|
+
return false;
|
|
20
|
+
// A gate kill is only derivable from a spec the REAL validator accepts — a
|
|
21
|
+
// malformed spec carrying a fake gate must not spoof "killed".
|
|
22
|
+
if (!validateSpec(run.spec).ok)
|
|
23
|
+
return false;
|
|
24
|
+
const flow = flowFor(run);
|
|
25
|
+
return flow?.steps.some((step) => step.gate !== undefined && run.failure?.reason === `gate ${step.id} killed flow`) ?? false;
|
|
26
|
+
}
|
|
27
|
+
/** Project TS persistence terms into the Python CLI vocabulary consumed by compose. */
|
|
28
|
+
export function projectStatus(run) {
|
|
29
|
+
if (run.status === "completed")
|
|
30
|
+
return "complete";
|
|
31
|
+
if (run.status === "budget_exhausted")
|
|
32
|
+
return "budget_exhausted";
|
|
33
|
+
if (isKilled(run))
|
|
34
|
+
return "killed";
|
|
35
|
+
if (run.status === "failed")
|
|
36
|
+
return "failed";
|
|
37
|
+
if (Object.values(run.steps).some((step) => step.status === "waiting_gate"))
|
|
38
|
+
return "awaiting_gate";
|
|
39
|
+
return "running";
|
|
40
|
+
}
|
|
41
|
+
function functionName(step) {
|
|
42
|
+
// TS IR has no Python-style function declarations; `do` is the closest
|
|
43
|
+
// recorded execution name, and structural/gate steps honestly fall back to id.
|
|
44
|
+
return step.do ?? step.id;
|
|
45
|
+
}
|
|
46
|
+
function currentStepId(run, flow) {
|
|
47
|
+
// Terminal runs have no current step; live runs report the most-active step
|
|
48
|
+
// (a waiting gate, then an engine-running fanout/task, then a ready step) —
|
|
49
|
+
// never a pending successor of the step that is actually active.
|
|
50
|
+
if (!flow || run.status !== "running")
|
|
51
|
+
return null;
|
|
52
|
+
for (const status of ["waiting_gate", "running", "ready", "pending"]) {
|
|
53
|
+
const match = flow.steps.find((step) => run.steps[step.id]?.status === status);
|
|
54
|
+
if (match)
|
|
55
|
+
return match.id;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
function projectFlow(run) {
|
|
60
|
+
const flow = flowFor(run);
|
|
61
|
+
const status = projectStatus(run);
|
|
62
|
+
return {
|
|
63
|
+
_schema_version: "1",
|
|
64
|
+
flow_id: run.id,
|
|
65
|
+
flow_name: flowName(run),
|
|
66
|
+
status,
|
|
67
|
+
current_step_id: currentStepId(run, flow),
|
|
68
|
+
step_count: flow?.steps.length ?? 0,
|
|
69
|
+
completed_steps: Object.values(run.steps).filter((step) => step.status === "succeeded" || step.status === "skipped").length,
|
|
70
|
+
round: run.rounds ?? 0,
|
|
71
|
+
// Keep the persisted terminal enum honest; only the public `status` field
|
|
72
|
+
// is normalized into the Python vocabulary (including derived `killed`).
|
|
73
|
+
terminal_status: run.status === "running" ? null : run.status,
|
|
74
|
+
synthetic: false,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async function persistedRuns(root) {
|
|
78
|
+
let names;
|
|
79
|
+
try {
|
|
80
|
+
names = await readdir(root);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (isNotFound(error))
|
|
84
|
+
return [];
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
const store = new StateStore(root);
|
|
88
|
+
const runs = await Promise.all(names.filter((name) => name.endsWith(".json")).sort().map(async (name) => {
|
|
89
|
+
const runId = name.slice(0, -".json".length);
|
|
90
|
+
try {
|
|
91
|
+
const run = await store.load(runId);
|
|
92
|
+
if (!isProjectableRun(run))
|
|
93
|
+
throw new Error("persisted document is not a flow run");
|
|
94
|
+
return run;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
process.stderr.write(`stratum: unable to load persisted flow '${runId}': ${message(error)}\n`);
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}));
|
|
101
|
+
return runs.filter((run) => run !== undefined);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Structural floor for projection: valid JSON that is not a run (`{}`, stray
|
|
105
|
+
* documents) must be skipped like unreadable files, not abort the listing.
|
|
106
|
+
*/
|
|
107
|
+
function isProjectableRun(run) {
|
|
108
|
+
if (typeof run !== "object" || run === null)
|
|
109
|
+
return false;
|
|
110
|
+
const candidate = run;
|
|
111
|
+
return typeof candidate.id === "string"
|
|
112
|
+
&& typeof candidate.flowName === "string"
|
|
113
|
+
&& typeof candidate.status === "string"
|
|
114
|
+
&& typeof candidate.steps === "object" && candidate.steps !== null
|
|
115
|
+
&& typeof candidate.spec === "object" && candidate.spec !== null;
|
|
116
|
+
}
|
|
117
|
+
async function loadRun(root, runId) {
|
|
118
|
+
try {
|
|
119
|
+
return await new StateStore(root).load(runId);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (isNotFound(error))
|
|
123
|
+
return undefined;
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function isNotFound(error) {
|
|
128
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
129
|
+
}
|
|
130
|
+
function writeJson(value) {
|
|
131
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
132
|
+
}
|
|
133
|
+
function writeError(code, text) {
|
|
134
|
+
writeJson({ error: { code, message: text } });
|
|
135
|
+
process.stderr.write(`stratum: ${text}\n`);
|
|
136
|
+
}
|
|
137
|
+
function notFound(runId) {
|
|
138
|
+
writeError("NOT_FOUND", `Flow '${runId}' not found`);
|
|
139
|
+
return 1;
|
|
140
|
+
}
|
|
141
|
+
export async function queryCommand(args) {
|
|
142
|
+
try {
|
|
143
|
+
if (args.length === 1 && args[0] === "flows") {
|
|
144
|
+
writeJson((await persistedRuns(stateRoot())).map(projectFlow));
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
147
|
+
if (args.length === 1 && args[0] === "gates") {
|
|
148
|
+
const gates = (await persistedRuns(stateRoot())).flatMap((run) => {
|
|
149
|
+
const flow = flowFor(run);
|
|
150
|
+
if (!flow || run.status !== "running")
|
|
151
|
+
return [];
|
|
152
|
+
return flow.steps.flatMap((step) => {
|
|
153
|
+
if (!step.gate || run.steps[step.id]?.status !== "waiting_gate")
|
|
154
|
+
return [];
|
|
155
|
+
return [{
|
|
156
|
+
_schema_version: "1",
|
|
157
|
+
flow_id: run.id,
|
|
158
|
+
flow_name: flowName(run),
|
|
159
|
+
step_id: step.id,
|
|
160
|
+
function: functionName(step),
|
|
161
|
+
on_approve: step.gate.on_approve,
|
|
162
|
+
on_revise: step.gate.on_revise,
|
|
163
|
+
on_kill: step.gate.on_kill,
|
|
164
|
+
timeout: null,
|
|
165
|
+
// S1: expose the observation-time gate token. The human captures this
|
|
166
|
+
// when they SEE the gate and echoes it back at resolve time; the engine
|
|
167
|
+
// fences a stale round on it instead of the CLI silently rebinding the
|
|
168
|
+
// current token.
|
|
169
|
+
gate_token: run.steps[step.id]?.gateToken ?? null,
|
|
170
|
+
}];
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
writeJson(gates);
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
if (args.length === 2 && args[0] === "flow") {
|
|
177
|
+
const run = await loadRun(stateRoot(), args[1]);
|
|
178
|
+
if (!run)
|
|
179
|
+
return notFound(args[1]);
|
|
180
|
+
const flow = flowFor(run);
|
|
181
|
+
writeJson({
|
|
182
|
+
...projectFlow(run),
|
|
183
|
+
ordered_steps: (flow?.steps ?? []).map((step) => ({ id: step.id, function: functionName(step), mode: step.gate ? "gate" : "step" })),
|
|
184
|
+
});
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
process.stderr.write("Usage: stratum query <flows|flow <id>|gates>\n");
|
|
188
|
+
return 2;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
writeError("INVALID", message(error));
|
|
192
|
+
return 1;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function parseGate(args) {
|
|
196
|
+
const [action, flowId, stepId, ...flags] = args;
|
|
197
|
+
if ((action !== "approve" && action !== "reject" && action !== "revise") || !flowId || !stepId)
|
|
198
|
+
return undefined;
|
|
199
|
+
let token;
|
|
200
|
+
for (let index = 0; index < flags.length; index += 1) {
|
|
201
|
+
const flag = flags[index];
|
|
202
|
+
if (flag === "--token") {
|
|
203
|
+
const value = flags[index + 1];
|
|
204
|
+
if (value === undefined)
|
|
205
|
+
return undefined;
|
|
206
|
+
token = value;
|
|
207
|
+
index += 1;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (flag === "--note") {
|
|
211
|
+
if (flags[index + 1] === undefined)
|
|
212
|
+
return undefined;
|
|
213
|
+
index += 1;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (flag === "--resolved-by") {
|
|
217
|
+
const resolvedBy = flags[index + 1];
|
|
218
|
+
if (resolvedBy !== "human" && resolvedBy !== "agent" && resolvedBy !== "system")
|
|
219
|
+
return undefined;
|
|
220
|
+
index += 1;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
// S1: observation-time echo — the token the human saw at `query gates` is
|
|
226
|
+
// REQUIRED and carried verbatim into the decision. No resolve-time audit fetch.
|
|
227
|
+
if (token === undefined)
|
|
228
|
+
return undefined;
|
|
229
|
+
return { action, flowId, stepId, token };
|
|
230
|
+
}
|
|
231
|
+
export async function gateCommand(args) {
|
|
232
|
+
const parsed = parseGate(args);
|
|
233
|
+
if (!parsed) {
|
|
234
|
+
process.stderr.write("Usage: stratum gate <approve|reject|revise> <flow_id> <step_id> --token <t> [--note <s>] [--resolved-by human|agent|system]\n");
|
|
235
|
+
return 2;
|
|
236
|
+
}
|
|
237
|
+
const root = stateRoot();
|
|
238
|
+
try {
|
|
239
|
+
const run = await loadRun(root, parsed.flowId);
|
|
240
|
+
if (!run)
|
|
241
|
+
return notFound(parsed.flowId);
|
|
242
|
+
// Python resolve_gate order: a finished flow and a non-current step are
|
|
243
|
+
// idempotency CONFLICTS (flow_already_complete / wrong_step, exit 2);
|
|
244
|
+
// not_a_gate_step (exit 1) fires only for the CURRENT step.
|
|
245
|
+
const conflict = (detail) => {
|
|
246
|
+
writeJson({ conflict: true, flow_id: parsed.flowId, step_id: parsed.stepId, detail });
|
|
247
|
+
process.stderr.write(`stratum gate: ${detail}\n`);
|
|
248
|
+
return 2;
|
|
249
|
+
};
|
|
250
|
+
if (run.status !== "running")
|
|
251
|
+
return conflict("Flow is already complete");
|
|
252
|
+
// A step that is actually waiting on its gate is always resolvable — the
|
|
253
|
+
// TS DAG (unlike Python's linear current_idx) can hold several waiting
|
|
254
|
+
// gates at once. The Python-parity classification below applies only when
|
|
255
|
+
// the named step is NOT waiting.
|
|
256
|
+
if (run.steps[parsed.stepId]?.status !== "waiting_gate") {
|
|
257
|
+
const flow = flowFor(run);
|
|
258
|
+
const current = flow ? currentStepId(run, flow) : null;
|
|
259
|
+
if (!flow || current === null || current !== parsed.stepId) {
|
|
260
|
+
return conflict(`Expected gate step '${current ?? "none"}', got '${parsed.stepId}'`);
|
|
261
|
+
}
|
|
262
|
+
const step = flow.steps.find((candidate) => candidate.id === parsed.stepId);
|
|
263
|
+
if (!step?.gate) {
|
|
264
|
+
writeError("not_a_gate_step", `Step '${parsed.stepId}' is not a gate step in flow '${parsed.flowId}'`);
|
|
265
|
+
return 1;
|
|
266
|
+
}
|
|
267
|
+
return conflict("gate is not awaiting a decision");
|
|
268
|
+
}
|
|
269
|
+
const decision = parsed.action === "reject" ? "kill" : parsed.action;
|
|
270
|
+
const waitingFlow = flowFor(run);
|
|
271
|
+
const waitingStep = waitingFlow?.steps.find((candidate) => candidate.id === parsed.stepId);
|
|
272
|
+
const gate = waitingStep?.gate;
|
|
273
|
+
const target = gate === undefined ? null
|
|
274
|
+
: decision === "approve" ? gate.on_approve
|
|
275
|
+
: decision === "revise" ? gate.on_revise
|
|
276
|
+
: gate.on_kill;
|
|
277
|
+
if (decision === "revise" && target === null) {
|
|
278
|
+
// Python: a null on_revise is missing_on_revise (exit 1) UNLESS the round
|
|
279
|
+
// budget is already exceeded — then resolving yields max_rounds_exceeded.
|
|
280
|
+
const maxRounds = waitingFlow?.max_rounds;
|
|
281
|
+
const exceeded = typeof maxRounds === "number" && (run.rounds ?? 0) + 1 > maxRounds;
|
|
282
|
+
if (!exceeded) {
|
|
283
|
+
writeError("missing_on_revise", `Gate '${parsed.stepId}' has no on_revise route`);
|
|
284
|
+
return 1;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// v1 engine gateResolve carries no note/resolver fields, so validated flags
|
|
288
|
+
// are intentionally accepted and dropped at this CLI compatibility boundary.
|
|
289
|
+
// S1: pass the caller-supplied observation-time token VERBATIM — no
|
|
290
|
+
// resolve-time audit fetch. A stale token (the gate advanced to a new round
|
|
291
|
+
// since the human observed it) is rejected by the engine's gate fencing,
|
|
292
|
+
// surfaced below as an INVALID error, instead of being silently rebound.
|
|
293
|
+
const result = await new StratumEngine({ stateRoot: root, evaluator: createEvaluator() })
|
|
294
|
+
.gateResolve(parsed.flowId, parsed.stepId, decision, parsed.token);
|
|
295
|
+
// Python result vocabulary, decided from the GATE'S OWN ROUTE, never from
|
|
296
|
+
// downstream advancement (a routed target may complete synchronously):
|
|
297
|
+
// any named route → "execute_step"; terminal kill → "killed"; revise past
|
|
298
|
+
// the round budget → "max_rounds_exceeded"; null-route approve completes
|
|
299
|
+
// the flow ("complete") unless DAG after-successors keep it running.
|
|
300
|
+
const resultWord = decision === "revise" && (result.status === "failed" || result.status === "budget_exhausted") ? "max_rounds_exceeded"
|
|
301
|
+
: target !== null ? "execute_step"
|
|
302
|
+
: decision === "kill" ? "killed"
|
|
303
|
+
: result.status === "completed" ? "complete"
|
|
304
|
+
: "execute_step";
|
|
305
|
+
writeJson({ _schema_version: "1", ok: true, flow_id: parsed.flowId, step_id: parsed.stepId, outcome: decision, result: resultWord });
|
|
306
|
+
return 0;
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
writeError("INVALID", message(error));
|
|
310
|
+
return 1;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function message(error) {
|
|
314
|
+
return error instanceof Error ? error.message : String(error);
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=query_gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query_gate.js","sourceRoot":"","sources":["../../src/cli/query_gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { open, readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { parseDocument } from "yaml";
|
|
5
|
+
import { agentRunsRoot, T2F5_DONE_SENTINEL } from "../connectors/background.js";
|
|
6
|
+
import { StratumEngine } from "../engine/engine.js";
|
|
7
|
+
import { createEvaluator } from "../eval/expr.js";
|
|
8
|
+
import { validateSpec } from "../ir/validate.js";
|
|
9
|
+
import { checkLegacyYaml, renderCompatReport } from "../migrate/check.js";
|
|
10
|
+
import { assertEvent, eventContract } from "../mcp/contracts.js";
|
|
11
|
+
import { gateCommand, queryCommand } from "./query_gate.js";
|
|
12
|
+
const AGENT_RUN_ID = /^[0-9a-f]{12}$/;
|
|
13
|
+
const EVENT_TEXT_CAP = 2_000;
|
|
14
|
+
const AGENT_EVENT_KINDS = new Set(["started", "assistant", "reasoning", "tool", "usage", "error"]);
|
|
15
|
+
const DEFAULT_AGENT_EVENT_KINDS = new Set(["assistant", "tool", "error"]);
|
|
16
|
+
export async function main(argv = process.argv.slice(2)) {
|
|
17
|
+
const [command, ...args] = argv;
|
|
18
|
+
if (command === "validate")
|
|
19
|
+
return validateCommand(args);
|
|
20
|
+
if (command === "migrate")
|
|
21
|
+
return migrateCommand(args);
|
|
22
|
+
if (command === "query")
|
|
23
|
+
return queryCommand(args);
|
|
24
|
+
if (command === "gate")
|
|
25
|
+
return gateCommand(args);
|
|
26
|
+
if (command === "guard")
|
|
27
|
+
return (await import("./guard.js")).guardCommand(args);
|
|
28
|
+
if (command === "mcp")
|
|
29
|
+
return (await import("./mcp_install.js")).mcpCommand(args);
|
|
30
|
+
if (command === "doctor")
|
|
31
|
+
return (await import("./mcp_install.js")).doctorCommand(args);
|
|
32
|
+
if (command === "watch")
|
|
33
|
+
return watchCommand(args);
|
|
34
|
+
process.stderr.write("Usage: stratum <validate|migrate|query|gate|guard|mcp|doctor|watch> ...\n");
|
|
35
|
+
return 2;
|
|
36
|
+
}
|
|
37
|
+
async function validateCommand(args) {
|
|
38
|
+
if (args.length !== 1) {
|
|
39
|
+
process.stderr.write("Usage: stratum validate <spec.yaml>\n");
|
|
40
|
+
return 2;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const source = await readFile(args[0], "utf8");
|
|
44
|
+
const parsed = parseDocument(source, { prettyErrors: false });
|
|
45
|
+
if (parsed.errors.length > 0)
|
|
46
|
+
throw new Error(parsed.errors.map((error) => error.message).join("; "));
|
|
47
|
+
const spec = parsed.toJS();
|
|
48
|
+
const result = validateSpec(spec);
|
|
49
|
+
process.stdout.write(`${JSON.stringify(result.ok ? { valid: true } : { valid: false, errors: result.errors })}\n`);
|
|
50
|
+
return result.ok ? 0 : 1;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
process.stderr.write(`stratum validate: ${message(error)}\n`);
|
|
54
|
+
return 2;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function migrateCommand(args) {
|
|
58
|
+
if (args.length !== 2 || args[0] !== "--check") {
|
|
59
|
+
process.stderr.write("Usage: stratum migrate --check <old.yaml>\n");
|
|
60
|
+
return 2;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
process.stdout.write(renderCompatReport(checkLegacyYaml(await readFile(args[1], "utf8"))));
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
process.stderr.write(`stratum migrate: ${message(error)}\n`);
|
|
68
|
+
return 2;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function watchCommand(argv) {
|
|
72
|
+
const parsed = parseWatch(argv);
|
|
73
|
+
if (typeof parsed === "number")
|
|
74
|
+
return parsed;
|
|
75
|
+
const flow = await createFlowEngine().flowPoll(parsed.runId, 0).catch(() => undefined);
|
|
76
|
+
if (flow)
|
|
77
|
+
return watchFlow(parsed, flow.nextCursor === 0 ? 0 : 0);
|
|
78
|
+
return watchAgent(parsed);
|
|
79
|
+
}
|
|
80
|
+
function parseWatch(argv) {
|
|
81
|
+
let mode = "text";
|
|
82
|
+
const args = [...argv];
|
|
83
|
+
const json = take(args, "--json");
|
|
84
|
+
const events = take(args, "--events");
|
|
85
|
+
const kindArgs = args.filter((arg) => arg.startsWith("--kinds="));
|
|
86
|
+
for (const arg of kindArgs)
|
|
87
|
+
args.splice(args.indexOf(arg), 1);
|
|
88
|
+
const usage = "Usage: stratum watch <run_id> [--json | --events [--kinds=k1,k2,...]]";
|
|
89
|
+
if (json && events || kindArgs.length > 1 || kindArgs.length > 0 && !events || args.length !== 1) {
|
|
90
|
+
process.stderr.write(`${usage}\n`);
|
|
91
|
+
return 2;
|
|
92
|
+
}
|
|
93
|
+
if (json)
|
|
94
|
+
mode = "json";
|
|
95
|
+
if (events)
|
|
96
|
+
mode = "events";
|
|
97
|
+
const kinds = kindArgs.length === 1 ? new Set(kindArgs[0].slice("--kinds=".length).split(",")) : undefined;
|
|
98
|
+
return { runId: args[0], mode, ...(kinds ? { kinds } : {}) };
|
|
99
|
+
}
|
|
100
|
+
async function watchFlow(options, cursor) {
|
|
101
|
+
const engine = createFlowEngine();
|
|
102
|
+
const flowKinds = options.kinds;
|
|
103
|
+
// Flow event kinds are frozen in events.json, so validate the filter against that
|
|
104
|
+
// contract before waiting. Agent-only labels intentionally do not apply here.
|
|
105
|
+
if (flowKinds) {
|
|
106
|
+
const contract = await eventContract();
|
|
107
|
+
for (const kind of flowKinds) {
|
|
108
|
+
if (!(kind in contract.kinds)) {
|
|
109
|
+
process.stderr.write(`stratum watch: unknown flow event kind ${kind}\n`);
|
|
110
|
+
return 2;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
while (true) {
|
|
115
|
+
const poll = await engine.flowPoll(options.runId, cursor);
|
|
116
|
+
cursor = poll.nextCursor;
|
|
117
|
+
for (const event of poll.events) {
|
|
118
|
+
await assertEvent(event);
|
|
119
|
+
if (flowKinds && !flowKinds.has(event.type))
|
|
120
|
+
continue;
|
|
121
|
+
printFlowEvent(options.mode, event);
|
|
122
|
+
}
|
|
123
|
+
if (poll.status !== "running")
|
|
124
|
+
return poll.status === "completed" ? 0 : 1;
|
|
125
|
+
await delay(500);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function watchAgent(options) {
|
|
129
|
+
if (options.kinds && ![...options.kinds].every((kind) => AGENT_EVENT_KINDS.has(kind))) {
|
|
130
|
+
process.stderr.write(`stratum watch: unknown --kinds value; valid agent kinds: ${[...AGENT_EVENT_KINDS].join(", ")}\n`);
|
|
131
|
+
return 2;
|
|
132
|
+
}
|
|
133
|
+
if (!AGENT_RUN_ID.test(options.runId))
|
|
134
|
+
return unknownRun(options);
|
|
135
|
+
let meta;
|
|
136
|
+
try {
|
|
137
|
+
meta = JSON.parse(await readFile(join(agentRunsRoot(), options.runId, "meta.json"), "utf8"));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return unknownRun(options);
|
|
141
|
+
}
|
|
142
|
+
if (meta.runId !== options.runId || typeof meta.streamPath !== "string")
|
|
143
|
+
return unknownRun(options);
|
|
144
|
+
// Incremental BYTE-offset reads: only new bytes are read each poll, and a
|
|
145
|
+
// UTF-8 character split across writes stays whole in the pending byte
|
|
146
|
+
// buffer until its line completes (string offsets would misalign on the
|
|
147
|
+
// replacement character a partial decode inserts).
|
|
148
|
+
let position = 0;
|
|
149
|
+
let pendingBytes = Buffer.alloc(0);
|
|
150
|
+
while (true) {
|
|
151
|
+
let chunk;
|
|
152
|
+
try {
|
|
153
|
+
const handle = await open(meta.streamPath, "r");
|
|
154
|
+
try {
|
|
155
|
+
const size = (await handle.stat()).size;
|
|
156
|
+
if (size > position) {
|
|
157
|
+
const buffer = Buffer.alloc(size - position);
|
|
158
|
+
await handle.read(buffer, 0, buffer.length, position);
|
|
159
|
+
position = size;
|
|
160
|
+
chunk = buffer;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
await handle.close();
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch { /* a just-created stream may briefly be absent */ }
|
|
168
|
+
if (chunk) {
|
|
169
|
+
pendingBytes = pendingBytes.length > 0 ? Buffer.concat([pendingBytes, chunk]) : chunk;
|
|
170
|
+
let newline = pendingBytes.indexOf(10);
|
|
171
|
+
while (newline >= 0) {
|
|
172
|
+
const line = pendingBytes.subarray(0, newline).toString("utf8").trim();
|
|
173
|
+
pendingBytes = pendingBytes.subarray(newline + 1);
|
|
174
|
+
newline = pendingBytes.indexOf(10);
|
|
175
|
+
if (!line)
|
|
176
|
+
continue;
|
|
177
|
+
let parsedLine;
|
|
178
|
+
try {
|
|
179
|
+
parsedLine = JSON.parse(line);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// JSONL primitives (null, strings, numbers) are noise, not records —
|
|
185
|
+
// they must not crash the watcher (Python skips them too).
|
|
186
|
+
if (!isRecord(parsedLine))
|
|
187
|
+
continue;
|
|
188
|
+
const record = parsedLine;
|
|
189
|
+
if (T2F5_DONE_SENTINEL in record) {
|
|
190
|
+
const rc = number(record[T2F5_DONE_SENTINEL]) ?? 1;
|
|
191
|
+
if (options.mode === "json")
|
|
192
|
+
lineOut(record);
|
|
193
|
+
else if (options.mode === "events")
|
|
194
|
+
lineOut({ event: "done", rc });
|
|
195
|
+
else
|
|
196
|
+
process.stdout.write(`run ${options.runId} finished rc=${rc}\n`);
|
|
197
|
+
return rc;
|
|
198
|
+
}
|
|
199
|
+
printAgentRecord(options, record, meta);
|
|
200
|
+
}
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (!agentAlive(meta.childPid)) {
|
|
204
|
+
const stderrTail = meta.stderrPath ? await readFile(meta.stderrPath, "utf8").catch(() => "") : "";
|
|
205
|
+
if (options.mode === "events")
|
|
206
|
+
lineOut({ event: "died", reason: "child_died_without_sentinel", stderr_tail: cap(stderrTail, meta.stderrPath ?? meta.streamPath) });
|
|
207
|
+
process.stderr.write(`run ${options.runId} died without completion sentinel\n`);
|
|
208
|
+
if (stderrTail)
|
|
209
|
+
process.stderr.write(`${stderrTail}\n`);
|
|
210
|
+
return 1;
|
|
211
|
+
}
|
|
212
|
+
await delay(500);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function printFlowEvent(mode, event) {
|
|
216
|
+
if (mode === "json" || mode === "events")
|
|
217
|
+
lineOut(event);
|
|
218
|
+
else
|
|
219
|
+
process.stdout.write(`${event.at} ${event.type}${event.stepId ? ` ${event.stepId}` : ""}\n`);
|
|
220
|
+
}
|
|
221
|
+
function printAgentRecord(options, record, meta) {
|
|
222
|
+
if (options.mode === "json") {
|
|
223
|
+
lineOut(record);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const event = mapAgentRecord(record, meta);
|
|
227
|
+
if (!event)
|
|
228
|
+
return;
|
|
229
|
+
if (options.mode === "events") {
|
|
230
|
+
const kinds = options.kinds ?? DEFAULT_AGENT_EVENT_KINDS;
|
|
231
|
+
if (kinds.has(event.event))
|
|
232
|
+
lineOut(event);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (event.event === "assistant")
|
|
236
|
+
process.stdout.write(`${event.text}\n`);
|
|
237
|
+
if (event.event === "tool")
|
|
238
|
+
process.stdout.write(`[${event.tool}] ${event.summary}\n`);
|
|
239
|
+
}
|
|
240
|
+
function mapAgentRecord(record, meta) {
|
|
241
|
+
if (record.type === "thread.started")
|
|
242
|
+
return { event: "started", model: meta.model ?? "", prompt_chars: meta.promptChars ?? 0 };
|
|
243
|
+
if (record.type === "error")
|
|
244
|
+
return { event: "error", message: cap(stringValue(record.message), meta.streamPath) };
|
|
245
|
+
if (record.type === "turn.completed") {
|
|
246
|
+
const usage = isRecord(record.usage) ? record.usage : {};
|
|
247
|
+
return { event: "usage", input_tokens: number(usage.input_tokens) ?? 0, output_tokens: number(usage.output_tokens) ?? 0, cache_read_input_tokens: number(usage.cached_input_tokens) ?? 0 };
|
|
248
|
+
}
|
|
249
|
+
if (record.type !== "item.completed" || !isRecord(record.item))
|
|
250
|
+
return undefined;
|
|
251
|
+
const item = record.item;
|
|
252
|
+
if (item.type === "agent_message")
|
|
253
|
+
return { event: "assistant", text: cap(stringValue(item.text), meta.streamPath) };
|
|
254
|
+
if (item.type === "reasoning")
|
|
255
|
+
return { event: "reasoning", text: cap(stringValue(item.text), meta.streamPath) };
|
|
256
|
+
if (item.type === "command_execution")
|
|
257
|
+
return { event: "tool", tool: "bash", summary: cap(stringValue(item.command), meta.streamPath), ok: (number(item.exit_code) ?? 1) === 0, duration_ms: number(item.duration_ms) ?? 0 };
|
|
258
|
+
return undefined;
|
|
259
|
+
}
|
|
260
|
+
function unknownRun(options) {
|
|
261
|
+
const text = `unknown run_id ${options.runId}`;
|
|
262
|
+
if (options.mode === "events")
|
|
263
|
+
lineOut({ event: "error", message: text });
|
|
264
|
+
process.stderr.write(`stratum watch: ${text}\n`);
|
|
265
|
+
return 2;
|
|
266
|
+
}
|
|
267
|
+
function createFlowEngine() { return new StratumEngine({ ...(process.env.STRATUM_STATE_ROOT ? { stateRoot: process.env.STRATUM_STATE_ROOT } : {}), evaluator: createEvaluator() }); }
|
|
268
|
+
function take(args, value) { const index = args.indexOf(value); if (index < 0)
|
|
269
|
+
return false; args.splice(index, 1); return true; }
|
|
270
|
+
function lineOut(value) { process.stdout.write(`${JSON.stringify(value)}\n`); }
|
|
271
|
+
function delay(milliseconds) { return new Promise((resolve) => setTimeout(resolve, milliseconds)); }
|
|
272
|
+
function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); }
|
|
273
|
+
function stringValue(value) { return typeof value === "string" ? value : ""; }
|
|
274
|
+
function number(value) { return typeof value === "number" && Number.isFinite(value) ? value : undefined; }
|
|
275
|
+
function message(value) { return value instanceof Error ? value.message : String(value); }
|
|
276
|
+
function cap(value, streamPath) { return value.length <= EVENT_TEXT_CAP ? value : `[truncated, full stream at ${streamPath}]\n${value.slice(-100)}`; }
|
|
277
|
+
function agentAlive(pid) {
|
|
278
|
+
if (typeof pid !== "number" || !Number.isInteger(pid) || pid <= 0)
|
|
279
|
+
return false;
|
|
280
|
+
try {
|
|
281
|
+
process.kill(pid, 0);
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (import.meta.url === new URL(process.argv[1] ?? "", "file:").href) {
|
|
289
|
+
void main().then((code) => { process.exitCode = code; });
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=stratum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratum.js","sourceRoot":"","sources":["../../src/cli/stratum.ts"],"names":[],"mappings":"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"}
|