@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.
- package/dist/event-file.d.ts +16 -2
- package/dist/event-file.d.ts.map +1 -1
- package/dist/event-file.js +26 -6
- package/dist/event-file.js.map +1 -1
- package/dist/index.d.ts +83 -71
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +219 -100
- package/dist/index.js.map +1 -1
- package/dist/live-writers.d.ts +66 -0
- package/dist/live-writers.d.ts.map +1 -0
- package/dist/live-writers.js +112 -0
- package/dist/live-writers.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +3 -3
package/dist/event-file.d.ts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import type { RunEvent } from "@claudexor/schema";
|
|
2
|
-
|
|
3
|
-
|
|
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
|
};
|
package/dist/event-file.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/event-file.js
CHANGED
|
@@ -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
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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;
|
package/dist/event-file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-file.js","sourceRoot":"","sources":["../src/event-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"event-file.js","sourceRoot":"","sources":["../src/event-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAY/C,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxE,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,IAAI,CAAC,CAAC;YACf,QAAQ,GAAG,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAmB,EACnB,QAA6B;IAE7B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACrF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM;YAAE,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACxF,OAAO;QACL,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClF,SAAS,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,mBAAmB,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAC1C,IAAI,GAAG,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxD,SAAS,CAAC;YACR,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,gEAAgE;YAChE,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9D,IAAI,IAAI;gBAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,CAAC,CAAC;YAC1B,GAAG,GAAG,OAAO,CAAC;QAChB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC,GAAG,CAAC;QACxD,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,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,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,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,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,IACE,KAAK,CAAC,IAAI,KAAK,eAAe;gBAC9B,KAAK,CAAC,IAAI,KAAK,YAAY;gBAC3B,KAAK,CAAC,IAAI,KAAK,aAAa,EAC5B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,37 +1,14 @@
|
|
|
1
|
-
import type { RunEvent, RunEventType
|
|
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
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
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,
|
|
93
|
-
*
|
|
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
|
|
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
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
*
|
|
131
|
-
* `
|
|
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
|
|
141
|
-
*
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
|
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
|
|
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.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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,
|
|
69
|
-
*
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
143
|
-
* prepared synchronously (canonical type,
|
|
144
|
-
* staging hook writes its bytes off the
|
|
145
|
-
* synchronous commit adopts them. While
|
|
146
|
-
* refused as in progress and an ordinary
|
|
147
|
-
* receipt) appends before the terminal,
|
|
148
|
-
* keeps the time its verdict was prepared.
|
|
149
|
-
* writes to the commit.
|
|
150
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
160
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
//
|
|
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
|
|
209
|
-
*
|
|
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
|
|
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
|
|
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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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.
|
|
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.
|
|
20
|
-
"@claudexor/schema": "6.
|
|
19
|
+
"@claudexor/util": "6.1.2",
|
|
20
|
+
"@claudexor/schema": "6.1.2"
|
|
21
21
|
},
|
|
22
22
|
"repository": {
|
|
23
23
|
"type": "git",
|