@claudexor/event-log 3.1.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,20 @@
1
1
  import type { RunEvent, RunEventType } from "@claudexor/schema";
2
+ export type TerminalRunEventType = Extract<RunEventType, "run.completed" | "run.failed" | "run.blocked">;
3
+ export interface PreparedTerminalEvent {
4
+ type: TerminalRunEventType;
5
+ payload: Record<string, unknown>;
6
+ /**
7
+ * Publish the prepared receipt's canonical commit marker after the durable
8
+ * journal accepts the terminal, but before file-tail/live observers can see
9
+ * the per-run terminal event.
10
+ */
11
+ commit?: () => void;
12
+ /**
13
+ * Undo preparation/commit side effects when no durable journal authority was
14
+ * established. The callback must be idempotent.
15
+ */
16
+ rollback?: () => void;
17
+ }
2
18
  /**
3
19
  * Append-only JSONL event log for a single run. Terminal output and human
4
20
  * summaries are projections; this file is the canonical event stream.
@@ -14,43 +30,67 @@ export declare class EventLog {
14
30
  private readonly runId;
15
31
  private readonly taskId;
16
32
  /**
17
- * Optional in-process sink invoked after each event is persisted. Lets a
18
- * long-running service / GUI observe the live RunEvent stream without
19
- * tailing the file. A configured sink is part of the daemon's durable
20
- * event authority; failure must fail the run instead of silently creating
21
- * a gap in restart replay.
33
+ * Durable in-process authority. Non-terminal events reach it after their
34
+ * per-run append; terminal events reach it first so crash recovery can
35
+ * reconstruct the canonical receipt and per-run tail from the journal.
22
36
  */
23
- private readonly onEmit?;
37
+ private readonly onPersist?;
24
38
  /**
25
39
  * Thread this run is a turn of, when any. Stamped on every event so the
26
40
  * global event multiplex can route live progress to a chat surface without
27
41
  * a reverse job lookup.
28
42
  */
29
43
  private readonly threadId?;
44
+ /** Best-effort live observer, invoked only after terminal finalization. */
45
+ private readonly onPublish?;
30
46
  private nextSeq;
47
+ private deferTerminalEvents;
48
+ private deferredTerminal;
49
+ private terminalCommittedFlag;
50
+ private terminalCommitInProgress;
51
+ private terminalWriterPoisoned;
52
+ private beforeTerminal?;
31
53
  constructor(path: string, runId: string, taskId: string,
32
54
  /**
33
- * Optional in-process sink invoked after each event is persisted. Lets a
34
- * long-running service / GUI observe the live RunEvent stream without
35
- * tailing the file. A configured sink is part of the daemon's durable
36
- * event authority; failure must fail the run instead of silently creating
37
- * a gap in restart replay.
55
+ * Durable in-process authority. Non-terminal events reach it after their
56
+ * per-run append; terminal events reach it first so crash recovery can
57
+ * reconstruct the canonical receipt and per-run tail from the journal.
38
58
  */
39
- onEmit?: ((event: RunEvent) => void) | undefined,
59
+ onPersist?: ((event: RunEvent) => void) | undefined,
40
60
  /**
41
61
  * Thread this run is a turn of, when any. Stamped on every event so the
42
62
  * global event multiplex can route live progress to a chat surface without
43
63
  * a reverse job lookup.
44
64
  */
45
- threadId?: string | undefined);
65
+ threadId?: string | undefined,
66
+ /** Best-effort live observer, invoked only after terminal finalization. */
67
+ onPublish?: ((event: RunEvent) => void) | undefined);
46
68
  /**
47
69
  * Unregister this log as the live writer for its path. Out-of-band
48
70
  * appenders fall back to file-tail stamping afterwards, which is safe once
49
71
  * the owning run is terminal (nobody else holds an in-memory counter).
50
72
  */
51
73
  dispose(): void;
