@vheins/local-memory-mcp 0.4.12 → 0.5.1

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 (201) hide show
  1. package/README.md +21 -0
  2. package/bin/mcp-memory-server.js +1 -1
  3. package/dist/dashboard/public/assets/index-KxrQ6fPK.css +1 -0
  4. package/dist/dashboard/public/assets/index-Lu37nzOi.js +72 -0
  5. package/dist/dashboard/public/index.html +11 -1772
  6. package/dist/dashboard/server.js +115 -5
  7. package/dist/dashboard/server.js.map +1 -1
  8. package/dist/mcp/capabilities.d.ts +22 -0
  9. package/dist/mcp/capabilities.d.ts.map +1 -0
  10. package/dist/mcp/capabilities.js +38 -0
  11. package/dist/mcp/capabilities.js.map +1 -0
  12. package/dist/mcp/client.js +3 -3
  13. package/dist/mcp/client.js.map +1 -1
  14. package/dist/mcp/completion.d.ts +25 -0
  15. package/dist/mcp/completion.d.ts.map +1 -0
  16. package/dist/mcp/completion.js +127 -0
  17. package/dist/mcp/completion.js.map +1 -0
  18. package/dist/mcp/prompts/registry.d.ts +330 -0
  19. package/dist/mcp/prompts/registry.d.ts.map +1 -0
  20. package/dist/mcp/prompts/registry.js +1066 -0
  21. package/dist/mcp/prompts/registry.js.map +1 -0
  22. package/dist/mcp/resources/index.d.ts +68 -0
  23. package/dist/mcp/resources/index.d.ts.map +1 -0
  24. package/dist/mcp/resources/index.js +323 -0
  25. package/dist/mcp/resources/index.js.map +1 -0
  26. package/dist/mcp/router.d.ts +14 -0
  27. package/dist/mcp/router.d.ts.map +1 -0
  28. package/dist/mcp/router.js +242 -0
  29. package/dist/mcp/router.js.map +1 -0
  30. package/dist/mcp/server.d.ts +3 -0
  31. package/dist/mcp/server.d.ts.map +1 -0
  32. package/dist/mcp/server.js +338 -0
  33. package/dist/mcp/server.js.map +1 -0
  34. package/dist/mcp/storage/sqlite.d.ts +83 -0
  35. package/dist/mcp/storage/sqlite.d.ts.map +1 -0
  36. package/dist/mcp/storage/sqlite.js +1237 -0
  37. package/dist/mcp/storage/sqlite.js.map +1 -0
  38. package/dist/mcp/storage/vectors.d.ts +19 -0
  39. package/dist/mcp/storage/vectors.d.ts.map +1 -0
  40. package/dist/mcp/storage/vectors.js +74 -0
  41. package/dist/mcp/storage/vectors.js.map +1 -0
  42. package/dist/mcp/storage/vectors.stub.d.ts +12 -0
  43. package/dist/mcp/storage/vectors.stub.d.ts.map +1 -0
  44. package/dist/mcp/storage/vectors.stub.js +88 -0
  45. package/dist/mcp/storage/vectors.stub.js.map +1 -0
  46. package/dist/mcp/tests/client.test.d.ts +2 -0
  47. package/dist/mcp/tests/client.test.d.ts.map +1 -0
  48. package/dist/mcp/tests/client.test.js +130 -0
  49. package/dist/mcp/tests/client.test.js.map +1 -0
  50. package/dist/mcp/tests/dashboard.test.d.ts +2 -0
  51. package/dist/mcp/tests/dashboard.test.d.ts.map +1 -0
  52. package/dist/mcp/tests/dashboard.test.js +370 -0
  53. package/dist/mcp/tests/dashboard.test.js.map +1 -0
  54. package/dist/mcp/tests/e2e.test.d.ts +2 -0
  55. package/dist/mcp/tests/e2e.test.d.ts.map +1 -0
  56. package/dist/mcp/tests/e2e.test.js +250 -0
  57. package/dist/mcp/tests/e2e.test.js.map +1 -0
  58. package/dist/mcp/tests/index.test.d.ts +2 -0
  59. package/dist/mcp/tests/index.test.d.ts.map +1 -0
  60. package/dist/mcp/tests/index.test.js +185 -0
  61. package/dist/mcp/tests/index.test.js.map +1 -0
  62. package/dist/mcp/tests/logger.test.d.ts +2 -0
  63. package/dist/mcp/tests/logger.test.d.ts.map +1 -0
  64. package/dist/mcp/tests/logger.test.js +104 -0
  65. package/dist/mcp/tests/logger.test.js.map +1 -0
  66. package/dist/mcp/tests/memory.bulk.test.d.ts +2 -0
  67. package/dist/mcp/tests/memory.bulk.test.d.ts.map +1 -0
  68. package/dist/mcp/tests/memory.bulk.test.js +52 -0
  69. package/dist/mcp/tests/memory.bulk.test.js.map +1 -0
  70. package/dist/mcp/tests/memory.search.test.d.ts +2 -0
  71. package/dist/mcp/tests/memory.search.test.d.ts.map +1 -0
  72. package/dist/mcp/tests/memory.search.test.js +181 -0
  73. package/dist/mcp/tests/memory.search.test.js.map +1 -0
  74. package/dist/mcp/tests/normalize.test.d.ts +2 -0
  75. package/dist/mcp/tests/normalize.test.d.ts.map +1 -0
  76. package/dist/mcp/tests/normalize.test.js +181 -0
  77. package/dist/mcp/tests/normalize.test.js.map +1 -0
  78. package/dist/mcp/tests/query-expander.test.d.ts +2 -0
  79. package/dist/mcp/tests/query-expander.test.d.ts.map +1 -0
  80. package/dist/mcp/tests/query-expander.test.js +33 -0
  81. package/dist/mcp/tests/query-expander.test.js.map +1 -0
  82. package/dist/mcp/tests/router.test.d.ts +2 -0
  83. package/dist/mcp/tests/router.test.d.ts.map +1 -0
  84. package/dist/mcp/tests/router.test.js +470 -0
  85. package/dist/mcp/tests/router.test.js.map +1 -0
  86. package/dist/mcp/tests/sqlite.test.d.ts +2 -0
  87. package/dist/mcp/tests/sqlite.test.d.ts.map +1 -0
  88. package/dist/mcp/tests/sqlite.test.js +367 -0
  89. package/dist/mcp/tests/sqlite.test.js.map +1 -0
  90. package/dist/mcp/tests/tasks-search.test.d.ts +2 -0
  91. package/dist/mcp/tests/tasks-search.test.d.ts.map +1 -0
  92. package/dist/mcp/tests/tasks-search.test.js +154 -0
  93. package/dist/mcp/tests/tasks-search.test.js.map +1 -0
  94. package/dist/mcp/tests/tasks-transition.test.d.ts +2 -0
  95. package/dist/mcp/tests/tasks-transition.test.d.ts.map +1 -0
  96. package/dist/mcp/tests/tasks-transition.test.js +174 -0
  97. package/dist/mcp/tests/tasks-transition.test.js.map +1 -0
  98. package/dist/mcp/tests/tasks.bulk.test.d.ts +2 -0
  99. package/dist/mcp/tests/tasks.bulk.test.d.ts.map +1 -0
  100. package/dist/mcp/tests/tasks.bulk.test.js +254 -0
  101. package/dist/mcp/tests/tasks.bulk.test.js.map +1 -0
  102. package/dist/mcp/tests/tasks.e2e.test.d.ts +2 -0
  103. package/dist/mcp/tests/tasks.e2e.test.d.ts.map +1 -0
  104. package/dist/mcp/tests/tasks.e2e.test.js +289 -0
  105. package/dist/mcp/tests/tasks.e2e.test.js.map +1 -0
  106. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts +2 -0
  107. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts.map +1 -0
  108. package/dist/mcp/tests/tasks.pending-limit-refined.test.js +72 -0
  109. package/dist/mcp/tests/tasks.pending-limit-refined.test.js.map +1 -0
  110. package/dist/mcp/tests/v2-features.test.d.ts +2 -0
  111. package/dist/mcp/tests/v2-features.test.d.ts.map +1 -0
  112. package/dist/mcp/tests/v2-features.test.js +209 -0
  113. package/dist/mcp/tests/v2-features.test.js.map +1 -0
  114. package/dist/mcp/tools/memory.acknowledge.d.ts +4 -0
  115. package/dist/mcp/tools/memory.acknowledge.d.ts.map +1 -0
  116. package/dist/mcp/tools/memory.acknowledge.js +30 -0
  117. package/dist/mcp/tools/memory.acknowledge.js.map +1 -0
  118. package/dist/mcp/tools/memory.bulk-delete.d.ts +4 -0
  119. package/dist/mcp/tools/memory.bulk-delete.d.ts.map +1 -0
  120. package/dist/mcp/tools/memory.bulk-delete.js +39 -0
  121. package/dist/mcp/tools/memory.bulk-delete.js.map +1 -0
  122. package/dist/mcp/tools/memory.delete.d.ts +9 -0
  123. package/dist/mcp/tools/memory.delete.d.ts.map +1 -0
  124. package/dist/mcp/tools/memory.delete.js +39 -0
  125. package/dist/mcp/tools/memory.delete.js.map +1 -0
  126. package/dist/mcp/tools/memory.recap.d.ts +4 -0
  127. package/dist/mcp/tools/memory.recap.d.ts.map +1 -0
  128. package/dist/mcp/tools/memory.recap.js +90 -0
  129. package/dist/mcp/tools/memory.recap.js.map +1 -0
  130. package/dist/mcp/tools/memory.search.d.ts +5 -0
  131. package/dist/mcp/tools/memory.search.d.ts.map +1 -0
  132. package/dist/mcp/tools/memory.search.js +134 -0
  133. package/dist/mcp/tools/memory.search.js.map +1 -0
  134. package/dist/mcp/tools/memory.store.d.ts +5 -0
  135. package/dist/mcp/tools/memory.store.d.ts.map +1 -0
  136. package/dist/mcp/tools/memory.store.js +117 -0
  137. package/dist/mcp/tools/memory.store.js.map +1 -0
  138. package/dist/mcp/tools/memory.summarize.d.ts +4 -0
  139. package/dist/mcp/tools/memory.summarize.d.ts.map +1 -0
  140. package/dist/mcp/tools/memory.summarize.js +31 -0
  141. package/dist/mcp/tools/memory.summarize.js.map +1 -0
  142. package/dist/mcp/tools/memory.synthesize.d.ts +14 -0
  143. package/dist/mcp/tools/memory.synthesize.d.ts.map +1 -0
  144. package/dist/mcp/tools/memory.synthesize.js +228 -0
  145. package/dist/mcp/tools/memory.synthesize.js.map +1 -0
  146. package/dist/mcp/tools/memory.update.d.ts +5 -0
  147. package/dist/mcp/tools/memory.update.d.ts.map +1 -0
  148. package/dist/mcp/tools/memory.update.js +73 -0
  149. package/dist/mcp/tools/memory.update.js.map +1 -0
  150. package/dist/mcp/tools/schemas.d.ts +2762 -0
  151. package/dist/mcp/tools/schemas.d.ts.map +1 -0
  152. package/dist/mcp/tools/schemas.js +952 -0
  153. package/dist/mcp/tools/schemas.js.map +1 -0
  154. package/dist/mcp/tools/task.bulk-manage.d.ts +4 -0
  155. package/dist/mcp/tools/task.bulk-manage.d.ts.map +1 -0
  156. package/dist/mcp/tools/task.bulk-manage.js +146 -0
  157. package/dist/mcp/tools/task.bulk-manage.js.map +1 -0
  158. package/dist/mcp/tools/task.manage.d.ts +16 -0
  159. package/dist/mcp/tools/task.manage.d.ts.map +1 -0
  160. package/dist/mcp/tools/task.manage.js +395 -0
  161. package/dist/mcp/tools/task.manage.js.map +1 -0
  162. package/dist/mcp/types.d.ts +87 -0
  163. package/dist/mcp/types.d.ts.map +1 -0
  164. package/dist/mcp/types.js +3 -0
  165. package/dist/mcp/types.js.map +1 -0
  166. package/dist/mcp/utils/completion.d.ts +2 -0
  167. package/dist/mcp/utils/completion.d.ts.map +1 -0
  168. package/dist/mcp/utils/completion.js +28 -0
  169. package/dist/mcp/utils/completion.js.map +1 -0
  170. package/dist/mcp/utils/git-scope.d.ts +8 -0
  171. package/dist/mcp/utils/git-scope.d.ts.map +1 -0
  172. package/dist/mcp/utils/git-scope.js +38 -0
  173. package/dist/mcp/utils/git-scope.js.map +1 -0
  174. package/dist/mcp/utils/logger.d.ts +25 -0
  175. package/dist/mcp/utils/logger.d.ts.map +1 -0
  176. package/dist/mcp/utils/logger.js +152 -0
  177. package/dist/mcp/utils/logger.js.map +1 -0
  178. package/dist/mcp/utils/mcp-response.d.ts +96 -0
  179. package/dist/mcp/utils/mcp-response.d.ts.map +1 -0
  180. package/dist/mcp/utils/mcp-response.js +131 -0
  181. package/dist/mcp/utils/mcp-response.js.map +1 -0
  182. package/dist/mcp/utils/normalize.d.ts +9 -0
  183. package/dist/mcp/utils/normalize.d.ts.map +1 -0
  184. package/dist/mcp/utils/normalize.js +62 -0
  185. package/dist/mcp/utils/normalize.js.map +1 -0
  186. package/dist/mcp/utils/pagination.d.ts +6 -0
  187. package/dist/mcp/utils/pagination.d.ts.map +1 -0
  188. package/dist/mcp/utils/pagination.js +32 -0
  189. package/dist/mcp/utils/pagination.js.map +1 -0
  190. package/dist/mcp/utils/query-expander.d.ts +2 -0
  191. package/dist/mcp/utils/query-expander.d.ts.map +1 -0
  192. package/dist/mcp/utils/query-expander.js +29 -0
  193. package/dist/mcp/utils/query-expander.js.map +1 -0
  194. package/dist/storage/sqlite.d.ts +3 -0
  195. package/dist/storage/sqlite.d.ts.map +1 -1
  196. package/dist/storage/sqlite.js +38 -9
  197. package/dist/storage/sqlite.js.map +1 -1
  198. package/package.json +17 -5
  199. package/dist/dashboard/public/app.js +0 -2779
  200. package/dist/dashboard/public/chart.js +0 -0
  201. package/dist/dashboard/public/screenshot.png +0 -0
