imcodes 2026.4.1838-dev.1819 → 2026.4.1854-dev.1832
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/dist/src/agent/providers/qwen.d.ts +2 -1
- package/dist/src/agent/providers/qwen.d.ts.map +1 -1
- package/dist/src/agent/providers/qwen.js +41 -4
- package/dist/src/agent/providers/qwen.js.map +1 -1
- package/dist/src/daemon/command-handler.js +1 -1
- package/dist/src/daemon/command-handler.js.map +1 -1
- package/dist/src/daemon/lifecycle.d.ts.map +1 -1
- package/dist/src/daemon/lifecycle.js +27 -14
- package/dist/src/daemon/lifecycle.js.map +1 -1
- package/dist/src/daemon/opencode-watcher.js +1 -1
- package/dist/src/daemon/opencode-watcher.js.map +1 -1
- package/dist/src/daemon/subsession-manager.js +1 -1
- package/dist/src/daemon/subsession-manager.js.map +1 -1
- package/dist/src/daemon/timeline-projection-types.d.ts +88 -0
- package/dist/src/daemon/timeline-projection-types.d.ts.map +1 -0
- package/dist/src/daemon/timeline-projection-types.js +2 -0
- package/dist/src/daemon/timeline-projection-types.js.map +1 -0
- package/dist/src/daemon/timeline-projection-worker.d.ts +2 -0
- package/dist/src/daemon/timeline-projection-worker.d.ts.map +1 -0
- package/dist/src/daemon/timeline-projection-worker.js +456 -0
- package/dist/src/daemon/timeline-projection-worker.js.map +1 -0
- package/dist/src/daemon/timeline-projection.d.ts +32 -0
- package/dist/src/daemon/timeline-projection.d.ts.map +1 -0
- package/dist/src/daemon/timeline-projection.js +188 -0
- package/dist/src/daemon/timeline-projection.js.map +1 -0
- package/dist/src/daemon/timeline-store.d.ts +19 -1
- package/dist/src/daemon/timeline-store.d.ts.map +1 -1
- package/dist/src/daemon/timeline-store.js +66 -2
- package/dist/src/daemon/timeline-store.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import { parentPort, workerData } from 'node:worker_threads';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { mkdirSync, statSync, existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
8
|
+
const PROJECTION_VERSION = 1;
|
|
9
|
+
const TIMELINE_DIR = join(homedir(), '.imcodes', 'timeline');
|
|
10
|
+
const dbPath = typeof workerData?.dbPath === 'string' && workerData.dbPath
|
|
11
|
+
? workerData.dbPath
|
|
12
|
+
: join(homedir(), '.imcodes', 'timeline.sqlite');
|
|
13
|
+
let db = null;
|
|
14
|
+
const rebuildPromises = new Map();
|
|
15
|
+
let writesSinceCheckpoint = 0;
|
|
16
|
+
function sessionFilePath(sessionId) {
|
|
17
|
+
const safe = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
18
|
+
return join(TIMELINE_DIR, `${safe}.jsonl`);
|
|
19
|
+
}
|
|
20
|
+
function ensureDb() {
|
|
21
|
+
if (db)
|
|
22
|
+
return db;
|
|
23
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
24
|
+
const instance = new DatabaseSync(dbPath);
|
|
25
|
+
instance.exec(`
|
|
26
|
+
PRAGMA journal_mode = WAL;
|
|
27
|
+
PRAGMA synchronous = NORMAL;
|
|
28
|
+
CREATE TABLE IF NOT EXISTS timeline_projection_events (
|
|
29
|
+
session_id TEXT NOT NULL,
|
|
30
|
+
append_ordinal INTEGER NOT NULL,
|
|
31
|
+
event_id TEXT NOT NULL,
|
|
32
|
+
ts INTEGER NOT NULL,
|
|
33
|
+
seq INTEGER NOT NULL,
|
|
34
|
+
epoch INTEGER NOT NULL,
|
|
35
|
+
type TEXT NOT NULL,
|
|
36
|
+
source TEXT NOT NULL,
|
|
37
|
+
confidence TEXT NOT NULL,
|
|
38
|
+
streaming INTEGER NOT NULL DEFAULT 0,
|
|
39
|
+
hidden INTEGER NOT NULL DEFAULT 0,
|
|
40
|
+
text TEXT,
|
|
41
|
+
payload_json TEXT NOT NULL,
|
|
42
|
+
created_at INTEGER NOT NULL,
|
|
43
|
+
updated_at INTEGER NOT NULL,
|
|
44
|
+
PRIMARY KEY(session_id, append_ordinal)
|
|
45
|
+
);
|
|
46
|
+
CREATE INDEX IF NOT EXISTS idx_timeline_projection_events_session_ts
|
|
47
|
+
ON timeline_projection_events(session_id, ts DESC, append_ordinal DESC);
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_timeline_projection_events_session_type_ts
|
|
49
|
+
ON timeline_projection_events(session_id, type, ts DESC, append_ordinal DESC);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_timeline_projection_events_session_streaming_ts
|
|
51
|
+
ON timeline_projection_events(session_id, streaming, ts DESC, append_ordinal DESC);
|
|
52
|
+
|
|
53
|
+
CREATE TABLE IF NOT EXISTS timeline_projection_sessions (
|
|
54
|
+
session_id TEXT PRIMARY KEY,
|
|
55
|
+
last_projected_append_ordinal INTEGER NOT NULL,
|
|
56
|
+
source_file_size_bytes INTEGER NOT NULL,
|
|
57
|
+
source_file_mtime_ms INTEGER NOT NULL,
|
|
58
|
+
projection_version INTEGER NOT NULL,
|
|
59
|
+
status TEXT NOT NULL,
|
|
60
|
+
last_rebuilt_at INTEGER
|
|
61
|
+
);
|
|
62
|
+
`);
|
|
63
|
+
db = instance;
|
|
64
|
+
return instance;
|
|
65
|
+
}
|
|
66
|
+
function runInTransaction(work) {
|
|
67
|
+
const database = ensureDb();
|
|
68
|
+
database.exec('BEGIN IMMEDIATE');
|
|
69
|
+
try {
|
|
70
|
+
work();
|
|
71
|
+
database.exec('COMMIT');
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
try {
|
|
75
|
+
database.exec('ROLLBACK');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// ignore rollback failures
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function readSessionMeta(sessionId) {
|
|
84
|
+
const row = ensureDb().prepare(`
|
|
85
|
+
SELECT session_id, last_projected_append_ordinal, source_file_size_bytes, source_file_mtime_ms, projection_version, status, last_rebuilt_at
|
|
86
|
+
FROM timeline_projection_sessions
|
|
87
|
+
WHERE session_id = ?
|
|
88
|
+
`).get(sessionId);
|
|
89
|
+
if (!row)
|
|
90
|
+
return null;
|
|
91
|
+
return {
|
|
92
|
+
sessionId: String(row.session_id),
|
|
93
|
+
lastProjectedAppendOrdinal: Number(row.last_projected_append_ordinal),
|
|
94
|
+
sourceFileSizeBytes: Number(row.source_file_size_bytes),
|
|
95
|
+
sourceFileMtimeMs: Number(row.source_file_mtime_ms),
|
|
96
|
+
projectionVersion: Number(row.projection_version),
|
|
97
|
+
status: String(row.status),
|
|
98
|
+
lastRebuiltAt: typeof row.last_rebuilt_at === 'number' ? row.last_rebuilt_at : null,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function upsertSessionMeta(sessionId, meta) {
|
|
102
|
+
ensureDb().prepare(`
|
|
103
|
+
INSERT INTO timeline_projection_sessions (
|
|
104
|
+
session_id, last_projected_append_ordinal, source_file_size_bytes, source_file_mtime_ms, projection_version, status, last_rebuilt_at
|
|
105
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
106
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
107
|
+
last_projected_append_ordinal = excluded.last_projected_append_ordinal,
|
|
108
|
+
source_file_size_bytes = excluded.source_file_size_bytes,
|
|
109
|
+
source_file_mtime_ms = excluded.source_file_mtime_ms,
|
|
110
|
+
projection_version = excluded.projection_version,
|
|
111
|
+
status = excluded.status,
|
|
112
|
+
last_rebuilt_at = excluded.last_rebuilt_at
|
|
113
|
+
`).run(sessionId, meta.lastProjectedAppendOrdinal, meta.sourceFileSizeBytes, meta.sourceFileMtimeMs, PROJECTION_VERSION, meta.status, meta.lastRebuiltAt ?? null);
|
|
114
|
+
}
|
|
115
|
+
function deleteSessionRows(sessionId) {
|
|
116
|
+
const database = ensureDb();
|
|
117
|
+
database.prepare('DELETE FROM timeline_projection_events WHERE session_id = ?').run(sessionId);
|
|
118
|
+
database.prepare('DELETE FROM timeline_projection_sessions WHERE session_id = ?').run(sessionId);
|
|
119
|
+
}
|
|
120
|
+
function currentFileMeta(sessionId) {
|
|
121
|
+
const filePath = sessionFilePath(sessionId);
|
|
122
|
+
if (!existsSync(filePath))
|
|
123
|
+
return { exists: false, size: 0, mtimeMs: 0 };
|
|
124
|
+
const stat = statSync(filePath);
|
|
125
|
+
return { exists: true, size: stat.size, mtimeMs: Math.trunc(stat.mtimeMs) };
|
|
126
|
+
}
|
|
127
|
+
function parseLinesAscending(sessionId) {
|
|
128
|
+
const filePath = sessionFilePath(sessionId);
|
|
129
|
+
if (!existsSync(filePath))
|
|
130
|
+
return [];
|
|
131
|
+
const raw = readFileSync(filePath, 'utf8');
|
|
132
|
+
if (!raw.trim())
|
|
133
|
+
return [];
|
|
134
|
+
const events = [];
|
|
135
|
+
for (const line of raw.split('\n')) {
|
|
136
|
+
if (!line)
|
|
137
|
+
continue;
|
|
138
|
+
try {
|
|
139
|
+
const event = JSON.parse(line);
|
|
140
|
+
if (event.sessionId === sessionId)
|
|
141
|
+
events.push(event);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// preserve JSONL tolerance: corrupt lines are skipped
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return events;
|
|
148
|
+
}
|
|
149
|
+
function extractTextAndStreaming(event) {
|
|
150
|
+
const text = typeof event.payload?.text === 'string' ? event.payload.text : null;
|
|
151
|
+
const streaming = event.payload?.streaming === true ? 1 : 0;
|
|
152
|
+
return { text, streaming };
|
|
153
|
+
}
|
|
154
|
+
function insertProjectedEvent(database, sessionId, appendOrdinal, event) {
|
|
155
|
+
const { text, streaming } = extractTextAndStreaming(event);
|
|
156
|
+
database.prepare(`
|
|
157
|
+
INSERT INTO timeline_projection_events (
|
|
158
|
+
session_id, append_ordinal, event_id, ts, seq, epoch, type, source, confidence, streaming, hidden, text, payload_json, created_at, updated_at
|
|
159
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
160
|
+
`).run(sessionId, appendOrdinal, event.eventId, event.ts, event.seq, event.epoch, event.type, event.source, event.confidence, streaming, event.hidden === true ? 1 : 0, text, JSON.stringify(event.payload), event.ts, Date.now());
|
|
161
|
+
}
|
|
162
|
+
async function rebuildSessionInternal(sessionId) {
|
|
163
|
+
const existing = rebuildPromises.get(sessionId);
|
|
164
|
+
if (existing)
|
|
165
|
+
return existing;
|
|
166
|
+
const promise = Promise.resolve().then(() => {
|
|
167
|
+
const database = ensureDb();
|
|
168
|
+
const fileMeta = currentFileMeta(sessionId);
|
|
169
|
+
if (!fileMeta.exists) {
|
|
170
|
+
deleteSessionRows(sessionId);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
upsertSessionMeta(sessionId, {
|
|
174
|
+
lastProjectedAppendOrdinal: 0,
|
|
175
|
+
sourceFileSizeBytes: fileMeta.size,
|
|
176
|
+
sourceFileMtimeMs: fileMeta.mtimeMs,
|
|
177
|
+
status: 'building',
|
|
178
|
+
lastRebuiltAt: Date.now(),
|
|
179
|
+
});
|
|
180
|
+
const events = parseLinesAscending(sessionId);
|
|
181
|
+
runInTransaction(() => {
|
|
182
|
+
database.prepare('DELETE FROM timeline_projection_events WHERE session_id = ?').run(sessionId);
|
|
183
|
+
let appendOrdinal = 0;
|
|
184
|
+
for (const event of events) {
|
|
185
|
+
appendOrdinal += 1;
|
|
186
|
+
insertProjectedEvent(database, sessionId, appendOrdinal, event);
|
|
187
|
+
}
|
|
188
|
+
upsertSessionMeta(sessionId, {
|
|
189
|
+
lastProjectedAppendOrdinal: appendOrdinal,
|
|
190
|
+
sourceFileSizeBytes: fileMeta.size,
|
|
191
|
+
sourceFileMtimeMs: fileMeta.mtimeMs,
|
|
192
|
+
status: 'ready',
|
|
193
|
+
lastRebuiltAt: Date.now(),
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
writesSinceCheckpoint += Math.max(events.length, 1);
|
|
197
|
+
maybeCheckpoint();
|
|
198
|
+
return true;
|
|
199
|
+
}).finally(() => {
|
|
200
|
+
rebuildPromises.delete(sessionId);
|
|
201
|
+
});
|
|
202
|
+
rebuildPromises.set(sessionId, promise);
|
|
203
|
+
return promise;
|
|
204
|
+
}
|
|
205
|
+
async function ensureFreshSession(sessionId) {
|
|
206
|
+
const meta = readSessionMeta(sessionId);
|
|
207
|
+
const fileMeta = currentFileMeta(sessionId);
|
|
208
|
+
if (!fileMeta.exists) {
|
|
209
|
+
deleteSessionRows(sessionId);
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
if (!meta) {
|
|
213
|
+
await rebuildSessionInternal(sessionId);
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
if (meta.status !== 'ready'
|
|
217
|
+
|| meta.projectionVersion !== PROJECTION_VERSION
|
|
218
|
+
|| meta.sourceFileSizeBytes !== fileMeta.size
|
|
219
|
+
|| meta.sourceFileMtimeMs !== fileMeta.mtimeMs) {
|
|
220
|
+
upsertSessionMeta(sessionId, {
|
|
221
|
+
lastProjectedAppendOrdinal: meta.lastProjectedAppendOrdinal,
|
|
222
|
+
sourceFileSizeBytes: fileMeta.size,
|
|
223
|
+
sourceFileMtimeMs: fileMeta.mtimeMs,
|
|
224
|
+
status: 'stale',
|
|
225
|
+
lastRebuiltAt: meta.lastRebuiltAt,
|
|
226
|
+
});
|
|
227
|
+
await rebuildSessionInternal(sessionId);
|
|
228
|
+
}
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
function rowToEvent(row) {
|
|
232
|
+
const payload = JSON.parse(String(row.payload_json));
|
|
233
|
+
return {
|
|
234
|
+
eventId: String(row.event_id),
|
|
235
|
+
sessionId: String(row.session_id),
|
|
236
|
+
ts: Number(row.ts),
|
|
237
|
+
seq: Number(row.seq),
|
|
238
|
+
epoch: Number(row.epoch),
|
|
239
|
+
source: String(row.source),
|
|
240
|
+
confidence: String(row.confidence),
|
|
241
|
+
type: String(row.type),
|
|
242
|
+
payload,
|
|
243
|
+
...(Number(row.hidden) === 1 ? { hidden: true } : {}),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
function maybeCheckpoint() {
|
|
247
|
+
if (writesSinceCheckpoint < 256)
|
|
248
|
+
return;
|
|
249
|
+
writesSinceCheckpoint = 0;
|
|
250
|
+
ensureDb().exec('PRAGMA wal_checkpoint(TRUNCATE);');
|
|
251
|
+
}
|
|
252
|
+
async function handleRecordAppendedEvent(event) {
|
|
253
|
+
const fileMeta = currentFileMeta(event.sessionId);
|
|
254
|
+
if (!fileMeta.exists)
|
|
255
|
+
return false;
|
|
256
|
+
const meta = readSessionMeta(event.sessionId);
|
|
257
|
+
const serializedEvent = JSON.stringify(event) + '\n';
|
|
258
|
+
const appendedBytes = Buffer.byteLength(serializedEvent);
|
|
259
|
+
if (!meta
|
|
260
|
+
|| meta.status !== 'ready'
|
|
261
|
+
|| meta.projectionVersion !== PROJECTION_VERSION
|
|
262
|
+
|| fileMeta.size !== meta.sourceFileSizeBytes + appendedBytes
|
|
263
|
+
|| fileMeta.mtimeMs < meta.sourceFileMtimeMs) {
|
|
264
|
+
await rebuildSessionInternal(event.sessionId);
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
const database = ensureDb();
|
|
268
|
+
const nextOrdinal = (meta?.lastProjectedAppendOrdinal ?? 0) + 1;
|
|
269
|
+
runInTransaction(() => {
|
|
270
|
+
insertProjectedEvent(database, event.sessionId, nextOrdinal, event);
|
|
271
|
+
upsertSessionMeta(event.sessionId, {
|
|
272
|
+
lastProjectedAppendOrdinal: nextOrdinal,
|
|
273
|
+
sourceFileSizeBytes: fileMeta.size,
|
|
274
|
+
sourceFileMtimeMs: fileMeta.mtimeMs,
|
|
275
|
+
status: 'ready',
|
|
276
|
+
lastRebuiltAt: meta?.lastRebuiltAt ?? null,
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
writesSinceCheckpoint += 1;
|
|
280
|
+
maybeCheckpoint();
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
function buildRangeSql(base, afterTs, beforeTs) {
|
|
284
|
+
const clauses = [base];
|
|
285
|
+
const params = [];
|
|
286
|
+
if (afterTs !== undefined) {
|
|
287
|
+
clauses.push('AND ts > ?');
|
|
288
|
+
params.push(afterTs);
|
|
289
|
+
}
|
|
290
|
+
if (beforeTs !== undefined) {
|
|
291
|
+
clauses.push('AND ts < ?');
|
|
292
|
+
params.push(beforeTs);
|
|
293
|
+
}
|
|
294
|
+
return { sql: clauses.join(' '), params };
|
|
295
|
+
}
|
|
296
|
+
async function handleQueryHistory(sessionId, afterTs, beforeTs, limit = 500) {
|
|
297
|
+
const fresh = await ensureFreshSession(sessionId);
|
|
298
|
+
if (!fresh)
|
|
299
|
+
return { source: 'sqlite', events: [] };
|
|
300
|
+
const boundedLimit = Math.max(1, Math.min(limit, 10_000));
|
|
301
|
+
const { sql, params } = buildRangeSql('SELECT * FROM timeline_projection_events WHERE session_id = ?', afterTs, beforeTs);
|
|
302
|
+
const rows = ensureDb().prepare(`${sql} ORDER BY ts DESC, append_ordinal DESC LIMIT ?`).all(...[sessionId, ...params, boundedLimit]);
|
|
303
|
+
return { source: 'sqlite', events: rows.reverse().map(rowToEvent) };
|
|
304
|
+
}
|
|
305
|
+
async function handleQueryLatest(sessionId) {
|
|
306
|
+
const fresh = await ensureFreshSession(sessionId);
|
|
307
|
+
if (!fresh)
|
|
308
|
+
return null;
|
|
309
|
+
const row = ensureDb().prepare(`
|
|
310
|
+
SELECT epoch, seq
|
|
311
|
+
FROM timeline_projection_events
|
|
312
|
+
WHERE session_id = ?
|
|
313
|
+
ORDER BY append_ordinal DESC
|
|
314
|
+
LIMIT 1
|
|
315
|
+
`).get(sessionId);
|
|
316
|
+
if (!row)
|
|
317
|
+
return null;
|
|
318
|
+
return { epoch: Number(row.epoch), seq: Number(row.seq) };
|
|
319
|
+
}
|
|
320
|
+
async function handleQueryCompletedTextTail(sessionId, limit = 50) {
|
|
321
|
+
const fresh = await ensureFreshSession(sessionId);
|
|
322
|
+
if (!fresh)
|
|
323
|
+
return { source: 'sqlite', events: [] };
|
|
324
|
+
const boundedLimit = Math.max(1, Math.min(limit, 500));
|
|
325
|
+
const rows = ensureDb().prepare(`
|
|
326
|
+
SELECT *
|
|
327
|
+
FROM timeline_projection_events
|
|
328
|
+
WHERE session_id = ?
|
|
329
|
+
AND (
|
|
330
|
+
(type = 'user.message' AND text IS NOT NULL AND trim(text) <> '')
|
|
331
|
+
OR
|
|
332
|
+
(type = 'assistant.text' AND streaming = 0 AND text IS NOT NULL AND trim(text) <> '')
|
|
333
|
+
)
|
|
334
|
+
ORDER BY ts DESC, append_ordinal DESC
|
|
335
|
+
LIMIT ?
|
|
336
|
+
`).all(sessionId, boundedLimit);
|
|
337
|
+
return { source: 'sqlite', events: rows.reverse().map(rowToEvent) };
|
|
338
|
+
}
|
|
339
|
+
async function handleQueryByTypes(sessionId, types, afterTs, beforeTs, limit = 500) {
|
|
340
|
+
const fresh = await ensureFreshSession(sessionId);
|
|
341
|
+
if (!fresh)
|
|
342
|
+
return { source: 'sqlite', events: [] };
|
|
343
|
+
if (types.length === 0)
|
|
344
|
+
return { source: 'sqlite', events: [] };
|
|
345
|
+
const boundedLimit = Math.max(1, Math.min(limit, 10_000));
|
|
346
|
+
const placeholders = types.map(() => '?').join(', ');
|
|
347
|
+
const { sql, params } = buildRangeSql(`SELECT * FROM timeline_projection_events WHERE session_id = ? AND type IN (${placeholders})`, afterTs, beforeTs);
|
|
348
|
+
const rows = ensureDb().prepare(`${sql} ORDER BY ts DESC, append_ordinal DESC LIMIT ?`)
|
|
349
|
+
.all(...[sessionId, ...types, ...params, boundedLimit]);
|
|
350
|
+
return { source: 'sqlite', events: rows.reverse().map(rowToEvent) };
|
|
351
|
+
}
|
|
352
|
+
async function handlePruneSessionToAuthoritative(sessionId, keepLast) {
|
|
353
|
+
const database = ensureDb();
|
|
354
|
+
const boundedKeep = Math.max(1, keepLast);
|
|
355
|
+
database.prepare(`
|
|
356
|
+
DELETE FROM timeline_projection_events
|
|
357
|
+
WHERE session_id = ?
|
|
358
|
+
AND append_ordinal NOT IN (
|
|
359
|
+
SELECT append_ordinal
|
|
360
|
+
FROM timeline_projection_events
|
|
361
|
+
WHERE session_id = ?
|
|
362
|
+
ORDER BY append_ordinal DESC
|
|
363
|
+
LIMIT ?
|
|
364
|
+
)
|
|
365
|
+
`).run(sessionId, sessionId, boundedKeep);
|
|
366
|
+
const meta = readSessionMeta(sessionId);
|
|
367
|
+
if (meta) {
|
|
368
|
+
const fileMeta = currentFileMeta(sessionId);
|
|
369
|
+
const latestRow = database.prepare(`
|
|
370
|
+
SELECT append_ordinal
|
|
371
|
+
FROM timeline_projection_events
|
|
372
|
+
WHERE session_id = ?
|
|
373
|
+
ORDER BY append_ordinal DESC
|
|
374
|
+
LIMIT 1
|
|
375
|
+
`).get(sessionId);
|
|
376
|
+
upsertSessionMeta(sessionId, {
|
|
377
|
+
lastProjectedAppendOrdinal: latestRow ? Number(latestRow.append_ordinal) : 0,
|
|
378
|
+
sourceFileSizeBytes: fileMeta.size,
|
|
379
|
+
sourceFileMtimeMs: fileMeta.mtimeMs,
|
|
380
|
+
status: fileMeta.exists ? 'ready' : 'missing',
|
|
381
|
+
lastRebuiltAt: meta.lastRebuiltAt,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
writesSinceCheckpoint += 1;
|
|
385
|
+
maybeCheckpoint();
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
async function handleDeleteSession(sessionId) {
|
|
389
|
+
deleteSessionRows(sessionId);
|
|
390
|
+
writesSinceCheckpoint += 1;
|
|
391
|
+
maybeCheckpoint();
|
|
392
|
+
return true;
|
|
393
|
+
}
|
|
394
|
+
async function handleCheckpointIfNeeded() {
|
|
395
|
+
maybeCheckpoint();
|
|
396
|
+
return true;
|
|
397
|
+
}
|
|
398
|
+
async function handleShutdown() {
|
|
399
|
+
parentPort?.close();
|
|
400
|
+
return true;
|
|
401
|
+
}
|
|
402
|
+
async function handleRequest(message) {
|
|
403
|
+
switch (message.type) {
|
|
404
|
+
case 'recordAppendedEvent':
|
|
405
|
+
return handleRecordAppendedEvent(message.payload.event);
|
|
406
|
+
case 'queryHistory':
|
|
407
|
+
return handleQueryHistory(message.payload.sessionId, message.payload.afterTs, message.payload.beforeTs, message.payload.limit);
|
|
408
|
+
case 'queryLatest':
|
|
409
|
+
return handleQueryLatest(message.payload.sessionId);
|
|
410
|
+
case 'queryCompletedTextTail':
|
|
411
|
+
return handleQueryCompletedTextTail(message.payload.sessionId, message.payload.limit);
|
|
412
|
+
case 'queryByTypes':
|
|
413
|
+
return handleQueryByTypes(message.payload.sessionId, message.payload.types, message.payload.afterTs, message.payload.beforeTs, message.payload.limit);
|
|
414
|
+
case 'rebuildSession': {
|
|
415
|
+
const existing = rebuildPromises.get(message.payload.sessionId);
|
|
416
|
+
if (existing)
|
|
417
|
+
return existing;
|
|
418
|
+
try {
|
|
419
|
+
return rebuildSessionInternal(message.payload.sessionId);
|
|
420
|
+
}
|
|
421
|
+
catch (result) {
|
|
422
|
+
if (result instanceof Promise)
|
|
423
|
+
return result;
|
|
424
|
+
throw result;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
case 'pruneSessionToAuthoritative':
|
|
428
|
+
return handlePruneSessionToAuthoritative(message.payload.sessionId, message.payload.keepLast);
|
|
429
|
+
case 'deleteSession':
|
|
430
|
+
return handleDeleteSession(message.payload.sessionId);
|
|
431
|
+
case 'checkpointIfNeeded':
|
|
432
|
+
return handleCheckpointIfNeeded();
|
|
433
|
+
case 'shutdown':
|
|
434
|
+
return handleShutdown();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
if (!parentPort) {
|
|
438
|
+
throw new Error('timeline-projection-worker requires parentPort');
|
|
439
|
+
}
|
|
440
|
+
parentPort.on('message', async (message) => {
|
|
441
|
+
try {
|
|
442
|
+
const result = await handleRequest(message);
|
|
443
|
+
const response = { id: message.id, type: message.type, ok: true, result };
|
|
444
|
+
parentPort?.postMessage(response);
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
const response = {
|
|
448
|
+
id: message.id,
|
|
449
|
+
type: message.type,
|
|
450
|
+
ok: false,
|
|
451
|
+
error: err instanceof Error ? err.message : String(err),
|
|
452
|
+
};
|
|
453
|
+
parentPort?.postMessage(response);
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
//# sourceMappingURL=timeline-projection-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-projection-worker.js","sourceRoot":"","sources":["../../../src/daemon/timeline-projection-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { TimelineEvent } from './timeline-event.js';
|
|
2
|
+
import type { ProjectionSessionMeta, ProjectionWorkerRequestMap, TimelineProjectionQuery } from './timeline-projection-types.js';
|
|
3
|
+
export type TimelineProjectionQueryOpts = Omit<TimelineProjectionQuery, 'sessionId' | 'types'>;
|
|
4
|
+
export interface TimelineProjectionLatest {
|
|
5
|
+
epoch: number;
|
|
6
|
+
seq: number;
|
|
7
|
+
}
|
|
8
|
+
export type TimelineProjectionStatus = 'missing' | 'building' | 'ready' | 'stale' | 'corrupt';
|
|
9
|
+
declare class TimelineProjectionClient {
|
|
10
|
+
private worker;
|
|
11
|
+
private nextId;
|
|
12
|
+
private readonly pending;
|
|
13
|
+
private permanentlyDisabled;
|
|
14
|
+
private ensureWorker;
|
|
15
|
+
private handleWorkerMessage;
|
|
16
|
+
private failAllPending;
|
|
17
|
+
private request;
|
|
18
|
+
recordAppendedEvent(event: TimelineEvent): Promise<void>;
|
|
19
|
+
queryHistory(query: ProjectionWorkerRequestMap['queryHistory']): Promise<TimelineEvent[] | null>;
|
|
20
|
+
queryLatest(sessionId: string): Promise<TimelineProjectionLatest | null>;
|
|
21
|
+
getLatest(sessionId: string): Promise<TimelineProjectionLatest | null>;
|
|
22
|
+
queryCompletedTextTail(sessionId: string, limit?: number): Promise<TimelineEvent[] | null>;
|
|
23
|
+
queryByTypes(query: ProjectionWorkerRequestMap['queryByTypes']): Promise<TimelineEvent[] | null>;
|
|
24
|
+
rebuildSession(sessionId: string): Promise<boolean>;
|
|
25
|
+
pruneSessionToAuthoritative(sessionId: string, keepLast?: number): Promise<void>;
|
|
26
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
27
|
+
checkpointIfNeeded(): Promise<void>;
|
|
28
|
+
shutdown(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
export declare const timelineProjection: TimelineProjectionClient;
|
|
31
|
+
export type { ProjectionSessionMeta, };
|
|
32
|
+
//# sourceMappingURL=timeline-projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-projection.d.ts","sourceRoot":"","sources":["../../../src/daemon/timeline-projection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EACV,qBAAqB,EAErB,0BAA0B,EAG1B,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,uBAAuB,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC;AAE/F,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAgB9F,cAAM,wBAAwB;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAInB;IACL,OAAO,CAAC,mBAAmB,CAAS;IAEpC,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,OAAO;IAeT,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD,YAAY,CAAC,KAAK,EAAE,0BAA0B,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC;IAUhG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IASxE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAItE,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC;IAUtF,YAAY,CAAC,KAAK,EAAE,0BAA0B,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC;IAUhG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9E,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQnC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYhC;AAED,eAAO,MAAM,kBAAkB,0BAAiC,CAAC;AAEjE,YAAY,EACV,qBAAqB,GACtB,CAAC"}
|