@lumenflow/kernel 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE.md +190 -0
  2. package/README.md +26 -0
  3. package/dist/canonical-json.d.ts +7 -0
  4. package/dist/canonical-json.d.ts.map +1 -0
  5. package/dist/canonical-json.js +50 -0
  6. package/dist/canonical-json.js.map +1 -0
  7. package/dist/event-kinds.d.ts +32 -0
  8. package/dist/event-kinds.d.ts.map +1 -0
  9. package/dist/event-kinds.js +49 -0
  10. package/dist/event-kinds.js.map +1 -0
  11. package/dist/event-store/index.d.ts +64 -0
  12. package/dist/event-store/index.d.ts.map +1 -0
  13. package/dist/event-store/index.js +634 -0
  14. package/dist/event-store/index.js.map +1 -0
  15. package/dist/evidence/evidence-store.d.ts +78 -0
  16. package/dist/evidence/evidence-store.d.ts.map +1 -0
  17. package/dist/evidence/evidence-store.js +409 -0
  18. package/dist/evidence/evidence-store.js.map +1 -0
  19. package/dist/evidence/fs-helpers.d.ts +13 -0
  20. package/dist/evidence/fs-helpers.d.ts.map +1 -0
  21. package/dist/evidence/fs-helpers.js +38 -0
  22. package/dist/evidence/fs-helpers.js.map +1 -0
  23. package/dist/evidence/index.d.ts +3 -0
  24. package/dist/evidence/index.d.ts.map +1 -0
  25. package/dist/evidence/index.js +5 -0
  26. package/dist/evidence/index.js.map +1 -0
  27. package/dist/index.d.ts +17 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +19 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/kernel.schemas.d.ts +642 -0
  32. package/dist/kernel.schemas.d.ts.map +1 -0
  33. package/dist/kernel.schemas.js +331 -0
  34. package/dist/kernel.schemas.js.map +1 -0
  35. package/dist/pack/hash.d.ts +7 -0
  36. package/dist/pack/hash.d.ts.map +1 -0
  37. package/dist/pack/hash.js +56 -0
  38. package/dist/pack/hash.js.map +1 -0
  39. package/dist/pack/index.d.ts +4 -0
  40. package/dist/pack/index.d.ts.map +1 -0
  41. package/dist/pack/index.js +6 -0
  42. package/dist/pack/index.js.map +1 -0
  43. package/dist/pack/manifest.d.ts +100 -0
  44. package/dist/pack/manifest.d.ts.map +1 -0
  45. package/dist/pack/manifest.js +50 -0
  46. package/dist/pack/manifest.js.map +1 -0
  47. package/dist/pack/pack-loader.d.ts +108 -0
  48. package/dist/pack/pack-loader.d.ts.map +1 -0
  49. package/dist/pack/pack-loader.js +282 -0
  50. package/dist/pack/pack-loader.js.map +1 -0
  51. package/dist/policy/approval-event.d.ts +29 -0
  52. package/dist/policy/approval-event.d.ts.map +1 -0
  53. package/dist/policy/approval-event.js +17 -0
  54. package/dist/policy/approval-event.js.map +1 -0
  55. package/dist/policy/index.d.ts +3 -0
  56. package/dist/policy/index.d.ts.map +1 -0
  57. package/dist/policy/index.js +5 -0
  58. package/dist/policy/index.js.map +1 -0
  59. package/dist/policy/policy-engine.d.ts +52 -0
  60. package/dist/policy/policy-engine.d.ts.map +1 -0
  61. package/dist/policy/policy-engine.js +83 -0
  62. package/dist/policy/policy-engine.js.map +1 -0
  63. package/dist/runtime/index.d.ts +2 -0
  64. package/dist/runtime/index.d.ts.map +1 -0
  65. package/dist/runtime/index.js +4 -0
  66. package/dist/runtime/index.js.map +1 -0
  67. package/dist/runtime/kernel-runtime.d.ts +170 -0
  68. package/dist/runtime/kernel-runtime.d.ts.map +1 -0
  69. package/dist/runtime/kernel-runtime.js +751 -0
  70. package/dist/runtime/kernel-runtime.js.map +1 -0
  71. package/dist/sandbox/bwrap-invocation.d.ts +13 -0
  72. package/dist/sandbox/bwrap-invocation.d.ts.map +1 -0
  73. package/dist/sandbox/bwrap-invocation.js +105 -0
  74. package/dist/sandbox/bwrap-invocation.js.map +1 -0
  75. package/dist/sandbox/index.d.ts +5 -0
  76. package/dist/sandbox/index.d.ts.map +1 -0
  77. package/dist/sandbox/index.js +7 -0
  78. package/dist/sandbox/index.js.map +1 -0
  79. package/dist/sandbox/profile.d.ts +32 -0
  80. package/dist/sandbox/profile.d.ts.map +1 -0
  81. package/dist/sandbox/profile.js +101 -0
  82. package/dist/sandbox/profile.js.map +1 -0
  83. package/dist/sandbox/subprocess-dispatcher.d.ts +38 -0
  84. package/dist/sandbox/subprocess-dispatcher.d.ts.map +1 -0
  85. package/dist/sandbox/subprocess-dispatcher.js +145 -0
  86. package/dist/sandbox/subprocess-dispatcher.js.map +1 -0
  87. package/dist/sandbox/tool-runner-worker.d.ts +54 -0
  88. package/dist/sandbox/tool-runner-worker.d.ts.map +1 -0
  89. package/dist/sandbox/tool-runner-worker.js +159 -0
  90. package/dist/sandbox/tool-runner-worker.js.map +1 -0
  91. package/dist/shared-constants.d.ts +48 -0
  92. package/dist/shared-constants.d.ts.map +1 -0
  93. package/dist/shared-constants.js +49 -0
  94. package/dist/shared-constants.js.map +1 -0
  95. package/dist/state-machine/index.d.ts +30 -0
  96. package/dist/state-machine/index.d.ts.map +1 -0
  97. package/dist/state-machine/index.js +92 -0
  98. package/dist/state-machine/index.js.map +1 -0
  99. package/dist/tool-host/builtins/capabilities.d.ts +20 -0
  100. package/dist/tool-host/builtins/capabilities.d.ts.map +1 -0
  101. package/dist/tool-host/builtins/capabilities.js +211 -0
  102. package/dist/tool-host/builtins/capabilities.js.map +1 -0
  103. package/dist/tool-host/builtins/index.d.ts +2 -0
  104. package/dist/tool-host/builtins/index.d.ts.map +1 -0
  105. package/dist/tool-host/builtins/index.js +4 -0
  106. package/dist/tool-host/builtins/index.js.map +1 -0
  107. package/dist/tool-host/index.d.ts +5 -0
  108. package/dist/tool-host/index.d.ts.map +1 -0
  109. package/dist/tool-host/index.js +7 -0
  110. package/dist/tool-host/index.js.map +1 -0
  111. package/dist/tool-host/scope-intersection.d.ts +10 -0
  112. package/dist/tool-host/scope-intersection.d.ts.map +1 -0
  113. package/dist/tool-host/scope-intersection.js +188 -0
  114. package/dist/tool-host/scope-intersection.js.map +1 -0
  115. package/dist/tool-host/subprocess-dispatcher.d.ts +14 -0
  116. package/dist/tool-host/subprocess-dispatcher.d.ts.map +1 -0
  117. package/dist/tool-host/subprocess-dispatcher.js +14 -0
  118. package/dist/tool-host/subprocess-dispatcher.js.map +1 -0
  119. package/dist/tool-host/tool-host.d.ts +42 -0
  120. package/dist/tool-host/tool-host.d.ts.map +1 -0
  121. package/dist/tool-host/tool-host.js +395 -0
  122. package/dist/tool-host/tool-host.js.map +1 -0
  123. package/dist/tool-host/tool-registry.d.ts +9 -0
  124. package/dist/tool-host/tool-registry.d.ts.map +1 -0
  125. package/dist/tool-host/tool-registry.js +28 -0
  126. package/dist/tool-host/tool-registry.js.map +1 -0
  127. package/package.json +71 -0
