homaruscc 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +307 -0
  4. package/bin/event-loop +60 -0
  5. package/config.example.json +55 -0
  6. package/dist/agent-registry.d.ts +38 -0
  7. package/dist/agent-registry.d.ts.map +1 -0
  8. package/dist/agent-registry.js +207 -0
  9. package/dist/agent-registry.js.map +1 -0
  10. package/dist/backend.d.ts +3 -0
  11. package/dist/backend.d.ts.map +1 -0
  12. package/dist/backend.js +59 -0
  13. package/dist/backend.js.map +1 -0
  14. package/dist/browser-service.d.ts +19 -0
  15. package/dist/browser-service.d.ts.map +1 -0
  16. package/dist/browser-service.js +101 -0
  17. package/dist/browser-service.js.map +1 -0
  18. package/dist/channel-adapter.d.ts +22 -0
  19. package/dist/channel-adapter.d.ts.map +1 -0
  20. package/dist/channel-adapter.js +62 -0
  21. package/dist/channel-adapter.js.map +1 -0
  22. package/dist/channel-manager.d.ts +18 -0
  23. package/dist/channel-manager.d.ts.map +1 -0
  24. package/dist/channel-manager.js +73 -0
  25. package/dist/channel-manager.js.map +1 -0
  26. package/dist/compaction-manager.d.ts +23 -0
  27. package/dist/compaction-manager.d.ts.map +1 -0
  28. package/dist/compaction-manager.js +135 -0
  29. package/dist/compaction-manager.js.map +1 -0
  30. package/dist/config.d.ts +21 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +169 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/dashboard-adapter.d.ts +17 -0
  35. package/dist/dashboard-adapter.d.ts.map +1 -0
  36. package/dist/dashboard-adapter.js +41 -0
  37. package/dist/dashboard-adapter.js.map +1 -0
  38. package/dist/dashboard-server.d.ts +29 -0
  39. package/dist/dashboard-server.d.ts.map +1 -0
  40. package/dist/dashboard-server.js +381 -0
  41. package/dist/dashboard-server.js.map +1 -0
  42. package/dist/embedding-provider.d.ts +28 -0
  43. package/dist/embedding-provider.d.ts.map +1 -0
  44. package/dist/embedding-provider.js +91 -0
  45. package/dist/embedding-provider.js.map +1 -0
  46. package/dist/event-bus.d.ts +18 -0
  47. package/dist/event-bus.d.ts.map +1 -0
  48. package/dist/event-bus.js +41 -0
  49. package/dist/event-bus.js.map +1 -0
  50. package/dist/event-queue.d.ts +18 -0
  51. package/dist/event-queue.d.ts.map +1 -0
  52. package/dist/event-queue.js +68 -0
  53. package/dist/event-queue.js.map +1 -0
  54. package/dist/homaruscc.d.ts +69 -0
  55. package/dist/homaruscc.d.ts.map +1 -0
  56. package/dist/homaruscc.js +337 -0
  57. package/dist/homaruscc.js.map +1 -0
  58. package/dist/identity-manager.d.ts +36 -0
  59. package/dist/identity-manager.d.ts.map +1 -0
  60. package/dist/identity-manager.js +142 -0
  61. package/dist/identity-manager.js.map +1 -0
  62. package/dist/mcp-proxy.d.ts +3 -0
  63. package/dist/mcp-proxy.d.ts.map +1 -0
  64. package/dist/mcp-proxy.js +259 -0
  65. package/dist/mcp-proxy.js.map +1 -0
  66. package/dist/mcp-resources.d.ts +10 -0
  67. package/dist/mcp-resources.d.ts.map +1 -0
  68. package/dist/mcp-resources.js +67 -0
  69. package/dist/mcp-resources.js.map +1 -0
  70. package/dist/mcp-server.d.ts +3 -0
  71. package/dist/mcp-server.d.ts.map +1 -0
  72. package/dist/mcp-server.js +169 -0
  73. package/dist/mcp-server.js.map +1 -0
  74. package/dist/mcp-tools.d.ts +14 -0
  75. package/dist/mcp-tools.d.ts.map +1 -0
  76. package/dist/mcp-tools.js +408 -0
  77. package/dist/mcp-tools.js.map +1 -0
  78. package/dist/memory-index.d.ts +79 -0
  79. package/dist/memory-index.d.ts.map +1 -0
  80. package/dist/memory-index.js +437 -0
  81. package/dist/memory-index.js.map +1 -0
  82. package/dist/session-checkpoint.d.ts +22 -0
  83. package/dist/session-checkpoint.d.ts.map +1 -0
  84. package/dist/session-checkpoint.js +100 -0
  85. package/dist/session-checkpoint.js.map +1 -0
  86. package/dist/skill-manager.d.ts +26 -0
  87. package/dist/skill-manager.d.ts.map +1 -0
  88. package/dist/skill-manager.js +156 -0
  89. package/dist/skill-manager.js.map +1 -0
  90. package/dist/skill-transport.d.ts +45 -0
  91. package/dist/skill-transport.d.ts.map +1 -0
  92. package/dist/skill-transport.js +111 -0
  93. package/dist/skill-transport.js.map +1 -0
  94. package/dist/skill.d.ts +22 -0
  95. package/dist/skill.d.ts.map +1 -0
  96. package/dist/skill.js +106 -0
  97. package/dist/skill.js.map +1 -0
  98. package/dist/telegram-adapter.d.ts +43 -0
  99. package/dist/telegram-adapter.d.ts.map +1 -0
  100. package/dist/telegram-adapter.js +188 -0
  101. package/dist/telegram-adapter.js.map +1 -0
  102. package/dist/timer-service.d.ts +30 -0
  103. package/dist/timer-service.d.ts.map +1 -0
  104. package/dist/timer-service.js +176 -0
  105. package/dist/timer-service.js.map +1 -0
  106. package/dist/tool-registry.d.ts +30 -0
  107. package/dist/tool-registry.d.ts.map +1 -0
  108. package/dist/tool-registry.js +108 -0
  109. package/dist/tool-registry.js.map +1 -0
  110. package/dist/tools/bash.d.ts +3 -0
  111. package/dist/tools/bash.d.ts.map +1 -0
  112. package/dist/tools/bash.js +67 -0
  113. package/dist/tools/bash.js.map +1 -0
  114. package/dist/tools/browser.d.ts +4 -0
  115. package/dist/tools/browser.d.ts.map +1 -0
  116. package/dist/tools/browser.js +138 -0
  117. package/dist/tools/browser.js.map +1 -0
  118. package/dist/tools/edit.d.ts +3 -0
  119. package/dist/tools/edit.d.ts.map +1 -0
  120. package/dist/tools/edit.js +47 -0
  121. package/dist/tools/edit.js.map +1 -0
  122. package/dist/tools/git.d.ts +3 -0
  123. package/dist/tools/git.d.ts.map +1 -0
  124. package/dist/tools/git.js +105 -0
  125. package/dist/tools/git.js.map +1 -0
  126. package/dist/tools/glob.d.ts +3 -0
  127. package/dist/tools/glob.d.ts.map +1 -0
  128. package/dist/tools/glob.js +84 -0
  129. package/dist/tools/glob.js.map +1 -0
  130. package/dist/tools/grep.d.ts +3 -0
  131. package/dist/tools/grep.d.ts.map +1 -0
  132. package/dist/tools/grep.js +168 -0
  133. package/dist/tools/grep.js.map +1 -0
  134. package/dist/tools/index.d.ts +6 -0
  135. package/dist/tools/index.d.ts.map +1 -0
  136. package/dist/tools/index.js +46 -0
  137. package/dist/tools/index.js.map +1 -0
  138. package/dist/tools/memory.d.ts +4 -0
  139. package/dist/tools/memory.d.ts.map +1 -0
  140. package/dist/tools/memory.js +64 -0
  141. package/dist/tools/memory.js.map +1 -0
  142. package/dist/tools/read.d.ts +3 -0
  143. package/dist/tools/read.d.ts.map +1 -0
  144. package/dist/tools/read.js +50 -0
  145. package/dist/tools/read.js.map +1 -0
  146. package/dist/tools/web-fetch.d.ts +3 -0
  147. package/dist/tools/web-fetch.d.ts.map +1 -0
  148. package/dist/tools/web-fetch.js +51 -0
  149. package/dist/tools/web-fetch.js.map +1 -0
  150. package/dist/tools/web-search.d.ts +3 -0
  151. package/dist/tools/web-search.d.ts.map +1 -0
  152. package/dist/tools/web-search.js +65 -0
  153. package/dist/tools/web-search.js.map +1 -0
  154. package/dist/tools/write.d.ts +3 -0
  155. package/dist/tools/write.d.ts.map +1 -0
  156. package/dist/tools/write.js +32 -0
  157. package/dist/tools/write.js.map +1 -0
  158. package/dist/transcript-logger.d.ts +23 -0
  159. package/dist/transcript-logger.d.ts.map +1 -0
  160. package/dist/transcript-logger.js +101 -0
  161. package/dist/transcript-logger.js.map +1 -0
  162. package/dist/types.d.ts +190 -0
  163. package/dist/types.d.ts.map +1 -0
  164. package/dist/types.js +14 -0
  165. package/dist/types.js.map +1 -0
  166. package/identity.example/disagreements.md +9 -0
  167. package/identity.example/preferences.md +11 -0
  168. package/identity.example/soul.md +12 -0
  169. package/identity.example/state.md +21 -0
  170. package/identity.example/user.md +14 -0
  171. package/package.json +60 -0
