@coreyuan/vector-mind 1.0.49 → 1.0.52

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 (114) hide show
  1. package/README.md +67 -60
  2. package/dist/activity-log.d.ts +19 -0
  3. package/dist/activity-log.js +106 -0
  4. package/dist/activity-log.js.map +1 -0
  5. package/dist/builtin-conventions.d.ts +2 -1
  6. package/dist/builtin-conventions.js +5 -0
  7. package/dist/builtin-conventions.js.map +1 -1
  8. package/dist/config.d.ts +28 -0
  9. package/dist/config.js +189 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/database-runtime.d.ts +54 -0
  12. package/dist/database-runtime.js +512 -0
  13. package/dist/database-runtime.js.map +1 -0
  14. package/dist/development-warnings.d.ts +93 -0
  15. package/dist/development-warnings.js +589 -0
  16. package/dist/development-warnings.js.map +1 -0
  17. package/dist/file-indexing.d.ts +22 -0
  18. package/dist/file-indexing.js +243 -0
  19. package/dist/file-indexing.js.map +1 -0
  20. package/dist/grep.d.ts +64 -0
  21. package/dist/grep.js +475 -0
  22. package/dist/grep.js.map +1 -0
  23. package/dist/index.js +167 -7279
  24. package/dist/index.js.map +1 -1
  25. package/dist/large-file-split.d.ts +29 -0
  26. package/dist/large-file-split.js +146 -0
  27. package/dist/large-file-split.js.map +1 -0
  28. package/dist/memory-maintenance.d.ts +80 -0
  29. package/dist/memory-maintenance.js +537 -0
  30. package/dist/memory-maintenance.js.map +1 -0
  31. package/dist/memory-mutations.d.ts +23 -0
  32. package/dist/memory-mutations.js +83 -0
  33. package/dist/memory-mutations.js.map +1 -0
  34. package/dist/memory-recall.d.ts +93 -0
  35. package/dist/memory-recall.js +796 -0
  36. package/dist/memory-recall.js.map +1 -0
  37. package/dist/path-filters.d.ts +1 -0
  38. package/dist/path-filters.js +27 -0
  39. package/dist/path-filters.js.map +1 -0
  40. package/dist/path-rules.d.ts +12 -0
  41. package/dist/path-rules.js +208 -0
  42. package/dist/path-rules.js.map +1 -0
  43. package/dist/pending-changes.d.ts +22 -0
  44. package/dist/pending-changes.js +166 -0
  45. package/dist/pending-changes.js.map +1 -0
  46. package/dist/project-files.d.ts +66 -0
  47. package/dist/project-files.js +215 -0
  48. package/dist/project-files.js.map +1 -0
  49. package/dist/root.d.ts +15 -0
  50. package/dist/root.js +191 -0
  51. package/dist/root.js.map +1 -0
  52. package/dist/rtk-tools.d.ts +20 -0
  53. package/dist/rtk-tools.js +318 -0
  54. package/dist/rtk-tools.js.map +1 -0
  55. package/dist/server-instructions.d.ts +1 -0
  56. package/dist/server-instructions.js +88 -0
  57. package/dist/server-instructions.js.map +1 -0
  58. package/dist/symbols.d.ts +2 -0
  59. package/dist/symbols.js +159 -0
  60. package/dist/symbols.js.map +1 -0
  61. package/dist/token-savings.d.ts +40 -0
  62. package/dist/token-savings.js +50 -0
  63. package/dist/token-savings.js.map +1 -0
  64. package/dist/tool-catalog.d.ts +18 -0
  65. package/dist/tool-catalog.js +243 -0
  66. package/dist/tool-catalog.js.map +1 -0
  67. package/dist/tool-handlers/context-recovery.d.ts +6 -0
  68. package/dist/tool-handlers/context-recovery.js +319 -0
  69. package/dist/tool-handlers/context-recovery.js.map +1 -0
  70. package/dist/tool-handlers/context.d.ts +34 -0
  71. package/dist/tool-handlers/context.js +2 -0
  72. package/dist/tool-handlers/context.js.map +1 -0
  73. package/dist/tool-handlers/diagnostics.d.ts +8 -0
  74. package/dist/tool-handlers/diagnostics.js +114 -0
  75. package/dist/tool-handlers/diagnostics.js.map +1 -0
  76. package/dist/tool-handlers/files.d.ts +8 -0
  77. package/dist/tool-handlers/files.js +493 -0
  78. package/dist/tool-handlers/files.js.map +1 -0
  79. package/dist/tool-handlers/large-files.d.ts +4 -0
  80. package/dist/tool-handlers/large-files.js +139 -0
  81. package/dist/tool-handlers/large-files.js.map +1 -0
  82. package/dist/tool-handlers/maintenance.d.ts +4 -0
  83. package/dist/tool-handlers/maintenance.js +160 -0
  84. package/dist/tool-handlers/maintenance.js.map +1 -0
  85. package/dist/tool-handlers/memory-diagnostics.d.ts +5 -0
  86. package/dist/tool-handlers/memory-diagnostics.js +509 -0
  87. package/dist/tool-handlers/memory-diagnostics.js.map +1 -0
  88. package/dist/tool-handlers/memory.d.ts +6 -0
  89. package/dist/tool-handlers/memory.js +334 -0
  90. package/dist/tool-handlers/memory.js.map +1 -0
  91. package/dist/tool-handlers/notes-decisions.d.ts +7 -0
  92. package/dist/tool-handlers/notes-decisions.js +169 -0
  93. package/dist/tool-handlers/notes-decisions.js.map +1 -0
  94. package/dist/tool-handlers/requirements.d.ts +7 -0
  95. package/dist/tool-handlers/requirements.js +357 -0
  96. package/dist/tool-handlers/requirements.js.map +1 -0
  97. package/dist/tool-handlers.d.ts +4 -0
  98. package/dist/tool-handlers.js +105 -0
  99. package/dist/tool-handlers.js.map +1 -0
  100. package/dist/tool-output.d.ts +213 -0
  101. package/dist/tool-output.js +278 -0
  102. package/dist/tool-output.js.map +1 -0
  103. package/dist/tool-schemas.d.ts +434 -0
  104. package/dist/tool-schemas.js +328 -0
  105. package/dist/tool-schemas.js.map +1 -0
  106. package/dist/types.d.ts +61 -0
  107. package/dist/types.js +2 -0
  108. package/dist/types.js.map +1 -0
  109. package/docs/capability-matrix.md +43 -0
  110. package/package.json +11 -10
  111. package/skills/vector-mind-autopilot/SKILL.md +149 -0
  112. package/skills/vector-mind-autopilot/references/claude-desktop-mcp-config.json +9 -0
  113. package/skills/vector-mind-autopilot/references/claude-project-instructions.md +47 -0
  114. package/skills/vector-mind-autopilot/references/universal-system-prompt.md +78 -0
