@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.
- package/LICENSE +27 -0
- package/dist/api/server.d.ts +4 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +69 -0
- package/dist/api/server.js.map +1 -0
- package/dist/daemon.d.ts +12 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +316 -0
- package/dist/daemon.js.map +1 -0
- package/dist/events/appendEvent.d.ts +9 -0
- package/dist/events/appendEvent.d.ts.map +1 -0
- package/dist/events/appendEvent.js +14 -0
- package/dist/events/appendEvent.js.map +1 -0
- package/dist/events/eventConsumer.d.ts +13 -0
- package/dist/events/eventConsumer.d.ts.map +1 -0
- package/dist/events/eventConsumer.js +42 -0
- package/dist/events/eventConsumer.js.map +1 -0
- package/dist/events/eventReducer.d.ts +4 -0
- package/dist/events/eventReducer.d.ts.map +1 -0
- package/dist/events/eventReducer.js +185 -0
- package/dist/events/eventReducer.js.map +1 -0
- package/dist/events/eventTypes.d.ts +31 -0
- package/dist/events/eventTypes.d.ts.map +1 -0
- package/dist/events/eventTypes.js +15 -0
- package/dist/events/eventTypes.js.map +1 -0
- package/dist/health/heartbeat.d.ts +9 -0
- package/dist/health/heartbeat.d.ts.map +1 -0
- package/dist/health/heartbeat.js +8 -0
- package/dist/health/heartbeat.js.map +1 -0
- package/dist/health/status.d.ts +4 -0
- package/dist/health/status.d.ts.map +1 -0
- package/dist/health/status.js +46 -0
- package/dist/health/status.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/fileIpcTransport.d.ts +4 -0
- package/dist/ipc/fileIpcTransport.d.ts.map +1 -0
- package/dist/ipc/fileIpcTransport.js +64 -0
- package/dist/ipc/fileIpcTransport.js.map +1 -0
- package/dist/ipc/transport.d.ts +21 -0
- package/dist/ipc/transport.d.ts.map +1 -0
- package/dist/ipc/transport.js +2 -0
- package/dist/ipc/transport.js.map +1 -0
- package/dist/ipc/transportSelector.d.ts +6 -0
- package/dist/ipc/transportSelector.d.ts.map +1 -0
- package/dist/ipc/transportSelector.js +17 -0
- package/dist/ipc/transportSelector.js.map +1 -0
- package/dist/ipc/unixSocketTransport.d.ts +3 -0
- package/dist/ipc/unixSocketTransport.d.ts.map +1 -0
- package/dist/ipc/unixSocketTransport.js +81 -0
- package/dist/ipc/unixSocketTransport.js.map +1 -0
- package/dist/signals/taskHintDetector.d.ts +2 -0
- package/dist/signals/taskHintDetector.d.ts.map +1 -0
- package/dist/signals/taskHintDetector.js +29 -0
- package/dist/signals/taskHintDetector.js.map +1 -0
- package/dist/store/daemonState.d.ts +79 -0
- package/dist/store/daemonState.d.ts.map +1 -0
- package/dist/store/daemonState.js +83 -0
- package/dist/store/daemonState.js.map +1 -0
- package/dist/store/eventJournal.d.ts +12 -0
- package/dist/store/eventJournal.d.ts.map +1 -0
- package/dist/store/eventJournal.js +105 -0
- package/dist/store/eventJournal.js.map +1 -0
- package/dist/store/rebuildState.d.ts +11 -0
- package/dist/store/rebuildState.d.ts.map +1 -0
- package/dist/store/rebuildState.js +39 -0
- package/dist/store/rebuildState.js.map +1 -0
- package/dist/store/runJournal.d.ts +2 -0
- package/dist/store/runJournal.d.ts.map +1 -0
- package/dist/store/runJournal.js +14 -0
- package/dist/store/runJournal.js.map +1 -0
- package/dist/store/snapshotStore.d.ts +16 -0
- package/dist/store/snapshotStore.d.ts.map +1 -0
- package/dist/store/snapshotStore.js +111 -0
- package/dist/store/snapshotStore.js.map +1 -0
- package/dist/warmers/bundleWarmer.d.ts +10 -0
- package/dist/warmers/bundleWarmer.d.ts.map +1 -0
- package/dist/warmers/bundleWarmer.js +36 -0
- package/dist/warmers/bundleWarmer.js.map +1 -0
- package/dist/warmers/scanWarmer.d.ts +5 -0
- package/dist/warmers/scanWarmer.d.ts.map +1 -0
- package/dist/warmers/scanWarmer.js +13 -0
- package/dist/warmers/scanWarmer.js.map +1 -0
- package/dist/watchers/fileWatcher.d.ts +2 -0
- package/dist/watchers/fileWatcher.d.ts.map +1 -0
- package/dist/watchers/fileWatcher.js +24 -0
- package/dist/watchers/fileWatcher.js.map +1 -0
- package/dist/watchers/gitWatcher.d.ts +8 -0
- package/dist/watchers/gitWatcher.d.ts.map +1 -0
- package/dist/watchers/gitWatcher.js +47 -0
- package/dist/watchers/gitWatcher.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|