@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.
- package/README.md +1 -1
- package/dist/builtin-conventions.js +1 -1
- package/dist/builtin-conventions.js.map +1 -1
- package/dist/builtin-instructions.d.ts +1 -1
- package/dist/builtin-instructions.js +1 -1
- package/dist/builtin-instructions.js.map +1 -1
- package/dist/config.d.ts +4 -1
- package/dist/config.js +25 -1
- package/dist/config.js.map +1 -1
- package/dist/database-runtime.d.ts +3 -0
- package/dist/database-runtime.js +342 -19
- package/dist/database-runtime.js.map +1 -1
- package/dist/development-warnings.js +2 -2
- package/dist/development-warnings.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/large-file-split.d.ts +1 -0
- package/dist/large-file-split.js +8 -3
- package/dist/large-file-split.js.map +1 -1
- package/dist/memory-maintenance/compaction.d.ts +7 -0
- package/dist/memory-maintenance/compaction.js +132 -0
- package/dist/memory-maintenance/compaction.js.map +1 -0
- package/dist/memory-maintenance/context.d.ts +37 -0
- package/dist/memory-maintenance/context.js +52 -0
- package/dist/memory-maintenance/context.js.map +1 -0
- package/dist/memory-maintenance/index-prune.d.ts +22 -0
- package/dist/memory-maintenance/index-prune.js +243 -0
- package/dist/memory-maintenance/index-prune.js.map +1 -0
- package/dist/memory-maintenance/metrics.d.ts +5 -0
- package/dist/memory-maintenance/metrics.js +22 -0
- package/dist/memory-maintenance/metrics.js.map +1 -0
- package/dist/memory-maintenance/pending.d.ts +4 -0
- package/dist/memory-maintenance/pending.js +74 -0
- package/dist/memory-maintenance/pending.js.map +1 -0
- package/dist/memory-maintenance/purge.d.ts +7 -0
- package/dist/memory-maintenance/purge.js +115 -0
- package/dist/memory-maintenance/purge.js.map +1 -0
- package/dist/memory-maintenance/runner.d.ts +4 -0
- package/dist/memory-maintenance/runner.js +170 -0
- package/dist/memory-maintenance/runner.js.map +1 -0
- package/dist/memory-maintenance/sqlite.d.ts +10 -0
- package/dist/memory-maintenance/sqlite.js +67 -0
- package/dist/memory-maintenance/sqlite.js.map +1 -0
- package/dist/memory-maintenance/types.d.ts +86 -0
- package/dist/memory-maintenance/types.js +2 -0
- package/dist/memory-maintenance/types.js.map +1 -0
- package/dist/memory-maintenance.d.ts +5 -80
- package/dist/memory-maintenance.js +3 -536
- package/dist/memory-maintenance.js.map +1 -1
- package/dist/memory-recall.d.ts +3 -1
- package/dist/memory-recall.js +17 -0
- package/dist/memory-recall.js.map +1 -1
- package/dist/path-rules.d.ts +1 -0
- package/dist/path-rules.js +23 -1
- package/dist/path-rules.js.map +1 -1
- package/dist/pending-changes.js +4 -0
- package/dist/pending-changes.js.map +1 -1
- package/dist/server-instructions.js +1 -1
- package/dist/server-instructions.js.map +1 -1
- package/dist/tool-catalog.js +2 -2
- package/dist/tool-catalog.js.map +1 -1
- package/dist/tool-handlers/large-files.js +19 -1
- package/dist/tool-handlers/large-files.js.map +1 -1
- package/dist/tool-handlers/requirements.js +66 -19
- package/dist/tool-handlers/requirements.js.map +1 -1
- package/dist/tool-handlers.js +261 -1
- package/dist/tool-handlers.js.map +1 -1
- package/dist/tool-output.d.ts +39 -1
- package/dist/tool-output.js +26 -2
- package/dist/tool-output.js.map +1 -1
- package/dist/tool-schemas.d.ts +8 -0
- package/dist/tool-schemas.js +15 -1
- package/dist/tool-schemas.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/package.json +4 -1
|
@@ -1,537 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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"}
|
package/dist/memory-recall.d.ts
CHANGED
|
@@ -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;
|
package/dist/memory-recall.js
CHANGED
|
@@ -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,
|