@@ -0,0 +1,537 @@
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
+ }
537
+ //# sourceMappingURL=memory-maintenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-maintenance.js","sourceRoot":"","sources":["../src/memory-maintenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import Database from "better-sqlite3";
2
+ type MemoryMutationContext = {
3
+ getDb: () => Database.Database | undefined;
4
+ getMemoryItemByIdStatement: () => Database.Statement;
5
+ getCompleteRequirementMemoryItemByReqIdStatement: () => Database.Statement;
6
+ getCompleteAllActiveRequirementMemoryItemsStatement: () => Database.Statement;
7
+ };
8
+ export declare function configureMemoryMutations(context: MemoryMutationContext): void;
9
+ export declare function completeRequirementMemoryItemsByReqId(reqId: number): void;
10
+ export declare function completeAllActiveRequirementMemoryItems(): void;
11
+ export declare function supersedeMemoryItemIds(ids: number[], replacement: {
12
+ req_id?: number;
13
+ memory_id?: number;
14
+ decision_id?: number;
15
+ reason: string;
16
+ }): number[];
17
+ export declare function supersedeRequirementIds(reqIds: number[], replacement: {
18
+ req_id?: number;
19
+ memory_id?: number;
20
+ decision_id?: number;
21
+ reason: string;
22
+ }): number[];
23
+ export {};
@@ -0,0 +1,83 @@
1
+ import { parseMetadataJson } from "./memory-recall.js";
2
+ import { safeJson } from "./tool-output.js";
3
+ let memoryMutationContext = null;
4
+ export function configureMemoryMutations(context) {
5
+ memoryMutationContext = context;
6
+ }
7
+ function requireMemoryMutationContext() {
8
+ if (!memoryMutationContext)
9
+ throw new Error("[VectorMind] memory mutation context is not configured");
10
+ return memoryMutationContext;
11
+ }
12
+ function getDb() {
13
+ const db = requireMemoryMutationContext().getDb();
14
+ if (!db)
15
+ throw new Error("[VectorMind] database is not initialized");
16
+ return db;
17
+ }
18
+ function getMemoryItemByIdStatement() {
19
+ return requireMemoryMutationContext().getMemoryItemByIdStatement();
20
+ }
21
+ function getCompleteRequirementMemoryItemByReqIdStatement() {
22
+ return requireMemoryMutationContext().getCompleteRequirementMemoryItemByReqIdStatement();
23
+ }
24
+ function getCompleteAllActiveRequirementMemoryItemsStatement() {
25
+ return requireMemoryMutationContext().getCompleteAllActiveRequirementMemoryItemsStatement();
26
+ }
27
+ export function completeRequirementMemoryItemsByReqId(reqId) {
28
+ try {
29
+ getCompleteRequirementMemoryItemByReqIdStatement().run("completed", reqId);
30
+ }
31
+ catch (err) {
32
+ console.error("[vectormind] failed to complete requirement memory item:", err);
33
+ }
34
+ }
35
+ export function completeAllActiveRequirementMemoryItems() {
36
+ try {
37
+ getCompleteAllActiveRequirementMemoryItemsStatement().run("completed", "active");
38
+ }
39
+ catch (err) {
40
+ console.error("[vectormind] failed to complete all active requirement memory items:", err);
41
+ }
42
+ }
43
+ function patchMemoryItemMetadata(id, patch) {
44
+ const row = getMemoryItemByIdStatement().get(id);
45
+ if (!row)
46
+ return;
47
+ const meta = { ...parseMetadataJson(row.metadata_json), ...patch };
48
+ getDb().prepare(`UPDATE memory_items SET metadata_json = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?`).run(safeJson(meta), id);
49
+ }
50
+ export function supersedeMemoryItemIds(ids, replacement) {
51
+ const updated = [];
52
+ for (const id of Array.from(new Set(ids)).filter((n) => Number.isFinite(n) && n > 0)) {
53
+ const row = getMemoryItemByIdStatement().get(id);
54
+ if (!row)
55
+ continue;
56
+ patchMemoryItemMetadata(id, {
57
+ ...parseMetadataJson(row.metadata_json),
58
+ status: "superseded",
59
+ superseded: true,
60
+ superseded_at: new Date().toISOString(),
61
+ superseded_reason: replacement.reason,
62
+ superseded_by_req_id: replacement.req_id ?? null,
63
+ superseded_by_memory_id: replacement.memory_id ?? null,
64
+ superseded_by_decision_id: replacement.decision_id ?? null,
65
+ });
66
+ updated.push(id);
67
+ }
68
+ return updated;
69
+ }
70
+ export function supersedeRequirementIds(reqIds, replacement) {
71
+ const updatedReqs = [];
72
+ for (const reqId of Array.from(new Set(reqIds)).filter((n) => Number.isFinite(n) && n > 0)) {
73
+ const info = getDb().prepare(`UPDATE requirements SET status = 'superseded' WHERE id = ?`).run(reqId);
74
+ if (info.changes > 0)
75
+ updatedReqs.push(reqId);
76
+ const rows = getDb()
77
+ .prepare(`SELECT id FROM memory_items WHERE req_id = ? OR (kind = 'requirement' AND req_id = ?)`)
78
+ .all(reqId, reqId);
79
+ supersedeMemoryItemIds(rows.map((r) => r.id), replacement);
80
+ }
81
+ return updatedReqs;
82
+ }
83
+ //# sourceMappingURL=memory-mutations.js.map