@vheins/local-memory-mcp 0.4.12 → 0.5.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 (201) hide show
  1. package/README.md +21 -0
  2. package/bin/mcp-memory-server.js +1 -1
  3. package/dist/dashboard/public/assets/index-KxrQ6fPK.css +1 -0
  4. package/dist/dashboard/public/assets/index-Lu37nzOi.js +72 -0
  5. package/dist/dashboard/public/index.html +11 -1772
  6. package/dist/dashboard/server.js +115 -5
  7. package/dist/dashboard/server.js.map +1 -1
  8. package/dist/mcp/capabilities.d.ts +22 -0
  9. package/dist/mcp/capabilities.d.ts.map +1 -0
  10. package/dist/mcp/capabilities.js +38 -0
  11. package/dist/mcp/capabilities.js.map +1 -0
  12. package/dist/mcp/client.js +3 -3
  13. package/dist/mcp/client.js.map +1 -1
  14. package/dist/mcp/completion.d.ts +25 -0
  15. package/dist/mcp/completion.d.ts.map +1 -0
  16. package/dist/mcp/completion.js +127 -0
  17. package/dist/mcp/completion.js.map +1 -0
  18. package/dist/mcp/prompts/registry.d.ts +314 -0
  19. package/dist/mcp/prompts/registry.d.ts.map +1 -0
  20. package/dist/mcp/prompts/registry.js +936 -0
  21. package/dist/mcp/prompts/registry.js.map +1 -0
  22. package/dist/mcp/resources/index.d.ts +68 -0
  23. package/dist/mcp/resources/index.d.ts.map +1 -0
  24. package/dist/mcp/resources/index.js +323 -0
  25. package/dist/mcp/resources/index.js.map +1 -0
  26. package/dist/mcp/router.d.ts +14 -0
  27. package/dist/mcp/router.d.ts.map +1 -0
  28. package/dist/mcp/router.js +242 -0
  29. package/dist/mcp/router.js.map +1 -0
  30. package/dist/mcp/server.d.ts +3 -0
  31. package/dist/mcp/server.d.ts.map +1 -0
  32. package/dist/mcp/server.js +338 -0
  33. package/dist/mcp/server.js.map +1 -0
  34. package/dist/mcp/storage/sqlite.d.ts +83 -0
  35. package/dist/mcp/storage/sqlite.d.ts.map +1 -0
  36. package/dist/mcp/storage/sqlite.js +1237 -0
  37. package/dist/mcp/storage/sqlite.js.map +1 -0
  38. package/dist/mcp/storage/vectors.d.ts +19 -0
  39. package/dist/mcp/storage/vectors.d.ts.map +1 -0
  40. package/dist/mcp/storage/vectors.js +74 -0
  41. package/dist/mcp/storage/vectors.js.map +1 -0
  42. package/dist/mcp/storage/vectors.stub.d.ts +12 -0
  43. package/dist/mcp/storage/vectors.stub.d.ts.map +1 -0
  44. package/dist/mcp/storage/vectors.stub.js +88 -0
  45. package/dist/mcp/storage/vectors.stub.js.map +1 -0
  46. package/dist/mcp/tests/client.test.d.ts +2 -0
  47. package/dist/mcp/tests/client.test.d.ts.map +1 -0
  48. package/dist/mcp/tests/client.test.js +130 -0
  49. package/dist/mcp/tests/client.test.js.map +1 -0
  50. package/dist/mcp/tests/dashboard.test.d.ts +2 -0
  51. package/dist/mcp/tests/dashboard.test.d.ts.map +1 -0
  52. package/dist/mcp/tests/dashboard.test.js +370 -0
  53. package/dist/mcp/tests/dashboard.test.js.map +1 -0
  54. package/dist/mcp/tests/e2e.test.d.ts +2 -0
  55. package/dist/mcp/tests/e2e.test.d.ts.map +1 -0
  56. package/dist/mcp/tests/e2e.test.js +250 -0
  57. package/dist/mcp/tests/e2e.test.js.map +1 -0
  58. package/dist/mcp/tests/index.test.d.ts +2 -0
  59. package/dist/mcp/tests/index.test.d.ts.map +1 -0
  60. package/dist/mcp/tests/index.test.js +185 -0
  61. package/dist/mcp/tests/index.test.js.map +1 -0
  62. package/dist/mcp/tests/logger.test.d.ts +2 -0
  63. package/dist/mcp/tests/logger.test.d.ts.map +1 -0
  64. package/dist/mcp/tests/logger.test.js +104 -0
  65. package/dist/mcp/tests/logger.test.js.map +1 -0
  66. package/dist/mcp/tests/memory.bulk.test.d.ts +2 -0
  67. package/dist/mcp/tests/memory.bulk.test.d.ts.map +1 -0
  68. package/dist/mcp/tests/memory.bulk.test.js +52 -0
  69. package/dist/mcp/tests/memory.bulk.test.js.map +1 -0
  70. package/dist/mcp/tests/memory.search.test.d.ts +2 -0
  71. package/dist/mcp/tests/memory.search.test.d.ts.map +1 -0
  72. package/dist/mcp/tests/memory.search.test.js +181 -0
  73. package/dist/mcp/tests/memory.search.test.js.map +1 -0
  74. package/dist/mcp/tests/normalize.test.d.ts +2 -0
  75. package/dist/mcp/tests/normalize.test.d.ts.map +1 -0
  76. package/dist/mcp/tests/normalize.test.js +181 -0
  77. package/dist/mcp/tests/normalize.test.js.map +1 -0
  78. package/dist/mcp/tests/query-expander.test.d.ts +2 -0
  79. package/dist/mcp/tests/query-expander.test.d.ts.map +1 -0
  80. package/dist/mcp/tests/query-expander.test.js +33 -0
  81. package/dist/mcp/tests/query-expander.test.js.map +1 -0
  82. package/dist/mcp/tests/router.test.d.ts +2 -0
  83. package/dist/mcp/tests/router.test.d.ts.map +1 -0
  84. package/dist/mcp/tests/router.test.js +470 -0
  85. package/dist/mcp/tests/router.test.js.map +1 -0
  86. package/dist/mcp/tests/sqlite.test.d.ts +2 -0
  87. package/dist/mcp/tests/sqlite.test.d.ts.map +1 -0
  88. package/dist/mcp/tests/sqlite.test.js +367 -0
  89. package/dist/mcp/tests/sqlite.test.js.map +1 -0
  90. package/dist/mcp/tests/tasks-search.test.d.ts +2 -0
  91. package/dist/mcp/tests/tasks-search.test.d.ts.map +1 -0
  92. package/dist/mcp/tests/tasks-search.test.js +154 -0
  93. package/dist/mcp/tests/tasks-search.test.js.map +1 -0
  94. package/dist/mcp/tests/tasks-transition.test.d.ts +2 -0
  95. package/dist/mcp/tests/tasks-transition.test.d.ts.map +1 -0
  96. package/dist/mcp/tests/tasks-transition.test.js +174 -0
  97. package/dist/mcp/tests/tasks-transition.test.js.map +1 -0
  98. package/dist/mcp/tests/tasks.bulk.test.d.ts +2 -0
  99. package/dist/mcp/tests/tasks.bulk.test.d.ts.map +1 -0
  100. package/dist/mcp/tests/tasks.bulk.test.js +254 -0
  101. package/dist/mcp/tests/tasks.bulk.test.js.map +1 -0
  102. package/dist/mcp/tests/tasks.e2e.test.d.ts +2 -0
  103. package/dist/mcp/tests/tasks.e2e.test.d.ts.map +1 -0
  104. package/dist/mcp/tests/tasks.e2e.test.js +289 -0
  105. package/dist/mcp/tests/tasks.e2e.test.js.map +1 -0
  106. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts +2 -0
  107. package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts.map +1 -0
  108. package/dist/mcp/tests/tasks.pending-limit-refined.test.js +72 -0
  109. package/dist/mcp/tests/tasks.pending-limit-refined.test.js.map +1 -0
  110. package/dist/mcp/tests/v2-features.test.d.ts +2 -0
  111. package/dist/mcp/tests/v2-features.test.d.ts.map +1 -0
  112. package/dist/mcp/tests/v2-features.test.js +209 -0
  113. package/dist/mcp/tests/v2-features.test.js.map +1 -0
  114. package/dist/mcp/tools/memory.acknowledge.d.ts +4 -0
  115. package/dist/mcp/tools/memory.acknowledge.d.ts.map +1 -0
  116. package/dist/mcp/tools/memory.acknowledge.js +30 -0
  117. package/dist/mcp/tools/memory.acknowledge.js.map +1 -0
  118. package/dist/mcp/tools/memory.bulk-delete.d.ts +4 -0
  119. package/dist/mcp/tools/memory.bulk-delete.d.ts.map +1 -0
  120. package/dist/mcp/tools/memory.bulk-delete.js +39 -0
  121. package/dist/mcp/tools/memory.bulk-delete.js.map +1 -0
  122. package/dist/mcp/tools/memory.delete.d.ts +9 -0
  123. package/dist/mcp/tools/memory.delete.d.ts.map +1 -0
  124. package/dist/mcp/tools/memory.delete.js +39 -0
  125. package/dist/mcp/tools/memory.delete.js.map +1 -0
  126. package/dist/mcp/tools/memory.recap.d.ts +4 -0
  127. package/dist/mcp/tools/memory.recap.d.ts.map +1 -0
  128. package/dist/mcp/tools/memory.recap.js +90 -0
  129. package/dist/mcp/tools/memory.recap.js.map +1 -0
  130. package/dist/mcp/tools/memory.search.d.ts +5 -0
  131. package/dist/mcp/tools/memory.search.d.ts.map +1 -0
  132. package/dist/mcp/tools/memory.search.js +134 -0
  133. package/dist/mcp/tools/memory.search.js.map +1 -0
  134. package/dist/mcp/tools/memory.store.d.ts +5 -0
  135. package/dist/mcp/tools/memory.store.d.ts.map +1 -0
  136. package/dist/mcp/tools/memory.store.js +117 -0
  137. package/dist/mcp/tools/memory.store.js.map +1 -0
  138. package/dist/mcp/tools/memory.summarize.d.ts +4 -0
  139. package/dist/mcp/tools/memory.summarize.d.ts.map +1 -0
  140. package/dist/mcp/tools/memory.summarize.js +31 -0
  141. package/dist/mcp/tools/memory.summarize.js.map +1 -0
  142. package/dist/mcp/tools/memory.synthesize.d.ts +14 -0
  143. package/dist/mcp/tools/memory.synthesize.d.ts.map +1 -0
  144. package/dist/mcp/tools/memory.synthesize.js +228 -0
  145. package/dist/mcp/tools/memory.synthesize.js.map +1 -0
  146. package/dist/mcp/tools/memory.update.d.ts +5 -0
  147. package/dist/mcp/tools/memory.update.d.ts.map +1 -0
  148. package/dist/mcp/tools/memory.update.js +73 -0
  149. package/dist/mcp/tools/memory.update.js.map +1 -0
  150. package/dist/mcp/tools/schemas.d.ts +2762 -0
  151. package/dist/mcp/tools/schemas.d.ts.map +1 -0
  152. package/dist/mcp/tools/schemas.js +952 -0
  153. package/dist/mcp/tools/schemas.js.map +1 -0
  154. package/dist/mcp/tools/task.bulk-manage.d.ts +4 -0
  155. package/dist/mcp/tools/task.bulk-manage.d.ts.map +1 -0
  156. package/dist/mcp/tools/task.bulk-manage.js +146 -0
  157. package/dist/mcp/tools/task.bulk-manage.js.map +1 -0
  158. package/dist/mcp/tools/task.manage.d.ts +16 -0
  159. package/dist/mcp/tools/task.manage.d.ts.map +1 -0
  160. package/dist/mcp/tools/task.manage.js +395 -0
  161. package/dist/mcp/tools/task.manage.js.map +1 -0
  162. package/dist/mcp/types.d.ts +87 -0
  163. package/dist/mcp/types.d.ts.map +1 -0
  164. package/dist/mcp/types.js +3 -0
  165. package/dist/mcp/types.js.map +1 -0
  166. package/dist/mcp/utils/completion.d.ts +2 -0
  167. package/dist/mcp/utils/completion.d.ts.map +1 -0
  168. package/dist/mcp/utils/completion.js +28 -0
  169. package/dist/mcp/utils/completion.js.map +1 -0
  170. package/dist/mcp/utils/git-scope.d.ts +8 -0
  171. package/dist/mcp/utils/git-scope.d.ts.map +1 -0
  172. package/dist/mcp/utils/git-scope.js +38 -0
  173. package/dist/mcp/utils/git-scope.js.map +1 -0
  174. package/dist/mcp/utils/logger.d.ts +25 -0
  175. package/dist/mcp/utils/logger.d.ts.map +1 -0
  176. package/dist/mcp/utils/logger.js +152 -0
  177. package/dist/mcp/utils/logger.js.map +1 -0
  178. package/dist/mcp/utils/mcp-response.d.ts +96 -0
  179. package/dist/mcp/utils/mcp-response.d.ts.map +1 -0
  180. package/dist/mcp/utils/mcp-response.js +131 -0
  181. package/dist/mcp/utils/mcp-response.js.map +1 -0
  182. package/dist/mcp/utils/normalize.d.ts +9 -0
  183. package/dist/mcp/utils/normalize.d.ts.map +1 -0
  184. package/dist/mcp/utils/normalize.js +62 -0
  185. package/dist/mcp/utils/normalize.js.map +1 -0
  186. package/dist/mcp/utils/pagination.d.ts +6 -0
  187. package/dist/mcp/utils/pagination.d.ts.map +1 -0
  188. package/dist/mcp/utils/pagination.js +32 -0
  189. package/dist/mcp/utils/pagination.js.map +1 -0
  190. package/dist/mcp/utils/query-expander.d.ts +2 -0
  191. package/dist/mcp/utils/query-expander.d.ts.map +1 -0
  192. package/dist/mcp/utils/query-expander.js +29 -0
  193. package/dist/mcp/utils/query-expander.js.map +1 -0
  194. package/dist/storage/sqlite.d.ts +3 -0
  195. package/dist/storage/sqlite.d.ts.map +1 -1
  196. package/dist/storage/sqlite.js +38 -9
  197. package/dist/storage/sqlite.js.map +1 -1
  198. package/package.json +17 -5
  199. package/dist/dashboard/public/app.js +0 -2779
  200. package/dist/dashboard/public/chart.js +0 -0
  201. package/dist/dashboard/public/screenshot.png +0 -0
