@sensigo/realm 0.26.0 → 0.28.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 (57) hide show
  1. package/dist/engine/claim-liveness.d.ts +59 -11
  2. package/dist/engine/claim-liveness.d.ts.map +1 -1
  3. package/dist/engine/claim-liveness.js +83 -19
  4. package/dist/engine/claim-liveness.js.map +1 -1
  5. package/dist/engine/eligibility.d.ts +13 -0
  6. package/dist/engine/eligibility.d.ts.map +1 -1
  7. package/dist/engine/eligibility.js +20 -8
  8. package/dist/engine/eligibility.js.map +1 -1
  9. package/dist/engine/execution-loop.d.ts +13 -0
  10. package/dist/engine/execution-loop.d.ts.map +1 -1
  11. package/dist/engine/execution-loop.js +496 -58
  12. package/dist/engine/execution-loop.js.map +1 -1
  13. package/dist/engine/reclaim-step.d.ts.map +1 -1
  14. package/dist/engine/reclaim-step.js +187 -12
  15. package/dist/engine/reclaim-step.js.map +1 -1
  16. package/dist/engine/trace-adoption.d.ts +53 -0
  17. package/dist/engine/trace-adoption.d.ts.map +1 -0
  18. package/dist/engine/trace-adoption.js +49 -0
  19. package/dist/engine/trace-adoption.js.map +1 -0
  20. package/dist/evidence/snapshot.d.ts +11 -1
  21. package/dist/evidence/snapshot.d.ts.map +1 -1
  22. package/dist/evidence/snapshot.js +1 -0
  23. package/dist/evidence/snapshot.js.map +1 -1
  24. package/dist/index.d.ts +8 -6
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +8 -5
  27. package/dist/index.js.map +1 -1
  28. package/dist/store/fs-io.d.ts +26 -0
  29. package/dist/store/fs-io.d.ts.map +1 -1
  30. package/dist/store/fs-io.js +37 -2
  31. package/dist/store/fs-io.js.map +1 -1
  32. package/dist/store/json-file-store.d.ts.map +1 -1
  33. package/dist/store/json-file-store.js +2 -5
  34. package/dist/store/json-file-store.js.map +1 -1
  35. package/dist/store/trace-buffer-store.d.ts +419 -7
  36. package/dist/store/trace-buffer-store.d.ts.map +1 -1
  37. package/dist/store/trace-buffer-store.js +401 -30
  38. package/dist/store/trace-buffer-store.js.map +1 -1
  39. package/dist/types/response-envelope.d.ts +20 -0
  40. package/dist/types/response-envelope.d.ts.map +1 -1
  41. package/dist/types/run-record.d.ts +60 -15
  42. package/dist/types/run-record.d.ts.map +1 -1
  43. package/dist/types/workflow-definition.d.ts +52 -7
  44. package/dist/types/workflow-definition.d.ts.map +1 -1
  45. package/dist/types/workflow-definition.js +15 -0
  46. package/dist/types/workflow-definition.js.map +1 -1
  47. package/dist/types/workflow-error.d.ts +1 -1
  48. package/dist/types/workflow-error.d.ts.map +1 -1
  49. package/dist/types/workflow-error.js.map +1 -1
  50. package/dist/workflow/diagnostics.d.ts +15 -6
  51. package/dist/workflow/diagnostics.d.ts.map +1 -1
  52. package/dist/workflow/diagnostics.js +16 -8
  53. package/dist/workflow/diagnostics.js.map +1 -1
  54. package/dist/workflow/yaml-loader.d.ts.map +1 -1
  55. package/dist/workflow/yaml-loader.js +108 -6
  56. package/dist/workflow/yaml-loader.js.map +1 -1
  57. package/package.json +1 -1
@@ -1,8 +1,29 @@
1
1
  import { WorkflowError } from '../types/workflow-error.js';
2
+ /** PER-WRITER budget (issue #197 PR-1 re-documentation — value unchanged): the ceiling for ONE
3
+ * writer's own share of a (runId, stepId) buffer — the nonce that made the call, or ⊥ (the
4
+ * bare/anonymous writer class) for a call with no nonce. An all-bare WAL has exactly one writer
5
+ * (⊥), so this is the ONLY ceiling that can ever bind there — byte-identity with pre-#197
6
+ * behavior is emergent from that fact, not a special case. */
2
7
  export const BUFFER_LIMIT_COUNT = 200;
