@vheins/local-memory-mcp 0.1.2 → 0.1.4
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/dist/dashboard/server.js +0 -0
- package/dist/server.js +0 -0
- package/dist/storage/sqlite.d.ts +95 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +537 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/sqlite.test.d.ts +2 -0
- package/dist/storage/sqlite.test.d.ts.map +1 -0
- package/dist/storage/sqlite.test.js.map +1 -0
- package/dist/storage/vectors.stub.d.ts +12 -0
- package/dist/storage/vectors.stub.d.ts.map +1 -0
- package/dist/storage/vectors.stub.js +88 -0
- package/dist/storage/vectors.stub.js.map +1 -0
- package/package.json +7 -9
package/dist/dashboard/server.js
CHANGED
|
File without changes
|
package/dist/server.js
CHANGED
|
File without changes
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { MemoryEntry } from "../types.js";
|
|
2
|
+
export declare class SQLiteStore {
|
|
3
|
+
private db;
|
|
4
|
+
constructor(dbPath?: string);
|
|
5
|
+
private migrate;
|
|
6
|
+
insert(entry: MemoryEntry): void;
|
|
7
|
+
update(id: string, updates: {
|
|
8
|
+
title?: string;
|
|
9
|
+
content?: string;
|
|
10
|
+
importance?: number;
|
|
11
|
+
}): void;
|
|
12
|
+
searchByRepo(repo: string, options?: {
|
|
13
|
+
types?: string[];
|
|
14
|
+
minImportance?: number;
|
|
15
|
+
limit?: number;
|
|
16
|
+
}): MemoryEntry[];
|
|
17
|
+
getById(id: string): MemoryEntry | null;
|
|
18
|
+
getByIdWithStats(id: string): (MemoryEntry & {
|
|
19
|
+
recall_rate: number;
|
|
20
|
+
}) | null;
|
|
21
|
+
listRecent(limit?: number): Array<{
|
|
22
|
+
id: string;
|
|
23
|
+
type: string;
|
|
24
|
+
repo: string;
|
|
25
|
+
}>;
|
|
26
|
+
getSummary(repo: string): {
|
|
27
|
+
summary: string;
|
|
28
|
+
updated_at: string;
|
|
29
|
+
} | null;
|
|
30
|
+
upsertSummary(repo: string, summary: string): void;
|
|
31
|
+
delete(id: string): void;
|
|
32
|
+
listRepos(): string[];
|
|
33
|
+
listRepoNavigation(): Array<{
|
|
34
|
+
repo: string;
|
|
35
|
+
memory_count: number;
|
|
36
|
+
last_updated_at: string | null;
|
|
37
|
+
}>;
|
|
38
|
+
incrementHitCount(id: string): void;
|
|
39
|
+
incrementRecallCount(id: string): void;
|
|
40
|
+
getStats(repo?: string): {
|
|
41
|
+
total: number;
|
|
42
|
+
byType: Record<string, number>;
|
|
43
|
+
unused: number;
|
|
44
|
+
};
|
|
45
|
+
getRecentMemories(repo: string, limit: number, offset?: number): MemoryEntry[];
|
|
46
|
+
getTotalCount(repo: string): number;
|
|
47
|
+
searchBySimilarity(query: string, repo: string, limit?: number): Array<MemoryEntry & {
|
|
48
|
+
similarity: number;
|
|
49
|
+
}>;
|
|
50
|
+
archiveExpiredMemories(): number;
|
|
51
|
+
getAllMemoriesWithStats(repo?: string): Array<MemoryEntry & {
|
|
52
|
+
hit_count: number;
|
|
53
|
+
recall_count: number;
|
|
54
|
+
recall_rate: number;
|
|
55
|
+
last_used_at: string | null;
|
|
56
|
+
}>;
|
|
57
|
+
listMemoriesForDashboard(options: {
|
|
58
|
+
repo: string;
|
|
59
|
+
type?: string;
|
|
60
|
+
search?: string;
|
|
61
|
+
minImportance?: number;
|
|
62
|
+
maxImportance?: number;
|
|
63
|
+
sortBy?: string;
|
|
64
|
+
sortOrder?: "asc" | "desc";
|
|
65
|
+
limit?: number;
|
|
66
|
+
offset?: number;
|
|
67
|
+
}): {
|
|
68
|
+
items: Array<MemoryEntry & {
|
|
69
|
+
hit_count: number;
|
|
70
|
+
recall_count: number;
|
|
71
|
+
recall_rate: number;
|
|
72
|
+
last_used_at: string | null;
|
|
73
|
+
}>;
|
|
74
|
+
total: number;
|
|
75
|
+
};
|
|
76
|
+
upsertVectorEmbedding(memoryId: string, vector: number[] | string[]): void;
|
|
77
|
+
getVectorEmbedding(memoryId: string): number[] | string[] | null;
|
|
78
|
+
close(): void;
|
|
79
|
+
private computeVector;
|
|
80
|
+
private cosineSimilarity;
|
|
81
|
+
private rowToMemoryEntry;
|
|
82
|
+
logAction(action: 'search' | 'read' | 'write' | 'update' | 'delete', repo: string, options?: {
|
|
83
|
+
query?: string;
|
|
84
|
+
memoryId?: string;
|
|
85
|
+
resultCount?: number;
|
|
86
|
+
}): void;
|
|
87
|
+
getRecentActions(repo?: string, limit?: number): Array<{
|
|
88
|
+
action: string;
|
|
89
|
+
query?: string;
|
|
90
|
+
memory_id?: string;
|
|
91
|
+
result_count?: number;
|
|
92
|
+
created_at: string;
|
|
93
|
+
}>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { tokenize } from "../utils/normalize.js";
|
|
5
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const DB_PATH = path.join(__dirname, "../../storage/memory.db");
|
|
7
|
+
export class SQLiteStore {
|
|
8
|
+
db;
|
|
9
|
+
constructor(dbPath) {
|
|
10
|
+
this.db = new Database(dbPath ?? DB_PATH);
|
|
11
|
+
this.migrate();
|
|
12
|
+
}
|
|
13
|
+
migrate() {
|
|
14
|
+
// Create base tables
|
|
15
|
+
this.db.exec(`
|
|
16
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
17
|
+
id TEXT PRIMARY KEY,
|
|
18
|
+
repo TEXT NOT NULL,
|
|
19
|
+
type TEXT NOT NULL CHECK (type IN (
|
|
20
|
+
'code_fact',
|
|
21
|
+
'decision',
|
|
22
|
+
'mistake',
|
|
23
|
+
'pattern'
|
|
24
|
+
)),
|
|
25
|
+
title TEXT,
|
|
26
|
+
content TEXT NOT NULL,
|
|
27
|
+
importance INTEGER NOT NULL CHECK (importance BETWEEN 1 AND 5),
|
|
28
|
+
folder TEXT,
|
|
29
|
+
language TEXT,
|
|
30
|
+
created_at TEXT NOT NULL,
|
|
31
|
+
updated_at TEXT NOT NULL,
|
|
32
|
+
hit_count INTEGER NOT NULL DEFAULT 0,
|
|
33
|
+
recall_count INTEGER NOT NULL DEFAULT 0,
|
|
34
|
+
last_used_at TEXT
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_memories_repo ON memories(repo);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_memories_importance ON memories(importance);
|
|
40
|
+
CREATE INDEX IF NOT EXISTS idx_memories_hit_count ON memories(hit_count);
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at);
|
|
42
|
+
CREATE INDEX IF NOT EXISTS idx_memories_updated_at ON memories(updated_at);
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_memories_repo_created_at ON memories(repo, created_at DESC);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_memories_repo_hit_count ON memories(repo, hit_count DESC);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_memories_title ON memories(title);
|
|
46
|
+
|
|
47
|
+
CREATE TABLE IF NOT EXISTS memory_summary (
|
|
48
|
+
repo TEXT PRIMARY KEY,
|
|
49
|
+
summary TEXT NOT NULL,
|
|
50
|
+
updated_at TEXT NOT NULL
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
CREATE TABLE IF NOT EXISTS memory_vectors (
|
|
54
|
+
memory_id TEXT PRIMARY KEY,
|
|
55
|
+
vector TEXT NOT NULL,
|
|
56
|
+
updated_at TEXT NOT NULL,
|
|
57
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
58
|
+
);
|
|
59
|
+
`);
|
|
60
|
+
// Add title column if it doesn't exist (for existing databases)
|
|
61
|
+
try {
|
|
62
|
+
this.db.exec(`ALTER TABLE memories ADD COLUMN title TEXT`);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
// Column already exists, ignore
|
|
66
|
+
}
|
|
67
|
+
this.db.exec(`
|
|
68
|
+
CREATE TABLE IF NOT EXISTS memories_archive (
|
|
69
|
+
id TEXT PRIMARY KEY,
|
|
70
|
+
repo TEXT NOT NULL,
|
|
71
|
+
type TEXT NOT NULL,
|
|
72
|
+
content TEXT NOT NULL,
|
|
73
|
+
importance INTEGER NOT NULL,
|
|
74
|
+
folder TEXT,
|
|
75
|
+
language TEXT,
|
|
76
|
+
created_at TEXT NOT NULL,
|
|
77
|
+
updated_at TEXT NOT NULL,
|
|
78
|
+
hit_count INTEGER NOT NULL DEFAULT 0,
|
|
79
|
+
recall_count INTEGER NOT NULL DEFAULT 0,
|
|
80
|
+
last_used_at TEXT,
|
|
81
|
+
expires_at TEXT,
|
|
82
|
+
archived_at TEXT NOT NULL
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
CREATE TABLE IF NOT EXISTS action_log (
|
|
86
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
87
|
+
action TEXT NOT NULL CHECK (action IN ('search', 'read', 'write', 'update', 'delete')),
|
|
88
|
+
query TEXT,
|
|
89
|
+
memory_id TEXT,
|
|
90
|
+
repo TEXT NOT NULL,
|
|
91
|
+
result_count INTEGER NOT NULL DEFAULT 0,
|
|
92
|
+
created_at TEXT NOT NULL
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_action_log_repo ON action_log(repo);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_action_log_created_at ON action_log(created_at);
|
|
97
|
+
`);
|
|
98
|
+
// Sub-task 2.1: Use PRAGMA table_info to safely add columns
|
|
99
|
+
const existingColumns = this.db.prepare("PRAGMA table_info(memories)").all().map((col) => col.name);
|
|
100
|
+
const columnsToAdd = [
|
|
101
|
+
{ name: "hit_count", definition: "ALTER TABLE memories ADD COLUMN hit_count INTEGER NOT NULL DEFAULT 0" },
|
|
102
|
+
{ name: "recall_count", definition: "ALTER TABLE memories ADD COLUMN recall_count INTEGER NOT NULL DEFAULT 0" },
|
|
103
|
+
{ name: "last_used_at", definition: "ALTER TABLE memories ADD COLUMN last_used_at TEXT" },
|
|
104
|
+
{ name: "expires_at", definition: "ALTER TABLE memories ADD COLUMN expires_at TEXT" },
|
|
105
|
+
];
|
|
106
|
+
for (const col of columnsToAdd) {
|
|
107
|
+
if (!existingColumns.includes(col.name)) {
|
|
108
|
+
this.db.exec(col.definition);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
insert(entry) {
|
|
113
|
+
if (!entry.title) {
|
|
114
|
+
throw new Error("Title is required for memory entry");
|
|
115
|
+
}
|
|
116
|
+
const stmt = this.db.prepare(`
|
|
117
|
+
INSERT INTO memories (
|
|
118
|
+
id, repo, type, title, content, importance, folder, language,
|
|
119
|
+
created_at, updated_at, hit_count, recall_count, last_used_at, expires_at
|
|
120
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0, NULL, ?)
|
|
121
|
+
`);
|
|
122
|
+
stmt.run(entry.id, entry.scope.repo, entry.type, entry.title, entry.content, entry.importance, entry.scope.folder || null, entry.scope.language || null, entry.created_at, entry.updated_at, entry.expires_at ?? null);
|
|
123
|
+
}
|
|
124
|
+
update(id, updates) {
|
|
125
|
+
const fields = [];
|
|
126
|
+
const values = [];
|
|
127
|
+
if (updates.title !== undefined) {
|
|
128
|
+
if (updates.title.length < 3) {
|
|
129
|
+
throw new Error("Title must be at least 3 characters");
|
|
130
|
+
}
|
|
131
|
+
fields.push("title = ?");
|
|
132
|
+
values.push(updates.title);
|
|
133
|
+
}
|
|
134
|
+
if (updates.content !== undefined) {
|
|
135
|
+
fields.push("content = ?");
|
|
136
|
+
values.push(updates.content);
|
|
137
|
+
}
|
|
138
|
+
if (updates.importance !== undefined) {
|
|
139
|
+
fields.push("importance = ?");
|
|
140
|
+
values.push(updates.importance);
|
|
141
|
+
}
|
|
142
|
+
if (fields.length === 0) {
|
|
143
|
+
return; // Nothing to update
|
|
144
|
+
}
|
|
145
|
+
fields.push("updated_at = ?");
|
|
146
|
+
values.push(new Date().toISOString());
|
|
147
|
+
values.push(id);
|
|
148
|
+
const stmt = this.db.prepare(`
|
|
149
|
+
UPDATE memories
|
|
150
|
+
SET ${fields.join(", ")}
|
|
151
|
+
WHERE id = ?
|
|
152
|
+
`);
|
|
153
|
+
stmt.run(...values);
|
|
154
|
+
}
|
|
155
|
+
// Sub-task 2.4: Exclude expired memories from searchByRepo
|
|
156
|
+
searchByRepo(repo, options = {}) {
|
|
157
|
+
let query = `SELECT * FROM memories WHERE repo = ?
|
|
158
|
+
AND (expires_at IS NULL OR expires_at > datetime('now'))`;
|
|
159
|
+
const params = [repo];
|
|
160
|
+
if (options.types && options.types.length > 0) {
|
|
161
|
+
const placeholders = options.types.map(() => "?").join(", ");
|
|
162
|
+
query += ` AND type IN (${placeholders})`;
|
|
163
|
+
params.push(...options.types);
|
|
164
|
+
}
|
|
165
|
+
if (options.minImportance !== undefined) {
|
|
166
|
+
query += " AND importance >= ?";
|
|
167
|
+
params.push(options.minImportance);
|
|
168
|
+
}
|
|
169
|
+
query += " ORDER BY importance DESC, created_at DESC";
|
|
170
|
+
if (options.limit !== undefined) {
|
|
171
|
+
query += " LIMIT ?";
|
|
172
|
+
params.push(options.limit);
|
|
173
|
+
}
|
|
174
|
+
const stmt = this.db.prepare(query);
|
|
175
|
+
const rows = stmt.all(...params);
|
|
176
|
+
return rows.map((row) => this.rowToMemoryEntry(row));
|
|
177
|
+
}
|
|
178
|
+
getById(id) {
|
|
179
|
+
const stmt = this.db.prepare("SELECT * FROM memories WHERE id = ?");
|
|
180
|
+
const row = stmt.get(id);
|
|
181
|
+
if (!row)
|
|
182
|
+
return null;
|
|
183
|
+
return this.rowToMemoryEntry(row);
|
|
184
|
+
}
|
|
185
|
+
getByIdWithStats(id) {
|
|
186
|
+
const stmt = this.db.prepare(`
|
|
187
|
+
SELECT *,
|
|
188
|
+
CASE WHEN hit_count > 0 THEN CAST(recall_count AS REAL) / hit_count ELSE 0 END AS recall_rate
|
|
189
|
+
FROM memories
|
|
190
|
+
WHERE id = ?
|
|
191
|
+
`);
|
|
192
|
+
const row = stmt.get(id);
|
|
193
|
+
if (!row)
|
|
194
|
+
return null;
|
|
195
|
+
return {
|
|
196
|
+
...this.rowToMemoryEntry(row),
|
|
197
|
+
recall_rate: row.recall_rate ?? 0,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
listRecent(limit = 10) {
|
|
201
|
+
const stmt = this.db.prepare(`
|
|
202
|
+
SELECT id, type, repo
|
|
203
|
+
FROM memories
|
|
204
|
+
ORDER BY created_at DESC
|
|
205
|
+
LIMIT ?
|
|
206
|
+
`);
|
|
207
|
+
return stmt.all(limit);
|
|
208
|
+
}
|
|
209
|
+
getSummary(repo) {
|
|
210
|
+
const stmt = this.db.prepare("SELECT summary, updated_at FROM memory_summary WHERE repo = ?");
|
|
211
|
+
return stmt.get(repo);
|
|
212
|
+
}
|
|
213
|
+
upsertSummary(repo, summary) {
|
|
214
|
+
const stmt = this.db.prepare(`
|
|
215
|
+
INSERT INTO memory_summary (repo, summary, updated_at)
|
|
216
|
+
VALUES (?, ?, ?)
|
|
217
|
+
ON CONFLICT(repo) DO UPDATE SET
|
|
218
|
+
summary = excluded.summary,
|
|
219
|
+
updated_at = excluded.updated_at
|
|
220
|
+
`);
|
|
221
|
+
stmt.run(repo, summary, new Date().toISOString());
|
|
222
|
+
}
|
|
223
|
+
delete(id) {
|
|
224
|
+
const stmt = this.db.prepare("DELETE FROM memories WHERE id = ?");
|
|
225
|
+
stmt.run(id);
|
|
226
|
+
}
|
|
227
|
+
// Sub-task 2.5: Renamed from listAllRepos to listRepos
|
|
228
|
+
listRepos() {
|
|
229
|
+
const stmt = this.db.prepare("SELECT DISTINCT repo FROM memories ORDER BY repo");
|
|
230
|
+
const rows = stmt.all();
|
|
231
|
+
return rows.map((row) => row.repo);
|
|
232
|
+
}
|
|
233
|
+
listRepoNavigation() {
|
|
234
|
+
const stmt = this.db.prepare(`
|
|
235
|
+
SELECT
|
|
236
|
+
repo,
|
|
237
|
+
COUNT(*) AS memory_count,
|
|
238
|
+
MAX(COALESCE(updated_at, created_at)) AS last_updated_at
|
|
239
|
+
FROM memories
|
|
240
|
+
GROUP BY repo
|
|
241
|
+
ORDER BY last_updated_at DESC, repo ASC
|
|
242
|
+
`);
|
|
243
|
+
return stmt.all();
|
|
244
|
+
}
|
|
245
|
+
incrementHitCount(id) {
|
|
246
|
+
const stmt = this.db.prepare(`
|
|
247
|
+
UPDATE memories
|
|
248
|
+
SET hit_count = hit_count + 1,
|
|
249
|
+
last_used_at = ?
|
|
250
|
+
WHERE id = ?
|
|
251
|
+
`);
|
|
252
|
+
stmt.run(new Date().toISOString(), id);
|
|
253
|
+
}
|
|
254
|
+
incrementRecallCount(id) {
|
|
255
|
+
const stmt = this.db.prepare(`
|
|
256
|
+
UPDATE memories
|
|
257
|
+
SET recall_count = recall_count + 1,
|
|
258
|
+
last_used_at = ?
|
|
259
|
+
WHERE id = ?
|
|
260
|
+
`);
|
|
261
|
+
stmt.run(new Date().toISOString(), id);
|
|
262
|
+
}
|
|
263
|
+
getStats(repo) {
|
|
264
|
+
let query = "SELECT type, COUNT(*) as count FROM memories";
|
|
265
|
+
const params = [];
|
|
266
|
+
if (repo) {
|
|
267
|
+
query += " WHERE repo = ?";
|
|
268
|
+
params.push(repo);
|
|
269
|
+
}
|
|
270
|
+
query += " GROUP BY type";
|
|
271
|
+
const stmt = this.db.prepare(query);
|
|
272
|
+
const rows = stmt.all(...params);
|
|
273
|
+
const byType = {};
|
|
274
|
+
let total = 0;
|
|
275
|
+
for (const row of rows) {
|
|
276
|
+
byType[row.type] = row.count;
|
|
277
|
+
total += row.count;
|
|
278
|
+
}
|
|
279
|
+
let unusedQuery = "SELECT COUNT(*) as count FROM memories WHERE hit_count = 0";
|
|
280
|
+
if (repo) {
|
|
281
|
+
unusedQuery += " AND repo = ?";
|
|
282
|
+
}
|
|
283
|
+
const unusedStmt = this.db.prepare(unusedQuery);
|
|
284
|
+
const unusedRow = (repo ? unusedStmt.get(repo) : unusedStmt.get());
|
|
285
|
+
const unused = unusedRow?.count || 0;
|
|
286
|
+
return { total, byType, unused };
|
|
287
|
+
}
|
|
288
|
+
// Sub-task 2.2: Public method for Memory_Recap
|
|
289
|
+
getRecentMemories(repo, limit, offset = 0) {
|
|
290
|
+
const stmt = this.db.prepare(`
|
|
291
|
+
SELECT * FROM memories
|
|
292
|
+
WHERE repo = ?
|
|
293
|
+
ORDER BY created_at DESC
|
|
294
|
+
LIMIT ? OFFSET ?
|
|
295
|
+
`);
|
|
296
|
+
const rows = stmt.all(repo, limit, offset);
|
|
297
|
+
return rows.map((row) => this.rowToMemoryEntry(row));
|
|
298
|
+
}
|
|
299
|
+
// Sub-task 2.2: Public method for total count
|
|
300
|
+
getTotalCount(repo) {
|
|
301
|
+
const stmt = this.db.prepare("SELECT COUNT(*) as count FROM memories WHERE repo = ?");
|
|
302
|
+
const row = stmt.get(repo);
|
|
303
|
+
return row?.count ?? 0;
|
|
304
|
+
}
|
|
305
|
+
// Sub-task 2.3: searchBySimilarity with pre-filter SQL + exclude expired
|
|
306
|
+
searchBySimilarity(query, repo, limit = 10) {
|
|
307
|
+
const queryVector = this.computeVector(query);
|
|
308
|
+
const now = new Date().toISOString();
|
|
309
|
+
// Pre-filter: fetch at most limit*10 candidates, exclude expired
|
|
310
|
+
const stmt = this.db.prepare(`
|
|
311
|
+
SELECT * FROM memories
|
|
312
|
+
WHERE repo = ?
|
|
313
|
+
AND (expires_at IS NULL OR expires_at > ?)
|
|
314
|
+
ORDER BY importance DESC, created_at DESC
|
|
315
|
+
LIMIT ?
|
|
316
|
+
`);
|
|
317
|
+
const candidates = stmt.all(repo, now, limit * 10);
|
|
318
|
+
const withSimilarity = candidates.map((row) => {
|
|
319
|
+
const memory = this.rowToMemoryEntry(row);
|
|
320
|
+
const memoryVector = this.computeVector(memory.content);
|
|
321
|
+
const similarity = this.cosineSimilarity(queryVector, memoryVector);
|
|
322
|
+
return {
|
|
323
|
+
id: row.id,
|
|
324
|
+
type: row.type,
|
|
325
|
+
title: row.title || undefined,
|
|
326
|
+
content: row.content,
|
|
327
|
+
importance: row.importance,
|
|
328
|
+
scope: {
|
|
329
|
+
repo: row.repo,
|
|
330
|
+
folder: row.folder || undefined,
|
|
331
|
+
language: row.language || undefined,
|
|
332
|
+
},
|
|
333
|
+
created_at: row.created_at,
|
|
334
|
+
updated_at: row.updated_at,
|
|
335
|
+
hit_count: row.hit_count ?? 0,
|
|
336
|
+
recall_count: row.recall_count ?? 0,
|
|
337
|
+
last_used_at: row.last_used_at ?? null,
|
|
338
|
+
expires_at: row.expires_at ?? null,
|
|
339
|
+
similarity
|
|
340
|
+
};
|
|
341
|
+
});
|
|
342
|
+
return withSimilarity
|
|
343
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
344
|
+
.slice(0, limit);
|
|
345
|
+
}
|
|
346
|
+
// Sub-task 2.5: Archive expired memories
|
|
347
|
+
archiveExpiredMemories() {
|
|
348
|
+
const now = new Date().toISOString();
|
|
349
|
+
const insertArchive = this.db.prepare(`
|
|
350
|
+
INSERT OR IGNORE INTO memories_archive
|
|
351
|
+
(id, repo, type, content, importance, folder, language,
|
|
352
|
+
created_at, updated_at, hit_count, recall_count, last_used_at, expires_at, archived_at)
|
|
353
|
+
SELECT id, repo, type, content, importance, folder, language,
|
|
354
|
+
created_at, updated_at, hit_count, recall_count, last_used_at, expires_at, ?
|
|
355
|
+
FROM memories
|
|
356
|
+
WHERE expires_at IS NOT NULL AND expires_at <= ?
|
|
357
|
+
`);
|
|
358
|
+
const deleteExpired = this.db.prepare(`
|
|
359
|
+
DELETE FROM memories
|
|
360
|
+
WHERE expires_at IS NOT NULL AND expires_at <= ?
|
|
361
|
+
`);
|
|
362
|
+
const archive = this.db.transaction(() => {
|
|
363
|
+
insertArchive.run(now, now);
|
|
364
|
+
const result = deleteExpired.run(now);
|
|
365
|
+
return result.changes;
|
|
366
|
+
});
|
|
367
|
+
return archive();
|
|
368
|
+
}
|
|
369
|
+
// Get all memories with stats (for dashboard)
|
|
370
|
+
getAllMemoriesWithStats(repo) {
|
|
371
|
+
let query = "SELECT * FROM memories";
|
|
372
|
+
const params = [];
|
|
373
|
+
if (repo) {
|
|
374
|
+
query += " WHERE repo = ?";
|
|
375
|
+
params.push(repo);
|
|
376
|
+
}
|
|
377
|
+
query += " ORDER BY hit_count DESC, importance DESC, created_at DESC";
|
|
378
|
+
const stmt = this.db.prepare(query);
|
|
379
|
+
const rows = stmt.all(...params);
|
|
380
|
+
return rows.map((row) => ({
|
|
381
|
+
...this.rowToMemoryEntry(row),
|
|
382
|
+
hit_count: row.hit_count || 0,
|
|
383
|
+
recall_count: row.recall_count || 0,
|
|
384
|
+
recall_rate: row.hit_count > 0 ? row.recall_count / row.hit_count : 0,
|
|
385
|
+
last_used_at: row.last_used_at ?? null,
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
listMemoriesForDashboard(options) {
|
|
389
|
+
const where = ["repo = ?"];
|
|
390
|
+
const params = [options.repo];
|
|
391
|
+
if (options.type) {
|
|
392
|
+
where.push("type = ?");
|
|
393
|
+
params.push(options.type);
|
|
394
|
+
}
|
|
395
|
+
if (options.search) {
|
|
396
|
+
where.push("(LOWER(COALESCE(title, '')) LIKE ? OR LOWER(content) LIKE ? OR LOWER(id) LIKE ?)");
|
|
397
|
+
const term = `%${options.search.toLowerCase()}%`;
|
|
398
|
+
params.push(term, term, term);
|
|
399
|
+
}
|
|
400
|
+
if (options.minImportance !== undefined) {
|
|
401
|
+
where.push("importance >= ?");
|
|
402
|
+
params.push(options.minImportance);
|
|
403
|
+
}
|
|
404
|
+
if (options.maxImportance !== undefined) {
|
|
405
|
+
where.push("importance <= ?");
|
|
406
|
+
params.push(options.maxImportance);
|
|
407
|
+
}
|
|
408
|
+
const whereSql = where.length > 0 ? `WHERE ${where.join(" AND ")}` : "";
|
|
409
|
+
const sortableColumns = {
|
|
410
|
+
id: "id",
|
|
411
|
+
title: "COALESCE(title, content)",
|
|
412
|
+
type: "type",
|
|
413
|
+
importance: "importance",
|
|
414
|
+
hit_count: "hit_count",
|
|
415
|
+
recall_rate: "recall_rate",
|
|
416
|
+
created_at: "created_at",
|
|
417
|
+
updated_at: "updated_at",
|
|
418
|
+
};
|
|
419
|
+
const sortBy = sortableColumns[options.sortBy ?? "hit_count"] ?? sortableColumns.hit_count;
|
|
420
|
+
const sortOrder = options.sortOrder === "asc" ? "ASC" : "DESC";
|
|
421
|
+
const limit = options.limit ?? 25;
|
|
422
|
+
const offset = options.offset ?? 0;
|
|
423
|
+
const countStmt = this.db.prepare(`SELECT COUNT(*) AS count FROM memories ${whereSql}`);
|
|
424
|
+
const total = countStmt.get(...params)?.count ?? 0;
|
|
425
|
+
const listStmt = this.db.prepare(`
|
|
426
|
+
SELECT *,
|
|
427
|
+
CASE WHEN hit_count > 0 THEN CAST(recall_count AS REAL) / hit_count ELSE 0 END AS recall_rate
|
|
428
|
+
FROM memories
|
|
429
|
+
${whereSql}
|
|
430
|
+
ORDER BY ${sortBy} ${sortOrder}, created_at DESC
|
|
431
|
+
LIMIT ? OFFSET ?
|
|
432
|
+
`);
|
|
433
|
+
const rows = listStmt.all(...params, limit, offset);
|
|
434
|
+
return {
|
|
435
|
+
items: rows.map((row) => ({
|
|
436
|
+
...this.rowToMemoryEntry(row),
|
|
437
|
+
hit_count: row.hit_count || 0,
|
|
438
|
+
recall_count: row.recall_count || 0,
|
|
439
|
+
recall_rate: row.recall_rate ?? 0,
|
|
440
|
+
last_used_at: row.last_used_at ?? null,
|
|
441
|
+
})),
|
|
442
|
+
total,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
upsertVectorEmbedding(memoryId, vector) {
|
|
446
|
+
const stmt = this.db.prepare(`
|
|
447
|
+
INSERT INTO memory_vectors (memory_id, vector, updated_at)
|
|
448
|
+
VALUES (?, ?, ?)
|
|
449
|
+
ON CONFLICT(memory_id) DO UPDATE SET
|
|
450
|
+
vector = excluded.vector,
|
|
451
|
+
updated_at = excluded.updated_at
|
|
452
|
+
`);
|
|
453
|
+
stmt.run(memoryId, JSON.stringify(vector), new Date().toISOString());
|
|
454
|
+
}
|
|
455
|
+
getVectorEmbedding(memoryId) {
|
|
456
|
+
const stmt = this.db.prepare("SELECT vector FROM memory_vectors WHERE memory_id = ?");
|
|
457
|
+
const row = stmt.get(memoryId);
|
|
458
|
+
if (!row)
|
|
459
|
+
return null;
|
|
460
|
+
try {
|
|
461
|
+
return JSON.parse(row.vector);
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
return null;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
close() {
|
|
468
|
+
this.db.close();
|
|
469
|
+
}
|
|
470
|
+
// Sub-task 2.3: Use tokenize() from normalize.ts (single source of truth)
|
|
471
|
+
computeVector(text) {
|
|
472
|
+
const tokens = tokenize(text);
|
|
473
|
+
const vector = {};
|
|
474
|
+
for (const token of tokens) {
|
|
475
|
+
vector[token] = (vector[token] || 0) + 1;
|
|
476
|
+
}
|
|
477
|
+
return vector;
|
|
478
|
+
}
|
|
479
|
+
cosineSimilarity(v1, v2) {
|
|
480
|
+
const keys1 = Object.keys(v1);
|
|
481
|
+
const keys2 = Object.keys(v2);
|
|
482
|
+
if (keys1.length === 0 || keys2.length === 0)
|
|
483
|
+
return 0;
|
|
484
|
+
let dotProduct = 0;
|
|
485
|
+
for (const key of keys1) {
|
|
486
|
+
if (v2[key]) {
|
|
487
|
+
dotProduct += v1[key] * v2[key];
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
const mag1 = Math.sqrt(keys1.reduce((sum, key) => sum + v1[key] * v1[key], 0));
|
|
491
|
+
const mag2 = Math.sqrt(keys2.reduce((sum, key) => sum + v2[key] * v2[key], 0));
|
|
492
|
+
if (mag1 === 0 || mag2 === 0)
|
|
493
|
+
return 0;
|
|
494
|
+
return dotProduct / (mag1 * mag2);
|
|
495
|
+
}
|
|
496
|
+
rowToMemoryEntry(row) {
|
|
497
|
+
return {
|
|
498
|
+
id: row.id,
|
|
499
|
+
type: row.type,
|
|
500
|
+
title: row.title || undefined,
|
|
501
|
+
content: row.content,
|
|
502
|
+
importance: row.importance,
|
|
503
|
+
scope: {
|
|
504
|
+
repo: row.repo,
|
|
505
|
+
folder: row.folder || undefined,
|
|
506
|
+
language: row.language || undefined,
|
|
507
|
+
},
|
|
508
|
+
created_at: row.created_at,
|
|
509
|
+
updated_at: row.updated_at,
|
|
510
|
+
hit_count: row.hit_count ?? 0,
|
|
511
|
+
recall_count: row.recall_count ?? 0,
|
|
512
|
+
last_used_at: row.last_used_at ?? null,
|
|
513
|
+
expires_at: row.expires_at ?? null,
|
|
514
|
+
};
|
|
515
|
+
}
|
|
516
|
+
logAction(action, repo, options) {
|
|
517
|
+
const stmt = this.db.prepare(`
|
|
518
|
+
INSERT INTO action_log (action, query, memory_id, repo, result_count, created_at)
|
|
519
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
520
|
+
`);
|
|
521
|
+
stmt.run(action, options?.query || null, options?.memoryId || null, repo, options?.resultCount || 0, new Date().toISOString());
|
|
522
|
+
}
|
|
523
|
+
getRecentActions(repo, limit = 20) {
|
|
524
|
+
let sql = `SELECT action, query, memory_id, result_count, created_at FROM action_log`;
|
|
525
|
+
const params = [];
|
|
526
|
+
if (repo) {
|
|
527
|
+
sql += ` WHERE repo = ?`;
|
|
528
|
+
params.push(repo);
|
|
529
|
+
}
|
|
530
|
+
sql += ` ORDER BY created_at DESC, id DESC LIMIT ?`;
|
|
531
|
+
params.push(String(limit));
|
|
532
|
+
const stmt = this.db.prepare(sql);
|
|
533
|
+
const rows = repo ? stmt.all(repo, String(limit)) : stmt.all(String(limit));
|
|
534
|
+
return rows;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.test.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.test.js","sourceRoot":"","sources":["../../src/storage/sqlite.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { VectorStore, VectorResult } from "../types.js";
|
|
2
|
+
import { SQLiteStore } from "./sqlite.js";
|
|
3
|
+
export declare class StubVectorStore implements VectorStore {
|
|
4
|
+
private db;
|
|
5
|
+
constructor(db?: SQLiteStore);
|
|
6
|
+
private generateTextVector;
|
|
7
|
+
private calculateSimilarity;
|
|
8
|
+
upsert(id: string, text: string): Promise<void>;
|
|
9
|
+
remove(id: string): Promise<void>;
|
|
10
|
+
search(query: string, limit: number): Promise<VectorResult[]>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=vectors.stub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectors.stub.d.ts","sourceRoot":"","sources":["../../src/storage/vectors.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,EAAE,CAAc;gBAEZ,EAAE,CAAC,EAAE,WAAW;IAQ5B,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,mBAAmB;IAarB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAiBpE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Simple vector store using SQLite - lightweight embeddings without ollama
|
|
2
|
+
export class StubVectorStore {
|
|
3
|
+
db;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
if (!db) {
|
|
6
|
+
throw new Error("SQLiteStore required for vector operations");
|
|
7
|
+
}
|
|
8
|
+
this.db = db;
|
|
9
|
+
}
|
|
10
|
+
// Generate simple text-based vector (TF-IDF style) without external embeddings
|
|
11
|
+
generateTextVector(text) {
|
|
12
|
+
const normalized = text.toLowerCase()
|
|
13
|
+
// Remove punctuation and special characters, but keep Indonesian characters
|
|
14
|
+
.replace(/[^\w\s\u00C0-\u017F]/g, ' ')
|
|
15
|
+
// Normalize multiple spaces to single space
|
|
16
|
+
.replace(/\s+/g, ' ')
|
|
17
|
+
.trim()
|
|
18
|
+
.split(/\s+/)
|
|
19
|
+
.filter(word => word.length > 2);
|
|
20
|
+
const stopwords = new Set([
|
|
21
|
+
// English stopwords
|
|
22
|
+
'the', 'is', 'at', 'which', 'on', 'and', 'or', 'but', 'for', 'with',
|
|
23
|
+
'to', 'from', 'by', 'as', 'in', 'of', 'a', 'an', 'be', 'this', 'that',
|
|
24
|
+
'are', 'was', 'were', 'been', 'have', 'has', 'had', 'do', 'does', 'did',
|
|
25
|
+
// Indonesian stopwords
|
|
26
|
+
'yang', 'di', 'ke', 'dari', 'untuk', 'dengan', 'oleh', 'pada', 'dalam', 'atas',
|
|
27
|
+
'bawah', 'depan', 'belakang', 'samping', 'sebelah', 'antara', 'diantara', 'melalui',
|
|
28
|
+
'selama', 'sampai', 'hingga', 'sejak', 'sebelum', 'sesudah', 'setelah', 'sebelumnya',
|
|
29
|
+
'kemudian', 'selanjutnya', 'lagi', 'juga', 'pun', 'bahkan', 'malah', 'bahwa',
|
|
30
|
+
'karena', 'sebab', 'oleh', 'karena', 'sehingga', 'maka', 'lalu', 'kemudian',
|
|
31
|
+
'saya', 'kamu', 'dia', 'kami', 'kalian', 'mereka', 'aku', 'engkau', 'ia', 'kita',
|
|
32
|
+
'anda', 'beliau', 'mereka', 'siapa', 'apa', 'dimana', 'kapan', 'bagaimana', 'mengapa',
|
|
33
|
+
'berapa', 'banyak', 'sedikit', 'semua', 'beberapa', 'banyak', 'sedikit', 'hampir',
|
|
34
|
+
'hanya', 'sudah', 'belum', 'masih', 'lagi', 'selalu', 'kadang', 'sering', 'jarang',
|
|
35
|
+
'pernah', 'belum', 'sudah', 'akan', 'sedang', 'telah', 'baru', 'lama', 'cepat',
|
|
36
|
+
'lambat', 'besar', 'kecil', 'panjang', 'pendek', 'tinggi', 'rendah', 'lebar', 'sempit',
|
|
37
|
+
'tebal', 'tipis', 'berat', 'ringan', 'kuat', 'lemah', 'baik', 'buruk', 'benar', 'salah',
|
|
38
|
+
'cantik', 'jelek', 'indah', 'buruk', 'bagus', 'jelek', 'suka', 'tidak', 'bukan',
|
|
39
|
+
'jangan', 'harus', 'boleh', 'bisa', 'mampu', 'dapat', 'mau', 'ingin', 'perlu', 'penting',
|
|
40
|
+
// Additional common Indonesian words
|
|
41
|
+
'dan', 'atau', 'tapi', 'namun', 'lalu', 'kemudian', 'jadi', 'maka', 'yaitu', 'yakni'
|
|
42
|
+
]);
|
|
43
|
+
return normalized.filter(word => !stopwords.has(word));
|
|
44
|
+
}
|
|
45
|
+
// Calculate similarity between two token sets
|
|
46
|
+
calculateSimilarity(tokens1, tokens2) {
|
|
47
|
+
if (tokens1.length === 0 || tokens2.length === 0)
|
|
48
|
+
return 0;
|
|
49
|
+
const set1 = new Set(tokens1);
|
|
50
|
+
const set2 = new Set(tokens2);
|
|
51
|
+
// Jaccard similarity: intersection / union
|
|
52
|
+
const intersection = new Set([...set1].filter(x => set2.has(x)));
|
|
53
|
+
const union = new Set([...set1, ...set2]);
|
|
54
|
+
return union.size > 0 ? intersection.size / union.size : 0;
|
|
55
|
+
}
|
|
56
|
+
async upsert(id, text) {
|
|
57
|
+
try {
|
|
58
|
+
// Generate simple vector from text tokens
|
|
59
|
+
const tokens = this.generateTextVector(text);
|
|
60
|
+
// Store tokens as JSON array for better retrieval
|
|
61
|
+
this.db.upsertVectorEmbedding(id, tokens);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error("Error upserting vector:", error);
|
|
65
|
+
// Silently fail - vector is optional for search fallback
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async remove(id) {
|
|
69
|
+
// Vectors are automatically removed by CASCADE when memory is deleted
|
|
70
|
+
}
|
|
71
|
+
async search(query, limit) {
|
|
72
|
+
try {
|
|
73
|
+
// Get all memories and compute similarity to query
|
|
74
|
+
const queryTokens = this.generateTextVector(query);
|
|
75
|
+
if (queryTokens.length === 0) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
// For now, return empty - we'll use similarity search in SQLite instead
|
|
79
|
+
// In production, you could implement approximate nearest neighbor search here
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error("Error searching vectors:", error);
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=vectors.stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectors.stub.js","sourceRoot":"","sources":["../../src/storage/vectors.stub.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vheins/local-memory-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "MCP Local Memory Service for coding copilot agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/server.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"local-memory-mcp": "dist/server.js",
|
|
9
|
+
"mcp-memory-dashboard": "dist/dashboard/server.js"
|
|
10
|
+
},
|
|
11
|
+
"author": "Muhammad Rheza Alfin <m.rheza.alfin@gmail.com>",
|
|
12
|
+
"license": "MIT",
|
|
7
13
|
"scripts": {
|
|
8
14
|
"build": "tsc && mkdir -p dist/dashboard/public && rsync -a --delete src/dashboard/public/ dist/dashboard/public/",
|
|
9
15
|
"dev": "tsc --watch",
|
|
@@ -13,14 +19,6 @@
|
|
|
13
19
|
"test": "vitest --run",
|
|
14
20
|
"test:watch": "vitest"
|
|
15
21
|
},
|
|
16
|
-
"keywords": [
|
|
17
|
-
"mcp",
|
|
18
|
-
"memory",
|
|
19
|
-
"ai",
|
|
20
|
-
"coding-copilot"
|
|
21
|
-
],
|
|
22
|
-
"author": "",
|
|
23
|
-
"license": "MIT",
|
|
24
22
|
"dependencies": {
|
|
25
23
|
"better-sqlite3": "^12.6.2",
|
|
26
24
|
"express": "^5.2.1",
|