@@ -0,0 +1,79 @@
1
+ import type { Logger, MemoryConfig } from "./types.js";
2
+ export interface SearchResult {
3
+ path: string;
4
+ content: string;
5
+ score: number;
6
+ chunkIndex: number;
7
+ }
8
+ export interface SearchOptions {
9
+ limit?: number;
10
+ minScore?: number;
11
+ paths?: string[];
12
+ }
13
+ export interface EmbeddingProvider {
14
+ embed(text: string): Promise<number[]>;
15
+ embedBatch(texts: string[]): Promise<number[][]>;
16
+ dimensions(): number;
17
+ }
18
+ export declare class MemoryIndex {
19
+ private db;
20
+ private embeddingProvider;
21
+ private chunkSize;
22
+ private chunkOverlap;
23
+ private vectorWeight;
24
+ private ftsWeight;
25
+ private decayEnabled;
26
+ private decayHalfLifeDays;
27
+ private evergreenPatterns;
28
+ private dreamPatterns;
29
+ private dreamHalfLifeDays;
30
+ private dreamBaseWeight;
31
+ private mmrEnabled;
32
+ private mmrLambda;
33
+ private indexedPaths;
34
+ private watcher;
35
+ private logger;
36
+ private initialized;
37
+ constructor(logger: Logger, options?: {
38
+ chunkSize?: number;
39
+ chunkOverlap?: number;
40
+ vectorWeight?: number;
41
+ ftsWeight?: number;
42
+ decayEnabled?: boolean;
43
+ decayHalfLifeDays?: number;
44
+ evergreenPatterns?: string[];
45
+ dreamPatterns?: string[];
46
+ dreamHalfLifeDays?: number;
47
+ dreamBaseWeight?: number;
48
+ mmrEnabled?: boolean;
49
+ mmrLambda?: number;
50
+ });
51
+ setEmbeddingProvider(provider: EmbeddingProvider): void;
52
+ setDecayConfig(config: NonNullable<MemoryConfig["decay"]>): void;
53
+ setDreamConfig(config: NonNullable<MemoryConfig["dreams"]>): void;
54
+ setSearchConfig(config: NonNullable<MemoryConfig["search"]>): void;
55
+ initialize(dbPath: string): Promise<void>;
56
+ indexFile(path: string): Promise<void>;
57
+ indexDirectory(dirPath: string): Promise<void>;
58
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
59
+ get(path: string): string | undefined;
60
+ store(content: string, path: string): Promise<void>;
61
+ startWatching(): void;
62
+ stopWatching(): void;
63
+ getRecentPaths(limit?: number): string[];
64
+ getStats(): {
65
+ fileCount: number;
66
+ chunkCount: number;
67
+ indexedPaths: string[];
68
+ };
69
+ private mmrRerank;
70
+ private chunkSimilarity;
71
+ private cosineSimilarity;
72
+ private jaccardSimilarity;
73
+ private computeDecay;
74
+ private isEvergreen;
75
+ private isDreamContent;
76
+ private chunkContent;
77
+ private findMarkdownFiles;
78
+ }
79
+ //# sourceMappingURL=memory-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-index.d.ts","sourceRoot":"","sources":["../src/memory-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,437 @@
1
+ // CRC: crc-MemoryIndex.md | Seq: seq-memory-search.md
2
+ // Memory index with hybrid vector+FTS search — from HomarUS
3
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from "node:fs";
4
+ import { join, dirname, extname } from "node:path";
5
+ import { watch } from "node:fs";
6
+ // R82-R89: Temporal decay on search results
7
+ // R115-R117, R123: Dream-aware scoring
8
+ const DEFAULT_EVERGREEN_PATTERNS = ["MEMORY.md", "SOUL.md", "USER.md"];
9
+ const DEFAULT_DREAM_PATTERNS = ["dreams/"];
10
+ const MS_PER_DAY = 86_400_000;
11
+ export class MemoryIndex {
12
+ db = null;
13
+ embeddingProvider = null;
14
+ chunkSize;
15
+ chunkOverlap;
16
+ vectorWeight;
17
+ ftsWeight;
18
+ decayEnabled;
19
+ decayHalfLifeDays;
20
+ evergreenPatterns;
21
+ dreamPatterns;
22
+ dreamHalfLifeDays;
23
+ dreamBaseWeight;
24
+ mmrEnabled;
25
+ mmrLambda;
26
+ indexedPaths = [];
27
+ watcher = null;
28
+ logger;
29
+ initialized = false;
30
+ constructor(logger, options) {
31
+ this.logger = logger;
32
+ this.chunkSize = options?.chunkSize ?? 400;
33
+ this.chunkOverlap = options?.chunkOverlap ?? 80;
34
+ this.vectorWeight = options?.vectorWeight ?? 0.7;
35
+ this.ftsWeight = options?.ftsWeight ?? 0.3;
36
+ this.decayEnabled = options?.decayEnabled ?? true;
37
+ this.decayHalfLifeDays = options?.decayHalfLifeDays ?? 30;
38
+ this.evergreenPatterns = options?.evergreenPatterns ?? DEFAULT_EVERGREEN_PATTERNS;
39
+ this.dreamPatterns = options?.dreamPatterns ?? DEFAULT_DREAM_PATTERNS;
40
+ this.dreamHalfLifeDays = options?.dreamHalfLifeDays ?? 7;
41
+ this.dreamBaseWeight = options?.dreamBaseWeight ?? 0.5;
42
+ this.mmrEnabled = options?.mmrEnabled ?? true;
43
+ this.mmrLambda = options?.mmrLambda ?? 0.7;
44
+ }
45
+ setEmbeddingProvider(provider) {
46
+ this.embeddingProvider = provider;
47
+ }
48
+ // CRC: crc-MemoryIndex.md | R86
49
+ setDecayConfig(config) {
50
+ if (config.enabled !== undefined)
51
+ this.decayEnabled = config.enabled;
52
+ if (config.halfLifeDays !== undefined)
53
+ this.decayHalfLifeDays = config.halfLifeDays;
54
+ if (config.evergreenPatterns !== undefined)
55
+ this.evergreenPatterns = config.evergreenPatterns;
56
+ }
57
+ // CRC: crc-DreamScoring.md | R115, R116, R117, R123
58
+ setDreamConfig(config) {
59
+ if (config.halfLifeDays !== undefined)
60
+ this.dreamHalfLifeDays = config.halfLifeDays;
61
+ if (config.baseWeight !== undefined)
62
+ this.dreamBaseWeight = config.baseWeight;
63
+ if (config.patterns !== undefined)
64
+ this.dreamPatterns = config.patterns;
65
+ }
66
+ // CRC: crc-MemoryIndex.md | R92, R93
67
+ setSearchConfig(config) {
68
+ if (config.vectorWeight !== undefined)
69
+ this.vectorWeight = config.vectorWeight;
70
+ if (config.ftsWeight !== undefined)
71
+ this.ftsWeight = config.ftsWeight;
72
+ if (config.mmrEnabled !== undefined)
73
+ this.mmrEnabled = config.mmrEnabled;
74
+ if (config.mmrLambda !== undefined)
75
+ this.mmrLambda = config.mmrLambda;
76
+ }
77
+ async initialize(dbPath) {
78
+ const Database = (await import("better-sqlite3")).default;
79
+ this.db = new Database(dbPath);
80
+ const db = this.db;
81
+ db.pragma("journal_mode = WAL");
82
+ try {
83
+ const sqliteVec = await import("sqlite-vec");
84
+ sqliteVec.load(db);
85
+ }
86
+ catch {
87
+ this.logger.warn("sqlite-vec not available, vector search disabled");
88
+ }
89
+ db.exec(`
90
+ CREATE TABLE IF NOT EXISTS chunks (
91
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
92
+ path TEXT NOT NULL,
93
+ chunk_index INTEGER NOT NULL,
94
+ content TEXT NOT NULL,
95
+ updated_at INTEGER NOT NULL,
96
+ UNIQUE(path, chunk_index)
97
+ );
98
+ CREATE INDEX IF NOT EXISTS idx_chunks_path ON chunks(path);
99
+ `);
100
+ db.exec(`
101
+ CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(
102
+ content, content='chunks', content_rowid='id'
103
+ );
104
+ `);
105
+ db.exec(`
106
+ CREATE TRIGGER IF NOT EXISTS chunks_ai AFTER INSERT ON chunks BEGIN
107
+ INSERT INTO chunks_fts(rowid, content) VALUES (new.id, new.content);
108
+ END;
109
+ CREATE TRIGGER IF NOT EXISTS chunks_ad AFTER DELETE ON chunks BEGIN
110
+ INSERT INTO chunks_fts(chunks_fts, rowid, content) VALUES('delete', old.id, old.content);
111
+ END;
112
+ CREATE TRIGGER IF NOT EXISTS chunks_au AFTER UPDATE ON chunks BEGIN
113
+ INSERT INTO chunks_fts(chunks_fts, rowid, content) VALUES('delete', old.id, old.content);
114
+ INSERT INTO chunks_fts(rowid, content) VALUES (new.id, new.content);
115
+ END;
116
+ `);
117
+ try {
118
+ const dims = this.embeddingProvider?.dimensions() ?? 768;
119
+ db.exec(`
120
+ CREATE VIRTUAL TABLE IF NOT EXISTS chunks_vec USING vec0(
121
+ chunk_id INTEGER PRIMARY KEY,
122
+ embedding float[${dims}]
123
+ );
124
+ `);
125
+ }
126
+ catch {
127
+ this.logger.debug("Vector table creation skipped");
128
+ }
129
+ this.initialized = true;
130
+ this.logger.info("Memory index initialized", { dbPath });
131
+ }
132
+ async indexFile(path) {
133
+ if (!this.initialized || !this.db)
134
+ return;
135
+ if (!existsSync(path))
136
+ return;
137
+ const content = readFileSync(path, "utf-8");
138
+ const chunks = this.chunkContent(content, path);
139
+ const db = this.db;
140
+ const now = Date.now();
141
+ db.prepare("DELETE FROM chunks WHERE path = ?").run(path);
142
+ const insert = db.prepare("INSERT INTO chunks (path, chunk_index, content, updated_at) VALUES (?, ?, ?, ?)");
143
+ const insertMany = db.transaction((items) => {
144
+ for (const chunk of items) {
145
+ insert.run(chunk.path, chunk.index, chunk.content, now);
146
+ }
147
+ });
148
+ insertMany(chunks);
149
+ if (this.embeddingProvider) {
150
+ try {
151
+ const texts = chunks.map((c) => c.content);
152
+ const embeddings = await this.embeddingProvider.embedBatch(texts);
153
+ const rows = db.prepare("SELECT id FROM chunks WHERE path = ? ORDER BY chunk_index").all(path);
154
+ const insertVec = db.prepare("INSERT OR REPLACE INTO chunks_vec (chunk_id, embedding) VALUES (CAST(? AS INTEGER), ?)");
155
+ const insertVecs = db.transaction(() => {
156
+ for (let i = 0; i < rows.length && i < embeddings.length; i++) {
157
+ const embBuf = new Uint8Array(new Float32Array(embeddings[i]).buffer);
158
+ insertVec.run(rows[i].id, embBuf);
159
+ }
160
+ });
161
+ insertVecs();
162
+ }
163
+ catch (err) {
164
+ this.logger.warn("Failed to generate embeddings", { path, error: String(err) });
165
+ }
166
+ }
167
+ this.logger.debug("Indexed file", { path, chunks: chunks.length });
168
+ }
169
+ async indexDirectory(dirPath) {
170
+ if (!existsSync(dirPath))
171
+ return;
172
+ const files = this.findMarkdownFiles(dirPath);
173
+ for (const file of files) {
174
+ await this.indexFile(file);
175
+ }
176
+ if (!this.indexedPaths.includes(dirPath)) {
177
+ this.indexedPaths.push(dirPath);
178
+ }
179
+ this.logger.info("Indexed directory", { path: dirPath, files: files.length });
180
+ }
181
+ async search(query, options) {
182
+ if (!this.initialized || !this.db)
183
+ return [];
184
+ const db = this.db;
185
+ const limit = options?.limit ?? 10;
186
+ const minScore = options?.minScore ?? 0.1;
187
+ const results = new Map();
188
+ try {
189
+ const ftsResults = db.prepare(`
190
+ SELECT c.id, c.path, c.content, c.chunk_index, c.updated_at,
191
+ bm25(chunks_fts) AS rank
192
+ FROM chunks_fts f
193
+ JOIN chunks c ON c.id = f.rowid
194
+ WHERE chunks_fts MATCH ?
195
+ ORDER BY rank
196
+ LIMIT ?
197
+ `).all(query, limit * 2);
198
+ const maxRank = ftsResults.length > 0 ? Math.max(...ftsResults.map((r) => Math.abs(r.rank))) : 1;
199
+ for (const row of ftsResults) {
200
+ const normalizedScore = maxRank > 0 ? Math.abs(row.rank) / maxRank : 0;
201
+ results.set(row.id, {
202
+ path: row.path,
203
+ content: row.content,
204
+ score: normalizedScore * this.ftsWeight,
205
+ chunkIndex: row.chunk_index,
206
+ updatedAt: row.updated_at,
207
+ });
208
+ }
209
+ }
210
+ catch {
211
+ // FTS query may fail on certain inputs
212
+ }
213
+ if (this.embeddingProvider) {
214
+ try {
215
+ const queryEmb = await this.embeddingProvider.embed(query);
216
+ const vecResults = db.prepare(`
217
+ SELECT chunk_id, distance
218
+ FROM chunks_vec
219
+ WHERE embedding MATCH ?
220
+ ORDER BY distance
221
+ LIMIT ?
222
+ `).all(new Uint8Array(new Float32Array(queryEmb).buffer), limit * 2);
223
+ for (const row of vecResults) {
224
+ const similarity = 1 - row.distance;
225
+ const existing = results.get(row.chunk_id);
226
+ if (existing) {
227
+ existing.score += similarity * this.vectorWeight;
228
+ }
229
+ else {
230
+ const chunk = db.prepare("SELECT path, content, chunk_index, updated_at FROM chunks WHERE id = ?")
231
+ .get(row.chunk_id);
232
+ if (chunk) {
233
+ results.set(row.chunk_id, {
234
+ path: chunk.path,
235
+ content: chunk.content,
236
+ score: similarity * this.vectorWeight,
237
+ chunkIndex: chunk.chunk_index,
238
+ updatedAt: chunk.updated_at,
239
+ });
240
+ }
241
+ }
242
+ }
243
+ }
244
+ catch (err) {
245
+ this.logger.debug("Vector search failed", { error: String(err) });
246
+ }
247
+ }
248
+ // CRC: crc-MemoryIndex.md | R82, R87
249
+ if (this.decayEnabled) {
250
+ for (const result of results.values()) {
251
+ result.score *= this.computeDecay(result.updatedAt, result.path);
252
+ }
253
+ }
254
+ // CRC: crc-DreamScoring.md | R115
255
+ for (const result of results.values()) {
256
+ if (this.isDreamContent(result.path)) {
257
+ result.score *= this.dreamBaseWeight;
258
+ }
259
+ }
260
+ const candidates = [...results.entries()]
261
+ .filter(([, r]) => r.score >= minScore)
262
+ .sort(([, a], [, b]) => b.score - a.score);
263
+ // CRC: crc-MemoryIndex.md | R90, R96
264
+ if (this.mmrEnabled && candidates.length > 1) {
265
+ return this.mmrRerank(candidates, limit, db);
266
+ }
267
+ return candidates.slice(0, limit).map(([, r]) => r);
268
+ }
269
+ get(path) {
270
+ if (!existsSync(path))
271
+ return undefined;
272
+ return readFileSync(path, "utf-8");
273
+ }
274
+ async store(content, path) {
275
+ const dir = dirname(path);
276
+ if (!existsSync(dir))
277
+ mkdirSync(dir, { recursive: true });
278
+ writeFileSync(path, content);
279
+ await this.indexFile(path);
280
+ }
281
+ startWatching() {
282
+ if (this.watcher)
283
+ return;
284
+ for (const dir of this.indexedPaths) {
285
+ this.watcher = watch(dir, { recursive: true }, (_eventType, filename) => {
286
+ if (!filename || !filename.endsWith(".md"))
287
+ return;
288
+ const fullPath = join(dir, filename);
289
+ this.indexFile(fullPath).catch((err) => {
290
+ this.logger.warn("Reindex failed", { path: fullPath, error: String(err) });
291
+ });
292
+ });
293
+ }
294
+ }
295
+ stopWatching() {
296
+ this.watcher?.close();
297
+ this.watcher = null;
298
+ }
299
+ getRecentPaths(limit = 10) {
300
+ if (!this.initialized || !this.db)
301
+ return [];
302
+ const db = this.db;
303
+ const rows = db.prepare("SELECT DISTINCT path FROM chunks ORDER BY updated_at DESC LIMIT ?").all(limit);
304
+ return rows.map((r) => r.path);
305
+ }
306
+ getStats() {
307
+ if (!this.initialized || !this.db) {
308
+ return { fileCount: 0, chunkCount: 0, indexedPaths: this.indexedPaths };
309
+ }
310
+ const db = this.db;
311
+ const fileCount = db.prepare("SELECT COUNT(DISTINCT path) AS c FROM chunks").get().c;
312
+ const chunkCount = db.prepare("SELECT COUNT(*) AS c FROM chunks").get().c;
313
+ return { fileCount, chunkCount, indexedPaths: this.indexedPaths };
314
+ }
315
+ // CRC: crc-MemoryIndex.md | R90, R91
316
+ mmrRerank(candidates, limit, db) {
317
+ const selected = [];
318
+ const remaining = new Map(candidates);
319
+ // Pre-fetch embeddings for MMR similarity if available
320
+ const embeddingCache = new Map();
321
+ if (this.embeddingProvider) {
322
+ try {
323
+ for (const [id] of candidates) {
324
+ const row = db.prepare("SELECT embedding FROM chunks_vec WHERE chunk_id = ?").get(id);
325
+ if (row) {
326
+ embeddingCache.set(id, new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4));
327
+ }
328
+ }
329
+ }
330
+ catch {
331
+ // Vector table may not exist
332
+ }
333
+ }
334
+ while (selected.length < limit && remaining.size > 0) {
335
+ let bestId = -1;
336
+ let bestMmrScore = -Infinity;
337
+ for (const [id, candidate] of remaining) {
338
+ const relevance = candidate.score;
339
+ let maxSim = 0;
340
+ for (const sel of selected) {
341
+ const sim = this.chunkSimilarity(id, sel.id, candidate.content, sel.content, embeddingCache);
342
+ if (sim > maxSim)
343
+ maxSim = sim;
344
+ }
345
+ const mmrScore = this.mmrLambda * relevance - (1 - this.mmrLambda) * maxSim;
346
+ if (mmrScore > bestMmrScore) {
347
+ bestMmrScore = mmrScore;
348
+ bestId = id;
349
+ }
350
+ }
351
+ if (bestId === -1)
352
+ break;
353
+ const best = remaining.get(bestId);
354
+ selected.push({ id: bestId, ...best });
355
+ remaining.delete(bestId);
356
+ }
357
+ return selected.map(({ path, content, score, chunkIndex }) => ({ path, content, score, chunkIndex }));
358
+ }
359
+ // CRC: crc-MemoryIndex.md | R94, R95
360
+ chunkSimilarity(idA, idB, contentA, contentB, embeddingCache) {
361
+ const embA = embeddingCache.get(idA);
362
+ const embB = embeddingCache.get(idB);
363
+ if (embA && embB)
364
+ return this.cosineSimilarity(embA, embB);
365
+ return this.jaccardSimilarity(contentA, contentB);
366
+ }
367
+ // CRC: crc-MemoryIndex.md | R94
368
+ cosineSimilarity(a, b) {
369
+ let dot = 0, normA = 0, normB = 0;
370
+ for (let i = 0; i < a.length; i++) {
371
+ dot += a[i] * b[i];
372
+ normA += a[i] * a[i];
373
+ normB += b[i] * b[i];
374
+ }
375
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
376
+ return denom > 0 ? dot / denom : 0;
377
+ }
378
+ // CRC: crc-MemoryIndex.md | R95
379
+ jaccardSimilarity(a, b) {
380
+ const setA = new Set(a.toLowerCase().split(/\s+/));
381
+ const setB = new Set(b.toLowerCase().split(/\s+/));
382
+ let intersection = 0;
383
+ for (const word of setA) {
384
+ if (setB.has(word))
385
+ intersection++;
386
+ }
387
+ const union = setA.size + setB.size - intersection;
388
+ return union > 0 ? intersection / union : 0;
389
+ }
390
+ // CRC: crc-MemoryIndex.md | R82, R83 | crc-DreamScoring.md | R116
391
+ computeDecay(updatedAt, path) {
392
+ if (!updatedAt || this.isEvergreen(path))
393
+ return 1.0;
394
+ const ageDays = (Date.now() - updatedAt) / MS_PER_DAY;
395
+ if (ageDays <= 0)
396
+ return 1.0;
397
+ const halfLife = this.isDreamContent(path) ? this.dreamHalfLifeDays : this.decayHalfLifeDays;
398
+ return Math.pow(0.5, ageDays / halfLife);
399
+ }
400
+ // CRC: crc-MemoryIndex.md | R84, R85, R88
401
+ isEvergreen(path) {
402
+ return this.evergreenPatterns.some((pattern) => path.endsWith(pattern));
403
+ }
404
+ // CRC: crc-DreamScoring.md | R117
405
+ isDreamContent(path) {
406
+ return this.dreamPatterns.some((pattern) => path.includes(pattern));
407
+ }
408
+ chunkContent(content, path) {
409
+ const words = content.split(/\s+/);
410
+ const chunks = [];
411
+ let i = 0;
412
+ let index = 0;
413
+ while (i < words.length) {
414
+ const end = Math.min(i + this.chunkSize, words.length);
415
+ const chunkText = words.slice(i, end).join(" ");
416
+ chunks.push({ path, index, content: chunkText });
417
+ i += this.chunkSize - this.chunkOverlap;
418
+ index++;
419
+ }
420
+ return chunks;
421
+ }
422
+ findMarkdownFiles(dir) {
423
+ const files = [];
424
+ const entries = readdirSync(dir, { withFileTypes: true });
425
+ for (const entry of entries) {
426
+ const fullPath = join(dir, entry.name);
427
+ if (entry.isDirectory() && !entry.name.startsWith(".")) {
428
+ files.push(...this.findMarkdownFiles(fullPath));
429
+ }
430
+ else if (entry.isFile() && extname(entry.name) === ".md") {
431
+ files.push(fullPath);
432
+ }
433
+ }
434
+ return files;
435
+ }
436
+ }
437
+ //# sourceMappingURL=memory-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-index.js","sourceRoot":"","sources":["../src/memory-index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,4DAA4D;AAC5D,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AA4BhD,4CAA4C;AAC5C,uCAAuC;AACvC,MAAM,0BAA0B,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvE,MAAM,sBAAsB,GAAG,CAAC,SAAS,CAAC,CAAC;AAC3C,MAAM,UAAU,GAAG,UAAU,CAAC;AAE9B,MAAM,OAAO,WAAW;IACd,EAAE,GAAY,IAAI,CAAC;IACnB,iBAAiB,GAA6B,IAAI,CAAC;IACnD,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,SAAS,CAAS;IAClB,YAAY,CAAU;IACtB,iBAAiB,CAAS;IAC1B,iBAAiB,CAAW;IAC5B,aAAa,CAAW;IACxB,iBAAiB,CAAS;IAC1B,eAAe,CAAS;IACxB,UAAU,CAAU;IACpB,SAAS,CAAS;IAClB,YAAY,GAAa,EAAE,CAAC;IAC5B,OAAO,GAAqB,IAAI,CAAC;IACjC,MAAM,CAAS;IACf,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,MAAc,EAAE,OAa3B;QACC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,GAAG,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,IAAI,0BAA0B,CAAC;QAClF,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,sBAAsB,CAAC;QACtE,IAAI,CAAC,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,GAAG,CAAC;QACvD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC;IAC7C,CAAC;IAED,oBAAoB,CAAC,QAA2B;QAC9C,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,gCAAgC;IAChC,cAAc,CAAC,MAA0C;QACvD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;QACrE,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAC;QACpF,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAChG,CAAC;IAED,oDAAoD;IACpD,cAAc,CAAC,MAA2C;QACxD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAC;QACpF,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;QAC9E,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC1E,CAAC;IAED,qCAAqC;IACrC,eAAe,CAAC,MAA2C;QACzD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/E,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACtE,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACzE,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;QAC1D,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAuC,CAAC;QAExD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC5C,SAA6C,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACvE,CAAC;QAED,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;KAUP,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC;;;;KAIP,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;KAWP,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC;YACzD,EAAE,CAAC,IAAI,CAAC;;;4BAGc,IAAI;;OAEzB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO;QAE9B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAuC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,iFAAiF,CAClF,CAAC;QAEF,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,KAAc,EAAE,EAAE;YACnD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAClE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,IAAI,CAA0B,CAAC;gBAExH,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,wFAAwF,CACzF,CAAC;gBACF,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;oBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC9D,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;wBACtE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,UAAU,EAAE,CAAC;YACf,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAuB;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAE7C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAuC,CAAC;QACxD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmG,CAAC;QAE3H,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;OAQ7B,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAErB,CAAC;YAEH,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,eAAe,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE;oBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC,SAAS;oBACvC,UAAU,EAAE,GAAG,CAAC,WAAW;oBAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3D,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;SAM7B,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAEjE,CAAC;gBAEH,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC7B,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;oBACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC3C,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,KAAK,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;oBACnD,CAAC;yBAAM,CAAC;wBACN,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC;6BAC/F,GAAG,CAAC,GAAG,CAAC,QAAQ,CAA2F,CAAC;wBAC/G,IAAI,KAAK,EAAE,CAAC;4BACV,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE;gCACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gCACtB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC,YAAY;gCACrC,UAAU,EAAE,KAAK,CAAC,WAAW;gCAC7B,SAAS,EAAE,KAAK,CAAC,UAAU;6BAC5B,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC;YACvC,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC;aACtC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE7C,qCAAqC;QACrC,IAAI,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,GAAG,CAAC,IAAY;QACd,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,IAAY;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,aAAa;QACX,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE;gBACtE,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO;gBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7E,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,cAAc,CAAC,KAAK,GAAG,EAAE;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAuC,CAAC;QACxD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,mEAAmE,CACpE,CAAC,GAAG,CAAC,KAAK,CAA4B,CAAC;QACxC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAClC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1E,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAuC,CAAC;QACxD,MAAM,SAAS,GAAI,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;QACxG,MAAM,UAAU,GAAI,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;QAC7F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;IACpE,CAAC;IAED,qCAAqC;IAC7B,SAAS,CACf,UAAoH,EACpH,KAAa,EACb,EAAqC;QAErC,MAAM,QAAQ,GAA4F,EAAE,CAAC;QAC7G,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAEtC,uDAAuD;QACvD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;QACvD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,KAAK,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAsC,CAAC;oBAC3H,IAAI,GAAG,EAAE,CAAC;wBACR,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;oBACzH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,GAAG,KAAK,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;YAChB,IAAI,YAAY,GAAG,CAAC,QAAQ,CAAC;YAE7B,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,SAAS,EAAE,CAAC;gBACxC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;gBAClC,IAAI,MAAM,GAAG,CAAC,CAAC;gBAEf,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;oBAC7F,IAAI,GAAG,GAAG,MAAM;wBAAE,MAAM,GAAG,GAAG,CAAC;gBACjC,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;gBAC5E,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;oBAC5B,YAAY,GAAG,QAAQ,CAAC;oBACxB,MAAM,GAAG,EAAE,CAAC;gBACd,CAAC;YACH,CAAC;YAED,IAAI,MAAM,KAAK,CAAC,CAAC;gBAAE,MAAM;YACzB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACvC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,qCAAqC;IAC7B,eAAe,CACrB,GAAW,EAAE,GAAW,EACxB,QAAgB,EAAE,QAAgB,EAClC,cAAyC;QAEzC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,gCAAgC;IACxB,gBAAgB,CAAC,CAAe,EAAE,CAAe;QACvD,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,gCAAgC;IACxB,iBAAiB,CAAC,CAAS,EAAE,CAAS;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,YAAY,EAAE,CAAC;QACrC,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACnD,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,kEAAkE;IAC1D,YAAY,CAAC,SAAiB,EAAE,IAAY;QAClD,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QACrD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC;QACtD,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC7F,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,0CAA0C;IAClC,WAAW,CAAC,IAAY;QAC9B,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,kCAAkC;IAC1B,cAAc,CAAC,IAAY;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAEO,YAAY,CAAC,OAAe,EAAE,IAAY;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;YACxC,KAAK,EAAE,CAAC;QACV,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,iBAAiB,CAAC,GAAW;QACnC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { Logger } from "./types.js";
2
+ export interface CheckpointData {
3
+ currentTopic?: string;
4
+ recentDecisions?: string[];
5
+ inProgressTask?: string;
6
+ recentMessages?: string[];
7
+ modifiedFiles?: string[];
8
+ timestamp?: number;
9
+ }
10
+ export declare class SessionCheckpoint {
11
+ private data;
12
+ private logger;
13
+ private filePath;
14
+ constructor(logger: Logger, filePath: string);
15
+ update(partial: Partial<CheckpointData>): void;
16
+ load(): CheckpointData | null;
17
+ clear(): void;
18
+ toContextString(): string;
19
+ getData(): CheckpointData | null;
20
+ private writeToDisk;
21
+ }
22
+ //# sourceMappingURL=session-checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-checkpoint.d.ts","sourceRoot":"","sources":["../src/session-checkpoint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAK5C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAqB9C,IAAI,IAAI,cAAc,GAAG,IAAI;IAY7B,KAAK,IAAI,IAAI;IAYb,eAAe,IAAI,MAAM;IA0BzB,OAAO,IAAI,cAAc,GAAG,IAAI;IAIhC,OAAO,CAAC,WAAW;CASpB"}