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.
Files changed (116) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/.codex-plugin/plugin.json +3 -3
  3. package/CHANGELOG.md +38 -0
  4. package/README.ja.md +65 -21
  5. package/README.ko.md +65 -21
  6. package/README.md +70 -23
  7. package/README.zh-CN.md +65 -21
  8. package/README.zh-TW.md +68 -22
  9. package/dist/src/api-contracts.d.ts +77 -0
  10. package/dist/src/api-contracts.js +2 -0
  11. package/dist/src/api-contracts.js.map +1 -0
  12. package/dist/src/api-controller-handoff.d.ts +6 -0
  13. package/dist/src/api-controller-handoff.js +253 -0
  14. package/dist/src/api-controller-handoff.js.map +1 -0
  15. package/dist/src/api-runtime-lifecycle.d.ts +22 -0
  16. package/dist/src/api-runtime-lifecycle.js +568 -0
  17. package/dist/src/api-runtime-lifecycle.js.map +1 -0
  18. package/dist/src/api.d.ts +9 -27
  19. package/dist/src/api.js +138 -42
  20. package/dist/src/api.js.map +1 -1
  21. package/dist/src/browser/browser-adapter.d.ts +11 -1
  22. package/dist/src/browser/codex-iab/bootstrap.d.ts +16 -0
  23. package/dist/src/browser/codex-iab/bootstrap.js +49 -0
  24. package/dist/src/browser/codex-iab/bootstrap.js.map +1 -1
  25. package/dist/src/browser/codex-iab/chatgpt-client.js +346 -120
  26. package/dist/src/browser/codex-iab/chatgpt-client.js.map +1 -1
  27. package/dist/src/browser/codex-iab/recovery-evidence.d.ts +6 -0
  28. package/dist/src/browser/codex-iab/recovery-evidence.js +37 -0
  29. package/dist/src/browser/codex-iab/recovery-evidence.js.map +1 -0
  30. package/dist/src/browser/codex-iab/submission-url.d.ts +2 -0
  31. package/dist/src/browser/codex-iab/submission-url.js +53 -0
  32. package/dist/src/browser/codex-iab/submission-url.js.map +1 -0
  33. package/dist/src/cli/main.js +305 -20
  34. package/dist/src/cli/main.js.map +1 -1
  35. package/dist/src/core/controller-abort.d.ts +1 -0
  36. package/dist/src/core/controller-abort.js +11 -0
  37. package/dist/src/core/controller-abort.js.map +1 -0
  38. package/dist/src/core/controller-command-execution.d.ts +9 -0
  39. package/dist/src/core/controller-command-execution.js +299 -0
  40. package/dist/src/core/controller-command-execution.js.map +1 -0
  41. package/dist/src/core/controller-loop.d.ts +3 -37
  42. package/dist/src/core/controller-loop.js +386 -291
  43. package/dist/src/core/controller-loop.js.map +1 -1
  44. package/dist/src/core/controller-turn.d.ts +16 -0
  45. package/dist/src/core/controller-turn.js +309 -0
  46. package/dist/src/core/controller-turn.js.map +1 -0
  47. package/dist/src/core/controller-types.d.ts +58 -0
  48. package/dist/src/core/controller-types.js +2 -0
  49. package/dist/src/core/controller-types.js.map +1 -0
  50. package/dist/src/core/persisted-run.d.ts +4 -0
  51. package/dist/src/core/persisted-run.js +19 -0
  52. package/dist/src/core/persisted-run.js.map +1 -0
  53. package/dist/src/core/process-liveness.d.ts +2 -0
  54. package/dist/src/core/process-liveness.js +44 -0
  55. package/dist/src/core/process-liveness.js.map +1 -0
  56. package/dist/src/core/run-status.d.ts +53 -0
  57. package/dist/src/core/run-status.js +224 -0
  58. package/dist/src/core/run-status.js.map +1 -0
  59. package/dist/src/core/state-machine.d.ts +17 -4
  60. package/dist/src/core/state-machine.js +170 -16
  61. package/dist/src/core/state-machine.js.map +1 -1
  62. package/dist/src/jobs/status.d.ts +7 -1
  63. package/dist/src/jobs/status.js.map +1 -1
  64. package/dist/src/jobs/supervisor.d.ts +2 -0
  65. package/dist/src/jobs/supervisor.js +47 -13
  66. package/dist/src/jobs/supervisor.js.map +1 -1
  67. package/dist/src/protocol/types.d.ts +1 -1
  68. package/dist/src/protocol/validate-command.js +18 -0
  69. package/dist/src/protocol/validate-command.js.map +1 -1
  70. package/dist/src/router/resolver.d.ts +2 -1
  71. package/dist/src/router/resolver.js +31 -13
  72. package/dist/src/router/resolver.js.map +1 -1
  73. package/dist/src/runners/process-runner.d.ts +2 -2
  74. package/dist/src/runners/process-runner.js +113 -9
  75. package/dist/src/runners/process-runner.js.map +1 -1
  76. package/dist/src/runners/runner-adapter.d.ts +9 -2
  77. package/dist/src/runners/runner-adapter.js.map +1 -1
  78. package/dist/src/state/atomic-write.js +17 -2
  79. package/dist/src/state/atomic-write.js.map +1 -1
  80. package/dist/src/state/cancellation.d.ts +42 -0
  81. package/dist/src/state/cancellation.js +168 -0
  82. package/dist/src/state/cancellation.js.map +1 -0
  83. package/dist/src/state/event-log.d.ts +17 -1
  84. package/dist/src/state/event-log.js +328 -18
  85. package/dist/src/state/event-log.js.map +1 -1
  86. package/dist/src/state/paths.d.ts +4 -0
  87. package/dist/src/state/paths.js +4 -0
  88. package/dist/src/state/paths.js.map +1 -1
  89. package/dist/src/state/runtime-lease.d.ts +53 -0
  90. package/dist/src/state/runtime-lease.js +727 -0
  91. package/dist/src/state/runtime-lease.js.map +1 -0
  92. package/dist/src/state/runtime-retirement.d.ts +16 -0
  93. package/dist/src/state/runtime-retirement.js +95 -0
  94. package/dist/src/state/runtime-retirement.js.map +1 -0
  95. package/dist/src/state/runtime-takeover-intent.d.ts +1 -0
  96. package/dist/src/state/runtime-takeover-intent.js +18 -0
  97. package/dist/src/state/runtime-takeover-intent.js.map +1 -0
  98. package/dist/src/state/store.d.ts +12 -1
  99. package/dist/src/state/store.js +246 -40
  100. package/dist/src/state/store.js.map +1 -1
  101. package/dist/src/version.d.ts +1 -1
  102. package/dist/src/version.js +1 -1
  103. package/docs/architecture.md +16 -11
  104. package/docs/assets/cueline-loop-en.svg +11 -10
  105. package/docs/assets/cueline-loop-ja.svg +11 -10
  106. package/docs/assets/cueline-loop-ko.svg +11 -10
  107. package/docs/assets/cueline-loop-zh-CN.svg +11 -10
  108. package/docs/assets/cueline-loop-zh-TW.svg +11 -10
  109. package/docs/compatibility.md +16 -8
  110. package/docs/controller-protocol.md +8 -4
  111. package/docs/runner-contract.md +26 -6
  112. package/docs/state-and-recovery.md +69 -16
  113. package/package.json +4 -3
  114. package/schemas/controller-observation.schema.json +1 -1
  115. package/scripts/validate-plugin.mjs +66 -0
  116. package/skills/cueline/SKILL.md +89 -13
