squish-memory 1.1.5 → 1.2.1

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 (646) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  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 +44 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  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/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
  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/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  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/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
  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/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
  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/{dist/core/places/index.js → core/places/index.ts} +12 -12
  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 +590 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
  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/{dist/core/search/index.js → core/search/index.ts} +4 -5
  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/{dist/core/session/index.js → core/session/index.ts} +7 -7
  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/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
  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/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
  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/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +333 -0
  187. package/db/adapter.ts +215 -0
  188. package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
  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/mcp.json.example +8 -11
  220. package/package.json +140 -159
  221. package/packages/cli/package.json +22 -0
  222. package/packages/cli/src/commands/clean.ts +68 -0
  223. package/packages/cli/src/commands/context.ts +79 -0
  224. package/packages/cli/src/commands/doctor.ts +357 -0
  225. package/packages/cli/src/commands/forget.ts +72 -0
  226. package/packages/cli/src/commands/health.ts +36 -0
  227. package/packages/cli/src/commands/inspect.ts +41 -0
  228. package/packages/cli/src/commands/link.ts +50 -0
  229. package/packages/cli/src/commands/migrate.ts +93 -0
  230. package/packages/cli/src/commands/recall.ts +99 -0
  231. package/packages/cli/src/commands/recent.ts +57 -0
  232. package/packages/cli/src/commands/remember.ts +139 -0
  233. package/packages/cli/src/commands/run.ts +58 -0
  234. package/packages/cli/src/commands/stale.ts +43 -0
  235. package/packages/cli/src/commands/stats.ts +42 -0
  236. package/packages/cli/src/index.ts +57 -0
  237. package/packages/cli/tsconfig.json +24 -0
  238. package/packages/mcp/package.json +26 -0
  239. package/packages/mcp/src/index.ts +940 -0
  240. package/packages/mcp/tsconfig.json +20 -0
  241. package/skills/squish-memory/SKILL.md +38 -35
  242. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  243. package/skills/squish-memory/references/claude-desktop.json +12 -0
  244. package/skills/squish-memory/references/openclaw.json +13 -0
  245. package/skills/squish-memory/references/opencode.json +14 -0
  246. package/config/hooks/claude-code-hooks.json +0 -39
  247. package/config/hooks/cursor-hooks.json +0 -30
  248. package/config/hooks/opencode-hooks.json +0 -30
  249. package/config/hooks/windsurf-hooks.json +0 -30
  250. package/config/mcp-cli-fallback-policy.json +0 -22
  251. package/config/mcp.json +0 -38
  252. package/config/plugin-manifest.json +0 -101
  253. package/config/plugin-manifest.schema.json +0 -244
  254. package/config/plugin.json +0 -32
  255. package/config/remote-memory-policy.json +0 -32
  256. package/core/commands/context-paging.md +0 -51
  257. package/core/commands/context-status.md +0 -22
  258. package/core/commands/context.md +0 -5
  259. package/core/commands/core-memory.md +0 -56
  260. package/core/commands/health.md +0 -5
  261. package/core/commands/init.md +0 -39
  262. package/core/commands/merge.md +0 -113
  263. package/core/commands/recall.md +0 -5
  264. package/core/commands/remember.md +0 -11
  265. package/core/commands/search.md +0 -10
  266. package/dist/config.d.ts +0 -83
  267. package/dist/config.js +0 -242
  268. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  269. package/dist/core/adapters/config/claude-code.js +0 -113
  270. package/dist/core/adapters/config/cursor.d.ts +0 -26
  271. package/dist/core/adapters/config/cursor.js +0 -74
  272. package/dist/core/adapters/config/opencode.d.ts +0 -23
  273. package/dist/core/adapters/config/opencode.js +0 -73
  274. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  275. package/dist/core/adapters/config/windsurf.js +0 -74
  276. package/dist/core/adapters/index.d.ts +0 -45
  277. package/dist/core/adapters/index.js +0 -84
  278. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  279. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  280. package/dist/core/adapters/timeline.d.ts +0 -23
  281. package/dist/core/adapters/timeline.js +0 -88
  282. package/dist/core/adapters/types.d.ts +0 -157
  283. package/dist/core/adapters/types.js +0 -50
  284. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  285. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  286. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  287. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  288. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  289. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  290. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  291. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  292. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  293. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  294. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  295. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  296. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  297. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  298. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  299. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  300. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  301. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  302. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  303. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  304. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  305. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  306. package/dist/core/algorithms/index.d.ts +0 -21
  307. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  308. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  309. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
  310. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  311. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  312. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  313. package/dist/core/algorithms/types.d.ts +0 -133
  314. package/dist/core/algorithms/types.js +0 -5
  315. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  316. package/dist/core/algorithms/utils/response-builder.js +0 -37
  317. package/dist/core/associations.d.ts +0 -31
  318. package/dist/core/associations.js +0 -248
  319. package/dist/core/autosave.d.ts +0 -19
  320. package/dist/core/autosave.js +0 -16
  321. package/dist/core/commands/managed-sync.d.ts +0 -10
  322. package/dist/core/commands/managed-sync.js +0 -64
  323. package/dist/core/commands/mcp-server.d.ts +0 -3
  324. package/dist/core/commands/mcp-server.js +0 -739
  325. package/dist/core/consolidation.d.ts +0 -37
  326. package/dist/core/consolidation.js +0 -248
  327. package/dist/core/context/agent-context.d.ts +0 -106
  328. package/dist/core/context/agent-context.js +0 -274
  329. package/dist/core/context/context-paging.d.ts +0 -80
  330. package/dist/core/context/context-paging.js +0 -328
  331. package/dist/core/context/context-window.d.ts +0 -40
  332. package/dist/core/context/context-window.js +0 -177
  333. package/dist/core/context/context.d.ts +0 -7
  334. package/dist/core/context/context.js +0 -22
  335. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  336. package/dist/core/embeddings/google-multimodal.js +0 -142
  337. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  338. package/dist/core/embeddings/qmd-client.js +0 -403
  339. package/dist/core/embeddings.d.ts +0 -29
  340. package/dist/core/embeddings.js +0 -454
  341. package/dist/core/error-handling.d.ts +0 -63
  342. package/dist/core/error-handling.js +0 -173
  343. package/dist/core/external-folder/index.d.ts +0 -102
  344. package/dist/core/external-folder/index.js +0 -294
  345. package/dist/core/hooks/agent-hooks.d.ts +0 -74
  346. package/dist/core/hooks/agent-hooks.js +0 -244
  347. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  348. package/dist/core/hooks/auto-tagger.js +0 -155
  349. package/dist/core/hooks/capture-filter.d.ts +0 -41
  350. package/dist/core/hooks/capture-filter.js +0 -128
  351. package/dist/core/index.d.ts +0 -10
  352. package/dist/core/index.js +0 -14
  353. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  354. package/dist/core/ingestion/agent-memory.js +0 -109
  355. package/dist/core/ingestion/core-memory.d.ts +0 -78
  356. package/dist/core/ingestion/core-memory.js +0 -226
  357. package/dist/core/ingestion/learnings.d.ts +0 -57
  358. package/dist/core/ingestion/learnings.js +0 -202
  359. package/dist/core/layers/generator.d.ts +0 -25
  360. package/dist/core/layers/generator.js +0 -76
  361. package/dist/core/lib/db-client.js +0 -130
  362. package/dist/core/lib/schemas.d.ts +0 -129
  363. package/dist/core/lib/utils.d.ts +0 -14
  364. package/dist/core/lib/utils.js +0 -90
  365. package/dist/core/lib/validation.d.ts +0 -38
  366. package/dist/core/lib/validation.js +0 -151
  367. package/dist/core/lifecycle.d.ts +0 -26
  368. package/dist/core/lifecycle.js +0 -302
  369. package/dist/core/local-embeddings.d.ts +0 -11
  370. package/dist/core/logger.d.ts +0 -16
  371. package/dist/core/logger.js +0 -40
  372. package/dist/core/mcp/client.d.ts +0 -17
  373. package/dist/core/mcp/client.js +0 -101
  374. package/dist/core/mcp/index.d.ts +0 -6
  375. package/dist/core/mcp/index.js +0 -6
  376. package/dist/core/mcp/server.d.ts +0 -18
  377. package/dist/core/mcp/server.js +0 -157
  378. package/dist/core/mcp/standalone-server.d.ts +0 -13
  379. package/dist/core/mcp/standalone-server.js +0 -46
  380. package/dist/core/mcp/tools.d.ts +0 -9
  381. package/dist/core/mcp/tools.js +0 -365
  382. package/dist/core/mcp/types.d.ts +0 -315
  383. package/dist/core/mcp/types.js +0 -48
  384. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  385. package/dist/core/memory/bridge-discovery.js +0 -291
  386. package/dist/core/memory/categorizer.d.ts +0 -27
  387. package/dist/core/memory/categorizer.js +0 -305
  388. package/dist/core/memory/conflict-detector.d.ts +0 -7
  389. package/dist/core/memory/conflict-detector.js +0 -43
  390. package/dist/core/memory/consolidation.d.ts +0 -42
  391. package/dist/core/memory/consolidation.js +0 -303
  392. package/dist/core/memory/context-collector.d.ts +0 -10
  393. package/dist/core/memory/context-collector.js +0 -56
  394. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  395. package/dist/core/memory/contradiction-resolver.js +0 -368
  396. package/dist/core/memory/edit-workflow.d.ts +0 -19
  397. package/dist/core/memory/edit-workflow.js +0 -120
  398. package/dist/core/memory/entity-extractor.d.ts +0 -33
  399. package/dist/core/memory/entity-extractor.js +0 -336
  400. package/dist/core/memory/entity-resolver.d.ts +0 -23
  401. package/dist/core/memory/entity-resolver.js +0 -64
  402. package/dist/core/memory/fact-extractor.d.ts +0 -24
  403. package/dist/core/memory/fact-extractor.js +0 -89
  404. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  405. package/dist/core/memory/feedback-tracker.js +0 -155
  406. package/dist/core/memory/hooks.d.ts +0 -88
  407. package/dist/core/memory/hooks.js +0 -174
  408. package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
  409. package/dist/core/memory/hybrid-retrieval.js +0 -139
  410. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  411. package/dist/core/memory/hybrid-scorer.js +0 -284
  412. package/dist/core/memory/hybrid-search.d.ts +0 -20
  413. package/dist/core/memory/hybrid-search.js +0 -359
  414. package/dist/core/memory/importance.d.ts +0 -63
  415. package/dist/core/memory/importance.js +0 -298
  416. package/dist/core/memory/index.d.ts +0 -8
  417. package/dist/core/memory/loader.d.ts +0 -31
  418. package/dist/core/memory/loader.js +0 -141
  419. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  420. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  421. package/dist/core/memory/memories.d.ts +0 -47
  422. package/dist/core/memory/memories.js +0 -449
  423. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  424. package/dist/core/memory/memory-lifecycle.js +0 -55
  425. package/dist/core/memory/memory-manager.d.ts +0 -15
  426. package/dist/core/memory/memory-manager.js +0 -46
  427. package/dist/core/memory/migrate.d.ts +0 -21
  428. package/dist/core/memory/migrate.js +0 -134
  429. package/dist/core/memory/normalization.d.ts +0 -22
  430. package/dist/core/memory/normalization.js +0 -26
  431. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  432. package/dist/core/memory/progressive-disclosure.js +0 -280
  433. package/dist/core/memory/query-processor.d.ts +0 -21
  434. package/dist/core/memory/query-processor.js +0 -72
  435. package/dist/core/memory/query-rewriter.d.ts +0 -13
  436. package/dist/core/memory/query-rewriter.js +0 -118
  437. package/dist/core/memory/response-analyzer.d.ts +0 -9
  438. package/dist/core/memory/response-analyzer.js +0 -61
  439. package/dist/core/memory/serialization.d.ts +0 -10
  440. package/dist/core/memory/serialization.js +0 -84
  441. package/dist/core/memory/stats.d.ts +0 -22
  442. package/dist/core/memory/stats.js +0 -138
  443. package/dist/core/memory/telemetry.d.ts +0 -69
  444. package/dist/core/memory/telemetry.js +0 -313
  445. package/dist/core/memory/temporal-facts.d.ts +0 -41
  446. package/dist/core/memory/temporal-facts.js +0 -283
  447. package/dist/core/memory/temporal-parser.d.ts +0 -32
  448. package/dist/core/memory/temporal-parser.js +0 -385
  449. package/dist/core/memory/trigger-detector.d.ts +0 -14
  450. package/dist/core/memory/trigger-detector.js +0 -42
  451. package/dist/core/memory/write-gate.d.ts +0 -54
  452. package/dist/core/memory/write-gate.js +0 -210
  453. package/dist/core/namespaces/index.d.ts +0 -71
  454. package/dist/core/namespaces/index.js +0 -305
  455. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  456. package/dist/core/namespaces/uri-parser.js +0 -74
  457. package/dist/core/obsidian-vault.d.ts +0 -30
  458. package/dist/core/obsidian-vault.js +0 -94
  459. package/dist/core/places/index.d.ts +0 -14
  460. package/dist/core/places/memory-places.d.ts +0 -68
  461. package/dist/core/places/memory-places.js +0 -261
  462. package/dist/core/places/places.d.ts +0 -88
  463. package/dist/core/places/places.js +0 -314
  464. package/dist/core/places/rules.d.ts +0 -74
  465. package/dist/core/places/rules.js +0 -240
  466. package/dist/core/places/walking.d.ts +0 -56
  467. package/dist/core/places/walking.js +0 -121
  468. package/dist/core/projects.d.ts +0 -17
  469. package/dist/core/projects.js +0 -108
  470. package/dist/core/redis.d.ts +0 -11
  471. package/dist/core/redis.js +0 -69
  472. package/dist/core/responses.d.ts +0 -96
  473. package/dist/core/responses.js +0 -122
  474. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  475. package/dist/core/scheduler/cron-scheduler.js +0 -332
  476. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  477. package/dist/core/scheduler/heartbeat.js +0 -73
  478. package/dist/core/scheduler/index.d.ts +0 -8
  479. package/dist/core/scheduler/job-runner.d.ts +0 -11
  480. package/dist/core/scheduler/job-runner.js +0 -164
  481. package/dist/core/search/conversations.d.ts +0 -25
  482. package/dist/core/search/conversations.js +0 -110
  483. package/dist/core/search/entities.d.ts +0 -12
  484. package/dist/core/search/entities.js +0 -31
  485. package/dist/core/search/folder-context.d.ts +0 -25
  486. package/dist/core/search/folder-context.js +0 -119
  487. package/dist/core/search/graph-boost.d.ts +0 -7
  488. package/dist/core/search/graph-boost.js +0 -23
  489. package/dist/core/search/index.d.ts +0 -4
  490. package/dist/core/search/qmd-search.d.ts +0 -61
  491. package/dist/core/search/qmd-search.js +0 -178
  492. package/dist/core/security/encrypt.d.ts +0 -6
  493. package/dist/core/security/encrypt.js +0 -47
  494. package/dist/core/security/governance.d.ts +0 -26
  495. package/dist/core/security/governance.js +0 -79
  496. package/dist/core/security/privacy.d.ts +0 -23
  497. package/dist/core/security/privacy.js +0 -82
  498. package/dist/core/security/secret-detector.d.ts +0 -32
  499. package/dist/core/security/secret-detector.js +0 -88
  500. package/dist/core/session/auto-load.d.ts +0 -6
  501. package/dist/core/session/auto-load.js +0 -119
  502. package/dist/core/session/index.d.ts +0 -7
  503. package/dist/core/session/self-iteration-job.d.ts +0 -20
  504. package/dist/core/session/self-iteration-job.js +0 -282
  505. package/dist/core/session/session-hooks.d.ts +0 -18
  506. package/dist/core/session/session-hooks.js +0 -58
  507. package/dist/core/session/types.d.ts +0 -26
  508. package/dist/core/session/types.js +0 -10
  509. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  510. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  511. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  512. package/dist/core/session-hooks/session-hooks.js +0 -58
  513. package/dist/core/snapshots/cleanup.d.ts +0 -9
  514. package/dist/core/snapshots/comparison.d.ts +0 -19
  515. package/dist/core/snapshots/comparison.js +0 -43
  516. package/dist/core/snapshots/creation.d.ts +0 -19
  517. package/dist/core/snapshots/creation.js +0 -126
  518. package/dist/core/snapshots/retrieval.d.ts +0 -7
  519. package/dist/core/snapshots/retrieval.js +0 -41
  520. package/dist/core/snapshots/stats.d.ts +0 -11
  521. package/dist/core/snapshots/stats.js +0 -52
  522. package/dist/core/snapshots.d.ts +0 -29
  523. package/dist/core/snapshots.js +0 -220
  524. package/dist/core/storage/cache.d.ts +0 -13
  525. package/dist/core/storage/cache.js +0 -202
  526. package/dist/core/storage/database.d.ts +0 -12
  527. package/dist/core/storage/database.js +0 -12
  528. package/dist/core/summarization/cleanup.d.ts +0 -9
  529. package/dist/core/summarization/queries.d.ts +0 -9
  530. package/dist/core/summarization/queries.js +0 -28
  531. package/dist/core/summarization/stats.d.ts +0 -14
  532. package/dist/core/summarization/stats.js +0 -52
  533. package/dist/core/summarization/strategies.d.ts +0 -24
  534. package/dist/core/summarization/strategies.js +0 -28
  535. package/dist/core/summarization.d.ts +0 -37
  536. package/dist/core/summarization.js +0 -188
  537. package/dist/core/sync/qmd-sync.d.ts +0 -94
  538. package/dist/core/sync/qmd-sync.js +0 -201
  539. package/dist/core/temporal-facts.d.ts +0 -54
  540. package/dist/core/temporal-facts.js +0 -193
  541. package/dist/core/toon.d.ts +0 -43
  542. package/dist/core/toon.js +0 -160
  543. package/dist/core/tracing/collector.d.ts +0 -111
  544. package/dist/core/tracing/collector.js +0 -350
  545. package/dist/core/tracing/visualizer.d.ts +0 -32
  546. package/dist/core/tracing/visualizer.js +0 -165
  547. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  548. package/dist/core/utils/cleanup-operations.js +0 -44
  549. package/dist/core/utils/content-extraction.d.ts +0 -19
  550. package/dist/core/utils/content-extraction.js +0 -75
  551. package/dist/core/utils/filter-builder.d.ts +0 -13
  552. package/dist/core/utils/filter-builder.js +0 -44
  553. package/dist/core/utils/history-traversal.d.ts +0 -13
  554. package/dist/core/utils/history-traversal.js +0 -50
  555. package/dist/core/utils/memory-operations.d.ts +0 -17
  556. package/dist/core/utils/memory-operations.js +0 -43
  557. package/dist/core/utils/query-operations.d.ts +0 -18
  558. package/dist/core/utils/query-operations.js +0 -65
  559. package/dist/core/utils/summarization-helpers.d.ts +0 -21
  560. package/dist/core/utils/summarization-helpers.js +0 -38
  561. package/dist/core/utils/temporal-queries.d.ts +0 -13
  562. package/dist/core/utils/temporal-queries.js +0 -27
  563. package/dist/core/utils/vector-operations.d.ts +0 -71
  564. package/dist/core/utils/version-management.d.ts +0 -9
  565. package/dist/core/utils/version-management.js +0 -61
  566. package/dist/core/worker.d.ts +0 -82
  567. package/dist/core/worker.js +0 -272
  568. package/dist/db/adapter.d.ts +0 -7
  569. package/dist/db/adapter.js +0 -175
  570. package/dist/db/bootstrap.d.ts +0 -9
  571. package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
  572. package/dist/db/drizzle/schema-sqlite.js +0 -684
  573. package/dist/db/drizzle/schema.d.ts +0 -4082
  574. package/dist/db/drizzle/schema.js +0 -770
  575. package/dist/db/drizzle.config.d.ts +0 -3
  576. package/dist/db/drizzle.config.js +0 -12
  577. package/dist/db/index.d.ts +0 -7
  578. package/dist/db/index.js +0 -89
  579. package/dist/db/neon.d.ts +0 -8
  580. package/dist/db/neon.js +0 -20
  581. package/dist/db/schema/index.d.ts +0 -40
  582. package/dist/db/schema/index.js +0 -105
  583. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  584. package/dist/db/schema/tables/context-sessions.js +0 -37
  585. package/dist/db/schema/tables/conversations.d.ts +0 -9
  586. package/dist/db/schema/tables/conversations.js +0 -47
  587. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  588. package/dist/db/schema/tables/core-memory.js +0 -41
  589. package/dist/db/schema/tables/entities.d.ts +0 -9
  590. package/dist/db/schema/tables/entities.js +0 -39
  591. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  592. package/dist/db/schema/tables/entity-relations.js +0 -31
  593. package/dist/db/schema/tables/learnings.d.ts +0 -9
  594. package/dist/db/schema/tables/learnings.js +0 -66
  595. package/dist/db/schema/tables/memories.d.ts +0 -9
  596. package/dist/db/schema/tables/memories.js +0 -161
  597. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  598. package/dist/db/schema/tables/memory-associations.js +0 -39
  599. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  600. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  601. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  602. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  603. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  604. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  605. package/dist/db/schema/tables/messages.d.ts +0 -9
  606. package/dist/db/schema/tables/messages.js +0 -41
  607. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  608. package/dist/db/schema/tables/namespaces.js +0 -37
  609. package/dist/db/schema/tables/projects.d.ts +0 -9
  610. package/dist/db/schema/tables/projects.js +0 -31
  611. package/dist/db/schema/tables/users.d.ts +0 -9
  612. package/dist/db/schema/tables/users.js +0 -27
  613. package/dist/db/schema.d.ts +0 -3
  614. package/dist/db/schema.js +0 -11
  615. package/dist/db/supabase.d.ts +0 -9
  616. package/dist/db/supabase.js +0 -24
  617. package/dist/index.d.ts +0 -7
  618. package/dist/index.js +0 -1677
  619. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  620. package/dist/webui/server.d.ts +0 -5
  621. package/dist/webui/server.js +0 -642
  622. package/generated/mcp/manifest.json +0 -23
  623. package/generated/mcp/mcp-servers.json +0 -25
  624. package/generated/mcp/mcporter.json +0 -34
  625. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  626. package/generated/mcp/runtime.json +0 -12
  627. package/scripts/README.md +0 -60
  628. package/scripts/build-release.sh +0 -36
  629. package/scripts/check-secrets.js +0 -132
  630. package/scripts/copy-runtime-assets.mjs +0 -26
  631. package/scripts/generate-mcp.mjs +0 -264
  632. package/scripts/github-release.sh +0 -77
  633. package/scripts/init-dirs.mjs +0 -13
  634. package/scripts/install-claude-code.sh +0 -85
  635. package/scripts/install-cursor.sh +0 -56
  636. package/scripts/install-hooks.sh +0 -73
  637. package/scripts/install-interactive.mjs +0 -357
  638. package/scripts/install-opencode.sh +0 -75
  639. package/scripts/install-plugin.mjs +0 -415
  640. package/scripts/install-windsurf.sh +0 -67
  641. package/scripts/remote-preflight.mjs +0 -62
  642. package/scripts/squish-fallback.mjs +0 -132
  643. package/scripts/test-interactive.mjs +0 -131
  644. package/scripts/verify-mcp.mjs +0 -214
  645. package/skills/squish-memory/scripts/install.mjs +0 -335
  646. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Reverses/undoes a completed merge and restores original memories.