8
+ /** See `BUFFER_LIMIT_COUNT` — the per-writer BYTE ceiling. */
3
9
  export const BUFFER_LIMIT_BYTES = 100 * 1024; // 100 KB
4
10
  export const FINAL_LIMIT_ENTRIES = 100;
5
11
  export const FINAL_LIMIT_BYTES = 50 * 1024; // 50 KB (must match MAX_BYTES in trace-normalizer.ts)
12
+ /** Whole-FILE backstop (issue #197 PR-1, additive, design §5): the ceiling across EVERY writer
13
+ * sharing a (runId, stepId) key combined, regardless of nonce — 2× the per-writer ceiling.
14
+ * Unconditional: enforced even on a store that hasn't seen a single nonced append, though it is
15
+ * UNREACHABLE in the all-bare case (the lone writer ⊥ already refuses at the per-writer ceiling,
16
+ * which is half the backstop — the backstop only ever binds when at least one OTHER writer's
17
+ * residue is sharing the file). */
18
+ export const BUFFER_BACKSTOP_COUNT = 2 * BUFFER_LIMIT_COUNT;
19
+ /** See `BUFFER_BACKSTOP_COUNT` — the whole-file BYTE backstop. */
20
+ export const BUFFER_BACKSTOP_BYTES = 2 * BUFFER_LIMIT_BYTES;
21
+ /** Per-(runId, stepId) seal budget (issue #197 PR-1, the `seal` rung, design §4): the maximum
22
+ * number of sealed artifacts one key may accumulate. On reaching the cap, `sealFenced` returns
23
+ * `{sealed: false, reason: 'capped'}` — the caller falls back to the existing destructive drain
24
+ * (`deleteFenced`), bounded and loud, rather than silently evicting an existing sealed artifact
25
+ * to make room. */
26
+ export const SEALED_ARTIFACTS_LIMIT_PER_STEP = 8;
6
27
  const MAX_EVENT_LENGTH = 100;
7
28
  const RESERVED_PREFIX = 'trace.';
8
29
  const MAX_DATA_KEYS = 20;
@@ -45,27 +66,272 @@ export function normalizeEntryForBuffer(entry) {
45
66
  ...(data !== undefined ? { data } : {}),
46
67
  };
47
68
  }
