squish-memory 1.0.2 → 1.2.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 (704) hide show
  1. package/.env.example +146 -0
  2. package/CHANGELOG.md +202 -0
  3. package/README.md +192 -287
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +46 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +10 -12
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +78 -22
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/core/algorithms/index.ts +39 -0
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/core/embeddings/local-embeddings.ts +12 -0
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/core/memory/index.ts +11 -0
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/core/places/index.ts +14 -0
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/core/search/index.ts +4 -0
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/core/session/index.ts +7 -0
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/core/snapshots/cleanup.ts +13 -0
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/core/summarization/cleanup.ts +13 -0
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/dist/config.d.ts +61 -14
  220. package/dist/config.js +159 -139
  221. package/dist/core/adapters/config/claude-code.d.ts +45 -0
  222. package/dist/core/adapters/config/claude-code.js +113 -0
  223. package/dist/core/adapters/config/cursor.d.ts +26 -0
  224. package/dist/core/adapters/config/cursor.js +74 -0
  225. package/dist/core/adapters/config/opencode.d.ts +23 -0
  226. package/dist/core/adapters/config/opencode.js +73 -0
  227. package/dist/core/adapters/config/windsurf.d.ts +26 -0
  228. package/dist/core/adapters/config/windsurf.js +74 -0
  229. package/dist/core/adapters/index.d.ts +45 -0
  230. package/dist/core/adapters/index.js +84 -0
  231. package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
  232. package/dist/core/adapters/scripts/install-adapter.js +149 -0
  233. package/dist/core/adapters/timeline.d.ts +23 -0
  234. package/dist/core/adapters/timeline.js +88 -0
  235. package/dist/core/adapters/types.d.ts +137 -0
  236. package/dist/core/adapters/types.js +50 -0
  237. package/dist/core/agent-preferences.d.ts +16 -0
  238. package/dist/core/agent-preferences.js +124 -0
  239. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
  240. package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
  241. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
  242. package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
  243. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
  244. package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
  245. package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
  246. package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
  247. package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
  248. package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
  249. package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
  250. package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
  251. package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
  252. package/dist/core/algorithms/index.d.ts +21 -0
  253. package/dist/core/algorithms/index.js +26 -0
  254. package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
  255. package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
  256. package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +2 -6
  257. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
  258. package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
  259. package/dist/core/algorithms/types.d.ts +125 -0
  260. package/dist/core/algorithms/types.js +5 -0
  261. package/dist/core/associations.d.ts +3 -2
  262. package/dist/core/associations.js +37 -2
  263. package/dist/core/autosave.d.ts +19 -0
  264. package/dist/core/autosave.js +16 -0
  265. package/dist/core/beliefs/decay.d.ts +27 -0
  266. package/dist/core/beliefs/decay.js +217 -0
  267. package/dist/core/beliefs/extractor.d.ts +9 -0
  268. package/dist/core/beliefs/extractor.js +113 -0
  269. package/dist/core/beliefs/store.d.ts +46 -0
  270. package/dist/core/beliefs/store.js +466 -0
  271. package/dist/core/beliefs/types.d.ts +28 -0
  272. package/dist/core/beliefs/types.js +2 -0
  273. package/dist/core/commands/mcp-server.d.ts +2 -0
  274. package/dist/core/commands/mcp-server.js +6 -0
  275. package/dist/core/commands/remember.d.ts +24 -0
  276. package/dist/core/commands/remember.js +144 -0
  277. package/dist/core/compression.d.ts +45 -0
  278. package/dist/core/compression.js +160 -0
  279. package/dist/core/context/agent-context.d.ts +106 -0
  280. package/dist/core/context/agent-context.js +274 -0
  281. package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
  282. package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
  283. package/dist/core/context/context-window.d.ts +40 -0
  284. package/dist/core/context/context-window.js +177 -0
  285. package/dist/core/context/context.js +22 -0
  286. package/dist/core/embeddings/embeddings.d.ts +29 -0
  287. package/dist/core/embeddings/embeddings.js +546 -0
  288. package/dist/core/embeddings/google-multimodal.js +6 -2
  289. package/dist/core/embeddings/local-embeddings.d.ts +11 -0
  290. package/dist/core/embeddings/local-embeddings.js +11 -0
  291. package/dist/core/embeddings/qmd-client.js +1 -1
  292. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  293. package/dist/core/embeddings/transformers-local.js +213 -0
  294. package/dist/core/embeddings.d.ts +1 -28
  295. package/dist/core/embeddings.js +2 -401
  296. package/dist/core/error-handling.d.ts +63 -0
  297. package/dist/core/error-handling.js +173 -0
  298. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  299. package/dist/core/graph/entity-deduplicator.js +183 -0
  300. package/dist/core/graph/graph-builder.d.ts +46 -0
  301. package/dist/core/graph/graph-builder.js +174 -0
  302. package/dist/core/graph/graph-traversal.d.ts +80 -0
  303. package/dist/core/graph/graph-traversal.js +315 -0
  304. package/dist/core/graph/index.d.ts +19 -0
  305. package/dist/core/graph/index.js +13 -0
  306. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  307. package/dist/core/graph/llm-entity-extractor.js +313 -0
  308. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  309. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  310. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  311. package/dist/core/graph/relationship-extractor.js +351 -0
  312. package/dist/core/hooks/agent-hooks.d.ts +83 -0
  313. package/dist/core/hooks/agent-hooks.js +521 -0
  314. package/dist/core/hooks/auto-tagger.d.ts +19 -0
  315. package/dist/core/hooks/auto-tagger.js +155 -0
  316. package/dist/core/hooks/capture-filter.d.ts +41 -0
  317. package/dist/core/hooks/capture-filter.js +128 -0
  318. package/dist/core/hot-cache.d.ts +86 -0
  319. package/dist/core/hot-cache.js +285 -0
  320. package/dist/core/index.d.ts +9 -9
  321. package/dist/core/index.js +9 -12
  322. package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
  323. package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +2 -2
  324. package/dist/core/{core-memory.js → ingestion/core-memory.js} +7 -7
  325. package/dist/core/ingestion/learnings.d.ts +57 -0
  326. package/dist/core/ingestion/learnings.js +205 -0
  327. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  328. package/dist/core/ingestion/signal-engine.js +201 -0
  329. package/dist/core/integrations/obsidian-vault.d.ts +31 -0
  330. package/dist/core/integrations/obsidian-vault.js +156 -0
  331. package/dist/core/lib/db-client.d.ts +114 -0
  332. package/dist/core/lib/db-client.js +130 -0
  333. package/dist/core/lib/parse-embedding.d.ts +9 -0
  334. package/dist/core/lib/parse-embedding.js +58 -0
  335. package/dist/core/lib/schemas.d.ts +132 -0
  336. package/dist/core/lib/schemas.js +87 -0
  337. package/dist/core/lib/types.d.ts +45 -0
  338. package/dist/core/lib/types.js +6 -0
  339. package/dist/core/{utils.d.ts → lib/utils.d.ts} +5 -0
  340. package/dist/core/lib/utils.js +145 -0
  341. package/dist/core/lib/validation.d.ts +38 -0
  342. package/dist/core/lib/validation.js +151 -0
  343. package/dist/core/lifecycle.d.ts +7 -1
  344. package/dist/core/lifecycle.js +152 -42
  345. package/dist/core/logger.d.ts +1 -0
  346. package/dist/core/logger.js +13 -1
  347. package/dist/core/mcp/tools.d.ts +0 -2
  348. package/dist/core/mcp/tools.js +35 -90
  349. package/dist/core/mcp/types.d.ts +25 -253
  350. package/dist/core/mcp/types.js +2 -2
  351. package/dist/core/memory/categorizer.js +2 -0
  352. package/dist/core/memory/conflict-detector.js +1 -1
  353. package/dist/core/memory/consolidation.d.ts +1 -10
  354. package/dist/core/memory/consolidation.js +4 -39
  355. package/dist/core/memory/context-collector.js +1 -1
  356. package/dist/core/memory/edit-workflow.js +1 -1
  357. package/dist/core/memory/entity-extractor.d.ts +4 -0
  358. package/dist/core/memory/entity-extractor.js +30 -16
  359. package/dist/core/memory/entity-resolver.js +7 -7
  360. package/dist/core/memory/explain.d.ts +18 -0
  361. package/dist/core/memory/explain.js +92 -0
  362. package/dist/core/memory/fact-deriver.d.ts +31 -0
  363. package/dist/core/memory/fact-deriver.js +236 -0
  364. package/dist/core/memory/fact-extractor.js +12 -12
  365. package/dist/core/memory/feedback-tracker.js +1 -1
  366. package/dist/core/memory/hooks.d.ts +88 -0
  367. package/dist/core/memory/hooks.js +174 -0
  368. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  369. package/dist/core/memory/hybrid-retrieval.js +25 -127
  370. package/dist/core/memory/hybrid-scorer.js +6 -23
  371. package/dist/core/memory/hybrid-search.d.ts +9 -11
  372. package/dist/core/memory/hybrid-search.js +496 -273
  373. package/dist/core/memory/importance.d.ts +2 -24
  374. package/dist/core/memory/importance.js +7 -91
  375. package/dist/core/memory/index.d.ts +1 -0
  376. package/dist/core/memory/index.js +1 -0
  377. package/dist/core/memory/loader.d.ts +31 -0
  378. package/dist/core/memory/loader.js +141 -0
  379. package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
  380. package/dist/core/memory/markdown/markdown-storage.js +243 -0
  381. package/dist/core/memory/memories.d.ts +23 -19
  382. package/dist/core/memory/memories.js +243 -228
  383. package/dist/core/memory/memory-lifecycle.d.ts +8 -0
  384. package/dist/core/memory/memory-lifecycle.js +47 -0
  385. package/dist/core/memory/migrate.d.ts +21 -0
  386. package/dist/core/memory/migrate.js +134 -0
  387. package/dist/core/memory/normalization.d.ts +7 -0
  388. package/dist/core/memory/normalization.js +26 -0
  389. package/dist/core/memory/path-strengthener.d.ts +39 -0
  390. package/dist/core/memory/path-strengthener.js +150 -0
  391. package/dist/core/memory/progressive-disclosure.js +1 -1
  392. package/dist/core/memory/query-processor.js +37 -3
  393. package/dist/core/memory/query-rewriter.js +9 -9
  394. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  395. package/dist/core/memory/retrieval-feedback.js +213 -0
  396. package/dist/core/memory/serialization.d.ts +4 -0
  397. package/dist/core/memory/serialization.js +49 -0
  398. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  399. package/dist/core/memory/stale-cleaner.js +97 -0
  400. package/dist/core/memory/stats.d.ts +15 -0
  401. package/dist/core/memory/stats.js +69 -13
  402. package/dist/core/memory/temporal-facts.js +21 -0
  403. package/dist/core/memory/trigger-detector.d.ts +8 -1
  404. package/dist/core/memory/trigger-detector.js +42 -5
  405. package/dist/core/memory/write-gate.js +1 -1
  406. package/dist/core/places/index.d.ts +14 -0
  407. package/dist/core/places/index.js +14 -0
  408. package/dist/core/places/memory-places.d.ts +68 -0
  409. package/dist/core/places/memory-places.js +261 -0
  410. package/dist/core/places/places.d.ts +88 -0
  411. package/dist/core/places/places.js +314 -0
  412. package/dist/core/places/rules.d.ts +74 -0
  413. package/dist/core/places/rules.js +240 -0
  414. package/dist/core/places/walking.d.ts +56 -0
  415. package/dist/core/places/walking.js +121 -0
  416. package/dist/core/projects.d.ts +5 -0
  417. package/dist/core/projects.js +47 -18
  418. package/dist/core/responses.d.ts +96 -0
  419. package/dist/core/responses.js +122 -0
  420. package/dist/core/runtime/trust-report.d.ts +102 -0
  421. package/dist/core/runtime/trust-report.js +107 -0
  422. package/dist/core/runtime/trust-state.d.ts +12 -0
  423. package/dist/core/runtime/trust-state.js +309 -0
  424. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  425. package/dist/core/scheduler/cron-scheduler.js +193 -10
  426. package/dist/core/scheduler/index.d.ts +1 -1
  427. package/dist/core/scheduler/index.js +1 -1
  428. package/dist/core/scheduler/job-runner.js +2 -2
  429. package/dist/core/search/conversations.js +40 -42
  430. package/dist/core/search/entities.js +6 -9
  431. package/dist/core/search/graph-boost.d.ts +7 -0
  432. package/dist/core/search/graph-boost.js +23 -0
  433. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  434. package/dist/core/search/qmd-wrapper.js +58 -0
  435. package/dist/core/security/encrypt.d.ts +6 -0
  436. package/dist/core/security/encrypt.js +47 -0
  437. package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
  438. package/dist/core/security/governance.js +79 -0
  439. package/dist/core/session/auto-load.js +34 -9
  440. package/dist/core/session/entity-tracker.d.ts +62 -0
  441. package/dist/core/session/entity-tracker.js +287 -0
  442. package/dist/core/session/index.d.ts +1 -1
  443. package/dist/core/session/index.js +1 -1
  444. package/dist/core/session/reference-resolver.d.ts +26 -0
  445. package/dist/core/session/reference-resolver.js +121 -0
  446. package/dist/core/{session-hooks → session}/self-iteration-job.d.ts +15 -0
  447. package/dist/core/{session-hooks → session}/self-iteration-job.js +195 -90
  448. package/dist/core/session/working-set.d.ts +50 -0
  449. package/dist/core/session/working-set.js +212 -0
  450. package/dist/core/snapshots/creation.d.ts +2 -8
  451. package/dist/core/snapshots/creation.js +3 -12
  452. package/dist/core/{cache.js → storage/cache.js} +2 -2
  453. package/dist/core/utils/memory-operations.js +1 -1
  454. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  455. package/dist/core/utils/summarization-helpers.js +1 -6
  456. package/dist/core/utils/vector-operations.d.ts +71 -0
  457. package/dist/core/utils/vector-operations.js +129 -0
  458. package/dist/db/adapter.d.ts +3 -3
  459. package/dist/db/adapter.js +99 -88
  460. package/dist/db/bootstrap.d.ts +2 -0
  461. package/dist/db/bootstrap.js +921 -674
  462. package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +775 -25
  463. package/dist/{drizzle → db/drizzle}/schema-sqlite.js +170 -24
  464. package/dist/{drizzle → db/drizzle}/schema.d.ts +731 -32
  465. package/dist/{drizzle → db/drizzle}/schema.js +192 -32
  466. package/dist/db/drizzle.config.d.ts +3 -0
  467. package/dist/db/drizzle.config.js +12 -0
  468. package/dist/db/index.d.ts +1 -5
  469. package/dist/db/index.js +51 -8
  470. package/dist/db/migrations/associations.d.ts +6 -0
  471. package/dist/db/migrations/associations.js +29 -0
  472. package/dist/db/migrations/beliefs.d.ts +10 -0
  473. package/dist/db/migrations/beliefs.js +76 -0
  474. package/dist/db/migrations/core-memory.d.ts +6 -0
  475. package/dist/db/migrations/core-memory.js +29 -0
  476. package/dist/db/migrations/fts.d.ts +6 -0
  477. package/dist/db/migrations/fts.js +52 -0
  478. package/dist/db/migrations/index.d.ts +25 -0
  479. package/dist/db/migrations/index.js +51 -0
  480. package/dist/db/migrations/indexes.d.ts +6 -0
  481. package/dist/db/migrations/indexes.js +30 -0
  482. package/dist/db/migrations/learnings.d.ts +7 -0
  483. package/dist/db/migrations/learnings.js +26 -0
  484. package/dist/db/migrations/maintenance.d.ts +6 -0
  485. package/dist/db/migrations/maintenance.js +61 -0
  486. package/dist/db/migrations/memories.d.ts +7 -0
  487. package/dist/db/migrations/memories.js +16 -0
  488. package/dist/db/migrations/memory-places.d.ts +6 -0
  489. package/dist/db/migrations/memory-places.js +29 -0
  490. package/dist/db/migrations/places.d.ts +6 -0
  491. package/dist/db/migrations/places.js +43 -0
  492. package/dist/db/migrations/projects.d.ts +3 -0
  493. package/dist/db/migrations/projects.js +13 -0
  494. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  495. package/dist/db/migrations/tier-conversion.js +20 -0
  496. package/dist/db/neon.d.ts +8 -0
  497. package/dist/db/neon.js +20 -0
  498. package/dist/db/schema/beliefs.d.ts +9 -0
  499. package/dist/db/schema/beliefs.js +46 -0
  500. package/dist/db/schema/generator.d.ts +38 -0
  501. package/dist/db/schema/generator.js +108 -0
  502. package/dist/db/schema/index.d.ts +39 -0
  503. package/dist/db/schema/index.js +51 -0
  504. package/dist/db/schema/learnings.d.ts +7 -0
  505. package/dist/db/schema/learnings.js +30 -0
  506. package/dist/db/schema/memories.d.ts +7 -0
  507. package/dist/db/schema/memories.js +81 -0
  508. package/dist/db/schema/projects.d.ts +4 -0
  509. package/dist/db/schema/projects.js +31 -0
  510. package/dist/db/schema/tables/context-sessions.d.ts +9 -0
  511. package/dist/db/schema/tables/context-sessions.js +37 -0
  512. package/dist/db/schema/tables/conversations.d.ts +9 -0
  513. package/dist/db/schema/tables/conversations.js +47 -0
  514. package/dist/db/schema/tables/core-memory.d.ts +9 -0
  515. package/dist/db/schema/tables/core-memory.js +41 -0
  516. package/dist/db/schema/tables/entities.d.ts +9 -0
  517. package/dist/db/schema/tables/entities.js +39 -0
  518. package/dist/db/schema/tables/entity-relations.d.ts +9 -0
  519. package/dist/db/schema/tables/entity-relations.js +31 -0
  520. package/dist/db/schema/tables/learnings.d.ts +9 -0
  521. package/dist/db/schema/tables/learnings.js +66 -0
  522. package/dist/db/schema/tables/memories.d.ts +9 -0
  523. package/dist/db/schema/tables/memories.js +161 -0
  524. package/dist/db/schema/tables/memory-associations.d.ts +9 -0
  525. package/dist/db/schema/tables/memory-associations.js +39 -0
  526. package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
  527. package/dist/db/schema/tables/memory-hash-cache.js +29 -0
  528. package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
  529. package/dist/db/schema/tables/memory-merge-history.js +33 -0
  530. package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
  531. package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
  532. package/dist/db/schema/tables/messages.d.ts +9 -0
  533. package/dist/db/schema/tables/messages.js +41 -0
  534. package/dist/db/schema/tables/namespaces.d.ts +9 -0
  535. package/dist/db/schema/tables/namespaces.js +37 -0
  536. package/dist/db/schema/tables/projects.d.ts +9 -0
  537. package/dist/db/schema/tables/projects.js +31 -0
  538. package/dist/db/schema/tables/users.d.ts +9 -0
  539. package/dist/db/schema/tables/users.js +27 -0
  540. package/dist/db/schema.d.ts +1 -1
  541. package/dist/db/schema.js +2 -2
  542. package/dist/db/supabase.d.ts +9 -0
  543. package/dist/db/supabase.js +24 -0
  544. package/dist/packages/mcp/src/index.d.ts +3 -0
  545. package/dist/packages/mcp/src/index.js +733 -0
  546. package/mcp.json.example +8 -0
  547. package/package.json +132 -173
  548. package/packages/cli/package.json +22 -0
  549. package/packages/cli/src/commands/clean.ts +68 -0
  550. package/packages/cli/src/commands/context.ts +79 -0
  551. package/packages/cli/src/commands/doctor.ts +357 -0
  552. package/packages/cli/src/commands/forget.ts +72 -0
  553. package/packages/cli/src/commands/health.ts +36 -0
  554. package/packages/cli/src/commands/inspect.ts +41 -0
  555. package/packages/cli/src/commands/link.ts +50 -0
  556. package/packages/cli/src/commands/migrate.ts +93 -0
  557. package/packages/cli/src/commands/recall.ts +99 -0
  558. package/packages/cli/src/commands/recent.ts +57 -0
  559. package/packages/cli/src/commands/remember.ts +139 -0
  560. package/packages/cli/src/commands/run.ts +58 -0
  561. package/packages/cli/src/commands/stale.ts +43 -0
  562. package/packages/cli/src/commands/stats.ts +42 -0
  563. package/packages/cli/src/index.ts +57 -0
  564. package/packages/cli/tsconfig.json +24 -0
  565. package/packages/mcp/package.json +26 -0
  566. package/packages/mcp/src/index.ts +877 -0
  567. package/packages/mcp/tsconfig.json +20 -0
  568. package/skills/squish-memory/SKILL.md +107 -114
  569. package/skills/squish-memory/install.sh +3 -3
  570. package/skills/squish-memory/{claude-desktop.json → references/claude-desktop.json} +12 -12
  571. package/skills/squish-memory/{openclaw.json → references/openclaw.json} +13 -13
  572. package/skills/squish-memory/{opencode.json → references/opencode.json} +14 -14
  573. package/.claude-plugin/marketplace.json +0 -20
  574. package/.claude-plugin/plugin.json +0 -32
  575. package/.env.mcp.example +0 -60
  576. package/.mcp.json +0 -11
  577. package/QUICK-START.md +0 -71
  578. package/bin/squish-add.mjs +0 -32
  579. package/bin/squish-rm.mjs +0 -21
  580. package/commands/context-paging.md +0 -51
  581. package/commands/context-status.md +0 -22
  582. package/commands/context.md +0 -5
  583. package/commands/core-memory.md +0 -56
  584. package/commands/health.md +0 -5
  585. package/commands/init.md +0 -39
  586. package/commands/merge.md +0 -113
  587. package/commands/observe.md +0 -5
  588. package/commands/recall.md +0 -5
  589. package/commands/remember.md +0 -11
  590. package/commands/search.md +0 -10
  591. package/config/mcp-cli-fallback-policy.json +0 -22
  592. package/config/mcp.json +0 -38
  593. package/config/plugin-manifest.json +0 -152
  594. package/config/plugin-manifest.schema.json +0 -244
  595. package/config/remote-memory-policy.json +0 -32
  596. package/dist/api/web/index.d.ts +0 -3
  597. package/dist/api/web/index.js +0 -4
  598. package/dist/api/web/web-server.d.ts +0 -3
  599. package/dist/api/web/web-server.js +0 -6
  600. package/dist/api/web/web.d.ts +0 -4
  601. package/dist/api/web/web.js +0 -639
  602. package/dist/commands/managed-sync.d.ts +0 -10
  603. package/dist/commands/managed-sync.js +0 -64
  604. package/dist/commands/mcp-server.d.ts +0 -3
  605. package/dist/commands/mcp-server.js +0 -393
  606. package/dist/core/context.js +0 -24
  607. package/dist/core/governance.js +0 -64
  608. package/dist/core/local-embeddings.d.ts +0 -6
  609. package/dist/core/local-embeddings.js +0 -20
  610. package/dist/core/namespaces/index.d.ts +0 -71
  611. package/dist/core/namespaces/index.js +0 -305
  612. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  613. package/dist/core/namespaces/uri-parser.js +0 -74
  614. package/dist/core/observations.d.ts +0 -26
  615. package/dist/core/observations.js +0 -110
  616. package/dist/core/requirements.d.ts +0 -20
  617. package/dist/core/requirements.js +0 -35
  618. package/dist/core/search/qmd-search.d.ts +0 -61
  619. package/dist/core/search/qmd-search.js +0 -178
  620. package/dist/core/snapshots.d.ts +0 -29
  621. package/dist/core/snapshots.js +0 -220
  622. package/dist/core/sync/qmd-sync.d.ts +0 -106
  623. package/dist/core/sync/qmd-sync.js +0 -213
  624. package/dist/core/utils.js +0 -74
  625. package/dist/index.d.ts +0 -19
  626. package/dist/index.js +0 -997
  627. package/generated/mcp/manifest.json +0 -23
  628. package/generated/mcp/mcp-servers.json +0 -25
  629. package/generated/mcp/mcporter.json +0 -34
  630. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  631. package/generated/mcp/runtime.json +0 -12
  632. package/hooks/hooks.json +0 -52
  633. package/hooks/post-tool-use.js +0 -26
  634. package/hooks/session-end.js +0 -28
  635. package/hooks/session-start.js +0 -33
  636. package/hooks/user-prompt-submit.js +0 -26
  637. package/hooks/utils.js +0 -153
  638. package/npx-installer.js +0 -208
  639. package/packages/plugin-claude-code/README.md +0 -73
  640. package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
  641. package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
  642. package/packages/plugin-claude-code/package.json +0 -31
  643. package/packages/plugin-openclaw/README.md +0 -70
  644. package/packages/plugin-openclaw/dist/index.d.ts +0 -49
  645. package/packages/plugin-openclaw/dist/index.js +0 -262
  646. package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
  647. package/packages/plugin-openclaw/package.json +0 -31
  648. package/packages/plugin-opencode/install.mjs +0 -217
  649. package/packages/plugin-opencode/package.json +0 -21
  650. package/plugin.json +0 -32
  651. package/scripts/build-release.sh +0 -36
  652. package/scripts/check-secrets.js +0 -132
  653. package/scripts/db/check-db.mjs +0 -88
  654. package/scripts/db/fix-all-columns.mjs +0 -52
  655. package/scripts/db/fix-schema-all.mjs +0 -55
  656. package/scripts/db/fix-schema-full.mjs +0 -46
  657. package/scripts/db/fix-schema.mjs +0 -38
  658. package/scripts/db/init-db.mjs +0 -13
  659. package/scripts/db/recreate-db.mjs +0 -14
  660. package/scripts/generate-mcp.mjs +0 -264
  661. package/scripts/github-release.sh +0 -77
  662. package/scripts/init-dirs.mjs +0 -13
  663. package/scripts/install-interactive.mjs +0 -677
  664. package/scripts/install-mcp.mjs +0 -116
  665. package/scripts/install-plugin.mjs +0 -415
  666. package/scripts/install-web.sh +0 -120
  667. package/scripts/install.mjs +0 -340
  668. package/scripts/openclaw-bootstrap.mjs +0 -127
  669. package/scripts/package-release.sh +0 -71
  670. package/scripts/remote-preflight.mjs +0 -62
  671. package/scripts/squish-fallback.mjs +0 -132
  672. package/scripts/test/test-all-systems.mjs +0 -139
  673. package/scripts/test/test-memory-system.mjs +0 -139
  674. package/scripts/test/test-v0.5.0.mjs +0 -210
  675. package/scripts/test-interactive.mjs +0 -131
  676. package/scripts/verify-mcp.mjs +0 -214
  677. package/skills/memory-guide/SKILL.md +0 -332
  678. package/skills/squish-cli/SKILL.md +0 -240
  679. package/skills/squish-mcp/SKILL.md +0 -355
  680. package/skills/squish-memory/install.mjs +0 -335
  681. package/skills/squish-memory/skill.json +0 -32
  682. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
  683. /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
  684. /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
  685. /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
  686. /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
  687. /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
  688. /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
  689. /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
  690. /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
  691. /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
  692. /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
  693. /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
  694. /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
  695. /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
  696. /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
  697. /package/dist/core/{privacy.js → security/privacy.js} +0 -0
  698. /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
  699. /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
  700. /package/dist/core/{session-hooks → session}/session-hooks.d.ts +0 -0
  701. /package/dist/core/{session-hooks → session}/session-hooks.js +0 -0
  702. /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
  703. /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
  704. /package/dist/core/{database.js → storage/database.js} +0 -0
