@smartmemory/stratum 0.4.6 → 0.5.1

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 (45) hide show
  1. package/dist/cli/flow.js +61 -0
  2. package/dist/cli/flow.js.map +1 -0
  3. package/dist/cli/learn.js +9 -16
  4. package/dist/cli/learn.js.map +1 -1
  5. package/dist/cli/query_gate.js +7 -2
  6. package/dist/cli/query_gate.js.map +1 -1
  7. package/dist/cli/stratum.js +3 -1
  8. package/dist/cli/stratum.js.map +1 -1
  9. package/dist/connectors/background.js +2 -2
  10. package/dist/connectors/background.js.map +1 -1
  11. package/dist/connectors/claude.js +2 -0
  12. package/dist/connectors/claude.js.map +1 -1
  13. package/dist/connectors/codex.js +4 -0
  14. package/dist/connectors/codex.js.map +1 -1
  15. package/dist/connectors/foreground_registry.js +617 -0
  16. package/dist/connectors/foreground_registry.js.map +1 -0
  17. package/dist/connectors/index.js +1 -0
  18. package/dist/connectors/index.js.map +1 -1
  19. package/dist/connectors/proc_identity.js +28 -0
  20. package/dist/connectors/proc_identity.js.map +1 -1
  21. package/dist/connectors/runner.js +2 -0
  22. package/dist/connectors/runner.js.map +1 -1
  23. package/dist/contracts/events.json +27 -1
  24. package/dist/contracts/mcp-surface.json +176 -6
  25. package/dist/engine/checkpoint.js +1 -1
  26. package/dist/engine/checkpoint.js.map +1 -1
  27. package/dist/engine/engine.js +860 -195
  28. package/dist/engine/engine.js.map +1 -1
  29. package/dist/engine/flow_cancel.js +158 -0
  30. package/dist/engine/flow_cancel.js.map +1 -0
  31. package/dist/engine/run_lock.js +628 -0
  32. package/dist/engine/run_lock.js.map +1 -0
  33. package/dist/engine/state.js +43 -2
  34. package/dist/engine/state.js.map +1 -1
  35. package/dist/ir/refs.js +12 -0
  36. package/dist/ir/refs.js.map +1 -1
  37. package/dist/ir/schema.js +9 -0
  38. package/dist/ir/schema.js.map +1 -1
  39. package/dist/ir/validate.js +243 -29
  40. package/dist/ir/validate.js.map +1 -1
  41. package/dist/learn/smartmemory_egress.js +3 -1
  42. package/dist/learn/smartmemory_egress.js.map +1 -1
  43. package/dist/mcp/server.js +192 -4
  44. package/dist/mcp/server.js.map +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,617 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { atomicWriteJson, newRunDir } from "./background.js";