69
+ // ---------------------------------------------------------------------------------------------
70
+ // Capability-ladder predicates (issue #197 PR-1, design §3) — the ONLY authoritative way to check
71
+ // a rung. TCK, tools, and engine (PR-2) must all use these; no ad-hoc `typeof` checks for the new
72
+ // rungs anywhere else. Each predicate = declared in `traceCapabilities` AND every method that
73
+ // rung (and every rung beneath it) requires is actually present — declaration alone, or method
74
+ // presence alone, is never sufficient.
75
+ // ---------------------------------------------------------------------------------------------
76
+ /**
77
+ * True iff `store` both DECLARES the `seal` rung (in `traceCapabilities`) AND actually implements
78
+ * every method that rung requires: the full fenced trio (`appendFenced`/`deleteFenced`/
79
+ * `deleteAllForRunFenced`, issue #207) PLUS `sealFenced` PLUS `listSealedForRun` (the ladder: seal
80
+ * requires the trio). This is the ONLY authoritative `seal` predicate.
81
+ */
82
+ export function storeDeclaresSeal(store) {
83
+ const declared = store.traceCapabilities?.has('seal') ?? false;
84
+ const methodsPresent = typeof store.appendFenced === 'function' &&
85
+ typeof store.deleteFenced === 'function' &&
86
+ typeof store.deleteAllForRunFenced === 'function' &&
87
+ typeof store.sealFenced === 'function' &&
88
+ typeof store.listSealedForRun === 'function';
89
+ return declared && methodsPresent;
90
+ }
91
+ /**
92
+ * True iff `store` both DECLARES `writer_nonce_carriage` (in `traceCapabilities`) AND satisfies
93
+ * `storeDeclaresSeal` (the ladder: carriage requires seal requires the trio). Carriage itself
94
+ * adds no NEW required method — the `options` bag on `append`/`appendFenced` is declaration-only
95
+ * (there is no way to detect "does this implementation actually read the options bag" other than
96
+ * declared capability + behavior), so this predicate is exactly "declared AND seal holds". This
97
+ * is the ONLY authoritative `writer_nonce_carriage` predicate.
98
+ */
99
+ export function storeDeclaresNonceCarriage(store) {
100
+ const declared = store.traceCapabilities?.has('writer_nonce_carriage') ?? false;
101
+ return declared && storeDeclaresSeal(store);
102
+ }
103
+ /**
104
+ * Wiring-time validation MECHANISM (issue #197 PR-1, design §3/§12 — INVOKING this at the
105
+ * injection seams, e.g. `server.ts`/CLI executors, is deliberately PR-2's job, not this one's).
106
+ * Typed fail-loud (a `TRACE_CAPABILITY_INCONSISTENT` `WorkflowError`) when a rung is DECLARED but
107
+ * its predicate does not hold (declared-but-inconsistent — a construction-time wiring defect,
108
+ * never a runtime condition worth retrying). Silent success when a rung is simply undeclared —
109
+ * the honest floor: trio-alone, or no capabilities at all, are both fully legal and never an
110
+ * error.
111
+ */
112
+ export function validateTraceCapabilities(store) {
113
+ const caps = store.traceCapabilities;
114
+ if (caps === undefined)
115
+ return;
116
+ if (caps.has('seal') && !storeDeclaresSeal(store)) {
117
+ throw new WorkflowError("TraceBufferStore declares the 'seal' capability but does not implement all of its " +
118
+ 'required methods (the fenced trio + sealFenced + listSealedForRun) — declared but ' +
119
+ 'inconsistent.', {
120
+ code: 'TRACE_CAPABILITY_INCONSISTENT',
121
+ category: 'ENGINE',
122
+ agentAction: 'stop',
123
+ retryable: false,
124
+ details: { capability: 'seal' },
125
+ });
126
+ }
127
+ if (caps.has('writer_nonce_carriage') && !storeDeclaresNonceCarriage(store)) {
128
+ throw new WorkflowError("TraceBufferStore declares the 'writer_nonce_carriage' capability but its 'seal' " +
129
+ 'predicate does not hold (carriage requires seal requires the fenced trio) — declared ' +
130
+ 'but inconsistent.', {
131
+ code: 'TRACE_CAPABILITY_INCONSISTENT',
132
+ category: 'ENGINE',
133
+ agentAction: 'stop',
134
+ retryable: false,
135
+ details: { capability: 'writer_nonce_carriage' },
136
+ });
137
+ }
138
+ }
139
+ /**
140
+ * Pure per-writer + whole-file budget decision (issue #197 PR-1, design §5) — shared by every
141
+ * `TraceBufferStore` implementation enforcing this pair, so the decision logic and the
142
+ * `BufferFullDetails` shape live in exactly ONE place rather than being independently
143
+ * (and riskily divergently) reimplemented per store. Deliberately takes BEFORE-and-AFTER pairs
144
+ * (rather than a "delta" this call would add) because the two shipped stores compute "after"
145
+ * differently and both must stay exact: the fs store's JSONL format is genuinely additive (byte
146
+ * delta = the one new line's own serialized size), but the in-memory store's byte-identity
147
+ * constraint requires re-serializing the WHOLE flattened array exactly as its pre-#197 formula
148
+ * always did — forcing a shared "delta" abstraction on top of that would risk being byte-inexact
149
+ * for one of the two stores. Returns `undefined` when neither ceiling would be exceeded.
150
+ *
151
+ * Writer scope is checked FIRST: if the appender's own share alone would exceed the per-writer
152
+ * ceiling, that is what gets reported — a caller whose own share already exceeds the (smaller)
153
+ * per-writer ceiling should be told that specifically, not the (less actionable, and in that
154
+ * case also necessarily true) whole-file ceiling. This ordering is also what makes the compat
155
+ * law hold: an all-bare file's lone writer (⊥) hits `scope:'writer'` at exactly today's legacy
156
+ * limits — the file backstop (2×) is arithmetically unreachable for a single writer alone.
157
+ */
158
+ export function checkBufferBudget(params) {
159
+ const writerCountOver = params.writerCountAfter > BUFFER_LIMIT_COUNT;
160
+ const writerBytesOver = params.writerBytesAfter > BUFFER_LIMIT_BYTES;
161
+ if (writerCountOver || writerBytesOver) {
162
+ return {
163
+ scope: 'writer',
164
+ binding_dimension: writerCountOver ? 'count' : 'bytes',
165
+ count: {
166
+ requested: params.writerCountAfter,
167
+ used: params.writerCountBefore,
168
+ limit: BUFFER_LIMIT_COUNT,
169
+ },
170
+ bytes: {
171
+ requested: params.writerBytesAfter,
172
+ used: params.writerBytesBefore,
173
+ limit: BUFFER_LIMIT_BYTES,
174
+ },
175
+ };
176
+ }
177
+ const fileCountOver = params.fileCountAfter > BUFFER_BACKSTOP_COUNT;
178
+ const fileBytesOver = params.fileBytesAfter > BUFFER_BACKSTOP_BYTES;
179
+ if (fileCountOver || fileBytesOver) {
180
+ return {
181
+ scope: 'file',
182
+ binding_dimension: fileCountOver ? 'count' : 'bytes',
183
+ count: {
184
+ requested: params.fileCountAfter,
185
+ used: params.fileCountBefore,
186
+ limit: BUFFER_BACKSTOP_COUNT,
187
+ },
188
+ bytes: {
189
+ requested: params.fileBytesAfter,
190
+ used: params.fileBytesBefore,
191
+ limit: BUFFER_BACKSTOP_BYTES,
192
+ },
193
+ your_count: params.writerCountAfter,
194
+ your_bytes: params.writerBytesAfter,
195
+ total_count: params.fileCountAfter,
196
+ total_bytes: params.fileBytesAfter,
197
+ };
198
+ }
199
+ return undefined;
200
+ }
201
+ /**
202
+ * Builds the `BUFFER_FULL` `WorkflowError` from a `BufferFullDetails` (issue #197 PR-1, design
203
+ * §5) — the SAME message wording, error code, category, and `agentAction` every store uses, so
204
+ * the only thing that ever varies between stores is which concrete numbers went into `details`.
205
+ * Guidance wording is deliberate: foreign share (file scope's `your_*`/`total_*`) is stated as an
206
+ * observable FACT; crash causation for that foreign residue is NEVER asserted (design §5's
207
+ * corrected framing — foreign residue might be a live concurrent writer, not a crash). Code stays
208
+ * `BUFFER_FULL`, category `ENGINE`, `agentAction: 'provide_input'` — unchanged from before this
209
+ * capability existed.
210
+ */
211
+ export function bufferFullError(details) {
212
+ const scopeClause = details.scope === 'writer'
213
+ ? `this writer's own share of the buffer (${details.binding_dimension} ceiling reached)`
214
+ : `the whole-file ${details.binding_dimension} ceiling (${details.total_count ?? 0} ` +
215
+ `entries / ${details.total_bytes ?? 0} bytes combined across every writer sharing this ` +
216
+ `step; this writer's own share is ${details.your_count ?? 0} entries / ` +
217
+ `${details.your_bytes ?? 0} bytes)`;
218
+ return new WorkflowError(`Trace buffer full for step: ${scopeClause} reached. Settle the step to drain residue — ` +
219
+ 'it is preserved (sealed) where the store supports it, and your options.trace always ' +
220
+ 'survives.', {
221
+ code: 'BUFFER_FULL',
222
+ category: 'ENGINE',
223
+ agentAction: 'provide_input',
224
+ retryable: false,
225
+ details: { ...details },
226
+ });
227
+ }
228
+ /**
229
+ * Flattens WAL batches (`{ts, entries, nonce?}`, issue #197 PR-1's internal batch shape — see
230
+ * `SealedWalLine`) into the read-back `BufferedEntry[]` shape, in batch order: `_internalTs` from
231
+ * the batch's `ts`; `_nonce` re-attached ONLY when the batch actually carried one (never
232
+ * fabricated for a bare batch — the key byte-identity property: a flattened all-bare batch list
233
+ * produces EXACTLY the same shape/bytes as the pre-#197 flat representation always did).
234
+ */
235
+ export function flattenWalBatches(batches) {
236
+ return batches.flatMap((batch) => batch.entries.map((entry) => ({
237
+ ...entry,
238
+ _internalTs: batch.ts,
239
+ ...(batch.nonce !== undefined ? { _nonce: batch.nonce } : {}),
240
+ })));
241
+ }
48
242
  /**
49
243
  * In-memory TraceBufferStore for use in tests and non-persistent environments.
50
244
  * Entries are lost on process restart (no file I/O).
245
+ *
246
+ * Declares the fenced trio (issue #207): `append`, `read`, `delete`, and `deleteAllForRun` all
247
+ * serialize on the SAME per-(runId, stepId) critical section `appendFenced`/`deleteFenced` use,
248
+ * via a per-key async mutex (a promise-chain map) — every one of the operations for a given key
249
+ * runs strictly after the previous operation on THAT SAME key has settled (success or failure).
250
+ * Liveness posture: a hung guard hangs only that key's chain — a different key's chain is
251
+ * untouched and proceeds normally (this per-key granularity is load-bearing; see the TCK's
252
+ * PER_KEY_INDEPENDENCE law). The chain map's entry for a key is deleted once its own tail
253
+ * settles and no newer call has chained after it, so an idle key holds no Map entry (no leak).
254
+ *
255
+ * Issue #197 PR-1 additionally declares BOTH capability-ladder rungs (`seal` and
256
+ * `writer_nonce_carriage`, `traceCapabilities`). The live-WAL internal representation is
257
+ * BATCH-preserving (`Map<string, SealedWalLine[]>`, one entry per `append`/`appendFenced` call) —
258
+ * NOT flattened — because `sealFenced` must be able to retire a key's exact batch history as one
259
+ * unit, and each batch's own (possibly absent) writer nonce must survive independently for
260
+ * carriage/budget partitioning. Every flattening surface (`read`, `readAllForRun`, `deleteFenced`'s
261
+ * count, the byte-budget arithmetic) derives its answer from this representation via
262
+ * `flattenWalBatches` (or direct batch arithmetic over it), reproducing the exact pre-#197
263
+ * observable shape and byte formula for all-bare traffic — see `appendUnlocked`.
51
264
  */