@@ -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,12 +2,8 @@
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';
6
- export interface SafetyCheckResult {
7
- passed: boolean;
8
- warnings: string[];
9
- blockers: string[];
10
- }
5
+ import type { Memory } from '../../../db/drizzle/schema.js';
6
+ import type { SafetyCheckResult } from '../../lib/types.js';
11
7
  export interface SafetyCheck {
12
8
  name: string;
13
9
  description: 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;
@@ -3,28 +3,62 @@
3
3
  * Each type has different merge semantics to preserve meaning and prevent data loss.
4
4
  */
5
5
  /**
6
- * FACT strategy: Union of information, remove exact duplicates.
7
- * Combines all unique facts into a unified statement with provenance tracking.
6
+ * Base implementation of MergeStrategy with common functionality.
7
+ * Reduces code duplication across specific merge strategies.
8
8
  */
9
- class FactMergeStrategy {
10
- type = 'fact';
9
+ export class BaseMergeStrategy {
11
10
  canMerge(sources) {
12
- // Facts can almost always be merged
13
11
  if (sources.length < 2) {
14
12
  return { ok: false, reason: 'Need at least 2 memories to merge' };
15
13
  }
16
14
  return { ok: true };
17
15
  }
16
+ validateSources(sources) {
17
+ return sources.length >= 2;
18
+ }
19
+ handleEmptySources() {
20
+ return {
21
+ content: '',
22
+ summary: null,
23
+ tags: [],
24
+ metadata: {},
25
+ mergeReason: 'Empty source set',
26
+ conflictWarnings: [],
27
+ };
28
+ }
29
+ mergeTags(sources) {
30
+ const tagSet = new Set();
31
+ for (const source of sources) {
32
+ for (const tag of source.tags || []) {
33
+ tagSet.add(tag);
34
+ }
35
+ }
36
+ return Array.from(tagSet);
37
+ }
38
+ buildBaseMetadata(sources, extra) {
39
+ return {
40
+ mergedFrom: sources.map((m) => m.id),
41
+ mergeCount: sources.length,
42
+ ...extra,
43
+ };
44
+ }
45
+ sortByDate(sources, order = 'desc') {
46
+ const sorted = [...sources].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
47
+ return order === 'asc' ? [...sorted].reverse() : sorted;
48
+ }
49
+ sortChronologically(sources) {
50
+ return [...sources].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
51
+ }
52
+ }
53
+ /**
54
+ * FACT strategy: Union of information, remove exact duplicates.
55
+ * Combines all unique facts into a unified statement with provenance tracking.
56
+ */
57
+ class FactMergeStrategy extends BaseMergeStrategy {
58
+ type = 'fact';
18
59
  merge(sources) {
19
60
  if (sources.length === 0) {
20
- return {
21
- content: '',
22
- summary: null,
23
- tags: [],
24
- metadata: {},
25
- mergeReason: 'Empty source set',
26
- conflictWarnings: [],
27
- };
61
+ return this.handleEmptySources();
28
62
  }
29
63
  // Split content into sentences and deduplicate
30
64
  const sentenceSet = new Set();
@@ -45,27 +79,14 @@ class FactMergeStrategy {
45
79
  // Sort sentences for consistency
46
80
  const mergedSentences = Array.from(sentenceSet).sort();
47
81
  const content = mergedSentences.join('. ') + (mergedSentences.length > 0 ? '.' : '');
48
- // Merge tags (union)
49
- const tagSet = new Set();
50
- for (const source of sources) {
51
- for (const tag of source.tags || []) {
52
- tagSet.add(tag);
53
- }
54
- }
55
- // Create merged metadata with provenance
56
- const metadata = {
57
- mergedFrom: sources.map((m) => ({
58
- id: m.id,
59
- createdAt: m.createdAt,
60
- source: m.source,
61
- })),
62
- mergeCount: sources.length,
82
+ // Build merged metadata with provenance
83
+ const metadata = this.buildBaseMetadata(sources, {
63
84
  timestamps: timestamps.sort(),
64
- };
85
+ });
65
86
  return {
66
87
  content,
67
88
  summary: null,
68
- tags: Array.from(tagSet),
89
+ tags: this.mergeTags(sources),
69
90
  metadata,
70
91
  mergeReason: `Merged ${sources.length} facts by combining all unique statements`,
71
92
  conflictWarnings: [],
@@ -76,27 +97,14 @@ class FactMergeStrategy {
76
97
  * PREFERENCE strategy: Keep latest by timestamp, track evolution history.
77
98
  * Warns if preferences conflict, indicating user changed their mind.
78
99
  */
79
- class PreferenceMergeStrategy {
100
+ class PreferenceMergeStrategy extends BaseMergeStrategy {
80
101
  type = 'preference';
81
- canMerge(sources) {
82
- if (sources.length < 2) {
83
- return { ok: false, reason: 'Need at least 2 memories to merge' };
84
- }
85
- return { ok: true };
86
- }
87
102
  merge(sources) {
88
103
  if (sources.length === 0) {
89
- return {
90
- content: '',
91
- summary: null,
92
- tags: [],
93
- metadata: {},
94
- mergeReason: 'Empty source set',
95
- conflictWarnings: [],
96
- };
104
+ return this.handleEmptySources();
97
105
  }
98
106
  // Sort by creation date (newest first)
99
- const sorted = [...sources].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
107
+ const sorted = this.sortByDate(sources);
100
108
  const latest = sorted[0];
101
109
  const warnings = [];
102
110
  // Check for conflicting preferences
@@ -112,12 +120,10 @@ class PreferenceMergeStrategy {
112
120
  confidence: m.confidence || 100,
113
121
  source: m.source,
114
122
  }));
115
- const metadata = {
116
- mergedFrom: sources.map((m) => m.id),
123
+ const metadata = this.buildBaseMetadata(sources, {
117
124
  preferenceHistory: history,
118
- mergeCount: sources.length,
119
125
  latestAt: latest.createdAt,
120
- };
126
+ });
121
127
  const summary = sources.length > 1
122
128
  ? `Prefers: ${latest.content} (evolved from ${sources.length} preferences)`
123
129
  : null;
@@ -135,27 +141,14 @@ class PreferenceMergeStrategy {
135
141
  * DECISION strategy: Keep latest decision, link to previous ones in timeline.
136
142
  * Warns if decisions contradict, preserving rationale history.
137
143
  */
138
- class DecisionMergeStrategy {
144
+ class DecisionMergeStrategy extends BaseMergeStrategy {
139
145
  type = 'decision';
140
- canMerge(sources) {
141
- if (sources.length < 2) {
142
- return { ok: false, reason: 'Need at least 2 memories to merge' };
143
- }
144
- return { ok: true };
145
- }
146
146
  merge(sources) {
147
147
  if (sources.length === 0) {
148
- return {
149
- content: '',
150
- summary: null,
151
- tags: [],
152
- metadata: {},
153
- mergeReason: 'Empty source set',
154
- conflictWarnings: [],
155
- };
148
+ return this.handleEmptySources();
156
149
  }
157
150
  // Sort by creation date (newest first)
158
- const sorted = [...sources].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
151
+ const sorted = this.sortByDate(sources);
159
152
  const latest = sorted[0];
160
153
  const warnings = [];
161
154
  // Check for conflicting decisions
@@ -170,13 +163,11 @@ class DecisionMergeStrategy {
170
163
  confidence: m.confidence || 100,
171
164
  rationale: m.summary || 'No rationale recorded',
172
165
  }));
173
- const metadata = {
174
- mergedFrom: sources.map((m) => m.id),
166
+ const metadata = this.buildBaseMetadata(sources, {
175
167
  decisionTimeline: timeline,
176
- mergeCount: sources.length,
177
168
  currentDecisionAt: latest.createdAt,
178
169
  supersedes: sorted.slice(1).map((m) => m.id),
179
- };
170
+ });
180
171
  const summary = sources.length > 1 ? `Decided: ${latest.content} (${sources.length} decisions)` : null;
181
172
  return {
182
173
  content: latest.content,
@@ -192,31 +183,17 @@ class DecisionMergeStrategy {
192
183
  * OBSERVATION strategy: Aggregate observations in chronological order.
193
184
  * Preserves temporal patterns and frequency information.
194
185
  */
195
- class ObservationMergeStrategy {
186
+ class ObservationMergeStrategy extends BaseMergeStrategy {
196
187
  type = 'observation';
197
- canMerge(sources) {
198
- if (sources.length < 2) {
199
- return { ok: false, reason: 'Need at least 2 memories to merge' };
200
- }
201
- return { ok: true };
202
- }
203
188
  merge(sources) {
204
189
  if (sources.length === 0) {
205
- return {
206
- content: '',
207
- summary: null,
208
- tags: [],
209
- metadata: {},
210
- mergeReason: 'Empty source set',
211
- conflictWarnings: [],
212
- };
190
+ return this.handleEmptySources();
213
191
  }
214
192
  // Sort chronologically
215
- const sorted = [...sources].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
193
+ const sorted = this.sortChronologically(sources);
216
194
  // Create observation summary
217
195
  const observations = sorted.map((m) => `• ${m.content}`).join('\n');
218
- const metadata = {
219
- mergedFrom: sources.map((m) => m.id),
196
+ const metadata = this.buildBaseMetadata(sources, {
220
197
  observationCount: sources.length,
221
198
  timeSpan: {
222
199
  start: sorted[0].createdAt,
@@ -227,18 +204,11 @@ class ObservationMergeStrategy {
227
204
  content: m.content,
228
205
  createdAt: m.createdAt,
229
206
  })),
230
- };
231
- // Merge tags
232
- const tagSet = new Set();
233
- for (const source of sources) {
234
- for (const tag of source.tags || []) {
235
- tagSet.add(tag);
236
- }
237
- }
207
+ });
238
208
  return {
239
209
  content: `Observations (${sources.length} total):\n${observations}`,
240
210
  summary: `${sources.length} observations over time period`,
241
- tags: Array.from(tagSet),
211
+ tags: this.mergeTags(sources),
242
212
  metadata,
243
213
  mergeReason: `Merged ${sources.length} observations chronologically`,
244
214
  conflictWarnings: [],
@@ -249,24 +219,11 @@ class ObservationMergeStrategy {
249
219
  * CONTEXT strategy: Union of unique context, remove exact duplicates.
250
220
  * Preserves all distinct context items.
251
221
  */
252
- class ContextMergeStrategy {
222
+ class ContextMergeStrategy extends BaseMergeStrategy {
253
223
  type = 'context';
254
- canMerge(sources) {
255
- if (sources.length < 2) {
256
- return { ok: false, reason: 'Need at least 2 memories to merge' };
257
- }
258
- return { ok: true };
259
- }
260
224
  merge(sources) {
261
225
  if (sources.length === 0) {
262
- return {
263
- content: '',
264
- summary: null,
265
- tags: [],
266
- metadata: {},
267
- mergeReason: 'Empty source set',
268
- conflictWarnings: [],
269
- };
226
+ return this.handleEmptySources();
270
227
  }
271
228
  // Deduplicate by content (exact matches)
272
229
  const uniqueContexts = new Map();
@@ -280,23 +237,15 @@ class ContextMergeStrategy {
280
237
  .sort()
281
238
  .map((content) => `• ${content}`)
282
239
  .join('\n');
283
- const metadata = {
284
- mergedFrom: sources.map((m) => m.id),
240
+ const metadata = this.buildBaseMetadata(sources, {
285
241
  uniqueContextCount: uniqueContexts.size,
286
242
  totalContextCount: sources.length,
287
243
  deduplicatedEntries: sources.length - uniqueContexts.size,
288
- };
289
- // Merge tags
290
- const tagSet = new Set();
291
- for (const source of sources) {
292
- for (const tag of source.tags || []) {
293
- tagSet.add(tag);
294
- }
295
- }
244
+ });
296
245
  return {
297
246
  content: contextList,
298
247
  summary: `${uniqueContexts.size} context items (${sources.length} total)`,
299
- tags: Array.from(tagSet),
248
+ tags: this.mergeTags(sources),
300
249
  metadata,
301
250
  mergeReason: `Merged ${sources.length} context records into ${uniqueContexts.size} unique items`,
302
251
  conflictWarnings: [],
@@ -309,6 +258,8 @@ export const MERGE_STRATEGIES = {
309
258
  decision: new DecisionMergeStrategy(),
310
259
  observation: new ObservationMergeStrategy(),
311
260
  context: new ContextMergeStrategy(),
261
+ reflection: new ObservationMergeStrategy(),
262
+ note: new ObservationMergeStrategy(), // jot uses observation strategy
312
263
  };
313
264
  export function getMergeStrategy(type) {
314
265
  const strategy = MERGE_STRATEGIES[type];
@@ -0,0 +1,125 @@
1
+ /**
2
+ * TypeScript types and interfaces for memory merging
3
+ */
4
+ import type { Memory, MemoryMergeProposal } from '../../db/drizzle/schema.js';
5
+ /**
6
+ * Merge proposal status
7
+ */
8
+ export type MergeProposalStatus = 'pending' | 'approved' | 'rejected' | 'expired';
9
+ /**
10
+ * Confidence level for merge suggestions
11
+ */
12
+ export type ConfidenceLevel = 'high' | 'medium' | 'low';
13
+ /**
14
+ * Detection method used to find duplicates
15
+ */
16
+ export type DetectionMethod = 'simhash' | 'minhash' | 'embedding';
17
+ /**
18
+ * Merge strategy type per memory type
19
+ */
20
+ export type MergeStrategyType = 'union' | 'latest' | 'voting' | 'custom';
21
+ /**
22
+ * Memory pair candidate for merging
23
+ */
24
+ export interface MemoryMergePair {
25
+ memory1: Memory;
26
+ memory2: Memory;
27
+ similarityScore: number;
28
+ detectionMethod: DetectionMethod;
29
+ confidenceLevel: ConfidenceLevel;
30
+ mergeReason: string;
31
+ }
32
+ /**
33
+ * Merge proposal with all details
34
+ */
35
+ export interface MergeProposalDetails {
36
+ proposal: MemoryMergeProposal;
37
+ sourceMemories: Memory[];
38
+ previewMerged: {
39
+ content: string;
40
+ summary: string | null;
41
+ tags: string[];
42
+ metadata: Record<string, unknown>;
43
+ };
44
+ analysis: {
45
+ savedTokens: number;
46
+ savedPercentage: number;
47
+ conflictWarnings: string[];
48
+ };
49
+ }
50
+ /**
51
+ * Merge result after approval
52
+ */
53
+ export interface MergeResult {
54
+ proposalId: string;
55
+ canonicalMemoryId: string;
56
+ mergedMemoryIds: string[];
57
+ tokensSaved: number;
58
+ mergedAt: Date;
59
+ mergeHistoryId?: string;
60
+ }
61
+ /**
62
+ * Merge reversal result
63
+ */
64
+ export interface MergeReversal {
65
+ mergeHistoryId: string;
66
+ canonicalMemoryId: string;
67
+ restoredMemoryIds: string[];
68
+ reversedAt: Date;
69
+ }
70
+ /**
71
+ * Detection statistics
72
+ */
73
+ export interface DetectionStatistics {
74
+ totalMemories: number;
75
+ scannedMemories: number;
76
+ candidatesFound: number;
77
+ candidatesRanked: number;
78
+ estimatedTokensSaved: number;
79
+ timeMs: {
80
+ stage1: number;
81
+ stage2: number;
82
+ total: number;
83
+ };
84
+ }
85
+ /**
86
+ * Project merge statistics
87
+ */
88
+ export interface ProjectMergeStatistics {
89
+ projectId: string;
90
+ totalMemories: number;
91
+ mergeableMemories: number;
92
+ mergedMemories: number;
93
+ canonicalMemories: number;
94
+ pendingProposals: number;
95
+ approvedMerges: number;
96
+ rejectedProposals: number;
97
+ reversedMerges: number;
98
+ tokensSaved: {
99
+ total: number;
100
+ formatted: string;
101
+ percentage: number;
102
+ };
103
+ averageMergeSize: number;
104
+ }
105
+ /**
106
+ * Hash cache entry for fast duplicate detection
107
+ */
108
+ export interface HashCacheEntry {
109
+ memoryId: string;
110
+ simhash: string;
111
+ minhash: number[];
112
+ contentHash: string;
113
+ lastUpdated: Date;
114
+ }
115
+ /**
116
+ * Stage 1 candidate pair with hash distances
117
+ */
118
+ export interface Stage1CandidatePair {
119
+ memoryId1: string;
120
+ memoryId2: string;
121
+ simhashDistance: number;
122
+ minhashSimilarity: number;
123
+ matched: 'simhash' | 'minhash' | 'both';
124
+ }
125
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * TypeScript types and interfaces for memory merging
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -8,9 +8,10 @@ export type AssociationType = 'co_occurred' | 'supersedes' | 'contradicts' | 'su
8
8
  */
9
9
  export declare function createAssociation(fromMemoryId: string, toMemoryId: string, type: AssociationType, weight?: number): Promise<void>;
10
10
  /**
11
- * Track co-activation of multiple memories (they were used together)
12
- * OPTIMIZED: Uses bulk upsert instead of individual database operations
11
+ * Auto-link memories that share entities
12
+ * Called after storing a memory to link it to related memories
13
13
  */
14
+ export declare function autoLinkByEntities(newMemoryId: string, entityNames: string[], projectId: string): Promise<number>;
14
15
  export declare function trackCoactivation(memoryIds: string[]): Promise<void>;
15
16
  /**
16
17
  * Get related memories via the association graph