@vheins/local-memory-mcp 0.1.33 → 0.1.35
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 +21 -128
- package/dist/dashboard/dashboard.test.js +1 -1
- package/dist/dashboard/dashboard.test.js.map +1 -1
- package/dist/dashboard/public/app.js +39 -8
- package/dist/dashboard/public/index.html +50 -25
- package/dist/dashboard/server.js +46 -1
- package/dist/dashboard/server.js.map +1 -1
- package/dist/e2e.test.d.ts +2 -0
- package/dist/e2e.test.d.ts.map +1 -0
- package/dist/e2e.test.js +230 -0
- package/dist/e2e.test.js.map +1 -0
- package/dist/prompts/registry.d.ts.map +1 -1
- package/dist/prompts/registry.js +41 -29
- package/dist/prompts/registry.js.map +1 -1
- package/dist/resources/index.d.ts +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +55 -28
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/index.test.js +4 -0
- package/dist/resources/index.test.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +3 -0
- package/dist/router.js.map +1 -1
- package/dist/router.test.js +5 -2
- package/dist/router.test.js.map +1 -1
- package/dist/server.js +32 -2
- package/dist/server.js.map +1 -1
- package/dist/storage/sqlite.d.ts +27 -83
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +280 -351
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/storage/sqlite.test.js +6 -2
- package/dist/storage/sqlite.test.js.map +1 -1
- package/dist/storage/vectors.d.ts +14 -0
- package/dist/storage/vectors.d.ts.map +1 -0
- package/dist/storage/vectors.js +69 -0
- package/dist/storage/vectors.js.map +1 -0
- package/dist/tools/memory.acknowledge.d.ts +4 -0
- package/dist/tools/memory.acknowledge.d.ts.map +1 -0
- package/dist/tools/memory.acknowledge.js +32 -0
- package/dist/tools/memory.acknowledge.js.map +1 -0
- package/dist/tools/memory.search.d.ts.map +1 -1
- package/dist/tools/memory.search.js +86 -159
- package/dist/tools/memory.search.js.map +1 -1
- package/dist/tools/memory.store.d.ts.map +1 -1
- package/dist/tools/memory.store.js +34 -0
- package/dist/tools/memory.store.js.map +1 -1
- package/dist/tools/memory.update.d.ts.map +1 -1
- package/dist/tools/memory.update.js +11 -6
- package/dist/tools/memory.update.js.map +1 -1
- package/dist/tools/schemas.d.ts +168 -14
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +77 -103
- package/dist/tools/schemas.js.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/mcp-response.d.ts +2 -0
- package/dist/utils/mcp-response.d.ts.map +1 -1
- package/dist/utils/mcp-response.js +4 -1
- package/dist/utils/mcp-response.js.map +1 -1
- package/dist/utils/normalize.js +2 -2
- package/dist/utils/normalize.js.map +1 -1
- package/dist/utils/query-expander.d.ts.map +1 -1
- package/dist/utils/query-expander.js +24 -45
- package/dist/utils/query-expander.js.map +1 -1
- package/dist/utils/query-expander.test.js +10 -12
- package/dist/utils/query-expander.test.js.map +1 -1
- package/dist/v2-features.test.d.ts +2 -0
- package/dist/v2-features.test.d.ts.map +1 -0
- package/dist/v2-features.test.js +106 -0
- package/dist/v2-features.test.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import { SQLiteStore } from "./storage/sqlite.js";
|
|
3
|
+
import { handleMemoryStore } from "./tools/memory.store.js";
|
|
4
|
+
import { handleMemorySearch } from "./tools/memory.search.js";
|
|
5
|
+
import { handleMemoryAcknowledge } from "./tools/memory.acknowledge.js";
|
|
6
|
+
const VALID_UUID_1 = "11111111-1111-4111-a111-111111111111";
|
|
7
|
+
const VALID_UUID_2 = "22222222-2222-4222-a222-222222222222";
|
|
8
|
+
const mockVectors = {
|
|
9
|
+
upsert: vi.fn().mockResolvedValue(undefined),
|
|
10
|
+
remove: vi.fn().mockResolvedValue(undefined),
|
|
11
|
+
search: vi.fn().mockResolvedValue([]),
|
|
12
|
+
};
|
|
13
|
+
function makeEntry(overrides) {
|
|
14
|
+
return {
|
|
15
|
+
id: overrides.id || VALID_UUID_1,
|
|
16
|
+
type: overrides.type || "decision",
|
|
17
|
+
title: overrides.title || "Test Title",
|
|
18
|
+
content: overrides.content || "Test content for memory",
|
|
19
|
+
importance: overrides.importance || 3,
|
|
20
|
+
scope: { repo: overrides.repo || "test-repo" },
|
|
21
|
+
created_at: new Date().toISOString(),
|
|
22
|
+
updated_at: new Date().toISOString(),
|
|
23
|
+
hit_count: 0,
|
|
24
|
+
recall_count: 0,
|
|
25
|
+
last_used_at: null,
|
|
26
|
+
expires_at: null,
|
|
27
|
+
supersedes: overrides.supersedes || null,
|
|
28
|
+
status: overrides.status || "active",
|
|
29
|
+
tags: overrides.tags || [],
|
|
30
|
+
is_global: overrides.is_global || false,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
describe("V2 Enhanced Memory Features", () => {
|
|
34
|
+
describe("1. Conflict Detection & Supersedes", () => {
|
|
35
|
+
it("should reject a new memory if a similar one exists (>0.85) and no supersedes is provided", async () => {
|
|
36
|
+
const db = new SQLiteStore(":memory:");
|
|
37
|
+
const repo = "conflict-repo";
|
|
38
|
+
db.insert(makeEntry({ id: VALID_UUID_1, repo, content: "React frontend" }));
|
|
39
|
+
mockVectors.search = vi.fn().mockResolvedValue([{ id: VALID_UUID_1, score: 0.9 }]);
|
|
40
|
+
const params = {
|
|
41
|
+
type: "decision",
|
|
42
|
+
title: "Conflict Test",
|
|
43
|
+
content: "React frontend again",
|
|
44
|
+
importance: 5,
|
|
45
|
+
scope: { repo }
|
|
46
|
+
};
|
|
47
|
+
const response = await handleMemoryStore(params, db, mockVectors);
|
|
48
|
+
expect(response.content[0].text).toContain("conflict");
|
|
49
|
+
db.close();
|
|
50
|
+
});
|
|
51
|
+
it("should archive old memory when superseded", async () => {
|
|
52
|
+
const db = new SQLiteStore(":memory:");
|
|
53
|
+
const repo = "supersede-repo";
|
|
54
|
+
db.insert(makeEntry({ id: VALID_UUID_1, repo }));
|
|
55
|
+
const params = {
|
|
56
|
+
type: "decision",
|
|
57
|
+
title: "New One",
|
|
58
|
+
content: "Better content",
|
|
59
|
+
importance: 5,
|
|
60
|
+
scope: { repo },
|
|
61
|
+
supersedes: VALID_UUID_1
|
|
62
|
+
};
|
|
63
|
+
await handleMemoryStore(params, db, mockVectors);
|
|
64
|
+
const old = db.getById(VALID_UUID_1);
|
|
65
|
+
expect(old?.status).toBe("archived");
|
|
66
|
+
db.close();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("2. Strict Search Threshold (0.72)", () => {
|
|
70
|
+
it("should filter out results using dynamic threshold", async () => {
|
|
71
|
+
const db = new SQLiteStore(":memory:");
|
|
72
|
+
const repo = "threshold-repo";
|
|
73
|
+
db.insert(makeEntry({ id: VALID_UUID_1, repo, content: "Target" }));
|
|
74
|
+
db.insert(makeEntry({ id: VALID_UUID_2, repo, content: "Noisy" }));
|
|
75
|
+
// Adding more memories to force a stricter threshold (> 5 memories)
|
|
76
|
+
for (let i = 0; i < 5; i++) {
|
|
77
|
+
db.insert(makeEntry({ id: `00000000-0000-4000-a000-00000000000${i + 3}`, repo, content: "Irrelevant" }));
|
|
78
|
+
}
|
|
79
|
+
mockVectors.search = vi.fn().mockResolvedValue([
|
|
80
|
+
{ id: VALID_UUID_1, score: 0.8 },
|
|
81
|
+
{ id: VALID_UUID_2, score: 0.2 }, // Should be filtered out if threshold is high
|
|
82
|
+
{ id: "00000000-0000-4000-a000-000000000003", score: 0.1 }
|
|
83
|
+
]);
|
|
84
|
+
const params = { query: "Target", repo };
|
|
85
|
+
const response = await handleMemorySearch(params, db, mockVectors);
|
|
86
|
+
const text = response.content[0].text;
|
|
87
|
+
// With > 5 memories, threshold should be 0.40
|
|
88
|
+
expect(text).toContain("Found 1 memories");
|
|
89
|
+
db.close();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe("3. Feedback Loop", () => {
|
|
93
|
+
it("should increment recall_count on 'used'", async () => {
|
|
94
|
+
const db = new SQLiteStore(":memory:");
|
|
95
|
+
db.insert(makeEntry({ id: VALID_UUID_1 }));
|
|
96
|
+
await handleMemoryAcknowledge({
|
|
97
|
+
memory_id: VALID_UUID_1,
|
|
98
|
+
status: "used"
|
|
99
|
+
}, db);
|
|
100
|
+
const updated = db.getById(VALID_UUID_1);
|
|
101
|
+
expect(updated?.recall_count).toBe(1);
|
|
102
|
+
db.close();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=v2-features.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v2-features.test.js","sourceRoot":"","sources":["../src/v2-features.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vheins/local-memory-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.35",
|
|
4
4
|
"description": "MCP Local Memory Service for coding copilot agents",
|
|
5
5
|
"mcpName": "io.github.vheins/local-memory-mcp",
|
|
6
6
|
"type": "module",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"test:watch": "vitest"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
+
"@xenova/transformers": "^2.17.2",
|
|
40
41
|
"better-sqlite3": "^12.6.2",
|
|
41
42
|
"express": "^5.2.1",
|
|
42
43
|
"qs": "^6.15.0",
|