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.
Files changed (30) hide show
  1. package/dist/src/agent/providers/qwen.d.ts +2 -1
  2. package/dist/src/agent/providers/qwen.d.ts.map +1 -1
  3. package/dist/src/agent/providers/qwen.js +41 -4
  4. package/dist/src/agent/providers/qwen.js.map +1 -1
  5. package/dist/src/daemon/command-handler.js +1 -1
  6. package/dist/src/daemon/command-handler.js.map +1 -1
  7. package/dist/src/daemon/lifecycle.d.ts.map +1 -1
  8. package/dist/src/daemon/lifecycle.js +27 -14
  9. package/dist/src/daemon/lifecycle.js.map +1 -1
  10. package/dist/src/daemon/opencode-watcher.js +1 -1
  11. package/dist/src/daemon/opencode-watcher.js.map +1 -1
  12. package/dist/src/daemon/subsession-manager.js +1 -1
  13. package/dist/src/daemon/subsession-manager.js.map +1 -1
  14. package/dist/src/daemon/timeline-projection-types.d.ts +88 -0
  15. package/dist/src/daemon/timeline-projection-types.d.ts.map +1 -0
  16. package/dist/src/daemon/timeline-projection-types.js +2 -0
  17. package/dist/src/daemon/timeline-projection-types.js.map +1 -0
  18. package/dist/src/daemon/timeline-projection-worker.d.ts +2 -0
  19. package/dist/src/daemon/timeline-projection-worker.d.ts.map +1 -0
  20. package/dist/src/daemon/timeline-projection-worker.js +456 -0
  21. package/dist/src/daemon/timeline-projection-worker.js.map +1 -0
  22. package/dist/src/daemon/timeline-projection.d.ts +32 -0
  23. package/dist/src/daemon/timeline-projection.d.ts.map +1 -0
  24. package/dist/src/daemon/timeline-projection.js +188 -0
  25. package/dist/src/daemon/timeline-projection.js.map +1 -0
  26. package/dist/src/daemon/timeline-store.d.ts +19 -1
  27. package/dist/src/daemon/timeline-store.d.ts.map +1 -1
  28. package/dist/src/daemon/timeline-store.js +66 -2
  29. package/dist/src/daemon/timeline-store.js.map +1 -1
  30. package/package.json +1 -1
