@vheins/local-memory-mcp 0.1.0

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 (196) hide show
  1. package/DASHBOARD.md +129 -0
  2. package/HYBRID_SEARCH.md +204 -0
  3. package/IMPLEMENTATION.md +159 -0
  4. package/README.md +175 -0
  5. package/dist/capabilities.d.ts +22 -0
  6. package/dist/capabilities.d.ts.map +1 -0
  7. package/dist/capabilities.js +23 -0
  8. package/dist/capabilities.js.map +1 -0
  9. package/dist/dashboard/dashboard.test.d.ts +2 -0
  10. package/dist/dashboard/dashboard.test.d.ts.map +1 -0
  11. package/dist/dashboard/dashboard.test.js +362 -0
  12. package/dist/dashboard/dashboard.test.js.map +1 -0
  13. package/dist/dashboard/public/app.js +1187 -0
  14. package/dist/dashboard/public/chart.js +0 -0
  15. package/dist/dashboard/public/index.html +967 -0
  16. package/dist/dashboard/server.d.ts +3 -0
  17. package/dist/dashboard/server.d.ts.map +1 -0
  18. package/dist/dashboard/server.js +297 -0
  19. package/dist/dashboard/server.js.map +1 -0
  20. package/dist/mcp/client.d.ts +34 -0
  21. package/dist/mcp/client.d.ts.map +1 -0
  22. package/dist/mcp/client.js +181 -0
  23. package/dist/mcp/client.js.map +1 -0
  24. package/dist/mcp/client.test.d.ts +2 -0
  25. package/dist/mcp/client.test.d.ts.map +1 -0
  26. package/dist/mcp/client.test.js +130 -0
  27. package/dist/mcp/client.test.js.map +1 -0
  28. package/dist/prompts/registry.d.ts +39 -0
  29. package/dist/prompts/registry.d.ts.map +1 -0
  30. package/dist/prompts/registry.js +90 -0
  31. package/dist/prompts/registry.js.map +1 -0
  32. package/dist/resources/index.d.ts +17 -0
  33. package/dist/resources/index.d.ts.map +1 -0
  34. package/dist/resources/index.js +100 -0
  35. package/dist/resources/index.js.map +1 -0
  36. package/dist/resources/index.test.d.ts +2 -0
  37. package/dist/resources/index.test.d.ts.map +1 -0
  38. package/dist/resources/index.test.js +96 -0
  39. package/dist/resources/index.test.js.map +1 -0
  40. package/dist/router.d.ts +4 -0
  41. package/dist/router.d.ts.map +1 -0
  42. package/dist/router.js +60 -0
  43. package/dist/router.js.map +1 -0
  44. package/dist/router.test.d.ts +2 -0
  45. package/dist/router.test.d.ts.map +1 -0
  46. package/dist/router.test.js +113 -0
  47. package/dist/router.test.js.map +1 -0
  48. package/dist/search_memory_example.d.ts +3 -0
  49. package/dist/search_memory_example.d.ts.map +1 -0
  50. package/dist/search_memory_example.js +56 -0
  51. package/dist/search_memory_example.js.map +1 -0
  52. package/dist/server.d.ts +3 -0
  53. package/dist/server.d.ts.map +1 -0
  54. package/dist/server.js +91 -0
  55. package/dist/server.js.map +1 -0
  56. package/dist/storage/sqlite.d.ts +95 -0
  57. package/dist/storage/sqlite.d.ts.map +1 -0
  58. package/dist/storage/sqlite.js +537 -0
  59. package/dist/storage/sqlite.js.map +1 -0
  60. package/dist/storage/sqlite.test.d.ts +2 -0
  61. package/dist/storage/sqlite.test.d.ts.map +1 -0
  62. package/dist/storage/sqlite.test.js +358 -0
  63. package/dist/storage/sqlite.test.js.map +1 -0
  64. package/dist/storage/vectors.stub.d.ts +12 -0
  65. package/dist/storage/vectors.stub.d.ts.map +1 -0
  66. package/dist/storage/vectors.stub.js +88 -0
  67. package/dist/storage/vectors.stub.js.map +1 -0
  68. package/dist/store_memory_example.d.ts +3 -0
  69. package/dist/store_memory_example.d.ts.map +1 -0
  70. package/dist/store_memory_example.js +69 -0
  71. package/dist/store_memory_example.js.map +1 -0
  72. package/dist/test_quotes_client.d.ts +3 -0
  73. package/dist/test_quotes_client.d.ts.map +1 -0
  74. package/dist/test_quotes_client.js +72 -0
  75. package/dist/test_quotes_client.js.map +1 -0
  76. package/dist/tools/memory.delete.d.ts +9 -0
  77. package/dist/tools/memory.delete.d.ts.map +1 -0
  78. package/dist/tools/memory.delete.js +22 -0
  79. package/dist/tools/memory.delete.js.map +1 -0
  80. package/dist/tools/memory.recap.d.ts +4 -0
  81. package/dist/tools/memory.recap.d.ts.map +1 -0
  82. package/dist/tools/memory.recap.js +42 -0
  83. package/dist/tools/memory.recap.js.map +1 -0
  84. package/dist/tools/memory.search.d.ts +5 -0
  85. package/dist/tools/memory.search.d.ts.map +1 -0
  86. package/dist/tools/memory.search.js +192 -0
  87. package/dist/tools/memory.search.js.map +1 -0
  88. package/dist/tools/memory.search.test.d.ts +2 -0
  89. package/dist/tools/memory.search.test.d.ts.map +1 -0
  90. package/dist/tools/memory.search.test.js +181 -0
  91. package/dist/tools/memory.search.test.js.map +1 -0
  92. package/dist/tools/memory.store.d.ts +5 -0
  93. package/dist/tools/memory.store.d.ts.map +1 -0
  94. package/dist/tools/memory.store.js +41 -0
  95. package/dist/tools/memory.store.js.map +1 -0
  96. package/dist/tools/memory.summarize.d.ts +4 -0
  97. package/dist/tools/memory.summarize.d.ts.map +1 -0
  98. package/dist/tools/memory.summarize.js +13 -0
  99. package/dist/tools/memory.summarize.js.map +1 -0
  100. package/dist/tools/memory.update.d.ts +5 -0
  101. package/dist/tools/memory.update.d.ts.map +1 -0
  102. package/dist/tools/memory.update.js +31 -0
  103. package/dist/tools/memory.update.js.map +1 -0
  104. package/dist/tools/schemas.d.ts +334 -0
  105. package/dist/tools/schemas.d.ts.map +1 -0
  106. package/dist/tools/schemas.js +251 -0
  107. package/dist/tools/schemas.js.map +1 -0
  108. package/dist/types.d.ts +31 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/types.js +3 -0
  111. package/dist/types.js.map +1 -0
  112. package/dist/utils/git-scope.d.ts +8 -0
  113. package/dist/utils/git-scope.d.ts.map +1 -0
  114. package/dist/utils/git-scope.js +38 -0
  115. package/dist/utils/git-scope.js.map +1 -0
  116. package/dist/utils/logger.d.ts +7 -0
  117. package/dist/utils/logger.d.ts.map +1 -0
  118. package/dist/utils/logger.js +40 -0
  119. package/dist/utils/logger.js.map +1 -0
  120. package/dist/utils/logger.test.d.ts +2 -0
  121. package/dist/utils/logger.test.d.ts.map +1 -0
  122. package/dist/utils/logger.test.js +84 -0
  123. package/dist/utils/logger.test.js.map +1 -0
  124. package/dist/utils/mcp-response.d.ts +44 -0
  125. package/dist/utils/mcp-response.d.ts.map +1 -0
  126. package/dist/utils/mcp-response.js +81 -0
  127. package/dist/utils/mcp-response.js.map +1 -0
  128. package/dist/utils/normalize.d.ts +4 -0
  129. package/dist/utils/normalize.d.ts.map +1 -0
  130. package/dist/utils/normalize.js +51 -0
  131. package/dist/utils/normalize.js.map +1 -0
  132. package/dist/utils/normalize.test.d.ts +2 -0
  133. package/dist/utils/normalize.test.d.ts.map +1 -0
  134. package/dist/utils/normalize.test.js +159 -0
  135. package/dist/utils/normalize.test.js.map +1 -0
  136. package/dist/utils/query-expander.d.ts +2 -0
  137. package/dist/utils/query-expander.d.ts.map +1 -0
  138. package/dist/utils/query-expander.js +50 -0
  139. package/dist/utils/query-expander.js.map +1 -0
  140. package/dist/utils/query-expander.test.d.ts +2 -0
  141. package/dist/utils/query-expander.test.d.ts.map +1 -0
  142. package/dist/utils/query-expander.test.js +35 -0
  143. package/dist/utils/query-expander.test.js.map +1 -0
  144. package/docs/PRD.md +199 -0
  145. package/docs/PROMPT-agent.md +139 -0
  146. package/docs/SPEC-git-scope.md +172 -0
  147. package/docs/SPEC-heuristics.md +199 -0
  148. package/docs/SPEC-server.md +243 -0
  149. package/docs/SPEC-skeleton.md +255 -0
  150. package/docs/SPEC-sqlite-schema.md +183 -0
  151. package/docs/SPEC-tool-schema.md +201 -0
  152. package/docs/SPEC-vector-search.md +198 -0
  153. package/docs/TEST-scenarios.md +179 -0
  154. package/package.json +43 -0
  155. package/scripts/update-null-titles-ai.mjs +272 -0
  156. package/scripts/update-titles-batch.mjs +71 -0
  157. package/scripts/update-titles.mjs +66 -0
  158. package/seed-data.mjs +151 -0
  159. package/src/capabilities.ts +22 -0
  160. package/src/dashboard/dashboard.test.ts +546 -0
  161. package/src/dashboard/public/app.js +1187 -0
  162. package/src/dashboard/public/chart.js +0 -0
  163. package/src/dashboard/public/index.html +967 -0
  164. package/src/dashboard/server.ts +347 -0
  165. package/src/mcp/client.test.ts +164 -0
  166. package/src/mcp/client.ts +212 -0
  167. package/src/prompts/registry.ts +89 -0
  168. package/src/resources/index.test.ts +132 -0
  169. package/src/resources/index.ts +113 -0
  170. package/src/router.test.ts +145 -0
  171. package/src/router.ts +80 -0
  172. package/src/server.ts +99 -0
  173. package/src/storage/sqlite.test.ts +504 -0
  174. package/src/storage/sqlite.ts +688 -0
  175. package/src/storage/vectors.stub.ts +101 -0
  176. package/src/tools/memory.delete.ts +37 -0
  177. package/src/tools/memory.recap.ts +61 -0
  178. package/src/tools/memory.search.test.ts +276 -0
  179. package/src/tools/memory.search.ts +244 -0
  180. package/src/tools/memory.store.ts +56 -0
  181. package/src/tools/memory.summarize.ts +23 -0
  182. package/src/tools/memory.update.ts +46 -0
  183. package/src/tools/schemas.ts +261 -0
  184. package/src/types.ts +36 -0
  185. package/src/utils/git-scope.ts +42 -0
  186. package/src/utils/logger.test.ts +125 -0
  187. package/src/utils/logger.ts +53 -0
  188. package/src/utils/mcp-response.ts +116 -0
  189. package/src/utils/normalize.test.ts +203 -0
  190. package/src/utils/normalize.ts +53 -0
  191. package/src/utils/query-expander.test.ts +40 -0
  192. package/src/utils/query-expander.ts +60 -0
  193. package/storage/.gitkeep +5 -0
  194. package/test.sh +48 -0
  195. package/tsconfig.json +21 -0
  196. package/vitest.config.ts +10 -0
