cueline 0.1.2 → 0.1.4
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/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +3 -3
- package/CHANGELOG.md +38 -0
- package/README.ja.md +65 -21
- package/README.ko.md +65 -21
- package/README.md +70 -23
- package/README.zh-CN.md +65 -21
- package/README.zh-TW.md +68 -22
- package/dist/src/api-contracts.d.ts +77 -0
- package/dist/src/api-contracts.js +2 -0
- package/dist/src/api-contracts.js.map +1 -0
- package/dist/src/api-controller-handoff.d.ts +6 -0
- package/dist/src/api-controller-handoff.js +253 -0
- package/dist/src/api-controller-handoff.js.map +1 -0
- package/dist/src/api-runtime-lifecycle.d.ts +22 -0
- package/dist/src/api-runtime-lifecycle.js +568 -0
- package/dist/src/api-runtime-lifecycle.js.map +1 -0
- package/dist/src/api.d.ts +9 -27
- package/dist/src/api.js +138 -42
- package/dist/src/api.js.map +1 -1
- package/dist/src/browser/browser-adapter.d.ts +11 -1
- package/dist/src/browser/codex-iab/bootstrap.d.ts +16 -0
- package/dist/src/browser/codex-iab/bootstrap.js +49 -0
- package/dist/src/browser/codex-iab/bootstrap.js.map +1 -1
- package/dist/src/browser/codex-iab/chatgpt-client.js +346 -120
- package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -1
- package/dist/src/browser/codex-iab/recovery-evidence.d.ts +6 -0
- package/dist/src/browser/codex-iab/recovery-evidence.js +37 -0
- package/dist/src/browser/codex-iab/recovery-evidence.js.map +1 -0
- package/dist/src/browser/codex-iab/submission-url.d.ts +2 -0
- package/dist/src/browser/codex-iab/submission-url.js +53 -0
- package/dist/src/browser/codex-iab/submission-url.js.map +1 -0
- package/dist/src/cli/main.js +305 -20
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/core/controller-abort.d.ts +1 -0
- package/dist/src/core/controller-abort.js +11 -0
- package/dist/src/core/controller-abort.js.map +1 -0
- package/dist/src/core/controller-command-execution.d.ts +9 -0
- package/dist/src/core/controller-command-execution.js +299 -0
- package/dist/src/core/controller-command-execution.js.map +1 -0
- package/dist/src/core/controller-loop.d.ts +3 -37
- package/dist/src/core/controller-loop.js +386 -291
- package/dist/src/core/controller-loop.js.map +1 -1
- package/dist/src/core/controller-turn.d.ts +16 -0
- package/dist/src/core/controller-turn.js +309 -0
- package/dist/src/core/controller-turn.js.map +1 -0
- package/dist/src/core/controller-types.d.ts +58 -0
- package/dist/src/core/controller-types.js +2 -0
- package/dist/src/core/controller-types.js.map +1 -0
- package/dist/src/core/persisted-run.d.ts +4 -0
- package/dist/src/core/persisted-run.js +19 -0
- package/dist/src/core/persisted-run.js.map +1 -0
- package/dist/src/core/process-liveness.d.ts +2 -0
- package/dist/src/core/process-liveness.js +44 -0
- package/dist/src/core/process-liveness.js.map +1 -0
- package/dist/src/core/run-status.d.ts +53 -0
- package/dist/src/core/run-status.js +224 -0
- package/dist/src/core/run-status.js.map +1 -0
- package/dist/src/core/state-machine.d.ts +17 -4
- package/dist/src/core/state-machine.js +170 -16
- package/dist/src/core/state-machine.js.map +1 -1
- package/dist/src/jobs/status.d.ts +7 -1
- package/dist/src/jobs/status.js.map +1 -1
- package/dist/src/jobs/supervisor.d.ts +2 -0
- package/dist/src/jobs/supervisor.js +47 -13
- package/dist/src/jobs/supervisor.js.map +1 -1
- package/dist/src/protocol/types.d.ts +1 -1
- package/dist/src/protocol/validate-command.js +18 -0
- package/dist/src/protocol/validate-command.js.map +1 -1
- package/dist/src/router/resolver.d.ts +2 -1
- package/dist/src/router/resolver.js +31 -13
- package/dist/src/router/resolver.js.map +1 -1
- package/dist/src/runners/process-runner.d.ts +2 -2
- package/dist/src/runners/process-runner.js +113 -9
- package/dist/src/runners/process-runner.js.map +1 -1
- package/dist/src/runners/runner-adapter.d.ts +9 -2
- package/dist/src/runners/runner-adapter.js.map +1 -1
- package/dist/src/state/atomic-write.js +17 -2
- package/dist/src/state/atomic-write.js.map +1 -1
- package/dist/src/state/cancellation.d.ts +42 -0
- package/dist/src/state/cancellation.js +168 -0
- package/dist/src/state/cancellation.js.map +1 -0
- package/dist/src/state/event-log.d.ts +17 -1
- package/dist/src/state/event-log.js +328 -18
- package/dist/src/state/event-log.js.map +1 -1
- package/dist/src/state/paths.d.ts +4 -0
- package/dist/src/state/paths.js +4 -0
- package/dist/src/state/paths.js.map +1 -1
- package/dist/src/state/runtime-lease.d.ts +53 -0
- package/dist/src/state/runtime-lease.js +727 -0
- package/dist/src/state/runtime-lease.js.map +1 -0
- package/dist/src/state/runtime-retirement.d.ts +16 -0
- package/dist/src/state/runtime-retirement.js +95 -0
- package/dist/src/state/runtime-retirement.js.map +1 -0
- package/dist/src/state/runtime-takeover-intent.d.ts +1 -0
- package/dist/src/state/runtime-takeover-intent.js +18 -0
- package/dist/src/state/runtime-takeover-intent.js.map +1 -0
- package/dist/src/state/store.d.ts +12 -1
- package/dist/src/state/store.js +246 -40
- package/dist/src/state/store.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/docs/architecture.md +16 -11
- package/docs/assets/cueline-loop-en.svg +11 -10
- package/docs/assets/cueline-loop-ja.svg +11 -10
- package/docs/assets/cueline-loop-ko.svg +11 -10
- package/docs/assets/cueline-loop-zh-CN.svg +11 -10
- package/docs/assets/cueline-loop-zh-TW.svg +11 -10
- package/docs/compatibility.md +16 -8
- package/docs/controller-protocol.md +8 -4
- package/docs/runner-contract.md +26 -6
- package/docs/state-and-recovery.md +69 -16
- package/package.json +4 -3
- package/schemas/controller-observation.schema.json +1 -1
- package/scripts/validate-plugin.mjs +66 -0
- package/skills/cueline/SKILL.md +89 -13
|
@@ -1,6 +1,78 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { link, mkdir, open, readFile, readdir, stat, unlink } from "node:fs/promises";
|
|
2
3
|
import path from "node:path";
|
|
4
|
+
import { CueLineError } from "../core/errors.js";
|
|
3
5
|
import { canonicalJson } from "../core/ids.js";
|
|
6
|
+
const EVENT_SEGMENT_WIDTH = 16;
|
|
7
|
+
const EVENT_SEGMENT_PATTERN = new RegExp(`^\\d{${EVENT_SEGMENT_WIDTH}}\\.json$`);
|
|
8
|
+
const EVENT_SEGMENT_FENCE_NAME = "legacy-fence.json";
|
|
9
|
+
const EVENT_SEGMENT_FENCE_PROTOCOL = "cueline/event-segment-fence/0.1";
|
|
10
|
+
function isAlreadyExists(error) {
|
|
11
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "EEXIST";
|
|
12
|
+
}
|
|
13
|
+
function eventSegmentDirectory(file) {
|
|
14
|
+
return `${file}.segments`;
|
|
15
|
+
}
|
|
16
|
+
function eventSegmentName(sequence) {
|
|
17
|
+
return `${String(sequence).padStart(EVENT_SEGMENT_WIDTH, "0")}.json`;
|
|
18
|
+
}
|
|
19
|
+
function eventSegmentFencePath(directory) {
|
|
20
|
+
return path.join(directory, EVENT_SEGMENT_FENCE_NAME);
|
|
21
|
+
}
|
|
22
|
+
function sha256(contents) {
|
|
23
|
+
return createHash("sha256").update(contents).digest("hex");
|
|
24
|
+
}
|
|
25
|
+
async function syncDirectory(directory) {
|
|
26
|
+
const handle = await open(directory, "r");
|
|
27
|
+
try {
|
|
28
|
+
await handle.sync();
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await handle.close();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function ensureSegmentDirectory(file) {
|
|
35
|
+
const directory = eventSegmentDirectory(file);
|
|
36
|
+
const parent = path.dirname(directory);
|
|
37
|
+
const createdParent = await mkdir(parent, { recursive: true });
|
|
38
|
+
if (createdParent !== undefined) {
|
|
39
|
+
await syncDirectory(path.dirname(createdParent));
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await mkdir(directory, { mode: 0o700 });
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (!isAlreadyExists(error))
|
|
46
|
+
throw error;
|
|
47
|
+
if (!(await stat(directory)).isDirectory())
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
// Persist the directory entry before relying on files within it. This is
|
|
51
|
+
// intentionally unconditional: a concurrent writer can observe EEXIST
|
|
52
|
+
// before the creator has finished syncing the parent.
|
|
53
|
+
await syncDirectory(parent);
|
|
54
|
+
return directory;
|
|
55
|
+
}
|
|
56
|
+
async function writeExclusiveDurableFile(directory, target, contents) {
|
|
57
|
+
const temporary = path.join(directory, `.creating-${randomUUID()}.tmp`);
|
|
58
|
+
let handle;
|
|
59
|
+
try {
|
|
60
|
+
handle = await open(temporary, "wx", 0o600);
|
|
61
|
+
await handle.writeFile(contents, "utf8");
|
|
62
|
+
await handle.sync();
|
|
63
|
+
await handle.close();
|
|
64
|
+
handle = undefined;
|
|
65
|
+
await link(temporary, target);
|
|
66
|
+
await unlink(temporary).catch(() => undefined);
|
|
67
|
+
// The file contents alone are insufficient: the hard-link directory entry
|
|
68
|
+
// must also survive a crash before appendEvent reports success.
|
|
69
|
+
await syncDirectory(directory);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await handle?.close().catch(() => undefined);
|
|
73
|
+
await unlink(temporary).catch(() => undefined);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
4
76
|
function validateEvent(value, expectedSequence) {
|
|
5
77
|
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
6
78
|
throw new Error(`EVENT_LOG_INVALID: event ${expectedSequence} is not an object`);
|
|
@@ -12,45 +84,283 @@ function validateEvent(value, expectedSequence) {
|
|
|
12
84
|
record.type === "") {
|
|
13
85
|
throw new Error(`EVENT_LOG_INVALID: malformed event ${expectedSequence}`);
|
|
14
86
|
}
|
|
87
|
+
if (record.runtime_owner_id !== undefined &&
|
|
88
|
+
(typeof record.runtime_owner_id !== "string" || record.runtime_owner_id.trim() === "")) {
|
|
89
|
+
throw new Error(`EVENT_LOG_INVALID: malformed runtime owner for event ${expectedSequence}`);
|
|
90
|
+
}
|
|
15
91
|
return {
|
|
16
92
|
sequence: expectedSequence,
|
|
17
93
|
timestamp: record.timestamp,
|
|
18
94
|
type: record.type,
|
|
19
95
|
payload: record.payload,
|
|
96
|
+
...(record.runtime_owner_id === undefined
|
|
97
|
+
? {}
|
|
98
|
+
: { runtime_owner_id: record.runtime_owner_id }),
|
|
20
99
|
};
|
|
21
100
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
101
|
+
function parseEventLines(contents, expectedCount) {
|
|
102
|
+
const lines = contents.split("\n").filter((line) => line.trim() !== "");
|
|
103
|
+
if (expectedCount !== undefined && lines.length !== expectedCount) {
|
|
104
|
+
throw new Error(`EVENT_LOG_INVALID: expected ${expectedCount} fenced legacy events, found ${lines.length}`);
|
|
105
|
+
}
|
|
106
|
+
return lines.map((line, index) => {
|
|
107
|
+
let parsed;
|
|
108
|
+
try {
|
|
109
|
+
parsed = JSON.parse(line);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
throw new Error(`EVENT_LOG_INVALID: invalid JSON at line ${index + 1}`, { cause: error });
|
|
113
|
+
}
|
|
114
|
+
return validateEvent(parsed, index + 1);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function legacyPrefix(contents, eventCount) {
|
|
118
|
+
if (eventCount === 0)
|
|
119
|
+
return Buffer.alloc(0);
|
|
120
|
+
let newlineCount = 0;
|
|
121
|
+
for (let index = 0; index < contents.length; index += 1) {
|
|
122
|
+
if (contents[index] !== 0x0a)
|
|
123
|
+
continue;
|
|
124
|
+
newlineCount += 1;
|
|
125
|
+
if (newlineCount === eventCount)
|
|
126
|
+
return contents.subarray(0, index + 1);
|
|
127
|
+
}
|
|
128
|
+
throw new Error(`EVENT_LOG_INVALID: legacy log contains fewer than ${eventCount} complete events`);
|
|
129
|
+
}
|
|
130
|
+
async function readLegacyBytes(file) {
|
|
131
|
+
return readFile(file).catch((error) => {
|
|
132
|
+
if (typeof error === "object" &&
|
|
133
|
+
error !== null &&
|
|
134
|
+
"code" in error &&
|
|
135
|
+
error.code === "ENOENT") {
|
|
136
|
+
return Buffer.alloc(0);
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function parseFence(value) {
|
|
142
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
143
|
+
throw new Error("EVENT_LOG_INVALID: segment fence is not an object");
|
|
144
|
+
}
|
|
145
|
+
const record = value;
|
|
146
|
+
if (record.protocol !== EVENT_SEGMENT_FENCE_PROTOCOL ||
|
|
147
|
+
!Number.isSafeInteger(record.legacy_event_count) ||
|
|
148
|
+
record.legacy_event_count < 0 ||
|
|
149
|
+
!Number.isSafeInteger(record.legacy_byte_length) ||
|
|
150
|
+
record.legacy_byte_length < 0 ||
|
|
151
|
+
typeof record.legacy_sha256 !== "string" ||
|
|
152
|
+
!/^[a-f0-9]{64}$/.test(record.legacy_sha256)) {
|
|
153
|
+
throw new Error("EVENT_LOG_INVALID: malformed segment fence");
|
|
154
|
+
}
|
|
155
|
+
return record;
|
|
156
|
+
}
|
|
157
|
+
async function readEventSegmentFence(directory) {
|
|
25
158
|
try {
|
|
26
|
-
|
|
27
|
-
await handle.sync();
|
|
159
|
+
return parseFence(JSON.parse(await readFile(eventSegmentFencePath(directory), "utf8")));
|
|
28
160
|
}
|
|
29
|
-
|
|
30
|
-
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (typeof error === "object" &&
|
|
163
|
+
error !== null &&
|
|
164
|
+
"code" in error &&
|
|
165
|
+
error.code === "ENOENT") {
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
if (error instanceof SyntaxError) {
|
|
169
|
+
throw new Error("EVENT_LOG_INVALID: invalid segment fence JSON", { cause: error });
|
|
170
|
+
}
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async function eventSegmentNames(directory) {
|
|
175
|
+
return (await readdir(directory))
|
|
176
|
+
.filter((name) => EVENT_SEGMENT_PATTERN.test(name))
|
|
177
|
+
.sort();
|
|
178
|
+
}
|
|
179
|
+
async function captureLegacyFence(file, directory) {
|
|
180
|
+
const existing = await readEventSegmentFence(directory);
|
|
181
|
+
if (existing !== undefined) {
|
|
182
|
+
// The fence is the durable commit point even if a crash happened before
|
|
183
|
+
// the first segment hard-link was installed. Never widen that prefix from
|
|
184
|
+
// a later append by a still-loaded legacy JSONL writer.
|
|
185
|
+
await readFencedLegacyEvents(file, existing);
|
|
186
|
+
return existing;
|
|
187
|
+
}
|
|
188
|
+
const names = await eventSegmentNames(directory);
|
|
189
|
+
const legacyContents = await readLegacyBytes(file);
|
|
190
|
+
let prefix;
|
|
191
|
+
let eventCount;
|
|
192
|
+
if (names.length > 0) {
|
|
193
|
+
const firstSegmentSequence = Number(names[0].slice(0, EVENT_SEGMENT_WIDTH));
|
|
194
|
+
eventCount = firstSegmentSequence - 1;
|
|
195
|
+
prefix = legacyPrefix(legacyContents, eventCount);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
if (legacyContents.length > 0 && legacyContents.at(-1) !== 0x0a) {
|
|
199
|
+
throw new Error("EVENT_LOG_INVALID: legacy event log is not at a complete-event boundary");
|
|
200
|
+
}
|
|
201
|
+
const events = parseEventLines(legacyContents.toString("utf8"));
|
|
202
|
+
eventCount = events.length;
|
|
203
|
+
prefix = legacyContents;
|
|
204
|
+
}
|
|
205
|
+
parseEventLines(prefix.toString("utf8"), eventCount);
|
|
206
|
+
return {
|
|
207
|
+
protocol: EVENT_SEGMENT_FENCE_PROTOCOL,
|
|
208
|
+
legacy_event_count: eventCount,
|
|
209
|
+
legacy_byte_length: prefix.length,
|
|
210
|
+
legacy_sha256: sha256(prefix),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
async function ensureEventSegmentFence(file, directory) {
|
|
214
|
+
const existing = await readEventSegmentFence(directory);
|
|
215
|
+
if (existing)
|
|
216
|
+
return existing;
|
|
217
|
+
const candidate = (await readCommittedRuntimeLegacyFence(file)) ??
|
|
218
|
+
(await captureLegacyFence(file, directory));
|
|
219
|
+
try {
|
|
220
|
+
await writeExclusiveDurableFile(directory, eventSegmentFencePath(directory), `${canonicalJson(candidate)}\n`);
|
|
221
|
+
return candidate;
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
if (!isAlreadyExists(error))
|
|
225
|
+
throw error;
|
|
226
|
+
const winner = await readEventSegmentFence(directory);
|
|
227
|
+
if (!winner)
|
|
228
|
+
throw error;
|
|
229
|
+
return winner;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async function readFencedLegacyEvents(file, fence) {
|
|
233
|
+
const contents = await readLegacyBytes(file);
|
|
234
|
+
if (contents.length < fence.legacy_byte_length) {
|
|
235
|
+
throw new Error("EVENT_LOG_INVALID: fenced legacy prefix was truncated");
|
|
236
|
+
}
|
|
237
|
+
const prefix = contents.subarray(0, fence.legacy_byte_length);
|
|
238
|
+
if (sha256(prefix) !== fence.legacy_sha256) {
|
|
239
|
+
throw new Error("EVENT_LOG_INVALID: fenced legacy prefix hash mismatch");
|
|
240
|
+
}
|
|
241
|
+
return parseEventLines(prefix.toString("utf8"), fence.legacy_event_count);
|
|
242
|
+
}
|
|
243
|
+
function sameLegacyFence(left, right) {
|
|
244
|
+
return (left.protocol === right.protocol &&
|
|
245
|
+
left.legacy_event_count === right.legacy_event_count &&
|
|
246
|
+
left.legacy_byte_length === right.legacy_byte_length &&
|
|
247
|
+
left.legacy_sha256 === right.legacy_sha256);
|
|
248
|
+
}
|
|
249
|
+
async function readCommittedRuntimeLegacyFence(file) {
|
|
250
|
+
const target = path.join(path.dirname(file), "runtime.json.fence");
|
|
251
|
+
let parsed;
|
|
252
|
+
try {
|
|
253
|
+
parsed = JSON.parse(await readFile(target, "utf8"));
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
if (typeof error === "object" &&
|
|
257
|
+
error !== null &&
|
|
258
|
+
"code" in error &&
|
|
259
|
+
error.code === "ENOENT") {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
if (error instanceof SyntaxError) {
|
|
263
|
+
throw new Error("EVENT_LOG_INVALID: invalid runtime fence JSON", { cause: error });
|
|
264
|
+
}
|
|
265
|
+
throw error;
|
|
31
266
|
}
|
|
267
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
268
|
+
throw new Error("EVENT_LOG_INVALID: malformed runtime fence");
|
|
269
|
+
}
|
|
270
|
+
const record = parsed;
|
|
271
|
+
if (record.protocol !== "cueline/runtime-fence/0.1")
|
|
272
|
+
return undefined;
|
|
273
|
+
// A legacy pointer deliberately keeps the live JSONL writer authoritative.
|
|
274
|
+
if (record.lease_source === "legacy")
|
|
275
|
+
return undefined;
|
|
276
|
+
return record.legacy_event_fence === undefined
|
|
277
|
+
? undefined
|
|
278
|
+
: parseFence(record.legacy_event_fence);
|
|
279
|
+
}
|
|
280
|
+
/** Captures a complete legacy prefix without publishing it as authoritative. */
|
|
281
|
+
export async function captureEventLegacyFence(file) {
|
|
282
|
+
const directory = await ensureSegmentDirectory(file);
|
|
283
|
+
return captureLegacyFence(file, directory);
|
|
32
284
|
}
|
|
33
|
-
export async function
|
|
34
|
-
|
|
285
|
+
export async function appendEvent(file, event) {
|
|
286
|
+
if (!Number.isSafeInteger(event.sequence) || event.sequence < 1) {
|
|
287
|
+
throw new Error("EVENT_SEQUENCE_INVALID");
|
|
288
|
+
}
|
|
289
|
+
validateEvent(event, event.sequence);
|
|
290
|
+
const directory = await ensureSegmentDirectory(file);
|
|
291
|
+
const fence = await ensureEventSegmentFence(file, directory);
|
|
292
|
+
if (event.sequence <= fence.legacy_event_count) {
|
|
293
|
+
throw new CueLineError("EVENT_SEQUENCE_CONFLICT", `CueLine event sequence ${event.sequence} belongs to the fenced legacy prefix.`);
|
|
294
|
+
}
|
|
295
|
+
const target = path.join(directory, eventSegmentName(event.sequence));
|
|
35
296
|
try {
|
|
36
|
-
|
|
297
|
+
await writeExclusiveDurableFile(directory, target, `${canonicalJson(event)}\n`);
|
|
37
298
|
}
|
|
38
299
|
catch (error) {
|
|
39
|
-
if (error
|
|
300
|
+
if (isAlreadyExists(error)) {
|
|
301
|
+
throw new CueLineError("EVENT_SEQUENCE_CONFLICT", `CueLine event sequence ${event.sequence} was claimed by another writer.`, { cause: error });
|
|
302
|
+
}
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
export async function createEventLog(file, event) {
|
|
307
|
+
validateEvent(event, event.sequence);
|
|
308
|
+
const directory = path.dirname(file);
|
|
309
|
+
const created = await mkdir(directory, { recursive: true });
|
|
310
|
+
if (created !== undefined) {
|
|
311
|
+
await syncDirectory(path.dirname(created));
|
|
312
|
+
}
|
|
313
|
+
await writeExclusiveDurableFile(directory, file, `${canonicalJson(event)}\n`);
|
|
314
|
+
}
|
|
315
|
+
export async function readEvents(file, options = {}) {
|
|
316
|
+
const directory = eventSegmentDirectory(file);
|
|
317
|
+
const segmentNames = await readdir(directory).catch((error) => {
|
|
318
|
+
if (typeof error === "object" &&
|
|
319
|
+
error !== null &&
|
|
320
|
+
"code" in error &&
|
|
321
|
+
error.code === "ENOENT") {
|
|
40
322
|
return [];
|
|
41
323
|
}
|
|
42
324
|
throw error;
|
|
325
|
+
});
|
|
326
|
+
const segments = segmentNames
|
|
327
|
+
.filter((name) => EVENT_SEGMENT_PATTERN.test(name))
|
|
328
|
+
.sort();
|
|
329
|
+
const segmentFence = await readEventSegmentFence(directory);
|
|
330
|
+
const committedFence = options.legacyFence ?? (await readCommittedRuntimeLegacyFence(file));
|
|
331
|
+
if (segmentFence !== undefined &&
|
|
332
|
+
committedFence !== undefined &&
|
|
333
|
+
!sameLegacyFence(segmentFence, committedFence)) {
|
|
334
|
+
throw new Error("EVENT_LOG_INVALID: runtime and segment legacy fences disagree");
|
|
43
335
|
}
|
|
44
|
-
const
|
|
45
|
-
|
|
336
|
+
const fence = committedFence ?? segmentFence;
|
|
337
|
+
let events;
|
|
338
|
+
if (fence) {
|
|
339
|
+
events = await readFencedLegacyEvents(file, fence);
|
|
340
|
+
}
|
|
341
|
+
else if (segments.length > 0) {
|
|
342
|
+
// Compatibility for runs written by an unreleased segmented build before
|
|
343
|
+
// the durable fence existed. The first segment itself defines the frozen
|
|
344
|
+
// legacy prefix; a later append will persist the explicit fence.
|
|
345
|
+
const legacyCount = Number(segments[0].slice(0, EVENT_SEGMENT_WIDTH)) - 1;
|
|
346
|
+
const prefix = legacyPrefix(await readLegacyBytes(file), legacyCount);
|
|
347
|
+
events = parseEventLines(prefix.toString("utf8"), legacyCount);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
events = parseEventLines((await readLegacyBytes(file)).toString("utf8"));
|
|
351
|
+
}
|
|
352
|
+
for (const name of segments) {
|
|
353
|
+
const sequence = Number(name.slice(0, EVENT_SEGMENT_WIDTH));
|
|
46
354
|
let parsed;
|
|
47
355
|
try {
|
|
48
|
-
parsed = JSON.parse(
|
|
356
|
+
parsed = JSON.parse(await readFile(path.join(directory, name), "utf8"));
|
|
49
357
|
}
|
|
50
358
|
catch (error) {
|
|
51
|
-
throw new Error(`EVENT_LOG_INVALID: invalid
|
|
359
|
+
throw new Error(`EVENT_LOG_INVALID: invalid event segment '${name}'`, { cause: error });
|
|
52
360
|
}
|
|
53
|
-
|
|
54
|
-
}
|
|
361
|
+
events.push(validateEvent(parsed, sequence));
|
|
362
|
+
}
|
|
363
|
+
events.sort((left, right) => left.sequence - right.sequence);
|
|
364
|
+
return events.map((event, index) => validateEvent(event, index + 1));
|
|
55
365
|
}
|
|
56
366
|
//# sourceMappingURL=event-log.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../../src/state/event-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAS/C,SAAS,aAAa,CAAC,KAAc,EAAE,gBAAwB;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,4BAA4B,gBAAgB,mBAAmB,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IACE,MAAM,CAAC,QAAQ,KAAK,gBAAgB;QACpC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAC/B,MAAM,CAAC,IAAI,KAAK,EAAE,EAClB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,gBAAgB;QAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,KAAe;IAC7D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../../src/state/event-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,11 @@ export interface RunPaths {
|
|
|
2
2
|
home: string;
|
|
3
3
|
runsDir: string;
|
|
4
4
|
runDir: string;
|
|
5
|
+
creationMarker: string;
|
|
5
6
|
events: string;
|
|
7
|
+
runtimeLease: string;
|
|
8
|
+
runCancellation: string;
|
|
9
|
+
jobCancellationsDir: string;
|
|
6
10
|
snapshot: string;
|
|
7
11
|
}
|
|
8
12
|
export declare function defaultCueLineHome(environment?: NodeJS.ProcessEnv): string;
|
package/dist/src/state/paths.js
CHANGED
|
@@ -30,7 +30,11 @@ export function runPaths(home, runId) {
|
|
|
30
30
|
home: resolvedHome,
|
|
31
31
|
runsDir,
|
|
32
32
|
runDir,
|
|
33
|
+
creationMarker: path.join(runDir, "created"),
|
|
33
34
|
events: path.join(runDir, "events.jsonl"),
|
|
35
|
+
runtimeLease: path.join(runDir, "runtime.json"),
|
|
36
|
+
runCancellation: path.join(runDir, "cancel.json"),
|
|
37
|
+
jobCancellationsDir: path.join(runDir, "job-cancellations"),
|
|
34
38
|
snapshot: path.join(runDir, "snapshot.json"),
|
|
35
39
|
};
|
|
36
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/state/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,cAAc,GAAG,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/state/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAc5D,MAAM,UAAU,kBAAkB,CAAC,WAAW,GAAsB,kBAAkB,EAAE;IACtF,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IAC/C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,GAAG,CAAC,CAAC;IAChD,CAAC;IACD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,OAAO;QACP,MAAM;QACN,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;QAC5C,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;QACzC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;QAC/C,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;QACjD,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC;QAC3D,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export type RuntimeOwnership = "active" | "stale" | "released" | "missing" | "invalid";
|
|
2
|
+
export interface RuntimeLeaseObservation {
|
|
3
|
+
ownership: RuntimeOwnership;
|
|
4
|
+
heartbeatAt?: string;
|
|
5
|
+
ageMs?: number;
|
|
6
|
+
ownerId?: string;
|
|
7
|
+
pid?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface RuntimeLeaseOptions {
|
|
10
|
+
home: string;
|
|
11
|
+
runId: string;
|
|
12
|
+
now?: () => Date;
|
|
13
|
+
heartbeatIntervalMs?: number;
|
|
14
|
+
staleAfterMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface RuntimeLeaseTakeoverOptions extends RuntimeLeaseOptions {
|
|
17
|
+
expectedOwnerId: string;
|
|
18
|
+
expectedHeartbeatAt: string;
|
|
19
|
+
/** Test hook after durable operator intent, before lease replacement. */
|
|
20
|
+
beforeReplace?: () => Promise<void>;
|
|
21
|
+
/** Test/telemetry hook after the new epoch record is durable. */
|
|
22
|
+
afterReplace?: () => Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Serializes one authoritative state mutation with lease claim, heartbeat,
|
|
26
|
+
* release, and takeover. The event payload itself still uses immutable
|
|
27
|
+
* lock-free segments; this fence only closes the owner-change commit window.
|
|
28
|
+
*/
|
|
29
|
+
export declare function withRuntimeLeaseMutation<T>(home: string, runId: string, operation: () => Promise<T>): Promise<T>;
|
|
30
|
+
export declare function retireDeadRuntimeLease(home: string, runId: string, expectedOwnerId: string): Promise<boolean>;
|
|
31
|
+
export declare function readRuntimeOwnerRetirementCutoffs(home: string, runId: string): Promise<Map<string, number>>;
|
|
32
|
+
export declare function readRuntimeLease(home: string, runId: string, options?: {
|
|
33
|
+
now?: () => Date;
|
|
34
|
+
staleAfterMs?: number;
|
|
35
|
+
}): Promise<RuntimeLeaseObservation>;
|
|
36
|
+
export declare class RuntimeLease {
|
|
37
|
+
#private;
|
|
38
|
+
private constructor();
|
|
39
|
+
static claim(options: RuntimeLeaseOptions): Promise<RuntimeLease>;
|
|
40
|
+
/**
|
|
41
|
+
* Replaces one exact stale lease with a fresh owner in one mutation-lock
|
|
42
|
+
* transaction. There is no ownerless interval. A reclaimed mutation lock
|
|
43
|
+
* rotates the authoritative epoch first, so a paused previous writer can
|
|
44
|
+
* only modify its fenced-off epoch when it resumes.
|
|
45
|
+
*/
|
|
46
|
+
static takeoverStale(options: RuntimeLeaseTakeoverOptions): Promise<RuntimeLease>;
|
|
47
|
+
get signal(): AbortSignal;
|
|
48
|
+
get ownerId(): string;
|
|
49
|
+
private startHeartbeat;
|
|
50
|
+
private heartbeat;
|
|
51
|
+
assertHealthy(): void;
|
|
52
|
+
release(): Promise<void>;
|
|
53
|
+
}
|