squish-memory 1.2.0 → 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 (449) hide show
  1. package/bin/squish-mcp.mjs +40 -42
  2. package/core/scheduler/cron-scheduler.ts +10 -1
  3. package/core/worker.ts +10 -1
  4. package/package.json +119 -119
  5. package/packages/mcp/src/index.ts +99 -36
  6. package/dist/config.d.ts +0 -106
  7. package/dist/config.js +0 -194
  8. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  9. package/dist/core/adapters/config/claude-code.js +0 -113
  10. package/dist/core/adapters/config/cursor.d.ts +0 -26
  11. package/dist/core/adapters/config/cursor.js +0 -74
  12. package/dist/core/adapters/config/opencode.d.ts +0 -23
  13. package/dist/core/adapters/config/opencode.js +0 -73
  14. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  15. package/dist/core/adapters/config/windsurf.js +0 -74
  16. package/dist/core/adapters/index.d.ts +0 -45
  17. package/dist/core/adapters/index.js +0 -84
  18. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  19. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  20. package/dist/core/adapters/timeline.d.ts +0 -23
  21. package/dist/core/adapters/timeline.js +0 -88
  22. package/dist/core/adapters/types.d.ts +0 -137
  23. package/dist/core/adapters/types.js +0 -50
  24. package/dist/core/agent-preferences.d.ts +0 -16
  25. package/dist/core/agent-preferences.js +0 -124
  26. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  27. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  28. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  29. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  30. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  31. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  32. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  33. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  34. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  35. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  36. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  37. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  38. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  39. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  40. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  41. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  42. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  43. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  44. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  45. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  46. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  47. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  48. package/dist/core/algorithms/index.d.ts +0 -21
  49. package/dist/core/algorithms/index.js +0 -26
  50. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  51. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  52. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -18
  53. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  54. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  55. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  56. package/dist/core/algorithms/types.d.ts +0 -125
  57. package/dist/core/algorithms/types.js +0 -5
  58. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  59. package/dist/core/algorithms/utils/response-builder.js +0 -37
  60. package/dist/core/associations.d.ts +0 -33
  61. package/dist/core/associations.js +0 -284
  62. package/dist/core/autosave.d.ts +0 -19
  63. package/dist/core/autosave.js +0 -16
  64. package/dist/core/beliefs/decay.d.ts +0 -27
  65. package/dist/core/beliefs/decay.js +0 -217
  66. package/dist/core/beliefs/extractor.d.ts +0 -9
  67. package/dist/core/beliefs/extractor.js +0 -113
  68. package/dist/core/beliefs/store.d.ts +0 -46
  69. package/dist/core/beliefs/store.js +0 -466
  70. package/dist/core/beliefs/types.d.ts +0 -28
  71. package/dist/core/beliefs/types.js +0 -2
  72. package/dist/core/commands/mcp-server.d.ts +0 -2
  73. package/dist/core/commands/mcp-server.js +0 -6
  74. package/dist/core/commands/remember.d.ts +0 -24
  75. package/dist/core/commands/remember.js +0 -144
  76. package/dist/core/compression.d.ts +0 -45
  77. package/dist/core/compression.js +0 -160
  78. package/dist/core/consolidation.d.ts +0 -37
  79. package/dist/core/consolidation.js +0 -248
  80. package/dist/core/context/agent-context.d.ts +0 -106
  81. package/dist/core/context/agent-context.js +0 -274
  82. package/dist/core/context/context-paging.d.ts +0 -80
  83. package/dist/core/context/context-paging.js +0 -328
  84. package/dist/core/context/context-window.d.ts +0 -40
  85. package/dist/core/context/context-window.js +0 -177
  86. package/dist/core/context/context.d.ts +0 -7
  87. package/dist/core/context/context.js +0 -22
  88. package/dist/core/embeddings/embeddings.d.ts +0 -29
  89. package/dist/core/embeddings/embeddings.js +0 -546
  90. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  91. package/dist/core/embeddings/google-multimodal.js +0 -146
  92. package/dist/core/embeddings/local-embeddings.d.ts +0 -11
  93. package/dist/core/embeddings/local-embeddings.js +0 -11
  94. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  95. package/dist/core/embeddings/qmd-client.js +0 -403
  96. package/dist/core/embeddings/transformers-local.d.ts +0 -64
  97. package/dist/core/embeddings/transformers-local.js +0 -213
  98. package/dist/core/embeddings.d.ts +0 -2
  99. package/dist/core/embeddings.js +0 -3
  100. package/dist/core/error-handling.d.ts +0 -63
  101. package/dist/core/error-handling.js +0 -173
  102. package/dist/core/graph/entity-deduplicator.d.ts +0 -24
  103. package/dist/core/graph/entity-deduplicator.js +0 -183
  104. package/dist/core/graph/graph-builder.d.ts +0 -46
  105. package/dist/core/graph/graph-builder.js +0 -174
  106. package/dist/core/graph/graph-traversal.d.ts +0 -80
  107. package/dist/core/graph/graph-traversal.js +0 -315
  108. package/dist/core/graph/index.d.ts +0 -19
  109. package/dist/core/graph/index.js +0 -13
  110. package/dist/core/graph/llm-entity-extractor.d.ts +0 -49
  111. package/dist/core/graph/llm-entity-extractor.js +0 -313
  112. package/dist/core/graph/multi-hop-retrieval.d.ts +0 -48
  113. package/dist/core/graph/multi-hop-retrieval.js +0 -215
  114. package/dist/core/graph/relationship-extractor.d.ts +0 -48
  115. package/dist/core/graph/relationship-extractor.js +0 -351
  116. package/dist/core/hooks/agent-hooks.d.ts +0 -83
  117. package/dist/core/hooks/agent-hooks.js +0 -521
  118. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  119. package/dist/core/hooks/auto-tagger.js +0 -155
  120. package/dist/core/hooks/capture-filter.d.ts +0 -41
  121. package/dist/core/hooks/capture-filter.js +0 -128
  122. package/dist/core/hot-cache.d.ts +0 -86
  123. package/dist/core/hot-cache.js +0 -285
  124. package/dist/core/index.d.ts +0 -10
  125. package/dist/core/index.js +0 -11
  126. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  127. package/dist/core/ingestion/agent-memory.js +0 -109
  128. package/dist/core/ingestion/core-memory.d.ts +0 -78
  129. package/dist/core/ingestion/core-memory.js +0 -226
  130. package/dist/core/ingestion/learnings.d.ts +0 -57
  131. package/dist/core/ingestion/learnings.js +0 -205
  132. package/dist/core/ingestion/signal-engine.d.ts +0 -41
  133. package/dist/core/ingestion/signal-engine.js +0 -201
  134. package/dist/core/integrations/obsidian-vault.d.ts +0 -31
  135. package/dist/core/integrations/obsidian-vault.js +0 -156
  136. package/dist/core/layers/generator.d.ts +0 -25
  137. package/dist/core/layers/generator.js +0 -76
  138. package/dist/core/lib/db-client.d.ts +0 -114
  139. package/dist/core/lib/db-client.js +0 -130
  140. package/dist/core/lib/parse-embedding.d.ts +0 -9
  141. package/dist/core/lib/parse-embedding.js +0 -58
  142. package/dist/core/lib/schemas.d.ts +0 -132
  143. package/dist/core/lib/schemas.js +0 -87
  144. package/dist/core/lib/types.d.ts +0 -45
  145. package/dist/core/lib/types.js +0 -6
  146. package/dist/core/lib/utils.d.ts +0 -18
  147. package/dist/core/lib/utils.js +0 -145
  148. package/dist/core/lib/validation.d.ts +0 -38
  149. package/dist/core/lib/validation.js +0 -151
  150. package/dist/core/lifecycle.d.ts +0 -25
  151. package/dist/core/lifecycle.js +0 -292
  152. package/dist/core/logger.d.ts +0 -17
  153. package/dist/core/logger.js +0 -46
  154. package/dist/core/mcp/client.d.ts +0 -17
  155. package/dist/core/mcp/client.js +0 -101
  156. package/dist/core/mcp/index.d.ts +0 -6
  157. package/dist/core/mcp/index.js +0 -6
  158. package/dist/core/mcp/server.d.ts +0 -18
  159. package/dist/core/mcp/server.js +0 -157
  160. package/dist/core/mcp/standalone-server.d.ts +0 -13
  161. package/dist/core/mcp/standalone-server.js +0 -46
  162. package/dist/core/mcp/tools.d.ts +0 -7
  163. package/dist/core/mcp/tools.js +0 -278
  164. package/dist/core/mcp/types.d.ts +0 -87
  165. package/dist/core/mcp/types.js +0 -48
  166. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  167. package/dist/core/memory/bridge-discovery.js +0 -291
  168. package/dist/core/memory/categorizer.d.ts +0 -27
  169. package/dist/core/memory/categorizer.js +0 -306
  170. package/dist/core/memory/conflict-detector.d.ts +0 -7
  171. package/dist/core/memory/conflict-detector.js +0 -43
  172. package/dist/core/memory/consolidation.d.ts +0 -42
  173. package/dist/core/memory/consolidation.js +0 -277
  174. package/dist/core/memory/context-collector.d.ts +0 -10
  175. package/dist/core/memory/context-collector.js +0 -56
  176. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  177. package/dist/core/memory/contradiction-resolver.js +0 -368
  178. package/dist/core/memory/edit-workflow.d.ts +0 -19
  179. package/dist/core/memory/edit-workflow.js +0 -120
  180. package/dist/core/memory/entity-extractor.d.ts +0 -37
  181. package/dist/core/memory/entity-extractor.js +0 -350
  182. package/dist/core/memory/entity-resolver.d.ts +0 -23
  183. package/dist/core/memory/entity-resolver.js +0 -64
  184. package/dist/core/memory/explain.d.ts +0 -18
  185. package/dist/core/memory/explain.js +0 -92
  186. package/dist/core/memory/fact-deriver.d.ts +0 -31
  187. package/dist/core/memory/fact-deriver.js +0 -236
  188. package/dist/core/memory/fact-extractor.d.ts +0 -24
  189. package/dist/core/memory/fact-extractor.js +0 -89
  190. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  191. package/dist/core/memory/feedback-tracker.js +0 -155
  192. package/dist/core/memory/hooks.d.ts +0 -88
  193. package/dist/core/memory/hooks.js +0 -174
  194. package/dist/core/memory/hybrid-retrieval.d.ts +0 -27
  195. package/dist/core/memory/hybrid-retrieval.js +0 -37
  196. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  197. package/dist/core/memory/hybrid-scorer.js +0 -267
  198. package/dist/core/memory/hybrid-search.d.ts +0 -23
  199. package/dist/core/memory/hybrid-search.js +0 -596
  200. package/dist/core/memory/importance.d.ts +0 -46
  201. package/dist/core/memory/importance.js +0 -241
  202. package/dist/core/memory/index.d.ts +0 -9
  203. package/dist/core/memory/index.js +0 -11
  204. package/dist/core/memory/loader.d.ts +0 -31
  205. package/dist/core/memory/loader.js +0 -141
  206. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  207. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  208. package/dist/core/memory/memories.d.ts +0 -43
  209. package/dist/core/memory/memories.js +0 -452
  210. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  211. package/dist/core/memory/memory-lifecycle.js +0 -47
  212. package/dist/core/memory/memory-manager.d.ts +0 -15
  213. package/dist/core/memory/memory-manager.js +0 -46
  214. package/dist/core/memory/migrate.d.ts +0 -21
  215. package/dist/core/memory/migrate.js +0 -134
  216. package/dist/core/memory/normalization.d.ts +0 -7
  217. package/dist/core/memory/normalization.js +0 -26
  218. package/dist/core/memory/path-strengthener.d.ts +0 -39
  219. package/dist/core/memory/path-strengthener.js +0 -150
  220. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  221. package/dist/core/memory/progressive-disclosure.js +0 -280
  222. package/dist/core/memory/query-processor.d.ts +0 -21
  223. package/dist/core/memory/query-processor.js +0 -106
  224. package/dist/core/memory/query-rewriter.d.ts +0 -13
  225. package/dist/core/memory/query-rewriter.js +0 -118
  226. package/dist/core/memory/response-analyzer.d.ts +0 -9
  227. package/dist/core/memory/response-analyzer.js +0 -61
  228. package/dist/core/memory/retrieval-feedback.d.ts +0 -70
  229. package/dist/core/memory/retrieval-feedback.js +0 -213
  230. package/dist/core/memory/serialization.d.ts +0 -10
  231. package/dist/core/memory/serialization.js +0 -84
  232. package/dist/core/memory/stale-cleaner.d.ts +0 -26
  233. package/dist/core/memory/stale-cleaner.js +0 -97
  234. package/dist/core/memory/stats.d.ts +0 -32
  235. package/dist/core/memory/stats.js +0 -143
  236. package/dist/core/memory/telemetry.d.ts +0 -69
  237. package/dist/core/memory/telemetry.js +0 -313
  238. package/dist/core/memory/temporal-facts.d.ts +0 -41
  239. package/dist/core/memory/temporal-facts.js +0 -283
  240. package/dist/core/memory/temporal-parser.d.ts +0 -32
  241. package/dist/core/memory/temporal-parser.js +0 -385
  242. package/dist/core/memory/trigger-detector.d.ts +0 -21
  243. package/dist/core/memory/trigger-detector.js +0 -79
  244. package/dist/core/memory/write-gate.d.ts +0 -54
  245. package/dist/core/memory/write-gate.js +0 -210
  246. package/dist/core/places/index.d.ts +0 -14
  247. package/dist/core/places/index.js +0 -14
  248. package/dist/core/places/memory-places.d.ts +0 -68
  249. package/dist/core/places/memory-places.js +0 -261
  250. package/dist/core/places/places.d.ts +0 -88
  251. package/dist/core/places/places.js +0 -314
  252. package/dist/core/places/rules.d.ts +0 -74
  253. package/dist/core/places/rules.js +0 -240
  254. package/dist/core/places/walking.d.ts +0 -56
  255. package/dist/core/places/walking.js +0 -121
  256. package/dist/core/projects.d.ts +0 -17
  257. package/dist/core/projects.js +0 -116
  258. package/dist/core/redis.d.ts +0 -11
  259. package/dist/core/redis.js +0 -69
  260. package/dist/core/responses.d.ts +0 -96
  261. package/dist/core/responses.js +0 -122
  262. package/dist/core/runtime/trust-report.d.ts +0 -102
  263. package/dist/core/runtime/trust-report.js +0 -107
  264. package/dist/core/runtime/trust-state.d.ts +0 -12
  265. package/dist/core/runtime/trust-state.js +0 -309
  266. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  267. package/dist/core/scheduler/cron-scheduler.js +0 -493
  268. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  269. package/dist/core/scheduler/heartbeat.js +0 -73
  270. package/dist/core/scheduler/index.d.ts +0 -8
  271. package/dist/core/scheduler/index.js +0 -8
  272. package/dist/core/scheduler/job-runner.d.ts +0 -11
  273. package/dist/core/scheduler/job-runner.js +0 -164
  274. package/dist/core/search/conversations.d.ts +0 -25
  275. package/dist/core/search/conversations.js +0 -110
  276. package/dist/core/search/entities.d.ts +0 -12
  277. package/dist/core/search/entities.js +0 -31
  278. package/dist/core/search/folder-context.d.ts +0 -25
  279. package/dist/core/search/folder-context.js +0 -119
  280. package/dist/core/search/graph-boost.d.ts +0 -7
  281. package/dist/core/search/graph-boost.js +0 -23
  282. package/dist/core/search/index.d.ts +0 -4
  283. package/dist/core/search/index.js +0 -5
  284. package/dist/core/search/qmd-wrapper.d.ts +0 -36
  285. package/dist/core/search/qmd-wrapper.js +0 -58
  286. package/dist/core/security/encrypt.d.ts +0 -6
  287. package/dist/core/security/encrypt.js +0 -47
  288. package/dist/core/security/governance.d.ts +0 -26
  289. package/dist/core/security/governance.js +0 -79
  290. package/dist/core/security/privacy.d.ts +0 -23
  291. package/dist/core/security/privacy.js +0 -82
  292. package/dist/core/security/secret-detector.d.ts +0 -32
  293. package/dist/core/security/secret-detector.js +0 -88
  294. package/dist/core/session/auto-load.d.ts +0 -6
  295. package/dist/core/session/auto-load.js +0 -144
  296. package/dist/core/session/entity-tracker.d.ts +0 -62
  297. package/dist/core/session/entity-tracker.js +0 -287
  298. package/dist/core/session/index.d.ts +0 -7
  299. package/dist/core/session/index.js +0 -7
  300. package/dist/core/session/reference-resolver.d.ts +0 -26
  301. package/dist/core/session/reference-resolver.js +0 -121
  302. package/dist/core/session/self-iteration-job.d.ts +0 -35
  303. package/dist/core/session/self-iteration-job.js +0 -387
  304. package/dist/core/session/session-hooks.d.ts +0 -18
  305. package/dist/core/session/session-hooks.js +0 -58
  306. package/dist/core/session/types.d.ts +0 -26
  307. package/dist/core/session/types.js +0 -10
  308. package/dist/core/session/working-set.d.ts +0 -50
  309. package/dist/core/session/working-set.js +0 -212
  310. package/dist/core/snapshots/cleanup.d.ts +0 -9
  311. package/dist/core/snapshots/cleanup.js +0 -12
  312. package/dist/core/snapshots/comparison.d.ts +0 -19
  313. package/dist/core/snapshots/comparison.js +0 -43
  314. package/dist/core/snapshots/creation.d.ts +0 -13
  315. package/dist/core/snapshots/creation.js +0 -117
  316. package/dist/core/snapshots/retrieval.d.ts +0 -7
  317. package/dist/core/snapshots/retrieval.js +0 -41
  318. package/dist/core/snapshots/stats.d.ts +0 -11
  319. package/dist/core/snapshots/stats.js +0 -52
  320. package/dist/core/storage/cache.d.ts +0 -13
  321. package/dist/core/storage/cache.js +0 -202
  322. package/dist/core/storage/database.d.ts +0 -12
  323. package/dist/core/storage/database.js +0 -12
  324. package/dist/core/summarization/cleanup.d.ts +0 -9
  325. package/dist/core/summarization/cleanup.js +0 -12
  326. package/dist/core/summarization/queries.d.ts +0 -9
  327. package/dist/core/summarization/queries.js +0 -28
  328. package/dist/core/summarization/stats.d.ts +0 -14
  329. package/dist/core/summarization/stats.js +0 -52
  330. package/dist/core/summarization/strategies.d.ts +0 -24
  331. package/dist/core/summarization/strategies.js +0 -28
  332. package/dist/core/summarization.d.ts +0 -37
  333. package/dist/core/summarization.js +0 -188
  334. package/dist/core/temporal-facts.d.ts +0 -54
  335. package/dist/core/temporal-facts.js +0 -193
  336. package/dist/core/tracing/collector.d.ts +0 -111
  337. package/dist/core/tracing/collector.js +0 -350
  338. package/dist/core/tracing/visualizer.d.ts +0 -32
  339. package/dist/core/tracing/visualizer.js +0 -165
  340. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  341. package/dist/core/utils/cleanup-operations.js +0 -44
  342. package/dist/core/utils/content-extraction.d.ts +0 -19
  343. package/dist/core/utils/content-extraction.js +0 -75
  344. package/dist/core/utils/filter-builder.d.ts +0 -13
  345. package/dist/core/utils/filter-builder.js +0 -44
  346. package/dist/core/utils/history-traversal.d.ts +0 -13
  347. package/dist/core/utils/history-traversal.js +0 -50
  348. package/dist/core/utils/memory-operations.d.ts +0 -17
  349. package/dist/core/utils/memory-operations.js +0 -43
  350. package/dist/core/utils/query-operations.d.ts +0 -18
  351. package/dist/core/utils/query-operations.js +0 -65
  352. package/dist/core/utils/summarization-helpers.d.ts +0 -17
  353. package/dist/core/utils/summarization-helpers.js +0 -33
  354. package/dist/core/utils/temporal-queries.d.ts +0 -13
  355. package/dist/core/utils/temporal-queries.js +0 -27
  356. package/dist/core/utils/vector-operations.d.ts +0 -71
  357. package/dist/core/utils/vector-operations.js +0 -129
  358. package/dist/core/utils/version-management.d.ts +0 -9
  359. package/dist/core/utils/version-management.js +0 -61
  360. package/dist/core/worker.d.ts +0 -82
  361. package/dist/core/worker.js +0 -272
  362. package/dist/db/adapter.d.ts +0 -7
  363. package/dist/db/adapter.js +0 -175
  364. package/dist/db/bootstrap.d.ts +0 -11
  365. package/dist/db/bootstrap.js +0 -1034
  366. package/dist/db/drizzle/schema-sqlite.d.ts +0 -5538
  367. package/dist/db/drizzle/schema-sqlite.js +0 -763
  368. package/dist/db/drizzle/schema.d.ts +0 -4734
  369. package/dist/db/drizzle/schema.js +0 -859
  370. package/dist/db/drizzle.config.d.ts +0 -3
  371. package/dist/db/drizzle.config.js +0 -12
  372. package/dist/db/index.d.ts +0 -7
  373. package/dist/db/index.js +0 -89
  374. package/dist/db/migrations/associations.d.ts +0 -6
  375. package/dist/db/migrations/associations.js +0 -29
  376. package/dist/db/migrations/beliefs.d.ts +0 -10
  377. package/dist/db/migrations/beliefs.js +0 -76
  378. package/dist/db/migrations/core-memory.d.ts +0 -6
  379. package/dist/db/migrations/core-memory.js +0 -29
  380. package/dist/db/migrations/fts.d.ts +0 -6
  381. package/dist/db/migrations/fts.js +0 -52
  382. package/dist/db/migrations/index.d.ts +0 -25
  383. package/dist/db/migrations/index.js +0 -51
  384. package/dist/db/migrations/indexes.d.ts +0 -6
  385. package/dist/db/migrations/indexes.js +0 -30
  386. package/dist/db/migrations/learnings.d.ts +0 -7
  387. package/dist/db/migrations/learnings.js +0 -26
  388. package/dist/db/migrations/maintenance.d.ts +0 -6
  389. package/dist/db/migrations/maintenance.js +0 -61
  390. package/dist/db/migrations/memories.d.ts +0 -7
  391. package/dist/db/migrations/memories.js +0 -16
  392. package/dist/db/migrations/memory-places.d.ts +0 -6
  393. package/dist/db/migrations/memory-places.js +0 -29
  394. package/dist/db/migrations/places.d.ts +0 -6
  395. package/dist/db/migrations/places.js +0 -43
  396. package/dist/db/migrations/projects.d.ts +0 -3
  397. package/dist/db/migrations/projects.js +0 -13
  398. package/dist/db/migrations/tier-conversion.d.ts +0 -7
  399. package/dist/db/migrations/tier-conversion.js +0 -20
  400. package/dist/db/neon.d.ts +0 -8
  401. package/dist/db/neon.js +0 -20
  402. package/dist/db/schema/beliefs.d.ts +0 -9
  403. package/dist/db/schema/beliefs.js +0 -46
  404. package/dist/db/schema/generator.d.ts +0 -38
  405. package/dist/db/schema/generator.js +0 -108
  406. package/dist/db/schema/index.d.ts +0 -39
  407. package/dist/db/schema/index.js +0 -51
  408. package/dist/db/schema/learnings.d.ts +0 -7
  409. package/dist/db/schema/learnings.js +0 -30
  410. package/dist/db/schema/memories.d.ts +0 -7
  411. package/dist/db/schema/memories.js +0 -81
  412. package/dist/db/schema/projects.d.ts +0 -4
  413. package/dist/db/schema/projects.js +0 -31
  414. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  415. package/dist/db/schema/tables/context-sessions.js +0 -37
  416. package/dist/db/schema/tables/conversations.d.ts +0 -9
  417. package/dist/db/schema/tables/conversations.js +0 -47
  418. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  419. package/dist/db/schema/tables/core-memory.js +0 -41
  420. package/dist/db/schema/tables/entities.d.ts +0 -9
  421. package/dist/db/schema/tables/entities.js +0 -39
  422. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  423. package/dist/db/schema/tables/entity-relations.js +0 -31
  424. package/dist/db/schema/tables/learnings.d.ts +0 -9
  425. package/dist/db/schema/tables/learnings.js +0 -66
  426. package/dist/db/schema/tables/memories.d.ts +0 -9
  427. package/dist/db/schema/tables/memories.js +0 -161
  428. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  429. package/dist/db/schema/tables/memory-associations.js +0 -39
  430. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  431. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  432. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  433. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  434. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  435. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  436. package/dist/db/schema/tables/messages.d.ts +0 -9
  437. package/dist/db/schema/tables/messages.js +0 -41
  438. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  439. package/dist/db/schema/tables/namespaces.js +0 -37
  440. package/dist/db/schema/tables/projects.d.ts +0 -9
  441. package/dist/db/schema/tables/projects.js +0 -31
  442. package/dist/db/schema/tables/users.d.ts +0 -9
  443. package/dist/db/schema/tables/users.js +0 -27
  444. package/dist/db/schema.d.ts +0 -3
  445. package/dist/db/schema.js +0 -11
  446. package/dist/db/supabase.d.ts +0 -9
  447. package/dist/db/supabase.js +0 -24
  448. package/dist/packages/mcp/src/index.d.ts +0 -3
  449. package/dist/packages/mcp/src/index.js +0 -733