@@ -0,0 +1,30 @@
1
+ import { MemoryAcknowledgeSchema } from "./schemas.js";
2
+ import { logger } from "../utils/logger.js";
3
+ import { createMcpResponse } from "../utils/mcp-response.js";
4
+ export async function handleMemoryAcknowledge(params, db) {
5
+ // Validate input
6
+ const validated = MemoryAcknowledgeSchema.parse(params);
7
+ // Check if memory exists
8
+ const memory = db.getById(validated.memory_id);
9
+ if (!memory) {
10
+ throw new Error(`Memory with ID ${validated.memory_id} not found.`);
11
+ }
12
+ // Update statistics based on status
13
+ if (validated.status === "used") {
14
+ db.incrementRecallCount(memory.id);
15
+ logger.info("[MCP] memory.acknowledge - used", { id: memory.id, context: validated.application_context });
16
+ }
17
+ else if (validated.status === "contradictory") {
18
+ // Flag for potential manual audit later
19
+ logger.warn("[MCP] memory.acknowledge - contradiction reported", { id: memory.id, context: validated.application_context });
20
+ }
21
+ else {
22
+ logger.info("[MCP] memory.acknowledge - irrelevant", { id: memory.id, context: validated.application_context });
23
+ }
24
+ return createMcpResponse({
25
+ success: true,
26
+ id: memory.id,
27
+ status: validated.status
28
+ }, `Acknowledge ${validated.status} for memory ${memory.id.slice(0, 8)}...`);
29
+ }
30
+ //# sourceMappingURL=memory.acknowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.acknowledge.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.acknowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAW,EACX,EAAe;IAEf,iBAAiB;IACjB,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,yBAAyB;IACzB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,CAAC,SAAS,aAAa,CAAC,CAAC;IACtE,CAAC;IAED,oCAAoC;IACpC,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAChC,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC5G,CAAC;SAAM,IAAI,SAAS,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QAChD,wCAAwC;QACxC,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9H,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,EACD,eAAe,SAAS,CAAC,MAAM,eAAe,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CACzE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { SQLiteStore } from "../storage/sqlite.js";
2
+ import { VectorStore } from "../types.js";
3
+ export declare function handleMemoryBulkDelete(args: any, storage: SQLiteStore, vectors: VectorStore, onProgress?: (progress: number, total?: number) => void): Promise<import("../utils/mcp-response.js").McpResponse>;
4
+ //# sourceMappingURL=memory.bulk-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.bulk-delete.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.bulk-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,2DA6CxD"}
@@ -0,0 +1,39 @@
1
+ import { createMcpResponse } from "../utils/mcp-response.js";
2
+ import { MemoryBulkDeleteSchema } from "./schemas.js";
3
+ export async function handleMemoryBulkDelete(args, storage, vectors, onProgress) {
4
+ const { repo, ids } = MemoryBulkDeleteSchema.parse(args);
5
+ const total = ids.length;
6
+ let progress = 0;
7
+ for (const id of ids) {
8
+ if (onProgress) {
9
+ onProgress(progress, total);
10
+ }
11
+ storage.delete(id);
12
+ await vectors.remove(id);
13
+ progress++;
14
+ }
15
+ if (onProgress) {
16
+ onProgress(progress, total);
17
+ }
18
+ storage.logAction("delete", repo, { resultCount: ids.length, query: "Bulk Delete" });
19
+ return createMcpResponse({
20
+ success: true,
21
+ repo,
22
+ deletedCount: ids.length,
23
+ ids,
24
+ }, `Successfully deleted ${ids.length} memories.`, {
25
+ resourceLinks: [
26
+ {
27
+ uri: `memory://index?repo=${encodeURIComponent(repo)}`,
28
+ name: `Memory Index (${repo})`,
29
+ description: "Repository memory index after bulk deletion",
30
+ mimeType: "application/json",
31
+ annotations: {
32
+ audience: ["assistant"],
33
+ priority: 0.5,
34
+ },
35
+ },
36
+ ],
37
+ });
38
+ }
39
+ //# sourceMappingURL=memory.bulk-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.bulk-delete.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.bulk-delete.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAS,EACT,OAAoB,EACpB,OAAoB,EACpB,UAAuD;IAEvD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;IACzB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAErF,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,IAAI;QACJ,YAAY,EAAE,GAAG,CAAC,MAAM;QACxB,GAAG;KACJ,EACD,wBAAwB,GAAG,CAAC,MAAM,YAAY,EAC9C;QACE,aAAa,EAAE;YACb;gBACE,GAAG,EAAE,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,EAAE;gBACtD,IAAI,EAAE,iBAAiB,IAAI,GAAG;gBAC9B,WAAW,EAAE,6CAA6C;gBAC1D,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;iBACd;aACF;SACF;KACF,CACF,CAAC;AACJ,CAAC"}
@@ -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/mcp/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;AAG1E,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,CAwCtB"}
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+ import { createMcpResponse } from "../utils/mcp-response.js";
3
+ import { logger } from "../utils/logger.js";
4
+ export const MemoryDeleteSchema = z.object({
5
+ id: z.string().uuid()
6
+ });
7
+ export async function handleMemoryDelete(params, db, vectors) {
8
+ // Validate input
9
+ const validated = MemoryDeleteSchema.parse(params);
10
+ // Check if memory exists
11
+ const existing = db.getById(validated.id);
12
+ if (!existing) {
13
+ throw new Error(`Memory not found: ${validated.id}`);
14
+ }
15
+ // Delete from SQLite
16
+ db.delete(validated.id);
17
+ // Delete from vector store
18
+ await vectors.remove(validated.id);
19
+ logger.info("[MCP] memory.delete", { repo: existing.scope.repo, id: validated.id, title: existing.title });
20
+ return createMcpResponse({
21
+ success: true,
22
+ id: validated.id,
23
+ repo: existing.scope.repo,
24
+ }, `Deleted memory ${validated.id.slice(0, 8)}...`, {
25
+ resourceLinks: [
26
+ {
27
+ uri: `memory://index?repo=${encodeURIComponent(existing.scope.repo)}`,
28
+ name: `Memory Index (${existing.scope.repo})`,
29
+ description: "Repository memory index after deletion",
30
+ mimeType: "application/json",
31
+ annotations: {
32
+ audience: ["assistant"],
33
+ priority: 0.5,
34
+ },
35
+ },
36
+ ],
37
+ });
38
+ }
39
+ //# sourceMappingURL=memory.delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.delete.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,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,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3G,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;KAC1B,EACD,kBAAkB,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAC/C;QACE,aAAa,EAAE;YACb;gBACE,GAAG,EAAE,uBAAuB,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACrE,IAAI,EAAE,iBAAiB,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG;gBAC7C,WAAW,EAAE,wCAAwC;gBACrD,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;iBACd;aACF;SACF;KACF,CACF,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/mcp/tools/memory.recap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CA2GtB"}
@@ -0,0 +1,90 @@
1
+ import { MemoryRecapSchema } from "./schemas.js";
2
+ import { createMcpResponse } from "../utils/mcp-response.js";
3
+ import { logger } from "../utils/logger.js";
4
+ export async function handleMemoryRecap(params, db) {
5
+ // Validate input
6
+ const validated = MemoryRecapSchema.parse(params);
7
+ logger.info("[MCP] memory.recap", { repo: validated.repo, limit: validated.limit, offset: validated.offset });
8
+ // Get total count for pagination metadata
9
+ const total = db.getTotalCount(validated.repo);
10
+ // Get recent memories using public API (no type-unsafe cast)
11
+ const rows = db.getRecentMemories(validated.repo, validated.limit, validated.offset);
12
+ // Get active tasks for recap (In Progress, Pending, Blocked, Canceled)
13
+ const activeStatuses = ["in_progress", "pending", "blocked", "canceled"];
14
+ const tasks = db.getTasksByMultipleStatuses(validated.repo, activeStatuses, 50);
15
+ // Sort tasks: in_progress first, then by priority
16
+ const sortedTasks = [...tasks].sort((a, b) => {
17
+ if (a.status === "in_progress" && b.status !== "in_progress")
18
+ return -1;
19
+ if (a.status !== "in_progress" && b.status === "in_progress")
20
+ return 1;
21
+ return (b.priority || 0) - (a.priority || 0);
22
+ });
23
+ const formattedTasks = sortedTasks.map(t => ({
24
+ id: t.id,
25
+ task_code: t.task_code,
26
+ title: t.title,
27
+ status: t.status,
28
+ priority: t.priority
29
+ }));
30
+ if (rows.length === 0 && tasks.length === 0) {
31
+ return createMcpResponse({
32
+ repo: validated.repo,
33
+ count: 0,
34
+ total,
35
+ offset: validated.offset,
36
+ memories: [],
37
+ tasks: [],
38
+ message: `No memories or tasks found for repo: ${validated.repo}`
39
+ }, `No memories or tasks for repo "${validated.repo}"`);
40
+ }
41
+ // Format memories for recap
42
+ const formattedMemories = rows.map((row, index) => ({
43
+ number: validated.offset + index + 1,
44
+ id: row.id,
45
+ type: row.type,
46
+ importance: row.importance,
47
+ preview: row.content.substring(0, 100) + (row.content.length > 100 ? "..." : ""),
48
+ created_at: row.created_at
49
+ }));
50
+ // Create summary text
51
+ const memorySummary = formattedMemories
52
+ .map((m) => `${m.number}. [${m.type.toUpperCase()}] (importance: ${m.importance}) ${m.preview}`)
53
+ .join("\n");
54
+ const taskSummary = formattedTasks
55
+ .map((t) => `- [${t.status.toUpperCase()}] [${t.task_code}] ${t.title} (P${t.priority})`)
56
+ .join("\n");
57
+ return createMcpResponse({
58
+ repo: validated.repo,
59
+ count: rows.length,
60
+ total,
61
+ offset: validated.offset,
62
+ memories: formattedMemories,
63
+ tasks: formattedTasks,
64
+ summary: `Recent ${rows.length} memories:\n\n${memorySummary}\n\nActive Tasks:\n\n${taskSummary || "No active tasks"}`
65
+ }, `Retrieved ${rows.length} memories and ${tasks.length} active tasks for repo "${validated.repo}"`, {
66
+ resourceLinks: [
67
+ {
68
+ uri: `memory://summary/${validated.repo}`,
69
+ name: `Memory Summary (${validated.repo})`,
70
+ description: "Repository summary resource",
71
+ mimeType: "text/plain",
72
+ annotations: {
73
+ audience: ["assistant"],
74
+ priority: 0.8,
75
+ },
76
+ },
77
+ {
78
+ uri: `tasks://current?repo=${encodeURIComponent(validated.repo)}`,
79
+ name: `Current Tasks (${validated.repo})`,
80
+ description: "Current task snapshot for the repository",
81
+ mimeType: "application/json",
82
+ annotations: {
83
+ audience: ["assistant"],
84
+ priority: 0.7,
85
+ },
86
+ },
87
+ ],
88
+ });
89
+ }
90
+ //# sourceMappingURL=memory.recap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.recap.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.recap.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 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/mcp/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;AAc1E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAgJtB"}
@@ -0,0 +1,134 @@
1
+ import { MemorySearchSchema } from "./schemas.js";
2
+ import { handleMemoryRecap } from "./memory.recap.js";
3
+ import { logger } from "../utils/logger.js";
4
+ import { createMcpResponse } from "../utils/mcp-response.js";
5
+ import { expandQuery } from "../utils/query-expander.js";
6
+ const HYBRID_WEIGHTS_VECTOR = {
7
+ similarity: 0.4,
8
+ vector: 0.4,
9
+ importance: 0.2,
10
+ };
11
+ const HYBRID_WEIGHTS_NO_VECTOR = {
12
+ similarity: 0.8,
13
+ importance: 0.2,
14
+ };
15
+ export async function handleMemorySearch(params, db, vectors) {
16
+ const validated = MemorySearchSchema.parse(params);
17
+ let recapContext;
18
+ if (validated.includeRecap) {
19
+ try {
20
+ const recapRes = await handleMemoryRecap({ repo: validated.repo, limit: 10 }, db);
21
+ recapContext = recapRes.content[0].type === "text" ? recapRes.content[0].text : undefined;
22
+ }
23
+ catch (error) {
24
+ logger.error("Failed to get recap context", { error: String(error) });
25
+ }
26
+ }
27
+ const searchQuery = expandQuery(validated.query, validated.prompt);
28
+ // 1. Get Candidates from SQLite
29
+ const similarityResults = db.searchBySimilarity(searchQuery, validated.repo, validated.limit * 3, validated.include_archived, validated.current_tags ?? []);
30
+ let candidates = similarityResults.map(r => ({
31
+ memory: r,
32
+ similarityScore: r.similarity
33
+ }));
34
+ // 2. Workspace & Tag Affinity Boost
35
+ if (candidates.length > 0) {
36
+ const currentPath = validated.current_file_path?.toLowerCase();
37
+ const currentTags = (validated.current_tags || []).map(t => t.toLowerCase());
38
+ // Attempt to resolve current branch if not provided (optional)
39
+ const currentBranch = validated.scope?.branch;
40
+ candidates = candidates.map(c => {
41
+ let boost = 0;
42
+ // Branch boost (+0.1) - High relevance if on same branch
43
+ if (currentBranch && c.memory.scope.branch === currentBranch) {
44
+ boost += 0.1;
45
+ }
46
+ // Folder boost (+0.15)
47
+ if (currentPath && c.memory.scope.folder && currentPath.includes(c.memory.scope.folder.toLowerCase())) {
48
+ boost += 0.15;
49
+ }
50
+ // Language boost (+0.1)
51
+ if (currentPath && c.memory.scope.language) {
52
+ const ext = currentPath.split('.').pop();
53
+ if (ext && ext.includes(c.memory.scope.language.toLowerCase()))
54
+ boost += 0.1;
55
+ }
56
+ // TAG AFFINITY BOOST (+0.2)
57
+ // If the memory has tags that match the current workspace tech-stack
58
+ if (currentTags.length > 0 && c.memory.tags.some(t => currentTags.includes(t.toLowerCase()))) {
59
+ boost += 0.2;
60
+ }
61
+ return { ...c, similarityScore: Math.min(1.0, c.similarityScore + boost) };
62
+ });
63
+ }
64
+ // 3. Vector Re-ranking
65
+ let scoredMemories = [];
66
+ try {
67
+ const vectorResults = await vectors.search(searchQuery, candidates.length || 10, validated.repo);
68
+ const vectorScoreMap = new Map(vectorResults.map(vr => [vr.id, vr.score]));
69
+ if (candidates.length > 0) {
70
+ scoredMemories = candidates.map(c => {
71
+ const vScore = vectorScoreMap.get(c.memory.id) ?? 0;
72
+ const impBoost = c.memory.importance / 5;
73
+ const finalScore = (c.similarityScore * HYBRID_WEIGHTS_VECTOR.similarity) +
74
+ (vScore * HYBRID_WEIGHTS_VECTOR.vector) +
75
+ (impBoost * HYBRID_WEIGHTS_VECTOR.importance);
76
+ return { ...c, vectorScore: vScore, finalScore };
77
+ });
78
+ }
79
+ else if (vectorResults.length > 0) {
80
+ // If SQLite found nothing but vectors did (rare due to our fallback)
81
+ for (const vr of vectorResults) {
82
+ const mem = db.getById(vr.id);
83
+ if (mem) {
84
+ const impBoost = mem.importance / 5;
85
+ scoredMemories.push({
86
+ memory: mem,
87
+ similarityScore: 0,
88
+ vectorScore: vr.score,
89
+ finalScore: (vr.score * 0.8) + (impBoost * 0.2)
90
+ });
91
+ }
92
+ }
93
+ }
94
+ }
95
+ catch (error) {
96
+ logger.warn("Vector search failed, using similarity only", { error: String(error) });
97
+ scoredMemories = candidates.map(c => ({
98
+ ...c,
99
+ vectorScore: 0,
100
+ finalScore: (c.similarityScore * 0.8) + ((c.memory.importance / 5) * 0.2)
101
+ }));
102
+ }
103
+ // 4. Threshold & Final Selection
104
+ scoredMemories.sort((a, b) => b.finalScore - a.finalScore);
105
+ const threshold = scoredMemories.length <= 5 ? 0.10 : 0.40;
106
+ let results = scoredMemories.filter(sm => sm.finalScore >= threshold).map(sm => sm.memory);
107
+ // Absolute fallback: if repo has data but search failed threshold, return top 1
108
+ if (results.length === 0 && scoredMemories.length > 0) {
109
+ results = [scoredMemories[0].memory];
110
+ }
111
+ results = results.slice(0, validated.limit);
112
+ // 5. Post-processing
113
+ for (const m of results)
114
+ db.incrementHitCount(m.id);
115
+ logger.info("[MCP] memory.search", { repo: validated.repo, query: validated.query, results: results.length });
116
+ const topMatch = results[0] ? `\n\nTop Match: [${results[0].type}] ${results[0].title || results[0].content.substring(0, 50)}` : "";
117
+ return createMcpResponse({ query: validated.query, results, recapContext }, `Found ${results.length} memories matching "${validated.query}"${topMatch}`, {
118
+ query: validated.query,
119
+ results: results,
120
+ resourceLinks: [
121
+ {
122
+ uri: `memory://index?repo=${encodeURIComponent(validated.repo)}`,
123
+ name: `Memory Index (${validated.repo})`,
124
+ description: "Repository memory index",
125
+ mimeType: "application/json",
126
+ annotations: {
127
+ audience: ["assistant"],
128
+ priority: 0.7,
129
+ },
130
+ },
131
+ ],
132
+ });
133
+ }
134
+ //# sourceMappingURL=memory.search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.search.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.search.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/mcp/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;AAO1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CA6HtB"}
@@ -0,0 +1,117 @@
1
+ import { randomUUID } from "crypto";
2
+ import { MemoryStoreSchema } from "./schemas.js";
3
+ import { logger } from "../utils/logger.js";
4
+ import { createMcpResponse } from "../utils/mcp-response.js";
5
+ function hasMetadataLikeTitle(title) {
6
+ const normalized = title.trim();
7
+ return /^\[[^\]]{0,200}(agent:|role:|model:|\d{4}-\d{2}-\d{2}|source_)[^\]]*\]/i.test(normalized);
8
+ }
9
+ export async function handleMemoryStore(params, db, vectors) {
10
+ // Validate input
11
+ const validated = MemoryStoreSchema.parse(params);
12
+ if (hasMetadataLikeTitle(validated.title)) {
13
+ throw new Error("Title appears to contain metadata. Keep title concise and move agent/role/date details into metadata or dedicated fields.");
14
+ }
15
+ // Create memory entry
16
+ const now = new Date().toISOString();
17
+ // Compute expires_at if ttlDays is provided
18
+ const expires_at = validated.ttlDays != null
19
+ ? new Date(Date.now() + validated.ttlDays * 86400000).toISOString()
20
+ : null;
21
+ // Check for semantic conflicts before storing (threshold: 0.55)
22
+ if (!validated.supersedes) {
23
+ const conflict = await db.checkConflicts(validated.content, validated.scope.repo, validated.type, vectors, 0.55);
24
+ if (conflict) {
25
+ return createMcpResponse({
26
+ success: false,
27
+ error: "MEMORY_CONFLICT",
28
+ message: `This memory content overlaps significantly with an existing memory (ID: ${conflict.id}).`,
29
+ conflicting_memory: {
30
+ id: conflict.id,
31
+ title: conflict.title,
32
+ content: conflict.content
33
+ },
34
+ instruction: "Use 'memory-update' on the existing ID, or provide 'supersedes' if this new memory replaces it. If the old memory is no longer relevant, you can delete it first."
35
+ }, `Rejected due to conflict with ${conflict.id}. Hint: Use 'supersedes' if this replaces the old memory, or 'memory-update' if you're updating it. If the old memory is no longer relevant, delete it first using 'memory-delete'.`);
36
+ }
37
+ }
38
+ // If this memory supersedes an old one, archive the old one
39
+ if (validated.supersedes) {
40
+ const oldMemory = db.getById(validated.supersedes);
41
+ if (oldMemory) {
42
+ db.update(oldMemory.id, { status: "archived" });
43
+ logger.info("[MCP] memory.store - archived superseded memory", { oldId: oldMemory.id, newId: validated.supersedes });
44
+ }
45
+ }
46
+ // Auto-tagging based on language scope
47
+ const tags = validated.tags ?? [];
48
+ if (validated.scope.language && !tags.includes(validated.scope.language.toLowerCase())) {
49
+ tags.push(validated.scope.language.toLowerCase());
50
+ }
51
+ const entry = {
52
+ id: randomUUID(),
53
+ type: validated.type,
54
+ title: validated.title,
55
+ content: validated.content,
56
+ importance: validated.importance,
57
+ agent: validated.agent,
58
+ role: validated.role,
59
+ model: validated.model,
60
+ scope: validated.scope,
61
+ created_at: now,
62
+ updated_at: now,
63
+ completed_at: null,
64
+ hit_count: 0,
65
+ recall_count: 0,
66
+ last_used_at: null,
67
+ expires_at,
68
+ supersedes: validated.supersedes ?? null,
69
+ status: "active",
70
+ tags,
71
+ metadata: validated.metadata ?? {},
72
+ is_global: validated.is_global
73
+ };
74
+ // Store in SQLite
75
+ db.insert(entry);
76
+ // Automatically generate and store vector embedding
77
+ try {
78
+ await vectors.upsert(entry.id, entry.content);
79
+ }
80
+ catch (error) {
81
+ logger.warn("Failed to generate vector embedding", { error: String(error) });
82
+ // Continue anyway - vectors are optional for search fallback
83
+ }
84
+ logger.info("[MCP] memory.store", { repo: validated.scope.repo, id: entry.id, title: entry.title, type: entry.type, importance: entry.importance });
85
+ return createMcpResponse({
86
+ success: true,
87
+ id: entry.id,
88
+ repo: entry.scope.repo,
89
+ type: entry.type,
90
+ title: entry.title,
91
+ }, `Stored memory ${entry.id.slice(0, 8)}...`, {
92
+ resourceLinks: [
93
+ {
94
+ uri: `memory://${entry.id}`,
95
+ name: entry.title,
96
+ description: `Stored memory in repo ${entry.scope.repo}`,
97
+ mimeType: "application/json",
98
+ annotations: {
99
+ audience: ["assistant"],
100
+ priority: 0.9,
101
+ lastModified: entry.updated_at,
102
+ },
103
+ },
104
+ {
105
+ uri: `memory://index?repo=${encodeURIComponent(entry.scope.repo)}`,
106
+ name: `Memory Index (${entry.scope.repo})`,
107
+ description: "Repository memory index",
108
+ mimeType: "application/json",
109
+ annotations: {
110
+ audience: ["assistant"],
111
+ priority: 0.6,
112
+ },
113
+ },
114
+ ],
115
+ });
116
+ }
117
+ //# sourceMappingURL=memory.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.store.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,yEAAyE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAW,EACX,EAAe,EACf,OAAoB;IAEpB,iBAAiB;IACjB,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAElD,IAAI,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,2HAA2H,CAAC,CAAC;IAC/I,CAAC;IAED,sBAAsB;IACtB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,4CAA4C;IAC5C,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI;QAC1C,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE;QACnE,CAAC,CAAC,IAAI,CAAC;IAET,gEAAgE;IAChE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAEjH,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,iBAAiB,CACtB;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,2EAA2E,QAAQ,CAAC,EAAE,IAAI;gBACnG,kBAAkB,EAAE;oBAClB,EAAE,EAAE,QAAQ,CAAC,EAAE;oBACf,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBAC1B;gBACD,WAAW,EAAE,mKAAmK;aACjL,EACD,iCAAiC,QAAQ,CAAC,EAAE,qLAAqL,CAClO,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,SAAS,EAAE,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QACvH,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACvF,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,GAAG;QACf,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,IAAI;QAClB,UAAU;QACV,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,IAAI;QACxC,MAAM,EAAE,QAAQ;QAChB,IAAI;QACJ,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,EAAE;QAClC,SAAS,EAAE,SAAS,CAAC,SAAS;KAC/B,CAAC;IAEF,kBAAkB;IAClB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjB,oDAAoD;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7E,6DAA6D;IAC/D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAEpJ,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,EACD,iBAAiB,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAC1C;QACE,aAAa,EAAE;YACb;gBACE,GAAG,EAAE,YAAY,KAAK,CAAC,EAAE,EAAE;gBAC3B,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,WAAW,EAAE,yBAAyB,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE;gBACxD,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;oBACb,YAAY,EAAE,KAAK,CAAC,UAAU;iBAC/B;aACF;YACD;gBACE,GAAG,EAAE,uBAAuB,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBAClE,IAAI,EAAE,iBAAiB,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG;gBAC1C,WAAW,EAAE,yBAAyB;gBACtC,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;iBACd;aACF;SACF;KACF,CACF,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 handleMemorySummarize(params: any, db: SQLiteStore): Promise<McpResponse>;
4
+ //# sourceMappingURL=memory.summarize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.summarize.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.summarize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CAkCtB"}
@@ -0,0 +1,31 @@
1
+ import { MemorySummarizeSchema } from "./schemas.js";
2
+ import { createMcpResponse } from "../utils/mcp-response.js";
3
+ export async function handleMemorySummarize(params, db) {
4
+ // Validate input
5
+ const validated = MemorySummarizeSchema.parse(params);
6
+ // Create summary from signals
7
+ const summary = validated.signals.join("\n- ");
8
+ const fullSummary = `Project summary:\n- ${summary}`;
9
+ // Store summary
10
+ db.upsertSummary(validated.repo, fullSummary);
11
+ return createMcpResponse({
12
+ success: true,
13
+ repo: validated.repo,
14
+ summary: fullSummary,
15
+ signalCount: validated.signals.length,
16
+ }, `Updated summary for repo "${validated.repo}"`, {
17
+ resourceLinks: [
18
+ {
19
+ uri: `memory://summary/${validated.repo}`,
20
+ name: `Memory Summary (${validated.repo})`,
21
+ description: "Repository summary resource",
22
+ mimeType: "text/plain",
23
+ annotations: {
24
+ audience: ["assistant"],
25
+ priority: 0.9,
26
+ },
27
+ },
28
+ ],
29
+ });
30
+ }
31
+ //# sourceMappingURL=memory.summarize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.summarize.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.summarize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAW,EACX,EAAe;IAEf,iBAAiB;IACjB,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEtD,8BAA8B;IAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,uBAAuB,OAAO,EAAE,CAAC;IAErD,gBAAgB;IAChB,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE9C,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM;KACtC,EACD,6BAA6B,SAAS,CAAC,IAAI,GAAG,EAC9C;QACE,aAAa,EAAE;YACb;gBACE,GAAG,EAAE,oBAAoB,SAAS,CAAC,IAAI,EAAE;gBACzC,IAAI,EAAE,mBAAmB,SAAS,CAAC,IAAI,GAAG;gBAC1C,WAAW,EAAE,6BAA6B;gBAC1C,QAAQ,EAAE,YAAY;gBACtB,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;iBACd;aACF;SACF;KACF,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { SQLiteStore } from "../storage/sqlite.js";
2
+ import { VectorStore } from "../types.js";
3
+ import { SamplingRequestHandler } from "../sampling.js";
4
+ import { SessionContext } from "../session.js";
5
+ import { ElicitationRequestHandler } from "../elicitation.js";
6
+ import { McpResponse } from "../utils/mcp-response.js";
7
+ type SynthesizeOptions = {
8
+ session?: SessionContext;
9
+ sampleMessage?: SamplingRequestHandler;
10
+ elicit?: ElicitationRequestHandler;
11
+ };
12
+ export declare function handleMemorySynthesize(params: any, db: SQLiteStore, vectors: VectorStore, options?: SynthesizeOptions): Promise<McpResponse>;
13
+ export {};
14
+ //# sourceMappingURL=memory.synthesize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.synthesize.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.synthesize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAEL,sBAAsB,EAGvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EAEf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EAE1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAQ1E,KAAK,iBAAiB,GAAG;IACvB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,CA0HtB"}