@@ -0,0 +1,634 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { mkdirSync, watch } from 'node:fs';
4
+ import { appendFile, mkdir, open, readFile, rm, stat } from 'node:fs/promises';
5
+ import { basename, dirname } from 'node:path';
6
+ import { KERNEL_EVENT_KINDS, isRunLifecycleEventKind, isTaskEventKind, } from '../event-kinds.js';
7
+ import { KernelEventSchema, RUN_STATUSES, TaskStateSchema, RunSchema, } from '../kernel.schemas.js';
8
+ import { canonical_json } from '../canonical-json.js';
9
+ import { UTF8_ENCODING } from '../shared-constants.js';
10
+ const DEFAULT_LOCK_RETRY_DELAY_MS = 20;
11
+ const DEFAULT_LOCK_MAX_RETRIES = 250;
12
+ const PROCESS_EXISTS_SIGNAL = 0;
13
+ const SUBSCRIPTION_DEBOUNCE_MS = 25;
14
+ const SUBSCRIPTION_MAX_DRAIN_PASSES = 8;
15
+ const DEFAULT_REPLAY_LIMIT = 100;
16
+ const MAX_REPLAY_LIMIT = 500;
17
+ function sleep(ms) {
18
+ return new Promise((resolve) => {
19
+ setTimeout(resolve, ms);
20
+ });
21
+ }
22
+ function toTimestampMillis(value) {
23
+ const parsed = Date.parse(value);
24
+ return Number.isNaN(parsed) ? 0 : parsed;
25
+ }
26
+ function hasTaskId(event) {
27
+ return 'task_id' in event;
28
+ }
29
+ function isRunLifecycleEvent(event) {
30
+ return isRunLifecycleEventKind(event.kind);
31
+ }
32
+ function parseReplayFilter(filter) {
33
+ const kinds = Array.isArray(filter.kind)
34
+ ? new Set(filter.kind)
35
+ : filter.kind
36
+ ? new Set([filter.kind])
37
+ : null;
38
+ const since = filter.sinceTimestamp ? toTimestampMillis(filter.sinceTimestamp) : null;
39
+ const until = filter.untilTimestamp ? toTimestampMillis(filter.untilTimestamp) : null;
40
+ return { kinds, since, until };
41
+ }
42
+ function eventMatchesFilter(event, filter, parsedFilter) {
43
+ if (filter.taskId) {
44
+ if (!hasTaskId(event)) {
45
+ return false;
46
+ }
47
+ if (event.task_id !== filter.taskId) {
48
+ return false;
49
+ }
50
+ }
51
+ if (parsedFilter.kinds && !parsedFilter.kinds.has(event.kind)) {
52
+ return false;
53
+ }
54
+ const ts = toTimestampMillis(event.timestamp);
55
+ if (parsedFilter.since !== null && ts < parsedFilter.since) {
56
+ return false;
57
+ }
58
+ if (parsedFilter.until !== null && ts > parsedFilter.until) {
59
+ return false;
60
+ }
61
+ return true;
62
+ }
63
+ function createSyntheticTaskSpec(taskId) {
64
+ return {
65
+ id: taskId,
66
+ workspace_id: 'workspace-default',
67
+ lane_id: 'lane-default',
68
+ domain: 'kernel',
69
+ title: `Task ${taskId}`,
70
+ description: `Synthetic projection seed for ${taskId}`,
71
+ acceptance: ['Synthetic projection'],
72
+ declared_scopes: [],
73
+ risk: 'low',
74
+ type: 'runtime',
75
+ priority: 'P3',
76
+ created: '1970-01-01',
77
+ };
78
+ }
79
+ export function verifyTaskSpecHash(taskSpec, events) {
80
+ const created = events.find((event) => event.kind === KERNEL_EVENT_KINDS.TASK_CREATED);
81
+ if (!created) {
82
+ return;
83
+ }
84
+ const expectedHash = created.spec_hash;
85
+ const actualHash = canonical_json(taskSpec);
86
+ if (expectedHash !== actualHash) {
87
+ throw new Error(`Spec hash mismatch for ${taskSpec.id}: expected ${expectedHash}, actual ${actualHash}`);
88
+ }
89
+ }
90
+ function reduceRunEvent(event, runs) {
91
+ const runId = event.run_id;
92
+ const existing = runs.get(runId) ??
93
+ {
94
+ run_id: runId,
95
+ task_id: event.task_id,
96
+ status: RUN_STATUSES.PLANNED,
97
+ started_at: event.timestamp,
98
+ by: 'unknown',
99
+ session_id: 'unknown',
100
+ };
101
+ let nextRun = { ...existing };
102
+ if (event.kind === KERNEL_EVENT_KINDS.RUN_STARTED) {
103
+ nextRun = RunSchema.parse({
104
+ run_id: runId,
105
+ task_id: event.task_id,
106
+ status: RUN_STATUSES.EXECUTING,
107
+ started_at: event.timestamp,
108
+ by: event.by,
109
+ session_id: event.session_id,
110
+ });
111
+ }
112
+ else if (event.kind === KERNEL_EVENT_KINDS.RUN_PAUSED) {
113
+ nextRun = RunSchema.parse({
114
+ ...existing,
115
+ status: RUN_STATUSES.PAUSED,
116
+ });
117
+ }
118
+ else if (event.kind === KERNEL_EVENT_KINDS.RUN_FAILED) {
119
+ nextRun = RunSchema.parse({
120
+ ...existing,
121
+ status: RUN_STATUSES.FAILED,
122
+ completed_at: event.timestamp,
123
+ });
124
+ }
125
+ else if (event.kind === KERNEL_EVENT_KINDS.RUN_SUCCEEDED) {
126
+ nextRun = RunSchema.parse({
127
+ ...existing,
128
+ status: RUN_STATUSES.SUCCEEDED,
129
+ completed_at: event.timestamp,
130
+ });
131
+ }
132
+ runs.set(runId, nextRun);
133
+ return runId;
134
+ }
135
+ export function projectTaskState(taskSpec, events) {
136
+ const sorted = [...events].sort((left, right) => toTimestampMillis(left.timestamp) - toTimestampMillis(right.timestamp));
137
+ const state = {
138
+ task_id: taskSpec.id,
139
+ status: 'ready',
140
+ run_count: 0,
141
+ };
142
+ const runs = new Map();
143
+ let currentRunId;
144
+ for (const event of sorted) {
145
+ if (isTaskEventKind(event.kind)) {
146
+ if (event.kind === KERNEL_EVENT_KINDS.TASK_CREATED) {
147
+ state.status = 'ready';
148
+ }
149
+ else if (event.kind === KERNEL_EVENT_KINDS.TASK_CLAIMED) {
150
+ state.status = 'active';
151
+ state.claimed_at = event.timestamp;
152
+ state.claimed_by = event.by;
153
+ state.session_id = event.session_id;
154
+ state.blocked_reason = undefined;
155
+ }
156
+ else if (event.kind === KERNEL_EVENT_KINDS.TASK_BLOCKED) {
157
+ state.status = 'blocked';
158
+ state.blocked_reason = event.reason;
159
+ }
160
+ else if (event.kind === KERNEL_EVENT_KINDS.TASK_UNBLOCKED) {
161
+ state.status = 'active';
162
+ state.blocked_reason = undefined;
163
+ }
164
+ else if (event.kind === KERNEL_EVENT_KINDS.TASK_WAITING) {
165
+ state.status = 'waiting';
166
+ state.blocked_reason = event.reason;
167
+ }
168
+ else if (event.kind === KERNEL_EVENT_KINDS.TASK_RESUMED) {
169
+ state.status = 'active';
170
+ state.blocked_reason = undefined;
171
+ }
172
+ else if (event.kind === KERNEL_EVENT_KINDS.TASK_COMPLETED) {
173
+ state.status = 'done';
174
+ state.completed_at = event.timestamp;
175
+ }
176
+ else if (event.kind === KERNEL_EVENT_KINDS.TASK_RELEASED) {
177
+ state.status = 'ready';
178
+ state.session_id = undefined;
179
+ }
180
+ }
181
+ if (isRunLifecycleEvent(event)) {
182
+ currentRunId = reduceRunEvent(event, runs);
183
+ }
184
+ }
185
+ state.run_count = runs.size;
186
+ state.current_run = currentRunId ? runs.get(currentRunId) : undefined;
187
+ return TaskStateSchema.parse(state);
188
+ }
189
+ export class EventStore {
190
+ eventsFilePath;
191
+ lockFilePath;
192
+ lockRetryDelayMs;
193
+ lockMaxRetries;
194
+ taskSpecLoader;
195
+ indexesHydrated = false;
196
+ orderedEvents = [];
197
+ byTask = new Map();
198
+ byKind = new Map();
199
+ byTimestamp = new Map();
200
+ constructor(options) {
201
+ this.eventsFilePath = options.eventsFilePath;
202
+ this.lockFilePath = options.lockFilePath;
203
+ this.lockRetryDelayMs = options.lockRetryDelayMs ?? DEFAULT_LOCK_RETRY_DELAY_MS;
204
+ this.lockMaxRetries = options.lockMaxRetries ?? DEFAULT_LOCK_MAX_RETRIES;
205
+ this.taskSpecLoader = options.taskSpecLoader;
206
+ }
207
+ async append(event) {
208
+ await this.appendAll([event]);
209
+ }
210
+ async appendAll(events) {
211
+ if (events.length === 0) {
212
+ return;
213
+ }
214
+ const validatedEvents = events.map((event) => {
215
+ const parsed = KernelEventSchema.safeParse(event);
216
+ if (!parsed.success) {
217
+ throw new Error(`KernelEvent validation failed: ${parsed.error.message}`);
218
+ }
219
+ return parsed.data;
220
+ });
221
+ const payload = validatedEvents.map((event) => `${JSON.stringify(event)}\n`).join('');
222
+ await this.withFileLock(async () => {
223
+ await mkdir(dirname(this.eventsFilePath), { recursive: true });
224
+ await appendFile(this.eventsFilePath, payload, UTF8_ENCODING);
225
+ });
226
+ if (!this.indexesHydrated) {
227
+ await this.reloadFromDisk();
228
+ return;
229
+ }
230
+ for (const event of validatedEvents) {
231
+ this.applyEventToIndexes(event);
232
+ }
233
+ }
234
+ async replay(filter = {}) {
235
+ await this.reloadFromDisk();
236
+ const parsedFilter = parseReplayFilter(filter);
237
+ const cursorMs = filter.cursor ? toTimestampMillis(filter.cursor) : null;
238
+ const effectiveLimit = Math.min(Math.max(1, filter.limit ?? DEFAULT_REPLAY_LIMIT), MAX_REPLAY_LIMIT);
239
+ const matched = [];
240
+ let totalMatchingAfterPage = 0;
241
+ for (const event of this.orderedEvents) {
242
+ if (!eventMatchesFilter(event, filter, parsedFilter)) {
243
+ continue;
244
+ }
245
+ // Apply cursor: exclusive lower bound on timestamp
246
+ if (cursorMs !== null && toTimestampMillis(event.timestamp) <= cursorMs) {
247
+ continue;
248
+ }
249
+ if (matched.length < effectiveLimit) {
250
+ matched.push(event);
251
+ }
252
+ else {
253
+ // At least one more event exists beyond the page
254
+ totalMatchingAfterPage += 1;
255
+ break;
256
+ }
257
+ }
258
+ const hasMore = totalMatchingAfterPage > 0;
259
+ const lastEvent = matched[matched.length - 1];
260
+ const nextCursor = hasMore && lastEvent ? lastEvent.timestamp : null;
261
+ return { events: matched, nextCursor };
262
+ }
263
+ subscribe(filter = {}, callback) {
264
+ const parsedFilter = parseReplayFilter(filter);
265
+ const watchedDirectory = dirname(this.eventsFilePath);
266
+ const watchedFileName = basename(this.eventsFilePath);
267
+ let isDisposed = false;
268
+ let isDraining = false;
269
+ let shouldDrainAgain = false;
270
+ let drainTimer = null;
271
+ let initializedOffset = false;
272
+ let offset = 0;
273
+ let trailingPartialLine = '';
274
+ const initialOffsetPromise = this.getCurrentFileSize();
275
+ const safeInvoke = async (event) => {
276
+ try {
277
+ await callback(event);
278
+ }
279
+ catch {
280
+ // Subscriber callback failures must not break the watch loop.
281
+ }
282
+ };
283
+ const processTextChunk = async (text, didTruncate) => {
284
+ if (didTruncate) {
285
+ trailingPartialLine = '';
286
+ }
287
+ const combinedText = trailingPartialLine + text;
288
+ const lines = combinedText.split('\n');
289
+ trailingPartialLine = lines.pop() ?? '';
290
+ for (const rawLine of lines) {
291
+ const line = rawLine.trim();
292
+ if (!line) {
293
+ continue;
294
+ }
295
+ let parsed;
296
+ try {
297
+ parsed = JSON.parse(line);
298
+ }
299
+ catch {
300
+ continue;
301
+ }
302
+ const eventResult = KernelEventSchema.safeParse(parsed);
303
+ if (!eventResult.success) {
304
+ continue;
305
+ }
306
+ if (eventMatchesFilter(eventResult.data, filter, parsedFilter)) {
307
+ await safeInvoke(eventResult.data);
308
+ }
309
+ }
310
+ };
311
+ const drain = async () => {
312
+ if (isDisposed || isDraining) {
313
+ return;
314
+ }
315
+ isDraining = true;
316
+ try {
317
+ if (!initializedOffset) {
318
+ offset = await initialOffsetPromise;
319
+ initializedOffset = true;
320
+ }
321
+ let passes = 0;
322
+ do {
323
+ shouldDrainAgain = false;
324
+ const readResult = await this.readTailFromOffset(offset);
325
+ offset = readResult.nextOffset;
326
+ if (readResult.text.length > 0 || readResult.didTruncate) {
327
+ await processTextChunk(readResult.text, readResult.didTruncate);
328
+ }
329
+ passes += 1;
330
+ if (readResult.text.length === 0 && !readResult.didTruncate) {
331
+ break;
332
+ }
333
+ } while (!isDisposed && shouldDrainAgain && passes < SUBSCRIPTION_MAX_DRAIN_PASSES);
334
+ }
335
+ finally {
336
+ isDraining = false;
337
+ }
338
+ };
339
+ const scheduleDrain = () => {
340
+ if (isDisposed) {
341
+ return;
342
+ }
343
+ shouldDrainAgain = true;
344
+ if (drainTimer) {
345
+ return;
346
+ }
347
+ drainTimer = setTimeout(() => {
348
+ drainTimer = null;
349
+ void drain();
350
+ }, SUBSCRIPTION_DEBOUNCE_MS);
351
+ };
352
+ mkdirSync(watchedDirectory, { recursive: true });
353
+ const watcher = watch(watchedDirectory, { persistent: false }, (eventType, filename) => {
354
+ if (isDisposed) {
355
+ return;
356
+ }
357
+ if (eventType !== 'change' && eventType !== 'rename') {
358
+ return;
359
+ }
360
+ if (filename && filename.toString() !== watchedFileName) {
361
+ return;
362
+ }
363
+ scheduleDrain();
364
+ });
365
+ watcher.on('error', () => {
366
+ // Keep runtime alive; watch will naturally stop after dispose.
367
+ });
368
+ return {
369
+ dispose: () => {
370
+ if (isDisposed) {
371
+ return;
372
+ }
373
+ isDisposed = true;
374
+ if (drainTimer) {
375
+ clearTimeout(drainTimer);
376
+ drainTimer = null;
377
+ }
378
+ watcher.close();
379
+ },
380
+ };
381
+ }
382
+ async project(taskId) {
383
+ await this.reloadFromDisk();
384
+ const taskEvents = this.byTask.get(taskId) ?? [];
385
+ let taskSpec = null;
386
+ if (this.taskSpecLoader) {
387
+ taskSpec = await this.taskSpecLoader(taskId);
388
+ }
389
+ const spec = taskSpec ?? createSyntheticTaskSpec(taskId);
390
+ verifyTaskSpecHash(spec, taskEvents);
391
+ return projectTaskState(spec, taskEvents);
392
+ }
393
+ getByTask(taskId) {
394
+ return [...(this.byTask.get(taskId) ?? [])];
395
+ }
396
+ getByKind(kind) {
397
+ return [...(this.byKind.get(kind) ?? [])];
398
+ }
399
+ getByTimestamp(timestamp) {
400
+ return [...(this.byTimestamp.get(timestamp) ?? [])];
401
+ }
402
+ buildLockMetadata() {
403
+ return {
404
+ pid: process.pid,
405
+ acquired_at: new Date().toISOString(),
406
+ };
407
+ }
408
+ parseLockMetadata(raw) {
409
+ if (!raw.trim()) {
410
+ return null;
411
+ }
412
+ try {
413
+ const parsed = JSON.parse(raw);
414
+ if (typeof parsed.pid === 'number' &&
415
+ Number.isInteger(parsed.pid) &&
416
+ parsed.pid > 0 &&
417
+ typeof parsed.acquired_at === 'string' &&
418
+ parsed.acquired_at.length > 0) {
419
+ return {
420
+ pid: parsed.pid,
421
+ acquired_at: parsed.acquired_at,
422
+ };
423
+ }
424
+ return null;
425
+ }
426
+ catch {
427
+ return null;
428
+ }
429
+ }
430
+ isProcessAlive(pid) {
431
+ try {
432
+ process.kill(pid, PROCESS_EXISTS_SIGNAL);
433
+ return true;
434
+ }
435
+ catch (error) {
436
+ const nodeError = error;
437
+ if (nodeError.code === 'ESRCH') {
438
+ return false;
439
+ }
440
+ if (nodeError.code === 'EPERM') {
441
+ return true;
442
+ }
443
+ return true;
444
+ }
445
+ }
446
+ async recoverStaleLockIfNeeded() {
447
+ let metadataRaw;
448
+ try {
449
+ metadataRaw = await readFile(this.lockFilePath, UTF8_ENCODING);
450
+ }
451
+ catch (error) {
452
+ const nodeError = error;
453
+ if (nodeError.code === 'ENOENT') {
454
+ return true;
455
+ }
456
+ throw error;
457
+ }
458
+ const metadata = this.parseLockMetadata(metadataRaw);
459
+ if (!metadata) {
460
+ return false;
461
+ }
462
+ if (this.isProcessAlive(metadata.pid)) {
463
+ return false;
464
+ }
465
+ await rm(this.lockFilePath, { force: true });
466
+ return true;
467
+ }
468
+ async cleanupLockHandle(handle) {
469
+ if (!handle) {
470
+ return;
471
+ }
472
+ try {
473
+ await handle.close();
474
+ }
475
+ catch {
476
+ // Best-effort cleanup only.
477
+ }
478
+ await rm(this.lockFilePath, { force: true });
479
+ }
480
+ async reloadFromDisk() {
481
+ let content;
482
+ try {
483
+ content = await readFile(this.eventsFilePath, UTF8_ENCODING);
484
+ }
485
+ catch (error) {
486
+ const nodeError = error;
487
+ if (nodeError.code === 'ENOENT') {
488
+ this.resetIndexes();
489
+ this.indexesHydrated = true;
490
+ return;
491
+ }
492
+ throw error;
493
+ }
494
+ this.resetIndexes();
495
+ const lines = content
496
+ .split('\n')
497
+ .map((line) => line.trim())
498
+ .filter(Boolean);
499
+ for (let index = 0; index < lines.length; index += 1) {
500
+ const line = lines[index];
501
+ if (line === undefined) {
502
+ continue;
503
+ }
504
+ const parsed = (() => {
505
+ try {
506
+ return JSON.parse(line);
507
+ }
508
+ catch (error) {
509
+ throw new Error(`Malformed JSON at line ${index + 1}: ${error.message}`, {
510
+ cause: error,
511
+ });
512
+ }
513
+ })();
514
+ try {
515
+ const event = KernelEventSchema.parse(parsed);
516
+ this.applyEventToIndexes(event);
517
+ }
518
+ catch (error) {
519
+ throw new Error(`KernelEvent parse failed at line ${index + 1}`, { cause: error });
520
+ }
521
+ }
522
+ this.indexesHydrated = true;
523
+ }
524
+ async getCurrentFileSize() {
525
+ try {
526
+ const fileStats = await stat(this.eventsFilePath);
527
+ return fileStats.size;
528
+ }
529
+ catch (error) {
530
+ const nodeError = error;
531
+ if (nodeError.code === 'ENOENT') {
532
+ return 0;
533
+ }
534
+ throw error;
535
+ }
536
+ }
537
+ async readTailFromOffset(offset) {
538
+ let handle = null;
539
+ try {
540
+ handle = await open(this.eventsFilePath, 'r');
541
+ const fileStats = await handle.stat();
542
+ const didTruncate = fileStats.size < offset;
543
+ const startOffset = didTruncate ? 0 : offset;
544
+ const bytesToRead = Math.max(0, fileStats.size - startOffset);
545
+ if (bytesToRead === 0) {
546
+ return {
547
+ text: '',
548
+ nextOffset: fileStats.size,
549
+ didTruncate,
550
+ };
551
+ }
552
+ const buffer = Buffer.allocUnsafe(bytesToRead);
553
+ let totalBytesRead = 0;
554
+ while (totalBytesRead < bytesToRead) {
555
+ const { bytesRead } = await handle.read(buffer, totalBytesRead, bytesToRead - totalBytesRead, startOffset + totalBytesRead);
556
+ if (bytesRead === 0) {
557
+ break;
558
+ }
559
+ totalBytesRead += bytesRead;
560
+ }
561
+ return {
562
+ text: buffer.subarray(0, totalBytesRead).toString(UTF8_ENCODING),
563
+ nextOffset: startOffset + totalBytesRead,
564
+ didTruncate,
565
+ };
566
+ }
567
+ catch (error) {
568
+ const nodeError = error;
569
+ if (nodeError.code === 'ENOENT') {
570
+ return {
571
+ text: '',
572
+ nextOffset: 0,
573
+ didTruncate: offset > 0,
574
+ };
575
+ }
576
+ throw error;
577
+ }
578
+ finally {
579
+ if (handle) {
580
+ await handle.close().catch(() => {
581
+ // Best-effort cleanup only.
582
+ });
583
+ }
584
+ }
585
+ }
586
+ resetIndexes() {
587
+ this.orderedEvents = [];
588
+ this.byTask = new Map();
589
+ this.byKind = new Map();
590
+ this.byTimestamp = new Map();
591
+ }
592
+ applyEventToIndexes(event) {
593
+ this.orderedEvents.push(event);
594
+ if (hasTaskId(event)) {
595
+ const taskBucket = this.byTask.get(event.task_id) ?? [];
596
+ taskBucket.push(event);
597
+ this.byTask.set(event.task_id, taskBucket);
598
+ }
599
+ const kindBucket = this.byKind.get(event.kind) ?? [];
600
+ kindBucket.push(event);
601
+ this.byKind.set(event.kind, kindBucket);
602
+ const tsBucket = this.byTimestamp.get(event.timestamp) ?? [];
603
+ tsBucket.push(event);
604
+ this.byTimestamp.set(event.timestamp, tsBucket);
605
+ }
606
+ async withFileLock(operation) {
607
+ await mkdir(dirname(this.lockFilePath), { recursive: true });
608
+ for (let attempt = 0; attempt <= this.lockMaxRetries; attempt += 1) {
609
+ let handle = null;
610
+ try {
611
+ handle = await open(this.lockFilePath, 'wx');
612
+ await handle.writeFile(JSON.stringify(this.buildLockMetadata()), UTF8_ENCODING);
613
+ const result = await operation();
614
+ await this.cleanupLockHandle(handle);
615
+ return result;
616
+ }
617
+ catch (error) {
618
+ const nodeError = error;
619
+ await this.cleanupLockHandle(handle);
620
+ if (nodeError.code === 'EEXIST' && attempt < this.lockMaxRetries) {
621
+ const recovered = await this.recoverStaleLockIfNeeded();
622
+ if (recovered) {
623
+ continue;
624
+ }
625
+ await sleep(this.lockRetryDelayMs);
626
+ continue;
627
+ }
628
+ throw error;
629
+ }
630
+ }
631
+ throw new Error(`Failed to acquire event-store lock at ${this.lockFilePath}`);
632
+ }
633
+ }
634
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/event-store/index.ts"],"names":[],"mappings":"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"}