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,381 @@
1
+ /**
2
+ * Type-specific merge strategies for different memory types.
3
+ * Each type has different merge semantics to preserve meaning and prevent data loss.
4
+ */
5
+
6
+ import type { Memory, MemoryType } from '../../../db/drizzle/schema.js';
7
+
8
+ export interface MergeStrategy {
9
+ type: MemoryType;
10
+ /**
11
+ * Merge a set of source memories into a single canonical memory
12
+ */
13
+ merge(sources: Memory[]): MergedMemory;
14
+ /**
15
+ * Check if memories can be safely merged
16
+ * Returns { ok, reason } where reason explains why merging is not allowed
17
+ */
18
+ canMerge(sources: Memory[]): { ok: boolean; reason?: string };
19
+ }
20
+
21
+ export interface MergedMemory {
22
+ content: string;
23
+ summary: string | null;
24
+ tags: string[];
25
+ metadata: Record<string, unknown>;
26
+ mergeReason: string;
27
+ conflictWarnings: string[];
28
+ }
29
+
30
+ /**
31
+ * Base implementation of MergeStrategy with common functionality.
32
+ * Reduces code duplication across specific merge strategies.
33
+ */
34
+ export abstract class BaseMergeStrategy implements MergeStrategy {
35
+ abstract type: MemoryType;
36
+
37
+ canMerge(sources: Memory[]): { ok: boolean; reason?: string } {
38
+ if (sources.length < 2) {
39
+ return { ok: false, reason: 'Need at least 2 memories to merge' };
40
+ }
41
+ return { ok: true };
42
+ }
43
+
44
+ protected validateSources(sources: Memory[]): boolean {
45
+ return sources.length >= 2;
46
+ }
47
+
48
+ protected handleEmptySources(): MergedMemory {
49
+ return {
50
+ content: '',
51
+ summary: null,
52
+ tags: [],
53
+ metadata: {},
54
+ mergeReason: 'Empty source set',
55
+ conflictWarnings: [],
56
+ };
57
+ }
58
+
59
+ protected mergeTags(sources: Memory[]): string[] {
60
+ const tagSet = new Set<string>();
61
+ for (const source of sources) {
62
+ for (const tag of source.tags || []) {
63
+ tagSet.add(tag);
64
+ }
65
+ }
66
+ return Array.from(tagSet);
67
+ }
68
+
69
+ protected buildBaseMetadata(
70
+ sources: Memory[],
71
+ extra?: Record<string, unknown>
72
+ ): Record<string, unknown> {
73
+ return {
74
+ mergedFrom: sources.map((m) => m.id),
75
+ mergeCount: sources.length,
76
+ ...extra,
77
+ };
78
+ }
79
+
80
+ protected sortByDate(
81
+ sources: Memory[],
82
+ order: 'asc' | 'desc' = 'desc'
83
+ ): Memory[] {
84
+ const sorted = [...sources].sort(
85
+ (a, b) => new Date(b.createdAt!).getTime() - new Date(a.createdAt!).getTime()
86
+ );
87
+ return order === 'asc' ? [...sorted].reverse() : sorted;
88
+ }
89
+
90
+ protected sortChronologically(sources: Memory[]): Memory[] {
91
+ return [...sources].sort(
92
+ (a, b) => new Date(a.createdAt!).getTime() - new Date(b.createdAt!).getTime()
93
+ );
94
+ }
95
+
96
+ // Abstract method each subclass must implement
97
+ abstract merge(sources: Memory[]): MergedMemory;
98
+ }
99
+
100
+ /**
101
+ * FACT strategy: Union of information, remove exact duplicates.
102
+ * Combines all unique facts into a unified statement with provenance tracking.
103
+ */
104
+ class FactMergeStrategy extends BaseMergeStrategy {
105
+ type: MemoryType = 'fact';
106
+
107
+ merge(sources: Memory[]): MergedMemory {
108
+ if (sources.length === 0) {
109
+ return this.handleEmptySources();
110
+ }
111
+
112
+ // Split content into sentences and deduplicate
113
+ const sentenceSet = new Set<string>();
114
+ const timestamps: string[] = [];
115
+
116
+ for (const source of sources) {
117
+ // Extract sentences (split by period, exclamation, question)
118
+ const sentences = source.content
119
+ .split(/[.!?]\s+/)
120
+ .map((s: string) => s.trim())
121
+ .filter((s: string) => s.length > 0);
122
+
123
+ for (const sentence of sentences) {
124
+ sentenceSet.add(sentence);
125
+ }
126
+
127
+ if (source.createdAt) {
128
+ timestamps.push(source.createdAt);
129
+ }
130
+ }
131
+
132
+ // Sort sentences for consistency
133
+ const mergedSentences = Array.from(sentenceSet).sort();
134
+ const content = mergedSentences.join('. ') + (mergedSentences.length > 0 ? '.' : '');
135
+
136
+ // Build merged metadata with provenance
137
+ const metadata = this.buildBaseMetadata(sources, {
138
+ timestamps: timestamps.sort(),
139
+ });
140
+
141
+ return {
142
+ content,
143
+ summary: null,
144
+ tags: this.mergeTags(sources),
145
+ metadata,
146
+ mergeReason: `Merged ${sources.length} facts by combining all unique statements`,
147
+ conflictWarnings: [],
148
+ };
149
+ }
150
+ }
151
+
152
+ /**
153
+ * PREFERENCE strategy: Keep latest by timestamp, track evolution history.
154
+ * Warns if preferences conflict, indicating user changed their mind.
155
+ */
156
+ class PreferenceMergeStrategy extends BaseMergeStrategy {
157
+ type: MemoryType = 'preference';
158
+
159
+ merge(sources: Memory[]): MergedMemory {
160
+ if (sources.length === 0) {
161
+ return this.handleEmptySources();
162
+ }
163
+
164
+ // Sort by creation date (newest first)
165
+ const sorted = this.sortByDate(sources);
166
+
167
+ const latest = sorted[0];
168
+ const warnings: string[] = [];
169
+
170
+ // Check for conflicting preferences
171
+ const uniqueContents = new Set(sources.map((m) => m.content));
172
+ if (uniqueContents.size > 1) {
173
+ warnings.push(`Multiple preferences detected: ${Array.from(uniqueContents).join(', ')}`);
174
+ warnings.push(`Using latest preference from ${latest.createdAt || 'unknown date'}`);
175
+ }
176
+
177
+ // Build history timeline
178
+ const history = sorted.map((m) => ({
179
+ preference: m.content,
180
+ createdAt: m.createdAt,
181
+ confidence: m.confidence || 100,
182
+ source: m.source,
183
+ }));
184
+
185
+ const metadata = this.buildBaseMetadata(sources, {
186
+ preferenceHistory: history,
187
+ latestAt: latest.createdAt,
188
+ });
189
+
190
+ const summary =
191
+ sources.length > 1
192
+ ? `Prefers: ${latest.content} (evolved from ${sources.length} preferences)`
193
+ : null;
194
+
195
+ return {
196
+ content: latest.content,
197
+ summary,
198
+ tags: latest.tags || [],
199
+ metadata,
200
+ mergeReason: `Merged ${sources.length} preference records, keeping latest from ${latest.createdAt}`,
201
+ conflictWarnings: warnings,
202
+ };
203
+ }
204
+ }
205
+
206
+ /**
207
+ * DECISION strategy: Keep latest decision, link to previous ones in timeline.
208
+ * Warns if decisions contradict, preserving rationale history.
209
+ */
210
+ class DecisionMergeStrategy extends BaseMergeStrategy {
211
+ type: MemoryType = 'decision';
212
+
213
+ merge(sources: Memory[]): MergedMemory {
214
+ if (sources.length === 0) {
215
+ return this.handleEmptySources();
216
+ }
217
+
218
+ // Sort by creation date (newest first)
219
+ const sorted = this.sortByDate(sources);
220
+
221
+ const latest = sorted[0];
222
+ const warnings: string[] = [];
223
+
224
+ // Check for conflicting decisions
225
+ const uniqueDecisions = new Set(sources.map((m) => m.content));
226
+ if (uniqueDecisions.size > 1) {
227
+ warnings.push(
228
+ `Decision changed: was ${sorted[sorted.length - 1].content}, now ${latest.content}`
229
+ );
230
+ }
231
+
232
+ // Build decision timeline
233
+ const timeline = sorted.map((m) => ({
234
+ decision: m.content,
235
+ createdAt: m.createdAt,
236
+ confidence: m.confidence || 100,
237
+ rationale: m.summary || 'No rationale recorded',
238
+ }));
239
+
240
+ const metadata = this.buildBaseMetadata(sources, {
241
+ decisionTimeline: timeline,
242
+ currentDecisionAt: latest.createdAt,
243
+ supersedes: sorted.slice(1).map((m) => m.id),
244
+ });
245
+
246
+ const summary = sources.length > 1 ? `Decided: ${latest.content} (${sources.length} decisions)` : null;
247
+
248
+ return {
249
+ content: latest.content,
250
+ summary,
251
+ tags: latest.tags || [],
252
+ metadata,
253
+ mergeReason: `Merged ${sources.length} decision records, keeping latest from ${latest.createdAt}`,
254
+ conflictWarnings: warnings,
255
+ };
256
+ }
257
+ }
258
+
259
+ /**
260
+ * OBSERVATION strategy: Aggregate observations in chronological order.
261
+ * Preserves temporal patterns and frequency information.
262
+ */
263
+ class ObservationMergeStrategy extends BaseMergeStrategy {
264
+ type: MemoryType = 'observation';
265
+
266
+ merge(sources: Memory[]): MergedMemory {
267
+ if (sources.length === 0) {
268
+ return this.handleEmptySources();
269
+ }
270
+
271
+ // Sort chronologically
272
+ const sorted = this.sortChronologically(sources);
273
+
274
+ // Create observation summary
275
+ const observations = sorted.map((m) => `• ${m.content}`).join('\n');
276
+
277
+ const metadata = this.buildBaseMetadata(sources, {
278
+ observationCount: sources.length,
279
+ timeSpan: {
280
+ start: sorted[0].createdAt,
281
+ end: sorted[sorted.length - 1].createdAt,
282
+ },
283
+ chronologicalOrder: sorted.map((m) => ({
284
+ id: m.id,
285
+ content: m.content,
286
+ createdAt: m.createdAt,
287
+ })),
288
+ });
289
+
290
+ return {
291
+ content: `Observations (${sources.length} total):\n${observations}`,
292
+ summary: `${sources.length} observations over time period`,
293
+ tags: this.mergeTags(sources),
294
+ metadata,
295
+ mergeReason: `Merged ${sources.length} observations chronologically`,
296
+ conflictWarnings: [],
297
+ };
298
+ }
299
+ }
300
+
301
+ /**
302
+ * CONTEXT strategy: Union of unique context, remove exact duplicates.
303
+ * Preserves all distinct context items.
304
+ */
305
+ class ContextMergeStrategy extends BaseMergeStrategy {
306
+ type: MemoryType = 'context';
307
+
308
+ merge(sources: Memory[]): MergedMemory {
309
+ if (sources.length === 0) {
310
+ return this.handleEmptySources();
311
+ }
312
+
313
+ // Deduplicate by content (exact matches)
314
+ const uniqueContexts = new Map<string, Memory>();
315
+ for (const source of sources) {
316
+ if (!uniqueContexts.has(source.content)) {
317
+ uniqueContexts.set(source.content, source);
318
+ }
319
+ }
320
+
321
+ // Format as list
322
+ const contextList = Array.from(uniqueContexts.keys())
323
+ .sort()
324
+ .map((content) => `• ${content}`)
325
+ .join('\n');
326
+
327
+ const metadata = this.buildBaseMetadata(sources, {
328
+ uniqueContextCount: uniqueContexts.size,
329
+ totalContextCount: sources.length,
330
+ deduplicatedEntries: sources.length - uniqueContexts.size,
331
+ });
332
+
333
+ return {
334
+ content: contextList,
335
+ summary: `${uniqueContexts.size} context items (${sources.length} total)`,
336
+ tags: this.mergeTags(sources),
337
+ metadata,
338
+ mergeReason: `Merged ${sources.length} context records into ${uniqueContexts.size} unique items`,
339
+ conflictWarnings: [],
340
+ };
341
+ }
342
+ }
343
+
344
+ export const MERGE_STRATEGIES: Record<MemoryType, MergeStrategy> = {
345
+ fact: new FactMergeStrategy(),
346
+ preference: new PreferenceMergeStrategy(),
347
+ decision: new DecisionMergeStrategy(),
348
+ observation: new ObservationMergeStrategy(),
349
+ context: new ContextMergeStrategy(),
350
+ reflection: new ObservationMergeStrategy(),
351
+ note: new ObservationMergeStrategy(), // jot uses observation strategy
352
+ };
353
+
354
+ export function getMergeStrategy(type: MemoryType): MergeStrategy {
355
+ const strategy = MERGE_STRATEGIES[type];
356
+ if (!strategy) {
357
+ throw new Error(`No merge strategy defined for type: ${type}`);
358
+ }
359
+ return strategy;
360
+ }
361
+
362
+ export function mergeMemories(sources: Memory[]): MergedMemory {
363
+ if (sources.length === 0) {
364
+ throw new Error('Cannot merge: no source memories');
365
+ }
366
+
367
+ // All sources must be same type
368
+ const type = sources[0].type;
369
+ const allSameType = sources.every((m) => m.type === type);
370
+ if (!allSameType) {
371
+ throw new Error('Cannot merge: memories must be same type');
372
+ }
373
+
374
+ const strategy = getMergeStrategy(type);
375
+ const canMerge = strategy.canMerge(sources);
376
+ if (!canMerge.ok) {
377
+ throw new Error(`Cannot merge: ${canMerge.reason}`);
378
+ }
379
+
380
+ return strategy.merge(sources);
381
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * TypeScript types and interfaces for memory merging
3
+ */
4
+
5
+ import type { Memory, MemoryMergeProposal, MemoryMergeHistory } from '../../db/drizzle/schema.js';
6
+ import type { SafetyCheckResult } from '../../core/lib/types.js';
7
+
8
+ /**
9
+ * Merge proposal status
10
+ */
11
+ export type MergeProposalStatus = 'pending' | 'approved' | 'rejected' | 'expired';
12
+
13
+ /**
14
+ * Confidence level for merge suggestions
15
+ */
16
+ export type ConfidenceLevel = 'high' | 'medium' | 'low';
17
+
18
+ /**
19
+ * Detection method used to find duplicates
20
+ */
21
+ export type DetectionMethod = 'simhash' | 'minhash' | 'embedding';
22
+
23
+ /**
24
+ * Merge strategy type per memory type
25
+ */
26
+ export type MergeStrategyType = 'union' | 'latest' | 'voting' | 'custom';
27
+
28
+ /**
29
+ * Memory pair candidate for merging
30
+ */
31
+ export interface MemoryMergePair {
32
+ memory1: Memory;
33
+ memory2: Memory;
34
+ similarityScore: number;
35
+ detectionMethod: DetectionMethod;
36
+ confidenceLevel: ConfidenceLevel;
37
+ mergeReason: string;
38
+ }
39
+
40
+ /**
41
+ * Merge proposal with all details
42
+ */
43
+ export interface MergeProposalDetails {
44
+ proposal: MemoryMergeProposal;
45
+ sourceMemories: Memory[];
46
+ previewMerged: {
47
+ content: string;
48
+ summary: string | null;
49
+ tags: string[];
50
+ metadata: Record<string, unknown>;
51
+ };
52
+ analysis: {
53
+ savedTokens: number;
54
+ savedPercentage: number;
55
+ conflictWarnings: string[];
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Merge result after approval
61
+ */
62
+ export interface MergeResult {
63
+ proposalId: string;
64
+ canonicalMemoryId: string;
65
+ mergedMemoryIds: string[];
66
+ tokensSaved: number;
67
+ mergedAt: Date;
68
+ mergeHistoryId?: string;
69
+ }
70
+
71
+ /**
72
+ * Merge reversal result
73
+ */
74
+ export interface MergeReversal {
75
+ mergeHistoryId: string;
76
+ canonicalMemoryId: string;
77
+ restoredMemoryIds: string[];
78
+ reversedAt: Date;
79
+ }
80
+
81
+ /**
82
+ * Detection statistics
83
+ */
84
+ export interface DetectionStatistics {
85
+ totalMemories: number;
86
+ scannedMemories: number;
87
+ candidatesFound: number;
88
+ candidatesRanked: number;
89
+ estimatedTokensSaved: number;
90
+ timeMs: {
91
+ stage1: number;
92
+ stage2: number;
93
+ total: number;
94
+ };
95
+ }
96
+
97
+ /**
98
+ * Project merge statistics
99
+ */
100
+ export interface ProjectMergeStatistics {
101
+ projectId: string;
102
+ totalMemories: number;
103
+ mergeableMemories: number;
104
+ mergedMemories: number;
105
+ canonicalMemories: number;
106
+ pendingProposals: number;
107
+ approvedMerges: number;
108
+ rejectedProposals: number;
109
+ reversedMerges: number;
110
+ tokensSaved: {
111
+ total: number;
112
+ formatted: string;
113
+ percentage: number;
114
+ };
115
+ averageMergeSize: number;
116
+ }
117
+
118
+
119
+
120
+ /**
121
+ * Hash cache entry for fast duplicate detection
122
+ */
123
+ export interface HashCacheEntry {
124
+ memoryId: string;
125
+ simhash: string;
126
+ minhash: number[];
127
+ contentHash: string;
128
+ lastUpdated: Date;
129
+ }
130
+
131
+ /**
132
+ * Stage 1 candidate pair with hash distances
133
+ */
134
+ export interface Stage1CandidatePair {
135
+ memoryId1: string;
136
+ memoryId2: string;
137
+ simhashDistance: number;
138
+ minhashSimilarity: number;
139
+ matched: 'simhash' | 'minhash' | 'both';
140
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Unified response builder for algorithm handlers
3
+ * Provides consistent response formatting across all algorithm handlers
4
+ */
5
+
6
+ export interface ErrorResponse {
7
+ ok: false;
8
+ message: string;
9
+ error: string;
10
+ }
11
+
12
+ export interface SuccessResponse<T = unknown> {
13
+ ok: true;
14
+ message: string;
15
+ data?: T;
16
+ }
17
+
18
+ export type ApiResponse<T = unknown> = ErrorResponse | SuccessResponse<T>;
19
+
20
+ /**
21
+ * Build a success response with optional data
22
+ */
23
+ export function buildSuccessResponse<T = unknown>(
24
+ message: string,
25
+ data?: T
26
+ ): SuccessResponse<T> {
27
+ const response: SuccessResponse<T> = { ok: true, message };
28
+ if (data !== undefined) {
29
+ response.data = data;
30
+ }
31
+ return response;
32
+ }
33
+
34
+ /**
35
+ * Build an error response
36
+ */
37
+ export function buildErrorResponse(
38
+ message: string,
39
+ error?: unknown
40
+ ): ErrorResponse {
41
+ return {
42
+ ok: false,
43
+ message,
44
+ error: error instanceof Error ? error.message : String(error || 'Unknown error'),
45
+ };
46
+ }
47
+
48
+ /**
49
+ * Wrap async handlers with consistent error handling
50
+ */
51
+ export async function withErrorHandler<T>(
52
+ handler: () => Promise<T>,
53
+ errorMessage: string
54
+ ): Promise<ApiResponse<T>> {
55
+ try {
56
+ const result = await handler();
57
+ return buildSuccessResponse(errorMessage, result);
58
+ } catch (error) {
59
+ return buildErrorResponse(errorMessage, error);
60
+ }
61
+ }