@coreyuan/vector-mind 1.0.49 → 1.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -61
- package/dist/activity-log.d.ts +19 -0
- package/dist/activity-log.js +106 -0
- package/dist/activity-log.js.map +1 -0
- package/dist/builtin-conventions.d.ts +2 -1
- package/dist/builtin-conventions.js +5 -0
- package/dist/builtin-conventions.js.map +1 -1
- package/dist/config.d.ts +28 -0
- package/dist/config.js +189 -0
- package/dist/config.js.map +1 -0
- package/dist/database-runtime.d.ts +54 -0
- package/dist/database-runtime.js +512 -0
- package/dist/database-runtime.js.map +1 -0
- package/dist/development-warnings.d.ts +93 -0
- package/dist/development-warnings.js +589 -0
- package/dist/development-warnings.js.map +1 -0
- package/dist/file-indexing.d.ts +22 -0
- package/dist/file-indexing.js +243 -0
- package/dist/file-indexing.js.map +1 -0
- package/dist/fix-patterns.d.ts +58 -0
- package/dist/fix-patterns.js +347 -0
- package/dist/fix-patterns.js.map +1 -0
- package/dist/grep.d.ts +64 -0
- package/dist/grep.js +475 -0
- package/dist/grep.js.map +1 -0
- package/dist/index.js +167 -7279
- package/dist/index.js.map +1 -1
- package/dist/large-file-split.d.ts +29 -0
- package/dist/large-file-split.js +146 -0
- package/dist/large-file-split.js.map +1 -0
- package/dist/memory-maintenance.d.ts +80 -0
- package/dist/memory-maintenance.js +537 -0
- package/dist/memory-maintenance.js.map +1 -0
- package/dist/memory-mutations.d.ts +23 -0
- package/dist/memory-mutations.js +83 -0
- package/dist/memory-mutations.js.map +1 -0
- package/dist/memory-recall.d.ts +93 -0
- package/dist/memory-recall.js +801 -0
- package/dist/memory-recall.js.map +1 -0
- package/dist/operation-scope.d.ts +63 -0
- package/dist/operation-scope.js +438 -0
- package/dist/operation-scope.js.map +1 -0
- package/dist/path-filters.d.ts +1 -0
- package/dist/path-filters.js +27 -0
- package/dist/path-filters.js.map +1 -0
- package/dist/path-rules.d.ts +12 -0
- package/dist/path-rules.js +208 -0
- package/dist/path-rules.js.map +1 -0
- package/dist/pending-changes.d.ts +22 -0
- package/dist/pending-changes.js +166 -0
- package/dist/pending-changes.js.map +1 -0
- package/dist/project-files.d.ts +66 -0
- package/dist/project-files.js +215 -0
- package/dist/project-files.js.map +1 -0
- package/dist/root.d.ts +15 -0
- package/dist/root.js +191 -0
- package/dist/root.js.map +1 -0
- package/dist/rtk-tools.d.ts +20 -0
- package/dist/rtk-tools.js +318 -0
- package/dist/rtk-tools.js.map +1 -0
- package/dist/server-instructions.d.ts +1 -0
- package/dist/server-instructions.js +92 -0
- package/dist/server-instructions.js.map +1 -0
- package/dist/symbols.d.ts +2 -0
- package/dist/symbols.js +159 -0
- package/dist/symbols.js.map +1 -0
- package/dist/token-savings.d.ts +40 -0
- package/dist/token-savings.js +50 -0
- package/dist/token-savings.js.map +1 -0
- package/dist/tool-catalog.d.ts +18 -0
- package/dist/tool-catalog.js +249 -0
- package/dist/tool-catalog.js.map +1 -0
- package/dist/tool-handlers/context-recovery.d.ts +6 -0
- package/dist/tool-handlers/context-recovery.js +319 -0
- package/dist/tool-handlers/context-recovery.js.map +1 -0
- package/dist/tool-handlers/context.d.ts +34 -0
- package/dist/tool-handlers/context.js +2 -0
- package/dist/tool-handlers/context.js.map +1 -0
- package/dist/tool-handlers/diagnostics.d.ts +8 -0
- package/dist/tool-handlers/diagnostics.js +114 -0
- package/dist/tool-handlers/diagnostics.js.map +1 -0
- package/dist/tool-handlers/files.d.ts +8 -0
- package/dist/tool-handlers/files.js +493 -0
- package/dist/tool-handlers/files.js.map +1 -0
- package/dist/tool-handlers/large-files.d.ts +4 -0
- package/dist/tool-handlers/large-files.js +139 -0
- package/dist/tool-handlers/large-files.js.map +1 -0
- package/dist/tool-handlers/maintenance.d.ts +4 -0
- package/dist/tool-handlers/maintenance.js +160 -0
- package/dist/tool-handlers/maintenance.js.map +1 -0
- package/dist/tool-handlers/memory-diagnostics.d.ts +5 -0
- package/dist/tool-handlers/memory-diagnostics.js +558 -0
- package/dist/tool-handlers/memory-diagnostics.js.map +1 -0
- package/dist/tool-handlers/memory.d.ts +6 -0
- package/dist/tool-handlers/memory.js +352 -0
- package/dist/tool-handlers/memory.js.map +1 -0
- package/dist/tool-handlers/notes-decisions.d.ts +7 -0
- package/dist/tool-handlers/notes-decisions.js +169 -0
- package/dist/tool-handlers/notes-decisions.js.map +1 -0
- package/dist/tool-handlers/operations.d.ts +4 -0
- package/dist/tool-handlers/operations.js +62 -0
- package/dist/tool-handlers/operations.js.map +1 -0
- package/dist/tool-handlers/requirements.d.ts +7 -0
- package/dist/tool-handlers/requirements.js +399 -0
- package/dist/tool-handlers/requirements.js.map +1 -0
- package/dist/tool-handlers.d.ts +4 -0
- package/dist/tool-handlers.js +107 -0
- package/dist/tool-handlers.js.map +1 -0
- package/dist/tool-output.d.ts +266 -0
- package/dist/tool-output.js +328 -0
- package/dist/tool-output.js.map +1 -0
- package/dist/tool-schemas.d.ts +460 -0
- package/dist/tool-schemas.js +350 -0
- package/dist/tool-schemas.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/capability-matrix.md +43 -0
- package/package.json +11 -10
- package/skills/vector-mind-autopilot/SKILL.md +173 -0
- package/skills/vector-mind-autopilot/references/claude-desktop-mcp-config.json +9 -0
- package/skills/vector-mind-autopilot/references/claude-project-instructions.md +51 -0
- package/skills/vector-mind-autopilot/references/universal-system-prompt.md +81 -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
|