74
+ /** Hold the one terminal event while a Delegate parent drains children.
75
+ * Non-terminal events (notably aggregate budget.cash) continue to append and
76
+ * therefore remain ordered before the eventual final event. */
77
+ deferTerminal(): void;
78
+ clearDeferredTerminal(): void;
79
+ flushDeferredTerminal(): RunEvent | null;
80
+ /**
81
+ * Register the engine's once-only terminal preparation hook. It builds the
82
+ * canonical receipt in memory before the durable authority accepts the
83
+ * terminal; commit runs afterward and before file-tail/live observers.
84
+ */
85
+ setBeforeTerminal(hook: (type: TerminalRunEventType, payload: Record<string, unknown>) => PreparedTerminalEvent | void): void;
86
+ /** Whether this writer has durably committed its exactly-once terminal. */
87
+ terminalCommitted(): boolean;
52
88
  /** Append a typed run event. Validates against the schema before writing. */
53
89
  emit(type: RunEventType, payload?: Record<string, unknown>): RunEvent;
90
+ private poisonAfterDurableCommit;
91
+ /** @internal Release a poisoned live owner once journal recovery repairs its tail. */
92
+ releaseRecoveredTerminalFence(): boolean;
93
+ private rollbackTerminal;
54
94
  /** Read and parse all events (skipping malformed lines, which are surfaced separately). */
