@coreyuan/vector-mind 1.0.52 → 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 +14 -15
- 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/fix-patterns.d.ts +58 -0
- package/dist/fix-patterns.js +347 -0
- package/dist/fix-patterns.js.map +1 -0
- 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 +22 -0
- package/dist/memory-recall.js.map +1 -1
- 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-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 +5 -1
- package/dist/server-instructions.js.map +1 -1
- package/dist/tool-catalog.js +13 -7
- 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/memory-diagnostics.js +53 -4
- package/dist/tool-handlers/memory-diagnostics.js.map +1 -1
- package/dist/tool-handlers/memory.js +20 -2
- package/dist/tool-handlers/memory.js.map +1 -1
- 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.js +106 -17
- package/dist/tool-handlers/requirements.js.map +1 -1
- package/dist/tool-handlers.js +263 -1
- package/dist/tool-handlers.js.map +1 -1
- package/dist/tool-output.d.ts +92 -1
- package/dist/tool-output.js +76 -2
- package/dist/tool-output.js.map +1 -1
- package/dist/tool-schemas.d.ts +34 -0
- package/dist/tool-schemas.js +37 -1
- package/dist/tool-schemas.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/package.json +4 -1
- package/skills/vector-mind-autopilot/SKILL.md +24 -0
- package/skills/vector-mind-autopilot/references/claude-project-instructions.md +4 -0
- package/skills/vector-mind-autopilot/references/universal-system-prompt.md +4 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/memory-maintenance/compaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
export type MemoryMaintenanceContext = {
|
|
3
|
+
getDb: () => Database.Database | undefined;
|
|
4
|
+
getProjectRoot: () => string;
|
|
5
|
+
getDbPath: () => string;
|
|
6
|
+
getKvStatement: () => Database.Statement | undefined;
|
|
7
|
+
getSetKvStatement: () => Database.Statement | undefined;
|
|
8
|
+
getDeleteFileChunkItemsStatement: () => Database.Statement;
|
|
9
|
+
getDeleteSymbolsForFileStatement: () => Database.Statement;
|
|
10
|
+
getInsertMemoryItemStatement: () => Database.Statement;
|
|
11
|
+
sha256Hex: (input: string) => string;
|
|
12
|
+
parseMetadataJson: (raw: string | null | undefined) => Record<string, unknown>;
|
|
13
|
+
metadataStatus: (row: {
|
|
14
|
+
metadata_json: string | null | undefined;
|
|
15
|
+
}) => string | null;
|
|
16
|
+
isHiddenFromDefaultRecall: (row: {
|
|
17
|
+
metadata_json: string | null | undefined;
|
|
18
|
+
}) => boolean;
|
|
19
|
+
};
|
|
20
|
+
export declare function configureMemoryMaintenance(context: MemoryMaintenanceContext): void;
|
|
21
|
+
export declare function hasDb(): boolean;
|
|
22
|
+
export declare function getDb(): Database.Database;
|
|
23
|
+
export declare function getProjectRoot(): string;
|
|
24
|
+
export declare function getDbPath(): string;
|
|
25
|
+
export declare function getKvStatement(): Database.Statement | undefined;
|
|
26
|
+
export declare function getSetKvStatement(): Database.Statement | undefined;
|
|
27
|
+
export declare function getDeleteFileChunkItemsStatement(): Database.Statement;
|
|
28
|
+
export declare function getDeleteSymbolsForFileStatement(): Database.Statement;
|
|
29
|
+
export declare function getInsertMemoryItemStatement(): Database.Statement;
|
|
30
|
+
export declare function sha256Hex(input: string): string;
|
|
31
|
+
export declare function parseMetadataJson(raw: string | null | undefined): Record<string, unknown>;
|
|
32
|
+
export declare function metadataStatus(row: {
|
|
33
|
+
metadata_json: string | null | undefined;
|
|
34
|
+
}): string | null;
|
|
35
|
+
export declare function isHiddenFromDefaultRecall(row: {
|
|
36
|
+
metadata_json: string | null | undefined;
|
|
37
|
+
}): boolean;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
let memoryMaintenanceContext = null;
|
|
2
|
+
export function configureMemoryMaintenance(context) {
|
|
3
|
+
memoryMaintenanceContext = context;
|
|
4
|
+
}
|
|
5
|
+
function requireMemoryMaintenanceContext() {
|
|
6
|
+
if (!memoryMaintenanceContext)
|
|
7
|
+
throw new Error("[VectorMind] memory maintenance context is not configured");
|
|
8
|
+
return memoryMaintenanceContext;
|
|
9
|
+
}
|
|
10
|
+
export function hasDb() {
|
|
11
|
+
return !!requireMemoryMaintenanceContext().getDb();
|
|
12
|
+
}
|
|
13
|
+
export function getDb() {
|
|
14
|
+
const db = requireMemoryMaintenanceContext().getDb();
|
|
15
|
+
if (!db)
|
|
16
|
+
throw new Error("[VectorMind] database is not initialized");
|
|
17
|
+
return db;
|
|
18
|
+
}
|
|
19
|
+
export function getProjectRoot() {
|
|
20
|
+
return requireMemoryMaintenanceContext().getProjectRoot();
|
|
21
|
+
}
|
|
22
|
+
export function getDbPath() {
|
|
23
|
+
return requireMemoryMaintenanceContext().getDbPath();
|
|
24
|
+
}
|
|
25
|
+
export function getKvStatement() {
|
|
26
|
+
return requireMemoryMaintenanceContext().getKvStatement();
|
|
27
|
+
}
|
|
28
|
+
export function getSetKvStatement() {
|
|
29
|
+
return requireMemoryMaintenanceContext().getSetKvStatement();
|
|
30
|
+
}
|
|
31
|
+
export function getDeleteFileChunkItemsStatement() {
|
|
32
|
+
return requireMemoryMaintenanceContext().getDeleteFileChunkItemsStatement();
|
|
33
|
+
}
|
|
34
|
+
export function getDeleteSymbolsForFileStatement() {
|
|
35
|
+
return requireMemoryMaintenanceContext().getDeleteSymbolsForFileStatement();
|
|
36
|
+
}
|
|
37
|
+
export function getInsertMemoryItemStatement() {
|
|
38
|
+
return requireMemoryMaintenanceContext().getInsertMemoryItemStatement();
|
|
39
|
+
}
|
|
40
|
+
export function sha256Hex(input) {
|
|
41
|
+
return requireMemoryMaintenanceContext().sha256Hex(input);
|
|
42
|
+
}
|
|
43
|
+
export function parseMetadataJson(raw) {
|
|
44
|
+
return requireMemoryMaintenanceContext().parseMetadataJson(raw);
|
|
45
|
+
}
|
|
46
|
+
export function metadataStatus(row) {
|
|
47
|
+
return requireMemoryMaintenanceContext().metadataStatus(row);
|
|
48
|
+
}
|
|
49
|
+
export function isHiddenFromDefaultRecall(row) {
|
|
50
|
+
return requireMemoryMaintenanceContext().isHiddenFromDefaultRecall(row);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/memory-maintenance/context.ts"],"names":[],"mappings":"AAiBA,IAAI,wBAAwB,GAAoC,IAAI,CAAC;AAErE,MAAM,UAAU,0BAA0B,CAAC,OAAiC;IAC1E,wBAAwB,GAAG,OAAO,CAAC;AACrC,CAAC;AAED,SAAS,+BAA+B;IACtC,IAAI,CAAC,wBAAwB;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC5G,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,OAAO,CAAC,CAAC,+BAA+B,EAAE,CAAC,KAAK,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,MAAM,EAAE,GAAG,+BAA+B,EAAE,CAAC,KAAK,EAAE,CAAC;IACrD,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACrE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,+BAA+B,EAAE,CAAC,cAAc,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,+BAA+B,EAAE,CAAC,SAAS,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,+BAA+B,EAAE,CAAC,cAAc,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,+BAA+B,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gCAAgC;IAC9C,OAAO,+BAA+B,EAAE,CAAC,gCAAgC,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gCAAgC;IAC9C,OAAO,+BAA+B,EAAE,CAAC,gCAAgC,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,OAAO,+BAA+B,EAAE,CAAC,4BAA4B,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,+BAA+B,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAA8B;IAC9D,OAAO,+BAA+B,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAiD;IAC9E,OAAO,+BAA+B,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAiD;IACzF,OAAO,+BAA+B,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MaintenanceIndexPruneResult } from "./types.js";
|
|
2
|
+
export declare function pruneIgnoredIndexesByPathPatterns(): {
|
|
3
|
+
chunks_deleted: number;
|
|
4
|
+
symbols_deleted: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function pruneFilenameNoiseIndexes(): {
|
|
7
|
+
chunks_deleted: number;
|
|
8
|
+
symbols_deleted: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function pruneStaleFileIndexes(opts: {
|
|
11
|
+
dryRun: boolean;
|
|
12
|
+
maxIndexFiles: number;
|
|
13
|
+
skipReasons?: string[];
|
|
14
|
+
}): MaintenanceIndexPruneResult["stale_files"];
|
|
15
|
+
export declare function countIgnoredIndexDeletes(): {
|
|
16
|
+
chunks_deleted: number;
|
|
17
|
+
symbols_deleted: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function countFilenameNoiseIndexDeletes(): {
|
|
20
|
+
chunks_deleted: number;
|
|
21
|
+
symbols_deleted: number;
|
|
22
|
+
};
|
|
@@ -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,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,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,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;
|