@@ -0,0 +1,358 @@
1
+ // Feature: memory-mcp-optimization
2
+ // Property tests for SQLiteStore — Properties 1, 6, 7, 8, 9, 10, 18
3
+ import { describe, it, expect } from "vitest";
4
+ import * as fc from "fast-check";
5
+ import { SQLiteStore } from "./sqlite.js";
6
+ function makeEntry(overrides) {
7
+ const now = new Date().toISOString();
8
+ return {
9
+ id: overrides.id ?? `id-${Math.random().toString(36).slice(2)}`,
10
+ type: overrides.type ?? "code_fact",
11
+ title: overrides.title ?? "Test Memory Title",
12
+ content: overrides.content ?? "sample content for testing purposes",
13
+ importance: overrides.importance ?? 3,
14
+ scope: { repo: overrides.repo ?? "test-repo" },
15
+ created_at: overrides.created_at ?? now,
16
+ updated_at: now,
17
+ hit_count: 0,
18
+ recall_count: 0,
19
+ last_used_at: null,
20
+ expires_at: overrides.expires_at !== undefined ? overrides.expires_at : null,
21
+ };
22
+ }
23
+ function freshStore() {
24
+ return new SQLiteStore(":memory:");
25
+ }
26
+ // ─── Property 1: Pre-filter SQL membatasi kandidat searchBySimilarity ────────
27
+ // Validates: Requirements 1.1, 1.2, 1.3, 1.4
28
+ describe("Property 1: Pre-filter SQL membatasi kandidat searchBySimilarity", () => {
29
+ // Feature: memory-mcp-optimization, Property 1: Pre-filter SQL membatasi kandidat searchBySimilarity
30
+ it("result.length <= limit for any repo with N > limit memories", () => {
31
+ fc.assert(fc.property(fc.integer({ min: 5, max: 30 }), // N memories
32
+ fc.integer({ min: 1, max: 4 }), // limit < N
33
+ fc.string({ minLength: 5, maxLength: 30 }), // query
34
+ (n, limit, query) => {
35
+ const store = freshStore();
36
+ const repo = "repo-p1";
37
+ for (let i = 0; i < n; i++) {
38
+ store.insert(makeEntry({
39
+ id: `p1-${i}`,
40
+ repo,
41
+ content: `memory content item number ${i} about coding patterns`,
42
+ }));
43
+ }
44
+ const results = store.searchBySimilarity(query, repo, limit);
45
+ store.close();
46
+ return results.length <= limit;
47
+ }), { numRuns: 50 });
48
+ });
49
+ });
50
+ // ─── Property 6: Inisialisasi SQLiteStore berulang tidak melempar exception ──
51
+ // Validates: Requirements 7.1, 7.3, 7.4
52
+ describe("Property 6: Inisialisasi SQLiteStore berulang tidak melempar exception", () => {
53
+ // Feature: memory-mcp-optimization, Property 6: Inisialisasi SQLiteStore berulang tidak melempar exception
54
+ it("constructing SQLiteStore twice on :memory: does not throw", () => {
55
+ fc.assert(fc.property(fc.constant(":memory:"), (_path) => {
56
+ // Each :memory: DB is independent, so we test the migration logic
57
+ // by creating two stores (each runs migrate() on a fresh in-memory DB)
58
+ expect(() => {
59
+ const s1 = new SQLiteStore(":memory:");
60
+ s1.close();
61
+ }).not.toThrow();
62
+ expect(() => {
63
+ const s2 = new SQLiteStore(":memory:");
64
+ s2.close();
65
+ }).not.toThrow();
66
+ return true;
67
+ }), { numRuns: 20 });
68
+ });
69
+ it("migrate() is idempotent — inserting then re-opening same store does not throw", () => {
70
+ // We simulate re-initialization by calling migrate logic twice via two stores
71
+ // on the same in-memory path (each :memory: is isolated, so we verify no throw)
72
+ const store1 = new SQLiteStore(":memory:");
73
+ store1.insert(makeEntry({ id: "m1", repo: "r1" }));
74
+ // A second store on :memory: is a fresh DB — migration runs again safely
75
+ const store2 = new SQLiteStore(":memory:");
76
+ store2.insert(makeEntry({ id: "m2", repo: "r2" }));
77
+ store1.close();
78
+ store2.close();
79
+ });
80
+ });
81
+ // ─── Property 7: Pagination non-overlapping ──────────────────────────────────
82
+ // Validates: Requirements 8.2, 8.4
83
+ describe("Property 7: Pagination non-overlapping", () => {
84
+ // Feature: memory-mcp-optimization, Property 7: Pagination non-overlapping
85
+ it("pages i and j (i ≠ j) share no memory ids", () => {
86
+ fc.assert(fc.property(fc.integer({ min: 10, max: 40 }), // total memories N
87
+ fc.integer({ min: 2, max: 5 }), // page size L
88
+ fc.integer({ min: 0, max: 3 }), // page index i
89
+ fc.integer({ min: 0, max: 3 }), // page index j
90
+ (n, pageSize, i, j) => {
91
+ fc.pre(i !== j);
92
+ const store = freshStore();
93
+ const repo = "repo-p7";
94
+ for (let k = 0; k < n; k++) {
95
+ store.insert(makeEntry({
96
+ id: `p7-${k}`,
97
+ repo,
98
+ content: `memory item ${k} for pagination test`,
99
+ }));
100
+ }
101
+ const pageI = store.getRecentMemories(repo, pageSize, i * pageSize);
102
+ const pageJ = store.getRecentMemories(repo, pageSize, j * pageSize);
103
+ store.close();
104
+ const idsI = new Set(pageI.map((m) => m.id));
105
+ const idsJ = new Set(pageJ.map((m) => m.id));
106
+ // No overlap
107
+ for (const id of idsI) {
108
+ if (idsJ.has(id))
109
+ return false;
110
+ }
111
+ return true;
112
+ }), { numRuns: 100 });
113
+ });
114
+ });
115
+ // ─── Property 8: TTL menyimpan expires_at yang benar ─────────────────────────
116
+ // Validates: Requirement 9.2
117
+ describe("Property 8: TTL menyimpan expires_at yang benar", () => {
118
+ // Feature: memory-mcp-optimization, Property 8: TTL menyimpan expires_at yang benar
119
+ it("expires_at equals created_at + ttlDays * 86400 seconds", () => {
120
+ fc.assert(fc.property(fc.integer({ min: 1, max: 365 }), // ttlDays
121
+ (ttlDays) => {
122
+ const store = freshStore();
123
+ const createdAt = new Date("2025-01-01T00:00:00.000Z");
124
+ const expectedExpiresAt = new Date(createdAt.getTime() + ttlDays * 86400 * 1000).toISOString();
125
+ const entry = makeEntry({
126
+ id: `p8-${ttlDays}`,
127
+ repo: "repo-p8",
128
+ created_at: createdAt.toISOString(),
129
+ expires_at: expectedExpiresAt,
130
+ });
131
+ store.insert(entry);
132
+ const retrieved = store.getById(entry.id);
133
+ store.close();
134
+ return retrieved?.expires_at === expectedExpiresAt;
135
+ }), { numRuns: 100 });
136
+ });
137
+ });
138
+ // ─── Property 9: Expired memories dikecualikan dari hasil pencarian ───────────
139
+ // Validates: Requirements 9.3, 9.6
140
+ describe("Property 9: Expired memories dikecualikan dari hasil pencarian", () => {
141
+ // Feature: memory-mcp-optimization, Property 9: Expired memories dikecualikan dari hasil pencarian
142
+ it("searchBySimilarity does not return expired memories", () => {
143
+ fc.assert(fc.property(fc.string({ minLength: 5, maxLength: 20 }), // query
144
+ (query) => {
145
+ const store = freshStore();
146
+ const repo = "repo-p9-sim";
147
+ const pastDate = new Date(Date.now() - 86400 * 1000).toISOString(); // yesterday
148
+ store.insert(makeEntry({
149
+ id: "expired-sim",
150
+ repo,
151
+ content: `${query} expired content that should not appear`,
152
+ expires_at: pastDate,
153
+ }));
154
+ const results = store.searchBySimilarity(query, repo, 10);
155
+ store.close();
156
+ return !results.some((r) => r.id === "expired-sim");
157
+ }), { numRuns: 50 });
158
+ });
159
+ it("searchByRepo does not return expired memories", () => {
160
+ fc.assert(fc.property(fc.integer({ min: 1, max: 5 }), // importance
161
+ (importance) => {
162
+ const store = freshStore();
163
+ const repo = "repo-p9-byrepo";
164
+ const pastDate = new Date(Date.now() - 86400 * 1000).toISOString();
165
+ store.insert(makeEntry({
166
+ id: "expired-byrepo",
167
+ repo,
168
+ importance,
169
+ expires_at: pastDate,
170
+ }));
171
+ const results = store.searchByRepo(repo);
172
+ store.close();
173
+ return !results.some((r) => r.id === "expired-byrepo");
174
+ }), { numRuns: 50 });
175
+ });
176
+ });
177
+ // ─── Property 10: archiveExpiredMemories() idempoten ─────────────────────────
178
+ // Validates: Requirement 9.5
179
+ describe("Property 10: archiveExpiredMemories() idempoten", () => {
180
+ // Feature: memory-mcp-optimization, Property 10: archiveExpiredMemories() idempoten
181
+ it("second call returns 0 when no new memories expired between calls", () => {
182
+ fc.assert(fc.property(fc.integer({ min: 1, max: 10 }), // number of expired memories
183
+ (n) => {
184
+ const store = freshStore();
185
+ const repo = "repo-p10";
186
+ const pastDate = new Date(Date.now() - 86400 * 1000).toISOString();
187
+ for (let i = 0; i < n; i++) {
188
+ store.insert(makeEntry({
189
+ id: `p10-${i}`,
190
+ repo,
191
+ expires_at: pastDate,
192
+ }));
193
+ }
194
+ const first = store.archiveExpiredMemories();
195
+ const second = store.archiveExpiredMemories();
196
+ store.close();
197
+ return first === n && second === 0;
198
+ }), { numRuns: 50 });
199
+ });
200
+ });
201
+ // ─── Property 18: listRepos() mengembalikan daftar unik dan terurut ───────────
202
+ // Validates: Requirements 19.5, 19.6
203
+ describe("Property 18: listRepos() mengembalikan daftar unik dan terurut", () => {
204
+ // Feature: memory-mcp-optimization, Property 18: listRepos() mengembalikan daftar unik dan terurut
205
+ it("no duplicates and sorted ascending", () => {
206
+ fc.assert(fc.property(fc.array(fc.stringMatching(/^[a-z][a-z0-9-]{1,10}$/), { minLength: 2, maxLength: 10 }), (repos) => {
207
+ const store = freshStore();
208
+ repos.forEach((repo, i) => {
209
+ store.insert(makeEntry({
210
+ id: `p18-${i}-${repo}`,
211
+ repo,
212
+ }));
213
+ });
214
+ const result = store.listRepos();
215
+ store.close();
216
+ // No duplicates
217
+ const unique = new Set(result);
218
+ if (unique.size !== result.length)
219
+ return false;
220
+ // Sorted ascending
221
+ for (let i = 1; i < result.length; i++) {
222
+ if (result[i] < result[i - 1])
223
+ return false;
224
+ }
225
+ return true;
226
+ }), { numRuns: 100 });
227
+ });
228
+ });
229
+ // Property 19: Action Log functionality
230
+ describe("Property 19: Action Log stores and retrieves recent actions", () => {
231
+ it("logAction stores action with correct metadata", () => {
232
+ const store = freshStore();
233
+ store.logAction('search', "test-repo", { query: "test query", resultCount: 5 });
234
+ const actions = store.getRecentActions("test-repo", 10);
235
+ expect(actions).toHaveLength(1);
236
+ expect(actions[0].action).toBe("search");
237
+ expect(actions[0].query).toBe("test query");
238
+ });
239
+ it("getRecentActions returns actions in descending order by created_at", () => {
240
+ const store = freshStore();
241
+ store.logAction('search', "test-repo", { query: "first query", resultCount: 3 });
242
+ store.logAction('read', "test-repo", { memoryId: "id-1", resultCount: 2 });
243
+ store.logAction('write', "test-repo", { query: "third query", resultCount: 1 });
244
+ const actions = store.getRecentActions("test-repo", 10);
245
+ expect(actions[0].action).toBe("write");
246
+ expect(actions[1].action).toBe("read");
247
+ expect(actions[2].action).toBe("search");
248
+ });
249
+ it("getRecentActions limits results correctly", () => {
250
+ const store = freshStore();
251
+ for (let i = 0; i < 25; i++) {
252
+ store.logAction('search', "test-repo", { query: `query-${i}`, resultCount: i });
253
+ }
254
+ const actions = store.getRecentActions("test-repo", 10);
255
+ expect(actions).toHaveLength(10);
256
+ });
257
+ it("getRecentActions filters by repo correctly", () => {
258
+ const store = freshStore();
259
+ store.logAction('search', "repo1", { query: "repo1 query", resultCount: 1 });
260
+ store.logAction('search', "repo2", { query: "repo2 query", resultCount: 1 });
261
+ store.logAction('read', "repo1", { memoryId: "id-1", resultCount: 1 });
262
+ const repo1Actions = store.getRecentActions("repo1", 10);
263
+ const repo2Actions = store.getRecentActions("repo2", 10);
264
+ expect(repo1Actions).toHaveLength(2);
265
+ expect(repo2Actions).toHaveLength(1);
266
+ });
267
+ it("getRecentActions returns empty array when no actions exist", () => {
268
+ const store = freshStore();
269
+ const actions = store.getRecentActions("nonexistent-repo", 10);
270
+ expect(actions).toHaveLength(0);
271
+ });
272
+ it("getRecentActions without repo parameter returns all actions", () => {
273
+ const store = freshStore();
274
+ store.logAction('search', "repo1", { query: "query1", resultCount: 1 });
275
+ store.logAction('read', "repo2", { memoryId: "id-1", resultCount: 1 });
276
+ const allActions = store.getRecentActions(undefined, 10);
277
+ expect(allActions).toHaveLength(2);
278
+ });
279
+ it("logAction stores result_count correctly", () => {
280
+ const store = freshStore();
281
+ store.logAction('search', "test-repo", { query: "high results", resultCount: 100 });
282
+ store.logAction('search', "test-repo", { query: "low results", resultCount: 1 });
283
+ const actions = store.getRecentActions("test-repo", 10);
284
+ expect(actions[0].result_count).toBe(1);
285
+ expect(actions[1].result_count).toBe(100);
286
+ });
287
+ it("different action types are logged correctly", () => {
288
+ const store = freshStore();
289
+ store.logAction('search', "test-repo", { query: "search query", resultCount: 5 });
290
+ store.logAction('read', "test-repo", { memoryId: "mem-1", resultCount: 1 });
291
+ store.logAction('write', "test-repo", { query: "new memory", resultCount: 1 });
292
+ store.logAction('update', "test-repo", { memoryId: "mem-2", resultCount: 1 });
293
+ store.logAction('delete', "test-repo", { memoryId: "mem-3", resultCount: 1 });
294
+ const actions = store.getRecentActions("test-repo", 10);
295
+ expect(actions).toHaveLength(5);
296
+ expect(actions.map(a => a.action)).toEqual(['delete', 'update', 'write', 'read', 'search']);
297
+ });
298
+ });
299
+ describe("Dashboard memory queries", () => {
300
+ it("listMemoriesForDashboard paginates, searches, and sorts server-side", () => {
301
+ const store = freshStore();
302
+ store.insert(makeEntry({
303
+ id: "dash-1",
304
+ repo: "repo-dashboard",
305
+ title: "Alpha Memory",
306
+ content: "alpha content",
307
+ importance: 5,
308
+ }));
309
+ store.insert(makeEntry({
310
+ id: "dash-2",
311
+ repo: "repo-dashboard",
312
+ title: "Beta Memory",
313
+ content: "beta content",
314
+ importance: 3,
315
+ }));
316
+ store.insert(makeEntry({
317
+ id: "dash-3",
318
+ repo: "repo-dashboard",
319
+ title: "Gamma Memory",
320
+ content: "gamma content",
321
+ importance: 4,
322
+ }));
323
+ store.incrementHitCount("dash-2");
324
+ store.incrementHitCount("dash-2");
325
+ store.incrementRecallCount("dash-2");
326
+ const result = store.listMemoriesForDashboard({
327
+ repo: "repo-dashboard",
328
+ search: "memory",
329
+ sortBy: "title",
330
+ sortOrder: "asc",
331
+ limit: 2,
332
+ offset: 0,
333
+ });
334
+ expect(result.total).toBe(3);
335
+ expect(result.items).toHaveLength(2);
336
+ expect(result.items[0].title).toBe("Alpha Memory");
337
+ expect(result.items[1].title).toBe("Beta Memory");
338
+ store.close();
339
+ });
340
+ it("getByIdWithStats returns recall_rate for detail views", () => {
341
+ const store = freshStore();
342
+ store.insert(makeEntry({
343
+ id: "detail-1",
344
+ repo: "repo-detail",
345
+ title: "Detail Memory",
346
+ content: "detail content",
347
+ }));
348
+ store.incrementHitCount("detail-1");
349
+ store.incrementHitCount("detail-1");
350
+ store.incrementRecallCount("detail-1");
351
+ const memory = store.getByIdWithStats("detail-1");
352
+ expect(memory).not.toBeNull();
353
+ expect(memory?.title).toBe("Detail Memory");
354
+ expect(memory?.recall_rate).toBe(0.5);
355
+ store.close();
356
+ });
357
+ });
358
+ //# sourceMappingURL=sqlite.test.js.map
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=store_memory_example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store_memory_example.d.ts","sourceRoot":"","sources":["../src/store_memory_example.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ import { MCPClient } from "./mcp/client.js";
3
+ async function storeMemoryExample() {
4
+ const client = new MCPClient();
5
+ try {
6
+ console.log("Connecting to MCP server...");
7
+ await client.start();
8
+ console.log("Connected! āœ“");
9
+ // Example 1: Store a code fact
10
+ console.log("\nšŸ“ Storing a code fact...");
11
+ const result1 = await client.callTool("memory-store", {
12
+ type: "code_fact",
13
+ content: "React hooks should be called at the top level of React functions, not inside loops, conditions, or nested functions.",
14
+ importance: 5,
15
+ scope: {
16
+ repo: "react-examples",
17
+ language: "typescript"
18
+ }
19
+ });
20
+ console.log(`āœ“ Stored with ID: ${result1.id}`);
21
+ // Example 2: Store a decision
22
+ console.log("\nšŸ“ Storing a decision...");
23
+ const result2 = await client.callTool("memory-store", {
24
+ type: "decision",
25
+ content: "Decided to use TypeScript for all new projects due to better type safety and developer experience.",
26
+ importance: 4,
27
+ scope: {
28
+ repo: "company-policies",
29
+ folder: "decisions"
30
+ }
31
+ });
32
+ console.log(`āœ“ Stored with ID: ${result2.id}`);
33
+ // Example 3: Store a mistake
34
+ console.log("\nšŸ“ Storing a mistake...");
35
+ const result3 = await client.callTool("memory-store", {
36
+ type: "mistake",
37
+ content: "Forgot to handle error cases in API calls, causing crashes in production. Always implement proper error handling.",
38
+ importance: 5,
39
+ scope: {
40
+ repo: "api-client",
41
+ language: "javascript"
42
+ }
43
+ });
44
+ console.log(`āœ“ Stored with ID: ${result3.id}`);
45
+ // Example 4: Store a pattern
46
+ console.log("\nšŸ“ Storing a pattern...");
47
+ const result4 = await client.callTool("memory-store", {
48
+ type: "pattern",
49
+ content: "Use the Repository pattern for data access to abstract database operations and make code more testable.",
50
+ importance: 3,
51
+ scope: {
52
+ repo: "architecture-patterns",
53
+ language: "csharp"
54
+ }
55
+ });
56
+ console.log(`āœ“ Stored with ID: ${result4.id}`);
57
+ console.log("\nšŸŽ‰ All memories stored successfully!");
58
+ console.log("\nYou can now search for these memories using memory-search tool.");
59
+ }
60
+ catch (error) {
61
+ console.error("āŒ Error:", error);
62
+ }
63
+ finally {
64
+ client.stop();
65
+ }
66
+ }
67
+ // Run the example
68
+ storeMemoryExample();
69
+ //# sourceMappingURL=store_memory_example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store_memory_example.js","sourceRoot":"","sources":["../src/store_memory_example.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,KAAK,UAAU,kBAAkB;IAC/B,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE5B,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,sHAAsH;YAC/H,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,YAAY;aACvB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,oGAAoG;YAC7G,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,WAAW;aACpB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,mHAAmH;YAC5H,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,YAAY;aACvB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,yGAAyG;YAClH,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IAEnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,kBAAkB;AAClB,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=test_quotes_client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_quotes_client.d.ts","sourceRoot":"","sources":["../src/test_quotes_client.ts"],"names":[],"mappings":""}