squish-memory 1.0.2 → 1.1.5

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 (341) hide show
  1. package/.env.example +130 -0
  2. package/CHANGELOG.md +55 -0
  3. package/README.md +150 -287
  4. package/config/hooks/claude-code-hooks.json +39 -0
  5. package/config/hooks/cursor-hooks.json +30 -0
  6. package/config/hooks/opencode-hooks.json +30 -0
  7. package/config/hooks/windsurf-hooks.json +30 -0
  8. package/config/mcp-mode-semantics.json +23 -21
  9. package/config/plugin-manifest.json +101 -152
  10. package/{plugin.json → config/plugin.json} +2 -2
  11. package/config/settings.json +52 -51
  12. package/{commands → core/commands}/init.md +39 -39
  13. package/dist/config.d.ts +28 -4
  14. package/dist/config.js +97 -29
  15. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  16. package/dist/core/adapters/config/claude-code.js +113 -0
  17. package/dist/core/adapters/config/cursor.d.ts +26 -0
  18. package/dist/core/adapters/config/cursor.js +74 -0
  19. package/dist/core/adapters/config/opencode.d.ts +23 -0
  20. package/dist/core/adapters/config/opencode.js +73 -0
  21. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  22. package/dist/core/adapters/config/windsurf.js +74 -0
  23. package/dist/core/adapters/index.d.ts +45 -0
  24. package/dist/core/adapters/index.js +84 -0
  25. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  26. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  27. package/dist/core/adapters/timeline.d.ts +23 -0
  28. package/dist/core/adapters/timeline.js +88 -0
  29. package/dist/core/adapters/types.d.ts +157 -0
  30. package/dist/core/adapters/types.js +50 -0
  31. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  32. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  33. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  34. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  35. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  36. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  37. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  38. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  39. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  40. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  41. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  42. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  43. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  44. package/dist/core/algorithms/index.d.ts +21 -0
  45. package/dist/core/algorithms/index.js +26 -0
  46. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  47. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  48. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +1 -1
  49. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  50. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  51. package/dist/core/algorithms/types.d.ts +133 -0
  52. package/dist/core/algorithms/types.js +5 -0
  53. package/dist/core/associations.d.ts +1 -2
  54. package/dist/core/associations.js +1 -2
  55. package/dist/core/autosave.d.ts +19 -0
  56. package/dist/core/autosave.js +16 -0
  57. package/dist/{commands → core/commands}/managed-sync.js +5 -5
  58. package/dist/core/commands/mcp-server.js +739 -0
  59. package/dist/core/context/agent-context.d.ts +106 -0
  60. package/dist/core/context/agent-context.js +274 -0
  61. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  62. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  63. package/dist/core/context/context-window.d.ts +40 -0
  64. package/dist/core/context/context-window.js +177 -0
  65. package/dist/core/context/context.js +22 -0
  66. package/dist/core/embeddings.d.ts +1 -1
  67. package/dist/core/embeddings.js +54 -2
  68. package/dist/core/error-handling.d.ts +63 -0
  69. package/dist/core/error-handling.js +173 -0
  70. package/dist/core/external-folder/index.d.ts +102 -0
  71. package/dist/core/external-folder/index.js +294 -0
  72. package/dist/core/hooks/agent-hooks.d.ts +74 -0
  73. package/dist/core/hooks/agent-hooks.js +244 -0
  74. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  75. package/dist/core/hooks/auto-tagger.js +155 -0
  76. package/dist/core/hooks/capture-filter.d.ts +41 -0
  77. package/dist/core/hooks/capture-filter.js +128 -0
  78. package/dist/core/index.d.ts +6 -6
  79. package/dist/core/index.js +6 -6
  80. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  81. package/dist/core/{core-memory.js → ingestion/core-memory.js} +4 -4
  82. package/dist/core/ingestion/learnings.d.ts +57 -0
  83. package/dist/core/ingestion/learnings.js +202 -0
  84. package/dist/core/lib/db-client.d.ts +114 -0
  85. package/dist/core/lib/db-client.js +130 -0
  86. package/dist/core/lib/schemas.d.ts +129 -0
  87. package/dist/core/lib/schemas.js +87 -0
  88. package/dist/core/{utils.d.ts → lib/utils.d.ts} +1 -0
  89. package/dist/core/{utils.js → lib/utils.js} +31 -15
  90. package/dist/core/lib/validation.d.ts +38 -0
  91. package/dist/core/lib/validation.js +151 -0
  92. package/dist/core/lifecycle.d.ts +7 -0
  93. package/dist/core/lifecycle.js +140 -20
  94. package/dist/core/local-embeddings.d.ts +6 -1
  95. package/dist/core/local-embeddings.js +6 -15
  96. package/dist/core/logger.js +7 -1
  97. package/dist/core/mcp/tools.js +35 -3
  98. package/dist/core/memory/categorizer.js +1 -0
  99. package/dist/core/memory/conflict-detector.js +1 -1
  100. package/dist/core/memory/consolidation.d.ts +1 -10
  101. package/dist/core/memory/consolidation.js +2 -11
  102. package/dist/core/memory/context-collector.js +1 -1
  103. package/dist/core/memory/edit-workflow.js +1 -1
  104. package/dist/core/memory/entity-resolver.js +7 -7
  105. package/dist/core/memory/fact-extractor.js +12 -12
  106. package/dist/core/memory/feedback-tracker.js +1 -1
  107. package/dist/core/memory/hooks.d.ts +88 -0
  108. package/dist/core/memory/hooks.js +174 -0
  109. package/dist/core/memory/hybrid-retrieval.js +2 -2
  110. package/dist/core/memory/hybrid-search.d.ts +1 -6
  111. package/dist/core/memory/hybrid-search.js +70 -84
  112. package/dist/core/memory/importance.d.ts +8 -13
  113. package/dist/core/memory/importance.js +47 -74
  114. package/dist/core/memory/loader.d.ts +31 -0
  115. package/dist/core/memory/loader.js +141 -0
  116. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  117. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  118. package/dist/core/memory/memories.d.ts +12 -4
  119. package/dist/core/memory/memories.js +192 -180
  120. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  121. package/dist/core/memory/memory-lifecycle.js +55 -0
  122. package/dist/core/memory/migrate.d.ts +21 -0
  123. package/dist/core/memory/migrate.js +134 -0
  124. package/dist/core/memory/normalization.d.ts +22 -0
  125. package/dist/core/memory/normalization.js +26 -0
  126. package/dist/core/memory/progressive-disclosure.js +1 -1
  127. package/dist/core/memory/query-rewriter.js +9 -9
  128. package/dist/core/memory/serialization.d.ts +4 -0
  129. package/dist/core/memory/serialization.js +49 -0
  130. package/dist/core/memory/stats.d.ts +5 -0
  131. package/dist/core/memory/stats.js +63 -12
  132. package/dist/core/memory/temporal-facts.js +21 -0
  133. package/dist/core/memory/write-gate.js +1 -1
  134. package/dist/core/obsidian-vault.d.ts +30 -0
  135. package/dist/core/obsidian-vault.js +94 -0
  136. package/dist/core/places/index.d.ts +14 -0
  137. package/dist/core/places/index.js +14 -0
  138. package/dist/core/places/memory-places.d.ts +68 -0
  139. package/dist/core/places/memory-places.js +261 -0
  140. package/dist/core/places/places.d.ts +88 -0
  141. package/dist/core/places/places.js +314 -0
  142. package/dist/core/places/rules.d.ts +74 -0
  143. package/dist/core/places/rules.js +240 -0
  144. package/dist/core/places/walking.d.ts +56 -0
  145. package/dist/core/places/walking.js +121 -0
  146. package/dist/core/projects.d.ts +5 -0
  147. package/dist/core/projects.js +39 -18
  148. package/dist/core/responses.d.ts +96 -0
  149. package/dist/core/responses.js +122 -0
  150. package/dist/core/scheduler/cron-scheduler.js +29 -7
  151. package/dist/core/scheduler/index.d.ts +1 -1
  152. package/dist/core/scheduler/index.js +1 -1
  153. package/dist/core/scheduler/job-runner.js +1 -1
  154. package/dist/core/search/conversations.js +40 -42
  155. package/dist/core/search/entities.js +6 -9
  156. package/dist/core/search/graph-boost.d.ts +7 -0
  157. package/dist/core/search/graph-boost.js +23 -0
  158. package/dist/core/search/qmd-search.js +4 -4
  159. package/dist/core/security/encrypt.d.ts +6 -0
  160. package/dist/core/security/encrypt.js +47 -0
  161. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  162. package/dist/core/security/governance.js +79 -0
  163. package/dist/core/session/auto-load.js +6 -6
  164. package/dist/core/session/index.d.ts +1 -1
  165. package/dist/core/session/index.js +1 -1
  166. package/dist/core/session/self-iteration-job.d.ts +20 -0
  167. package/dist/core/session/self-iteration-job.js +282 -0
  168. package/dist/core/session/session-hooks.d.ts +18 -0
  169. package/dist/core/session/session-hooks.js +58 -0
  170. package/dist/core/session-hooks/self-iteration-job.js +35 -35
  171. package/dist/core/{cache.js → storage/cache.js} +2 -2
  172. package/dist/core/sync/qmd-sync.d.ts +1 -13
  173. package/dist/core/sync/qmd-sync.js +1 -13
  174. package/dist/core/toon.d.ts +43 -0
  175. package/dist/core/toon.js +160 -0
  176. package/dist/core/utils/memory-operations.js +1 -1
  177. package/dist/core/utils/vector-operations.d.ts +71 -0
  178. package/dist/core/utils/vector-operations.js +129 -0
  179. package/dist/db/adapter.d.ts +3 -3
  180. package/dist/db/adapter.js +99 -88
  181. package/dist/db/bootstrap.js +820 -522
  182. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +74 -25
  183. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +91 -24
  184. package/dist/{drizzle → db/drizzle}/schema.d.ts +79 -32
  185. package/dist/{drizzle → db/drizzle}/schema.js +106 -35
  186. package/dist/db/drizzle.config.d.ts +3 -0
  187. package/dist/db/drizzle.config.js +12 -0
  188. package/dist/db/index.d.ts +1 -5
  189. package/dist/db/index.js +51 -8
  190. package/dist/db/neon.d.ts +8 -0
  191. package/dist/db/neon.js +20 -0
  192. package/dist/db/schema/index.d.ts +40 -0
  193. package/dist/db/schema/index.js +105 -0
  194. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  195. package/dist/db/schema/tables/context-sessions.js +37 -0
  196. package/dist/db/schema/tables/conversations.d.ts +9 -0
  197. package/dist/db/schema/tables/conversations.js +47 -0
  198. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  199. package/dist/db/schema/tables/core-memory.js +41 -0
  200. package/dist/db/schema/tables/entities.d.ts +9 -0
  201. package/dist/db/schema/tables/entities.js +39 -0
  202. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  203. package/dist/db/schema/tables/entity-relations.js +31 -0
  204. package/dist/db/schema/tables/learnings.d.ts +9 -0
  205. package/dist/db/schema/tables/learnings.js +66 -0
  206. package/dist/db/schema/tables/memories.d.ts +9 -0
  207. package/dist/db/schema/tables/memories.js +161 -0
  208. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  209. package/dist/db/schema/tables/memory-associations.js +39 -0
  210. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  211. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  212. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  213. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  214. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  215. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  216. package/dist/db/schema/tables/messages.d.ts +9 -0
  217. package/dist/db/schema/tables/messages.js +41 -0
  218. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  219. package/dist/db/schema/tables/namespaces.js +37 -0
  220. package/dist/db/schema/tables/projects.d.ts +9 -0
  221. package/dist/db/schema/tables/projects.js +31 -0
  222. package/dist/db/schema/tables/users.d.ts +9 -0
  223. package/dist/db/schema/tables/users.js +27 -0
  224. package/dist/db/schema.d.ts +1 -1
  225. package/dist/db/schema.js +2 -2
  226. package/dist/db/supabase.d.ts +9 -0
  227. package/dist/db/supabase.js +24 -0
  228. package/dist/index.d.ts +2 -14
  229. package/dist/index.js +1320 -640
  230. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  231. package/dist/webui/server.d.ts +5 -0
  232. package/dist/{api/web/web.js → webui/server.js} +511 -508
  233. package/generated/mcp/manifest.json +1 -1
  234. package/{.mcp.json → mcp.json.example} +1 -1
  235. package/package.json +159 -181
  236. package/scripts/README.md +60 -0
  237. package/scripts/copy-runtime-assets.mjs +26 -0
  238. package/scripts/generate-mcp.mjs +264 -264
  239. package/scripts/github-release.sh +4 -4
  240. package/scripts/install-claude-code.sh +85 -0
  241. package/scripts/install-cursor.sh +56 -0
  242. package/scripts/install-hooks.sh +73 -0
  243. package/scripts/install-interactive.mjs +357 -677
  244. package/scripts/install-opencode.sh +75 -0
  245. package/scripts/install-windsurf.sh +67 -0
  246. package/skills/squish-memory/SKILL.md +104 -114
  247. package/skills/squish-memory/{install.mjs → scripts/install.mjs} +2 -2
  248. package/skills/squish-memory/{install.sh → scripts/install.sh} +2 -2
  249. package/skills/squish-memory/write_skill.js +2 -0
  250. package/.claude-plugin/marketplace.json +0 -20
  251. package/.claude-plugin/plugin.json +0 -32
  252. package/.env.mcp.example +0 -60
  253. package/QUICK-START.md +0 -71
  254. package/bin/squish-add.mjs +0 -32
  255. package/bin/squish-rm.mjs +0 -21
  256. package/commands/observe.md +0 -5
  257. package/dist/api/web/index.d.ts +0 -3
  258. package/dist/api/web/index.js +0 -4
  259. package/dist/api/web/web-server.d.ts +0 -3
  260. package/dist/api/web/web-server.js +0 -6
  261. package/dist/api/web/web.d.ts +0 -4
  262. package/dist/commands/mcp-server.js +0 -393
  263. package/dist/core/context.js +0 -24
  264. package/dist/core/governance.js +0 -64
  265. package/dist/core/observations.d.ts +0 -26
  266. package/dist/core/observations.js +0 -110
  267. package/dist/core/requirements.d.ts +0 -20
  268. package/dist/core/requirements.js +0 -35
  269. package/hooks/hooks.json +0 -52
  270. package/hooks/post-tool-use.js +0 -26
  271. package/hooks/session-end.js +0 -28
  272. package/hooks/session-start.js +0 -33
  273. package/hooks/user-prompt-submit.js +0 -26
  274. package/hooks/utils.js +0 -153
  275. package/npx-installer.js +0 -208
  276. package/packages/plugin-claude-code/README.md +0 -73
  277. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  278. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  279. package/packages/plugin-claude-code/package.json +0 -31
  280. package/packages/plugin-openclaw/README.md +0 -70
  281. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  282. package/packages/plugin-openclaw/dist/index.js +0 -262
  283. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  284. package/packages/plugin-openclaw/package.json +0 -31
  285. package/packages/plugin-opencode/install.mjs +0 -217
  286. package/packages/plugin-opencode/package.json +0 -21
  287. package/scripts/db/check-db.mjs +0 -88
  288. package/scripts/db/fix-all-columns.mjs +0 -52
  289. package/scripts/db/fix-schema-all.mjs +0 -55
  290. package/scripts/db/fix-schema-full.mjs +0 -46
  291. package/scripts/db/fix-schema.mjs +0 -38
  292. package/scripts/db/init-db.mjs +0 -13
  293. package/scripts/db/recreate-db.mjs +0 -14
  294. package/scripts/install-mcp.mjs +0 -116
  295. package/scripts/install-web.sh +0 -120
  296. package/scripts/install.mjs +0 -340
  297. package/scripts/openclaw-bootstrap.mjs +0 -127
  298. package/scripts/package-release.sh +0 -71
  299. package/scripts/test/test-all-systems.mjs +0 -139
  300. package/scripts/test/test-memory-system.mjs +0 -139
  301. package/scripts/test/test-v0.5.0.mjs +0 -210
  302. package/skills/memory-guide/SKILL.md +0 -332
  303. package/skills/squish-cli/SKILL.md +0 -240
  304. package/skills/squish-mcp/SKILL.md +0 -355
  305. package/skills/squish-memory/claude-desktop.json +0 -12
  306. package/skills/squish-memory/openclaw.json +0 -13
  307. package/skills/squish-memory/opencode.json +0 -14
  308. package/skills/squish-memory/skill.json +0 -32
  309. /package/{commands → core/commands}/context-paging.md +0 -0
  310. /package/{commands → core/commands}/context-status.md +0 -0
  311. /package/{commands → core/commands}/context.md +0 -0
  312. /package/{commands → core/commands}/core-memory.md +0 -0
  313. /package/{commands → core/commands}/health.md +0 -0
  314. /package/{commands → core/commands}/merge.md +0 -0
  315. /package/{commands → core/commands}/recall.md +0 -0
  316. /package/{commands → core/commands}/remember.md +0 -0
  317. /package/{commands → core/commands}/search.md +0 -0
  318. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  319. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  320. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  321. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  322. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  323. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  324. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  325. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  326. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  327. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  328. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  329. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  330. /package/dist/{commands → core/commands}/managed-sync.d.ts +0 -0
  331. /package/dist/{commands → core/commands}/mcp-server.d.ts +0 -0
  332. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  333. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  334. /package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +0 -0
  335. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  336. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  337. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  338. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  339. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  340. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  341. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -4,18 +4,15 @@