@@ -0,0 +1,188 @@
1
+ import { Worker } from 'node:worker_threads';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { extname, join } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import logger from '../util/logger.js';
6
+ const DEFAULT_QUERY_TIMEOUT_MS = 75;
7
+ const DEFAULT_WRITE_TIMEOUT_MS = 2_000;
8
+ function getProjectionDbPath() {
9
+ return process.env.IMCODES_TIMELINE_PROJECTION_DB_PATH?.trim()
10
+ || join(homedir(), '.imcodes', 'timeline.sqlite');
11
+ }
12
+ function getWorkerModuleUrl() {
13
+ const selfPath = fileURLToPath(import.meta.url);
14
+ const ext = extname(selfPath);
15
+ return new URL(ext === '.ts' ? './timeline-projection-worker.ts' : './timeline-projection-worker.js', import.meta.url);
16
+ }
17
+ class TimelineProjectionClient {
18
+ worker = null;
19
+ nextId = 1;
20
+ pending = new Map();
21
+ permanentlyDisabled = false;
22
+ ensureWorker() {
23
+ if (this.permanentlyDisabled)
24
+ return null;
25
+ if (this.worker)
26
+ return this.worker;
27
+ try {
28
+ const worker = new Worker(getWorkerModuleUrl(), {
29
+ workerData: { dbPath: getProjectionDbPath() },
30
+ });
31
+ worker.unref();
32
+ worker.on('message', (message) => this.handleWorkerMessage(message));
33
+ worker.on('error', (err) => {
34
+ logger.warn({ err }, 'TimelineProjection: worker failed');
35
+ this.failAllPending(err instanceof Error ? err : new Error(String(err)));
36
+ this.worker = null;
37
+ this.permanentlyDisabled = true;
38
+ });
39
+ worker.on('exit', (code) => {
40
+ if (code !== 0) {
41
+ logger.warn({ code }, 'TimelineProjection: worker exited unexpectedly');
42
+ }
43
+ this.failAllPending(new Error(`timeline_projection_worker_exit:${code}`));
44
+ this.worker = null;
45
+ if (code !== 0)
46
+ this.permanentlyDisabled = true;
47
+ });
48
+ this.worker = worker;
49
+ return worker;
50
+ }
51
+ catch (err) {
52
+ logger.warn({ err }, 'TimelineProjection: failed to start worker');
53
+ this.permanentlyDisabled = true;
54
+ return null;
55
+ }
56
+ }
57
+ handleWorkerMessage(message) {
58
+ const pending = this.pending.get(message.id);
59
+ if (!pending)
60
+ return;
61
+ this.pending.delete(message.id);
62
+ if (pending.timer)
63
+ clearTimeout(pending.timer);
64
+ if (message.ok)
65
+ pending.resolve(message.result);
66
+ else
67
+ pending.reject(new Error(message.error));
68
+ }
69
+ failAllPending(err) {
70
+ for (const [id, pending] of this.pending) {
71
+ this.pending.delete(id);
72
+ if (pending.timer)
73
+ clearTimeout(pending.timer);
74
+ pending.reject(err);
75
+ }
76
+ }
77
+ request(type, payload, timeoutMs) {
78
+ const worker = this.ensureWorker();
79
+ if (!worker)
80
+ return Promise.reject(new Error('timeline_projection_unavailable'));
81
+ const id = this.nextId++;
82
+ return new Promise((resolve, reject) => {
83
+ const timer = timeoutMs > 0 ? setTimeout(() => {
84
+ this.pending.delete(id);
85
+ reject(new Error(`timeline_projection_timeout:${type}`));
86
+ }, timeoutMs) : undefined;
87
+ this.pending.set(id, { resolve: resolve, reject, timer });
88
+ const request = { id, type, payload };
89
+ worker.postMessage(request);
90
+ });
91
+ }
92
+ async recordAppendedEvent(event) {
93
+ await this.request('recordAppendedEvent', { event }, DEFAULT_WRITE_TIMEOUT_MS).catch((err) => {
94
+ logger.debug({ err, sessionId: event.sessionId, eventId: event.eventId }, 'TimelineProjection: recordAppendedEvent failed');
95
+ });
96
+ }
97
+ async queryHistory(query) {
98
+ try {
99
+ const result = await this.request('queryHistory', query, DEFAULT_QUERY_TIMEOUT_MS);
100
+ return result.events;
101
+ }
102
+ catch (err) {
103
+ logger.debug({ err, sessionId: query.sessionId }, 'TimelineProjection: queryHistory fallback to JSONL');
104
+ return null;
105
+ }
106
+ }
107
+ async queryLatest(sessionId) {
108
+ try {
109
+ return await this.request('queryLatest', { sessionId }, DEFAULT_QUERY_TIMEOUT_MS);
110
+ }
111
+ catch (err) {
112
+ logger.debug({ err, sessionId }, 'TimelineProjection: queryLatest fallback to JSONL');
113
+ return null;
114
+ }
115
+ }
116
+ async getLatest(sessionId) {
117
+ return this.queryLatest(sessionId);
118
+ }
119
+ async queryCompletedTextTail(sessionId, limit = 50) {
120
+ try {
121
+ const result = await this.request('queryCompletedTextTail', { sessionId, limit }, DEFAULT_QUERY_TIMEOUT_MS);
122
+ return result.events;
123
+ }
124
+ catch (err) {
125
+ logger.debug({ err, sessionId }, 'TimelineProjection: queryCompletedTextTail fallback to JSONL');
126
+ return null;
127
+ }
128
+ }
129
+ async queryByTypes(query) {
130
+ try {
131
+ const result = await this.request('queryByTypes', query, DEFAULT_QUERY_TIMEOUT_MS);
132
+ return result.events;
133
+ }
134
+ catch (err) {
135
+ logger.debug({ err, sessionId: query.sessionId, types: query.types }, 'TimelineProjection: queryByTypes fallback to JSONL');
136
+ return null;
137
+ }
138
+ }
139
+ async rebuildSession(sessionId) {
140
+ try {
141
+ return await this.request('rebuildSession', { sessionId }, DEFAULT_WRITE_TIMEOUT_MS);
142
+ }
143
+ catch (err) {
144
+ logger.debug({ err, sessionId }, 'TimelineProjection: rebuildSession failed');
145
+ return false;
146
+ }
147
+ }
148
+ async pruneSessionToAuthoritative(sessionId, keepLast = 5000) {
149
+ try {
150
+ await this.request('pruneSessionToAuthoritative', { sessionId, keepLast }, DEFAULT_WRITE_TIMEOUT_MS);
151
+ }
152
+ catch (err) {
153
+ logger.debug({ err, sessionId, keepLast }, 'TimelineProjection: pruneSessionToAuthoritative failed');
154
+ }
155
+ }
156
+ async deleteSession(sessionId) {
157
+ try {
158
+ await this.request('deleteSession', { sessionId }, DEFAULT_WRITE_TIMEOUT_MS);
159
+ }
160
+ catch (err) {
161
+ logger.debug({ err, sessionId }, 'TimelineProjection: deleteSession failed');
162
+ }
163
+ }
164
+ async checkpointIfNeeded() {
165
+ try {
166
+ await this.request('checkpointIfNeeded', {}, DEFAULT_WRITE_TIMEOUT_MS);
167
+ }
168
+ catch (err) {
169
+ logger.debug({ err }, 'TimelineProjection: checkpointIfNeeded failed');
170
+ }
171
+ }
172
+ async shutdown() {
173
+ const worker = this.worker;
174
+ this.worker = null;
175
+ if (!worker)
176
+ return;
177
+ this.failAllPending(new Error('timeline_projection_shutdown'));
178
+ try {
179
+ await worker.terminate();
180
+ }
181
+ catch (err) {
182
+ logger.debug({ err }, 'TimelineProjection: worker terminate failed');
183
+ }
184
+ this.permanentlyDisabled = false;
185
+ }
186
+ }
187
+ export const timelineProjection = new TimelineProjectionClient();
188
+ //# sourceMappingURL=timeline-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-projection.js","sourceRoot":"","sources":["../../../src/daemon/timeline-projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAmBvC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AACpC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC,SAAS,mBAAmB;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,IAAI,EAAE;WACzD,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,OAAO,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzH,CAAC;AAED,MAAM,wBAAwB;IACpB,MAAM,GAAkB,IAAI,CAAC;IAC7B,MAAM,GAAG,CAAC,CAAC;IACF,OAAO,GAAG,IAAI,GAAG,EAI9B,CAAC;IACG,mBAAmB,GAAG,KAAK,CAAC;IAE5B,YAAY;QAClB,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE,EAAE;gBAC9C,UAAU,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE;aAC9C,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAiC,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/F,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,mCAAmC,CAAC,CAAC;gBAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,gDAAgD,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC1E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,IAAI,KAAK,CAAC;oBAAE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClD,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,4CAA4C,CAAC,CAAC;YACnE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,OAAiC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,OAAO,CAAC,KAAK;YAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;YAC3C,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAEO,cAAc,CAAC,GAAU;QAC/B,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,OAAO,CAAC,KAAK;gBAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/C,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,OAAO,CAA6C,IAAS,EAAE,OAAwC,EAAE,SAAiB;QAChI,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACjF,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;gBAC5C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAmC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtF,MAAM,OAAO,GAAkC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACrE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,KAAoB;QAC5C,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,EAAE,wBAAwB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3F,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,gDAAgD,CAAC,CAAC;QAC9H,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAiD;QAClE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAgE,cAAc,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC;YAClJ,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,oDAAoD,CAAC,CAAC;YACxG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAiD,aAAa,EAAE,EAAE,SAAS,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACpI,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,mDAAmD,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,SAAiB,EAAE,KAAK,GAAG,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAA0E,wBAAwB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,wBAAwB,CAAC,CAAC;YACrL,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,8DAA8D,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAiD;QAClE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAgE,cAAc,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC;YAClJ,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,oDAAoD,CAAC,CAAC;YAC5H,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAA4B,gBAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAClH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,2CAA2C,CAAC,CAAC;YAC9E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,2BAA2B,CAAC,SAAiB,EAAE,QAAQ,GAAG,IAAI;QAClE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACvG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,wDAAwD,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,0CAA0C,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,+CAA+C,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,6CAA6C,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACnC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,wBAAwB,EAAE,CAAC"}
@@ -4,10 +4,17 @@
4
4
  * Storage: ~/.imcodes/timeline/{sessionName}.jsonl
