@coreyuan/vector-mind 1.0.53 → 1.0.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +1 -1
  2. package/dist/builtin-conventions.js +1 -1
  3. package/dist/builtin-conventions.js.map +1 -1
  4. package/dist/builtin-instructions.d.ts +1 -1
  5. package/dist/builtin-instructions.js +1 -1
  6. package/dist/builtin-instructions.js.map +1 -1
  7. package/dist/config.d.ts +4 -1
  8. package/dist/config.js +25 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/database-runtime.d.ts +3 -0
  11. package/dist/database-runtime.js +342 -19
  12. package/dist/database-runtime.js.map +1 -1
  13. package/dist/development-warnings.js +2 -2
  14. package/dist/development-warnings.js.map +1 -1
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/large-file-split.d.ts +1 -0
  18. package/dist/large-file-split.js +8 -3
  19. package/dist/large-file-split.js.map +1 -1
  20. package/dist/memory-maintenance/compaction.d.ts +7 -0
  21. package/dist/memory-maintenance/compaction.js +132 -0
  22. package/dist/memory-maintenance/compaction.js.map +1 -0
  23. package/dist/memory-maintenance/context.d.ts +37 -0
  24. package/dist/memory-maintenance/context.js +52 -0
  25. package/dist/memory-maintenance/context.js.map +1 -0
  26. package/dist/memory-maintenance/index-prune.d.ts +22 -0
  27. package/dist/memory-maintenance/index-prune.js +243 -0
  28. package/dist/memory-maintenance/index-prune.js.map +1 -0
  29. package/dist/memory-maintenance/metrics.d.ts +5 -0
  30. package/dist/memory-maintenance/metrics.js +22 -0
  31. package/dist/memory-maintenance/metrics.js.map +1 -0
  32. package/dist/memory-maintenance/pending.d.ts +4 -0
  33. package/dist/memory-maintenance/pending.js +74 -0
  34. package/dist/memory-maintenance/pending.js.map +1 -0
  35. package/dist/memory-maintenance/purge.d.ts +7 -0
  36. package/dist/memory-maintenance/purge.js +115 -0
  37. package/dist/memory-maintenance/purge.js.map +1 -0
  38. package/dist/memory-maintenance/runner.d.ts +4 -0
  39. package/dist/memory-maintenance/runner.js +170 -0
  40. package/dist/memory-maintenance/runner.js.map +1 -0
  41. package/dist/memory-maintenance/sqlite.d.ts +10 -0
  42. package/dist/memory-maintenance/sqlite.js +67 -0
  43. package/dist/memory-maintenance/sqlite.js.map +1 -0
  44. package/dist/memory-maintenance/types.d.ts +86 -0
  45. package/dist/memory-maintenance/types.js +2 -0
  46. package/dist/memory-maintenance/types.js.map +1 -0
  47. package/dist/memory-maintenance.d.ts +5 -80
  48. package/dist/memory-maintenance.js +3 -536
  49. package/dist/memory-maintenance.js.map +1 -1
  50. package/dist/memory-recall.d.ts +3 -1
  51. package/dist/memory-recall.js +17 -0
  52. package/dist/memory-recall.js.map +1 -1
  53. package/dist/path-rules.d.ts +1 -0
  54. package/dist/path-rules.js +23 -1
  55. package/dist/path-rules.js.map +1 -1
  56. package/dist/pending-changes.js +4 -0
  57. package/dist/pending-changes.js.map +1 -1
  58. package/dist/server-instructions.js +1 -1
  59. package/dist/server-instructions.js.map +1 -1
  60. package/dist/tool-catalog.js +2 -2
  61. package/dist/tool-catalog.js.map +1 -1
  62. package/dist/tool-handlers/large-files.js +19 -1
  63. package/dist/tool-handlers/large-files.js.map +1 -1
  64. package/dist/tool-handlers/requirements.js +66 -19
  65. package/dist/tool-handlers/requirements.js.map +1 -1
  66. package/dist/tool-handlers.js +261 -1
  67. package/dist/tool-handlers.js.map +1 -1
  68. package/dist/tool-output.d.ts +39 -1
  69. package/dist/tool-output.js +26 -2
  70. package/dist/tool-output.js.map +1 -1
  71. package/dist/tool-schemas.d.ts +8 -0
  72. package/dist/tool-schemas.js +15 -1
  73. package/dist/tool-schemas.js.map +1 -1
  74. package/dist/types.d.ts +9 -1
  75. package/package.json +4 -1