55
95
  readAll(): {
56
96
  events: RunEvent[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIhE;;;;;;;;;GASG;AACH,qBAAa,QAAQ;IAIjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAnB5B,OAAO,CAAC,OAAO,CAAS;gBAGL,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAC/B;;;;;;OAMG;IACc,MAAM,CAAC,GAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,aAAA;IACnD;;;;OAIG;IACc,QAAQ,CAAC,EAAE,MAAM,YAAA;IAMpC;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAIf,6EAA6E;IAC7E,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,QAAQ;IAoBzE,2FAA2F;IAC3F,OAAO,IAAI;QAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAgBrD;AAUD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,QAAQ,CAaV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKhE,MAAM,MAAM,oBAAoB,GAAG,OAAO,CACxC,YAAY,EACZ,eAAe,GAAG,YAAY,GAAG,aAAa,CAC/C,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,qBAAa,QAAQ;IAajB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC3B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IA5B7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,gBAAgB,CAAyE;IACjG,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAAC,CAGW;IAElC,YACmB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAC/B;;;;OAIG;IACc,SAAS,CAAC,GAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,aAAA;IACtD;;;;OAIG;IACc,QAAQ,CAAC,EAAE,MAAM,YAAA;IAClC,2EAA2E;IAC1D,SAAS,CAAC,GAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,aAAA,EAUvD;IAED;;;;OAIG;IACH,OAAO,IAAI,IAAI,CAEd;IAED;;mEAE+D;IAC/D,aAAa,IAAI,IAAI,CAEpB;IAED,qBAAqB,IAAI,IAAI,CAE5B;IAED,qBAAqB,IAAI,QAAQ,GAAG,IAAI,CAKvC;IAED;;;;OAIG;IACH,iBAAiB,CACf,IAAI,EAAE,CACJ,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,qBAAqB,GAAG,IAAI,GAChC,IAAI,CAEN;IAED,2EAA2E;IAC3E,iBAAiB,IAAI,OAAO,CAE3B;IAED,6EAA6E;IAC7E,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,QAAQ,CA6GxE;IAED,OAAO,CAAC,wBAAwB;IAuBhC,sFAAsF;IACtF,6BAA6B,IAAI,OAAO,CAKvC;IAED,OAAO,CAAC,gBAAgB;IAmCxB,2FAA2F;IAC3F,OAAO,IAAI;QAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAenD;CACF;AAUD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,QAAQ,CAiBV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBlD"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { RunEvent as RunEventSchema } from "@claudexor/schema";
2
+ import { existsSync, statSync, truncateSync, unlinkSync } from "node:fs";
2
3
  import { appendLine, nowIso, readTextSafe, redactSecrets } from "@claudexor/util";
3
4
  /**
4
5
  * Append-only JSONL event log for a single run. Terminal output and human
@@ -14,31 +15,45 @@ export class EventLog {
14
15
  path;
15
16
  runId;
16
17
  taskId;
17
- onEmit;
18
+ onPersist;
18
19
  threadId;
20
+ onPublish;
19
21
  nextSeq;
22
+ deferTerminalEvents = false;
23
+ deferredTerminal = null;
24
+ terminalCommittedFlag = false;
25
+ terminalCommitInProgress = false;
26
+ terminalWriterPoisoned = false;
27
+ beforeTerminal;
20
28
  constructor(path, runId, taskId,
21
29
  /**
22
- * Optional in-process sink invoked after each event is persisted. Lets a
23
- * long-running service / GUI observe the live RunEvent stream without
24
- * tailing the file. A configured sink is part of the daemon's durable
25
- * event authority; failure must fail the run instead of silently creating
26
- * a gap in restart replay.
30
+ * Durable in-process authority. Non-terminal events reach it after their
31
+ * per-run append; terminal events reach it first so crash recovery can
32
+ * reconstruct the canonical receipt and per-run tail from the journal.
27
33
  */
28
- onEmit,
34
+ onPersist,
29
35
  /**
30
36
  * Thread this run is a turn of, when any. Stamped on every event so the
31
37
  * global event multiplex can route live progress to a chat surface without
32
38
  * a reverse job lookup.
33
39
  */
34
- threadId) {
40
+ threadId,
41
+ /** Best-effort live observer, invoked only after terminal finalization. */
42
+ onPublish) {
35
43
  this.path = path;
36
44
  this.runId = runId;
37
45
  this.taskId = taskId;
38
- this.onEmit = onEmit;
46
+ this.onPersist = onPersist;
39
47
  this.threadId = threadId;
48
+ this.onPublish = onPublish;
40
49
  this.nextSeq = lastSeqInFile(path) + 1;
41
- activeEventLogs.set(path, this);
50
+ this.terminalCommittedFlag = terminalEventInFile(path);
51
+ if (!this.terminalCommittedFlag) {
52
+ if (activeEventLogs.has(path)) {
53
+ throw new Error("an active EventLog already owns this event path");
54
+ }
55
+ activeEventLogs.set(path, this);
56
+ }
42
57
  }
43
58
  /**
44
59
  * Unregister this log as the live writer for its path. Out-of-band
@@ -49,10 +64,63 @@ export class EventLog {
49
64
  if (activeEventLogs.get(this.path) === this)
50
65
  activeEventLogs.delete(this.path);
51
66
  }
67
+ /** Hold the one terminal event while a Delegate parent drains children.
68
+ * Non-terminal events (notably aggregate budget.cash) continue to append and
69
+ * therefore remain ordered before the eventual final event. */
70
+ deferTerminal() {
71
+ this.deferTerminalEvents = true;
72
+ }
73
+ clearDeferredTerminal() {
74
+ this.deferredTerminal = null;
75
+ }
76
+ flushDeferredTerminal() {
77
+ const pending = this.deferredTerminal;
78
+ this.deferredTerminal = null;
79
+ this.deferTerminalEvents = false;
80
+ return pending ? this.emit(pending.type, pending.payload) : null;
81
+ }
82
+ /**
83
+ * Register the engine's once-only terminal preparation hook. It builds the
84
+ * canonical receipt in memory before the durable authority accepts the
85
+ * terminal; commit runs afterward and before file-tail/live observers.
86
+ */
87
+ setBeforeTerminal(hook) {
88
+ this.beforeTerminal = hook;
89
+ }
90
+ /** Whether this writer has durably committed its exactly-once terminal. */
91
+ terminalCommitted() {
92
+ return this.terminalCommittedFlag;
93
+ }
52
94
  /** Append a typed run event. Validates against the schema before writing. */
53
95
  emit(type, payload = {}) {
54
- const event = RunEventSchema.parse({
55
- seq: this.nextSeq++,
96
+ if (this.terminalCommittedFlag) {
97
+ throw new Error("run terminal event is already committed");
98
+ }
99
+ if (this.terminalWriterPoisoned) {
100
+ throw new Error("run terminal writer is poisoned after an incomplete rollback");
101
+ }
102
+ if (this.terminalCommitInProgress) {
103
+ throw new Error("run terminal event commit is already in progress");
104
+ }
105
+ const terminalType = type === "run.completed" || type === "run.failed" || type === "run.blocked" ? type : null;
106
+ const terminal = terminalType !== null;
107
+ if (this.deferTerminalEvents && terminal) {
108
+ if (this.deferredTerminal)
109
+ throw new Error("run terminal event was emitted more than once");
110
+ this.deferredTerminal = { type, payload };
111
+ return RunEventSchema.parse({
112
+ seq: this.nextSeq,
113
+ ts: nowIso(),
114
+ run_id: this.runId,
115
+ task_id: this.taskId,
116
+ ...(this.threadId ? { thread_id: this.threadId } : {}),
117
+ type,
118
+ payload: redactEventValue(payload),
119
+ });
120
+ }
121
+ let prepared = undefined;
122
+ let event = RunEventSchema.parse({
123
+ seq: this.nextSeq,
56
124
  ts: nowIso(),
57
125
  run_id: this.runId,
58
126
  task_id: this.taskId,
@@ -60,16 +128,142 @@ export class EventLog {
60
128
  type,
61
129
  payload: redactEventValue(payload),
62
130
  });
63
- appendLine(this.path, JSON.stringify(event));
64
- this.onEmit?.(event);
65
- // Terminal events are emitted exactly once, last (output.ready invariant
66
- // tests pin this). Self-disposing here hands the seq space back to
67
- // file-tail appenders without requiring every orchestrator mode to
68
- // remember a finally block.
69
- if (type === "run.completed" || type === "run.failed" || type === "run.blocked")
131
+ // Snapshot before terminal preparation: the hook may materialize sibling
132
+ // artifacts, but the event file rollback boundary is the pre-hook state.
133
+ const previousBytes = existsSync(this.path) ? statSync(this.path).size : null;
134
+ if (terminal) {
135
+ // Fence every re-entrant emit before the preparation hook, append, and
136
+ // durable sink form one terminal commit. The fence is released only by
137
+ // a complete rollback or after the terminal fully commits.
138
+ this.terminalCommitInProgress = true;
139
+ // Validate the exact redacted event before terminal preparation can
140
+ // materialize a receipt for it. Keep the hook registered until the event
141
+ // itself is durable so an append failure can retry the entire commit.
142
+ try {
143
+ prepared = this.beforeTerminal?.(terminalType, event.payload);
144
+ // Terminal preparation may canonicalize facts after consulting immutable
145
+ // artifacts. Commit the corresponding event type and payload as one
146
+ // validated unit so the receipt, durable event, and live publication
147
+ // cannot disagree.
148
+ event = RunEventSchema.parse(prepared
149
+ ? {
150
+ ...event,
151
+ type: prepared.type,
152
+ payload: redactEventValue(prepared.payload),
153
+ }
154
+ : event);
155
+ }
156
+ catch (error) {
157
+ this.rollbackTerminal(previousBytes, prepared, error);
158
+ }
159
+ }
160
+ if (terminal) {
161
+ let durableAuthorityCommitted = false;
162
+ try {
163
+ this.onPersist?.(event);
164
+ durableAuthorityCommitted = this.onPersist !== undefined;
165
+ }
166
+ catch (error) {
167
+ this.rollbackTerminal(previousBytes, prepared, error);
168
+ }
169
+ try {
170
+ prepared?.commit?.();
171
+ }
172
+ catch (error) {
173
+ if (durableAuthorityCommitted)
174
+ this.poisonAfterDurableCommit(error);
175
+ this.rollbackTerminal(previousBytes, prepared, error);
176
+ }
177
+ try {
178
+ appendLine(this.path, JSON.stringify(event));
179
+ }
180
+ catch (error) {
181
+ if (durableAuthorityCommitted)
182
+ this.poisonAfterDurableCommit(error);
183
+ this.rollbackTerminal(previousBytes, prepared, error);
184
+ }
185
+ this.nextSeq += 1;
186
+ // The durable journal, canonical prepared receipt, and per-run event are
187
+ // now one committed terminal unit. Only now may observers see it.
188
+ this.terminalCommittedFlag = true;
189
+ this.terminalCommitInProgress = false;
190
+ this.beforeTerminal = undefined;
70
191
  this.dispose();
192
+ try {
193
+ this.onPublish?.(event);
194
+ }
195
+ catch {
196
+ /* durable replay remains authoritative */
197
+ }
198
+ }
199
+ else {
200
+ appendLine(this.path, JSON.stringify(event));
201
+ this.nextSeq += 1;
202
+ this.onPersist?.(event);
203
+ try {
204
+ this.onPublish?.(event);
205
+ }
206
+ catch {
207
+ /* best-effort live observer */
208
+ }
209
+ }
71
210
  return event;
72
211
  }
212
+ poisonAfterDurableCommit(originalError) {
213
+ this.terminalWriterPoisoned = true;
214
+ this.terminalCommitInProgress = false;
215
+ this.beforeTerminal = undefined;
216
+ // CommandStore repairs the per-run tail synchronously from the accepted
217
+ // journal terminal. Release the strong live-writer reference once that
218
+ // repair becomes visible; appendRunEvent also performs this check inline.
219
+ setImmediate(() => {
220
+ this.releaseRecoveredTerminalFence();
221
+ }).unref?.();
222
+ throw Object.assign(new AggregateError([originalError], "durable terminal authority committed but local finalization failed; restart required"), {
223
+ code: "terminal_recovery_required",
224
+ status: 503,
225
+ retryable: false,
226
+ });
227
+ }
228
+ /** @internal Release a poisoned live owner once journal recovery repairs its tail. */
229
+ releaseRecoveredTerminalFence() {
230
+ if (!this.terminalWriterPoisoned || !terminalEventInFile(this.path))
231
+ return false;
232
+ this.terminalCommittedFlag = true;
233
+ this.dispose();
234
+ return true;
235
+ }
236
+ rollbackTerminal(previousBytes, prepared, originalError) {
237
+ const rollbackErrors = [];
238
+ try {
239
+ if (previousBytes === null) {
240
+ if (existsSync(this.path))
241
+ unlinkSync(this.path);
242
+ }
243
+ else if (existsSync(this.path) && statSync(this.path).size !== previousBytes) {
244
+ truncateSync(this.path, previousBytes);
245
+ }
246
+ }
247
+ catch (error) {
248
+ rollbackErrors.push(error);
249
+ }
250
+ try {
251
+ prepared?.rollback?.();
252
+ }
253
+ catch (error) {
254
+ rollbackErrors.push(error);
255
+ }
256
+ if (rollbackErrors.length > 0) {
257
+ // A partial rollback means neither retry nor an out-of-band append can
258
+ // safely infer the terminal boundary. Keep this live writer registered
259
+ // as an explicit poison fence until the owning process fails closed.
260
+ this.terminalWriterPoisoned = true;
261
+ this.terminalCommitInProgress = false;
262
+ throw new AggregateError([originalError, ...rollbackErrors], "terminal event commit failed and rollback was incomplete");
263
+ }
264
+ this.terminalCommitInProgress = false;
265
+ throw originalError;
266
+ }
73
267
  /** Read and parse all events (skipping malformed lines, which are surfaced separately). */
74
268
  readAll() {
75
269
  const text = readTextSafe(this.path);
@@ -106,8 +300,12 @@ const activeEventLogs = new Map();
106
300
  */
107
301
  export function appendRunEvent(path, runId, taskId, type, payload = {}) {
108
302
  const live = activeEventLogs.get(path);
109
- if (live)
303
+ if (live && !live.releaseRecoveredTerminalFence())
110
304
  return live.emit(type, payload);
305
+ const terminal = type === "run.completed" || type === "run.failed" || type === "run.blocked";
306
+ if (terminal && terminalEventInFile(path)) {
307
+ throw new Error("run terminal event is already committed");
308
+ }
111
309
  const event = RunEventSchema.parse({
112
310
  seq: lastSeqInFile(path) + 1,
113
311
  ts: nowIso(),
@@ -148,6 +346,28 @@ export function lastSeqInFile(path) {
148
346
  }
149
347
  return last;
150
348
  }
349
+ function terminalEventInFile(path) {
350
+ const text = readTextSafe(path);
351
+ if (text === null)
352
+ return false;
353
+ for (const line of text.split("\n")) {
354
+ const trimmed = line.trim();
355
+ if (!trimmed)
356
+ continue;
357
+ try {
358
+ const event = RunEventSchema.parse(JSON.parse(trimmed));
359
+ if (event.type === "run.completed" ||
360
+ event.type === "run.failed" ||
361
+ event.type === "run.blocked") {
362
+ return true;
363
+ }
364
+ }
365
+ catch {
366
+ /* malformed evidence cannot establish a terminal fence */
367
+ }
368
+ }
369
+ return false;
370
+ }
151
371
  function redactEventValue(value) {
152
372
  if (typeof value === "string")
153
373
  return redactSecrets(value);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAElF;;;;;;;;;GASG;AACH,MAAM,OAAO,QAAQ;IAIA;IACA;IACA;IAQA;IAMA;IAnBX,OAAO,CAAS;IAExB,YACmB,IAAY,EACZ,KAAa,EACb,MAAc;IAC/B;;;;;;OAMG;IACc,MAAkC;IACnD;;;;OAIG;IACc,QAAiB;QAhBjB,SAAI,GAAJ,IAAI,CAAQ;QACZ,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;QAQd,WAAM,GAAN,MAAM,CAA4B;QAMlC,aAAQ,GAAR,QAAQ,CAAS;QAElC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,OAAO;QACL,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjF,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,IAAkB,EAAE,UAAmC,EAAE;QAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;YACjC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE;YACnB,EAAE,EAAE,MAAM,EAAE;YACZ,MAAM,EAAE,IAAI,CAAC,KAAK;YAClB,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,IAAI;YACJ,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;SACnC,CAAC,CAAC;QACH,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QACrB,yEAAyE;QACzE,mEAAmE;QACnE,mEAAmE;QACnE,4BAA4B;QAC5B,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAa;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2FAA2F;IAC3F,OAAO;QACL,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,KAAa,EACb,MAAc,EACd,IAAkB,EAClB,UAAmC,EAAE;IAErC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;QACjC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5B,EAAE,EAAE,MAAM,EAAE;QACZ,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,MAAM;QACf,IAAI;QACJ,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;KACnC,CAAC,CAAC;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;YACxD,MAAM,GAAG,GACP,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YACtF,IAAI,GAAG,GAAG,IAAI;gBAAE,IAAI,GAAG,GAAG,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,MAAM,GAAG,IAAI;gBAAE,IAAI,GAAG,MAAM,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudexor/event-log",
3
- "version": "3.1.1",
3
+ "version": "3.2.0",
4
4
  "license": "MIT",
5
5
  "description": "Append-only JSONL run-event log (a projection-friendly evidence ledger).",
6
6
  "type": "module",
@@ -16,8 +16,8 @@
16
16
  "dist"
17
17
  ],
18
18
  "dependencies": {
19
- "@claudexor/schema": "3.1.1",
20
- "@claudexor/util": "3.1.1"
19
+ "@claudexor/util": "3.2.0",
20
+ "@claudexor/schema": "3.2.0"
21
21
  },
22
22
  "repository": {
23
23
  "type": "git",