@coreyuan/vector-mind 1.0.53 → 1.0.54

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 (75) hide show
  1. package/README.md +1 -1
  2. package/dist/builtin-conventions.js +1 -1
  3. package/dist/builtin-conventions.js.map +1 -1
  4. package/dist/builtin-instructions.d.ts +1 -1
  5. package/dist/builtin-instructions.js +1 -1
  6. package/dist/builtin-instructions.js.map +1 -1
  7. package/dist/config.d.ts +4 -1
  8. package/dist/config.js +25 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/database-runtime.d.ts +3 -0
  11. package/dist/database-runtime.js +342 -19
  12. package/dist/database-runtime.js.map +1 -1
  13. package/dist/development-warnings.js +2 -2
  14. package/dist/development-warnings.js.map +1 -1
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/large-file-split.d.ts +1 -0
  18. package/dist/large-file-split.js +8 -3
  19. package/dist/large-file-split.js.map +1 -1
  20. package/dist/memory-maintenance/compaction.d.ts +7 -0
  21. package/dist/memory-maintenance/compaction.js +132 -0
  22. package/dist/memory-maintenance/compaction.js.map +1 -0
  23. package/dist/memory-maintenance/context.d.ts +37 -0
  24. package/dist/memory-maintenance/context.js +52 -0
  25. package/dist/memory-maintenance/context.js.map +1 -0
  26. package/dist/memory-maintenance/index-prune.d.ts +22 -0
  27. package/dist/memory-maintenance/index-prune.js +243 -0
  28. package/dist/memory-maintenance/index-prune.js.map +1 -0
  29. package/dist/memory-maintenance/metrics.d.ts +5 -0
  30. package/dist/memory-maintenance/metrics.js +22 -0
  31. package/dist/memory-maintenance/metrics.js.map +1 -0
  32. package/dist/memory-maintenance/pending.d.ts +4 -0
  33. package/dist/memory-maintenance/pending.js +74 -0
  34. package/dist/memory-maintenance/pending.js.map +1 -0
  35. package/dist/memory-maintenance/purge.d.ts +7 -0
  36. package/dist/memory-maintenance/purge.js +115 -0
  37. package/dist/memory-maintenance/purge.js.map +1 -0
  38. package/dist/memory-maintenance/runner.d.ts +4 -0
  39. package/dist/memory-maintenance/runner.js +170 -0
  40. package/dist/memory-maintenance/runner.js.map +1 -0
  41. package/dist/memory-maintenance/sqlite.d.ts +10 -0
  42. package/dist/memory-maintenance/sqlite.js +67 -0
  43. package/dist/memory-maintenance/sqlite.js.map +1 -0
  44. package/dist/memory-maintenance/types.d.ts +86 -0
  45. package/dist/memory-maintenance/types.js +2 -0
  46. package/dist/memory-maintenance/types.js.map +1 -0
  47. package/dist/memory-maintenance.d.ts +5 -80
  48. package/dist/memory-maintenance.js +3 -536
  49. package/dist/memory-maintenance.js.map +1 -1
  50. package/dist/memory-recall.d.ts +3 -1
  51. package/dist/memory-recall.js +17 -0
  52. package/dist/memory-recall.js.map +1 -1
  53. package/dist/path-rules.d.ts +1 -0
  54. package/dist/path-rules.js +23 -1
  55. package/dist/path-rules.js.map +1 -1
  56. package/dist/pending-changes.js +4 -0
  57. package/dist/pending-changes.js.map +1 -1
  58. package/dist/server-instructions.js +1 -1
  59. package/dist/server-instructions.js.map +1 -1
  60. package/dist/tool-catalog.js +2 -2
  61. package/dist/tool-catalog.js.map +1 -1
  62. package/dist/tool-handlers/large-files.js +19 -1
  63. package/dist/tool-handlers/large-files.js.map +1 -1
  64. package/dist/tool-handlers/requirements.js +66 -19
  65. package/dist/tool-handlers/requirements.js.map +1 -1
  66. package/dist/tool-handlers.js +261 -1
  67. package/dist/tool-handlers.js.map +1 -1
  68. package/dist/tool-output.d.ts +39 -1
  69. package/dist/tool-output.js +26 -2
  70. package/dist/tool-output.js.map +1 -1
  71. package/dist/tool-schemas.d.ts +8 -0
  72. package/dist/tool-schemas.js +15 -1
  73. package/dist/tool-schemas.js.map +1 -1
  74. package/dist/types.d.ts +9 -1
  75. package/package.json +4 -1