@@ -1,6 +1,78 @@
1
- import { mkdir, open, readFile } from "node:fs/promises";
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
- export async function appendEvent(file, event) {
23
- await mkdir(path.dirname(file), { recursive: true });
24
- const handle = await open(file, "a", 0o600);
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
- await handle.writeFile(`${canonicalJson(event)}\n`, "utf8");
27
- await handle.sync();
159
+ return parseFence(JSON.parse(await readFile(eventSegmentFencePath(directory), "utf8")));
28
160
  }
29
- finally {
30
- await handle.close();
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 readEvents(file) {
34
- let contents;
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
- contents = await readFile(file, "utf8");
297
+ await writeExclusiveDurableFile(directory, target, `${canonicalJson(event)}\n`);
37
298
  }
38
299
  catch (error) {
39
- if (error.code === "ENOENT") {
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 lines = contents.split("\n").filter((line) => line.trim() !== "");
45
- return lines.map((line, index) => {
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(line);
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 JSON at line ${index + 1}`, { cause: error });
359
+ throw new Error(`EVENT_LOG_INVALID: invalid event segment '${name}'`, { cause: error });
52
360
  }
53
- return validateEvent(parsed, index + 1);
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;
@@ -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;AAU5D,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,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;QACzC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC;KAC7C,CAAC;AACJ,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
+ }