5
5
  */
6
6
  import type { TimelineEvent } from './timeline-event.js';
7
+ import { type TimelineProjectionQueryOpts } from './timeline-projection.js';
8
+ export declare const TIMELINE_DIR: string;
9
+ /**
10
+ * Read the last N lines from a file by reading backward from the end in chunks.
11
+ * Much faster than readFileSync + split for large files when only tail is needed.
12
+ */
13
+ export declare function readTailLines(filePath: string, maxLines: number): string[];
7
14
  declare class TimelineStore {
8
15
  private initialized;
9
16
  private ensureDir;
10
- private filePath;
17
+ filePath(sessionName: string): string;
11
18
  /** Append a single event to the session's JSONL file. */
12
19
  append(event: TimelineEvent): void;
13
20
  /**
@@ -24,6 +31,13 @@ declare class TimelineStore {
24
31
  beforeTs?: number;
25
32
  limit?: number;
26
33
  }): TimelineEvent[];
34
+ readPreferred(sessionName: string, opts?: {
35
+ afterTs?: number;
36
+ beforeTs?: number;
37
+ limit?: number;
38
+ }): Promise<TimelineEvent[]>;
39
+ readByTypesPreferred(sessionName: string, types: TimelineEvent['type'][], opts?: TimelineProjectionQueryOpts): Promise<TimelineEvent[]>;
40
+ readCompletedTextTail(sessionName: string, limit?: number): Promise<TimelineEvent[]>;
27
41
  /**
28
42
  * Get the latest epoch and seq for a session (from the last line).
29
43
  */
@@ -31,6 +45,10 @@ declare class TimelineStore {
31
45
  epoch: number;
32
46
  seq: number;
33
47
  } | null;
48
+ getLatestPreferred(sessionName: string): Promise<{
49
+ epoch: number;
50
+ seq: number;
51
+ } | null>;
34
52
  /**
35
53
  * Truncate old events from a session file, keeping only the last N events.
36
54
  */
@@ -1 +1 @@
1
- {"version":3,"file":"timeline-store.d.ts","sourceRoot":"","sources":["../../../src/daemon/timeline-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAuDzD,cAAM,aAAa;IACjB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,QAAQ;IAMhB,yDAAyD;IACzD,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IASlC;;;;;;OAMG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,EAAE;IA0B7I;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAYrE;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,SAAsB,GAAG,IAAI;IAcnE;;;OAGG;IACH,WAAW,IAAI,IAAI;IAanB;;OAEG;IACH,OAAO,IAAI,IAAI;CAmBhB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"timeline-store.d.ts","sourceRoot":"","sources":["../../../src/daemon/timeline-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAsB,KAAK,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEhG,eAAO,MAAM,YAAY,QAA0C,CAAC;AAIpE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0C1E;AAED,cAAM,aAAa;IACjB,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,SAAS;IAQjB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAMrC,yDAAyD;IACzD,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAYlC;;;;;;OAMG;IACH,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,EAAE;IA0BvI,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,aAAa,EAAE,CAAC;IAWrB,oBAAoB,CACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAC9B,IAAI,CAAC,EAAE,2BAA2B,GACjC,OAAO,CAAC,aAAa,EAAE,CAAC;IAYrB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgBtF;;OAEG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAY/D,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAU7F;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,SAAsB,GAAG,IAAI;IAiBnE;;;OAGG;IACH,WAAW,IAAI,IAAI;IAanB;;OAEG;IACH,OAAO,IAAI,IAAI;CA0BhB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -7,14 +7,15 @@ import { mkdirSync, appendFileSync, writeFileSync, readdirSync, statSync, unlink
7
7
  import { join } from 'path';
8
8
  import { homedir } from 'os';
9
9
  import logger from '../util/logger.js';
10
- const TIMELINE_DIR = join(homedir(), '.imcodes', 'timeline');
10
+ import { timelineProjection } from './timeline-projection.js';
11
+ export const TIMELINE_DIR = join(homedir(), '.imcodes', 'timeline');
11
12
  const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
12
13
  const MAX_EVENTS_PER_FILE = 5000;
13
14
  /**
14
15
  * Read the last N lines from a file by reading backward from the end in chunks.
15
16
  * Much faster than readFileSync + split for large files when only tail is needed.
16
17
  */
17
- function readTailLines(filePath, maxLines) {
18
+ export function readTailLines(filePath, maxLines) {
18
19
  let fd;
19
20
  try {
20
21
  fd = openSync(filePath, 'r');
@@ -79,6 +80,9 @@ class TimelineStore {
79
80
  this.ensureDir();
80
81
  try {
81
82
  appendFileSync(this.filePath(event.sessionId), JSON.stringify(event) + '\n');
83
+ void timelineProjection.recordAppendedEvent(event).catch((err) => {
84
+ logger.debug({ err, sessionId: event.sessionId, eventId: event.eventId }, 'TimelineProjection: append mirror failed');
85
+ });
82
86
  }
83
87
  catch (err) {
84
88
  logger.debug({ err, sessionId: event.sessionId }, 'TimelineStore: append failed');
@@ -120,6 +124,45 @@ class TimelineStore {
120
124
  }
121
125
  return events.reverse(); // restore ts order
122
126
  }
127
+ async readPreferred(sessionName, opts) {
128
+ const projected = await timelineProjection.queryHistory({
129
+ sessionId: sessionName,
130
+ afterTs: opts?.afterTs,
131
+ beforeTs: opts?.beforeTs,
132
+ limit: opts?.limit,
133
+ });
134
+ if (projected)
135
+ return projected;
136
+ return this.read(sessionName, opts);
137
+ }
138
+ async readByTypesPreferred(sessionName, types, opts) {
139
+ const projected = await timelineProjection.queryByTypes({
140
+ sessionId: sessionName,
141
+ types,
142
+ afterTs: opts?.afterTs,
143
+ beforeTs: opts?.beforeTs,
144
+ limit: opts?.limit,
145
+ });
146
+ if (projected)
147
+ return projected;
148
+ return this.read(sessionName, opts).filter((event) => types.includes(event.type));
149
+ }
150
+ async readCompletedTextTail(sessionName, limit = 50) {
151
+ const projected = await timelineProjection.queryCompletedTextTail(sessionName, limit);
152
+ if (projected)
153
+ return projected;
154
+ return this.read(sessionName, { limit: Math.max(limit * 6, 500) }).filter((event) => {
155
+ if (event.type === 'user.message') {
156
+ return typeof event.payload?.text === 'string' && event.payload.text.trim().length > 0;
157
+ }
158
+ if (event.type === 'assistant.text') {
159
+ return event.payload?.streaming !== true
160
+ && typeof event.payload?.text === 'string'
161
+ && event.payload.text.trim().length > 0;
162
+ }
163
+ return false;
164
+ }).slice(-limit);
165
+ }
123
166
  /**
124
167
  * Get the latest epoch and seq for a session (from the last line).
125
168
  */
@@ -135,6 +178,17 @@ class TimelineStore {
135
178
  }
136
179
  return null;
137
180
  }
181
+ async getLatestPreferred(sessionName) {
182
+ try {
183
+ const projected = await timelineProjection.getLatest(sessionName);
184
+ if (projected)
185
+ return projected;
186
+ }
187
+ catch {
188
+ // fall through to JSONL
189
+ }
190
+ return this.getLatest(sessionName);
191
+ }
138
192
  /**
139
193
  * Truncate old events from a session file, keeping only the last N events.
140
194
  */
@@ -146,6 +200,9 @@ class TimelineStore {
146
200
  const kept = newestFirst.slice(0, keepLast).reverse();
147
201
  try {
148
202
  writeFileSync(filePath, kept.join('\n') + '\n');
203
+ void timelineProjection.pruneSessionToAuthoritative(sessionName, keepLast).catch((err) => {
204
+ logger.debug({ err, sessionName }, 'TimelineProjection: prune after truncate failed');
205
+ });
149
206
  logger.info({ sessionName, after: kept.length }, 'TimelineStore: truncated');
150
207
  }
151
208
  catch (err) {
@@ -185,6 +242,10 @@ class TimelineStore {
185
242
  const stat = statSync(fullPath);
186
243
  if (now - stat.mtimeMs > MAX_AGE_MS) {
187
244
  unlinkSync(fullPath);
245
+ const sessionName = file.replace('.jsonl', '');
246
+ void timelineProjection.deleteSession(sessionName).catch((err) => {
247
+ logger.debug({ err, sessionName }, 'TimelineProjection: delete after cleanup failed');
248
+ });
188
249
  logger.info({ file }, 'TimelineStore: deleted old file');
189
250
  }
190
251
  }
@@ -194,6 +255,9 @@ class TimelineStore {
194
255
  catch (err) {
195
256
  logger.debug({ err }, 'TimelineStore: cleanup failed');
196
257
  }
258
+ void timelineProjection.checkpointIfNeeded().catch((err) => {
259
+ logger.debug({ err }, 'TimelineProjection: cleanup checkpoint failed');
260
+ });
197
261
  }
198
262
  }
199
263
  export const timelineStore = new TimelineStore();
@@ -1 +1 @@
1
- {"version":3,"file":"timeline-store.js","sourceRoot":"","sources":["../../../src/daemon/timeline-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timeline-store.js","sourceRoot":"","sources":["../../../src/daemon/timeline-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "imcodes",
3
- "version": "2026.4.1838-dev.1819",
3
+ "version": "2026.4.1854-dev.1832",
4
4
  "description": "A chat interface for AI coding agents — control Claude Code, Codex, Gemini CLI, OpenCode from browser and mobile",
5
5
  "license": "MIT",
6
6
  "repository": {