@@ -1,537 +1,4 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { IGNORED_LIKE_PATTERNS, NOISE_FILE_BASENAMES, NOISE_FILE_SUFFIXES, isContentIndexableFile, isSymbolIndexableFile, shouldIgnoreContentFile, shouldIgnoreDbFilePath, } from "./path-rules.js";
4
- import { MAINTENANCE_AUTO_ENABLED, MAINTENANCE_COMPACT_AFTER_DAYS, MAINTENANCE_INTERVAL_HOURS, MAINTENANCE_MAX_INDEX_FILES, MAINTENANCE_MAX_MEMORY_ITEMS, } from "./config.js";
5
- import { logActivity } from "./activity-log.js";
6
- import { oneLine, safeJson } from "./tool-output.js";
7
- let memoryMaintenanceContext = null;
8
- export function configureMemoryMaintenance(context) {
9
- memoryMaintenanceContext = context;
10
- }
11
- function requireMemoryMaintenanceContext() {
12
- if (!memoryMaintenanceContext)
13
- throw new Error("[VectorMind] memory maintenance context is not configured");
14
- return memoryMaintenanceContext;
15
- }
16
- function hasDb() {
17
- return !!requireMemoryMaintenanceContext().getDb();
18
- }
19
- function getDb() {
20
- const db = requireMemoryMaintenanceContext().getDb();
21
- if (!db)
22
- throw new Error("[VectorMind] database is not initialized");
23
- return db;
24
- }
25
- function getProjectRoot() {
26
- return requireMemoryMaintenanceContext().getProjectRoot();
27
- }
28
- function getDbPath() {
29
- return requireMemoryMaintenanceContext().getDbPath();
30
- }
31
- function getKvStatement() {
32
- return requireMemoryMaintenanceContext().getKvStatement();
33
- }
34
- function getSetKvStatement() {
35
- return requireMemoryMaintenanceContext().getSetKvStatement();
36
- }
37
- function getDeleteFileChunkItemsStatement() {
38
- return requireMemoryMaintenanceContext().getDeleteFileChunkItemsStatement();
39
- }
40
- function getDeleteSymbolsForFileStatement() {
41
- return requireMemoryMaintenanceContext().getDeleteSymbolsForFileStatement();
42
- }
43
- function getInsertMemoryItemStatement() {
44
- return requireMemoryMaintenanceContext().getInsertMemoryItemStatement();
45
- }
46
- function sha256Hex(input) {
47
- return requireMemoryMaintenanceContext().sha256Hex(input);
48
- }
49
- function parseMetadataJson(raw) {
50
- return requireMemoryMaintenanceContext().parseMetadataJson(raw);
51
- }
52
- function metadataStatus(row) {
53
- return requireMemoryMaintenanceContext().metadataStatus(row);
54
- }
55
- function isHiddenFromDefaultRecall(row) {
56
- return requireMemoryMaintenanceContext().isHiddenFromDefaultRecall(row);
57
- }
58
- export function pruneIgnoredIndexesByPathPatterns() {
59
- if (!hasDb())
60
- return { chunks_deleted: 0, symbols_deleted: 0 };
61
- try {
62
- if (!IGNORED_LIKE_PATTERNS.length)
63
- return { chunks_deleted: 0, symbols_deleted: 0 };
64
- const where = IGNORED_LIKE_PATTERNS
65
- .map(() => "LOWER(REPLACE(file_path, '\\\\', '/')) LIKE ?")
66
- .join(" OR ");
67
- const chunksDeleted = getDb()
68
- .prepare(`DELETE FROM memory_items
69
- WHERE file_path IS NOT NULL
70
- AND (kind = 'code_chunk' OR kind = 'doc_chunk')
71
- AND (${where})`)
72
- .run(...IGNORED_LIKE_PATTERNS).changes;
73
- const symbolsDeleted = getDb()
74
- .prepare(`DELETE FROM symbols
75
- WHERE file_path IS NOT NULL
76
- AND (${where})`)
77
- .run(...IGNORED_LIKE_PATTERNS).changes;
78
- if (chunksDeleted || symbolsDeleted) {
79
- logActivity("index_prune", {
80
- reason: "ignored_paths",
81
- chunks_deleted: chunksDeleted,
82
- symbols_deleted: symbolsDeleted,
83
- });
84
- }
85
- return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
86
- }
87
- catch (err) {
88
- console.error("[vectormind] prune indexes failed:", err);
89
- return { chunks_deleted: 0, symbols_deleted: 0 };
90
- }
91
- }
92
- export function pruneFilenameNoiseIndexes() {
93
- if (!hasDb())
94
- return { chunks_deleted: 0, symbols_deleted: 0 };
95
- try {
96
- const suffixWhere = NOISE_FILE_SUFFIXES.map(() => "LOWER(file_path) LIKE ?").join(" OR ");
97
- const baseWhere = NOISE_FILE_BASENAMES.map(() => "(LOWER(file_path) = ? OR LOWER(file_path) LIKE ?)").join(" OR ");
98
- const suffixArgs = NOISE_FILE_SUFFIXES.map((s) => `%${s}`);
99
- const baseArgs = NOISE_FILE_BASENAMES.flatMap((n) => [n, `%/${n}`]);
100
- const whereParts = [];
101
- const args = [];
102
- if (suffixWhere) {
103
- whereParts.push(`(${suffixWhere})`);
104
- args.push(...suffixArgs);
105
- }
106
- if (baseWhere) {
107
- whereParts.push(`(${baseWhere})`);
108
- args.push(...baseArgs);
109
- }
110
- if (!whereParts.length)
111
- return { chunks_deleted: 0, symbols_deleted: 0 };
112
- const where = whereParts.join(" OR ");
113
- const chunksDeleted = getDb()
114
- .prepare(`DELETE FROM memory_items
115
- WHERE file_path IS NOT NULL
116
- AND (kind = 'code_chunk' OR kind = 'doc_chunk')
117
- AND (${where})`)
118
- .run(...args).changes;
119
- const symbolsDeleted = getDb()
120
- .prepare(`DELETE FROM symbols
121
- WHERE file_path IS NOT NULL
122
- AND (${where})`)
123
- .run(...args).changes;
124
- if (chunksDeleted || symbolsDeleted) {
125
- logActivity("index_prune", {
126
- reason: "filename_noise",
127
- chunks_deleted: chunksDeleted,
128
- symbols_deleted: symbolsDeleted,
129
- });
130
- }
131
- return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
132
- }
133
- catch (err) {
134
- console.error("[vectormind] prune filename noise failed:", err);
135
- return { chunks_deleted: 0, symbols_deleted: 0 };
136
- }
137
- }
138
- function kvGet(key) {
139
- try {
140
- const row = getKvStatement()?.get(key);
141
- return row?.value ?? null;
142
- }
143
- catch {
144
- return null;
145
- }
146
- }
147
- function kvSet(key, value) {
148
- try {
149
- getSetKvStatement()?.run(key, value);
150
- }
151
- catch (err) {
152
- console.error("[vectormind] kv set failed:", err);
153
- }
154
- }
155
- function distinctChunkAndSymbolFilePaths(limit) {
156
- const rows = getDb()
157
- .prepare(`SELECT file_path
158
- FROM (
159
- SELECT file_path, MAX(updated_at) AS updated_at
160
- FROM memory_items
161
- WHERE file_path IS NOT NULL
162
- AND (kind = 'code_chunk' OR kind = 'doc_chunk')
163
- GROUP BY file_path
164
- UNION
165
- SELECT file_path, CURRENT_TIMESTAMP AS updated_at
166
- FROM symbols
167
- WHERE file_path IS NOT NULL
168
- GROUP BY file_path
169
- )
170
- WHERE file_path IS NOT NULL
171
- ORDER BY updated_at ASC
172
- LIMIT ?`)
173
- .all(limit);
174
- return Array.from(new Set(rows.map((r) => r.file_path).filter(Boolean)));
175
- }
176
- function classifyStaleIndexFile(filePath) {
177
- if (!filePath)
178
- return "empty_path";
179
- if (shouldIgnoreDbFilePath(filePath))
180
- return "ignored_path";
181
- if (shouldIgnoreContentFile(filePath))
182
- return "filename_noise";
183
- const absPath = path.isAbsolute(filePath) ? filePath : path.join(getProjectRoot(), filePath);
184
- const rel = path.relative(getProjectRoot(), absPath);
185
- if (rel.startsWith("..") || path.isAbsolute(rel))
186
- return "outside_project";
187
- let stat;
188
- try {
189
- stat = fs.statSync(absPath);
190
- }
191
- catch {
192
- return "missing_file";
193
- }
194
- if (!stat.isFile())
195
- return "not_file";
196
- if (!isContentIndexableFile(absPath) && !isSymbolIndexableFile(absPath))
197
- return "not_indexable";
198
- return null;
199
- }
200
- function pruneStaleFileIndexes(opts) {
201
- const filePaths = distinctChunkAndSymbolFilePaths(Math.min(50_000, opts.maxIndexFiles * 3));
202
- const matched = [];
203
- for (const fp of filePaths) {
204
- if (matched.length >= opts.maxIndexFiles)
205
- break;
206
- const reason = classifyStaleIndexFile(fp);
207
- if (reason)
208
- matched.push({ file_path: fp, reason });
209
- }
210
- let chunksDeleted = 0;
211
- let symbolsDeleted = 0;
212
- const samples = matched.slice(0, 20).map((m) => `${m.file_path} (${m.reason})`);
213
- if (!opts.dryRun && matched.length) {
214
- const tx = getDb().transaction(() => {
215
- for (const m of matched) {
216
- chunksDeleted += getDeleteFileChunkItemsStatement().run(m.file_path).changes;
217
- symbolsDeleted += getDeleteSymbolsForFileStatement().run(m.file_path).changes;
218
- }
219
- });
220
- try {
221
- tx();
222
- }
223
- catch (err) {
224
- console.error("[vectormind] prune stale indexes failed:", err);
225
- }
226
- }
227
- else if (opts.dryRun && matched.length) {
228
- const countChunksStmt = getDb().prepare(`SELECT COUNT(1) AS c
229
- FROM memory_items
230
- WHERE file_path = ?
231
- AND (kind = 'code_chunk' OR kind = 'doc_chunk')`);
232
- const countSymbolsStmt = getDb().prepare(`SELECT COUNT(1) AS c FROM symbols WHERE file_path = ?`);
233
- for (const m of matched) {
234
- chunksDeleted += Number(countChunksStmt.get(m.file_path)?.c ?? 0);
235
- symbolsDeleted += Number(countSymbolsStmt.get(m.file_path)?.c ?? 0);
236
- }
237
- }
238
- if (!opts.dryRun && (chunksDeleted || symbolsDeleted)) {
239
- logActivity("index_prune", {
240
- reason: "stale_files",
241
- files_matched: matched.length,
242
- chunks_deleted: chunksDeleted,
243
- symbols_deleted: symbolsDeleted,
244
- samples,
245
- });
246
- }
247
- return {
248
- files_checked: filePaths.length,
249
- files_matched: matched.length,
250
- chunks_deleted: chunksDeleted,
251
- symbols_deleted: symbolsDeleted,
252
- samples,
253
- };
254
- }
255
- function countIgnoredIndexDeletes() {
256
- if (!IGNORED_LIKE_PATTERNS.length)
257
- return { chunks_deleted: 0, symbols_deleted: 0 };
258
- const where = IGNORED_LIKE_PATTERNS
259
- .map(() => "LOWER(REPLACE(file_path, '\\\\', '/')) LIKE ?")
260
- .join(" OR ");
261
- const chunksDeleted = Number(getDb()
262
- .prepare(`SELECT COUNT(1) AS c
263
- FROM memory_items
264
- WHERE file_path IS NOT NULL
265
- AND (kind = 'code_chunk' OR kind = 'doc_chunk')
266
- AND (${where})`)
267
- .get(...IGNORED_LIKE_PATTERNS)?.c ?? 0);
268
- const symbolsDeleted = Number(getDb()
269
- .prepare(`SELECT COUNT(1) AS c
270
- FROM symbols
271
- WHERE file_path IS NOT NULL
272
- AND (${where})`)
273
- .get(...IGNORED_LIKE_PATTERNS)?.c ?? 0);
274
- return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
275
- }
276
- function countFilenameNoiseIndexDeletes() {
277
- const suffixWhere = NOISE_FILE_SUFFIXES.map(() => "LOWER(file_path) LIKE ?").join(" OR ");
278
- const baseWhere = NOISE_FILE_BASENAMES.map(() => "(LOWER(file_path) = ? OR LOWER(file_path) LIKE ?)").join(" OR ");
279
- const suffixArgs = NOISE_FILE_SUFFIXES.map((s) => `%${s}`);
280
- const baseArgs = NOISE_FILE_BASENAMES.flatMap((n) => [n, `%/${n}`]);
281
- const whereParts = [];
282
- const args = [];
283
- if (suffixWhere) {
284
- whereParts.push(`(${suffixWhere})`);
285
- args.push(...suffixArgs);
286
- }
287
- if (baseWhere) {
288
- whereParts.push(`(${baseWhere})`);
289
- args.push(...baseArgs);
290
- }
291
- if (!whereParts.length)
292
- return { chunks_deleted: 0, symbols_deleted: 0 };
293
- const where = whereParts.join(" OR ");
294
- const chunksDeleted = Number(getDb()
295
- .prepare(`SELECT COUNT(1) AS c
296
- FROM memory_items
297
- WHERE file_path IS NOT NULL
298
- AND (kind = 'code_chunk' OR kind = 'doc_chunk')
299
- AND (${where})`)
300
- .get(...args)?.c ?? 0);
301
- const symbolsDeleted = Number(getDb()
302
- .prepare(`SELECT COUNT(1) AS c
303
- FROM symbols
304
- WHERE file_path IS NOT NULL
305
- AND (${where})`)
306
- .get(...args)?.c ?? 0);
307
- return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
308
- }
309
- function selectCompactionCandidates(opts) {
310
- const kinds = opts.compactNotes
311
- ? ["requirement", "change_intent", "note"]
312
- : ["requirement", "change_intent"];
313
- const placeholders = kinds.map(() => "?").join(", ");
314
- const rows = getDb()
315
- .prepare(`SELECT
316
- m.id, m.kind, m.title, m.content, m.file_path, m.start_line, m.end_line,
317
- m.req_id, m.metadata_json, m.content_hash, m.created_at, m.updated_at,
318
- r.status AS req_status
319
- FROM memory_items m
320
- LEFT JOIN requirements r ON r.id = m.req_id
321
- WHERE m.kind IN (${placeholders})
322
- AND m.updated_at < datetime('now', ?)
323
- ORDER BY m.updated_at ASC, m.id ASC
324
- LIMIT ?`)
325
- .all(...kinds, `-${opts.compactAfterDays} days`, Math.min(20_000, opts.maxMemoryItems * 5));
326
- return rows
327
- .filter((row) => !isHiddenFromDefaultRecall(row))
328
- .filter((row) => metadataStatus(row) !== "current" && metadataStatus(row) !== "active")
329
- .filter((row) => row.req_status !== "active")
330
- .filter((row) => row.kind !== "note" || opts.compactNotes)
331
- .slice(0, opts.maxMemoryItems);
332
- }
333
- function compactionLine(row) {
334
- const date = oneLine(row.updated_at || row.created_at, 19);
335
- const title = row.title ? ` ${oneLine(row.title, 80)}` : "";
336
- const file = row.file_path ? ` file=${row.file_path}${row.start_line != null ? `:${row.start_line}` : ""}` : "";
337
- const req = row.req_id != null ? ` req#${row.req_id}` : "";
338
- return `- ${date} #${row.id} ${row.kind}${req}${file}${title}: ${oneLine(row.content, 220)}`;
339
- }
340
- function compactOldMemoryItems(opts) {
341
- const candidates = selectCompactionCandidates(opts);
342
- const cutoff = new Date(Date.now() - opts.compactAfterDays * 86_400_000).toISOString();
343
- const samples = candidates.slice(0, 20).map((row) => ({
344
- id: row.id,
345
- kind: row.kind,
346
- title: row.title,
347
- file_path: row.file_path,
348
- updated_at: row.updated_at,
349
- }));
350
- if (opts.dryRun || !candidates.length) {
351
- return {
352
- cutoff,
353
- candidates: candidates.length,
354
- compacted: 0,
355
- summary_memory_id: null,
356
- archived: 0,
357
- samples,
358
- };
359
- }
360
- const now = new Date().toISOString();
361
- const lines = [
362
- `Auto-compacted ${candidates.length} old VectorMind memory items.`,
363
- `Cutoff: items updated before ${cutoff} (${opts.compactAfterDays} days).`,
364
- "",
365
- "This compact summary keeps old history searchable while detailed stale items are hidden from default recall.",
366
- "Durable decisions, conventions, and project summaries are never compacted by this automatic pass.",
367
- "",
368
- ...candidates.map(compactionLine),
369
- ];
370
- const content = lines.join("\n");
371
- const title = `Memory compaction ${now.slice(0, 10)}`;
372
- const metadata = {
373
- source: "maintenance",
374
- status: "current",
375
- compacted_item_ids: candidates.map((c) => c.id),
376
- compact_after_days: opts.compactAfterDays,
377
- compact_notes: opts.compactNotes,
378
- generated_at: now,
379
- };
380
- let summaryMemoryId = 0;
381
- let archived = 0;
382
- const archiveStmt = getDb().prepare(`INSERT OR IGNORE INTO memory_item_archive
383
- (memory_id, original_kind, original_title, original_content, original_file_path,
384
- original_start_line, original_end_line, original_req_id, original_metadata_json,
385
- original_content_hash, original_created_at, original_updated_at, archive_reason, compacted_into_id)
386
- VALUES
387
- (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
388
- const updateMemoryStmt = getDb().prepare(`UPDATE memory_items
389
- SET content = ?, metadata_json = ?, content_hash = ?, updated_at = CURRENT_TIMESTAMP
390
- WHERE id = ?`);
391
- const tx = getDb().transaction(() => {
392
- const info = getInsertMemoryItemStatement().run("memory_compaction", title, content, null, null, null, null, safeJson(metadata), sha256Hex(content));
393
- summaryMemoryId = Number(info.lastInsertRowid);
394
- for (const row of candidates) {
395
- const archiveInfo = archiveStmt.run(row.id, row.kind, row.title, row.content, row.file_path, row.start_line, row.end_line, row.req_id, row.metadata_json, row.content_hash, row.created_at, row.updated_at, "auto_compaction", summaryMemoryId);
396
- if (archiveInfo.changes > 0)
397
- archived += 1;
398
- const patchedMeta = {
399
- ...parseMetadataJson(row.metadata_json),
400
- status: "compacted",
401
- compacted: true,
402
- compacted_at: now,
403
- compacted_into_memory_id: summaryMemoryId,
404
- };
405
- const stub = [
406
- `[compacted into memory item #${summaryMemoryId}]`,
407
- `Original ${row.kind} #${row.id} was older than ${opts.compactAfterDays} days and is excluded from default recall.`,
408
- `Summary: ${oneLine(row.title || row.content, 260)}`,
409
- ].join("\n");
410
- updateMemoryStmt.run(stub, safeJson(patchedMeta), sha256Hex(stub), row.id);
411
- }
412
- });
413
- try {
414
- tx();
415
- }
416
- catch (err) {
417
- console.error("[vectormind] compact old memory failed:", err);
418
- summaryMemoryId = 0;
419
- }
420
- if (summaryMemoryId) {
421
- logActivity("memory_maintenance", {
422
- reason: "compact_old_memories",
423
- compacted: candidates.length,
424
- summary_memory_id: summaryMemoryId,
425
- archived,
426
- });
427
- }
428
- return {
429
- cutoff,
430
- candidates: candidates.length,
431
- compacted: summaryMemoryId ? candidates.length : 0,
432
- summary_memory_id: summaryMemoryId || null,
433
- archived,
434
- samples,
435
- };
436
- }
437
- export function runMemoryMaintenance(args, trigger = "manual") {
438
- const compactedMemory = args.compact_old_memories
439
- ? compactOldMemoryItems({
440
- dryRun: args.dry_run,
441
- compactAfterDays: args.compact_after_days,
442
- maxMemoryItems: args.max_memory_items,
443
- compactNotes: args.compact_notes,
444
- })
445
- : {
446
- cutoff: new Date(Date.now() - args.compact_after_days * 86_400_000).toISOString(),
447
- candidates: 0,
448
- compacted: 0,
449
- summary_memory_id: null,
450
- archived: 0,
451
- samples: [],
452
- };
453
- const ignoredPaths = args.prune_ignored_paths
454
- ? args.dry_run
455
- ? countIgnoredIndexDeletes()
456
- : pruneIgnoredIndexesByPathPatterns()
457
- : { chunks_deleted: 0, symbols_deleted: 0 };
458
- const filenameNoise = args.prune_filename_noise
459
- ? args.dry_run
460
- ? countFilenameNoiseIndexDeletes()
461
- : pruneFilenameNoiseIndexes()
462
- : { chunks_deleted: 0, symbols_deleted: 0 };
463
- const staleFiles = args.prune_stale_indexes
464
- ? pruneStaleFileIndexes({ dryRun: args.dry_run, maxIndexFiles: args.max_index_files })
465
- : { files_checked: 0, files_matched: 0, chunks_deleted: 0, symbols_deleted: 0, samples: [] };
466
- let vacuumed = false;
467
- if (!args.dry_run && args.vacuum) {
468
- try {
469
- getDb().exec("VACUUM");
470
- vacuumed = true;
471
- }
472
- catch (err) {
473
- console.error("[vectormind] maintenance vacuum failed:", err);
474
- }
475
- }
476
- const result = {
477
- ok: true,
478
- dry_run: args.dry_run,
479
- trigger,
480
- generated_at: new Date().toISOString(),
481
- project_root: getProjectRoot(),
482
- db_path: getDbPath(),
483
- config: {
484
- compact_after_days: args.compact_after_days,
485
- max_memory_items: args.max_memory_items,
486
- max_index_files: args.max_index_files,
487
- compact_notes: args.compact_notes,
488
- },
489
- compacted_memory: compactedMemory,
490
- pruned: {
491
- ignored_paths: ignoredPaths,
492
- filename_noise: filenameNoise,
493
- stale_files: staleFiles,
494
- },
495
- vacuumed,
496
- };
497
- logActivity("memory_maintenance", {
498
- trigger,
499
- dry_run: args.dry_run,
500
- compacted: result.compacted_memory.compacted,
501
- stale_files: result.pruned.stale_files.files_matched,
502
- chunks_deleted: result.pruned.ignored_paths.chunks_deleted +
503
- result.pruned.filename_noise.chunks_deleted +
504
- result.pruned.stale_files.chunks_deleted,
505
- });
506
- return result;
507
- }
508
- export function runAutoMaintenanceIfDue() {
509
- if (!MAINTENANCE_AUTO_ENABLED || !hasDb())
510
- return;
511
- const lastRaw = kvGet("maintenance.last_auto_at");
512
- const last = lastRaw ? Date.parse(lastRaw) : 0;
513
- const dueMs = MAINTENANCE_INTERVAL_HOURS * 3_600_000;
514
- if (Number.isFinite(last) && last > 0 && Date.now() - last < dueMs)
515
- return;
516
- try {
517
- runMemoryMaintenance({
518
- project_root: getProjectRoot(),
519
- dry_run: false,
520
- format: "compact",
521
- compact_old_memories: true,
522
- compact_notes: false,
523
- prune_stale_indexes: true,
524
- prune_ignored_paths: true,
525
- prune_filename_noise: true,
526
- compact_after_days: MAINTENANCE_COMPACT_AFTER_DAYS,
527
- max_memory_items: MAINTENANCE_MAX_MEMORY_ITEMS,
528
- max_index_files: MAINTENANCE_MAX_INDEX_FILES,
529
- vacuum: false,
530
- }, "auto");
531
- kvSet("maintenance.last_auto_at", new Date().toISOString());
532
- }
533
- catch (err) {
534
- console.error("[vectormind] auto maintenance failed:", err);
535
- }
536
- }
1
+ export { configureMemoryMaintenance } from "./memory-maintenance/context.js";
2
+ export { pruneFilenameNoiseIndexes, pruneIgnoredIndexesByPathPatterns } from "./memory-maintenance/index-prune.js";
3
+ export { runAutoMaintenanceIfDue, runMemoryMaintenance } from "./memory-maintenance/runner.js";
537
4
  //# sourceMappingURL=memory-maintenance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-maintenance.js","sourceRoot":"","sources":["../src/memory-maintenance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-maintenance.js","sourceRoot":"","sources":["../src/memory-maintenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACnH,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -82,7 +82,9 @@ export declare function toRequirementPreview(req: RequirementRow, includeContent
