@claudexor/event-log 6.0.0 → 6.1.2

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.
@@ -1,6 +1,20 @@
1
1
  import type { RunEvent } from "@claudexor/schema";
2
- /** Shared reader for live terminal preparation and selected interrupted-run recovery. */
3
- export declare function readRunEvents(path: string): {
2
+ export interface EventFileRead {
3
+ events: RunEvent[];
4
+ malformed: number;
5
+ /** The file ends in a line that has no newline and does not parse: torn,
6
+ * or still being written. It is counted in `malformed`. */
7
+ tornTail: boolean;
8
+ }
9
+ /** The raw reader, for a path without a live writer. */
10
+ export declare function readEventFile(path: string): EventFileRead;
11
+ /**
12
+ * A live writer's file followed by its stamped events that have not landed:
13
+ * those with a higher seq than any line on disk, so a line already written is
14
+ * not repeated. A torn last line is the start of one of them and is replaced
15
+ * by its in-memory copy.
16
+ */
17
+ export declare function withUnlanded(read: EventFileRead, unlanded: readonly RunEvent[]): {
4
18
  events: RunEvent[];
5
19
  malformed: number;
6
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"event-file.d.ts","sourceRoot":"","sources":["../src/event-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAOlD,yFAAyF;AACzF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAerF;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAsDD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAoBzD"}
1
+ {"version":3,"file":"event-file.d.ts","sourceRoot":"","sources":["../src/event-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAOlD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB;+DAC2D;IAC3D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAkBzD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,SAAS,QAAQ,EAAE,GAC5B;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQ3C;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMlD;AAsDD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAoBzD"}
@@ -1,15 +1,16 @@
1
1
  import { RunEvent as RunEventSchema } from "@claudexor/schema";
2
2
  import { closeSync, fstatSync, openSync, readSync } from "node:fs";
3
3
  import { readTextSafe } from "@claudexor/util";
4
- /* Readers of a run's events.jsonl file: no live writer state is consulted. */
5
- /** Shared reader for live terminal preparation and selected interrupted-run recovery. */
6
- export function readRunEvents(path) {
4
+ /** The raw reader, for a path without a live writer. */
5
+ export function readEventFile(path) {
7
6
  const text = readTextSafe(path);
8
7
  if (text === null)
9
- return { events: [], malformed: 0 };
8
+ return { events: [], malformed: 0, tornTail: false };
10
9
  const events = [];
11
10
  let malformed = 0;
12
- for (const line of text.split("\n")) {
11
+ let tornTail = false;
12
+ const lines = text.split("\n");
13
+ for (const [index, line] of lines.entries()) {
13
14
  const trimmed = line.trim();
14
15
  if (!trimmed)
15
16
  continue;
@@ -18,9 +19,28 @@ export function readRunEvents(path) {
18
19
  }
19
20
  catch {
20
21
  malformed += 1;
22
+ tornTail = index === lines.length - 1;
21
23
  }
22
24
  }
23
- return { events, malformed };
25
+ return { events, malformed, tornTail };
26
+ }
27
+ /**
28
+ * A live writer's file followed by its stamped events that have not landed:
29
+ * those with a higher seq than any line on disk, so a line already written is
30
+ * not repeated. A torn last line is the start of one of them and is replaced
31
+ * by its in-memory copy.
32
+ */
33
+ export function withUnlanded(read, unlanded) {
34
+ if (unlanded.length === 0)
35
+ return { events: read.events, malformed: read.malformed };
36
+ let onDisk = 0;
37
+ for (const event of read.events)
38
+ if ((event.seq ?? 0) > onDisk)
39
+ onDisk = event.seq ?? 0;
40
+ return {
41
+ events: [...read.events, ...unlanded.filter((event) => (event.seq ?? 0) > onDisk)],
42
+ malformed: read.malformed - (read.tornTail ? 1 : 0),
43
+ };
24
44
  }
25
45
  /** How much of a log's end `lastSeqInFile` reads before it scans the whole file. */
26
46
  const LAST_SEQ_TAIL_BYTES = 64 * 1024;
@@ -1 +1 @@
1
- {"version":3,"file":"event-file.js","sourceRoot":"","sources":["../src/event-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-file.js","sourceRoot":"","sources":["../src/event-file.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,37 +1,14 @@
1
- import type { RunEvent, RunEventType, RunTelemetry } from "@claudexor/schema";
1
+ import type { RunEvent, RunEventType } from "@claudexor/schema";
2
+ import type { EventLogOptions, PreparedTerminalEvent, TerminalPersistenceHook, TerminalRunEventType, TerminalStagingHook } from "./types.js";
2
3
  export { RETAINED_OUTPUT_PATH, retainedOutput, writeRetainedOutput } from "./retained-output.js";
3
- export { lastSeqInFile, readRunEvents } from "./event-file.js";
4
- export type TerminalRunEventType = Extract<RunEventType, "run.completed" | "run.failed" | "run.blocked">;
5
- export interface PreparedTerminalEvent {
6
- type: TerminalRunEventType;
7
- payload: Record<string, unknown>;
8
- /** Prepared in memory by the receipt owner; a SQL terminal sink writes it. */
9
- telemetry?: RunTelemetry | null;
10
- /**
11
- * Publish the prepared receipt's canonical commit marker after the durable
12
- * journal accepts the terminal, but before file-tail/live observers can see
13
- * the per-run terminal event.
14
- */
15
- commit?: () => void;
16
- /**
17
- * Undo preparation/commit side effects when no durable journal authority was
18
- * established. The callback must be idempotent.
19
- */
20
- rollback?: () => void;
21
- }
22
- /** A synchronous replacement for terminal persistence and file finalization.
23
- * A throw means no authority committed; pending means it committed and repair
24
- * remains owed. The event log never repeats the sink's file writes. */
25
- export type TerminalPersistenceHook = (event: RunEvent, telemetry: RunTelemetry | null) => {
26
- state: "materialized";
27
- } | {
28
- state: "pending";
29
- error: unknown;
4
+ export { lastSeqInFile } from "./event-file.js";
5
+ export { appendRunEvent, appendRunEventLanded, emitBestEffort, lastRunEventSeq, liveRunEventSeq, readRunEvents, } from "./live-writers.js";
6
+ export type { EventLogOptions, PreparedTerminalEvent, TerminalPersistenceHook, TerminalRunEventType, TerminalStagingHook, } from "./types.js";
7
+ /** Who awaits an event's landing: resolved with the event, or given its failure. */
8
+ type Landing = {
9
+ resolve(event: RunEvent): void;
10
+ reject(error: unknown): void;
30
11
  };
31
- /** Writes a prepared terminal's durable bytes off the request thread before
32
- * its synchronous commit, which then adopts them; anything not staged the
33
- * commit writes itself. */
34
- export type TerminalStagingHook = (event: RunEvent, telemetry: RunTelemetry | null) => Promise<void>;
35
12
  /**
36
13
  * Append-only JSONL event log for a single run. Terminal output and human
37
14
  * summaries are projections; this file is the canonical event stream.
@@ -43,7 +20,6 @@ export type TerminalStagingHook = (event: RunEvent, telemetry: RunTelemetry | nu
43
20
  * writer) continues the sequence instead of restarting it.
44
21
  */
45
22
  export declare class EventLog {
46
- private readonly path;
47
23
  private readonly runId;
48
24
  private readonly taskId;
49
25
  /**
@@ -60,6 +36,8 @@ export declare class EventLog {
60
36
  private readonly threadId?;
61
37
  /** Best-effort live observer, invoked only after terminal finalization. */
62
38
  private readonly onPublish?;
39
+ /** Absolute, as the live-writer registry and the ordered appender key it. */
40
+ private readonly path;
63
41
  private nextSeq;
64
42
  private deferTerminalEvents;
65
43
  private deferredTerminal;
@@ -68,10 +46,17 @@ export declare class EventLog {
68
46
  private terminalWriterPoisoned;
69
47
  private terminalPersistence?;
70
48
  private terminalStaging?;
71
- /** A prepared terminal's bytes are being staged; ordinary events may append. */
49
+ /** A terminal is being committed through `emitTerminal`; ordinary events may append. */
72
50
  private terminalStaged;
73
51
  private prepareOutput?;
74
52
  private beforeTerminal?;
53
+ /** Queued mode: stamped events whose lines have not landed, in seq order.
54
+ * Null when lines are written inline. */
55
+ private readonly unlanded;
56
+ /** Queued mode: the highest seq whose line has landed. */
57
+ private landedSeq;
58
+ /** `dispose` was called while lines were in flight; it completes when they land. */
59
+ private disposeWhenLanded;
75
60
  constructor(path: string, runId: string, taskId: string,
76
61
  /**
77
62
  * Durable in-process authority. Non-terminal events reach it after their
@@ -86,16 +71,20 @@ export declare class EventLog {
86
71
  */
87
72
  threadId?: string | undefined,
88
73
  /** Best-effort live observer, invoked only after terminal finalization. */
89
- onPublish?: ((event: RunEvent) => void) | undefined);
74
+ onPublish?: ((event: RunEvent) => void) | undefined, options?: EventLogOptions);
90
75
  /**
91
76
  * Unregister this log as the live writer for its path. Out-of-band
92
- * appenders fall back to file-tail stamping afterwards, which is safe once
93
- * the owning run is terminal (nobody else holds an in-memory counter).
77
+ * appenders fall back to file-tail stamping afterwards, and this log no
78
+ * longer emits, so no in-memory counter competes with the file's (#704). With
79
+ * lines still in flight, the log stays registered until the last one lands
80
+ * or is lost, so nobody stamps from a file that is still short. A poisoned
81
+ * writer stays registered as the path's fence until recovery releases it.
94
82
  */
95
83
  dispose(): void;
96
84
  /** Hold the one terminal event while a Delegate parent drains children.
97
85
  * Non-terminal events (notably aggregate budget.cash) continue to append and
98
- * therefore remain ordered before the eventual final event. */
86
+ * therefore remain ordered before the eventual final event. The hold stays
87
+ * until a terminal commits; only `emitTerminal` commits a held terminal. */
99
88
  deferTerminal(): void;
100
89
  clearDeferredTerminal(): void;
101
90
  /** The terminal held by `deferTerminal()` and not yet flushed, if any (a copy). */
@@ -115,59 +104,82 @@ export declare class EventLog {
115
104
  /** Stage a terminal's durable bytes off the request thread before its commit
116
105
  * (`emitTerminal`, `commitDeferredTerminal`). */
117
106
  setTerminalStaging(hook: TerminalStagingHook): void;
118
- /** Highest seq this writer has appended: its in-memory counter, no file read. */
107
+ /** Highest seq whose line this writer has appended (queued mode: landed):
108
+ * its in-memory counter, no file read. */
119
109
  lastSeq(): number;
120
110
  /** Append a typed run event. Validates against the schema before writing. */
121
111
  emit(type: RunEventType, payload?: Record<string, unknown>, publish?: boolean): RunEvent;
122
112
  /**
123
- * The terminal commit with its durable bytes staged first. The terminal is
124
- * prepared synchronously (canonical type, receipt and outcome frozen), the
125
- * staging hook writes its bytes off the request thread, and the unchanged
126
- * synchronous commit adopts them. While staging awaits, another terminal is
127
- * refused as in progress and an ordinary event (an audit, a live-message
128
- * receipt) appends before the terminal, which then takes the next seq and
129
- * keeps the time its verdict was prepared. A staging failure leaves the
130
- * writes to the commit. Without a hook, or while terminals are held, this is
131
- * `emit`, committed before this function first yields.
113
+ * `emit`, settled once the event's line has landed and its `onPersist`
114
+ * accepted it. A queued log's write or `onPersist` failure rejects this
115
+ * await alone: it is not held for the log's next emit, and the log stays
116
+ * usable. An inline log has settled by the time this returns.
117
+ */
118
+ emitLanded(type: Exclude<RunEventType, TerminalRunEventType>, payload?: Record<string, unknown>, publish?: boolean): Promise<RunEvent>;
119
+ /** @internal An emit made aside (`appendRunEvent`, `appendRunEventLanded`,
120
+ * `emitBestEffort`): it leaves a failure held for the run's own lines to them,
121
+ * and its own failure goes to `landing` alone, never held for the run (#704). */
122
+ emitAside(type: Exclude<RunEventType, TerminalRunEventType>, payload: Record<string, unknown>, landing: Landing): RunEvent;
123
+ private emitEvent;
124
+ /** A queued line landed: it counts, `onPersist` takes it, then `onPublish`
125
+ * (an `onPersist` throw is this landing's failure and skips `onPublish`). */
126
+ private landed;
127
+ /** A queued line did not reach the file whole: its write failed first, and
128
+ * every later line fails with it. The counter continues after the last line
129
+ * that landed, so a seq on disk is never reused, and these consume none. */
130
+ private lost;
131
+ private releaseWhenLanded;
132
+ /**
133
+ * The terminal commit, with its durable bytes staged first when a staging
134
+ * hook is set. The terminal is prepared synchronously (canonical type,
135
+ * receipt and outcome frozen), the staging hook writes its bytes off the
136
+ * request thread, and the unchanged synchronous commit adopts them. While
137
+ * this runs another terminal is refused as in progress, and an ordinary
138
+ * event (an audit, a live-message receipt) appends before the terminal,
139
+ * which then takes the next seq and keeps the time its verdict was prepared.
140
+ * A staging failure leaves the writes to the commit. This commits a held
141
+ * terminal too; it never holds one.
142
+ *
143
+ * A queued log first settles every ordered append under its run directory,
144
+ * prepares its output, settles again, and only then freezes the rollback
145
+ * boundary and prepares the terminal; after staging it settles until its own
146
+ * queue is empty. An inline log without a staging hook commits before this
147
+ * function first yields.
132
148
  */
133
149
  emitTerminal(type: TerminalRunEventType, payload?: Record<string, unknown>, publish?: boolean): Promise<RunEvent>;
134
150
  /** Commit the terminal held by `deferTerminal()` through `emitTerminal`, so
135
- * its bytes are staged first when a staging hook is set. */
151
+ * its bytes are staged first when a staging hook is set. The hold stays, and
152
+ * so does the terminal until it commits: a commit that throws leaves it
153
+ * pending for the flush that follows (#704). */
136
154
  commitDeferredTerminal(): Promise<RunEvent | null>;
155
+ /** The barrier of every ordered append under the run directory made before
156
+ * this call. Rejects with a failure nobody awaited. */
157
+ private runSettled;
158
+ /** The synchronous terminal commit. A queued log refuses it while a line is in
159
+ * flight, since the terminal line would land ahead of it (a programming-error
160
+ * fence: every queued run commits its terminal through `emitTerminal`). */
161
+ private commitNow;
162
+ private assertNothingInFlight;
137
163
  private assertEmittable;
138
164
  private stamp;
139
165
  private fileBytes;
140
- /** Freeze a terminal: its derived output, event and receipt. The fence stays
141
- * up until the commit; a failed preparation rolls back and rethrows. */
166
+ /** Freeze a terminal: its event and receipt. The fence stays up until the
167
+ * commit; a failed preparation rolls back and rethrows. */
142
168
  private prepareTerminal;
143
169
  private commitTerminal;
144
170
  private poisonAfterDurableCommit;
145
171
  /** @internal Release a poisoned live owner once journal recovery repairs its tail. */
146
172
  releaseRecoveredTerminalFence(): boolean;
173
+ /** No queued byte lies past the cut: `emitTerminal` freezes `previousBytes`
174
+ * and commits only after a settle, and rolls a failed settle back at the
175
+ * current size; `commitNow` refuses a queued log with lines in flight.
176
+ * Landed bytes past the cut are truncated. */
147
177
  private rollbackTerminal;
148
- /** Read and parse all events (skipping malformed lines, which are surfaced separately). */
178
+ /** Read and parse all events (skipping malformed lines, which are surfaced
179
+ * separately), followed by those stamped and not yet landed. */
149
180
  readAll(): {
150
181
  events: RunEvent[];
151
182
  malformed: number;
152
183
  };
153
184
  }
154
- /**
155
- * Append an out-of-band event (e.g. a control-api audit record) into a run's
156
- * canonical log WITHOUT corrupting the seq space: routes through the live
157
- * EventLog when the run is still active (same counter, same onEmit sink), and
158
- * falls back to file-tail stamping for terminal runs.
159
- */
160
- export declare function appendRunEvent(path: string, runId: string, taskId: string, type: RunEventType, payload?: Record<string, unknown>): RunEvent;
161
- /**
162
- * A registered live writer's authoritative in-memory cursor, or null when no
163
- * live writer owns this path. This never reads files or initiates recovery;
164
- * a poisoned writer keeps its conservative counter until recovery releases it.
165
- */
166
- export declare function liveRunEventSeq(path: string): number | null;
167
- /**
168
- * The run's highest event `seq` for snapshot fencing. A live writer answers from
169
- * its in-memory counter (the one seq owner; its file holds exactly the events up
170
- * to that seq); any other log answers from its file through `lastSeqInFile`.
171
- */
172
- export declare function lastRunEventSeq(path: string): number;
173
185
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,9 +1,12 @@
1
1
  import { RunEvent as RunEventSchema } from "@claudexor/schema";
2
2
  import { existsSync, statSync, truncateSync, unlinkSync } from "node:fs";
3
- import { appendLine, nowIso } from "@claudexor/util";
4
- import { lastSeqInFile, readRunEvents, terminalEventInFile } from "./event-file.js";
3
+ import { dirname, resolve } from "node:path";
4
+ import { appendLine, nowIso, orderedAppender } from "@claudexor/util";
5
+ import { lastSeqInFile, readEventFile, terminalEventInFile, withUnlanded } from "./event-file.js";
6
+ import { activeEventLogs, terminalTypeOf } from "./live-writers.js";
5
7
  export { RETAINED_OUTPUT_PATH, retainedOutput, writeRetainedOutput } from "./retained-output.js";
6
- export { lastSeqInFile, readRunEvents } from "./event-file.js";
8
+ export { lastSeqInFile } from "./event-file.js";
9
+ export { appendRunEvent, appendRunEventLanded, emitBestEffort, lastRunEventSeq, liveRunEventSeq, readRunEvents, } from "./live-writers.js";
7
10
  /**
8
11
  * Append-only JSONL event log for a single run. Terminal output and human
9
12
  * summaries are projections; this file is the canonical event stream.
@@ -15,12 +18,13 @@ export { lastSeqInFile, readRunEvents } from "./event-file.js";
15
18
  * writer) continues the sequence instead of restarting it.
16
19
  */
17
20
  export class EventLog {
18
- path;
19
21
  runId;
20
22
  taskId;
21
23
  onPersist;
22
24
  threadId;
23
25
  onPublish;
26
+ /** Absolute, as the live-writer registry and the ordered appender key it. */
27
+ path;
24
28
  nextSeq;
25
29
  deferTerminalEvents = false;
26
30
  deferredTerminal = null;
@@ -29,10 +33,17 @@ export class EventLog {
29
33
  terminalWriterPoisoned = false;
30
34
  terminalPersistence;
31
35
  terminalStaging;
32
- /** A prepared terminal's bytes are being staged; ordinary events may append. */
36
+ /** A terminal is being committed through `emitTerminal`; ordinary events may append. */
33
37
  terminalStaged = false;
34
38
  prepareOutput;
35
39
  beforeTerminal;
40
+ /** Queued mode: stamped events whose lines have not landed, in seq order.
41
+ * Null when lines are written inline. */
42
+ unlanded;
43
+ /** Queued mode: the highest seq whose line has landed. */
44
+ landedSeq;
45
+ /** `dispose` was called while lines were in flight; it completes when they land. */
46
+ disposeWhenLanded = false;
36
47
  constructor(path, runId, taskId,
37
48
  /**
38
49
  * Durable in-process authority. Non-terminal events reach it after their
@@ -47,34 +58,48 @@ export class EventLog {
47
58
  */
48
59
  threadId,
49
60
  /** Best-effort live observer, invoked only after terminal finalization. */
50
- onPublish) {
51
- this.path = path;
61
+ onPublish, options = {}) {
52
62
  this.runId = runId;
53
63
  this.taskId = taskId;
54
64
  this.onPersist = onPersist;
55
65
  this.threadId = threadId;
56
66
  this.onPublish = onPublish;
57
- this.nextSeq = lastSeqInFile(path) + 1;
58
- this.terminalCommittedFlag = terminalEventInFile(path);
59
- if (!this.terminalCommittedFlag) {
60
- if (activeEventLogs.has(path)) {
61
- throw new Error("an active EventLog already owns this event path");
62
- }
63
- activeEventLogs.set(path, this);
67
+ this.path = resolve(path);
68
+ // The live owner is checked before the tail is read: a live queued writer's
69
+ // file may still be missing lines it has stamped.
70
+ const live = activeEventLogs.get(this.path);
71
+ if (live && !live.releaseRecoveredTerminalFence()) {
72
+ throw new Error("an active EventLog already owns this event path");
64
73
  }
74
+ this.nextSeq = lastSeqInFile(this.path) + 1;
75
+ this.landedSeq = this.nextSeq - 1;
76
+ this.unlanded = options.queued ? [] : null;
77
+ this.terminalCommittedFlag = terminalEventInFile(this.path);
78
+ if (!this.terminalCommittedFlag)
79
+ activeEventLogs.set(this.path, this);
65
80
  }
66
81
  /**
67
82
  * Unregister this log as the live writer for its path. Out-of-band
68
- * appenders fall back to file-tail stamping afterwards, which is safe once
69
- * the owning run is terminal (nobody else holds an in-memory counter).
83
+ * appenders fall back to file-tail stamping afterwards, and this log no
84
+ * longer emits, so no in-memory counter competes with the file's (#704). With
85
+ * lines still in flight, the log stays registered until the last one lands
86
+ * or is lost, so nobody stamps from a file that is still short. A poisoned
87
+ * writer stays registered as the path's fence until recovery releases it.
70
88
  */
71
89
  dispose() {
90
+ if (this.terminalWriterPoisoned && !this.terminalCommittedFlag)
91
+ return;
92
+ if (this.unlanded?.length) {
93
+ this.disposeWhenLanded = true;
94
+ return;
95
+ }
72
96
  if (activeEventLogs.get(this.path) === this)
73
97
  activeEventLogs.delete(this.path);
74
98
  }
75
99
  /** Hold the one terminal event while a Delegate parent drains children.
76
100
  * Non-terminal events (notably aggregate budget.cash) continue to append and
77
- * therefore remain ordered before the eventual final event. */
101
+ * therefore remain ordered before the eventual final event. The hold stays
102
+ * until a terminal commits; only `emitTerminal` commits a held terminal. */
78
103
  deferTerminal() {
79
104
  this.deferTerminalEvents = true;
80
105
  }
@@ -106,17 +131,48 @@ export class EventLog {
106
131
  setTerminalStaging(hook) {
107
132
  this.terminalStaging = hook;
108
133
  }
109
- /** Highest seq this writer has appended: its in-memory counter, no file read. */
134
+ /** Highest seq whose line this writer has appended (queued mode: landed):
135
+ * its in-memory counter, no file read. */
110
136
  lastSeq() {
111
- return this.nextSeq - 1;
137
+ return this.unlanded ? this.landedSeq : this.nextSeq - 1;
112
138
  }
113
139
  /** Append a typed run event. Validates against the schema before writing. */
114
140
  emit(type, payload = {}, publish = true) {
141
+ return this.emitEvent(type, payload, publish);
142
+ }
143
+ /**
144
+ * `emit`, settled once the event's line has landed and its `onPersist`
145
+ * accepted it. A queued log's write or `onPersist` failure rejects this
146
+ * await alone: it is not held for the log's next emit, and the log stays
147
+ * usable. An inline log has settled by the time this returns.
148
+ */
149
+ emitLanded(type, payload = {}, publish = true) {
150
+ return new Promise((resolve, reject) => {
151
+ if (this.unlanded)
152
+ this.emitEvent(type, payload, publish, { resolve, reject });
153
+ else
154
+ resolve(this.emitEvent(type, payload, publish));
155
+ });
156
+ }
157
+ /** @internal An emit made aside (`appendRunEvent`, `appendRunEventLanded`,
158
+ * `emitBestEffort`): it leaves a failure held for the run's own lines to them,
159
+ * and its own failure goes to `landing` alone, never held for the run (#704). */
160
+ emitAside(type, payload, landing) {
161
+ const event = this.emitEvent(type, payload, true, { ...landing, aside: true });
162
+ if (!this.unlanded)
163
+ landing.resolve(event);
164
+ return event;
165
+ }
166
+ emitEvent(type, payload, publish, landing) {
115
167
  this.assertEmittable();
116
- const terminalType = type === "run.completed" || type === "run.failed" || type === "run.blocked" ? type : null;
168
+ const terminalType = terminalTypeOf(type);
117
169
  if (terminalType && this.terminalStaged) {
118
170
  throw new Error("run terminal event commit is already in progress");
119
171
  }
172
+ // A queued line's failure that nobody awaited is reported here, once, to
173
+ // the run's own producers.
174
+ if (this.unlanded && !landing?.aside)
175
+ orderedAppender.throwHeld(this.path);
120
176
  if (this.deferTerminalEvents && terminalType) {
121
177
  if (this.deferredTerminal)
122
178
  throw new Error("run terminal event was emitted more than once");
@@ -124,8 +180,23 @@ export class EventLog {
124
180
  return this.stamp(type, payload);
125
181
  }
126
182
  if (terminalType)
127
- return this.commitTerminal(this.prepareTerminal(terminalType, payload), publish);
183
+ return this.commitNow(terminalType, payload, publish);
128
184
  const event = this.stamp(type, payload);
185
+ if (this.unlanded) {
186
+ orderedAppender.append(this.path, `${JSON.stringify(event)}\n`, {
187
+ landed: () => this.landed(event, publish),
188
+ lost: () => this.lost(),
189
+ ...(landing
190
+ ? {
191
+ aside: landing.aside === true,
192
+ waiter: { resolve: () => landing.resolve(event), reject: landing.reject },
193
+ }
194
+ : {}),
195
+ });
196
+ this.nextSeq += 1;
197
+ this.unlanded.push(event);
198
+ return event;
199
+ }
129
200
  appendLine(this.path, JSON.stringify(event));
130
201
  this.nextSeq += 1;
131
202
  this.onPersist?.(event);
@@ -138,58 +209,151 @@ export class EventLog {
138
209
  }
139
210
  return event;
140
211
  }
212
+ /** A queued line landed: it counts, `onPersist` takes it, then `onPublish`
213
+ * (an `onPersist` throw is this landing's failure and skips `onPublish`). */
214
+ landed(event, publish) {
215
+ this.unlanded.shift();
216
+ this.landedSeq = event.seq ?? this.landedSeq;
217
+ try {
218
+ this.onPersist?.(event);
219
+ try {
220
+ if (publish)
221
+ this.onPublish?.(event);
222
+ }
223
+ catch {
224
+ /* best-effort live observer */
225
+ }
226
+ }
227
+ finally {
228
+ this.releaseWhenLanded();
229
+ }
230
+ }
231
+ /** A queued line did not reach the file whole: its write failed first, and
232
+ * every later line fails with it. The counter continues after the last line
233
+ * that landed, so a seq on disk is never reused, and these consume none. */
234
+ lost() {
235
+ this.unlanded.shift();
236
+ if (this.unlanded.length === 0)
237
+ this.nextSeq = this.landedSeq + 1;
238
+ this.releaseWhenLanded();
239
+ }
240
+ releaseWhenLanded() {
241
+ if (!this.disposeWhenLanded || this.unlanded.length > 0)
242
+ return;
243
+ this.disposeWhenLanded = false;
244
+ this.dispose();
245
+ }
141
246
  /**
142
- * The terminal commit with its durable bytes staged first. The terminal is
143
- * prepared synchronously (canonical type, receipt and outcome frozen), the
144
- * staging hook writes its bytes off the request thread, and the unchanged
145
- * synchronous commit adopts them. While staging awaits, another terminal is
146
- * refused as in progress and an ordinary event (an audit, a live-message
147
- * receipt) appends before the terminal, which then takes the next seq and
148
- * keeps the time its verdict was prepared. A staging failure leaves the
149
- * writes to the commit. Without a hook, or while terminals are held, this is
150
- * `emit`, committed before this function first yields.
247
+ * The terminal commit, with its durable bytes staged first when a staging
248
+ * hook is set. The terminal is prepared synchronously (canonical type,
249
+ * receipt and outcome frozen), the staging hook writes its bytes off the
250
+ * request thread, and the unchanged synchronous commit adopts them. While
251
+ * this runs another terminal is refused as in progress, and an ordinary
252
+ * event (an audit, a live-message receipt) appends before the terminal,
253
+ * which then takes the next seq and keeps the time its verdict was prepared.
254
+ * A staging failure leaves the writes to the commit. This commits a held
255
+ * terminal too; it never holds one.
256
+ *
257
+ * A queued log first settles every ordered append under its run directory,
258
+ * prepares its output, settles again, and only then freezes the rollback
259
+ * boundary and prepares the terminal; after staging it settles until its own
260
+ * queue is empty. An inline log without a staging hook commits before this
261
+ * function first yields.
151
262
  */
152
263
  async emitTerminal(type, payload = {}, publish = true) {
153
264
  const stage = this.terminalStaging;
154
- if (!stage || this.deferTerminalEvents)
155
- return this.emit(type, payload, publish);
265
+ const queued = this.unlanded;
156
266
  this.assertEmittable();
157
267
  if (this.terminalStaged)
158
268
  throw new Error("run terminal event commit is already in progress");
159
- const terminal = this.prepareTerminal(type, payload);
160
- this.terminalCommitInProgress = false;
269
+ if (!stage && !queued)
270
+ return this.commitNow(type, payload, publish);
271
+ // Raised before the first await, so no callback during it commits a terminal.
161
272
  this.terminalStaged = true;
162
273
  try {
163
- await stage(terminal.event, terminal.prepared?.telemetry ?? null);
164
- }
165
- catch {
166
- // Whatever was not staged, the synchronous commit writes itself.
274
+ // Each wait ends in the synchronous step it guards, so a line emitted while
275
+ // a barrier settled is awaited too, never landing after the terminal
276
+ // (#704). Only this log's queue is rechecked: a side journal appended after
277
+ // the last barrier may still be in flight at the commit (no reader needs it).
278
+ if (queued)
279
+ do
280
+ await this.runSettled();
281
+ while (queued.length > 0);
282
+ this.prepareOutput?.(type, payload);
283
+ if (queued)
284
+ do
285
+ await this.runSettled();
286
+ while (queued.length > 0);
287
+ const terminal = this.prepareTerminal(type, payload);
288
+ this.terminalCommitInProgress = false;
289
+ if (stage) {
290
+ try {
291
+ await stage(terminal.event, terminal.prepared?.telemetry ?? null);
292
+ }
293
+ catch {
294
+ // Whatever was not staged, the synchronous commit writes itself.
295
+ }
296
+ }
297
+ if (queued) {
298
+ try {
299
+ do
300
+ await this.runSettled();
301
+ while (queued.length > 0);
302
+ }
303
+ catch (error) {
304
+ this.rollbackTerminal(this.fileBytes(), terminal.prepared, error);
305
+ }
306
+ }
307
+ this.terminalStaged = false;
308
+ return this.commitTerminal(terminal, publish);
167
309
  }
168
310
  finally {
169
311
  this.terminalStaged = false;
170
312
  }
171
- return this.commitTerminal(terminal, publish);
172
313
  }
173
314
  /** Commit the terminal held by `deferTerminal()` through `emitTerminal`, so
174
- * its bytes are staged first when a staging hook is set. */
315
+ * its bytes are staged first when a staging hook is set. The hold stays, and
316
+ * so does the terminal until it commits: a commit that throws leaves it
317
+ * pending for the flush that follows (#704). */
175
318
  async commitDeferredTerminal() {
176
319
  const pending = this.deferredTerminal;
177
- this.deferredTerminal = null;
178
- this.deferTerminalEvents = false;
179
320
  return pending
180
321
  ? this.emitTerminal(pending.type, pending.payload)
181
322
  : null;
182
323
  }
324
+ /** The barrier of every ordered append under the run directory made before
325
+ * this call. Rejects with a failure nobody awaited. */
326
+ runSettled() {
327
+ return orderedAppender.settledUnder(dirname(this.path));
328
+ }
329
+ /** The synchronous terminal commit. A queued log refuses it while a line is in
330
+ * flight, since the terminal line would land ahead of it (a programming-error
331
+ * fence: every queued run commits its terminal through `emitTerminal`). */
332
+ commitNow(terminalType, payload, publish) {
333
+ this.assertNothingInFlight();
334
+ // Derived output may announce its file before the terminal sequence/receipt
335
+ // is frozen. Deferred terminals reach this only when they are flushed.
336
+ this.prepareOutput?.(terminalType, payload);
337
+ this.assertNothingInFlight();
338
+ return this.commitTerminal(this.prepareTerminal(terminalType, payload), publish);
339
+ }
340
+ assertNothingInFlight() {
341
+ if (!this.unlanded?.length)
342
+ return;
343
+ throw Object.assign(new Error("a queued event log commits a terminal synchronously only with no writes in flight"), { code: "terminal_writes_in_flight" });
344
+ }
183
345
  assertEmittable() {
184
- if (this.terminalCommittedFlag) {
346
+ if (this.terminalCommittedFlag)
185
347
  throw new Error("run terminal event is already committed");
186
- }
187
348
  if (this.terminalWriterPoisoned) {
188
349
  throw new Error("run terminal writer is poisoned after an incomplete rollback");
189
350
  }
190
351
  if (this.terminalCommitInProgress) {
191
352
  throw new Error("run terminal event commit is already in progress");
192
353
  }
354
+ // Released by `dispose` with no terminal: the file tail stamps the run's seqs now (#704).
355
+ if (activeEventLogs.get(this.path) !== this)
356
+ throw new Error("run event writer was released");
193
357
  }
194
358
  stamp(type, payload) {
195
359
  return RunEventSchema.parse({
@@ -205,12 +369,9 @@ export class EventLog {
205
369
  fileBytes() {
206
370
  return existsSync(this.path) ? statSync(this.path).size : null;
207
371
  }
208
- /** Freeze a terminal: its derived output, event and receipt. The fence stays
209
- * up until the commit; a failed preparation rolls back and rethrows. */
372
+ /** Freeze a terminal: its event and receipt. The fence stays up until the
373
+ * commit; a failed preparation rolls back and rethrows. */
210
374
  prepareTerminal(terminalType, payload) {
211
- // Derived output may announce its file before the terminal sequence/receipt
212
- // is frozen. Deferred terminals reach this only when they are flushed.
213
- this.prepareOutput?.(terminalType, payload);
214
375
  let prepared = undefined;
215
376
  let event = this.stamp(terminalType, payload);
216
377
  // Snapshot before terminal preparation: the hook may materialize sibling
@@ -283,9 +444,11 @@ export class EventLog {
283
444
  }
284
445
  }
285
446
  this.nextSeq += 1;
447
+ this.landedSeq = event.seq ?? this.landedSeq;
286
448
  // The durable journal, canonical prepared receipt, and per-run event are
287
449
  // now one committed terminal unit. Only now may observers see it.
288
450
  this.terminalCommittedFlag = true;
451
+ this.deferredTerminal = null;
289
452
  this.terminalCommitInProgress = false;
290
453
  this.beforeTerminal = undefined;
291
454
  this.dispose();
@@ -322,6 +485,10 @@ export class EventLog {
322
485
  this.dispose();
323
486
  return true;
324
487
  }
488
+ /** No queued byte lies past the cut: `emitTerminal` freezes `previousBytes`
489
+ * and commits only after a settle, and rolls a failed settle back at the
490
+ * current size; `commitNow` refuses a queued log with lines in flight.
491
+ * Landed bytes past the cut are truncated. */
325
492
  rollbackTerminal(previousBytes, prepared, originalError) {
326
493
  const rollbackErrors = [];
327
494
  try {
@@ -353,58 +520,10 @@ export class EventLog {
353
520
  this.terminalCommitInProgress = false;
354
521
  throw originalError;
355
522
  }
356
- /** Read and parse all events (skipping malformed lines, which are surfaced separately). */
523
+ /** Read and parse all events (skipping malformed lines, which are surfaced
524
+ * separately), followed by those stamped and not yet landed. */
357
525
  readAll() {
358
- return readRunEvents(this.path);
359
- }
360
- }
361
- /**
362
- * Live writers by events.jsonl path (one daemon process hosts the
363
- * orchestrator AND the control API). While a run is active its EventLog owns
364
- * the in-memory seq counter; any other same-process appender stamping from
365
- * the file tail would duplicate ids the moment the live counter is ahead.
366
- */
367
- const activeEventLogs = new Map();
368
- /**
369
- * Append an out-of-band event (e.g. a control-api audit record) into a run's
370
- * canonical log WITHOUT corrupting the seq space: routes through the live
371
- * EventLog when the run is still active (same counter, same onEmit sink), and
372
- * falls back to file-tail stamping for terminal runs.
373
- */
374
- export function appendRunEvent(path, runId, taskId, type, payload = {}) {
375
- const live = activeEventLogs.get(path);
376
- if (live && !live.releaseRecoveredTerminalFence())
377
- return live.emit(type, payload);
378
- const terminal = type === "run.completed" || type === "run.failed" || type === "run.blocked";
379
- if (terminal && terminalEventInFile(path)) {
380
- throw new Error("run terminal event is already committed");
526
+ return withUnlanded(readEventFile(this.path), this.unlanded ?? []);
381
527
  }
382
- const event = RunEventSchema.parse({
383
- seq: lastSeqInFile(path) + 1,
384
- ts: nowIso(),
385
- run_id: runId,
386
- task_id: taskId,
387
- type,
388
- payload: payload,
389
- });
390
- appendLine(path, JSON.stringify(event));
391
- return event;
392
- }
393
- /**
394
- * A registered live writer's authoritative in-memory cursor, or null when no
395
- * live writer owns this path. This never reads files or initiates recovery;
396
- * a poisoned writer keeps its conservative counter until recovery releases it.
397
- */
398
- export function liveRunEventSeq(path) {
399
- return activeEventLogs.get(path)?.lastSeq() ?? null;
400
- }
401
- /**
402
- * The run's highest event `seq` for snapshot fencing. A live writer answers from
403
- * its in-memory counter (the one seq owner; its file holds exactly the events up
404
- * to that seq); any other log answers from its file through `lastSeqInFile`.
405
- */
406
- export function lastRunEventSeq(path) {
407
- const live = activeEventLogs.get(path);
408
- return live && !live.releaseRecoveredTerminalFence() ? live.lastSeq() : lastSeqInFile(path);
409
528
  }
410
529
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { RunEvent, RunEventType } from "@claudexor/schema";
2
+ import type { EventLog } from "./index.js";
3
+ import type { TerminalRunEventType } from "./types.js";
4
+ export declare function terminalTypeOf(type: RunEventType): TerminalRunEventType | null;
5
+ /**
6
+ * Live writers by events.jsonl path (one daemon process hosts the
7
+ * orchestrator AND the control API). While a run is active its EventLog owns
8
+ * the in-memory seq counter; any other same-process appender stamping from
9
+ * the file tail would duplicate ids the moment the live counter is ahead.
10
+ * Keyed by the absolute path, as the ordered appender keys the file, so two
11
+ * spellings of one path name one writer (#704).
12
+ */
13
+ declare class LiveWriters {
14
+ private readonly byPath;
15
+ get(path: string): EventLog | undefined;
16
+ set(path: string, log: EventLog): void;
17
+ delete(path: string): void;
18
+ }
19
+ export declare const activeEventLogs: LiveWriters;
20
+ /**
21
+ * Shared reader for live terminal preparation and selected interrupted-run
22
+ * recovery. A live writer answers with its file followed by the events it has
23
+ * stamped and not yet landed (`EventLog.readAll`); any other path is read raw.
24
+ */
25
+ export declare function readRunEvents(path: string): {
26
+ events: RunEvent[];
27
+ malformed: number;
28
+ };
29
+ /**
30
+ * Append an out-of-band event (e.g. a control-api audit record) into a run's
31
+ * canonical log WITHOUT corrupting the seq space: routes through the live
32
+ * EventLog when the run is still active (same counter, same onEmit sink), and
33
+ * falls back to file-tail stamping for terminal runs. Through a live writer it
34
+ * is best-effort and leaves the run's failures to the run (#704): it never
35
+ * consumes a failure held for the run's own lines, and a failure of its own
36
+ * line at landing is dropped, as the audit's catch-all drops a thrown one. A
37
+ * caller that must hear its line land uses `appendRunEventLanded`. A terminal
38
+ * type is the run's own and is emitted as such.
39
+ */
40
+ export declare function appendRunEvent(path: string, runId: string, taskId: string, type: RunEventType, payload?: Record<string, unknown>): RunEvent;
41
+ /**
42
+ * `emit` for a best-effort line of a run's own (evidence or a diagnostic the run
43
+ * must not fail over), made aside: it leaves a failure held for the run's other
44
+ * lines to them, and a failure of its own line at landing is dropped, as the
45
+ * caller's catch-all drops a thrown one (#704). A refusal at the call (a payload
46
+ * the schema rejects, a committed terminal) still throws, for that catch-all.
47
+ */
48
+ export declare function emitBestEffort(log: EventLog, type: Exclude<RunEventType, TerminalRunEventType>, payload: Record<string, unknown>): RunEvent;
49
+ /** `appendRunEvent`, settled once the line has landed and the live writer's
50
+ * `onPersist` accepted it (its failure rejects this await alone). It neither
51
+ * consumes nor leaves a failure for the run's own lines (#704). */
52
+ export declare function appendRunEventLanded(path: string, runId: string, taskId: string, type: Exclude<RunEventType, TerminalRunEventType>, payload?: Record<string, unknown>): Promise<RunEvent>;
53
+ /**
54
+ * A registered live writer's authoritative in-memory cursor, or null when no
55
+ * live writer owns this path. This never reads files or initiates recovery;
56
+ * a poisoned writer keeps its conservative counter until recovery releases it.
57
+ */
58
+ export declare function liveRunEventSeq(path: string): number | null;
59
+ /**
60
+ * The run's highest event `seq` for snapshot fencing. A live writer answers from
61
+ * its in-memory counter (the one seq owner; its file holds exactly the events up
62
+ * to that seq); any other log answers from its file through `lastSeqInFile`.
63
+ */
64
+ export declare function lastRunEventSeq(path: string): number;
65
+ export {};
66
+ //# sourceMappingURL=live-writers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-writers.d.ts","sourceRoot":"","sources":["../src/live-writers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,oBAAoB,GAAG,IAAI,CAE9E;AAED;;;;;;;GAOG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEtC;IACD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAErC;IACD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzB;CACF;AACD,eAAO,MAAM,eAAe,aAAoB,CAAC;AAOjD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAErF;AAKD;;;;;;;;;;GAUG;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,CAMV;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,oBAAoB,CAAC,EACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,QAAQ,CAEV;AAED;;mEAEmE;AACnE,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,oBAAoB,CAAC,EACjD,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAwBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,112 @@
1
+ import { RunEvent as RunEventSchema } from "@claudexor/schema";
2
+ import { resolve } from "node:path";
3
+ import { appendLine, nowIso } from "@claudexor/util";
4
+ import { lastSeqInFile, readEventFile, terminalEventInFile, withUnlanded } from "./event-file.js";
5
+ export function terminalTypeOf(type) {
6
+ return type === "run.completed" || type === "run.failed" || type === "run.blocked" ? type : null;
7
+ }
8
+ /**
9
+ * Live writers by events.jsonl path (one daemon process hosts the
10
+ * orchestrator AND the control API). While a run is active its EventLog owns
11
+ * the in-memory seq counter; any other same-process appender stamping from
12
+ * the file tail would duplicate ids the moment the live counter is ahead.
13
+ * Keyed by the absolute path, as the ordered appender keys the file, so two
14
+ * spellings of one path name one writer (#704).
15
+ */
16
+ class LiveWriters {
17
+ byPath = new Map();
18
+ get(path) {
19
+ return this.byPath.get(resolve(path));
20
+ }
21
+ set(path, log) {
22
+ this.byPath.set(resolve(path), log);
23
+ }
24
+ delete(path) {
25
+ this.byPath.delete(resolve(path));
26
+ }
27
+ }
28
+ export const activeEventLogs = new LiveWriters();
29
+ function liveEventLog(path) {
30
+ const live = activeEventLogs.get(path);
31
+ return live && !live.releaseRecoveredTerminalFence() ? live : null;
32
+ }
33
+ /**
34
+ * Shared reader for live terminal preparation and selected interrupted-run
35
+ * recovery. A live writer answers with its file followed by the events it has
36
+ * stamped and not yet landed (`EventLog.readAll`); any other path is read raw.
37
+ */
38
+ export function readRunEvents(path) {
39
+ return activeEventLogs.get(path)?.readAll() ?? withUnlanded(readEventFile(path), []);
40
+ }
41
+ /** A landing nobody hears: an out-of-band append that is best-effort. */
42
+ const unheard = { resolve: () => undefined, reject: () => undefined };
43
+ /**
44
+ * Append an out-of-band event (e.g. a control-api audit record) into a run's
45
+ * canonical log WITHOUT corrupting the seq space: routes through the live
46
+ * EventLog when the run is still active (same counter, same onEmit sink), and
47
+ * falls back to file-tail stamping for terminal runs. Through a live writer it
48
+ * is best-effort and leaves the run's failures to the run (#704): it never
49
+ * consumes a failure held for the run's own lines, and a failure of its own
50
+ * line at landing is dropped, as the audit's catch-all drops a thrown one. A
51
+ * caller that must hear its line land uses `appendRunEventLanded`. A terminal
52
+ * type is the run's own and is emitted as such.
53
+ */
54
+ export function appendRunEvent(path, runId, taskId, type, payload = {}) {
55
+ const live = liveEventLog(path);
56
+ if (!live)
57
+ return appendAfterTail(path, runId, taskId, type, payload);
58
+ return terminalTypeOf(type)
59
+ ? live.emit(type, payload)
60
+ : live.emitAside(type, payload, unheard);
61
+ }
62
+ /**
63
+ * `emit` for a best-effort line of a run's own (evidence or a diagnostic the run
64
+ * must not fail over), made aside: it leaves a failure held for the run's other
65
+ * lines to them, and a failure of its own line at landing is dropped, as the
66
+ * caller's catch-all drops a thrown one (#704). A refusal at the call (a payload
67
+ * the schema rejects, a committed terminal) still throws, for that catch-all.
68
+ */
69
+ export function emitBestEffort(log, type, payload) {
70
+ return log.emitAside(type, payload, unheard);
71
+ }
72
+ /** `appendRunEvent`, settled once the line has landed and the live writer's
73
+ * `onPersist` accepted it (its failure rejects this await alone). It neither
74
+ * consumes nor leaves a failure for the run's own lines (#704). */
75
+ export async function appendRunEventLanded(path, runId, taskId, type, payload = {}) {
76
+ const live = liveEventLog(path);
77
+ return live
78
+ ? new Promise((landed, refused) => live.emitAside(type, payload, { resolve: landed, reject: refused }))
79
+ : appendAfterTail(path, runId, taskId, type, payload);
80
+ }
81
+ function appendAfterTail(path, runId, taskId, type, payload) {
82
+ if (terminalTypeOf(type) && terminalEventInFile(path)) {
83
+ throw new Error("run terminal event is already committed");
84
+ }
85
+ const event = RunEventSchema.parse({
86
+ seq: lastSeqInFile(path) + 1,
87
+ ts: nowIso(),
88
+ run_id: runId,
89
+ task_id: taskId,
90
+ type,
91
+ payload: payload,
92
+ });
93
+ appendLine(path, JSON.stringify(event));
94
+ return event;
95
+ }
96
+ /**
97
+ * A registered live writer's authoritative in-memory cursor, or null when no
98
+ * live writer owns this path. This never reads files or initiates recovery;
99
+ * a poisoned writer keeps its conservative counter until recovery releases it.
100
+ */
101
+ export function liveRunEventSeq(path) {
102
+ return activeEventLogs.get(path)?.lastSeq() ?? null;
103
+ }
104
+ /**
105
+ * The run's highest event `seq` for snapshot fencing. A live writer answers from
106
+ * its in-memory counter (the one seq owner; its file holds exactly the events up
107
+ * to that seq); any other log answers from its file through `lastSeqInFile`.
108
+ */
109
+ export function lastRunEventSeq(path) {
110
+ return liveEventLog(path)?.lastSeq() ?? lastSeqInFile(path);
111
+ }
112
+ //# sourceMappingURL=live-writers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-writers.js","sourceRoot":"","sources":["../src/live-writers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { RunEvent, RunEventType, RunTelemetry } 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
+ /** Prepared in memory by the receipt owner; a SQL terminal sink writes it. */
7
+ telemetry?: RunTelemetry | null;
8
+ /**
9
+ * Publish the prepared receipt's canonical commit marker after the durable
10
+ * journal accepts the terminal, but before file-tail/live observers can see
11
+ * the per-run terminal event.
12
+ */
13
+ commit?: () => void;
14
+ /**
15
+ * Undo preparation/commit side effects when no durable journal authority was
16
+ * established. The callback must be idempotent.
17
+ */
18
+ rollback?: () => void;
19
+ }
20
+ /** A synchronous replacement for terminal persistence and file finalization.
21
+ * A throw means no authority committed; pending means it committed and repair
22
+ * remains owed. The event log never repeats the sink's file writes. */
23
+ export type TerminalPersistenceHook = (event: RunEvent, telemetry: RunTelemetry | null) => {
24
+ state: "materialized";
25
+ } | {
26
+ state: "pending";
27
+ error: unknown;
28
+ };
29
+ /** Writes a prepared terminal's durable bytes off the request thread before
30
+ * its synchronous commit, which then adopts them; anything not staged the
31
+ * commit writes itself. */
32
+ export type TerminalStagingHook = (event: RunEvent, telemetry: RunTelemetry | null) => Promise<void>;
33
+ export interface EventLogOptions {
34
+ /**
35
+ * Queue each line on the ordered appender instead of writing it inline: `emit`
36
+ * returns once the line is queued, and the line's `onPersist` and `onPublish`
37
+ * run when it lands. The terminal commits through `emitTerminal`.
38
+ */
39
+ queued?: boolean;
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAI9E,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,8EAA8E;IAC9E,SAAS,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAChC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;uEAEuE;AACvE,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,YAAY,GAAG,IAAI,KAC3B;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE;;2BAE2B;AAC3B,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,YAAY,GAAG,IAAI,KAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@claudexor/event-log",
3
- "version": "6.0.0",
3
+ "version": "6.1.2",
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/util": "6.0.0",
20
- "@claudexor/schema": "6.0.0"
19
+ "@claudexor/util": "6.1.2",
20
+ "@claudexor/schema": "6.1.2"
21
21
  },
22
22
  "repository": {
23
23
  "type": "git",