@@ -1,118 +0,0 @@
1
- /**
2
- * Semantic ranking using embeddings (Stage 2 of two-stage detection).
3
- * Ranks candidates from Stage 1 by semantic similarity using cosine distance.
4
- */
5
- import { cosineSimilarity } from '../../../core/utils/vector-operations.js';
6
- function calculateConfidence(memory1, memory2, cosineSim) {
7
- if (cosineSim >= 0.90) {
8
- const factors = calculateConfidenceFactors(memory1, memory2);
9
- if (factors.sameType && factors.tagOverlap > 0.5) {
10
- return 'high';
11
- }
12
- if (factors.sameType || factors.tagOverlap > 0.3) {
13
- return 'high';
14
- }
15
- return 'medium';
16
- }
17
- if (cosineSim >= 0.80) {
18
- const factors = calculateConfidenceFactors(memory1, memory2);
19
- if (factors.sameType && factors.contentLengthSimilarity > 0.7) {
20
- return 'medium';
21
- }
22
- return 'medium';
23
- }
24
- return 'low';
25
- }
26
- function calculateConfidenceFactors(memory1, memory2) {
27
- const sameType = memory1.type === memory2.type;
28
- const tags1 = new Set(memory1.tags || []);
29
- const tags2 = new Set(memory2.tags || []);
30
- const overlap = Array.from(tags1).filter((tag) => tags2.has(tag)).length;
31
- const union = new Set([...tags1, ...tags2]).size;
32
- const tagOverlap = union === 0 ? 0 : overlap / union;
33
- const len1 = memory1.content.length;
34
- const len2 = memory2.content.length;
35
- const maxLen = Math.max(len1, len2);
36
- const minLen = Math.min(len1, len2);
37
- const contentLengthSimilarity = maxLen === 0 ? 1 : minLen / maxLen;
38
- return {
39
- sameType,
40
- tagOverlap,
41
- contentLengthSimilarity,
42
- };
43
- }
44
- function generateMergeReason(memory1, memory2, cosineSim, confidenceLevel) {
45
- const factors = calculateConfidenceFactors(memory1, memory2);
46
- const parts = [];
47
- parts.push(`Semantic similarity: ${(cosineSim * 100).toFixed(1)}%`);
48
- if (factors.sameType) {
49
- parts.push(`Same type (${memory1.type})`);
50
- }
51
- else {
52
- parts.push(`Different types (${memory1.type} vs ${memory2.type})`);
53
- }
54
- if (factors.tagOverlap > 0) {
55
- parts.push(`${(factors.tagOverlap * 100).toFixed(0)}% tag overlap`);
56
- }
57
- const len1 = memory1.content.length;
58
- const len2 = memory2.content.length;
59
- const diffPercent = Math.abs(len1 - len2) / Math.max(len1, len2);
60
- parts.push(`Content length difference: ${(diffPercent * 100).toFixed(0)}%`);
61
- parts.push(`Confidence: ${confidenceLevel}`);
62
- return parts.join(' • ');
63
- }
64
- export async function rankCandidates(candidates, memories, embeddings, options) {
65
- const semanticThreshold = options.semanticThreshold ?? 0.85;
66
- const topK = options.topK ?? 10;
67
- const rankedCandidates = [];
68
- for (const { memoryId1, memoryId2 } of candidates) {
69
- const memory1 = memories.get(memoryId1);
70
- const memory2 = memories.get(memoryId2);
71
- const embedding1 = embeddings.get(memoryId1);
72
- const embedding2 = embeddings.get(memoryId2);
73
- if (!memory1 || !memory2 || !embedding1 || !embedding2) {
74
- continue;
75
- }
76
- const similarity = cosineSimilarity(embedding1, embedding2);
77
- if (similarity < semanticThreshold) {
78
- continue;
79
- }
80
- const confidence = calculateConfidence(memory1, memory2, similarity);
81
- const mergeReason = generateMergeReason(memory1, memory2, similarity, confidence);
82
- rankedCandidates.push({
83
- memoryId1,
84
- memoryId2,
85
- memory1,
86
- memory2,
87
- cosineSimilarity: similarity,
88
- confidenceLevel: confidence,
89
- mergeReason,
90
- });
91
- }
92
- rankedCandidates.sort((a, b) => b.cosineSimilarity - a.cosineSimilarity);
93
- const selectedByMemory = new Map();
94
- const filtered = [];
95
- for (const candidate of rankedCandidates) {
96
- const count1 = (selectedByMemory.get(candidate.memoryId1) || 0) + 1;
97
- const count2 = (selectedByMemory.get(candidate.memoryId2) || 0) + 1;
98
- if (count1 <= topK && count2 <= topK) {
99
- filtered.push(candidate);
100
- selectedByMemory.set(candidate.memoryId1, count1);
101
- selectedByMemory.set(candidate.memoryId2, count2);
102
- }
103
- }
104
- return filtered;
105
- }
106
- export function analyzePair(memory1, memory2, embedding1, embedding2) {
107
- const similarity = cosineSimilarity(embedding1, embedding2);
108
- const confidence = calculateConfidence(memory1, memory2, similarity);
109
- const mergeReason = generateMergeReason(memory1, memory2, similarity, confidence);
110
- const factors = calculateConfidenceFactors(memory1, memory2);
111
- return {
112
- cosineSimilarity: similarity,
113
- confidenceLevel: confidence,
114
- mergeReason,
115
- factors,
116
- };
117
- }
118
- //# sourceMappingURL=semantic-ranker.js.map
@@ -1,52 +0,0 @@
1
- /**
2
- * Three-stage duplicate detection orchestrator.
3
- * Stage 0: Exact match (content hash-based)
4
- * Stage 1: Hash-based prefiltering (SimHash + MinHash)
5
- * Stage 2: Semantic ranking using embeddings
6
- */
7
- import type { Memory, MemoryType } from '../../../db/drizzle/schema.js';
8
- import { analyzePair } from './semantic-ranker.js';
9
- export interface MemoryPair {
10
- memory1: Memory;
11
- memory2: Memory;
12
- similarityScore: number;
13
- detectionMethod: 'exact' | 'simhash' | 'minhash' | 'embedding';
14
- confidenceLevel: 'high' | 'medium' | 'low';
15
- mergeReason: string;
16
- }
17
- export interface DetectionResult {
18
- candidates: MemoryPair[];
19
- stage0Time: number;
20
- stage1Time: number;
21
- stage2Time: number;
22
- totalCandidates: number;
23
- filteredCandidates: number;
24
- statistics: {
25
- totalMemories: number;
26
- memoriesByType: Record<MemoryType, number>;
27
- };
28
- }
29
- export interface DetectionOptions {
30
- projectId?: string;
31
- type?: MemoryType;
32
- threshold?: number;
33
- limit?: number;
34
- simhashThreshold?: number;
35
- minhashThreshold?: number;
36
- stage1Only?: boolean;
37
- stage0Only?: boolean;
38
- }
39
- export declare function detectDuplicates(options: DetectionOptions): Promise<DetectionResult>;
40
- export declare function analyzeMergePair(memoryId1: string, memoryId2: string): Promise<{
41
- memory1: Memory;
42
- memory2: Memory;
43
- analysis: ReturnType<typeof analyzePair>;
44
- } | null>;
45
- export declare function getDetectionStats(projectId: string): Promise<{
46
- totalMemories: number;
47
- mergeableMemories: number;
48
- mergedMemories: number;
49
- canonicalMemories: number;
50
- memoriesByType: Record<MemoryType, number>;
51
- }>;
52
- //# sourceMappingURL=two-stage-detector.d.ts.map
@@ -1,299 +0,0 @@
1
- /**
2
- * Three-stage duplicate detection orchestrator.
3
- * Stage 0: Exact match (content hash-based)
4
- * Stage 1: Hash-based prefiltering (SimHash + MinHash)
5
- * Stage 2: Semantic ranking using embeddings
6
- */
7
- import { getEmbedding, getBatchEmbeddings } from '../../../core/embeddings.js';
8
- import { SimHashFilter, MinHashFilter, findCandidatePairs } from './hash-filters.js';
9
- import { rankCandidates, analyzePair } from './semantic-ranker.js';
10
- import { eq, and } from 'drizzle-orm';
11
- import * as crypto from 'crypto';
12
- import { getDbClient } from '../../../core/lib/db-client.js';
13
- export async function detectDuplicates(options) {
14
- const startTime = Date.now();
15
- const { db, schema } = await getDbClient();
16
- let query = db.select().from(schema.memories);
17
- if (options.projectId) {
18
- query = query.where(eq(schema.memories.projectId, options.projectId));
19
- }
20
- if (options.type) {
21
- query = query.where(eq(schema.memories.type, options.type));
22
- }
23
- query = query.where(and(eq(schema.memories.isMerged, false), eq(schema.memories.isMergeable, true), eq(schema.memories.isActive, true)));
24
- const memories = await query.execute();
25
- if (memories.length < 2) {
26
- return {
27
- candidates: [],
28
- stage0Time: 0,
29
- stage1Time: 0,
30
- stage2Time: 0,
31
- totalCandidates: 0,
32
- filteredCandidates: 0,
33
- statistics: {
34
- totalMemories: memories.length,
35
- memoriesByType: countByType(memories),
36
- },
37
- };
38
- }
39
- const memoriesById = new Map(memories.map((m) => [m.id, m]));
40
- const contentById = new Map(memories.map((m) => [m.id, m.content]));
41
- // Stage 0: Exact match using content hash
42
- const stage0Start = Date.now();
43
- const stage0Candidates = [];
44
- // Group memories by content hash for exact matching
45
- const contentHashGroups = new Map();
46
- for (const memory of memories) {
47
- const contentHash = crypto.createHash('md5').update(memory.content).digest('hex');
48
- if (!contentHashGroups.has(contentHash)) {
49
- contentHashGroups.set(contentHash, []);
50
- }
51
- contentHashGroups.get(contentHash).push(memory.id);
52
- }
53
- // Create pairs from each group with same content
54
- for (const [hash, ids] of contentHashGroups.entries()) {
55
- if (ids.length >= 2) {
56
- // Create all unique pairs within this group
57
- for (let i = 0; i < ids.length; i++) {
58
- for (let j = i + 1; j < ids.length; j++) {
59
- stage0Candidates.push({ memoryId1: ids[i], memoryId2: ids[j] });
60
- }
61
- }
62
- }
63
- }
64
- const stage0Time = Date.now() - stage0Start;
65
- // If we only want exact matches for testing, return early
66
- if (options.stage0Only) {
67
- const exactMatchCandidates = stage0Candidates.map(pair => ({
68
- memory1: memoriesById.get(pair.memoryId1),
69
- memory2: memoriesById.get(pair.memoryId2),
70
- similarityScore: 1.0, // Exact match = 1.0 similarity
71
- detectionMethod: 'exact',
72
- confidenceLevel: 'high',
73
- mergeReason: 'Exact content match',
74
- }));
75
- return {
76
- candidates: exactMatchCandidates.slice(0, options.limit ?? 50),
77
- stage0Time,
78
- stage1Time: 0,
79
- stage2Time: 0,
80
- totalCandidates: stage0Candidates.length,
81
- filteredCandidates: exactMatchCandidates.length,
82
- statistics: {
83
- totalMemories: memories.length,
84
- memoriesByType: countByType(memories),
85
- },
86
- };
87
- }
88
- const simhashFilter = new SimHashFilter();
89
- const minhashFilter = new MinHashFilter();
90
- const allSimhashes = new Map();
91
- const allMinhashes = new Map();
92
- for (const memory of memories) {
93
- allSimhashes.set(memory.id, simhashFilter.generateHash(memory.content));
94
- allMinhashes.set(memory.id, minhashFilter.generateSignature(memory.content));
95
- }
96
- const stage1Start = Date.now();
97
- const stage1Candidates = findCandidatePairs(contentById, allSimhashes, allMinhashes, {
98
- simhashThreshold: options.simhashThreshold ?? 4,
99
- minhashThreshold: options.minhashThreshold ?? 0.7,
100
- });
101
- const stage1Time = Date.now() - stage1Start;
102
- // Combine stage 0 and stage 1 candidates for stage 2 processing
103
- // We'll prioritize exact matches but also include fuzzy matches for better recall
104
- const combinedCandidatesForStage2 = [
105
- ...stage0Candidates, // Exact matches first
106
- ...stage1Candidates // Then fuzzy matches
107
- ];
108
- // Remove duplicates while preserving order (exact matches first)
109
- const seenPairs = new Set();
110
- const uniqueCombinedCandidates = [];
111
- for (const pair of combinedCandidatesForStage2) {
112
- const pairKey = `${pair.memoryId1}:${pair.memoryId2}`;
113
- const reversePairKey = `${pair.memoryId2}:${pair.memoryId1}`;
114
- if (!seenPairs.has(pairKey) && !seenPairs.has(reversePairKey)) {
115
- seenPairs.add(pairKey);
116
- uniqueCombinedCandidates.push(pair);
117
- }
118
- }
119
- if (options.stage1Only) {
120
- // Process only stage 1 candidates (fuzzy matches) for backward compatibility
121
- const stage1OnlyCandidates = stage1Candidates.map((pair) => ({
122
- memory1: memoriesById.get(pair.memoryId1),
123
- memory2: memoriesById.get(pair.memoryId2),
124
- similarityScore: Math.max(1 - pair.simhashDistance / 64, pair.minhashSimilarity),
125
- detectionMethod: pair.matched === 'both' ? 'simhash' : pair.matched,
126
- confidenceLevel: 'low',
127
- mergeReason: 'Stage 1 candidate (embedding analysis skipped)',
128
- }));
129
- return {
130
- candidates: stage1OnlyCandidates.slice(0, options.limit ?? 50),
131
- stage0Time,
132
- stage1Time,
133
- stage2Time: 0,
134
- totalCandidates: stage1Candidates.length,
135
- filteredCandidates: stage1OnlyCandidates.length,
136
- statistics: {
137
- totalMemories: memories.length,
138
- memoriesByType: countByType(memories),
139
- },
140
- };
141
- }
142
- const stage2Start = Date.now();
143
- const embeddings = new Map();
144
- // Separate memories that already have embeddings from those that need generation
145
- const memoriesWithoutEmbedding = memories.filter((m) => !m.embedding);
146
- const memoriesWithEmbedding = memories.filter((m) => m.embedding);
147
- // Add cached embeddings to map
148
- for (const memory of memoriesWithEmbedding) {
149
- embeddings.set(memory.id, memory.embedding);
150
- }
151
- // Generate embeddings for remaining memories in parallel batches
152
- if (memoriesWithoutEmbedding.length > 0) {
153
- const contents = memoriesWithoutEmbedding.map((m) => m.content);
154
- const generatedEmbeddings = await getBatchEmbeddings(contents, 20);
155
- for (let i = 0; i < memoriesWithoutEmbedding.length; i++) {
156
- const embedding = generatedEmbeddings[i];
157
- if (embedding) {
158
- embeddings.set(memoriesWithoutEmbedding[i].id, embedding);
159
- }
160
- }
161
- }
162
- const rankedCandidates = await rankCandidates(uniqueCombinedCandidates.map((pair) => ({
163
- memoryId1: pair.memoryId1,
164
- memoryId2: pair.memoryId2,
165
- })), memoriesById, embeddings, {
166
- semanticThreshold: options.threshold ?? 0.85,
167
- topK: 10,
168
- });
169
- const stage2Time = Date.now() - stage2Start;
170
- // Build final candidates list with proper scoring and methods
171
- const finalCandidates = [];
172
- // Add exact matches first (highest confidence)
173
- for (const pair of stage0Candidates) {
174
- const memory1 = memoriesById.get(pair.memoryId1);
175
- const memory2 = memoriesById.get(pair.memoryId2);
176
- if (memory1 && memory2) {
177
- finalCandidates.push({
178
- memory1,
179
- memory2,
180
- similarityScore: 1.0, // Exact match
181
- detectionMethod: 'exact',
182
- confidenceLevel: 'high',
183
- mergeReason: 'Exact content match',
184
- });
185
- }
186
- }
187
- // Add semantic matches from stage 2
188
- for (const ranked of rankedCandidates) {
189
- finalCandidates.push({
190
- memory1: ranked.memory1,
191
- memory2: ranked.memory2,
192
- similarityScore: ranked.cosineSimilarity,
193
- detectionMethod: 'embedding',
194
- confidenceLevel: ranked.confidenceLevel,
195
- mergeReason: ranked.mergeReason,
196
- });
197
- }
198
- // Add fuzzy matches (stage 1) that weren't already covered
199
- const processedPairs = new Set();
200
- for (const candidate of finalCandidates) {
201
- const pairKey1 = `${candidate.memory1.id}:${candidate.memory2.id}`;
202
- const pairKey2 = `${candidate.memory2.id}:${candidate.memory1.id}`;
203
- processedPairs.add(pairKey1);
204
- processedPairs.add(pairKey2);
205
- }
206
- for (const pair of stage1Candidates) {
207
- const pairKey = `${pair.memoryId1}:${pair.memoryId2}`;
208
- const reversePairKey = `${pair.memoryId2}:${pair.memoryId1}`;
209
- if (!processedPairs.has(pairKey) && !processedPairs.has(reversePairKey)) {
210
- const memory1 = memoriesById.get(pair.memoryId1);
211
- const memory2 = memoriesById.get(pair.memoryId2);
212
- if (memory1 && memory2) {
213
- finalCandidates.push({
214
- memory1,
215
- memory2,
216
- similarityScore: Math.max(1 - pair.simhashDistance / 64, pair.minhashSimilarity),
217
- detectionMethod: pair.matched === 'both' ? 'simhash' : pair.matched,
218
- confidenceLevel: 'low',
219
- mergeReason: 'Stage 1 candidate (embedding analysis skipped)',
220
- });
221
- }
222
- }
223
- }
224
- const limited = finalCandidates.slice(0, options.limit ?? 50);
225
- return {
226
- candidates: limited,
227
- stage0Time,
228
- stage1Time,
229
- stage2Time,
230
- totalCandidates: stage0Candidates.length + stage1Candidates.length,
231
- filteredCandidates: finalCandidates.length,
232
- statistics: {
233
- totalMemories: memories.length,
234
- memoriesByType: countByType(memories),
235
- },
236
- };
237
- }
238
- export async function analyzeMergePair(memoryId1, memoryId2) {
239
- const { db, schema } = await getDbClient();
240
- const [memory1] = await db
241
- .select()
242
- .from(schema.memories)
243
- .where(eq(schema.memories.id, memoryId1));
244
- const [memory2] = await db
245
- .select()
246
- .from(schema.memories)
247
- .where(eq(schema.memories.id, memoryId2));
248
- if (!memory1 || !memory2) {
249
- return null;
250
- }
251
- const embedding1 = memory1.embedding || (await getEmbedding(memory1.content)) || [];
252
- const embedding2 = memory2.embedding || (await getEmbedding(memory2.content)) || [];
253
- if (!embedding1 || !embedding2 || embedding1.length === 0 || embedding2.length === 0) {
254
- return null;
255
- }
256
- const analysis = analyzePair(memory1, memory2, embedding1, embedding2);
257
- return {
258
- memory1,
259
- memory2,
260
- analysis,
261
- };
262
- }
263
- function countByType(memories) {
264
- const counts = {
265
- observation: 0,
266
- fact: 0,
267
- decision: 0,
268
- context: 0,
269
- preference: 0,
270
- reflection: 0,
271
- note: 0,
272
- };
273
- for (const memory of memories) {
274
- const type = memory.type;
275
- if (type in counts) {
276
- counts[type]++;
277
- }
278
- }
279
- return counts;
280
- }
281
- export async function getDetectionStats(projectId) {
282
- const { db, schema } = await getDbClient();
283
- const memories = await db
284
- .select()
285
- .from(schema.memories)
286
- .where(eq(schema.memories.projectId, projectId));
287
- const totalMemories = memories.length;
288
- const mergedMemories = memories.filter((m) => m.isMerged).length;
289
- const canonicalMemories = memories.filter((m) => m.isCanonical).length;
290
- const mergeableMemories = memories.filter((m) => m.isMergeable && !m.isMerged).length;
291
- return {
292
- totalMemories,
293
- mergeableMemories,
294
- mergedMemories,
295
- canonicalMemories,
296
- memoriesByType: countByType(memories),
297
- };
298
- }
299
- //# sourceMappingURL=two-stage-detector.js.map
@@ -1,22 +0,0 @@
1
- /**
2
- * Executes the approved merge in a single atomic transaction.
3
- */
4
- interface ApproveMergeInput {
5
- proposalId: string;
6
- reviewNotes?: string;
7
- }
8
- interface ApproveMergeResponse {
9
- ok: boolean;
10
- message: string;
11
- data?: {
12
- proposalId: string;
13
- canonicalMemoryId: string;
14
- mergedMemoryIds: string[];
15
- tokensSaved: number;
16
- mergedAt: string;
17
- };
18
- error?: string;
19
- }
20
- export declare function handleApproveMerge(input: ApproveMergeInput): Promise<ApproveMergeResponse>;
21
- export {};
22
- //# sourceMappingURL=approve-merge.d.ts.map
@@ -1,179 +0,0 @@
1
- /**
2
- * Executes the approved merge in a single atomic transaction.
3
- */
4
- import { randomUUID } from 'crypto';
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, inArray } from 'drizzle-orm';
9
- import { mergeMemories } from '../strategies/merge-strategies.js';
10
- import { estimateTokensSaved } from '../analytics/token-estimator.js';
11
- import { getEmbedding } from '../../../core/embeddings.js';
12
- export async function handleApproveMerge(input) {
13
- try {
14
- const { proposalId, reviewNotes } = input;
15
- if (!proposalId) {
16
- return {
17
- ok: false,
18
- message: 'proposalId is required',
19
- error: 'proposalId is required',
20
- };
21
- }
22
- const db = createDatabaseClient(await getDb());
23
- const schema = await getSchema();
24
- const [proposal] = await db
25
- .select()
26
- .from(schema.memoryMergeProposals)
27
- .where(eq(schema.memoryMergeProposals.id, proposalId));
28
- if (!proposal) {
29
- return {
30
- ok: false,
31
- message: 'Proposal not found',
32
- error: `Proposal ${proposalId} not found`,
33
- };
34
- }
35
- if (proposal.status !== 'pending') {
36
- return {
37
- ok: false,
38
- message: `Proposal is not pending (status: ${proposal.status})`,
39
- error: `Cannot approve non-pending proposal`,
40
- };
41
- }
42
- // Step 2: Load source memories
43
- const sourceIds = proposal.sourceMemoryIds || [];
44
- if (sourceIds.length === 0) {
45
- return {
46
- ok: false,
47
- message: 'No source memories found in proposal',
48
- error: 'Proposal has no source memory IDs',
49
- };
50
- }
51
- const sourceMemories = await db
52
- .select()
53
- .from(schema.memories)
54
- .where(inArray(schema.memories.id, sourceIds));
55
- if (sourceMemories.length !== sourceIds.length) {
56
- return {
57
- ok: false,
58
- message: 'Not all source memories could be found',
59
- error: 'Missing source memories',
60
- };
61
- }
62
- // Step 3: Merge memories
63
- let merged;
64
- try {
65
- merged = mergeMemories(sourceMemories);
66
- }
67
- catch (error) {
68
- return {
69
- ok: false,
70
- message: 'Merge strategy failed',
71
- error: error instanceof Error ? error.message : 'Unknown merge error',
72
- };
73
- }
74
- // Step 4: Calculate token savings
75
- const tokensSaved = estimateTokensSaved(sourceMemories, merged);
76
- // Step 5: Generate embedding for merged memory
77
- let embedding = null;
78
- try {
79
- embedding = (await getEmbedding(merged.content));
80
- }
81
- catch (err) {
82
- // Continue without embedding if generation fails
83
- }
84
- // Step 6: Create canonical memory
85
- const canonicalId = randomUUID();
86
- const now = new Date();
87
- await db.insert(schema.memories).values({
88
- id: canonicalId,
89
- projectId: sourceMemories[0].projectId,
90
- userId: sourceMemories[0].userId,
91
- type: sourceMemories[0].type,
92
- content: merged.content,
93
- summary: merged.summary,
94
- embedding: embedding || undefined,
95
- tags: merged.tags,
96
- metadata: merged.metadata,
97
- source: 'merge',
98
- confidence: 85, // Merged confidence slightly lower than source
99
- isActive: true,
100
- isCanonical: true,
101
- mergeSourceIds: sourceIds,
102
- isMergeable: true,
103
- mergeVersion: 1,
104
- createdAt: now,
105
- updatedAt: now,
106
- isPrivate: sourceMemories[0].isPrivate,
107
- hasSecrets: sourceMemories.some((m) => m.hasSecrets),
108
- relevanceScore: Math.round(sourceMemories.reduce((sum, m) => sum + (m.relevanceScore || 50), 0) / sourceMemories.length),
109
- accessCount: 0,
110
- lastAccessedAt: null,
111
- expiresAt: null,
112
- });
113
- // Step 7: Mark source memories as merged (soft archive)
114
- for (const sourceMemory of sourceMemories) {
115
- await db
116
- .update(schema.memories)
117
- .set({
118
- isMerged: true,
119
- mergedIntoId: canonicalId,
120
- mergedAt: now,
121
- isActive: false,
122
- updatedAt: now,
123
- })
124
- .where(eq(schema.memories.id, sourceMemory.id));
125
- }
126
- // Step 8: Create merge history record (audit trail)
127
- const historyId = randomUUID();
128
- await db.insert(schema.memoryMergeHistory).values({
129
- id: historyId,
130
- projectId: sourceMemories[0].projectId,
131
- userId: sourceMemories[0].userId,
132
- proposalId,
133
- sourceMemoryIds: sourceIds,
134
- canonicalMemoryId: canonicalId,
135
- sourceMemoriesSnapshot: sourceMemories.map((m) => ({
136
- id: m.id,
137
- type: m.type,
138
- content: m.content,
139
- summary: m.summary,
140
- tags: m.tags,
141
- metadata: m.metadata,
142
- createdAt: m.createdAt,
143
- })),
144
- mergeStrategy: sourceMemories[0].type === 'preference' ? 'latest' : 'union',
145
- tokensSaved,
146
- isReversed: false,
147
- mergedAt: now,
148
- });
149
- // Step 9: Update proposal status
150
- await db
151
- .update(schema.memoryMergeProposals)
152
- .set({
153
- status: 'approved',
154
- reviewedAt: now,
155
- reviewNotes: reviewNotes || undefined,
156
- })
157
- .where(eq(schema.memoryMergeProposals.id, proposalId));
158
- // Step 10: Return success
159
- return {
160
- ok: true,
161
- message: `Merge approved and executed. Created canonical memory ${canonicalId}`,
162
- data: {
163
- proposalId,
164
- canonicalMemoryId: canonicalId,
165
- mergedMemoryIds: sourceIds,
166
- tokensSaved,
167
- mergedAt: now.toISOString(),
168
- },
169
- };
170
- }
171
- catch (error) {
172
- return {
173
- ok: false,
174
- message: 'Failed to approve merge',
175
- error: error instanceof Error ? error.message : 'Unknown error',
176
- };
177
- }
178
- }
179
- //# sourceMappingURL=approve-merge.js.map