82
82
  };
83
83
  export declare function toChangeLogPreview(change: ChangeLogRow, includeContent: boolean, previewChars: number, contentMaxChars: number): {
84
84
  id: number;
85
- file_path: string;
85
+ file_path: string | null;
86
+ files?: string[];
87
+ file_count?: number;
86
88
  timestamp: string;
87
89
  intent_preview: string;
88
90
  intent_summary?: string;
@@ -465,9 +465,26 @@ export function toRequirementPreview(req, includeContent, previewChars, contentM
465
465
  export function toChangeLogPreview(change, includeContent, previewChars, contentMaxChars) {
466
466
  const preview = makePreviewText(change.intent_summary, previewChars);
467
467
  const intentSlice = includeContent ? sliceTextForOutput(change.intent_summary, contentMaxChars) : null;
468
+ const parsedFiles = (() => {
469
+ if (!change.files_json)
470
+ return [];
471
+ try {
472
+ const parsed = JSON.parse(change.files_json);
473
+ if (!Array.isArray(parsed))
474
+ return [];
475
+ return parsed
476
+ .map((item) => (item && typeof item === "object" ? item.file_path : null))
477
+ .filter((filePath) => typeof filePath === "string" && filePath.length > 0);
478
+ }
479
+ catch {
480
+ return [];
481
+ }
482
+ })();
468
483
  return {
469
484
  id: change.id,
470
485
  file_path: change.file_path,
486
+ files: parsedFiles.length ? parsedFiles : undefined,
487
+ file_count: change.file_count ?? (parsedFiles.length || undefined),
471
488
  timestamp: change.timestamp,
472
489
  intent_preview: preview,
473
490
  intent_summary: intentSlice ? intentSlice.text : undefined,