4
4
  * Stage 1: Hash-based prefiltering (SimHash + MinHash)
5
5
  * Stage 2: Semantic ranking using embeddings
6
6
  */
7
- import { getEmbedding, getBatchEmbeddings } from '../../core/embeddings.js';
7
+ import { getEmbedding, getBatchEmbeddings } from '../../../core/embeddings.js';
8
8
  import { SimHashFilter, MinHashFilter, findCandidatePairs } from './hash-filters.js';
9
9
  import { rankCandidates, analyzePair } from './semantic-ranker.js';
10
- import { getDb } from '../../db/index.js';
11
- import { getSchema } from '../../db/schema.js';
12
- import { createDatabaseClient } from '../../core/database.js';
13
10
  import { eq, and } from 'drizzle-orm';
14
11
  import * as crypto from 'crypto';
12
+ import { getDbClient } from '../../../core/lib/db-client.js';
15
13
  export async function detectDuplicates(options) {
16
14
  const startTime = Date.now();
17
- const db = createDatabaseClient(await getDb());
18
- const schema = await getSchema();
15
+ const { db, schema } = await getDbClient();
19
16
  let query = db.select().from(schema.memories);
20
17
  if (options.projectId) {
21
18
  query = query.where(eq(schema.memories.projectId, options.projectId));
@@ -239,8 +236,7 @@ export async function detectDuplicates(options) {
239
236
  };
240
237
  }
241
238
  export async function analyzeMergePair(memoryId1, memoryId2) {
242
- const db = createDatabaseClient(await getDb());
243
- const schema = await getSchema();
239
+ const { db, schema } = await getDbClient();
244
240
  const [memory1] = await db
245
241
  .select()
246
242
  .from(schema.memories)
@@ -271,6 +267,8 @@ function countByType(memories) {
271
267
  decision: 0,
272
268
  context: 0,
273
269
  preference: 0,
270
+ reflection: 0,
271
+ note: 0,
274
272
  };
275
273
  for (const memory of memories) {
276
274
  const type = memory.type;
@@ -281,8 +279,7 @@ function countByType(memories) {
281
279
  return counts;
282
280
  }
283
281
  export async function getDetectionStats(projectId) {
284
- const db = createDatabaseClient(await getDb());
285
- const schema = await getSchema();
282
+ const { db, schema } = await getDbClient();
286
283
  const memories = await db
287
284
  .select()
288
285
  .from(schema.memories)
@@ -2,13 +2,13 @@
2
2
  * Executes the approved merge in a single atomic transaction.
3
3
  */
4
4
  import { randomUUID } from 'crypto';
5
- import { getDb } from '../../db/index.js';
6
- import { getSchema } from '../../db/schema.js';
7
- import { createDatabaseClient } from '../../core/database.js';
5
+ import { getDb } from '../../../db/index.js';
6
+ import { getSchema } from '../../../db/schema.js';
7
+ import { createDatabaseClient } from '../../../core/storage/database.js';
8
8
  import { eq, inArray } from 'drizzle-orm';
9
9
  import { mergeMemories } from '../strategies/merge-strategies.js';
10
10
  import { estimateTokensSaved } from '../analytics/token-estimator.js';
11
- import { getEmbedding } from '../../core/embeddings.js';
11
+ import { getEmbedding } from '../../../core/embeddings.js';
12
12
  export async function handleApproveMerge(input) {
13
13
  try {
14
14
  const { proposalId, reviewNotes } = input;
@@ -9,9 +9,9 @@ import { detectDuplicates } from '../detection/two-stage-detector.js';
9
9
  import { runSafetyChecks } from '../safety/safety-checks.js';
10
10
  import { mergeMemories } from '../strategies/merge-strategies.js';
11
11
  import { estimateTokensSaved } from '../analytics/token-estimator.js';
12
- import { getDb } from '../../db/index.js';
13
- import { getSchema } from '../../db/schema.js';
14
- import { createDatabaseClient } from '../../core/database.js';
12
+ import { getDb } from '../../../db/index.js';
13
+ import { getSchema } from '../../../db/schema.js';
14
+ import { createDatabaseClient } from '../../../core/storage/database.js';
15
15
  import { buildSuccessResponse, buildErrorResponse } from '../utils/response-builder.js';
16
16
  /**
17
17
  * Handle detect_duplicate_memories tool call
@@ -3,9 +3,9 @@
3
3
  *
4
4
  * Returns statistics about memory merges for a project
5
5
  */
6
- import { getDb } from '../../db/index.js';
7
- import { getSchema } from '../../db/schema.js';
8
- import { createDatabaseClient } from '../../core/database.js';
6
+ import { getDb } from '../../../db/index.js';
7
+ import { getSchema } from '../../../db/schema.js';
8
+ import { createDatabaseClient } from '../../../core/storage/database.js';
9
9
  import { eq } from 'drizzle-orm';
10
10
  import { calculateProjectTokenSavings, formatTokenCount } from '../analytics/token-estimator.js';
11
11
  /**
@@ -3,9 +3,9 @@
3
3
  *
4
4
  * Lists pending merge proposals for user review
5
5
  */
6
- import { getDb } from '../../db/index.js';
7
- import { getSchema } from '../../db/schema.js';
8
- import { createDatabaseClient } from '../../core/database.js';
6
+ import { getDb } from '../../../db/index.js';
7
+ import { getSchema } from '../../../db/schema.js';
8
+ import { createDatabaseClient } from '../../../core/storage/database.js';
9
9
  import { eq, desc } from 'drizzle-orm';
10
10
  /**
11
11
  * Handle list_merge_proposals tool call
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Shows a preview of the merged result without executing the merge.
3
3
  */
4
- import { getDb } from '../../db/index.js';
5
- import { getSchema } from '../../db/schema.js';
6
- import { createDatabaseClient } from '../../core/database.js';
4
+ import { getDb } from '../../../db/index.js';
5
+ import { getSchema } from '../../../db/schema.js';
6
+ import { createDatabaseClient } from '../../../core/storage/database.js';
7
7
  import { eq } from 'drizzle-orm';
8
8
  import { estimateMergeSavingsPreview } from '../analytics/token-estimator.js';
9
9
  import { mergeMemories } from '../strategies/merge-strategies.js';
@@ -3,9 +3,9 @@
3
3
  *
4
4
  * Rejects a merge proposal without executing it
5
5
  */
6
- import { getDb } from '../../db/index.js';
7
- import { getSchema } from '../../db/schema.js';
8
- import { createDatabaseClient } from '../../core/database.js';
6
+ import { getDb } from '../../../db/index.js';
7
+ import { getSchema } from '../../../db/schema.js';
8
+ import { createDatabaseClient } from '../../../core/storage/database.js';
9
9
  import { eq } from 'drizzle-orm';
10
10
  /**
11
11
  * Handle reject_merge tool call
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Reverses/undoes a completed merge and restores original memories.
3
3
  */
4
- import { getDb } from '../../db/index.js';
5
- import { getSchema } from '../../db/schema.js';
6
- import { createDatabaseClient } from '../../core/database.js';
4
+ import { getDb } from '../../../db/index.js';
5
+ import { getSchema } from '../../../db/schema.js';
6
+ import { createDatabaseClient } from '../../../core/storage/database.js';
7
7
  import { eq } from 'drizzle-orm';
8
8
  export async function handleReverseMerge(input) {
9
9
  try {
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Memory Merging Feature - Barrel Exports
3
+ *
4
+ * Provides a clean public API for memory merging functionality
5
+ */
6
+ export * from './types.js';
7
+ export { detectDuplicates, analyzeMergePair, getDetectionStats } from './detection/two-stage-detector.js';
8
+ export { SimHashFilter, MinHashFilter, findCandidatePairs } from './detection/hash-filters.js';
9
+ export { rankCandidates, analyzePair } from './detection/semantic-ranker.js';
10
+ export { getMergeStrategy, mergeMemories, MERGE_STRATEGIES } from './strategies/merge-strategies.js';
11
+ export type { MergeStrategy, MergedMemory } from './strategies/merge-strategies.js';
12
+ export { runSafetyChecks, checkBlockers, formatSafetyResults, describeSafetyChecks } from './safety/safety-checks.js';
13
+ export { estimateTokensSaved, calculateProjectTokenSavings, estimateMergeSavingsPreview, getTokenStatistics, formatTokenCount, formatSavingsReport, } from './analytics/token-estimator.js';
14
+ export { handleDetectDuplicates } from './handlers/detect-duplicates.js';
15
+ export { handleListProposals } from './handlers/list-proposals.js';
16
+ export { handlePreviewMerge } from './handlers/preview-merge.js';
17
+ export { handleApproveMerge } from './handlers/approve-merge.js';
18
+ export { handleRejectMerge } from './handlers/reject-merge.js';
19
+ export { handleReverseMerge } from './handlers/reverse-merge.js';
20
+ export { handleGetMergeStats } from './handlers/get-stats.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Memory Merging Feature - Barrel Exports
3
+ *
4
+ * Provides a clean public API for memory merging functionality
5
+ */
6
+ // Types
7
+ export * from './types.js';
8
+ // Detection
9
+ export { detectDuplicates, analyzeMergePair, getDetectionStats } from './detection/two-stage-detector.js';
10
+ export { SimHashFilter, MinHashFilter, findCandidatePairs } from './detection/hash-filters.js';
11
+ export { rankCandidates, analyzePair } from './detection/semantic-ranker.js';
12
+ // Merge Strategies
13
+ export { getMergeStrategy, mergeMemories, MERGE_STRATEGIES } from './strategies/merge-strategies.js';
14
+ // Safety
15
+ export { runSafetyChecks, checkBlockers, formatSafetyResults, describeSafetyChecks } from './safety/safety-checks.js';
16
+ // Analytics & Tokens
17
+ export { estimateTokensSaved, calculateProjectTokenSavings, estimateMergeSavingsPreview, getTokenStatistics, formatTokenCount, formatSavingsReport, } from './analytics/token-estimator.js';
18
+ // Handlers (MCP Tools)
19
+ export { handleDetectDuplicates } from './handlers/detect-duplicates.js';
20
+ export { handleListProposals } from './handlers/list-proposals.js';
21
+ export { handlePreviewMerge } from './handlers/preview-merge.js';
22
+ export { handleApproveMerge } from './handlers/approve-merge.js';
23
+ export { handleRejectMerge } from './handlers/reject-merge.js';
24
+ export { handleReverseMerge } from './handlers/reverse-merge.js';
25
+ export { handleGetMergeStats } from './handlers/get-stats.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Hash cache maintenance - SimHash/MinHash signatures for duplicate detection
3
+ */
4
+ export declare function updateCache(memoryId: string): Promise<boolean>;
5
+ export declare function rebuildCache(projectId: string): Promise<{
6
+ processed: number;
7
+ succeeded: number;
8
+ failed: number;
9
+ }>;
10
+ export declare function isStale(memoryId: string): Promise<boolean>;
11
+ export declare function cleanupOrphaned(projectId: string): Promise<number>;
12
+ //# sourceMappingURL=cache-maintenance.d.ts.map
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Hash cache maintenance - SimHash/MinHash signatures for duplicate detection
3
+ */
4
+ import { getDb } from '../../../db/index.js';
5
+ import { getSchema } from '../../../db/schema.js';
6
+ import { createDatabaseClient } from '../../../core/storage/database.js';
7
+ import { eq } from 'drizzle-orm';
8
+ import { SimHashFilter, MinHashFilter } from '../detection/hash-filters.js';
9
+ import crypto from 'crypto';
10
+ import { logger } from '../../../core/logger.js';
11
+ function hashContent(content) {
12
+ return crypto.createHash('md5').update(content).digest('hex');
13
+ }
14
+ export async function updateCache(memoryId) {
15
+ try {
16
+ const db = createDatabaseClient(await getDb());
17
+ const schema = await getSchema();
18
+ // Load the memory
19
+ const [memory] = await db
20
+ .select()
21
+ .from(schema.memories)
22
+ .where(eq(schema.memories.id, memoryId));
23
+ if (!memory) {
24
+ return false;
25
+ }
26
+ // Generate hashes
27
+ const simhashFilter = new SimHashFilter();
28
+ const minhashFilter = new MinHashFilter();
29
+ const simhash = simhashFilter.generateHash(memory.content);
30
+ const minhash = minhashFilter.generateSignature(memory.content);
31
+ const contentHash = hashContent(memory.content);
32
+ // Upsert cache entry
33
+ const now = new Date();
34
+ // Check if entry exists
35
+ const [existing] = await db
36
+ .select()
37
+ .from(schema.memoryHashCache)
38
+ .where(eq(schema.memoryHashCache.memoryId, memoryId));
39
+ if (existing) {
40
+ // Update existing
41
+ await db
42
+ .update(schema.memoryHashCache)
43
+ .set({
44
+ simhash,
45
+ minhash: minhash,
46
+ contentHash,
47
+ lastUpdated: now,
48
+ })
49
+ .where(eq(schema.memoryHashCache.memoryId, memoryId));
50
+ }
51
+ else {
52
+ // Create new
53
+ await db.insert(schema.memoryHashCache).values({
54
+ memoryId,
55
+ projectId: memory.projectId,
56
+ simhash,
57
+ minhash: minhash,
58
+ contentHash,
59
+ lastUpdated: now,
60
+ });
61
+ }
62
+ return true;
63
+ }
64
+ catch (error) {
65
+ logger.error(`Failed to update hash cache for ${memoryId}`, error);
66
+ return false;
67
+ }
68
+ }
69
+ export async function rebuildCache(projectId) {
70
+ try {
71
+ const db = createDatabaseClient(await getDb());
72
+ const schema = await getSchema();
73
+ // Get all memories in project
74
+ const memories = await db
75
+ .select()
76
+ .from(schema.memories)
77
+ .where(eq(schema.memories.projectId, projectId));
78
+ let succeeded = 0;
79
+ let failed = 0;
80
+ for (const memory of memories) {
81
+ const ok = await updateCache(memory.id);
82
+ if (ok) {
83
+ succeeded++;
84
+ }
85
+ else {
86
+ failed++;
87
+ }
88
+ }
89
+ return {
90
+ processed: memories.length,
91
+ succeeded,
92
+ failed,
93
+ };
94
+ }
95
+ catch (error) {
96
+ logger.error(`Failed to rebuild hash cache for project ${projectId}`, error);
97
+ return { processed: 0, succeeded: 0, failed: 0 };
98
+ }
99
+ }
100
+ export async function isStale(memoryId) {
101
+ try {
102
+ const db = createDatabaseClient(await getDb());
103
+ const schema = await getSchema();
104
+ const [memory] = await db
105
+ .select()
106
+ .from(schema.memories)
107
+ .where(eq(schema.memories.id, memoryId));
108
+ if (!memory) {
109
+ return true;
110
+ }
111
+ const [cacheEntry] = await db
112
+ .select()
113
+ .from(schema.memoryHashCache)
114
+ .where(eq(schema.memoryHashCache.memoryId, memoryId));
115
+ if (!cacheEntry) {
116
+ return true; // No cache entry = stale
117
+ }
118
+ const currentContentHash = hashContent(memory.content);
119
+ return currentContentHash !== cacheEntry.contentHash;
120
+ }
121
+ catch (error) {
122
+ logger.error('Failed to check hash cache staleness', error);
123
+ return true; // Assume stale on error
124
+ }
125
+ }
126
+ export async function cleanupOrphaned(projectId) {
127
+ try {
128
+ const db = createDatabaseClient(await getDb());
129
+ const schema = await getSchema();
130
+ // Get all cache entries for project
131
+ const cacheEntries = await db
132
+ .select()
133
+ .from(schema.memoryHashCache)
134
+ .where(eq(schema.memoryHashCache.projectId, projectId));
135
+ let deleted = 0;
136
+ for (const entry of cacheEntries) {
137
+ // Check if memory exists
138
+ const [memory] = await db
139
+ .select()
140
+ .from(schema.memories)
141
+ .where(eq(schema.memories.id, entry.memoryId));
142
+ if (!memory) {
143
+ // Memory doesn't exist, delete cache entry
144
+ await db
145
+ .delete(schema.memoryHashCache)
146
+ .where(eq(schema.memoryHashCache.memoryId, entry.memoryId));
147
+ deleted++;
148
+ }
149
+ }
150
+ return deleted;
151
+ }
152
+ catch (error) {
153
+ logger.error('Failed to cleanup orphaned hash cache', error);
154
+ return 0;
155
+ }
156
+ }
157
+ //# sourceMappingURL=cache-maintenance.js.map
@@ -2,7 +2,7 @@
2
2
  * Safety checks to prevent bad merges.
3
3
  * Checks run before creating merge proposals and are categorized as BLOCKER or WARNING.
4
4
  */
5
- import type { Memory } from '../../drizzle/schema.js';
5
+ import type { Memory } from '../../../db/drizzle/schema.js';
6
6
  export interface SafetyCheckResult {
7
7
  passed: boolean;
8
8
  warnings: string[];
@@ -2,7 +2,7 @@
2
2
  * Type-specific merge strategies for different memory types.
3
3
  * Each type has different merge semantics to preserve meaning and prevent data loss.
4
4
  */
5
- import type { Memory, MemoryType } from '../../drizzle/schema.js';
5
+ import type { Memory, MemoryType } from '../../../db/drizzle/schema.js';
6
6
  export interface MergeStrategy {
7
7
  type: MemoryType;
8
8
  /**
@@ -26,6 +26,24 @@ export interface MergedMemory {
26
26
  mergeReason: string;
27
27
  conflictWarnings: string[];
28
28
  }
29
+ /**
30
+ * Base implementation of MergeStrategy with common functionality.
31
+ * Reduces code duplication across specific merge strategies.
32
+ */
33
+ export declare abstract class BaseMergeStrategy implements MergeStrategy {
34
+ abstract type: MemoryType;
35
+ canMerge(sources: Memory[]): {
36
+ ok: boolean;
37
+ reason?: string;
38
+ };
39
+ protected validateSources(sources: Memory[]): boolean;
40
+ protected handleEmptySources(): MergedMemory;
41
+ protected mergeTags(sources: Memory[]): string[];
42
+ protected buildBaseMetadata(sources: Memory[], extra?: Record<string, unknown>): Record<string, unknown>;
43
+ protected sortByDate(sources: Memory[], order?: 'asc' | 'desc'): Memory[];
44
+ protected sortChronologically(sources: Memory[]): Memory[];
45
+ abstract merge(sources: Memory[]): MergedMemory;
46
+ }
29
47
  export declare const MERGE_STRATEGIES: Record<MemoryType, MergeStrategy>;
30
48
  export declare function getMergeStrategy(type: MemoryType): MergeStrategy;
31
49
  export declare function mergeMemories(sources: Memory[]): MergedMemory;