3
+ */
4
+
5
+ import type { Memory } from '../../../db/drizzle/schema.js';
6
+ import { getDb } from '../../../db/index.js';
7
+ import { getSchema } from '../../../db/schema.js';
8
+ import { createDatabaseClient } from '../../../core/storage/database.js';
9
+ import { eq } from 'drizzle-orm';
10
+
11
+ interface ReverseMergeInput {
12
+ mergeHistoryId: string;
13
+ reason?: string;
14
+ }
15
+
16
+ interface ReverseMergeResponse {
17
+ ok: boolean;
18
+ message: string;
19
+ data?: {
20
+ mergeHistoryId: string;
21
+ canonicalMemoryId: string;
22
+ restoredMemoryIds: string[];
23
+ reversedAt: string;
24
+ };
25
+ error?: string;
26
+ }
27
+
28
+ export async function handleReverseMerge(input: ReverseMergeInput): Promise<ReverseMergeResponse> {
29
+ try {
30
+ const { mergeHistoryId, reason } = input;
31
+
32
+ if (!mergeHistoryId) {
33
+ return {
34
+ ok: false,
35
+ message: 'mergeHistoryId is required',
36
+ error: 'mergeHistoryId is required',
37
+ };
38
+ }
39
+
40
+ const db = createDatabaseClient(await getDb());
41
+ const schema = await getSchema();
42
+
43
+ // Step 1: Load merge history record
44
+ const [history] = await db
45
+ .select()
46
+ .from(schema.memoryMergeHistory)
47
+ .where(eq(schema.memoryMergeHistory.id, mergeHistoryId));
48
+
49
+ if (!history) {
50
+ return {
51
+ ok: false,
52
+ message: 'Merge history record not found',
53
+ error: `Merge history ${mergeHistoryId} not found`,
54
+ };
55
+ }
56
+
57
+ // Check if already reversed
58
+ if (history.isReversed) {
59
+ return {
60
+ ok: false,
61
+ message: 'Merge already reversed',
62
+ error: 'This merge has already been reversed',
63
+ };
64
+ }
65
+
66
+ // Step 2: Load and mark canonical memory as inactive
67
+ const [canonicalMemory] = await db
68
+ .select()
69
+ .from(schema.memories)
70
+ .where(eq(schema.memories.id, history.canonicalMemoryId));
71
+
72
+ if (!canonicalMemory) {
73
+ return {
74
+ ok: false,
75
+ message: 'Canonical memory not found',
76
+ error: `Canonical memory ${history.canonicalMemoryId} not found`,
77
+ };
78
+ }
79
+
80
+ const now = new Date();
81
+
82
+ // Step 3: Restore source memories from snapshot
83
+ const sourceSnapshot = (history.sourceMemoriesSnapshot as unknown as Array<Record<string, any>>) || [];
84
+ const sourceMemoryIds = (history.sourceMemoryIds as unknown as string[]) || [];
85
+
86
+ if (sourceSnapshot.length === 0) {
87
+ return {
88
+ ok: false,
89
+ message: 'No snapshot data to restore from',
90
+ error: 'Merge history has no source memories snapshot',
91
+ };
92
+ }
93
+
94
+ // Restore each memory from snapshot
95
+ for (const snapshotData of sourceSnapshot) {
96
+ const memoryId = snapshotData.id;
97
+
98
+ // Load current state of the memory (should be marked as merged)
99
+ const [currentMemory] = await db
100
+ .select()
101
+ .from(schema.memories)
102
+ .where(eq(schema.memories.id, memoryId));
103
+
104
+ if (currentMemory) {
105
+ // Restore to original state
106
+ await db
107
+ .update(schema.memories)
108
+ .set({
109
+ isMerged: false,
110
+ mergedIntoId: null,
111
+ mergedAt: null,
112
+ isActive: true,
113
+ updatedAt: now,
114
+ })
115
+ .where(eq(schema.memories.id, memoryId));
116
+ }
117
+ }
118
+
119
+ // Step 4: Deactivate canonical memory
120
+ await db
121
+ .update(schema.memories)
122
+ .set({
123
+ isActive: false,
124
+ updatedAt: now,
125
+ })
126
+ .where(eq(schema.memories.id, history.canonicalMemoryId));
127
+
128
+ // Step 5: Update merge history record
129
+ await db
130
+ .update(schema.memoryMergeHistory)
131
+ .set({
132
+ isReversed: true,
133
+ reversedAt: now,
134
+ reversedBy: canonicalMemory.userId,
135
+ })
136
+ .where(eq(schema.memoryMergeHistory.id, mergeHistoryId));
137
+
138
+ return {
139
+ ok: true,
140
+ message: `Merge reversed successfully. Restored ${sourceMemoryIds.length} memories`,
141
+ data: {
142
+ mergeHistoryId,
143
+ canonicalMemoryId: history.canonicalMemoryId,
144
+ restoredMemoryIds: sourceMemoryIds,
145
+ reversedAt: now.toISOString(),
146
+ },
147
+ };
148
+ } catch (error) {
149
+ return {
150
+ ok: false,
151
+ message: 'Failed to reverse merge',
152
+ error: error instanceof Error ? error.message : 'Unknown error',
153
+ };
154
+ }
155
+ }
@@ -1,26 +1,39 @@
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
1
+ /**
2
+ * Memory Merging Feature - Barrel Exports
3
+ *
4
+ * Provides a clean public API for memory merging functionality
5
+ */
6
+
7
+ // Types
8
+ export * from './types.js';
9
+
10
+ // Detection
11
+ export { detectDuplicates, analyzeMergePair, getDetectionStats } from './detection/two-stage-detector.js';
12
+ export { SimHashFilter, MinHashFilter, findCandidatePairs } from './detection/hash-filters.js';
13
+ export { rankCandidates, analyzePair } from './detection/semantic-ranker.js';
14
+
15
+ // Merge Strategies
16
+ export { getMergeStrategy, mergeMemories, MERGE_STRATEGIES } from './strategies/merge-strategies.js';
17
+ export type { MergeStrategy, MergedMemory } from './strategies/merge-strategies.js';
18
+
19
+ // Safety
20
+ export { runSafetyChecks, checkBlockers, formatSafetyResults, describeSafetyChecks } from './safety/safety-checks.js';
21
+
22
+ // Analytics & Tokens
23
+ export {
24
+ estimateTokensSaved,
25
+ calculateProjectTokenSavings,
26
+ estimateMergeSavingsPreview,
27
+ getTokenStatistics,
28
+ formatTokenCount,
29
+ formatSavingsReport,
30
+ } from './analytics/token-estimator.js';
31
+
32
+ // Handlers (MCP Tools)
33
+ export { handleDetectDuplicates } from './handlers/detect-duplicates.js';
34
+ export { handleListProposals } from './handlers/list-proposals.js';
35
+ export { handlePreviewMerge } from './handlers/preview-merge.js';
36
+ export { handleApproveMerge } from './handlers/approve-merge.js';
37
+ export { handleRejectMerge } from './handlers/reject-merge.js';
38
+ export { handleReverseMerge } from './handlers/reverse-merge.js';
39
+ export { handleGetMergeStats } from './handlers/get-stats.js';
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Hash cache maintenance - SimHash/MinHash signatures for duplicate detection
3
+ */
4
+
5
+ import { getDb } from '../../../db/index.js';
6
+ import { getSchema } from '../../../db/schema.js';
7
+ import { createDatabaseClient } from '../../../core/storage/database.js';
8
+ import { eq } from 'drizzle-orm';
9
+ import { SimHashFilter, MinHashFilter } from '../detection/hash-filters.js';
10
+ import crypto from 'crypto';
11
+ import { logger } from '../../../core/logger.js';
12
+
13
+ function hashContent(content: string): string {
14
+ return crypto.createHash('md5').update(content).digest('hex');
15
+ }
16
+
17
+ export async function updateCache(memoryId: string): Promise<boolean> {
18
+ try {
19
+ const db = createDatabaseClient(await getDb());
20
+ const schema = await getSchema();
21
+
22
+ // Load the memory
23
+ const [memory] = await db
24
+ .select()
25
+ .from(schema.memories)
26
+ .where(eq(schema.memories.id, memoryId));
27
+
28
+ if (!memory) {
29
+ return false;
30
+ }
31
+
32
+ // Generate hashes
33
+ const simhashFilter = new SimHashFilter();
34
+ const minhashFilter = new MinHashFilter();
35
+
36
+ const simhash = simhashFilter.generateHash(memory.content);
37
+ const minhash = minhashFilter.generateSignature(memory.content);
38
+ const contentHash = hashContent(memory.content);
39
+
40
+ // Upsert cache entry
41
+ const now = new Date();
42
+
43
+ // Check if entry exists
44
+ const [existing] = await db
45
+ .select()
46
+ .from(schema.memoryHashCache)
47
+ .where(eq(schema.memoryHashCache.memoryId, memoryId));
48
+
49
+ if (existing) {
50
+ // Update existing
51
+ await db
52
+ .update(schema.memoryHashCache)
53
+ .set({
54
+ simhash,
55
+ minhash: minhash,
56
+ contentHash,
57
+ lastUpdated: now,
58
+ })
59
+ .where(eq(schema.memoryHashCache.memoryId, memoryId));
60
+ } else {
61
+ // Create new
62
+ await db.insert(schema.memoryHashCache).values({
63
+ memoryId,
64
+ projectId: memory.projectId,
65
+ simhash,
66
+ minhash: minhash,
67
+ contentHash,
68
+ lastUpdated: now,
69
+ } as any);
70
+ }
71
+
72
+ return true;
73
+ } catch (error) {
74
+ logger.error(`Failed to update hash cache for ${memoryId}`, error);
75
+ return false;
76
+ }
77
+ }
78
+
79
+ export async function rebuildCache(projectId: string): Promise<{
80
+ processed: number;
81
+ succeeded: number;
82
+ failed: number;
83
+ }> {
84
+ try {
85
+ const db = createDatabaseClient(await getDb());
86
+ const schema = await getSchema();
87
+
88
+ // Get all memories in project
89
+ const memories: any[] = await db
90
+ .select()
91
+ .from(schema.memories)
92
+ .where(eq(schema.memories.projectId, projectId));
93
+
94
+ let succeeded = 0;
95
+ let failed = 0;
96
+
97
+ for (const memory of memories) {
98
+ const ok = await updateCache(memory.id);
99
+ if (ok) {
100
+ succeeded++;
101
+ } else {
102
+ failed++;
103
+ }
104
+ }
105
+
106
+ return {
107
+ processed: memories.length,
108
+ succeeded,
109
+ failed,
110
+ };
111
+ } catch (error) {
112
+ logger.error(`Failed to rebuild hash cache for project ${projectId}`, error);
113
+ return { processed: 0, succeeded: 0, failed: 0 };
114
+ }
115
+ }
116
+
117
+ export async function isStale(memoryId: string): Promise<boolean> {
118
+ try {
119
+ const db = createDatabaseClient(await getDb());
120
+ const schema = await getSchema();
121
+
122
+ const [memory] = await db
123
+ .select()
124
+ .from(schema.memories)
125
+ .where(eq(schema.memories.id, memoryId));
126
+
127
+ if (!memory) {
128
+ return true;
129
+ }
130
+
131
+ const [cacheEntry] = await db
132
+ .select()
133
+ .from(schema.memoryHashCache)
134
+ .where(eq(schema.memoryHashCache.memoryId, memoryId));
135
+
136
+ if (!cacheEntry) {
137
+ return true; // No cache entry = stale
138
+ }
139
+
140
+ const currentContentHash = hashContent(memory.content);
141
+ return currentContentHash !== cacheEntry.contentHash;
142
+ } catch (error) {
143
+ logger.error('Failed to check hash cache staleness', error);
144
+ return true; // Assume stale on error
145
+ }
146
+ }
147
+
148
+ export async function cleanupOrphaned(projectId: string): Promise<number> {
149
+ try {
150
+ const db = createDatabaseClient(await getDb());
151
+ const schema = await getSchema();
152
+
153
+ // Get all cache entries for project
154
+ const cacheEntries: any[] = await db
155
+ .select()
156
+ .from(schema.memoryHashCache)
157
+ .where(eq(schema.memoryHashCache.projectId, projectId));
158
+
159
+ let deleted = 0;
160
+
161
+ for (const entry of cacheEntries) {
162
+ // Check if memory exists
163
+ const [memory] = await db
164
+ .select()
165
+ .from(schema.memories)
166
+ .where(eq(schema.memories.id, entry.memoryId));
167
+
168
+ if (!memory) {
169
+ // Memory doesn't exist, delete cache entry
170
+ await db
171
+ .delete(schema.memoryHashCache)
172
+ .where(eq(schema.memoryHashCache.memoryId, entry.memoryId));
173
+ deleted++;
174
+ }
175
+ }
176
+
177
+ return deleted;
178
+ } catch (error) {
179
+ logger.error('Failed to cleanup orphaned hash cache', error);
180
+ return 0;
181
+ }
182
+ }
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Safety checks to prevent bad merges.
3
+ * Checks run before creating merge proposals and are categorized as BLOCKER or WARNING.
4
+ */
5
+
6
+ import type { Memory } from '../../../db/drizzle/schema.js';
7
+ import type { SafetyCheckResult } from '../../lib/types.js';
8
+
9
+ export interface SafetyCheck {
10
+ name: string;
11
+ description: string;
12
+ type: 'blocker' | 'warning'; // How to treat failures
13
+ check(memories: Memory[], metadata?: Record<string, unknown>): SafetyCheckResult;
14
+ }
15
+
16
+ const PASSED_RESULT: SafetyCheckResult = { passed: true, warnings: [], blockers: [] };
17
+
18
+ function createBlockerCheck(
19
+ name: string,
20
+ description: string,
21
+ checkFn: (memories: Memory[], metadata?: Record<string, unknown>) => { passed: boolean; blockers: string[] }
22
+ ): SafetyCheck {
23
+ return {
24
+ name,
25
+ description,
26
+ type: 'blocker',
27
+ check: (memories, metadata) => {
28
+ const result = checkFn(memories, metadata);
29
+ return result.passed ? PASSED_RESULT : { passed: false, warnings: [], blockers: result.blockers };
30
+ },
31
+ };
32
+ }
33
+
34
+ function createWarningCheck(
35
+ name: string,
36
+ description: string,
37
+ checkFn: (memories: Memory[], metadata?: Record<string, unknown>) => { warnings: string[] }
38
+ ): SafetyCheck {
39
+ return {
40
+ name,
41
+ description,
42
+ type: 'warning',
43
+ check: (memories, metadata) => {
44
+ const result = checkFn(memories, metadata);
45
+ return { passed: true, warnings: result.warnings, blockers: [] };
46
+ },
47
+ };
48
+ }
49
+
50
+ export const SAFETY_CHECKS: SafetyCheck[] = [
51
+ createBlockerCheck(
52
+ 'immutability',
53
+ 'Prevent merging immutable memories',
54
+ (memories) => {
55
+ const immutableMemories = memories.filter((m) => !m.isMergeable);
56
+ if (immutableMemories.length === 0) {
57
+ return { passed: true, blockers: [] };
58
+ }
59
+ return {
60
+ passed: false,
61
+ blockers: [
62
+ `Cannot merge: ${immutableMemories.length} memory(ies) marked as immutable`,
63
+ `IDs: ${immutableMemories.map((m) => m.id).join(', ')}`,
64
+ ],
65
+ };
66
+ }
67
+ ),
68
+
69
+ createBlockerCheck(
70
+ 'type_consistency',
71
+ 'Ensure all memories are same type',
72
+ (memories) => {
73
+ const types = new Set(memories.map((m) => m.type));
74
+ if (types.size <= 1) {
75
+ return { passed: true, blockers: [] };
76
+ }
77
+ return {
78
+ passed: false,
79
+ blockers: [
80
+ `Cannot merge different types: ${Array.from(types).join(', ')}`,
81
+ 'All memories must be same type (fact, preference, decision, etc.)',
82
+ ],
83
+ };
84
+ }
85
+ ),
86
+
87
+ createBlockerCheck(
88
+ 'already_merged',
89
+ 'Prevent re-merging of previously merged memories',
90
+ (memories) => {
91
+ const alreadyMerged = memories.filter((m) => m.isMerged);
92
+ if (alreadyMerged.length === 0) {
93
+ return { passed: true, blockers: [] };
94
+ }
95
+ return {
96
+ passed: false,
97
+ blockers: [
98
+ `Cannot merge: ${alreadyMerged.length} memory(ies) already merged`,
99
+ 'Already-merged memories should not be re-merged. Undo previous merge first.',
100
+ ],
101
+ };
102
+ }
103
+ ),
104
+
105
+ createBlockerCheck(
106
+ 'min_similarity',
107
+ 'Ensure similarity is above minimum threshold',
108
+ (memories, metadata) => {
109
+ const minThreshold = 0.70;
110
+ if (!metadata || !('similarityScore' in metadata)) {
111
+ return { passed: true, blockers: [] };
112
+ }
113
+ const similarity = metadata.similarityScore as number;
114
+ if (similarity >= minThreshold) {
115
+ return { passed: true, blockers: [] };
116
+ }
117
+ return {
118
+ passed: false,
119
+ blockers: [
120
+ `Similarity too low: ${(similarity * 100).toFixed(1)}%`,
121
+ `Minimum required: ${(minThreshold * 100).toFixed(0)}%`,
122
+ 'Increase similarity threshold or select more similar memories',
123
+ ],
124
+ };
125
+ }
126
+ ),
127
+
128
+ createWarningCheck(
129
+ 'multi_user',
130
+ 'Warn about merging memories from different users',
131
+ (memories) => {
132
+ const users = new Set(memories.map((m) => m.userId).filter(Boolean));
133
+ if (users.size <= 1) {
134
+ return { warnings: [] };
135
+ }
136
+ return {
137
+ warnings: [
138
+ `Merging memories from ${users.size} different users`,
139
+ 'This is usually not recommended. Ensure you want to consolidate user-specific memories.',
140
+ ],
141
+ };
142
+ }
143
+ ),
144
+
145
+ createWarningCheck(
146
+ 'privacy',
147
+ 'Warn about mixing private and non-private memories',
148
+ (memories) => {
149
+ const privacyStates = new Set(memories.map((m) => m.isPrivate));
150
+ if (privacyStates.size <= 1) {
151
+ return { warnings: [] };
152
+ }
153
+ return {
154
+ warnings: [
155
+ 'Merging private and non-private memories',
156
+ 'The merged result will inherit the privacy setting of the canonical memory',
157
+ ],
158
+ };
159
+ }
160
+ ),
161
+
162
+ createWarningCheck(
163
+ 'secrets',
164
+ 'Warn about merging memories with detected secrets',
165
+ (memories) => {
166
+ const withSecrets = memories.filter((m) => m.hasSecrets);
167
+ if (withSecrets.length === 0) {
168
+ return { warnings: [] };
169
+ }
170
+ return {
171
+ warnings: [
172
+ `${withSecrets.length} memory(ies) contain detected secrets`,
173
+ 'Ensure merged content does not expose sensitive information',
174
+ 'Consider redacting secrets before merging',
175
+ ],
176
+ };
177
+ }
178
+ ),
179
+
180
+ createBlockerCheck(
181
+ 'active_status',
182
+ 'Ensure all memories are active',
183
+ (memories) => {
184
+ const inactive = memories.filter((m) => !m.isActive);
185
+ if (inactive.length === 0) {
186
+ return { passed: true, blockers: [] };
187
+ }
188
+ return {
189
+ passed: false,
190
+ blockers: [
191
+ `Cannot merge: ${inactive.length} memory(ies) are inactive (archived/expired)`,
192
+ 'Only active memories can be merged',
193
+ ],
194
+ };
195
+ }
196
+ ),
197
+ ];
198
+
199
+ export function runSafetyChecks(
200
+ memories: Memory[],
201
+ metadata?: Record<string, unknown>
202
+ ): SafetyCheckResult {
203
+ const results = SAFETY_CHECKS.map((check) => check.check(memories, metadata));
204
+
205
+ const allBlockers = results.flatMap((r) => r.blockers);
206
+ const allWarnings = results.flatMap((r) => r.warnings);
207
+
208
+ return {
209
+ passed: allBlockers.length === 0,
210
+ warnings: allWarnings,
211
+ blockers: allBlockers,
212
+ };
213
+ }
214
+
215
+ export function checkBlockers(memories: Memory[]): boolean {
216
+ const blockerChecks = SAFETY_CHECKS.filter((c) => c.type === 'blocker');
217
+
218
+ for (const check of blockerChecks) {
219
+ const result = check.check(memories);
220
+ if (!result.passed) {
221
+ return false;
222
+ }
223
+ }
224
+
225
+ return true;
226
+ }
227
+
228
+ export function formatSafetyResults(result: SafetyCheckResult): string {
229
+ if (result.passed && result.warnings.length === 0) {
230
+ return 'All safety checks passed';
231
+ }
232
+
233
+ const lines: string[] = [];
234
+
235
+ if (!result.passed && result.blockers.length > 0) {
236
+ lines.push('BLOCKERS (merge prevented):');
237
+ for (const blocker of result.blockers) {
238
+ lines.push(` ✗ ${blocker}`);
239
+ }
240
+ }
241
+
242
+ if (result.warnings.length > 0) {
243
+ lines.push('WARNINGS (merge allowed with caution):');
244
+ for (const warning of result.warnings) {
245
+ lines.push(` ⚠ ${warning}`);
246
+ }
247
+ }
248
+
249
+ return lines.join('\n');
250
+ }
251
+
252
+ export function describeSafetyChecks(): string {
253
+ return SAFETY_CHECKS.map(
254
+ (check) => `${check.name} [${check.type}]: ${check.description}`
255
+ ).join('\n');
256
+ }