@codeledger/codeledger-daemon 0.7.8

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 (94) hide show
  1. package/LICENSE +27 -0
  2. package/dist/api/server.d.ts +4 -0
  3. package/dist/api/server.d.ts.map +1 -0
  4. package/dist/api/server.js +69 -0
  5. package/dist/api/server.js.map +1 -0
  6. package/dist/daemon.d.ts +12 -0
  7. package/dist/daemon.d.ts.map +1 -0
  8. package/dist/daemon.js +316 -0
  9. package/dist/daemon.js.map +1 -0
  10. package/dist/events/appendEvent.d.ts +9 -0
  11. package/dist/events/appendEvent.d.ts.map +1 -0
  12. package/dist/events/appendEvent.js +14 -0
  13. package/dist/events/appendEvent.js.map +1 -0
  14. package/dist/events/eventConsumer.d.ts +13 -0
  15. package/dist/events/eventConsumer.d.ts.map +1 -0
  16. package/dist/events/eventConsumer.js +42 -0
  17. package/dist/events/eventConsumer.js.map +1 -0
  18. package/dist/events/eventReducer.d.ts +4 -0
  19. package/dist/events/eventReducer.d.ts.map +1 -0
  20. package/dist/events/eventReducer.js +185 -0
  21. package/dist/events/eventReducer.js.map +1 -0
  22. package/dist/events/eventTypes.d.ts +31 -0
  23. package/dist/events/eventTypes.d.ts.map +1 -0
  24. package/dist/events/eventTypes.js +15 -0
  25. package/dist/events/eventTypes.js.map +1 -0
  26. package/dist/health/heartbeat.d.ts +9 -0
  27. package/dist/health/heartbeat.d.ts.map +1 -0
  28. package/dist/health/heartbeat.js +8 -0
  29. package/dist/health/heartbeat.js.map +1 -0
  30. package/dist/health/status.d.ts +4 -0
  31. package/dist/health/status.d.ts.map +1 -0
  32. package/dist/health/status.js +46 -0
  33. package/dist/health/status.js.map +1 -0
  34. package/dist/index.d.ts +6 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +5 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/ipc/fileIpcTransport.d.ts +4 -0
  39. package/dist/ipc/fileIpcTransport.d.ts.map +1 -0
  40. package/dist/ipc/fileIpcTransport.js +64 -0
  41. package/dist/ipc/fileIpcTransport.js.map +1 -0
  42. package/dist/ipc/transport.d.ts +21 -0
  43. package/dist/ipc/transport.d.ts.map +1 -0
  44. package/dist/ipc/transport.js +2 -0
  45. package/dist/ipc/transport.js.map +1 -0
  46. package/dist/ipc/transportSelector.d.ts +6 -0
  47. package/dist/ipc/transportSelector.d.ts.map +1 -0
  48. package/dist/ipc/transportSelector.js +17 -0
  49. package/dist/ipc/transportSelector.js.map +1 -0
  50. package/dist/ipc/unixSocketTransport.d.ts +3 -0
  51. package/dist/ipc/unixSocketTransport.d.ts.map +1 -0
  52. package/dist/ipc/unixSocketTransport.js +81 -0
  53. package/dist/ipc/unixSocketTransport.js.map +1 -0
  54. package/dist/signals/taskHintDetector.d.ts +2 -0
  55. package/dist/signals/taskHintDetector.d.ts.map +1 -0
  56. package/dist/signals/taskHintDetector.js +29 -0
  57. package/dist/signals/taskHintDetector.js.map +1 -0
  58. package/dist/store/daemonState.d.ts +79 -0
  59. package/dist/store/daemonState.d.ts.map +1 -0
  60. package/dist/store/daemonState.js +83 -0
  61. package/dist/store/daemonState.js.map +1 -0
  62. package/dist/store/eventJournal.d.ts +12 -0
  63. package/dist/store/eventJournal.d.ts.map +1 -0
  64. package/dist/store/eventJournal.js +105 -0
  65. package/dist/store/eventJournal.js.map +1 -0
  66. package/dist/store/rebuildState.d.ts +11 -0
  67. package/dist/store/rebuildState.d.ts.map +1 -0
  68. package/dist/store/rebuildState.js +39 -0
  69. package/dist/store/rebuildState.js.map +1 -0
  70. package/dist/store/runJournal.d.ts +2 -0
  71. package/dist/store/runJournal.d.ts.map +1 -0
  72. package/dist/store/runJournal.js +14 -0
  73. package/dist/store/runJournal.js.map +1 -0
  74. package/dist/store/snapshotStore.d.ts +16 -0
  75. package/dist/store/snapshotStore.d.ts.map +1 -0
  76. package/dist/store/snapshotStore.js +111 -0
  77. package/dist/store/snapshotStore.js.map +1 -0
  78. package/dist/warmers/bundleWarmer.d.ts +10 -0
  79. package/dist/warmers/bundleWarmer.d.ts.map +1 -0
  80. package/dist/warmers/bundleWarmer.js +36 -0
  81. package/dist/warmers/bundleWarmer.js.map +1 -0
  82. package/dist/warmers/scanWarmer.d.ts +5 -0
  83. package/dist/warmers/scanWarmer.d.ts.map +1 -0
  84. package/dist/warmers/scanWarmer.js +13 -0
  85. package/dist/warmers/scanWarmer.js.map +1 -0
  86. package/dist/watchers/fileWatcher.d.ts +2 -0
  87. package/dist/watchers/fileWatcher.d.ts.map +1 -0
  88. package/dist/watchers/fileWatcher.js +24 -0
  89. package/dist/watchers/fileWatcher.js.map +1 -0
  90. package/dist/watchers/gitWatcher.d.ts +8 -0
  91. package/dist/watchers/gitWatcher.d.ts.map +1 -0
  92. package/dist/watchers/gitWatcher.js +47 -0
  93. package/dist/watchers/gitWatcher.js.map +1 -0
  94. package/package.json +38 -0