6
+ import { cancellationGraceMs } from "./cancellation.js";
7
+ import { processGroupId, processIdentity, procStartTime } from "./proc_identity.js";
8
+ /** Deliberately a SIBLING of the background registry, never a member of it (C8). `loadMeta`
9
+ * (background.ts) accepts any meta.json whose runId matches its directory, so a foreground
10
+ * codex record dropped into `agent_runs` would be loadable by `cancelBackgroundRun` and
11
+ * killed as if it were a detached background run. */
12
+ export function agentForegroundRoot() {
13
+ return join(homedir(), ".stratum", "ts", "agent_fg");
14
+ }
15
+ const REGISTRY_ID = /^[0-9a-f]{12}$/;
16
+ const REAL_PROBES = {
17
+ startTime: procStartTime,
18
+ groupId: processGroupId,
19
+ groupState: (pid) => realGroupState(pid),
20
+ kill: (pid, signal) => { process.kill(-pid, signal); },
21
+ };
22
+ function resolveProbes(options) {
23
+ return options.probes === undefined ? REAL_PROBES : { ...REAL_PROBES, ...options.probes };
24
+ }
25
+ function resolveRoot(options) {
26
+ return options.registryRoot ?? process.env.STRATUM_AGENT_FG_ROOT ?? agentForegroundRoot();
27
+ }
28
+ // ── Records ───────────────────────────────────────────────────────────────────
29
+ function isRecord(value) {
30
+ return typeof value === "object" && value !== null && !Array.isArray(value);
31
+ }
32
+ function metaPath(root, registryId) {
33
+ if (!REGISTRY_ID.test(registryId))
34
+ throw new Error(`invalid foreground registry id ${JSON.stringify(registryId)}`);
35
+ return join(root, registryId, "meta.json");
36
+ }
37
+ async function readMeta(root, registryId) {
38
+ if (!REGISTRY_ID.test(registryId))
39
+ return undefined;
40
+ let raw;
41
+ try {
42
+ raw = JSON.parse(await readFile(join(root, registryId, "meta.json"), "utf8"));
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ if (!isRecord(raw) || raw.runId !== registryId || raw.foreground !== true)
48
+ return undefined;
49
+ if (raw.agent !== "claude" && raw.agent !== "codex")
50
+ return undefined;
51
+ if (!isRecord(raw.flow) || typeof raw.flow.runId !== "string")
52
+ return undefined;
53
+ if (!Array.isArray(raw.groups))
54
+ return undefined;
55
+ if (raw.state !== "starting" && raw.state !== "running" && raw.state !== "settled")
56
+ return undefined;
57
+ return raw;
58
+ }
59
+ /** Writes the `starting` record. Throws on failure — the caller must not proceed to a spawn
60
+ * it could not record, which is the uncancellable-orphan hazard `background.ts:191-196`
61
+ * already refuses to accept on the durable path. */
62
+ export async function createForegroundRun(meta, options = {}) {
63
+ const root = resolveRoot(options);
64
+ const { runId, runDir } = await newRunDir(root);
65
+ await atomicWriteJson(join(runDir, "meta.json"), { ...meta, runId });
66
+ return runId;
67
+ }
68
+ /** Capture a registration identity, or return undefined ONLY for a positively gone pid.
69
+ * A missing token plus ESRCH means the child finished before registration. Otherwise yield
70
+ * once for Node to reap an exited child (macOS zombies can answer signal 0 successfully),
71
+ * then retry both probes. A still-live or opaque pid fails closed, including libproc failure.
72
+ * No signal other than the positive-pid existence probe is sent here. */
73
+ async function registrationStartTime(pid) {
74
+ if (Number.isSafeInteger(pid) && pid > 0) {
75
+ for (let attempt = 0; attempt < 2; attempt += 1) {
76
+ const startTime = await procStartTime(pid);
77
+ if (startTime !== undefined)
78
+ return startTime;
79
+ try {
80
+ process.kill(pid, 0);
81
+ }
82
+ catch (error) {
83
+ if (error?.code === "ESRCH")
84
+ return undefined;
85
+ }
86
+ if (attempt === 0)
87
+ await delay(25);
88
+ }
89
+ }
90
+ throw Object.assign(new Error("could not capture process start time; agent would be uncancellable"), { code: "REGISTRY_WRITE_FAILED" });
91
+ }
92
+ /** Appends one identified group and promotes the record to `running`. Serialised by the
93
+ * caller (one promise chain per run), so no lock is needed. A return without procStartTime
94
+ * means the pid is positively gone: NOTHING was appended and the lifecycle is unchanged
95
+ * until the dispatcher's finally settles it. Otherwise returns what it wrote (R3-8).
96
+ * Throws on missing identity for a live/opaque pid or on registry I/O failure. */
97
+ export async function recordForegroundGroup(registryId, pid, options = {}) {
98
+ const root = resolveRoot(options);
99
+ const meta = await readMeta(root, registryId);
100
+ if (!meta)
101
+ throw Object.assign(new Error(`foreground registry entry ${registryId} is missing or unreadable`), { code: "REGISTRY_WRITE_FAILED" });
102
+ const startTime = await registrationStartTime(pid);
103
+ const group = { childPid: pid, ...(startTime !== undefined ? { procStartTime: startTime } : {}) };
104
+ if (startTime === undefined)
105
+ return group;
106
+ const next = { ...meta, state: "running", groups: [...meta.groups, group] };
107
+ await atomicWriteJson(metaPath(root, registryId), next);
108
+ return group;
109
+ }
110
+ /** Stamps `settled`. Never deletes the directory: a reader that raced the settle must see a
111
+ * stamped record rather than an ENOENT it would have to interpret. */
112
+ export async function settleForegroundRun(registryId, options = {}) {
113
+ const root = resolveRoot(options);
114
+ const meta = await readMeta(root, registryId);
115
+ if (!meta)
116
+ throw Object.assign(new Error(`foreground registry entry ${registryId} is missing or unreadable`), { code: "REGISTRY_WRITE_FAILED" });
117
+ if (meta.state === "settled")
118
+ return;
119
+ await atomicWriteJson(metaPath(root, registryId), { ...meta, state: "settled", settledAt: new Date().toISOString() });
120
+ }
121
+ // ── Killing ───────────────────────────────────────────────────────────────────
122
+ /** Only ESRCH means dead. EPERM means "exists, not ours" — reported as unreachable, never as
123
+ * reaped. The lifecycle test helper's bare catch
124
+ * (ts/tests/connectors/background-codex-lifecycle.test.ts:34-41) gets this wrong and must not
125
+ * be copied here (invariant 13). */
126
+ function realGroupState(pid) {
127
+ try {
128
+ process.kill(-pid, 0);
129
+ return "alive";
130
+ }
131
+ catch (error) {
132
+ return error.code === "ESRCH" ? "gone" : "unknown";
133
+ }
134
+ }
135
+ /** Every probe on the signal path is an `await` on another process, and an unbounded one turns
136
+ * the caller's absolute deadline into a suggestion (F6). A probe that has not answered by the
137
+ * deadline yields no verdict at all — `undefined` — and the caller stops rather than acting on
138
+ * an answer nobody is still waiting for. */
139
+ async function bounded(work, deadline) {
140
+ const remaining = deadline - Date.now();
141
+ if (remaining <= 0) {
142
+ void work.catch(() => undefined);
143
+ return undefined;
144
+ }
145
+ let timer;
146
+ const expiry = new Promise((resolve) => {
147
+ timer = setTimeout(() => resolve(undefined), remaining);
148
+ timer.unref?.();
149
+ });
150
+ try {
151
+ return await Promise.race([work.then((value) => ({ value })), expiry]);
152
+ }
153
+ finally {
154
+ clearTimeout(timer);
155
+ }
156
+ }
157
+ async function identityVerdict(probes, pid, expected, deadline) {
158
+ if (!expected)
159
+ return "mismatch";
160
+ const probed = await bounded(probes.startTime(pid), deadline);
161
+ if (probed === undefined)
162
+ return "deadline";
163
+ return probed.value === expected ? "match" : "mismatch";
164
+ }
165
+ /**
166
+ * The four gates from `background.ts:444-452`, plus the prior question they never asked.
167
+ *
168
+ * TRI-STATE, because "we did not signal it" is two different facts. A group that is already
169
+ * gone (ESRCH on the group probe) is RESOLVED — the thing we wanted dead is dead — while a
170
+ * group whose identity does not match, or cannot be read, is UNREACHABLE and can never be
171
+ * acknowledged. The old boolean collapsed both into `false` and recorded both as unreachable,
172
+ * so an agent that exited a moment before the cancel arrived permanently blocked the
173
+ * acknowledgement of a teardown that had already happened.
174
+ */
175
+ async function signalGroup(probes, pid, expected, deadline) {
176
+ if (Date.now() >= deadline)
177
+ return "deadline";
178
+ if (probes.groupState(pid) === "gone")
179
+ return "gone";
180
+ const first = await identityVerdict(probes, pid, expected, deadline);
181
+ if (first === "deadline")
182
+ return "deadline";
183
+ if (first === "mismatch") {
184
+ // Re-probe: the identity may have failed to read BECAUSE the process exited between the
185
+ // group probe above and here, which is a `gone`, not an unreachable.
186
+ return probes.groupState(pid) === "gone" ? "gone" : "unreachable";
187
+ }
188
+ const leader = await bounded(probes.groupId(pid), deadline);
189
+ if (leader === undefined)
190
+ return "deadline";
191
+ if (leader.value !== pid)
192
+ return "unreachable";
193
+ // Verify the start-time identity a second time immediately before the only signal.
194
+ const second = await identityVerdict(probes, pid, expected, deadline);
195
+ if (second === "deadline")
196
+ return "deadline";
197
+ // Re-probe, exactly as the FIRST mismatch branch does (F6). An exit between the group-leader
198
+ // probe and here leaves no readable start time, which reads as a mismatch — so a teardown that
199
+ // demonstrably completed was reported `unreachable` and could never be acknowledged.
200
+ if (second === "mismatch")
201
+ return probes.groupState(pid) === "gone" ? "gone" : "unreachable";
202
+ // The LAST word before the signal is the clock (F6). A SIGTERM sent after the caller's
203
+ // deadline has no grace window left to run in and no reap pass left to confirm it: it is a
204
+ // signal delivered to a child nobody is waiting on.
205
+ if (Date.now() >= deadline)
206
+ return "deadline";
207
+ try {
208
+ probes.kill(pid, "SIGTERM");
209
+ }
210
+ catch (error) {
211
+ return error.code === "ESRCH" ? "gone" : "unreachable";
212
+ }
213
+ return "signalled";
214
+ }
215
+ /**
216
+ * SIGKILL escalation, through the SAME gates as the SIGTERM — re-run here, immediately before
217
+ * the signal, never inherited from the earlier pass.
218
+ *
219
+ * The escalation used to be a bare `process.kill(-pid, "SIGKILL")` on the recorded number. The
220
+ * gap between SIGTERM and SIGKILL is the grace window, by construction the longest pause in the
221
+ * whole teardown, and it is exactly the window in which the group leader exits and its pid is
222
+ * handed to something else. A kill by pid alone at the end of it is a SIGKILL delivered to a
223
+ * stranger's process group.
224
+ */
225
+ async function escalateGroup(probes, pid, expected, deadline) {
226
+ if (Date.now() >= deadline)
227
+ return "deadline";
228
+ if (probes.groupState(pid) === "gone")
229
+ return "gone";
230
+ const first = await identityVerdict(probes, pid, expected, deadline);
231
+ if (first === "deadline")
232
+ return "deadline";
233
+ if (first === "mismatch") {
234
+ return probes.groupState(pid) === "gone" ? "gone" : "unreachable";
235
+ }
236
+ const leader = await bounded(probes.groupId(pid), deadline);
237
+ if (leader === undefined)
238
+ return "deadline";
239
+ if (leader.value !== pid)
240
+ return "unreachable";
241
+ // F5: the identity is checked AGAIN after the group-leader probe, immediately before the
242
+ // SIGKILL — never inherited across that await. The whole reason the escalation re-runs the
243
+ // gates is that a pid can be reissued while they run; a check that stops one await short of
244
+ // the signal reintroduces exactly the window it was added to close.
245
+ const second = await identityVerdict(probes, pid, expected, deadline);
246
+ if (second === "deadline")
247
+ return "deadline";
248
+ // Same re-probe as the first branch (F6): the grace window is the longest pause in the whole
249
+ // teardown, so the leader exiting DURING this second check is the expected case, not an edge.
250
+ if (second === "mismatch")
251
+ return probes.groupState(pid) === "gone" ? "gone" : "unreachable";
252
+ if (Date.now() >= deadline)
253
+ return "deadline";
254
+ try {
255
+ probes.kill(pid, "SIGKILL");
256
+ }
257
+ catch (error) {
258
+ return error.code === "ESRCH" ? "gone" : "unreachable";
259
+ }
260
+ return "escalated";
261
+ }
262
+ const REAP_POLL_MS = 10;
263
+ /** SIGTERM → grace → SIGKILL → reap, for ONE group, using its RECORDED identity (R3-8). A
264
+ * `process.kill(-pid, …)` without the start-time token is a kill by pid alone, which is the
265
+ * recycled-pid hazard the four gates exist to close — so a call with no `startTime` signals
266
+ * nothing and reports `unreachable`. */
267
+ export async function killAndReapGroup(pid, options = {}) {
268
+ const probes = resolveProbes(options);
269
+ const deadline = resolveDeadline(options);
270
+ const grace = requireDuration(options.graceMs ?? cancellationGraceMs(), "graceMs");
271
+ // No recorded identity, a mismatched one, a non-leader or a refused signal: there is no
272
+ // group we can honestly claim to have killed (invariant 15b). A group already gone is a
273
+ // different answer entirely, and a resolved one.
274
+ //
275
+ // The deadline goes IN (F6). Without it this call could send its SIGTERM after the caller's
276
+ // budget had already expired, then report a timeout for a signal it had just issued.
277
+ const signal = await signalGroup(probes, pid, options.startTime, deadline);
278
+ if (signal === "deadline")
279
+ return "timeout";
280
+ if (signal !== "signalled")
281
+ return signal;
282
+ // The grace clock starts at OUR SIGTERM, not at the top of the call.
283
+ const escalateAt = Date.now() + grace;
284
+ let escalated = false;
285
+ let last = "alive";
286
+ while (Date.now() < deadline) {
287
+ const state = probes.groupState(pid);
288
+ if (state === "gone")
289
+ return "reaped";
290
+ last = state;
291
+ if (!escalated && Date.now() >= escalateAt) {
292
+ escalated = true;
293
+ const result = await escalateGroup(probes, pid, options.startTime, deadline);
294
+ if (result === "gone")
295
+ return "reaped";
296
+ if (result === "unreachable")
297
+ return "unreachable";
298
+ }
299
+ await delay(REAP_POLL_MS);
300
+ }
301
+ const final = probes.groupState(pid);
302
+ if (final === "gone")
303
+ return "reaped";
304
+ return final === "unknown" || last === "unknown" ? "unreachable" : "timeout";
305
+ }
306
+ export function cancelTimeoutMs(env = process.env) {
307
+ const value = Number(env.STRATUM_CANCEL_TIMEOUT_MS ?? 15000);
308
+ if (!Number.isFinite(value) || value < 0)
309
+ throw new Error("STRATUM_CANCEL_TIMEOUT_MS must be a nonnegative number");
310
+ return value;
311
+ }
312
+ /** A caller-supplied budget gets the same treatment as an env one (F6): `Date.now() + NaN` is
313
+ * NaN, `Date.now() >= NaN` is false forever, and the reap loop that trusts it never ends. */
314
+ function requireDuration(value, name) {
315
+ if (!Number.isFinite(value) || value < 0)
316
+ throw new Error(`${name} must be a nonnegative finite number`);
317
+ return value;
318
+ }
319
+ /** THE one place a teardown deadline is resolved (F3). `deadlineAt` used to bypass
320
+ * `requireDuration` entirely — it is an absolute instant, not a duration, so no validator ever
321
+ * saw it — and a NaN one is exactly as fatal: every `Date.now() >= deadline` test against it is
322
+ * false, so the reap loop that trusts it runs forever. Every entry point resolves through here,
323
+ * so neither shape can reach a loop unvalidated. */
324
+ function resolveDeadline(options) {
325
+ if (options.deadlineAt === undefined) {
326
+ return Date.now() + requireDuration(options.timeoutMs ?? cancelTimeoutMs(), "timeoutMs");
327
+ }
328
+ if (!Number.isFinite(options.deadlineAt)) {
329
+ throw new Error("deadlineAt must be a finite epoch-millisecond timestamp");
330
+ }
331
+ return options.deadlineAt;
332
+ }
333
+ // ── The sweep ─────────────────────────────────────────────────────────────────
334
+ async function scan(root, flowRunId) {
335
+ let names;
336
+ try {
337
+ names = await readdir(root);
338
+ }
339
+ catch (error) {
340
+ // An empty registry is the normal case: most flows never dispatch a foreground agent.
341
+ if (error.code === "ENOENT")
342
+ return [];
343
+ throw error;
344
+ }
345
+ const found = [];
346
+ for (const name of names) {
347
+ if (!REGISTRY_ID.test(name))
348
+ continue;
349
+ const meta = await readMeta(root, name);
350
+ if (!meta || meta.flow.runId !== flowRunId)
351
+ continue;
352
+ found.push({ id: name, meta });
353
+ }
354
+ return found;
355
+ }
356
+ function absorb(accumulated, id, meta) {
357
+ let entry = accumulated.entries.get(id);
358
+ if (!entry) {
359
+ entry = {
360
+ groups: new Map(),
361
+ state: meta.state,
362
+ settled: meta.state === "settled",
363
+ alreadySettled: meta.state === "settled",
364
+ ...(typeof meta.serverPid === "number" ? { serverPid: meta.serverPid } : {}),
365
+ ...(typeof meta.serverProcStartTime === "string" ? { serverProcStartTime: meta.serverProcStartTime } : {}),
366
+ };
367
+ accumulated.entries.set(id, entry);
368
+ }
369
+ entry.state = meta.state;
370
+ if (meta.state === "settled")
371
+ entry.settled = true;
372
+ // Re-read the owner every pass rather than trusting the first observation: the record a
373
+ // sweep first sees may be a `starting` one whose fields are still being filled in.
374
+ if (typeof meta.serverPid === "number")
375
+ entry.serverPid = meta.serverPid;
376
+ else
377
+ delete entry.serverPid;
378
+ if (typeof meta.serverProcStartTime === "string")
379
+ entry.serverProcStartTime = meta.serverProcStartTime;
380
+ else
381
+ delete entry.serverProcStartTime;
382
+ for (const group of meta.groups) {
383
+ if (typeof group.childPid !== "number")
384
+ continue;
385
+ if (entry.groups.has(group.childPid))
386
+ continue;
387
+ entry.groups.set(group.childPid, {
388
+ ...(group.procStartTime !== undefined ? { startTime: group.procStartTime } : {}),
389
+ everSignalled: false,
390
+ });
391
+ }
392
+ return entry;
393
+ }
394
+ /** Steps 1-2 of §2.4: enumerate the flow's unsettled entries and send each recorded group its
395
+ * one SIGTERM, through the four identity gates. The bookkeeping it returns is carried into
396
+ * `reapFlowAgents` so nothing is double-counted across the rescan passes. */
397
+ export async function signalFlowAgents(flowRunId, options = {}) {
398
+ const accumulated = { entries: new Map() };
399
+ // The SIGNAL pass shares the caller's one absolute deadline (R3-5). Without it a slow scan
400
+ // can hand the reap a budget that is already spent, and — worse — keep sending SIGTERMs
401
+ // after the caller has given up waiting for anything to answer them.
402
+ await sweepPass(resolveRoot(options), flowRunId, accumulated, {
403
+ escalate: false,
404
+ deadline: resolveDeadline(options),
405
+ graceMs: requireDuration(options.graceMs ?? cancellationGraceMs(), "graceMs"),
406
+ probes: resolveProbes(options),
407
+ });
408
+ return accumulated;
409
+ }
410
+ async function sweepPass(root, flowRunId, accumulated, options) {
411
+ const { probes } = options;
412
+ for (const { id, meta } of await scan(root, flowRunId)) {
413
+ const entry = absorb(accumulated, id, meta);
414
+ for (const [pid, group] of entry.groups) {
415
+ if (group.outcome === "reaped" || group.outcome === "gone" || group.outcome === "unreachable")
416
+ continue;
417
+ // A settled entry is never SIGNALLED again (invariant 14) — but its already-signalled
418
+ // groups are still PROBED below. Skipping a settled entry outright leaves the probe
419
+ // taken during the signal pass as the final verdict, and that probe is `unknown` for
420
+ // the whole window in which the leader is dead but not yet reaped by its parent — so
421
+ // an agent whose teardown demonstrably completed would be reported `unreachable` and
422
+ // could never be acknowledged.
423
+ if (entry.settled && !group.everSignalled)
424
+ continue;
425
+ if (!group.everSignalled) {
426
+ // Past the deadline nothing new is signalled: a SIGTERM sent now has no grace window
427
+ // left to run in and no reap pass left to confirm it. The group stays unresolved and
428
+ // is reported as such, which is the honest answer.
429
+ if (Date.now() >= options.deadline)
430
+ continue;
431
+ const signal = await signalGroup(probes, pid, group.startTime, options.deadline);
432
+ // The deadline expired inside the gates: no signal was sent, so the group is left
433
+ // unresolved and reported as such rather than given a verdict nobody probed for.
434
+ if (signal === "deadline")
435
+ continue;
436
+ if (signal === "gone") {
437
+ group.outcome = "gone";
438
+ delete group.lastProbe;
439
+ continue;
440
+ }
441
+ if (signal === "unreachable") {
442
+ // An identity mismatch means the pid is now some other process: the group we
443
+ // recorded is gone too, but we never signalled it, and we cannot prove which — so
444
+ // it is `unreachable`, not `gone`. Collapsing the two would let a recycled pid read
445
+ // as a teardown.
446
+ group.outcome = "unreachable";
447
+ continue;
448
+ }
449
+ group.everSignalled = true;
450
+ group.outcome = "signalled";
451
+ // Per-group grace, clocked from THIS SIGTERM (F5).
452
+ group.escalateAt = Date.now() + options.graceMs;
453
+ }
454
+ const state = probes.groupState(pid);
455
+ if (state === "gone") {
456
+ group.outcome = "reaped";
457
+ delete group.lastProbe;
458
+ continue;
459
+ }
460
+ group.lastProbe = state;
461
+ const escalateAt = group.escalateAt ?? options.deadline;
462
+ if (options.escalate && !entry.settled && Date.now() >= escalateAt && Date.now() < options.deadline) {
463
+ // F6: the identity and group-leader gates are re-run here, immediately before the
464
+ // SIGKILL. The grace window is long enough for the leader to exit and its pid to be
465
+ // reissued, and a kill by bare pgid at the end of it lands on a stranger.
466
+ const result = await escalateGroup(probes, pid, group.startTime, options.deadline);
467
+ if (result === "deadline")
468
+ continue;
469
+ if (result === "gone") {
470
+ group.outcome = "reaped";
471
+ delete group.lastProbe;
472
+ continue;
473
+ }
474
+ if (result === "unreachable") {
475
+ group.outcome = "unreachable";
476
+ delete group.lastProbe;
477
+ }
478
+ }
479
+ }
480
+ }
481
+ }
482
+ function resolvedOutcome(outcome) {
483
+ return outcome === "reaped" || outcome === "gone" || outcome === "unreachable";
484
+ }
485
+ function entryResolved(entry) {
486
+ // Multi-group Claude entries (C9) follow the same rule: every pid must be resolved.
487
+ for (const group of entry.groups.values()) {
488
+ // A group this sweep never signalled belongs to an entry that was already settled when we
489
+ // arrived: it is not ours to tear down and never blocks resolution. A group we DID signal
490
+ // blocks it until the probe answers, settled entry or not — the entry settling says the
491
+ // dispatcher unwound, not that the process group is gone.
492
+ if (entry.settled && !group.everSignalled)
493
+ continue;
494
+ if (!resolvedOutcome(group.outcome))
495
+ return false;
496
+ }
497
+ // Reaping the groups is not the same as the entry being over, and `summarise` says so:
498
+ // it counts every unsettled entry as `unsettled` whatever its groups did (R3-6). Breaking
499
+ // the poll here would stop watching an entry the owning dispatcher is still unwinding and
500
+ // then report that as a teardown failure — so an unsettled entry keeps the poll alive until
501
+ // it settles or the deadline answers for it.
502
+ return entry.settled;
503
+ }
504
+ /** Steps 3-5 of §2.4: grace, escalation, reap and rescan, all under ONE absolute deadline.
505
+ * The loop re-reads the directory rather than trusting one snapshot, because an entry can
506
+ * move `starting → running` while the sweep is in progress. */
507
+ export async function reapFlowAgents(flowRunId, signalled, options = {}) {
508
+ const root = resolveRoot(options);
509
+ const deadline = resolveDeadline(options);
510
+ const graceMs = requireDuration(options.graceMs ?? cancellationGraceMs(), "graceMs");
511
+ const identity = options.identity ?? processIdentity;
512
+ const probes = resolveProbes(options);
513
+ while (true) {
514
+ // `escalate: true` unconditionally: each group carries its OWN escalation instant now, so
515
+ // the pass decides per group rather than off one clock that started before some of them
516
+ // had even been signalled.
517
+ await sweepPass(root, flowRunId, signalled, { escalate: true, deadline, graceMs, probes });
518
+ await applyDeadOwnerException(root, signalled, identity, deadline);
519
+ if ([...signalled.entries.values()].every(entryResolved))
520
+ break;
521
+ if (Date.now() >= deadline)
522
+ break;
523
+ await delay(REAP_POLL_MS);
524
+ }
525
+ // At the deadline a standing `unknown` is the final answer: EPERM means "exists, not ours",
526
+ // which is never a reap and never a licence to acknowledge (invariant 13).
527
+ for (const entry of signalled.entries.values()) {
528
+ for (const group of entry.groups.values()) {
529
+ if (group.outcome === "signalled" && group.lastProbe === "unknown")
530
+ group.outcome = "unreachable";
531
+ }
532
+ }
533
+ return summarise(signalled);
534
+ }
535
+ /** Convenience for callers that do not need to interleave a local teardown between the two
536
+ * phases (S03 does; the CLI and the tests mostly do not). */
537
+ export async function cancelFlowAgents(flowRunId, options = {}) {
538
+ // ONE deadline, resolved here and handed to BOTH phases (F7). Passing `options` through gave
539
+ // each phase its own `timeoutMs` budget, so a slow signal pass did not eat into the reap's
540
+ // time — it doubled the total, and a caller that configured 15s could wait 30.
541
+ const shared = { ...options, deadlineAt: resolveDeadline(options) };
542
+ return reapFlowAgents(flowRunId, await signalFlowAgents(flowRunId, shared), shared);
543
+ }
544
+ /** The sweep stamps `settled` itself ONLY when the owning server is PROVABLY dead and every
545
+ * recorded group is resolved (R3-6, R4-3). A pid-only check would read a recycled pid as "the
546
+ * server is gone" and stamp a live dispatcher's entry settled, so the owner's start time is
547
+ * required — an entry written without `serverProcStartTime` is never eligible. And the probe
548
+ * is the TRI-STATE one: `unknown` (EPERM, or a start time we could not read) is never a
549
+ * licence to reclaim another process's record. */
550
+ async function applyDeadOwnerException(root, accumulated, identity, deadline) {
551
+ for (const [id, entry] of accumulated.entries) {
552
+ if (entry.settled || entry.state === "starting")
553
+ continue;
554
+ if (entry.serverPid === undefined || entry.serverProcStartTime === undefined)
555
+ continue;
556
+ if (entry.groups.size === 0)
557
+ continue;
558
+ let resolved = true;
559
+ for (const group of entry.groups.values()) {
560
+ if (!resolvedOutcome(group.outcome)) {
561
+ resolved = false;
562
+ break;
563
+ }
564
+ }
565
+ if (!resolved)
566
+ continue;
567
+ // Bounded like every other probe on this path (F6): the owner probe is a shell-out on
568
+ // darwin, and an unbounded one lets a single slow answer run the reap loop past the
569
+ // caller's deadline.
570
+ const owner = await bounded(identity(entry.serverPid, entry.serverProcStartTime), deadline);
571
+ if (owner === undefined || owner.value !== "dead")
572
+ continue;
573
+ try {
574
+ await settleForegroundRun(id, { registryRoot: root });
575
+ entry.settled = true;
576
+ }
577
+ catch { /* a stale entry is reported as unsettled rather than claimed */ }
578
+ }
579
+ }
580
+ function summarise(accumulated) {
581
+ const summary = { signalled: 0, reaped: 0, gone: 0, unreachable: 0, alreadySettled: 0, unresolved: 0, unsettled: 0, unreaped: 0 };
582
+ for (const entry of accumulated.entries.values()) {
583
+ if (entry.alreadySettled) {
584
+ summary.alreadySettled += 1;
585
+ continue;
586
+ }
587
+ for (const group of entry.groups.values()) {
588
+ // F7: the SAME exclusion `sweepPass` and `entryResolved` already apply. A group belonging
589
+ // to an entry that settled before we signalled it is not ours to tear down — the sweep
590
+ // deliberately never signals it and `entryResolved` deliberately ignores it — so counting
591
+ // its absent outcome as `unreaped` here contradicted both and turned an entry that went
592
+ // `starting → settled` mid-sweep into a teardown timeout for a group nobody touched.
593
+ //
594
+ // ONLY the outcome-less ones. A group that was probed and found `gone` on a settled entry
595
+ // is a real, reported verdict; dropping it too would hide the very counter that lets a
596
+ // flow whose agent exited on its own be acknowledged.
597
+ if (entry.settled && !group.everSignalled && group.outcome === undefined)
598
+ continue;
599
+ if (group.everSignalled)
600
+ summary.signalled += 1;
601
+ if (group.outcome === "reaped")
602
+ summary.reaped += 1;
603
+ else if (group.outcome === "gone")
604
+ summary.gone += 1;
605
+ else if (group.outcome === "unreachable")
606
+ summary.unreachable += 1;
607
+ else
608
+ summary.unreaped += 1;
609
+ }
610
+ if (entry.state === "starting" && !entry.settled)
611
+ summary.unresolved += 1;
612
+ if (!entry.settled)
613
+ summary.unsettled += 1;
614
+ }
615
+ return summary;
616
+ }
617
+ //# sourceMappingURL=foreground_registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foreground_registry.js","sourceRoot":"","sources":["../../src/connectors/foreground_registry.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ export * from "./background.js";
2
2
  export * from "./base.js";
3
3
  export * from "./claude.js";
4
4
  export * from "./codex.js";
5
+ export * from "./foreground_registry.js";
5
6
  export * from "./proc_identity.js";
6
7
  export * from "./runner.js";
7
8
  //# sourceMappingURL=index.js.map