@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.
Files changed (72) hide show
  1. package/README.md +21 -128
  2. package/dist/dashboard/dashboard.test.js +1 -1
  3. package/dist/dashboard/dashboard.test.js.map +1 -1
  4. package/dist/dashboard/public/app.js +39 -8
  5. package/dist/dashboard/public/index.html +50 -25
  6. package/dist/dashboard/server.js +46 -1
  7. package/dist/dashboard/server.js.map +1 -1
  8. package/dist/e2e.test.d.ts +2 -0
  9. package/dist/e2e.test.d.ts.map +1 -0
  10. package/dist/e2e.test.js +230 -0
  11. package/dist/e2e.test.js.map +1 -0
  12. package/dist/prompts/registry.d.ts.map +1 -1
  13. package/dist/prompts/registry.js +41 -29
  14. package/dist/prompts/registry.js.map +1 -1
  15. package/dist/resources/index.d.ts +1 -1
  16. package/dist/resources/index.d.ts.map +1 -1
  17. package/dist/resources/index.js +55 -28
  18. package/dist/resources/index.js.map +1 -1
  19. package/dist/resources/index.test.js +4 -0
  20. package/dist/resources/index.test.js.map +1 -1
  21. package/dist/router.d.ts.map +1 -1
  22. package/dist/router.js +3 -0
  23. package/dist/router.js.map +1 -1
  24. package/dist/router.test.js +5 -2
  25. package/dist/router.test.js.map +1 -1
  26. package/dist/server.js +32 -2
  27. package/dist/server.js.map +1 -1
  28. package/dist/storage/sqlite.d.ts +27 -83
  29. package/dist/storage/sqlite.d.ts.map +1 -1
  30. package/dist/storage/sqlite.js +280 -351
  31. package/dist/storage/sqlite.js.map +1 -1
  32. package/dist/storage/sqlite.test.js +6 -2
  33. package/dist/storage/sqlite.test.js.map +1 -1
  34. package/dist/storage/vectors.d.ts +14 -0
  35. package/dist/storage/vectors.d.ts.map +1 -0
  36. package/dist/storage/vectors.js +69 -0
  37. package/dist/storage/vectors.js.map +1 -0
  38. package/dist/tools/memory.acknowledge.d.ts +4 -0
  39. package/dist/tools/memory.acknowledge.d.ts.map +1 -0
  40. package/dist/tools/memory.acknowledge.js +32 -0
  41. package/dist/tools/memory.acknowledge.js.map +1 -0
  42. package/dist/tools/memory.search.d.ts.map +1 -1
  43. package/dist/tools/memory.search.js +86 -159
  44. package/dist/tools/memory.search.js.map +1 -1
  45. package/dist/tools/memory.store.d.ts.map +1 -1
  46. package/dist/tools/memory.store.js +34 -0
  47. package/dist/tools/memory.store.js.map +1 -1
  48. package/dist/tools/memory.update.d.ts.map +1 -1
  49. package/dist/tools/memory.update.js +11 -6
  50. package/dist/tools/memory.update.js.map +1 -1
  51. package/dist/tools/schemas.d.ts +168 -14
  52. package/dist/tools/schemas.d.ts.map +1 -1
  53. package/dist/tools/schemas.js +77 -103
  54. package/dist/tools/schemas.js.map +1 -1
  55. package/dist/types.d.ts +5 -1
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/utils/mcp-response.d.ts +2 -0
  58. package/dist/utils/mcp-response.d.ts.map +1 -1
  59. package/dist/utils/mcp-response.js +4 -1
  60. package/dist/utils/mcp-response.js.map +1 -1
  61. package/dist/utils/normalize.js +2 -2
  62. package/dist/utils/normalize.js.map +1 -1
  63. package/dist/utils/query-expander.d.ts.map +1 -1
  64. package/dist/utils/query-expander.js +24 -45
  65. package/dist/utils/query-expander.js.map +1 -1
  66. package/dist/utils/query-expander.test.js +10 -12
  67. package/dist/utils/query-expander.test.js.map +1 -1
  68. package/dist/v2-features.test.d.ts +2 -0
  69. package/dist/v2-features.test.d.ts.map +1 -0
  70. package/dist/v2-features.test.js +106 -0
  71. package/dist/v2-features.test.js.map +1 -0
  72. 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.33",
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",