@@ -0,0 +1,29 @@
1
+ export function detectTaskHints(changedFiles) {
2
+ if (changedFiles.length === 0)
3
+ return [];
4
+ const subsystems = new Set();
5
+ const hints = [];
6
+ for (const file of changedFiles) {
7
+ const parts = file.split('/');
8
+ if (parts[0] === 'src' && parts[1]) {
9
+ subsystems.add(parts[1]);
10
+ }
11
+ if (/(test|spec)\./.test(file) || file.startsWith('tests/')) {
12
+ hints.push(`fix failing tests around ${parts.slice(0, 2).join('/')}`);
13
+ }
14
+ if (/auth|token|session|middleware/.test(file)) {
15
+ hints.push('fix auth and middleware behavior');
16
+ }
17
+ else if (/api|router|handler/.test(file)) {
18
+ hints.push('review API routing and handler changes');
19
+ }
20
+ else if (/db|migration|model/.test(file)) {
21
+ hints.push('review database and model changes');
22
+ }
23
+ }
24
+ for (const subsystem of subsystems) {
25
+ hints.push(`review recent changes in ${subsystem}`);
26
+ }
27
+ return [...new Set(hints)].slice(0, 5);
28
+ }
29
+ //# sourceMappingURL=taskHintDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskHintDetector.js","sourceRoot":"","sources":["../../src/signals/taskHintDetector.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,YAAsB;IACpD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,4BAA4B,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,79 @@
1
+ export interface ValueSignals {
2
+ filesSkipped: number;
3
+ scanReused: boolean;
4
+ bundleReused: boolean;
5
+ estimatedTimeSavedSeconds: number;
6
+ duplicateRisk?: string;
7
+ outOfScopeWarning?: string;
8
+ }
9
+ export interface WarmBundleEntry {
10
+ task: string;
11
+ bundlePath: string;
12
+ bundleId: string;
13
+ generatedAt: string;
14
+ confidenceLevel?: string;
15
+ confidenceScore?: number;
16
+ relevantTests?: string[];
17
+ filesSkipped?: number;
18
+ estimatedTimeSavedSeconds?: number;
19
+ }
20
+ export interface RecentRunEntry {
21
+ runId: string;
22
+ task: string;
23
+ status: string;
24
+ at: string;
25
+ taskId?: string;
26
+ branch?: string;
27
+ gitHead?: string;
28
+ bundleConfidenceLevel?: string;
29
+ bundleConfidenceScore?: number;
30
+ contextReuse?: boolean;
31
+ filesTouched?: string[];
32
+ warnings?: string[];
33
+ violations?: string[];
34
+ valueSignals?: ValueSignals;
35
+ }
36
+ export interface DaemonRetentionPolicy {
37
+ hotJournalDays: number;
38
+ snapshotLimit: number;
39
+ snapshotIntervalEvents: number;
40
+ }
41
+ export interface DaemonState {
42
+ version: number;
43
+ pid?: number;
44
+ running: boolean;
45
+ port: number;
46
+ transport: 'unix-socket' | 'file-ipc' | 'none';
47
+ socketPath?: string;
48
+ requestsPath?: string;
49
+ responsesPath?: string;
50
+ repoRoot: string;
51
+ gitBranch: string;
52
+ gitHead: string;
53
+ lastScanAt?: string;
54
+ scanFresh: boolean;
55
+ activeTaskId?: string;
56
+ recentBundles: WarmBundleEntry[];
57
+ recentRuns: RecentRunEntry[];
58
+ changedFiles: string[];
59
+ taskHints: string[];
60
+ updatedAt: string;
61
+ lastHeartbeatAt?: string;
62
+ eventCount: number;
63
+ lastEventId?: string;
64
+ lastWarning?: string;
65
+ lastValueSignals?: ValueSignals;
66
+ retention: DaemonRetentionPolicy;
67
+ }
68
+ export declare const DEFAULT_DAEMON_RETENTION: DaemonRetentionPolicy;
69
+ export declare function daemonDir(cwd: string): string;
70
+ export declare function daemonStatePath(cwd: string): string;
71
+ export declare function daemonPidPath(cwd: string): string;
72
+ export declare function daemonIpcDir(cwd: string): string;
73
+ export declare function daemonRequestsDir(cwd: string): string;
74
+ export declare function daemonResponsesDir(cwd: string): string;
75
+ export declare function daemonSocketPath(cwd: string): string;
76
+ export declare function loadDaemonState(cwd: string): DaemonState | null;
77
+ export declare function writeDaemonState(cwd: string, state: DaemonState): void;
78
+ export declare function createEmptyDaemonState(cwd: string, port: number): DaemonState;
79
+ //# sourceMappingURL=daemonState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemonState.d.ts","sourceRoot":"","sources":["../../src/store/daemonState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const DEFAULT_DAEMON_RETENTION = {
4
+ hotJournalDays: 7,
5
+ snapshotLimit: 5,
6
+ snapshotIntervalEvents: 25,
7
+ };
8
+ export function daemonDir(cwd) {
9
+ return join(cwd, '.codeledger', 'daemon');
10
+ }
11
+ export function daemonStatePath(cwd) {
12
+ return join(daemonDir(cwd), 'state.json');
13
+ }
14
+ export function daemonPidPath(cwd) {
15
+ return join(daemonDir(cwd), 'daemon.pid');
16
+ }
17
+ export function daemonIpcDir(cwd) {
18
+ return join(cwd, '.codeledger', 'ipc');
19
+ }
20
+ export function daemonRequestsDir(cwd) {
21
+ return join(daemonIpcDir(cwd), 'requests');
22
+ }
23
+ export function daemonResponsesDir(cwd) {
24
+ return join(daemonIpcDir(cwd), 'responses');
25
+ }
26
+ export function daemonSocketPath(cwd) {
27
+ return join(daemonDir(cwd), 'codeledger.sock');
28
+ }
29
+ export function loadDaemonState(cwd) {
30
+ const path = daemonStatePath(cwd);
31
+ if (!existsSync(path))
32
+ return null;
33
+ try {
34
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
35
+ return {
36
+ ...createEmptyDaemonState(cwd, typeof parsed.port === 'number' ? parsed.port : 42637),
37
+ ...parsed,
38
+ retention: {
39
+ ...DEFAULT_DAEMON_RETENTION,
40
+ ...(parsed.retention ?? {}),
41
+ },
42
+ };
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ export function writeDaemonState(cwd, state) {
49
+ const dir = daemonDir(cwd);
50
+ if (!existsSync(dir)) {
51
+ mkdirSync(dir, { recursive: true });
52
+ }
53
+ const target = daemonStatePath(cwd);
54
+ const temp = `${target}.tmp`;
55
+ writeFileSync(temp, JSON.stringify(state, null, 2) + '\n');
56
+ renameSync(temp, target);
57
+ if (state.pid) {
58
+ writeFileSync(daemonPidPath(cwd), `${state.pid}\n`);
59
+ }
60
+ }
61
+ export function createEmptyDaemonState(cwd, port) {
62
+ return {
63
+ version: 1,
64
+ running: false,
65
+ port,
66
+ transport: 'none',
67
+ socketPath: daemonSocketPath(cwd),
68
+ requestsPath: daemonRequestsDir(cwd),
69
+ responsesPath: daemonResponsesDir(cwd),
70
+ repoRoot: cwd,
71
+ gitBranch: '',
72
+ gitHead: '',
73
+ scanFresh: false,
74
+ recentBundles: [],
75
+ recentRuns: [],
76
+ changedFiles: [],
77
+ taskHints: [],
78
+ updatedAt: new Date(0).toISOString(),
79
+ eventCount: 0,
80
+ retention: { ...DEFAULT_DAEMON_RETENTION },
81
+ };
82
+ }
83
+ //# sourceMappingURL=daemonState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemonState.js","sourceRoot":"","sources":["../../src/store/daemonState.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DaemonEvent, DaemonEventReplayResult } from '../events/eventTypes.js';
2
+ export interface ReplayJournalOptions {
3
+ includeArchive?: boolean;
4
+ sinceTs?: string;
5
+ maxFiles?: number;
6
+ }
7
+ export declare function daemonEventsDir(cwd: string): string;
8
+ export declare function daemonArchivedEventsDir(cwd: string): string;
9
+ export declare function appendJournalEvent(cwd: string, event: DaemonEvent): void;
10
+ export declare function replayJournalEvents(cwd: string, options?: ReplayJournalOptions): DaemonEventReplayResult;
11
+ export declare function compactJournalFiles(cwd: string, latestSnapshotTs: string | undefined, hotJournalDays?: number): void;
12
+ //# sourceMappingURL=eventJournal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventJournal.d.ts","sourceRoot":"","sources":["../../src/store/eventJournal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAIpF,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAMxE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,uBAAuB,CAwC5G;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,cAAc,GAAE,MAAiC,GAChD,IAAI,CA4BN"}
@@ -0,0 +1,105 @@
1
+ import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync } from 'node:fs';
2
+ import { basename, join } from 'node:path';
3
+ const DEFAULT_HOT_JOURNAL_DAYS = 7;
4
+ export function daemonEventsDir(cwd) {
5
+ return join(cwd, '.codeledger', 'daemon', 'events');
6
+ }
7
+ export function daemonArchivedEventsDir(cwd) {
8
+ return join(daemonEventsDir(cwd), 'archive');
9
+ }
10
+ export function appendJournalEvent(cwd, event) {
11
+ const dir = daemonEventsDir(cwd);
12
+ if (!existsSync(dir)) {
13
+ mkdirSync(dir, { recursive: true });
14
+ }
15
+ appendFileSync(journalPathForDate(cwd, event.ts), JSON.stringify(event) + '\n');
16
+ }
17
+ export function replayJournalEvents(cwd, options = {}) {
18
+ const activeFiles = listJournalFiles(daemonEventsDir(cwd));
19
+ const archivedFiles = options.includeArchive ? listJournalFiles(daemonArchivedEventsDir(cwd)) : [];
20
+ const allFiles = [...archivedFiles, ...activeFiles];
21
+ const sinceDate = options.sinceTs?.slice(0, 10);
22
+ const filteredFiles = sinceDate
23
+ ? allFiles.filter((file) => journalDateFromPath(file) >= sinceDate)
24
+ : allFiles;
25
+ const files = options.maxFiles ? filteredFiles.slice(-options.maxFiles) : filteredFiles;
26
+ const events = [];
27
+ const seenIds = new Set();
28
+ let skippedMalformed = 0;
29
+ let skippedDuplicates = 0;
30
+ for (const fullPath of files) {
31
+ const lines = readFileSync(fullPath, 'utf-8').split('\n');
32
+ for (const line of lines) {
33
+ if (!line.trim())
34
+ continue;
35
+ try {
36
+ const event = JSON.parse(line);
37
+ if (!event?.id || typeof event.type !== 'string' || typeof event.ts !== 'string') {
38
+ skippedMalformed++;
39
+ continue;
40
+ }
41
+ if (options.sinceTs && event.ts < options.sinceTs) {
42
+ continue;
43
+ }
44
+ if (seenIds.has(event.id)) {
45
+ skippedDuplicates++;
46
+ continue;
47
+ }
48
+ seenIds.add(event.id);
49
+ events.push(event);
50
+ }
51
+ catch {
52
+ skippedMalformed++;
53
+ }
54
+ }
55
+ }
56
+ return { events, skippedMalformed, skippedDuplicates };
57
+ }
58
+ export function compactJournalFiles(cwd, latestSnapshotTs, hotJournalDays = DEFAULT_HOT_JOURNAL_DAYS) {
59
+ if (!latestSnapshotTs)
60
+ return;
61
+ const dir = daemonEventsDir(cwd);
62
+ if (!existsSync(dir))
63
+ return;
64
+ const archiveDir = daemonArchivedEventsDir(cwd);
65
+ if (!existsSync(archiveDir)) {
66
+ mkdirSync(archiveDir, { recursive: true });
67
+ }
68
+ const activeFiles = listJournalFiles(dir);
69
+ const keepDates = new Set(activeFiles
70
+ .slice(-Math.max(1, hotJournalDays))
71
+ .map((file) => journalDateFromPath(file)));
72
+ const snapshotDate = latestSnapshotTs.slice(0, 10);
73
+ for (const fullPath of activeFiles) {
74
+ const date = journalDateFromPath(fullPath);
75
+ if (keepDates.has(date))
76
+ continue;
77
+ if (date >= snapshotDate)
78
+ continue;
79
+ const target = join(archiveDir, basename(fullPath));
80
+ if (existsSync(target))
81
+ continue;
82
+ try {
83
+ renameSync(fullPath, target);
84
+ }
85
+ catch {
86
+ // ignore best-effort compaction
87
+ }
88
+ }
89
+ }
90
+ function listJournalFiles(dir) {
91
+ if (!existsSync(dir))
92
+ return [];
93
+ return readdirSync(dir)
94
+ .filter((file) => file.endsWith('.jsonl'))
95
+ .sort()
96
+ .map((file) => join(dir, file));
97
+ }
98
+ function journalPathForDate(cwd, ts) {
99
+ return join(daemonEventsDir(cwd), `${ts.slice(0, 10)}.jsonl`);
100
+ }
101
+ function journalDateFromPath(path) {
102
+ const file = basename(path);
103
+ return file.replace(/\.jsonl$/, '');
104
+ }
105
+ //# sourceMappingURL=eventJournal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventJournal.js","sourceRoot":"","sources":["../../src/store/eventJournal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { DaemonEvent } from '../events/eventTypes.js';
2
+ import { type DaemonState } from './daemonState.js';
3
+ export interface RebuildStateResult {
4
+ state: DaemonState;
5
+ seenEventIds: Set<string>;
6
+ skippedMalformed: number;
7
+ skippedDuplicates: number;
8
+ }
9
+ export declare function rebuildState(cwd: string, port: number): RebuildStateResult;
10
+ export declare function rebuildStateFromEvents(cwd: string, port: number, events: DaemonEvent[]): DaemonState;
11
+ //# sourceMappingURL=rebuildState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuildState.d.ts","sourceRoot":"","sources":["../../src/store/rebuildState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG5E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CA0B1E;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAMpG"}
@@ -0,0 +1,39 @@
1
+ import { reduceDaemonEvent } from '../events/eventReducer.js';
2
+ import { replayJournalEvents } from './eventJournal.js';
3
+ import { createEmptyDaemonState } from './daemonState.js';
4
+ import { loadSnapshot } from './snapshotStore.js';
5
+ export function rebuildState(cwd, port) {
6
+ const snapshot = loadSnapshot(cwd);
7
+ const replay = replayJournalEvents(cwd, {
8
+ includeArchive: !snapshot,
9
+ sinceTs: snapshot?.state.updatedAt ?? snapshot?.writtenAt,
10
+ });
11
+ let state = snapshot?.state
12
+ ? { ...snapshot.state, port, repoRoot: cwd }
13
+ : createEmptyDaemonState(cwd, port);
14
+ const seenEventIds = new Set();
15
+ if (snapshot?.state.lastEventId) {
16
+ seenEventIds.add(snapshot.state.lastEventId);
17
+ }
18
+ for (const event of replay.events) {
19
+ if (seenEventIds.has(event.id)) {
20
+ continue;
21
+ }
22
+ state = reduceDaemonEvent(state, event);
23
+ seenEventIds.add(event.id);
24
+ }
25
+ return {
26
+ state,
27
+ seenEventIds,
28
+ skippedMalformed: replay.skippedMalformed,
29
+ skippedDuplicates: replay.skippedDuplicates,
30
+ };
31
+ }
32
+ export function rebuildStateFromEvents(cwd, port, events) {
33
+ let state = createEmptyDaemonState(cwd, port);
34
+ for (const event of events) {
35
+ state = reduceDaemonEvent(state, event);
36
+ }
37
+ return state;
38
+ }
39
+ //# sourceMappingURL=rebuildState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuildState.js","sourceRoot":"","sources":["../../src/store/rebuildState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAoB,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlD,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY;IACpD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE;QACtC,cAAc,EAAE,CAAC,QAAQ;QACzB,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS;KAC1D,CAAC,CAAC;IACH,IAAI,KAAK,GAAgB,QAAQ,EAAE,KAAK;QACtC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;QAC5C,CAAC,CAAC,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,IAAI,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO;QACL,KAAK;QACL,YAAY;QACZ,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW,EAAE,IAAY,EAAE,MAAqB;IACrF,IAAI,KAAK,GAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function appendDaemonJournal(cwd: string, event: Record<string, unknown>): void;
2
+ //# sourceMappingURL=runJournal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runJournal.d.ts","sourceRoot":"","sources":["../../src/store/runJournal.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUrF"}
@@ -0,0 +1,14 @@
1
+ import { appendFileSync, existsSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export function appendDaemonJournal(cwd, event) {
4
+ const dir = join(cwd, '.codeledger', 'daemon');
5
+ if (!existsSync(dir)) {
6
+ mkdirSync(dir, { recursive: true });
7
+ }
8
+ const path = join(dir, 'journal.jsonl');
9
+ appendFileSync(path, JSON.stringify({
10
+ ts: new Date().toISOString(),
11
+ ...event,
12
+ }) + '\n');
13
+ }
14
+ //# sourceMappingURL=runJournal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runJournal.js","sourceRoot":"","sources":["../../src/store/runJournal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,KAA8B;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACxC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;QAClC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,GAAG,KAAK;KACT,CAAC,GAAG,IAAI,CAAC,CAAC;AACb,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type DaemonState } from './daemonState.js';
2
+ export interface DaemonSnapshotRecord {
3
+ version: number;
4
+ writtenAt: string;
5
+ state: DaemonState;
6
+ }
7
+ export interface SnapshotLoadResult {
8
+ state: DaemonState;
9
+ writtenAt: string;
10
+ }
11
+ export declare function daemonSnapshotsDir(cwd: string): string;
12
+ export declare function loadSnapshot(cwd: string): SnapshotLoadResult | null;
13
+ export declare function writeSnapshot(cwd: string, state: DaemonState, snapshotLimit?: number): void;
14
+ export declare function writeCurrentState(cwd: string, state: DaemonState): void;
15
+ export declare function loadLatestRotatedSnapshot(cwd: string): SnapshotLoadResult | null;
16
+ //# sourceMappingURL=snapshotStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotStore.d.ts","sourceRoot":"","sources":["../../src/store/snapshotStore.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAK/F,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAgBnE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,GAAE,MAAsC,GAAG,IAAI,CAQ1H;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAYvE;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAyBhF"}
@@ -0,0 +1,111 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { daemonDir, daemonPidPath, daemonStatePath } from './daemonState.js';
4
+ const SNAPSHOT_VERSION = 1;
5
+ const DEFAULT_MAX_ROTATED_SNAPSHOTS = 5;
6
+ export function daemonSnapshotsDir(cwd) {
7
+ return join(daemonDir(cwd), 'snapshots');
8
+ }
9
+ export function loadSnapshot(cwd) {
10
+ const latest = loadLatestRotatedSnapshot(cwd);
11
+ if (latest)
12
+ return latest;
13
+ const legacyPath = daemonStatePath(cwd);
14
+ if (!existsSync(legacyPath))
15
+ return null;
16
+ try {
17
+ const state = JSON.parse(readFileSync(legacyPath, 'utf-8'));
18
+ if (!state || typeof state !== 'object')
19
+ return null;
20
+ return {
21
+ state,
22
+ writtenAt: typeof state.updatedAt === 'string' ? state.updatedAt : new Date(0).toISOString(),
23
+ };
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ export function writeSnapshot(cwd, state, snapshotLimit = DEFAULT_MAX_ROTATED_SNAPSHOTS) {
30
+ const dir = daemonDir(cwd);
31
+ if (!existsSync(dir)) {
32
+ mkdirSync(dir, { recursive: true });
33
+ }
34
+ writeCurrentState(cwd, state);
35
+ writeRotatedSnapshot(cwd, state);
36
+ pruneOldSnapshots(cwd, snapshotLimit);
37
+ }
38
+ export function writeCurrentState(cwd, state) {
39
+ const dir = daemonDir(cwd);
40
+ if (!existsSync(dir)) {
41
+ mkdirSync(dir, { recursive: true });
42
+ }
43
+ const target = daemonStatePath(cwd);
44
+ const temp = `${target}.tmp`;
45
+ writeFileSync(temp, JSON.stringify(state, null, 2) + '\n');
46
+ renameSync(temp, target);
47
+ if (state.pid) {
48
+ writeFileSync(daemonPidPath(cwd), `${state.pid}\n`);
49
+ }
50
+ }
51
+ export function loadLatestRotatedSnapshot(cwd) {
52
+ const dir = daemonSnapshotsDir(cwd);
53
+ if (!existsSync(dir))
54
+ return null;
55
+ const files = readdirSync(dir)
56
+ .filter((file) => file.endsWith('.json'))
57
+ .sort()
58
+ .reverse();
59
+ for (const file of files) {
60
+ try {
61
+ const payload = JSON.parse(readFileSync(join(dir, file), 'utf-8'));
62
+ if (payload?.version === SNAPSHOT_VERSION
63
+ && payload.state
64
+ && typeof payload.writtenAt === 'string') {
65
+ return {
66
+ state: payload.state,
67
+ writtenAt: payload.writtenAt,
68
+ };
69
+ }
70
+ }
71
+ catch {
72
+ continue;
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ function writeRotatedSnapshot(cwd, state) {
78
+ const dir = daemonSnapshotsDir(cwd);
79
+ if (!existsSync(dir)) {
80
+ mkdirSync(dir, { recursive: true });
81
+ }
82
+ const writtenAt = new Date().toISOString();
83
+ const record = {
84
+ version: SNAPSHOT_VERSION,
85
+ writtenAt,
86
+ state,
87
+ };
88
+ const safeTs = writtenAt.replace(/[:.]/g, '-');
89
+ const target = join(dir, `snapshot-${safeTs}-e${state.eventCount}.json`);
90
+ const temp = `${target}.tmp`;
91
+ writeFileSync(temp, JSON.stringify(record, null, 2) + '\n');
92
+ renameSync(temp, target);
93
+ }
94
+ function pruneOldSnapshots(cwd, snapshotLimit) {
95
+ const dir = daemonSnapshotsDir(cwd);
96
+ if (!existsSync(dir))
97
+ return;
98
+ const files = readdirSync(dir)
99
+ .filter((file) => file.endsWith('.json'))
100
+ .sort()
101
+ .reverse();
102
+ for (const file of files.slice(Math.max(1, snapshotLimit))) {
103
+ try {
104
+ unlinkSync(join(dir, file));
105
+ }
106
+ catch {
107
+ // ignore best-effort pruning
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=snapshotStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotStore.js","sourceRoot":"","sources":["../../src/store/snapshotStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { WarmBundleEntry } from '../store/daemonState.js';
2
+ export interface WarmBundleAction {
3
+ type: 'reused' | 'warmed';
4
+ entry: WarmBundleEntry;
5
+ }
6
+ export declare function warmBundles(cwd: string, hints: string[], recentBundles: WarmBundleEntry[]): Promise<{
7
+ entries: WarmBundleEntry[];
8
+ actions: WarmBundleAction[];
9
+ }>;
10
+ //# sourceMappingURL=bundleWarmer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundleWarmer.d.ts","sourceRoot":"","sources":["../../src/warmers/bundleWarmer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,EACf,aAAa,EAAE,eAAe,EAAE,GAC/B,OAAO,CAAC;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC,CA6BtE"}
@@ -0,0 +1,36 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { buildBundleArtifact } from '@codeledger/codeledger-runtime';
3
+ export async function warmBundles(cwd, hints, recentBundles) {
4
+ const next = [...recentBundles];
5
+ const actions = [];
6
+ for (const hint of hints.slice(0, 3)) {
7
+ const existing = next.find((entry) => normalize(entry.task) === normalize(hint) && existsSync(entry.bundlePath));
8
+ if (existing) {
9
+ actions.push({ type: 'reused', entry: existing });
10
+ continue;
11
+ }
12
+ const bundle = await buildBundleArtifact({
13
+ cwd,
14
+ task: hint,
15
+ });
16
+ const entry = {
17
+ task: hint,
18
+ bundlePath: bundle.bundlePath,
19
+ bundleId: bundle.bundle.bundle_id,
20
+ generatedAt: bundle.bundle.generated_at,
21
+ confidenceLevel: bundle.bundle.confidence?.level,
22
+ confidenceScore: bundle.bundle.confidence?.score,
23
+ relevantTests: bundle.bundle.files.filter((file) => /(^|\/)(test|tests)\b|\.test\./.test(file.path)).map((file) => file.path),
24
+ };
25
+ next.unshift(entry);
26
+ actions.push({ type: 'warmed', entry });
27
+ }
28
+ return {
29
+ entries: next.slice(0, 5),
30
+ actions,
31
+ };
32
+ }
33
+ function normalize(value) {
34
+ return value.trim().toLowerCase();
35
+ }
36
+ //# sourceMappingURL=bundleWarmer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundleWarmer.js","sourceRoot":"","sources":["../../src/warmers/bundleWarmer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQrE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,KAAe,EACf,aAAgC;IAEhC,MAAM,IAAI,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;IAChC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACjH,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;YACvC,GAAG;YACH,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,MAAM,KAAK,GAAoB;YAC7B,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;YACjC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY;YACvC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK;YAChD,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK;YAChD,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SAC9H,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function warmScan(cwd: string, staleAfterSeconds: number): {
2
+ refreshed: boolean;
3
+ indexPath: string;
4
+ };
5
+ //# sourceMappingURL=scanWarmer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanWarmer.d.ts","sourceRoot":"","sources":["../../src/warmers/scanWarmer.ts"],"names":[],"mappings":"AAEA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAU1G"}