@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.
Files changed (81) hide show
  1. package/dist/cli/guard.js +91 -0
  2. package/dist/cli/guard.js.map +1 -0
  3. package/dist/cli/mcp_install.js +302 -0
  4. package/dist/cli/mcp_install.js.map +1 -0
  5. package/dist/cli/query_gate.js +316 -0
  6. package/dist/cli/query_gate.js.map +1 -0
  7. package/dist/cli/stratum.js +291 -0
  8. package/dist/cli/stratum.js.map +1 -0
  9. package/dist/connectors/background.js +531 -0
  10. package/dist/connectors/background.js.map +1 -0
  11. package/dist/connectors/base.js +12 -0
  12. package/dist/connectors/base.js.map +1 -0
  13. package/dist/connectors/claude-bg-worker.js +99 -0
  14. package/dist/connectors/claude-bg-worker.js.map +1 -0
  15. package/dist/connectors/claude.js +170 -0
  16. package/dist/connectors/claude.js.map +1 -0
  17. package/dist/connectors/codex.js +319 -0
  18. package/dist/connectors/codex.js.map +1 -0
  19. package/dist/connectors/index.js +7 -0
  20. package/dist/connectors/index.js.map +1 -0
  21. package/dist/connectors/proc_identity.js +90 -0
  22. package/dist/connectors/proc_identity.js.map +1 -0
  23. package/dist/connectors/runner.js +63 -0
  24. package/dist/connectors/runner.js.map +1 -0
  25. package/dist/contracts/events.json +65 -0
  26. package/dist/contracts/mcp-surface.json +215 -0
  27. package/dist/engine/checkpoint.js +50 -0
  28. package/dist/engine/checkpoint.js.map +1 -0
  29. package/dist/engine/engine.js +2356 -0
  30. package/dist/engine/engine.js.map +1 -0
  31. package/dist/engine/ledger.js +36 -0
  32. package/dist/engine/ledger.js.map +1 -0
  33. package/dist/engine/state.js +42 -0
  34. package/dist/engine/state.js.map +1 -0
  35. package/dist/eval/expr.js +679 -0
  36. package/dist/eval/expr.js.map +1 -0
  37. package/dist/eval/files.js +130 -0
  38. package/dist/eval/files.js.map +1 -0
  39. package/dist/guard/canonical.js +116 -0
  40. package/dist/guard/canonical.js.map +1 -0
  41. package/dist/guard/errors.js +80 -0
  42. package/dist/guard/errors.js.map +1 -0
  43. package/dist/guard/evidence.js +475 -0
  44. package/dist/guard/evidence.js.map +1 -0
  45. package/dist/guard/fingerprint.js +13 -0
  46. package/dist/guard/fingerprint.js.map +1 -0
  47. package/dist/guard/lock.js +360 -0
  48. package/dist/guard/lock.js.map +1 -0
  49. package/dist/guard/store.js +396 -0
  50. package/dist/guard/store.js.map +1 -0
  51. package/dist/guard/transition.js +477 -0
  52. package/dist/guard/transition.js.map +1 -0
  53. package/dist/ir/refs.js +69 -0
  54. package/dist/ir/refs.js.map +1 -0
  55. package/dist/ir/schema.js +123 -0
  56. package/dist/ir/schema.js.map +1 -0
  57. package/dist/ir/validate.js +595 -0
  58. package/dist/ir/validate.js.map +1 -0
  59. package/dist/judge/codex_judged.js +85 -0
  60. package/dist/judge/codex_judged.js.map +1 -0
  61. package/dist/judge/fixture_judged.js +62 -0
  62. package/dist/judge/fixture_judged.js.map +1 -0
  63. package/dist/judge/judged.js +89 -0
  64. package/dist/judge/judged.js.map +1 -0
  65. package/dist/judge/pricing.js +22 -0
  66. package/dist/judge/pricing.js.map +1 -0
  67. package/dist/mcp/contracts.js +162 -0
  68. package/dist/mcp/contracts.js.map +1 -0
  69. package/dist/mcp/main.js +7 -0
  70. package/dist/mcp/main.js.map +1 -0
  71. package/dist/mcp/server.js +370 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/migrate/check.js +164 -0
  74. package/dist/migrate/check.js.map +1 -0
  75. package/dist/parallel/certificate.js +37 -0
  76. package/dist/parallel/certificate.js.map +1 -0
  77. package/dist/parallel/evaluate.js +73 -0
  78. package/dist/parallel/evaluate.js.map +1 -0
  79. package/dist/speckit/compiler.js +162 -0
  80. package/dist/speckit/compiler.js.map +1 -0
  81. 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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"}