@@ -0,0 +1,470 @@
1
+ // Feature: memory-mcp-optimization, Property 11: createRouter() uses provided storage
2
+ import { describe, it, expect, vi } from "vitest";
3
+ import * as fc from "fast-check";
4
+ import { createRouter } from "../router.js";
5
+ import { createSessionContext, updateSessionRoots } from "../session.js";
6
+ import path from "node:path";
7
+ /**
8
+ * Property 11: createRouter() menggunakan storage yang diberikan
9
+ * Validates: Requirements 10.1, 10.4
10
+ *
11
+ * For any mock SQLiteStore given to createRouter(mockDb, mockVectors),
12
+ * all tool operations run through the router SHALL use mockDb and not access the real DB.
13
+ */
14
+ describe("createRouter() — Property 11: uses provided storage", () => {
15
+ function makeMockDb() {
16
+ return {
17
+ insert: vi.fn(),
18
+ update: vi.fn(),
19
+ delete: vi.fn(),
20
+ getById: vi.fn().mockReturnValue(null),
21
+ searchByRepo: vi.fn().mockReturnValue([]),
22
+ searchBySimilarity: vi.fn().mockReturnValue([]),
23
+ getRecentMemories: vi.fn().mockReturnValue([]),
24
+ getTotalCount: vi.fn().mockReturnValue(0),
25
+ getSummary: vi.fn().mockReturnValue(null),
26
+ upsertSummary: vi.fn(),
27
+ listRepos: vi.fn().mockReturnValue([]),
28
+ listRecent: vi.fn().mockReturnValue([]),
29
+ incrementHitCount: vi.fn(),
30
+ incrementRecallCount: vi.fn(),
31
+ getStats: vi.fn().mockReturnValue({ total: 0, byType: {}, unused: 0 }),
32
+ getAllMemoriesWithStats: vi.fn().mockReturnValue([]),
33
+ upsertVectorEmbedding: vi.fn(),
34
+ getVectorEmbedding: vi.fn().mockReturnValue(null),
35
+ archiveExpiredMemories: vi.fn().mockReturnValue(0),
36
+ logQuery: vi.fn(),
37
+ getRecentQueries: vi.fn().mockReturnValue([]),
38
+ logAction: vi.fn(),
39
+ checkConflicts: vi.fn().mockResolvedValue(null),
40
+ getTasksByRepo: vi.fn().mockReturnValue([]),
41
+ getTasksByMultipleStatuses: vi.fn().mockReturnValue([]),
42
+ getTaskStats: vi.fn().mockReturnValue({ todo: 0 }),
43
+ isTaskCodeDuplicate: vi.fn().mockReturnValue(false),
44
+ insertTask: vi.fn(),
45
+ updateTask: vi.fn(),
46
+ deleteTask: vi.fn(),
47
+ getTaskById: vi.fn().mockReturnValue(null),
48
+ close: vi.fn(),
49
+ };
50
+ }
51
+ function makeMockVectors() {
52
+ return {
53
+ upsert: vi.fn().mockResolvedValue(undefined),
54
+ remove: vi.fn().mockResolvedValue(undefined),
55
+ search: vi.fn().mockResolvedValue([]),
56
+ };
57
+ }
58
+ it("memory-recap calls getRecentMemories on the provided mock db", async () => {
59
+ const mockDb = makeMockDb();
60
+ const mockVectors = makeMockVectors();
61
+ const router = createRouter(mockDb, mockVectors);
62
+ await router("tools/call", {
63
+ name: "memory-recap",
64
+ arguments: { repo: "test-repo", limit: 5 },
65
+ });
66
+ expect(mockDb.getRecentMemories).toHaveBeenCalledWith("test-repo", 5, 0);
67
+ expect(mockDb.getTotalCount).toHaveBeenCalledWith("test-repo");
68
+ });
69
+ it("memory-search calls searchBySimilarity on the provided mock db", async () => {
70
+ const mockDb = makeMockDb();
71
+ const mockVectors = makeMockVectors();
72
+ const router = createRouter(mockDb, mockVectors);
73
+ await router("tools/call", {
74
+ name: "memory-search",
75
+ arguments: { query: "test query", repo: "test-repo", limit: 5 },
76
+ });
77
+ expect(mockDb.searchBySimilarity).toHaveBeenCalled();
78
+ // Verify the first argument to searchBySimilarity contains the repo
79
+ const callArgs = mockDb.searchBySimilarity.mock.calls[0];
80
+ expect(callArgs[1]).toBe("test-repo");
81
+ });
82
+ it("property: for any repo string, memory-recap always uses the injected db", async () => {
83
+ await fc.assert(fc.asyncProperty(fc.string({ minLength: 1, maxLength: 50 }).filter((s) => s.trim().length > 0), fc.integer({ min: 1, max: 50 }), async (repo, limit) => {
84
+ const mockDb = makeMockDb();
85
+ const mockVectors = makeMockVectors();
86
+ const router = createRouter(mockDb, mockVectors);
87
+ await router("tools/call", {
88
+ name: "memory-recap",
89
+ arguments: { repo, limit },
90
+ });
91
+ // The mock db methods must have been called (not a real DB)
92
+ expect(mockDb.getRecentMemories).toHaveBeenCalled();
93
+ expect(mockDb.getTotalCount).toHaveBeenCalled();
94
+ }), { numRuns: 100 });
95
+ });
96
+ it("property: for any valid store args, memory-store uses the injected db", async () => {
97
+ await fc.assert(fc.asyncProperty(fc.record({
98
+ repo: fc.string({ minLength: 1, maxLength: 30 }).filter((s) => s.trim().length > 0),
99
+ content: fc.string({ minLength: 10, maxLength: 200 }),
100
+ importance: fc.integer({ min: 1, max: 5 }),
101
+ type: fc.constantFrom("code_fact", "decision", "mistake", "pattern", "file_claim"),
102
+ title: fc.string({ minLength: 3, maxLength: 50 }),
103
+ }), async ({ repo, content, importance, type, title }) => {
104
+ const mockDb = makeMockDb();
105
+ const mockVectors = makeMockVectors();
106
+ const router = createRouter(mockDb, mockVectors);
107
+ await router("tools/call", {
108
+ name: "memory-store",
109
+ arguments: { type, content, importance, title, scope: { repo }, agent: "test-agent", model: "test-model" },
110
+ });
111
+ expect(mockDb.insert).toHaveBeenCalled();
112
+ }), { numRuns: 100 });
113
+ });
114
+ it("different router instances use their own injected db independently", () => {
115
+ const mockDb1 = makeMockDb();
116
+ const mockDb2 = makeMockDb();
117
+ const mockVectors = makeMockVectors();
118
+ const router1 = createRouter(mockDb1, mockVectors);
119
+ const router2 = createRouter(mockDb2, mockVectors);
120
+ // Both routers are distinct functions
121
+ expect(router1).not.toBe(router2);
122
+ // Each router closes over its own db
123
+ // (verified by the property tests above that each mock is called independently)
124
+ });
125
+ it("supports resources/templates/list", async () => {
126
+ const mockDb = makeMockDb();
127
+ const mockVectors = makeMockVectors();
128
+ const router = createRouter(mockDb, mockVectors);
129
+ const result = await router("resources/templates/list", {});
130
+ const templates = result.resourceTemplates.map((entry) => entry.uriTemplate);
131
+ expect(templates).toContain("memory://index?repo={repo}");
132
+ expect(templates).toContain("tasks://current?repo={repo}");
133
+ });
134
+ it("supports tools/list pagination with nextCursor", async () => {
135
+ const mockDb = makeMockDb();
136
+ const mockVectors = makeMockVectors();
137
+ const session = createSessionContext();
138
+ session.supportsSampling = true;
139
+ session.supportsElicitationForm = true;
140
+ const router = createRouter(mockDb, mockVectors, {
141
+ getSessionContext: () => session,
142
+ });
143
+ const firstPage = await router("tools/list", { limit: 2 });
144
+ const secondPage = await router("tools/list", { limit: 2, cursor: firstPage.nextCursor });
145
+ expect(firstPage.tools).toHaveLength(2);
146
+ expect(firstPage.nextCursor).toBeTruthy();
147
+ expect(secondPage.tools).toHaveLength(2);
148
+ expect(secondPage.tools[0].name).not.toBe(firstPage.tools[0].name);
149
+ });
150
+ it("rejects invalid cursors for tools/list with MCP invalid params error", async () => {
151
+ const mockDb = makeMockDb();
152
+ const mockVectors = makeMockVectors();
153
+ const router = createRouter(mockDb, mockVectors);
154
+ await expect(router("tools/list", { cursor: "%%%not-base64%%%" })).rejects.toMatchObject({
155
+ code: -32602,
156
+ });
157
+ });
158
+ it("supports completion for resource template repo arguments", async () => {
159
+ const mockDb = makeMockDb();
160
+ mockDb.listRepos.mockReturnValue(["alpha-repo", "beta-repo"]);
161
+ const mockVectors = makeMockVectors();
162
+ const router = createRouter(mockDb, mockVectors);
163
+ const result = await router("completion/complete", {
164
+ ref: {
165
+ type: "ref/resource",
166
+ uri: "memory://index?repo={repo}",
167
+ },
168
+ argument: {
169
+ name: "repo",
170
+ value: "alp",
171
+ },
172
+ });
173
+ expect(result.completion.values).toContain("alpha-repo");
174
+ expect(result.completion.values).not.toContain("beta-repo");
175
+ });
176
+ it("supports completion for prompt file_path arguments within active roots", async () => {
177
+ const mockDb = makeMockDb();
178
+ const mockVectors = makeMockVectors();
179
+ const session = createSessionContext();
180
+ updateSessionRoots(session, [{ uri: `file://${path.resolve(process.cwd())}` }]);
181
+ const router = createRouter(mockDb, mockVectors, {
182
+ getSessionContext: () => session,
183
+ });
184
+ const result = await router("completion/complete", {
185
+ ref: {
186
+ type: "ref/prompt",
187
+ name: "memory-guided-review",
188
+ },
189
+ argument: {
190
+ name: "file_path",
191
+ value: "src/mcp/router",
192
+ },
193
+ });
194
+ expect(result.completion.values.some((value) => value.includes("src/mcp/router.ts"))).toBe(true);
195
+ });
196
+ it("supports completion for prompt task_id arguments using repo context", async () => {
197
+ const mockDb = makeMockDb();
198
+ mockDb.getTasksByRepo.mockReturnValue([
199
+ {
200
+ id: "123e4567-e89b-12d3-a456-426614174001",
201
+ task_code: "TASK-123",
202
+ title: "Review architecture",
203
+ },
204
+ ]);
205
+ const mockVectors = makeMockVectors();
206
+ const router = createRouter(mockDb, mockVectors);
207
+ const result = await router("completion/complete", {
208
+ ref: {
209
+ type: "ref/prompt",
210
+ name: "learning-retrospective",
211
+ },
212
+ argument: {
213
+ name: "task_id",
214
+ value: "123e4567",
215
+ },
216
+ context: {
217
+ arguments: {
218
+ repo: "test-repo",
219
+ },
220
+ },
221
+ });
222
+ expect(mockDb.getTasksByRepo).toHaveBeenCalledWith("test-repo", undefined, 100);
223
+ expect(result.completion.values).toContain("123e4567-e89b-12d3-a456-426614174001");
224
+ });
225
+ it("filters session-dependent tools from tools/list when the client lacks required capabilities", async () => {
226
+ const mockDb = makeMockDb();
227
+ const mockVectors = makeMockVectors();
228
+ const session = createSessionContext();
229
+ const router = createRouter(mockDb, mockVectors, {
230
+ getSessionContext: () => session,
231
+ });
232
+ const result = await router("tools/list", {});
233
+ const toolNames = result.tools.map((tool) => tool.name);
234
+ expect(toolNames).not.toContain("memory-synthesize");
235
+ expect(toolNames).not.toContain("task-create-interactive");
236
+ });
237
+ it("rejects absolute tool paths outside active roots", async () => {
238
+ const mockDb = makeMockDb();
239
+ const mockVectors = makeMockVectors();
240
+ const session = createSessionContext();
241
+ updateSessionRoots(session, [{ uri: "file:///workspace/repo" }]);
242
+ const router = createRouter(mockDb, mockVectors, {
243
+ getSessionContext: () => session,
244
+ });
245
+ await expect(router("tools/call", {
246
+ name: "memory-search",
247
+ arguments: {
248
+ query: "test query",
249
+ repo: "test-repo",
250
+ current_file_path: "/tmp/outside.ts",
251
+ },
252
+ })).rejects.toThrow("current_file_path must stay within the active MCP roots");
253
+ });
254
+ it("supports logging/setLevel utility", async () => {
255
+ const mockDb = makeMockDb();
256
+ const mockVectors = makeMockVectors();
257
+ const router = createRouter(mockDb, mockVectors);
258
+ const result = await router("logging/setLevel", { level: "debug" });
259
+ expect(result.level).toBe("debug");
260
+ expect(result.supportedLevels).toContain("info");
261
+ });
262
+ it("rejects invalid logging/setLevel values with MCP invalid params error", async () => {
263
+ const mockDb = makeMockDb();
264
+ const mockVectors = makeMockVectors();
265
+ const router = createRouter(mockDb, mockVectors);
266
+ await expect(router("logging/setLevel", { level: "verbose" })).rejects.toMatchObject({
267
+ code: -32602,
268
+ });
269
+ });
270
+ it("supports prompt list pagination with nextCursor", async () => {
271
+ const mockDb = makeMockDb();
272
+ const mockVectors = makeMockVectors();
273
+ const router = createRouter(mockDb, mockVectors);
274
+ const firstPage = await router("prompts/list", { limit: 2 });
275
+ const secondPage = await router("prompts/list", { limit: 2, cursor: firstPage.nextCursor });
276
+ expect(firstPage.prompts).toHaveLength(2);
277
+ expect(firstPage.nextCursor).toBeTruthy();
278
+ expect(secondPage.prompts).toHaveLength(2);
279
+ expect(secondPage.prompts[0].name).not.toBe(firstPage.prompts[0].name);
280
+ });
281
+ it("rejects invalid cursors for prompts/list with MCP invalid params error", async () => {
282
+ const mockDb = makeMockDb();
283
+ const mockVectors = makeMockVectors();
284
+ const router = createRouter(mockDb, mockVectors);
285
+ await expect(router("prompts/list", { cursor: "%%%not-base64%%%" })).rejects.toMatchObject({
286
+ code: -32602,
287
+ });
288
+ });
289
+ it("validates required prompt arguments with MCP invalid params error", async () => {
290
+ const mockDb = makeMockDb();
291
+ const mockVectors = makeMockVectors();
292
+ const router = createRouter(mockDb, mockVectors);
293
+ await expect(router("prompts/get", {
294
+ name: "memory-guided-review",
295
+ arguments: {},
296
+ })).rejects.toMatchObject({
297
+ code: -32602,
298
+ });
299
+ });
300
+ it("returns a dynamic prompt with embedded resource messages", async () => {
301
+ const mockDb = makeMockDb();
302
+ mockDb.listRepos.mockReturnValue(["repo-alpha"]);
303
+ const mockVectors = makeMockVectors();
304
+ const router = createRouter(mockDb, mockVectors);
305
+ const result = await router("prompts/get", {
306
+ name: "workspace-briefing-rich",
307
+ arguments: {},
308
+ });
309
+ const resourceUris = result.messages
310
+ .filter((message) => message.content?.type === "resource")
311
+ .map((message) => message.content.resource.uri);
312
+ expect(resourceUris).toContain("session://roots");
313
+ expect(resourceUris).toContain("memory://summary/repo-alpha");
314
+ expect(resourceUris).toContain("tasks://current?repo=repo-alpha");
315
+ });
316
+ it("memory-synthesize uses sampling when the client supports it", async () => {
317
+ const mockDb = makeMockDb();
318
+ const mockVectors = makeMockVectors();
319
+ const session = createSessionContext();
320
+ session.supportsSampling = true;
321
+ const sampleMessage = vi.fn().mockResolvedValue({
322
+ role: "assistant",
323
+ content: { type: "text", text: "Grounded answer from sampling." },
324
+ model: "test-model",
325
+ stopReason: "endTurn",
326
+ });
327
+ const router = createRouter(mockDb, mockVectors, {
328
+ getSessionContext: () => session,
329
+ sampleMessage,
330
+ });
331
+ const result = await router("tools/call", {
332
+ name: "memory-synthesize",
333
+ arguments: { repo: "test-repo", objective: "Summarize the project state" },
334
+ });
335
+ expect(sampleMessage).toHaveBeenCalledTimes(1);
336
+ expect(result.data.answer).toContain("Grounded answer");
337
+ expect(result.structuredContent.answer).toContain("Grounded answer");
338
+ });
339
+ it("memory-synthesize supports a multi-turn sampling tool loop", async () => {
340
+ const mockDb = makeMockDb();
341
+ const mockVectors = makeMockVectors();
342
+ const session = createSessionContext();
343
+ session.supportsSampling = true;
344
+ session.supportsSamplingTools = true;
345
+ const sampleMessage = vi.fn()
346
+ .mockResolvedValueOnce({
347
+ role: "assistant",
348
+ content: [{
349
+ type: "tool_use",
350
+ id: "call_1",
351
+ name: "memory_recap",
352
+ input: { repo: "test-repo", limit: 3 },
353
+ }],
354
+ stopReason: "toolUse",
355
+ })
356
+ .mockResolvedValueOnce({
357
+ role: "assistant",
358
+ content: { type: "text", text: "Final grounded answer after tool use." },
359
+ model: "test-model",
360
+ stopReason: "endTurn",
361
+ });
362
+ const router = createRouter(mockDb, mockVectors, {
363
+ getSessionContext: () => session,
364
+ sampleMessage,
365
+ });
366
+ const result = await router("tools/call", {
367
+ name: "memory-synthesize",
368
+ arguments: {
369
+ repo: "test-repo",
370
+ objective: "Explain the latest architecture decisions",
371
+ max_iterations: 3,
372
+ },
373
+ });
374
+ expect(sampleMessage).toHaveBeenCalledTimes(2);
375
+ expect(result.data.toolCalls).toBe(1);
376
+ expect(result.data.iterations).toBe(2);
377
+ });
378
+ it("memory-synthesize elicits the repo when roots cannot infer it", async () => {
379
+ const mockDb = makeMockDb();
380
+ const mockVectors = makeMockVectors();
381
+ const session = createSessionContext();
382
+ session.supportsSampling = true;
383
+ session.supportsElicitation = true;
384
+ session.supportsElicitationForm = true;
385
+ const sampleMessage = vi.fn().mockResolvedValue({
386
+ role: "assistant",
387
+ content: { type: "text", text: "Synthesized after repo elicitation." },
388
+ model: "test-model",
389
+ stopReason: "endTurn",
390
+ });
391
+ const elicit = vi.fn().mockResolvedValue({
392
+ action: "accept",
393
+ content: { repo: "elicited-repo" },
394
+ });
395
+ const router = createRouter(mockDb, mockVectors, {
396
+ getSessionContext: () => session,
397
+ sampleMessage,
398
+ elicit,
399
+ });
400
+ const result = await router("tools/call", {
401
+ name: "memory-synthesize",
402
+ arguments: { objective: "Summarize the repo using elicitation" },
403
+ });
404
+ expect(elicit).toHaveBeenCalledTimes(1);
405
+ expect(sampleMessage).toHaveBeenCalledTimes(1);
406
+ expect(result.data.repo).toBe("elicited-repo");
407
+ });
408
+ it("task-create-interactive elicits missing task fields and creates the task", async () => {
409
+ const mockDb = makeMockDb();
410
+ const mockVectors = makeMockVectors();
411
+ const session = createSessionContext();
412
+ session.supportsElicitation = true;
413
+ session.supportsElicitationForm = true;
414
+ const elicit = vi.fn().mockResolvedValue({
415
+ action: "accept",
416
+ content: {
417
+ repo: "interactive-repo",
418
+ task_code: "TASK-101",
419
+ phase: "implementation",
420
+ title: "Implement elicitation flow",
421
+ description: "Add elicitation-backed task creation flow",
422
+ status: "pending",
423
+ priority: 4,
424
+ },
425
+ });
426
+ const router = createRouter(mockDb, mockVectors, {
427
+ getSessionContext: () => session,
428
+ elicit,
429
+ });
430
+ const result = await router("tools/call", {
431
+ name: "task-create-interactive",
432
+ arguments: {},
433
+ });
434
+ expect(elicit).toHaveBeenCalledTimes(1);
435
+ expect(mockDb.insertTask).toHaveBeenCalledTimes(1);
436
+ expect(result.data.repo).toBe("interactive-repo");
437
+ expect(result.data.task_code).toBe("TASK-101");
438
+ });
439
+ it("returns resource links in memory-search results", async () => {
440
+ const mockDb = makeMockDb();
441
+ const mockVectors = makeMockVectors();
442
+ mockDb.searchBySimilarity.mockReturnValue([
443
+ {
444
+ id: "123e4567-e89b-12d3-a456-426614174000",
445
+ type: "decision",
446
+ title: "Use SQLite for local memory",
447
+ content: "SQLite keeps the server self-contained.",
448
+ importance: 4,
449
+ scope: { repo: "test-repo" },
450
+ created_at: "2026-01-01T00:00:00.000Z",
451
+ updated_at: "2026-01-01T00:00:00.000Z",
452
+ hit_count: 0,
453
+ recall_count: 0,
454
+ last_used_at: null,
455
+ expires_at: null,
456
+ tags: [],
457
+ },
458
+ ]);
459
+ mockVectors.search.mockResolvedValue([]);
460
+ const router = createRouter(mockDb, mockVectors);
461
+ const result = await router("tools/call", {
462
+ name: "memory-search",
463
+ arguments: { query: "sqlite", repo: "test-repo", limit: 5 },
464
+ });
465
+ const resourceLinks = result.content.filter((entry) => entry.type === "resource_link");
466
+ expect(resourceLinks.some((entry) => entry.uri === "memory://index?repo=test-repo")).toBe(true);
467
+ expect(resourceLinks.some((entry) => entry.uri === "memory://123e4567-e89b-12d3-a456-426614174000")).toBe(true);
468
+ });
469
+ });
470
+ //# sourceMappingURL=router.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.test.js","sourceRoot":"","sources":["../../../src/mcp/tests/router.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sqlite.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.test.d.ts","sourceRoot":"","sources":["../../../src/mcp/tests/sqlite.test.ts"],"names":[],"mappings":""}