@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,113 @@
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
+ /**
6
+ * Property 11: createRouter() menggunakan storage yang diberikan
7
+ * Validates: Requirements 10.1, 10.4
8
+ *
9
+ * For any mock SQLiteStore given to createRouter(mockDb, mockVectors),
10
+ * all tool operations run through the router SHALL use mockDb and not access the real DB.
11
+ */
12
+ describe("createRouter() — Property 11: uses provided storage", () => {
13
+ function makeMockDb() {
14
+ return {
15
+ insert: vi.fn(),
16
+ update: vi.fn(),
17
+ delete: vi.fn(),
18
+ getById: vi.fn().mockReturnValue(null),
19
+ searchByRepo: vi.fn().mockReturnValue([]),
20
+ searchBySimilarity: vi.fn().mockReturnValue([]),
21
+ getRecentMemories: vi.fn().mockReturnValue([]),
22
+ getTotalCount: vi.fn().mockReturnValue(0),
23
+ getSummary: vi.fn().mockReturnValue(null),
24
+ upsertSummary: vi.fn(),
25
+ listRepos: vi.fn().mockReturnValue([]),
26
+ listRecent: vi.fn().mockReturnValue([]),
27
+ incrementHitCount: vi.fn(),
28
+ incrementRecallCount: vi.fn(),
29
+ getStats: vi.fn().mockReturnValue({ total: 0, byType: {}, unused: 0 }),
30
+ getAllMemoriesWithStats: vi.fn().mockReturnValue([]),
31
+ upsertVectorEmbedding: vi.fn(),
32
+ getVectorEmbedding: vi.fn().mockReturnValue(null),
33
+ archiveExpiredMemories: vi.fn().mockReturnValue(0),
34
+ logQuery: vi.fn(),
35
+ getRecentQueries: vi.fn().mockReturnValue([]),
36
+ close: vi.fn(),
37
+ };
38
+ }
39
+ function makeMockVectors() {
40
+ return {
41
+ upsert: vi.fn().mockResolvedValue(undefined),
42
+ remove: vi.fn().mockResolvedValue(undefined),
43
+ search: vi.fn().mockResolvedValue([]),
44
+ };
45
+ }
46
+ it("memory-recap calls getRecentMemories on the provided mock db", async () => {
47
+ const mockDb = makeMockDb();
48
+ const mockVectors = makeMockVectors();
49
+ const router = createRouter(mockDb, mockVectors);
50
+ await router("tools/call", {
51
+ name: "memory-recap",
52
+ arguments: { repo: "test-repo", limit: 5 },
53
+ });
54
+ expect(mockDb.getRecentMemories).toHaveBeenCalledWith("test-repo", 5, 0);
55
+ expect(mockDb.getTotalCount).toHaveBeenCalledWith("test-repo");
56
+ });
57
+ it("memory-search calls searchBySimilarity on the provided mock db", async () => {
58
+ const mockDb = makeMockDb();
59
+ const mockVectors = makeMockVectors();
60
+ const router = createRouter(mockDb, mockVectors);
61
+ await router("tools/call", {
62
+ name: "memory-search",
63
+ arguments: { query: "test query", repo: "test-repo", limit: 5 },
64
+ });
65
+ expect(mockDb.searchBySimilarity).toHaveBeenCalled();
66
+ // Verify the first argument to searchBySimilarity contains the repo
67
+ const callArgs = mockDb.searchBySimilarity.mock.calls[0];
68
+ expect(callArgs[1]).toBe("test-repo");
69
+ });
70
+ it("property: for any repo string, memory-recap always uses the injected db", async () => {
71
+ 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) => {
72
+ const mockDb = makeMockDb();
73
+ const mockVectors = makeMockVectors();
74
+ const router = createRouter(mockDb, mockVectors);
75
+ await router("tools/call", {
76
+ name: "memory-recap",
77
+ arguments: { repo, limit },
78
+ });
79
+ // The mock db methods must have been called (not a real DB)
80
+ expect(mockDb.getRecentMemories).toHaveBeenCalled();
81
+ expect(mockDb.getTotalCount).toHaveBeenCalled();
82
+ }), { numRuns: 100 });
83
+ });
84
+ it("property: for any valid store args, memory-store uses the injected db", async () => {
85
+ await fc.assert(fc.asyncProperty(fc.record({
86
+ repo: fc.string({ minLength: 1, maxLength: 30 }).filter((s) => s.trim().length > 0),
87
+ content: fc.string({ minLength: 10, maxLength: 200 }),
88
+ importance: fc.integer({ min: 1, max: 5 }),
89
+ type: fc.constantFrom("code_fact", "decision", "mistake", "pattern"),
90
+ }), async ({ repo, content, importance, type }) => {
91
+ const mockDb = makeMockDb();
92
+ const mockVectors = makeMockVectors();
93
+ const router = createRouter(mockDb, mockVectors);
94
+ await router("tools/call", {
95
+ name: "memory-store",
96
+ arguments: { type, content, importance, scope: { repo } },
97
+ });
98
+ expect(mockDb.insert).toHaveBeenCalled();
99
+ }), { numRuns: 100 });
100
+ });
101
+ it("different router instances use their own injected db independently", () => {
102
+ const mockDb1 = makeMockDb();
103
+ const mockDb2 = makeMockDb();
104
+ const mockVectors = makeMockVectors();
105
+ const router1 = createRouter(mockDb1, mockVectors);
106
+ const router2 = createRouter(mockDb2, mockVectors);
107
+ // Both routers are distinct functions
108
+ expect(router1).not.toBe(router2);
109
+ // Each router closes over its own db
110
+ // (verified by the property tests above that each mock is called independently)
111
+ });
112
+ });
113
+ //# sourceMappingURL=router.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.test.js","sourceRoot":"","sources":["../src/router.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=search_memory_example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search_memory_example.d.ts","sourceRoot":"","sources":["../src/search_memory_example.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ import { MCPClient } from "./mcp/client.js";
3
+ async function searchMemoryExample() {
4
+ const client = new MCPClient();
5
+ try {
6
+ console.log("Connecting to MCP server...");
7
+ await client.start();
8
+ console.log("Connected! ✓");
9
+ // Search for all memories in react-examples repo
10
+ console.log("\n🔍 Searching for memories in 'react-examples' repo...");
11
+ const search1 = await client.callTool("memory-search", {
12
+ query: "react",
13
+ repo: "react-examples",
14
+ limit: 5
15
+ });
16
+ console.log(`Found ${search1.results.length} memories:`);
17
+ search1.results.forEach((memory, i) => {
18
+ console.log(`${i + 1}. [${memory.type}] ${memory.content.substring(0, 80)}...`);
19
+ });
20
+ // Search for decisions
21
+ console.log("\n🔍 Searching for decisions...");
22
+ const search2 = await client.callTool("memory-search", {
23
+ query: "decided",
24
+ repo: "company-policies",
25
+ types: ["decision"],
26
+ limit: 3
27
+ });
28
+ console.log(`Found ${search2.results.length} decisions:`);
29
+ search2.results.forEach((memory, i) => {
30
+ console.log(`${i + 1}. ${memory.content}`);
31
+ });
32
+ // Search for mistakes with high importance
33
+ console.log("\n🔍 Searching for important mistakes...");
34
+ const search3 = await client.callTool("memory-search", {
35
+ query: "error",
36
+ repo: "api-client", // Specify repo
37
+ minImportance: 4,
38
+ types: ["mistake"],
39
+ limit: 3
40
+ });
41
+ console.log(`Found ${search3.results.length} important mistakes:`);
42
+ search3.results.forEach((memory, i) => {
43
+ console.log(`${i + 1}. ${memory.content}`);
44
+ });
45
+ console.log("\n🎉 Search examples completed!");
46
+ }
47
+ catch (error) {
48
+ console.error("❌ Error:", error);
49
+ }
50
+ finally {
51
+ client.stop();
52
+ }
53
+ }
54
+ // Run the example
55
+ searchMemoryExample();
56
+ //# sourceMappingURL=search_memory_example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search_memory_example.js","sourceRoot":"","sources":["../src/search_memory_example.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,KAAK,UAAU,mBAAmB;IAChC,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,iDAAiD;QACjD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE;YACrD,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;QACzD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,CAAS,EAAE,EAAE;YACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE;YACrD,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,CAAC,UAAU,CAAC;YACnB,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;QAC1D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,CAAS,EAAE,EAAE;YACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,2CAA2C;QAC3C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE;YACrD,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,YAAY,EAAE,eAAe;YACnC,aAAa,EAAE,CAAC;YAChB,KAAK,EAAE,CAAC,SAAS,CAAC;YAClB,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACnE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,CAAS,EAAE,EAAE;YACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAEjD,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,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ import readline from "node:readline";
3
+ import { createRouter } from "./router.js";
4
+ import { SQLiteStore } from "./storage/sqlite.js";
5
+ import { StubVectorStore } from "./storage/vectors.stub.js";
6
+ import { CAPABILITIES } from "./capabilities.js";
7
+ import { logger } from "./utils/logger.js";
8
+ // Create storage instances
9
+ const db = new SQLiteStore();
10
+ const vectors = new StubVectorStore(db);
11
+ // Wire router with injected storage
12
+ const handleMethod = createRouter(db, vectors);
13
+ // Cleanup on exit
14
+ process.on("SIGINT", () => {
15
+ db.close();
16
+ process.exit(0);
17
+ });
18
+ process.on("SIGTERM", () => {
19
+ db.close();
20
+ process.exit(0);
21
+ });
22
+ const rl = readline.createInterface({
23
+ input: process.stdin,
24
+ output: process.stdout,
25
+ terminal: false
26
+ });
27
+ function reply(payload) {
28
+ try {
29
+ process.stdout.write(JSON.stringify(payload) + "\n");
30
+ }
31
+ catch (err) {
32
+ // Ignore EPIPE errors (broken pipe when client disconnects)
33
+ if (err.code !== "EPIPE") {
34
+ throw err;
35
+ }
36
+ }
37
+ }
38
+ rl.on("line", async (line) => {
39
+ if (!line.trim())
40
+ return;
41
+ let msg;
42
+ try {
43
+ msg = JSON.parse(line);
44
+ }
45
+ catch {
46
+ return;
47
+ }
48
+ const { id, method, params } = msg;
49
+ // --- initialize ---
50
+ if (method === "initialize") {
51
+ reply({
52
+ jsonrpc: "2.0",
53
+ id,
54
+ result: {
55
+ protocolVersion: "2024-11-05",
56
+ serverInfo: CAPABILITIES.serverInfo,
57
+ capabilities: CAPABILITIES.capabilities
58
+ }
59
+ });
60
+ reply({
61
+ jsonrpc: "2.0",
62
+ method: "notifications/initialized",
63
+ params: {}
64
+ });
65
+ return;
66
+ }
67
+ // --- ignore notification ---
68
+ if (method === "notifications/initialized")
69
+ return;
70
+ // --- route method ---
71
+ try {
72
+ const result = await handleMethod(method, params);
73
+ reply({
74
+ jsonrpc: "2.0",
75
+ id,
76
+ result
77
+ });
78
+ }
79
+ catch (err) {
80
+ logger.error("Method handler error", { method, id, message: err.message });
81
+ reply({
82
+ jsonrpc: "2.0",
83
+ id,
84
+ error: {
85
+ code: -32603,
86
+ message: err.message || "Internal error"
87
+ }
88
+ });
89
+ }
90
+ });
91
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { MemoryEntry } from "../types.js";
2
+ export declare class SQLiteStore {
3
+ private db;
4
+ constructor(dbPath?: string);
5
+ private migrate;
6
+ insert(entry: MemoryEntry): void;
7
+ update(id: string, updates: {
8
+ title?: string;
9
+ content?: string;
10
+ importance?: number;
11
+ }): void;
12
+ searchByRepo(repo: string, options?: {
13
+ types?: string[];
14
+ minImportance?: number;
15
+ limit?: number;
16
+ }): MemoryEntry[];
17
+ getById(id: string): MemoryEntry | null;
18
+ getByIdWithStats(id: string): (MemoryEntry & {
19
+ recall_rate: number;
20
+ }) | null;
21
+ listRecent(limit?: number): Array<{
22
+ id: string;
23
+ type: string;
24
+ repo: string;
25
+ }>;
26
+ getSummary(repo: string): {
27
+ summary: string;
28
+ updated_at: string;
29
+ } | null;
30
+ upsertSummary(repo: string, summary: string): void;
31
+ delete(id: string): void;
32
+ listRepos(): string[];
33
+ listRepoNavigation(): Array<{
34
+ repo: string;
35
+ memory_count: number;
36
+ last_updated_at: string | null;
37
+ }>;
38
+ incrementHitCount(id: string): void;
39
+ incrementRecallCount(id: string): void;
40
+ getStats(repo?: string): {
41
+ total: number;
42
+ byType: Record<string, number>;
43
+ unused: number;
44
+ };
45
+ getRecentMemories(repo: string, limit: number, offset?: number): MemoryEntry[];
46
+ getTotalCount(repo: string): number;
47
+ searchBySimilarity(query: string, repo: string, limit?: number): Array<MemoryEntry & {
48
+ similarity: number;
49
+ }>;
50
+ archiveExpiredMemories(): number;
51
+ getAllMemoriesWithStats(repo?: string): Array<MemoryEntry & {
52
+ hit_count: number;
53
+ recall_count: number;
54
+ recall_rate: number;
55
+ last_used_at: string | null;
56
+ }>;
57
+ listMemoriesForDashboard(options: {
58
+ repo: string;
59
+ type?: string;
60
+ search?: string;
61
+ minImportance?: number;
62
+ maxImportance?: number;
63
+ sortBy?: string;
64
+ sortOrder?: "asc" | "desc";
65
+ limit?: number;
66
+ offset?: number;
67
+ }): {
68
+ items: Array<MemoryEntry & {
69
+ hit_count: number;
70
+ recall_count: number;
71
+ recall_rate: number;
72
+ last_used_at: string | null;
73
+ }>;
74
+ total: number;
75
+ };
76
+ upsertVectorEmbedding(memoryId: string, vector: number[] | string[]): void;
77
+ getVectorEmbedding(memoryId: string): number[] | string[] | null;
78
+ close(): void;
79
+ private computeVector;
80
+ private cosineSimilarity;
81
+ private rowToMemoryEntry;
82
+ logAction(action: 'search' | 'read' | 'write' | 'update' | 'delete', repo: string, options?: {
83
+ query?: string;
84
+ memoryId?: string;
85
+ resultCount?: number;
86
+ }): void;
87
+ getRecentActions(repo?: string, limit?: number): Array<{
88
+ action: string;
89
+ query?: string;
90
+ memory_id?: string;
91
+ result_count?: number;
92
+ created_at: string;
93
+ }>;
94
+ }
95
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}