@@ -0,0 +1,243 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { logActivity } from "../activity-log.js";
4
+ import { IGNORED_LIKE_PATTERNS, NOISE_FILE_BASENAMES, NOISE_FILE_SUFFIXES, isContentIndexableFile, isSymbolIndexableFile, shouldIgnoreContentFile, shouldIgnoreDbFilePath, } from "../path-rules.js";
5
+ import { getDb, getDeleteFileChunkItemsStatement, getDeleteSymbolsForFileStatement, getProjectRoot, hasDb, } from "./context.js";
6
+ export function pruneIgnoredIndexesByPathPatterns() {
7
+ if (!hasDb())
8
+ return { chunks_deleted: 0, symbols_deleted: 0 };
9
+ try {
10
+ if (!IGNORED_LIKE_PATTERNS.length)
11
+ return { chunks_deleted: 0, symbols_deleted: 0 };
12
+ const where = IGNORED_LIKE_PATTERNS
13
+ .map(() => "LOWER(REPLACE(file_path, '\\\\', '/')) LIKE ?")
14
+ .join(" OR ");
15
+ const chunksDeleted = getDb()
16
+ .prepare(`DELETE FROM memory_items
17
+ WHERE file_path IS NOT NULL
18
+ AND (kind = 'code_chunk' OR kind = 'doc_chunk')
19
+ AND (${where})`)
20
+ .run(...IGNORED_LIKE_PATTERNS).changes;
21
+ const symbolsDeleted = getDb()
22
+ .prepare(`DELETE FROM symbols
23
+ WHERE file_path IS NOT NULL
24
+ AND (${where})`)
25
+ .run(...IGNORED_LIKE_PATTERNS).changes;
26
+ if (chunksDeleted || symbolsDeleted) {
27
+ logActivity("index_prune", {
28
+ reason: "ignored_paths",
29
+ chunks_deleted: chunksDeleted,
30
+ symbols_deleted: symbolsDeleted,
31
+ });
32
+ }
33
+ return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
34
+ }
35
+ catch (err) {
36
+ console.error("[vectormind] prune indexes failed:", err);
37
+ return { chunks_deleted: 0, symbols_deleted: 0 };
38
+ }
39
+ }
40
+ export function pruneFilenameNoiseIndexes() {
41
+ if (!hasDb())
42
+ return { chunks_deleted: 0, symbols_deleted: 0 };
43
+ try {
44
+ const suffixWhere = NOISE_FILE_SUFFIXES.map(() => "LOWER(file_path) LIKE ?").join(" OR ");
45
+ const baseWhere = NOISE_FILE_BASENAMES.map(() => "(LOWER(file_path) = ? OR LOWER(file_path) LIKE ?)").join(" OR ");
46
+ const suffixArgs = NOISE_FILE_SUFFIXES.map((s) => `%${s}`);
47
+ const baseArgs = NOISE_FILE_BASENAMES.flatMap((n) => [n, `%/${n}`]);
48
+ const whereParts = [];
49
+ const args = [];
50
+ if (suffixWhere) {
51
+ whereParts.push(`(${suffixWhere})`);
52
+ args.push(...suffixArgs);
53
+ }
54
+ if (baseWhere) {
55
+ whereParts.push(`(${baseWhere})`);
56
+ args.push(...baseArgs);
57
+ }
58
+ if (!whereParts.length)
59
+ return { chunks_deleted: 0, symbols_deleted: 0 };
60
+ const where = whereParts.join(" OR ");
61
+ const chunksDeleted = getDb()
62
+ .prepare(`DELETE FROM memory_items
63
+ WHERE file_path IS NOT NULL
64
+ AND (kind = 'code_chunk' OR kind = 'doc_chunk')
65
+ AND (${where})`)
66
+ .run(...args).changes;
67
+ const symbolsDeleted = getDb()
68
+ .prepare(`DELETE FROM symbols
69
+ WHERE file_path IS NOT NULL
70
+ AND (${where})`)
71
+ .run(...args).changes;
72
+ if (chunksDeleted || symbolsDeleted) {
73
+ logActivity("index_prune", {
74
+ reason: "filename_noise",
75
+ chunks_deleted: chunksDeleted,
76
+ symbols_deleted: symbolsDeleted,
77
+ });
78
+ }
79
+ return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
80
+ }
81
+ catch (err) {
82
+ console.error("[vectormind] prune filename noise failed:", err);
83
+ return { chunks_deleted: 0, symbols_deleted: 0 };
84
+ }
85
+ }
86
+ function distinctChunkAndSymbolFilePaths(limit) {
87
+ const rows = getDb()
88
+ .prepare(`SELECT file_path
89
+ FROM (
90
+ SELECT file_path, MAX(updated_at) AS updated_at
91
+ FROM memory_items
92
+ WHERE file_path IS NOT NULL
93
+ AND (kind = 'code_chunk' OR kind = 'doc_chunk')
94
+ GROUP BY file_path
95
+ UNION
96
+ SELECT file_path, CURRENT_TIMESTAMP AS updated_at
97
+ FROM symbols
98
+ WHERE file_path IS NOT NULL
99
+ GROUP BY file_path
100
+ )
101
+ WHERE file_path IS NOT NULL
102
+ ORDER BY updated_at ASC
103
+ LIMIT ?`)
104
+ .all(limit);
105
+ return Array.from(new Set(rows.map((r) => r.file_path).filter(Boolean)));
106
+ }
107
+ function classifyStaleIndexFile(filePath) {
108
+ if (!filePath)
109
+ return "empty_path";
110
+ if (shouldIgnoreDbFilePath(filePath))
111
+ return "ignored_path";
112
+ if (shouldIgnoreContentFile(filePath))
113
+ return "filename_noise";
114
+ const absPath = path.isAbsolute(filePath) ? filePath : path.join(getProjectRoot(), filePath);
115
+ const rel = path.relative(getProjectRoot(), absPath);
116
+ if (rel.startsWith("..") || path.isAbsolute(rel))
117
+ return "outside_project";
118
+ let stat;
119
+ try {
120
+ stat = fs.statSync(absPath);
121
+ }
122
+ catch {
123
+ return "missing_file";
124
+ }
125
+ if (!stat.isFile())
126
+ return "not_file";
127
+ if (!isContentIndexableFile(absPath) && !isSymbolIndexableFile(absPath))
128
+ return "not_indexable";
129
+ return null;
130
+ }
131
+ export function pruneStaleFileIndexes(opts) {
132
+ const filePaths = distinctChunkAndSymbolFilePaths(Math.min(50_000, opts.maxIndexFiles * 3));
133
+ const matched = [];
134
+ const skipReasons = new Set(opts.skipReasons ?? []);
135
+ for (const fp of filePaths) {
136
+ if (matched.length >= opts.maxIndexFiles)
137
+ break;
138
+ const reason = classifyStaleIndexFile(fp);
139
+ if (reason && skipReasons.has(reason))
140
+ continue;
141
+ if (reason)
142
+ matched.push({ file_path: fp, reason });
143
+ }
144
+ let chunksDeleted = 0;
145
+ let symbolsDeleted = 0;
146
+ const samples = matched.slice(0, 20).map((m) => `${m.file_path} (${m.reason})`);
147
+ if (!opts.dryRun && matched.length) {
148
+ const tx = getDb().transaction(() => {
149
+ for (const m of matched) {
150
+ chunksDeleted += getDeleteFileChunkItemsStatement().run(m.file_path).changes;
151
+ symbolsDeleted += getDeleteSymbolsForFileStatement().run(m.file_path).changes;
152
+ }
153
+ });
154
+ try {
155
+ tx();
156
+ }
157
+ catch (err) {
158
+ console.error("[vectormind] prune stale indexes failed:", err);
159
+ }
160
+ }
161
+ else if (opts.dryRun && matched.length) {
162
+ const countChunksStmt = getDb().prepare(`SELECT COUNT(1) AS c
163
+ FROM memory_items
164
+ WHERE file_path = ?
165
+ AND (kind = 'code_chunk' OR kind = 'doc_chunk')`);
166
+ const countSymbolsStmt = getDb().prepare(`SELECT COUNT(1) AS c FROM symbols WHERE file_path = ?`);
167
+ for (const m of matched) {
168
+ chunksDeleted += Number(countChunksStmt.get(m.file_path)?.c ?? 0);
169
+ symbolsDeleted += Number(countSymbolsStmt.get(m.file_path)?.c ?? 0);
170
+ }
171
+ }
172
+ if (!opts.dryRun && (chunksDeleted || symbolsDeleted)) {
173
+ logActivity("index_prune", {
174
+ reason: "stale_files",
175
+ files_matched: matched.length,
176
+ chunks_deleted: chunksDeleted,
177
+ symbols_deleted: symbolsDeleted,
178
+ samples,
179
+ });
180
+ }
181
+ return {
182
+ files_checked: filePaths.length,
183
+ files_matched: matched.length,
184
+ chunks_deleted: chunksDeleted,
185
+ symbols_deleted: symbolsDeleted,
186
+ samples,
187
+ };
188
+ }
189
+ export function countIgnoredIndexDeletes() {
190
+ if (!IGNORED_LIKE_PATTERNS.length)
191
+ return { chunks_deleted: 0, symbols_deleted: 0 };
192
+ const where = IGNORED_LIKE_PATTERNS
193
+ .map(() => "LOWER(REPLACE(file_path, '\\\\', '/')) LIKE ?")
194
+ .join(" OR ");
195
+ const chunksDeleted = Number(getDb()
196
+ .prepare(`SELECT COUNT(1) AS c
197
+ FROM memory_items
198
+ WHERE file_path IS NOT NULL
199
+ AND (kind = 'code_chunk' OR kind = 'doc_chunk')
200
+ AND (${where})`)
201
+ .get(...IGNORED_LIKE_PATTERNS)?.c ?? 0);
202
+ const symbolsDeleted = Number(getDb()
203
+ .prepare(`SELECT COUNT(1) AS c
204
+ FROM symbols
205
+ WHERE file_path IS NOT NULL
206
+ AND (${where})`)
207
+ .get(...IGNORED_LIKE_PATTERNS)?.c ?? 0);
208
+ return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
209
+ }
210
+ export function countFilenameNoiseIndexDeletes() {
211
+ const suffixWhere = NOISE_FILE_SUFFIXES.map(() => "LOWER(file_path) LIKE ?").join(" OR ");
212
+ const baseWhere = NOISE_FILE_BASENAMES.map(() => "(LOWER(file_path) = ? OR LOWER(file_path) LIKE ?)").join(" OR ");
213
+ const suffixArgs = NOISE_FILE_SUFFIXES.map((s) => `%${s}`);
214
+ const baseArgs = NOISE_FILE_BASENAMES.flatMap((n) => [n, `%/${n}`]);
215
+ const whereParts = [];
216
+ const args = [];
217
+ if (suffixWhere) {
218
+ whereParts.push(`(${suffixWhere})`);
219
+ args.push(...suffixArgs);
220
+ }
221
+ if (baseWhere) {
222
+ whereParts.push(`(${baseWhere})`);
223
+ args.push(...baseArgs);
224
+ }
225
+ if (!whereParts.length)
226
+ return { chunks_deleted: 0, symbols_deleted: 0 };
227
+ const where = whereParts.join(" OR ");
228
+ const chunksDeleted = Number(getDb()
229
+ .prepare(`SELECT COUNT(1) AS c
230
+ FROM memory_items
231
+ WHERE file_path IS NOT NULL
232
+ AND (kind = 'code_chunk' OR kind = 'doc_chunk')
233
+ AND (${where})`)
234
+ .get(...args)?.c ?? 0);
235
+ const symbolsDeleted = Number(getDb()
236
+ .prepare(`SELECT COUNT(1) AS c
237
+ FROM symbols
238
+ WHERE file_path IS NOT NULL
239
+ AND (${where})`)
240
+ .get(...args)?.c ?? 0);
241
+ return { chunks_deleted: chunksDeleted, symbols_deleted: symbolsDeleted };
242
+ }
243
+ //# sourceMappingURL=index-prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-prune.js","sourceRoot":"","sources":["../../src/memory-maintenance/index-prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { MaintenanceMetricsPruneResult } from "./types.js";
2
+ export declare function pruneTokenSavings(opts: {
3
+ dryRun: boolean;
4
+ retentionDays: number;
5
+ }): MaintenanceMetricsPruneResult;
@@ -0,0 +1,22 @@
1
+ import { getDb } from "./context.js";
2
+ export function pruneTokenSavings(opts) {
3
+ const cutoff = new Date(Date.now() - opts.retentionDays * 86_400_000).toISOString();
4
+ let deleted = 0;
5
+ try {
6
+ if (opts.dryRun) {
7
+ deleted = Number(getDb()
8
+ .prepare(`SELECT COUNT(1) AS c FROM token_savings WHERE created_at < datetime('now', ?)`)
9
+ .get(`-${opts.retentionDays} days`)?.c ?? 0);
10
+ }
11
+ else {
12
+ deleted = getDb()
13
+ .prepare(`DELETE FROM token_savings WHERE created_at < datetime('now', ?)`)
14
+ .run(`-${opts.retentionDays} days`).changes;
15
+ }
16
+ }
17
+ catch (err) {
18
+ console.error("[vectormind] prune token_savings failed:", err);
19
+ }
20
+ return { cutoff, token_savings_deleted: deleted };
21
+ }
22
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/memory-maintenance/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGrC,MAAM,UAAU,iBAAiB,CAAC,IAAgD;IAChF,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACpF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,GAAG,MAAM,CAEZ,KAAK,EAAE;iBACJ,OAAO,CAAC,+EAA+E,CAAC;iBACxF,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,OAAO,CACrC,EAAE,CAAC,IAAI,CAAC,CACV,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,KAAK,EAAE;iBACd,OAAO,CAAC,iEAAiE,CAAC;iBAC1E,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,OAAO,CAAC,CAAC,OAAO,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MaintenancePendingPruneResult } from "./types.js";
2
+ export declare function prunePendingNoise(opts: {
3
+ dryRun: boolean;
4
+ }): MaintenancePendingPruneResult;
@@ -0,0 +1,74 @@
1
+ import { PENDING_MAX_ENTRIES, PENDING_TTL_DAYS } from "../config.js";
2
+ import { logActivity } from "../activity-log.js";
3
+ import { IGNORED_LIKE_PATTERNS } from "../path-rules.js";
4
+ import { getDb } from "./context.js";
5
+ function ignoredPathWhere(column = "file_path") {
6
+ return IGNORED_LIKE_PATTERNS
7
+ .map(() => `LOWER(REPLACE(${column}, '\\\\', '/')) LIKE ?`)
8
+ .join(" OR ");
9
+ }
10
+ export function prunePendingNoise(opts) {
11
+ let ignoredDeleted = 0;
12
+ let oldDeleted = 0;
13
+ let overflowDeleted = 0;
14
+ try {
15
+ const ignoredWhere = IGNORED_LIKE_PATTERNS.length ? ignoredPathWhere("file_path") : "";
16
+ if (IGNORED_LIKE_PATTERNS.length) {
17
+ if (opts.dryRun) {
18
+ ignoredDeleted = Number(getDb().prepare(`SELECT COUNT(1) AS c FROM pending_changes WHERE ${ignoredWhere}`).get(...IGNORED_LIKE_PATTERNS)?.c ?? 0);
19
+ }
20
+ else {
21
+ ignoredDeleted = getDb().prepare(`DELETE FROM pending_changes WHERE ${ignoredWhere}`).run(...IGNORED_LIKE_PATTERNS).changes;
22
+ }
23
+ }
24
+ if (PENDING_TTL_DAYS > 0) {
25
+ if (opts.dryRun) {
26
+ const where = ignoredWhere ? `updated_at < datetime('now', ?) AND NOT (${ignoredWhere})` : "updated_at < datetime('now', ?)";
27
+ const params = ignoredWhere ? [`-${PENDING_TTL_DAYS} days`, ...IGNORED_LIKE_PATTERNS] : [`-${PENDING_TTL_DAYS} days`];
28
+ oldDeleted = Number(getDb()
29
+ .prepare(`SELECT COUNT(1) AS c FROM pending_changes WHERE ${where}`)
30
+ .get(...params)?.c ?? 0);
31
+ }
32
+ else {
33
+ oldDeleted = Number(getDb()
34
+ .prepare(`DELETE FROM pending_changes WHERE updated_at < datetime('now', ?)`)
35
+ .run(`-${PENDING_TTL_DAYS} days`).changes);
36
+ }
37
+ }
38
+ const totalRows = Number(getDb().prepare(`SELECT COUNT(1) AS c FROM pending_changes`).get()?.c ?? 0);
39
+ const totalAfterIgnored = opts.dryRun ? Math.max(0, totalRows - ignoredDeleted - oldDeleted) : totalRows;
40
+ const overflow = PENDING_MAX_ENTRIES > 0 ? totalAfterIgnored - PENDING_MAX_ENTRIES : 0;
41
+ if (overflow > 0) {
42
+ if (opts.dryRun) {
43
+ overflowDeleted = overflow;
44
+ }
45
+ else {
46
+ overflowDeleted = getDb()
47
+ .prepare(`DELETE FROM pending_changes
48
+ WHERE file_path IN (
49
+ SELECT file_path FROM pending_changes
50
+ ORDER BY updated_at ASC
51
+ LIMIT ?
52
+ )`)
53
+ .run(overflow).changes;
54
+ }
55
+ }
56
+ }
57
+ catch (err) {
58
+ console.error("[vectormind] prune pending noise failed:", err);
59
+ }
60
+ if (!opts.dryRun && (ignoredDeleted || oldDeleted || overflowDeleted)) {
61
+ logActivity("pending_prune", {
62
+ reason: "maintenance",
63
+ ignored_deleted: ignoredDeleted,
64
+ old_deleted: oldDeleted,
65
+ overflow_deleted: overflowDeleted,
66
+ });
67
+ }
68
+ return {
69
+ ignored_deleted: ignoredDeleted,
70
+ old_deleted: oldDeleted,
71
+ overflow_deleted: overflowDeleted,
72
+ };
73
+ }
74
+ //# sourceMappingURL=pending.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending.js","sourceRoot":"","sources":["../../src/memory-maintenance/pending.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { MaintenancePurgeHiddenResult } from "./types.js";
2
+ export declare function purgeHiddenMemory(opts: {
3
+ dryRun: boolean;
4
+ purgeAfterDays: number;
5
+ maxMemoryItems: number;
6
+ purgeArchives: boolean;
7
+ }): MaintenancePurgeHiddenResult;
@@ -0,0 +1,115 @@
1
+ import { logActivity } from "../activity-log.js";
2
+ import { getDb } from "./context.js";
3
+ const SAFE_HARD_PURGE_KINDS = ["requirement", "change_intent", "note"];
4
+ function validMetadataExpr(alias) {
5
+ return `CASE WHEN json_valid(COALESCE(${alias}.metadata_json, '{}')) THEN COALESCE(${alias}.metadata_json, '{}') ELSE '{}' END`;
6
+ }
7
+ function hiddenMemoryWhere(alias = "m") {
8
+ const meta = validMetadataExpr(alias);
9
+ return `
10
+ ${alias}.kind IN (${SAFE_HARD_PURGE_KINDS.map(() => "?").join(", ")})
11
+ AND (
12
+ json_extract(${meta}, '$.status') IN ('compacted', 'superseded')
13
+ OR json_extract(${meta}, '$.compacted') = 1
14
+ OR json_extract(${meta}, '$.superseded') = 1
15
+ )
16
+ AND (
17
+ EXISTS (
18
+ SELECT 1
19
+ FROM memory_item_archive a
20
+ WHERE a.memory_id = ${alias}.id
21
+ AND COALESCE(a.original_updated_at, a.original_created_at, a.archived_at) < datetime('now', ?)
22
+ )
23
+ OR (
24
+ NOT EXISTS (SELECT 1 FROM memory_item_archive a2 WHERE a2.memory_id = ${alias}.id)
25
+ AND ${alias}.updated_at < datetime('now', ?)
26
+ )
27
+ )
28
+ `;
29
+ }
30
+ function selectHiddenMemoryPurgeCandidates(purgeAfterDays, limit) {
31
+ return getDb()
32
+ .prepare(`SELECT m.id, m.kind, m.title, m.content, m.file_path, m.start_line, m.end_line,
33
+ m.req_id, m.metadata_json, m.content_hash, m.created_at, m.updated_at
34
+ FROM memory_items m
35
+ WHERE ${hiddenMemoryWhere("m")}
36
+ ORDER BY m.updated_at ASC, m.id ASC
37
+ LIMIT ?`)
38
+ .all(...SAFE_HARD_PURGE_KINDS, `-${purgeAfterDays} days`, `-${purgeAfterDays} days`, Math.max(1, limit));
39
+ }
40
+ export function purgeHiddenMemory(opts) {
41
+ const cutoff = new Date(Date.now() - opts.purgeAfterDays * 86_400_000).toISOString();
42
+ const candidates = selectHiddenMemoryPurgeCandidates(opts.purgeAfterDays, opts.maxMemoryItems);
43
+ const samples = candidates.slice(0, 20).map((row) => ({
44
+ id: row.id,
45
+ kind: row.kind,
46
+ title: row.title,
47
+ file_path: row.file_path,
48
+ updated_at: row.updated_at,
49
+ }));
50
+ let memoryDeleted = 0;
51
+ let archiveCandidates = 0;
52
+ let archivesDeleted = 0;
53
+ try {
54
+ archiveCandidates = Number(getDb()
55
+ .prepare(`SELECT COUNT(1) AS c
56
+ FROM memory_item_archive
57
+ WHERE original_kind IN (${SAFE_HARD_PURGE_KINDS.map(() => "?").join(", ")})
58
+ AND archive_reason = 'auto_compaction'
59
+ AND COALESCE(original_updated_at, original_created_at, archived_at) < datetime('now', ?)`)
60
+ .get(...SAFE_HARD_PURGE_KINDS, `-${opts.purgeAfterDays} days`)?.c ?? 0);
61
+ }
62
+ catch (err) {
63
+ console.error("[vectormind] count hidden archives failed:", err);
64
+ }
65
+ if (!opts.dryRun && (candidates.length || (opts.purgeArchives && archiveCandidates))) {
66
+ const candidateIds = candidates.map((row) => row.id);
67
+ const tx = getDb().transaction(() => {
68
+ if (candidateIds.length) {
69
+ const deleteMemory = getDb().prepare(`DELETE FROM memory_items WHERE id = ?`);
70
+ for (const id of candidateIds) {
71
+ memoryDeleted += deleteMemory.run(id).changes;
72
+ }
73
+ }
74
+ if (opts.purgeArchives) {
75
+ archivesDeleted = getDb()
76
+ .prepare(`DELETE FROM memory_item_archive
77
+ WHERE rowid IN (
78
+ SELECT rowid
79
+ FROM memory_item_archive
80
+ WHERE original_kind IN (${SAFE_HARD_PURGE_KINDS.map(() => "?").join(", ")})
81
+ AND archive_reason = 'auto_compaction'
82
+ AND COALESCE(original_updated_at, original_created_at, archived_at) < datetime('now', ?)
83
+ ORDER BY COALESCE(original_updated_at, original_created_at, archived_at) ASC, memory_id ASC
84
+ LIMIT ?
85
+ )`)
86
+ .run(...SAFE_HARD_PURGE_KINDS, `-${opts.purgeAfterDays} days`, Math.max(1, opts.maxMemoryItems)).changes;
87
+ }
88
+ });
89
+ try {
90
+ tx();
91
+ }
92
+ catch (err) {
93
+ console.error("[vectormind] purge hidden memory failed:", err);
94
+ memoryDeleted = 0;
95
+ archivesDeleted = 0;
96
+ }
97
+ }
98
+ if (!opts.dryRun && (memoryDeleted || archivesDeleted)) {
99
+ logActivity("memory_maintenance", {
100
+ reason: "purge_hidden_memory",
101
+ memory_deleted: memoryDeleted,
102
+ archives_deleted: archivesDeleted,
103
+ purge_after_days: opts.purgeAfterDays,
104
+ });
105
+ }
106
+ return {
107
+ cutoff,
108
+ memory_candidates: candidates.length,
109
+ memory_deleted: memoryDeleted,
110
+ archive_candidates: archiveCandidates,
111
+ archives_deleted: archivesDeleted,
112
+ samples,
113
+ };
114
+ }
115
+ //# sourceMappingURL=purge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purge.js","sourceRoot":"","sources":["../../src/memory-maintenance/purge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MaintainMemoryArgs } from "../tool-schemas.js";
2
+ import type { MaintenanceResult } from "./types.js";
3
+ export declare function runMemoryMaintenance(args: MaintainMemoryArgs, trigger?: "manual" | "auto"): MaintenanceResult;
4
+ export declare function runAutoMaintenanceIfDue(): void;