52
265
  export class InMemoryTraceBufferStore {
266
+ traceCapabilities = new Set([
267
+ 'seal',
268
+ 'writer_nonce_carriage',
269
+ ]);
270
+ // Live WAL per key, in append order — see the class doc for why this stays batch-shaped.
53
271
  buffers = new Map();
272
+ // Sealed artifacts per key, in ascending `seq` order (issue #197 PR-1, the `seal` rung).
273
+ sealed = new Map();
274
+ chains = new Map();
54
275
  key(runId, stepId) {
55
276
  return `${runId}:${stepId}`;
56
277
  }
57
- async append(runId, stepId, entries) {
58
- const k = this.key(runId, stepId);
59
- const existing = this.buffers.get(k) ?? [];
278
+ /**
279
+ * Runs `fn` strictly after the current tail of the per-key chain for `k` has settled (whether
280
+ * that prior link resolved or rejected), and installs `fn`'s own settlement as the new tail.
281
+ * Returns/throws `fn`'s real result — chain-tracking never swallows or reshapes it. Removes the
282
+ * map entry for `k` once this call's tail settles, but only if no NEWER call has since replaced
283
+ * it (an identity check against the exact promise reference this call stored).
284
+ */
285
+ async withKeyLock(k, fn) {
286
+ const prior = this.chains.get(k) ?? Promise.resolve();
287
+ // Neutralize prior's rejection for CHAINING purposes only — a failed operation on this key
288
+ // must not permanently wedge every future operation on the same key.
289
+ const settledPrior = prior.then(() => undefined, () => undefined);
290
+ const result = settledPrior.then(fn);
291
+ const tail = result.then(() => undefined, () => undefined);
292
+ this.chains.set(k, tail);
293
+ void tail.then(() => {
294
+ if (this.chains.get(k) === tail) {
295
+ this.chains.delete(k);
296
+ }
297
+ });
298
+ return result;
299
+ }
300
+ /**
301
+ * Count + bytes for exactly the batches belonging to `writerNonce` (`undefined` = ⊥, the bare
302
+ * writer class) — computed by flattening JUST that writer's own batches and re-stringifying,
303
+ * so the byte number for a single-writer (all-bare) file is bit-for-bit the old whole-array
304
+ * formula. Equality is plain `===` over `batch.nonce ?? undefined`, which implements the
305
+ * design's `adopted(line) ⇔ line.nonce ≡ claimant.nonce, with absent ≡ absent` rule with no
306
+ * special-casing (`undefined === undefined` is `true`).
307
+ */
308
+ partitionStats(batches, writerNonce) {
309
+ const own = batches.filter((b) => (b.nonce ?? undefined) === writerNonce);
310
+ const flattened = flattenWalBatches(own);
311
+ return { count: flattened.length, bytes: Buffer.byteLength(JSON.stringify(flattened)) };
312
+ }
313
+ /** Whole-file count + bytes across every writer combined — the pre-#197 formula, applied to
314
+ * the full batch list regardless of how many distinct writers contributed to it. */
315
+ fileStats(batches) {
316
+ const flattened = flattenWalBatches(batches);
317
+ return { count: flattened.length, bytes: Buffer.byteLength(JSON.stringify(flattened)) };
318
+ }
319
+ appendUnlocked(k, entries, writerNonce) {
320
+ const existingBatches = this.buffers.get(k) ?? [];
321
+ const writerBefore = this.partitionStats(existingBatches, writerNonce);
322
+ const fileBefore = this.fileStats(existingBatches);
60
323
  if (entries.length === 0) {
61
- const bytes = Buffer.byteLength(JSON.stringify(existing));
62
324
  return {
63
- buffer_count: existing.length,
64
- buffer_bytes: bytes,
325
+ buffer_count: writerBefore.count,
326
+ buffer_bytes: writerBefore.bytes,
65
327
  limit_count: BUFFER_LIMIT_COUNT,
66
328
  limit_bytes: BUFFER_LIMIT_BYTES,
67
329
  final_limit_entries: FINAL_LIMIT_ENTRIES,
68
330
  final_limit_bytes: FINAL_LIMIT_BYTES,
331
+ file_count: fileBefore.count,
332
+ file_bytes: fileBefore.bytes,
333
+ file_limit_count: BUFFER_BACKSTOP_COUNT,
334
+ file_limit_bytes: BUFFER_BACKSTOP_BYTES,
69
335
  };
70
336
  }
71
337
  const ts = Date.now();
@@ -73,50 +339,155 @@ export class InMemoryTraceBufferStore {
73
339
  .map((e) => normalizeEntryForBuffer(e))
74
340
  .filter((e) => e !== null)
75
341
  .map((e) => ({ ...e, _internalTs: ts }));
76
- const proposed = [...existing, ...normalized];
77
- const proposedBytes = Buffer.byteLength(JSON.stringify(proposed));
78
- if (proposed.length > BUFFER_LIMIT_COUNT || proposedBytes > BUFFER_LIMIT_BYTES) {
79
- const existingBytes = Buffer.byteLength(JSON.stringify(existing));
80
- throw new WorkflowError('Trace buffer full for step', {
81
- code: 'BUFFER_FULL',
82
- category: 'ENGINE',
83
- agentAction: 'provide_input',
84
- retryable: false,
85
- details: { buffer_count: existing.length, buffer_bytes: existingBytes },
86
- });
342
+ const newBatch = writerNonce !== undefined
343
+ ? { ts, entries: normalized, nonce: writerNonce }
344
+ : { ts, entries: normalized };
345
+ const proposedBatches = [...existingBatches, newBatch];
346
+ const writerAfter = this.partitionStats(proposedBatches, writerNonce);
347
+ const fileAfter = this.fileStats(proposedBatches);
348
+ const overflow = checkBufferBudget({
349
+ writerCountBefore: writerBefore.count,
350
+ writerBytesBefore: writerBefore.bytes,
351
+ writerCountAfter: writerAfter.count,
352
+ writerBytesAfter: writerAfter.bytes,
353
+ fileCountBefore: fileBefore.count,
354
+ fileBytesBefore: fileBefore.bytes,
355
+ fileCountAfter: fileAfter.count,
356
+ fileBytesAfter: fileAfter.bytes,
357
+ });
358
+ if (overflow) {
359
+ throw bufferFullError(overflow);
87
360
  }
88
- this.buffers.set(k, proposed);
89
- const bytes = Buffer.byteLength(JSON.stringify(proposed));
361
+ this.buffers.set(k, proposedBatches);
90
362
  return {
91
- buffer_count: proposed.length,
92
- buffer_bytes: bytes,
363
+ buffer_count: writerAfter.count,
364
+ buffer_bytes: writerAfter.bytes,
93
365
  limit_count: BUFFER_LIMIT_COUNT,
94
366
  limit_bytes: BUFFER_LIMIT_BYTES,
95
367
  final_limit_entries: FINAL_LIMIT_ENTRIES,
96
368
  final_limit_bytes: FINAL_LIMIT_BYTES,
369
+ file_count: fileAfter.count,
370
+ file_bytes: fileAfter.bytes,
371
+ file_limit_count: BUFFER_BACKSTOP_COUNT,
372
+ file_limit_bytes: BUFFER_BACKSTOP_BYTES,
97
373
  };
98
374
  }
375
+ async append(runId, stepId, entries, options) {
376
+ const k = this.key(runId, stepId);
377
+ return this.withKeyLock(k, async () => this.appendUnlocked(k, entries, options?.writerNonce));
378
+ }
379
+ /** guard runs INSIDE the per-key critical section, immediately before the write — see the
380
+ * interface doc for the full guard contract. */
381
+ async appendFenced(runId, stepId, entries, guard, options) {
382
+ const k = this.key(runId, stepId);
383
+ return this.withKeyLock(k, async () => {
384
+ await guard();
385
+ return this.appendUnlocked(k, entries, options?.writerNonce);
386
+ });
387
+ }
99
388
  async read(runId, stepId) {
100
- return this.buffers.get(this.key(runId, stepId)) ?? [];
389
+ const k = this.key(runId, stepId);
390
+ return this.withKeyLock(k, async () => flattenWalBatches(this.buffers.get(k) ?? []));
101
391
  }
102
392
  async delete(runId, stepId) {
103
- this.buffers.delete(this.key(runId, stepId));
393
+ const k = this.key(runId, stepId);
394
+ await this.withKeyLock(k, async () => {
395
+ this.buffers.delete(k);
396
+ });
397
+ }
398
+ /** guard runs INSIDE the same per-key critical section `appendFenced` uses, immediately before
399
+ * the delete — see the interface doc for the full guard contract. Returns the number of
400
+ * entries actually deleted, summed across every live batch (0 = buffer already absent; the
401
+ * guard still ran first). Sealed artifacts for this key are NOT touched — sealing exists
402
+ * precisely to move content out of this destructive drain's reach; only `deleteAllForRun*`
403
+ * (run-level bulk delete) also retires sealed artifacts. */
404
+ async deleteFenced(runId, stepId, guard) {
405
+ const k = this.key(runId, stepId);
406
+ return this.withKeyLock(k, async () => {
407
+ await guard();
408
+ const existing = this.buffers.get(k);
409
+ this.buffers.delete(k);
410
+ return existing !== undefined ? flattenWalBatches(existing).length : 0;
411
+ });
104
412
  }
105
413
  async deleteAllForRun(runId, _dirEntries) {
106
- for (const key of [...this.buffers.keys()]) {
107
- if (key.startsWith(`${runId}:`)) {
108
- this.buffers.delete(key);
414
+ const prefix = `${runId}:`;
415
+ const keys = new Set([...this.buffers.keys(), ...this.sealed.keys()].filter((k) => k.startsWith(prefix)));
416
+ for (const k of keys) {
417
+ await this.withKeyLock(k, async () => {
418
+ this.buffers.delete(k);
419
+ this.sealed.delete(k);
420
+ });
421
+ }
422
+ }
423
+ /** guard is RE-INVOKED inside EACH per-(runId, stepId) critical section, immediately before
424
+ * that key's delete — see the interface doc for the full guard contract, including the
425
+ * zero-match-sweep invocation requirement (handled below: the guard still runs at least once
426
+ * even when this run has no buffers at all). Sealed artifacts join this run-level bulk delete
427
+ * (design §4 — a sealed artifact is retained ONLY until its owning run itself is purged). */
428
+ async deleteAllForRunFenced(runId, guard, _dirEntries) {
429
+ const prefix = `${runId}:`;
430
+ const keys = new Set([...this.buffers.keys(), ...this.sealed.keys()].filter((k) => k.startsWith(prefix)));
431
+ if (keys.size === 0) {
432
+ await guard();
433
+ return;
434
+ }
435
+ for (const k of keys) {
436
+ await this.withKeyLock(k, async () => {
437
+ await guard();
438
+ this.buffers.delete(k);
439
+ this.sealed.delete(k);
440
+ });
441
+ }
442
+ }
443
+ /** guard runs INSIDE the per-key critical section, immediately before the seal-move — see the
444
+ * interface doc for the full contract. Atomically retires the ENTIRE live batch history for
445
+ * (runId, stepId) into a new sealed artifact (ascending `seq`), clearing the live buffer in
446
+ * the same step — the in-memory analogue of the fs store's no-clobber rename-based seal
447
+ * (there is no filesystem race to guard against here; the per-key mutex already serializes
448
+ * every operation on this key, so `seq` can simply be the next array index). */
449
+ async sealFenced(runId, stepId, guard) {
450
+ const k = this.key(runId, stepId);
451
+ return this.withKeyLock(k, async () => {
452
+ await guard();
453
+ const live = this.buffers.get(k);
454
+ if (live === undefined || live.length === 0) {
455
+ return { sealed: false, reason: 'absent' };
456
+ }
457
+ const existingSealed = this.sealed.get(k) ?? [];
458
+ if (existingSealed.length >= SEALED_ARTIFACTS_LIMIT_PER_STEP) {
459
+ return { sealed: false, reason: 'capped' };
460
+ }
461
+ const artifact = { step_id: stepId, seq: existingSealed.length, lines: live };
462
+ this.sealed.set(k, [...existingSealed, artifact]);
463
+ this.buffers.delete(k);
464
+ return { sealed: true };
465
+ });
466
+ }
467
+ /** Lock-free point-in-time snapshot of every sealed artifact for a run, across all its steps —
468
+ * matches `readAllForRun`'s deliberately-unlocked posture (see D3 residual 9). */
469
+ async listSealedForRun(runId) {
470
+ const prefix = `${runId}:`;
471
+ const result = [];
472
+ for (const [k, artifacts] of this.sealed.entries()) {
473
+ if (k.startsWith(prefix)) {
474
+ result.push(...artifacts);
109
475
  }
110
476
  }
477
+ return result;
111
478
  }
112
- /** Returns each in-memory buffer for the run, keyed by stepId, as its stored `BufferedEntry[]`
113
- * (already-flattened individual entries — this store's own natural shape; see `append`). */
479
+ /** Returns each in-memory LIVE buffer for the run, keyed by stepId, flattened to
480
+ * `BufferedEntry[]` (this store's own natural read shape; see `read`). Lock-free
481
+ * point-in-time diagnostic, matching #159's shipped `export`/`readAllForRun` posture —
482
+ * deliberately NOT serialized through the per-key mutex (see D3 residual 9). Sealed artifacts
483
+ * are NOT included (see `listSealedForRun`) — unchanged scope from before this capability
484
+ * existed; PR-2 decides how/whether call sites merge the two. */
114
485
  async readAllForRun(runId) {
115
486
  const result = {};
116
487
  const prefix = `${runId}:`;
117
- for (const [key, entries] of this.buffers.entries()) {
488
+ for (const [key, batches] of this.buffers.entries()) {
118
489
  if (key.startsWith(prefix)) {
119
- result[key.slice(prefix.length)] = entries;
490
+ result[key.slice(prefix.length)] = flattenWalBatches(batches);
120
491
  }
121
492
  }
122
493
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"trace-buffer-store.js","sourceRoot":"","sources":["../../src/store/trace-buffer-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-buffer-store.js","sourceRoot":"","sources":["../../src/store/trace-buffer-store.ts"],"names":[],"mappings":"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"}
@@ -105,5 +105,25 @@ export interface ResponseEnvelope {
105
105
  run_phase: string;
106
106
  branched_via?: string;
107
107
  }>;
108
+ /**
109
+ * Per-partition adoption counts (issue #197 PR-2, design §6) — mirrors the settled step's own
110
+ * `trace_summary.attributed_lines_adopted` / `buffered_lines_adopted` / `foreign_lines_preserved`
111
+ * (see run-record.ts) at the moment the adoption partition actually ran. SET BY THE ENGINE at
112
+ * envelope build (the MCP tool layer strips `data`/`evidence` before returning and never itself
113
+ * sees per-line nonces). Present ONLY when the adoption partition ran for the step this envelope
114
+ * settles — absent for a bare-floor store (no `writer_nonce_carriage`), a non-agent step, or an
115
+ * error/blocked envelope. **Chain-replacement disposition (issue #197 PR-2):** when a settled
116
+ * agent step's `executeChain` call continues into a subsequently-eligible auto step, the
117
+ * RETURNED envelope is that deeper step's own — these three counts may be ABSENT there (they
118
+ * persist authoritatively in the settled step's own `trace_summary` regardless of what this
119
+ * envelope reports); the accompanying warnings (seal outcome / half-minted advisory / missing
120
+ * carriage leg) are re-surfaced into the returned envelope's `warnings` via the existing
121
+ * chain-wide warning re-accumulation even when these counts are not.
122
+ */
123
+ adopted_own?: number;
124
+ /** @see adopted_own — the ⊥ (bare) counterpart; mirrors `trace_summary.buffered_lines_adopted`. */
125
+ adopted_anonymous?: number;
126
+ /** @see adopted_own — mirrors `trace_summary.foreign_lines_preserved`. */
127
+ preserved_foreign?: number;
108
128
  }
109
129
  //# sourceMappingURL=response-envelope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/types/response-envelope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC;;;;WAIG;QACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,IAAI,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8GAA8G;IAC9G,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2HAA2H;IAC3H,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,yHAAyH;IACzH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,8FAA8F;IAC9F,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+GAA+G;IAC/G,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,yGAAyG;IACzG,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF"}
1
+ {"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/types/response-envelope.ts"],"names":[],"mappings":"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"}