@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,72 @@
1
+ #!/usr/bin/env node
2
+ import { MCPClient } from "./mcp/client.js";
3
+ // Array of random quotes
4
+ const QUOTES = [
5
+ "The only way to do great work is to love what you do. - Steve Jobs",
6
+ "In the middle of difficulty lies opportunity. - Albert Einstein",
7
+ "Believe you can and you're halfway there. - Theodore Roosevelt",
8
+ "The future belongs to those who believe in the beauty of their dreams. - Eleanor Roosevelt",
9
+ "You miss 100% of the shots you don't take. - Wayne Gretzky",
10
+ "The best way to predict the future is to create it. - Peter Drucker",
11
+ "Life is what happens to you while you're busy making other plans. - John Lennon",
12
+ "The only impossible journey is the one you never begin. - Tony Robbins",
13
+ "Innovation distinguishes between a leader and a follower. - Steve Jobs",
14
+ "The mind is everything. What you think you become. - Buddha"
15
+ ];
16
+ // Function to generate random importance (1-5)
17
+ function randomImportance() {
18
+ return Math.floor(Math.random() * 5) + 1;
19
+ }
20
+ async function testRandomQuotes() {
21
+ const client = new MCPClient();
22
+ try {
23
+ console.log("Starting MCP client...");
24
+ await client.start();
25
+ console.log("MCP client connected!");
26
+ console.log("\nStoring random quotes...");
27
+ // Store quotes
28
+ for (let i = 0; i < QUOTES.length; i++) {
29
+ const importance = randomImportance();
30
+ const quote = QUOTES[i];
31
+ try {
32
+ const result = await client.callTool("memory-store", {
33
+ type: "code_fact",
34
+ content: quote,
35
+ importance: importance,
36
+ scope: { repo: "quotes-test" }
37
+ });
38
+ console.log(`✓ Stored quote ${i + 1}: ${quote.substring(0, 50)}... (importance: ${importance})`);
39
+ console.log(` ID: ${result.id}`);
40
+ }
41
+ catch (error) {
42
+ console.error(`✗ Failed to store quote ${i + 1}:`, error);
43
+ }
44
+ }
45
+ console.log("\nSearching for stored quotes...");
46
+ // Search for quotes
47
+ try {
48
+ const searchResult = await client.callTool("memory-search", {
49
+ query: "quotes",
50
+ repo: "quotes-test",
51
+ limit: 10
52
+ });
53
+ console.log(`Found ${searchResult.results.length} quotes:`);
54
+ searchResult.results.forEach((memory, index) => {
55
+ console.log(`${index + 1}. [${memory.importance}] ${memory.content}`);
56
+ });
57
+ }
58
+ catch (error) {
59
+ console.error("✗ Failed to search quotes:", error);
60
+ }
61
+ console.log("\nTest completed successfully! 🎉");
62
+ }
63
+ catch (error) {
64
+ console.error("Test failed:", error);
65
+ }
66
+ finally {
67
+ client.stop();
68
+ }
69
+ }
70
+ // Run the test
71
+ testRandomQuotes();
72
+ //# sourceMappingURL=test_quotes_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_quotes_client.js","sourceRoot":"","sources":["../src/test_quotes_client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import { SQLiteStore } from "../storage/sqlite.js";
3
+ import { VectorStore } from "../types.js";
4
+ import { McpResponse } from "../utils/mcp-response.js";
5
+ export declare const MemoryDeleteSchema: z.ZodObject<{
6
+ id: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export declare function handleMemoryDelete(params: any, db: SQLiteStore, vectors: VectorStore): Promise<McpResponse>;
9
+ //# sourceMappingURL=memory.delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.delete.d.ts","sourceRoot":"","sources":["../../src/tools/memory.delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAuBtB"}
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ import { createMcpResponse } from "../utils/mcp-response.js";
3
+ export const MemoryDeleteSchema = z.object({
4
+ id: z.string().uuid()
5
+ });
6
+ export async function handleMemoryDelete(params, db, vectors) {
7
+ // Validate input
8
+ const validated = MemoryDeleteSchema.parse(params);
9
+ // Check if memory exists
10
+ const existing = db.getById(validated.id);
11
+ if (!existing) {
12
+ throw new Error(`Memory not found: ${validated.id}`);
13
+ }
14
+ // Delete from SQLite
15
+ db.delete(validated.id);
16
+ // Delete from vector store
17
+ await vectors.remove(validated.id);
18
+ // Log the delete action
19
+ db.logAction('delete', existing.scope.repo, { memoryId: validated.id, resultCount: 1 });
20
+ return createMcpResponse({ success: true }, `Deleted memory ${validated.id.slice(0, 8)}...`);
21
+ }
22
+ //# sourceMappingURL=memory.delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.delete.js","sourceRoot":"","sources":["../../src/tools/memory.delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAW,EACX,EAAe,EACf,OAAoB;IAEpB,iBAAiB;IACjB,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEnD,yBAAyB;IACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,qBAAqB;IACrB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAExB,2BAA2B;IAC3B,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAEnC,wBAAwB;IACxB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAExF,OAAO,iBAAiB,CACtB,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,kBAAkB,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAChD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { SQLiteStore } from "../storage/sqlite.js";
2
+ import { McpResponse } from "../utils/mcp-response.js";
3
+ export declare function handleMemoryRecap(params: any, db: SQLiteStore): Promise<McpResponse>;
4
+ //# sourceMappingURL=memory.recap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.recap.d.ts","sourceRoot":"","sources":["../../src/tools/memory.recap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CAqDtB"}
@@ -0,0 +1,42 @@
1
+ import { MemoryRecapSchema } from "./schemas.js";
2
+ import { createMcpResponse } from "../utils/mcp-response.js";
3
+ export async function handleMemoryRecap(params, db) {
4
+ // Validate input
5
+ const validated = MemoryRecapSchema.parse(params);
6
+ // Get total count for pagination metadata
7
+ const total = db.getTotalCount(validated.repo);
8
+ // Get recent memories using public API (no type-unsafe cast)
9
+ const rows = db.getRecentMemories(validated.repo, validated.limit, validated.offset);
10
+ if (rows.length === 0) {
11
+ return createMcpResponse({
12
+ repo: validated.repo,
13
+ count: 0,
14
+ total,
15
+ offset: validated.offset,
16
+ memories: [],
17
+ message: `No memories found for repo: ${validated.repo}`
18
+ }, `No memories for repo "${validated.repo}"`);
19
+ }
20
+ // Format memories for recap
21
+ const formattedMemories = rows.map((row, index) => ({
22
+ number: validated.offset + index + 1,
23
+ id: row.id,
24
+ type: row.type,
25
+ importance: row.importance,
26
+ preview: row.content.substring(0, 100) + (row.content.length > 100 ? "..." : ""),
27
+ created_at: row.created_at
28
+ }));
29
+ // Create summary text
30
+ const summary = formattedMemories
31
+ .map((m) => `${m.number}. [${m.type.toUpperCase()}] (importance: ${m.importance}) ${m.preview}`)
32
+ .join("\n");
33
+ return createMcpResponse({
34
+ repo: validated.repo,
35
+ count: rows.length,
36
+ total,
37
+ offset: validated.offset,
38
+ memories: formattedMemories,
39
+ summary: `Recent ${rows.length} memories:\n\n${summary}`
40
+ }, `Retrieved ${rows.length} memories for repo "${validated.repo}"`);
41
+ }
42
+ //# sourceMappingURL=memory.recap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.recap.js","sourceRoot":"","sources":["../../src/tools/memory.recap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAW,EACX,EAAe;IAEf,iBAAiB;IACjB,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAElD,0CAA0C;IAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE/C,6DAA6D;IAC7D,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAErF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,iBAAiB,CACtB;YACE,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,CAAC;YACR,KAAK;YACL,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,+BAA+B,SAAS,CAAC,IAAI,EAAE;SACzD,EACD,yBAAyB,SAAS,CAAC,IAAI,GAAG,CAC3C,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC;QACpC,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC,CAAC,CAAC;IAEJ,sBAAsB;IACtB,MAAM,OAAO,GAAG,iBAAiB;SAC9B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,GAAG,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,EAAE,CACtF;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,iBAAiB,CACtB;QACE,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,KAAK;QACL,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,UAAU,IAAI,CAAC,MAAM,iBAAiB,OAAO,EAAE;KACzD,EACD,aAAa,IAAI,CAAC,MAAM,uBAAuB,SAAS,CAAC,IAAI,GAAG,CACjE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { SQLiteStore } from "../storage/sqlite.js";
2
+ import { VectorStore } from "../types.js";
3
+ import { McpResponse } from "../utils/mcp-response.js";
4
+ export declare function handleMemorySearch(params: any, db: SQLiteStore, vectors: VectorStore): Promise<McpResponse>;
5
+ //# sourceMappingURL=memory.search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.search.d.ts","sourceRoot":"","sources":["../../src/tools/memory.search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAIvD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAwB1E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAiNtB"}
@@ -0,0 +1,192 @@
1
+ import { MemorySearchSchema } from "./schemas.js";
2
+ import { normalize } from "../utils/normalize.js";
3
+ import { handleMemoryRecap } from "./memory.recap.js";
4
+ import { logger } from "../utils/logger.js";
5
+ import { createMcpResponse } from "../utils/mcp-response.js";
6
+ import { expandQuery } from "../utils/query-expander.js";
7
+ // Hybrid search configuration — weights when vector store is active
8
+ const HYBRID_WEIGHTS_VECTOR = {
9
+ similarity: 0.6,
10
+ vector: 0.3,
11
+ importance: 0.1
12
+ };
13
+ // Weights when vector store returns no results (normalized to sum = 1.0)
14
+ const HYBRID_WEIGHTS_NO_VECTOR = {
15
+ similarity: 0.85,
16
+ importance: 0.15
17
+ };
18
+ export async function handleMemorySearch(params, db, vectors) {
19
+ // Validate input
20
+ const validated = MemorySearchSchema.parse(params);
21
+ // STEP 0: Pre-search recap — only if includeRecap === true
22
+ let recapContext = "";
23
+ if (validated.includeRecap) {
24
+ try {
25
+ const recapResult = await handleMemoryRecap({ repo: validated.repo, limit: 20 }, db);
26
+ // Find text content that contains JSON data
27
+ const textContent = recapResult.content.find((c) => c.type === "text" && c.text);
28
+ if (textContent && textContent.type === "text") {
29
+ try {
30
+ const recapData = JSON.parse(textContent.text);
31
+ if (recapData.summary) {
32
+ recapContext = recapData.summary;
33
+ }
34
+ }
35
+ catch {
36
+ // Not JSON, might be plain text summary
37
+ recapContext = textContent.text;
38
+ }
39
+ }
40
+ }
41
+ catch (error) {
42
+ logger.error("Failed to get recap context", { error: String(error) });
43
+ // Continue anyway - recap is optional
44
+ }
45
+ }
46
+ // Expand query using prompt intent
47
+ const searchQuery = expandQuery(validated.query, validated.prompt);
48
+ // STEP 1: Repo filter (HARD) + Lightweight similarity scoring
49
+ const similarityResults = db.searchBySimilarity(searchQuery, validated.repo, validated.limit * 3 // Get more candidates for vector re-ranking
50
+ );
51
+ let candidates;
52
+ if (similarityResults.length > 0 && similarityResults[0].similarity > 0.1) {
53
+ // Use similarity results as candidates
54
+ candidates = similarityResults.map((result) => ({
55
+ memory: {
56
+ id: result.id,
57
+ type: result.type,
58
+ title: result.title,
59
+ content: result.content,
60
+ importance: result.importance,
61
+ scope: result.scope,
62
+ created_at: result.created_at,
63
+ updated_at: result.updated_at,
64
+ hit_count: result.hit_count,
65
+ recall_count: result.recall_count,
66
+ last_used_at: result.last_used_at,
67
+ expires_at: result.expires_at,
68
+ },
69
+ similarityScore: result.similarity
70
+ }));
71
+ }
72
+ else {
73
+ // Fallback: keyword search as candidates
74
+ const allResults = db.searchByRepo(validated.repo, {
75
+ types: validated.types,
76
+ minImportance: validated.minImportance,
77
+ limit: validated.limit * 3
78
+ });
79
+ const normalized = normalize(searchQuery);
80
+ const queryWords = normalized.split(/\s+/).filter(w => w.length > 2);
81
+ const filtered = allResults.filter((entry) => {
82
+ const normalizedContent = normalize(entry.content);
83
+ return queryWords.some(word => normalizedContent.includes(word));
84
+ });
85
+ const memoriesToUse = filtered.length > 0 ? filtered : allResults;
86
+ candidates = memoriesToUse.map(memory => ({
87
+ memory,
88
+ similarityScore: 0.5 // Default similarity for keyword matches
89
+ }));
90
+ }
91
+ // STEP 2: OPTIONAL vector similarity re-rank (only on top candidates)
92
+ let scoredMemories;
93
+ try {
94
+ // Attempt vector search on candidates (if available)
95
+ const vectorResults = await vectors.search(searchQuery, candidates.length);
96
+ if (vectorResults.length > 0) {
97
+ // Create a map of memory ID to vector score
98
+ const vectorScoreMap = new Map();
99
+ for (const vr of vectorResults) {
100
+ vectorScoreMap.set(vr.id, vr.score);
101
+ }
102
+ // Combine scores using hybrid formula (vector active: 0.6 + 0.3 + 0.1 = 1.0)
103
+ scoredMemories = candidates.map(({ memory, similarityScore }) => {
104
+ const vectorScore = vectorScoreMap.get(memory.id) || 0;
105
+ const importanceBoost = memory.importance / 5;
106
+ const finalScore = (similarityScore * HYBRID_WEIGHTS_VECTOR.similarity) +
107
+ (vectorScore * HYBRID_WEIGHTS_VECTOR.vector) +
108
+ (importanceBoost * HYBRID_WEIGHTS_VECTOR.importance);
109
+ return {
110
+ memory,
111
+ similarityScore,
112
+ vectorScore,
113
+ importanceBoost,
114
+ finalScore
115
+ };
116
+ });
117
+ }
118
+ else {
119
+ // No vector results — use similarity-only ranking (0.85 + 0.15 = 1.0)
120
+ scoredMemories = candidates.map(({ memory, similarityScore }) => {
121
+ const importanceBoost = memory.importance / 5;
122
+ const finalScore = (similarityScore * HYBRID_WEIGHTS_NO_VECTOR.similarity) +
123
+ (importanceBoost * HYBRID_WEIGHTS_NO_VECTOR.importance);
124
+ return {
125
+ memory,
126
+ similarityScore,
127
+ vectorScore: 0,
128
+ importanceBoost,
129
+ finalScore
130
+ };
131
+ });
132
+ }
133
+ }
134
+ catch (error) {
135
+ // Vector search failed — gracefully degrade to similarity-only
136
+ logger.warn("Vector search failed, using similarity-only", { error: String(error) });
137
+ scoredMemories = candidates.map(({ memory, similarityScore }) => {
138
+ const importanceBoost = memory.importance / 5;
139
+ const finalScore = (similarityScore * HYBRID_WEIGHTS_NO_VECTOR.similarity) +
140
+ (importanceBoost * HYBRID_WEIGHTS_NO_VECTOR.importance);
141
+ return {
142
+ memory,
143
+ similarityScore,
144
+ vectorScore: 0,
145
+ importanceBoost,
146
+ finalScore
147
+ };
148
+ });
149
+ }
150
+ // STEP 3: Sort by final score and take top results
151
+ scoredMemories.sort((a, b) => b.finalScore - a.finalScore);
152
+ const results = scoredMemories
153
+ .slice(0, validated.limit)
154
+ .map(sm => sm.memory);
155
+ // STEP 4: Increment hit_count for returned memories
156
+ for (const memory of results) {
157
+ db.incrementHitCount(memory.id);
158
+ }
159
+ // STEP 5: Log the query for recent queries feature
160
+ db.logAction('search', validated.repo, { query: validated.query, resultCount: results.length });
161
+ const resultData = {
162
+ query: validated.query,
163
+ prompt: validated.prompt || null,
164
+ results,
165
+ matchReason: validated.prompt
166
+ ? `Results ranked by relevance to "${validated.query}" with context: ${validated.prompt}`
167
+ : `Results ranked by relevance to "${validated.query}"`,
168
+ recapContext: recapContext ? `Recent memories context:\n${recapContext}` : undefined
169
+ };
170
+ const firstResult = results[0];
171
+ const resultName = firstResult?.title
172
+ ? `${firstResult.type} - ${firstResult.title}`
173
+ : (firstResult ? `${firstResult.type} - ${firstResult.content.substring(0, 40)}...` : `Found ${results.length} results`);
174
+ return createMcpResponse(resultData, `Found ${results.length} memories matching "${validated.query}"`, {
175
+ query: validated.query,
176
+ results: results.map(r => ({
177
+ id: r.id,
178
+ type: r.type,
179
+ title: r.title,
180
+ content: r.content,
181
+ importance: r.importance,
182
+ scope: r.scope,
183
+ created_at: r.created_at,
184
+ updated_at: r.updated_at,
185
+ hit_count: r.hit_count,
186
+ recall_count: r.recall_count,
187
+ last_used_at: r.last_used_at,
188
+ expires_at: r.expires_at
189
+ }))
190
+ });
191
+ }
192
+ //# sourceMappingURL=memory.search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.search.js","sourceRoot":"","sources":["../../src/tools/memory.search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory.search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.search.test.d.ts","sourceRoot":"","sources":["../../src/tools/memory.search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import * as fc from "fast-check";
3
+ // ─── Property 2: Recap conditional ───────────────────────────────────────────
4
+ // Feature: memory-mcp-optimization, Property 2: Recap conditional
5
+ // We test the weight constants directly by importing them from the module.
6
+ // For Property 2 we need to verify the conditional recap call logic.
7
+ // We do this by extracting the logic into a testable helper and verifying
8
+ // the branching behaviour with fast-check.
9
+ /**
10
+ * Mirrors the weight selection logic from memory.search.ts.
11
+ * Returns the weights object that would be used given whether vector results
12
+ * are present or not.
13
+ */
14
+ function selectWeights(vectorResultsEmpty) {
15
+ if (vectorResultsEmpty) {
16
+ return { similarity: 0.85, importance: 0.15 };
17
+ }
18
+ return { similarity: 0.6, vector: 0.3, importance: 0.1 };
19
+ }
20
+ /**
21
+ * Mirrors the recap-call decision from memory.search.ts.
22
+ * Returns true if handleMemoryRecap should be called.
23
+ */
24
+ function shouldCallRecap(includeRecap) {
25
+ return includeRecap === true;
26
+ }
27
+ // ─── Property 2 tests ────────────────────────────────────────────────────────
28
+ describe("Property 2: Recap dipanggil jika dan hanya jika includeRecap = true", () => {
29
+ // Feature: memory-mcp-optimization, Property 2: Recap conditional
30
+ // Validates: Requirements 2.1, 2.2, 2.3
31
+ it("should NOT call recap when includeRecap is false or absent", () => {
32
+ fc.assert(fc.property(fc.oneof(fc.constant(false), fc.constant(undefined)), (includeRecap) => {
33
+ expect(shouldCallRecap(includeRecap)).toBe(false);
34
+ }), { numRuns: 100 });
35
+ });
36
+ it("should call recap when includeRecap is true", () => {
37
+ fc.assert(fc.property(fc.constant(true), (includeRecap) => {
38
+ expect(shouldCallRecap(includeRecap)).toBe(true);
39
+ }), { numRuns: 100 });
40
+ });
41
+ it("recap is called if and only if includeRecap === true (combined property)", () => {
42
+ fc.assert(fc.property(fc.oneof(fc.constant(true), fc.constant(false), fc.constant(undefined)), (includeRecap) => {
43
+ const called = shouldCallRecap(includeRecap);
44
+ // The iff condition: called ↔ (includeRecap === true)
45
+ expect(called).toBe(includeRecap === true);
46
+ }), { numRuns: 200 });
47
+ });
48
+ });
49
+ // ─── Property 3: Hybrid score weights sum to 1.0 ─────────────────────────────
50
+ describe("Property 3: Total bobot Hybrid Score selalu = 1.0", () => {
51
+ // Feature: memory-mcp-optimization, Property 3: Hybrid score weights sum to 1.0
52
+ // Validates: Requirements 3.1, 3.2, 3.4
53
+ it("weights sum to 1.0 when vector store is empty (no vector results)", () => {
54
+ fc.assert(fc.property(fc.constant(true), // vectorResultsEmpty = true
55
+ (vectorResultsEmpty) => {
56
+ const weights = selectWeights(vectorResultsEmpty);
57
+ const sum = weights.similarity + (weights.vector ?? 0) + weights.importance;
58
+ expect(Math.abs(sum - 1.0)).toBeLessThan(1e-10);
59
+ }), { numRuns: 100 });
60
+ });
61
+ it("weights sum to 1.0 when vector store is active (has vector results)", () => {
62
+ fc.assert(fc.property(fc.constant(false), // vectorResultsEmpty = false
63
+ (vectorResultsEmpty) => {
64
+ const weights = selectWeights(vectorResultsEmpty);
65
+ const sum = weights.similarity + (weights.vector ?? 0) + weights.importance;
66
+ expect(Math.abs(sum - 1.0)).toBeLessThan(1e-10);
67
+ }), { numRuns: 100 });
68
+ });
69
+ it("weights always sum to 1.0 for both vector conditions", () => {
70
+ fc.assert(fc.property(fc.boolean(), // arbitrary vectorResultsEmpty flag
71
+ (vectorResultsEmpty) => {
72
+ const weights = selectWeights(vectorResultsEmpty);
73
+ const sum = weights.similarity + (weights.vector ?? 0) + weights.importance;
74
+ expect(Math.abs(sum - 1.0)).toBeLessThan(1e-10);
75
+ }), { numRuns: 200 });
76
+ });
77
+ it("vector-active weights are exactly 0.6 + 0.3 + 0.1 = 1.0", () => {
78
+ const weights = selectWeights(false);
79
+ expect(weights.similarity).toBe(0.6);
80
+ expect(weights.vector).toBe(0.3);
81
+ expect(weights.importance).toBe(0.1);
82
+ expect(weights.similarity + (weights.vector ?? 0) + weights.importance).toBeCloseTo(1.0, 10);
83
+ });
84
+ it("vector-empty weights are exactly 0.85 + 0.15 = 1.0", () => {
85
+ const weights = selectWeights(true);
86
+ expect(weights.similarity).toBe(0.85);
87
+ expect(weights.vector).toBeUndefined();
88
+ expect(weights.importance).toBe(0.15);
89
+ expect(weights.similarity + weights.importance).toBe(1.0);
90
+ });
91
+ });
92
+ // ─── Prompt parameter tests ─────────────────────────────────────────────────
93
+ describe("Property: prompt parameter in memory-search", () => {
94
+ it("prompt is optional - search works without prompt", () => {
95
+ const params = {
96
+ query: "database orm",
97
+ repo: "test-repo",
98
+ limit: 5
99
+ };
100
+ // If prompt is not provided, searchQuery should equal query
101
+ const hasPrompt = 'prompt' in params && params.prompt;
102
+ const searchQuery = hasPrompt
103
+ ? `${params.query} ${params.prompt}`
104
+ : params.query;
105
+ expect(searchQuery).toBe("database orm");
106
+ });
107
+ it("prompt is combined with query when provided", () => {
108
+ const params = {
109
+ query: "database orm",
110
+ prompt: "I need user authentication",
111
+ repo: "test-repo",
112
+ limit: 5
113
+ };
114
+ const searchQuery = params.prompt
115
+ ? `${params.query} ${params.prompt}`
116
+ : params.query;
117
+ expect(searchQuery).toBe("database orm I need user authentication");
118
+ });
119
+ it("prompt can be empty string - treated as no prompt (empty string is falsy)", () => {
120
+ const params = {
121
+ query: "database orm",
122
+ prompt: "",
123
+ repo: "test-repo",
124
+ limit: 5
125
+ };
126
+ // Empty string is falsy in JS, so it uses just query
127
+ const searchQuery = params.prompt
128
+ ? `${params.query} ${params.prompt}`
129
+ : params.query;
130
+ expect(searchQuery).toBe("database orm");
131
+ });
132
+ it("matchReason includes prompt when provided", () => {
133
+ const query = "database orm";
134
+ const prompt = "user authentication context";
135
+ const matchReason = prompt
136
+ ? `Results ranked by relevance to "${query}" with context: ${prompt}`
137
+ : `Results ranked by relevance to "${query}"`;
138
+ expect(matchReason).toContain("database orm");
139
+ expect(matchReason).toContain("user authentication context");
140
+ expect(matchReason).toContain("with context:");
141
+ });
142
+ it("matchReason does not include prompt when not provided", () => {
143
+ const query = "database orm";
144
+ const prompt = undefined;
145
+ const matchReason = prompt
146
+ ? `Results ranked by relevance to "${query}" with context: ${prompt}`
147
+ : `Results ranked by relevance to "${query}"`;
148
+ expect(matchReason).toBe(`Results ranked by relevance to "${query}"`);
149
+ expect(matchReason).not.toContain("with context:");
150
+ });
151
+ it("property: searchQuery combines query and prompt consistently", () => {
152
+ fc.assert(fc.property(fc.string({ minLength: 3, maxLength: 50 }), fc.string({ minLength: 1, maxLength: 100 }), (query, prompt) => {
153
+ const searchQuery = `${query} ${prompt}`;
154
+ // Search query should always start with the original query
155
+ expect(searchQuery.startsWith(query)).toBe(true);
156
+ // Search query should contain the prompt
157
+ expect(searchQuery.includes(prompt)).toBe(true);
158
+ // There should be exactly one space between query and prompt
159
+ expect(searchQuery).toBe(`${query} ${prompt}`);
160
+ }), { numRuns: 50 });
161
+ });
162
+ it("property: matchReason format is correct with and without prompt", () => {
163
+ fc.assert(fc.property(fc.string({ minLength: 1, maxLength: 30 }), fc.option(fc.string({ minLength: 1, maxLength: 50 })), (query, prompt) => {
164
+ const matchReason = prompt
165
+ ? `Results ranked by relevance to "${query}" with context: ${prompt}`
166
+ : `Results ranked by relevance to "${query}"`;
167
+ // Should always contain the query
168
+ expect(matchReason).toContain(query);
169
+ if (prompt) {
170
+ // Should contain "with context:" when prompt exists
171
+ expect(matchReason).toContain("with context:");
172
+ expect(matchReason).toContain(prompt);
173
+ }
174
+ else {
175
+ // Should NOT contain "with context:" when prompt is absent
176
+ expect(matchReason).not.toContain("with context:");
177
+ }
178
+ }), { numRuns: 50 });
179
+ });
180
+ });
181
+ //# sourceMappingURL=memory.search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.search.test.js","sourceRoot":"","sources":["../../src/tools/memory.search.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SQLiteStore } from "../storage/sqlite.js";
2
+ import { VectorStore } from "../types.js";
3
+ import { McpResponse } from "../utils/mcp-response.js";
4
+ export declare function handleMemoryStore(params: any, db: SQLiteStore, vectors: VectorStore): Promise<McpResponse>;
5
+ //# sourceMappingURL=memory.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.store.d.ts","sourceRoot":"","sources":["../../src/tools/memory.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CA4CtB"}