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,50 +0,0 @@
1
- /**
2
- * UAM Adapter Types
3
- *
4
- * Universal Agent Memory - Adapter interfaces for different AI coding agents.
5
- * Each agent (Claude Code, OpenCode, Cursor, Windsurf, etc.) has its own adapter
6
- * that defines how to integrate with Squish.
7
- *
8
- * Key concepts:
9
- * - Agent adapters use native config formats where possible
10
- * - Hooks are explicit (calls squish_learn) not hidden
11
- * - Uses existing MCP tools (squish_context, squish_learn)
12
- */
13
- import { z } from 'zod';
14
- /** Zod schemas for validation */
15
- export const SessionContextInputSchema = z.object({
16
- project: z.string(),
17
- mode: z.enum(['startup', 'resume', 'compact']).default('startup'),
18
- sessionId: z.string().optional(),
19
- });
20
- export const ToolObservationInputSchema = z.object({
21
- toolName: z.string(),
22
- toolInput: z.record(z.string(), z.unknown()),
23
- toolResult: z.unknown(),
24
- project: z.string(),
25
- sessionId: z.string().optional(),
26
- });
27
- export const TimelineInputSchema = z.object({
28
- query: z.string(),
29
- depth: z.enum(['index', 'timeline', 'detail']).default('index'),
30
- limit: z.number().min(1).max(100).default(10),
31
- });
32
- /** Tool category mapping */
33
- export const TOOL_CATEGORIES = {
34
- 'Read': 'reading',
35
- 'Write': 'modification',
36
- 'Edit': 'modification',
37
- 'Bash': 'command',
38
- 'grep': 'search',
39
- 'Glob': 'search',
40
- 'TodoWrite': 'planning',
41
- 'TodoRead': 'planning',
42
- 'Task': 'planning',
43
- };
44
- /**
45
- * Categorize a tool call
46
- */
47
- export function categorizeTool(toolName) {
48
- return TOOL_CATEGORIES[toolName] || 'other';
49
- }
50
- //# sourceMappingURL=types.js.map
@@ -1,16 +0,0 @@
1
- /**
2
- * Agent Preferences - Accumulate and retrieve agent preferences from learnings
3
- * Enables agents to learn and evolve over time
4
- */
5
- /**
6
- * Update agent preference from a learning
7
- */
8
- export declare function updateAgentPreference(projectId: string, content: string, sourceMemoryId?: string): Promise<void>;
9
- /**
10
- * Get all agent preferences for a project
11
- */
12
- export declare function getAgentPreferences(projectId: string): Promise<Array<{
13
- key: string;
14
- value: string;
15
- }>>;
16
- //# sourceMappingURL=agent-preferences.d.ts.map
@@ -1,124 +0,0 @@
1
- /**
2
- * Agent Preferences - Accumulate and retrieve agent preferences from learnings
3
- * Enables agents to learn and evolve over time
4
- */
5
- import { getDb } from '../db/index.js';
6
- import { eq, and } from 'drizzle-orm';
7
- import { logger } from './logger.js';
8
- /**
9
- * Extract preference from learning content
10
- * E.g., "Prefer bun over npm" -> key: "prefer_bun", value: "bun"
11
- */
12
- function extractPreference(content) {
13
- const patterns = [
14
- // "Prefer X over Y"
15
- /prefer\s+(\w+)\s+over\s+(\w+)/i,
16
- // "Always use X"
17
- /always\s+use\s+(\w+)/i,
18
- // "Use X instead of Y"
19
- /use\s+(\w+)\s+instead\s+of\s+(\w+)/i,
20
- // "X is better than Y"
21
- /(\w+)\s+is\s+better\s+than\s+(\w+)/i,
22
- // "Don't use X"
23
- /(?:don't|do not|never)\s+use\s+(\w+)/i,
24
- ];
25
- for (const pattern of patterns) {
26
- const match = content.match(pattern);
27
- if (match) {
28
- const key = `prefer_${match[1].toLowerCase()}`;
29
- const value = match[2]?.toLowerCase() || 'true';
30
- return { key, value };
31
- }
32
- }
33
- return null;
34
- }
35
- /**
36
- * Update agent preference from a learning
37
- */
38
- export async function updateAgentPreference(projectId, content, sourceMemoryId) {
39
- const preference = extractPreference(content);
40
- if (!preference)
41
- return;
42
- try {
43
- const db = getDb();
44
- // Check if preference exists
45
- const existing = await db.query.agentPreferences?.findFirst(and(eq(db.schema.agentPreferences.projectId, projectId), eq(db.schema.agentPreferences.key, preference.key))).catch(() => null);
46
- if (existing) {
47
- // Update existing preference
48
- await db.update(db.schema.agentPreferences)
49
- .set({
50
- value: preference.value,
51
- sourceMemoryId: sourceMemoryId,
52
- usageCount: (existing.usageCount ?? 0) + 1,
53
- lastUpdated: Math.floor(Date.now() / 1000)
54
- })
55
- .where(eq(db.schema.agentPreferences.id, existing.id))
56
- .catch(() => {
57
- // Fallback for SQLite which uses different table name
58
- const sqlite = db._?.sqlite || db;
59
- if (sqlite) {
60
- sqlite.prepare(`
61
- UPDATE agent_preferences
62
- SET value = ?, source_memory_id = ?, usage_count = usage_count + 1, last_updated = ?
63
- WHERE project_id = ? AND key = ?
64
- `).run(preference.value, sourceMemoryId, Math.floor(Date.now() / 1000), projectId, preference.key);
65
- }
66
- });
67
- logger.info(`[AgentPrefs] Updated preference: ${preference.key} = ${preference.value}`);
68
- }
69
- else {
70
- // Insert new preference
71
- const id = `pref_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
72
- await db.insert(db.schema.agentPreferences)
73
- .values({
74
- id,
75
- projectId,
76
- key: preference.key,
77
- value: preference.value,
78
- sourceMemoryId: sourceMemoryId ?? null,
79
- confidence: 0.5,
80
- usageCount: 1
81
- })
82
- .catch(() => {
83
- // Fallback for SQLite
84
- const sqlite = db._?.sqlite || db;
85
- if (sqlite) {
86
- sqlite.prepare(`
87
- INSERT INTO agent_preferences (id, project_id, key, value, source_memory_id, confidence, usage_count)
88
- VALUES (?, ?, ?, ?, ?, 0.5, 1)
89
- `).run(id, projectId, preference.key, preference.value, sourceMemoryId ?? null);
90
- }
91
- });
92
- logger.info(`[AgentPrefs] Created preference: ${preference.key} = ${preference.value}`);
93
- }
94
- }
95
- catch (error) {
96
- logger.warn(`[AgentPrefs] Failed to update preference:`, error);
97
- }
98
- }
99
- /**
100
- * Get all agent preferences for a project
101
- */
102
- export async function getAgentPreferences(projectId) {
103
- try {
104
- const db = getDb();
105
- const results = await db.query.agentPreferences?.findMany({
106
- where: eq(db.schema.agentPreferences.projectId, projectId)
107
- }).catch(() => []);
108
- if (results && results.length > 0) {
109
- return results.map(p => ({ key: p.key, value: p.value }));
110
- }
111
- // Fallback for SQLite
112
- const sqlite = db._?.sqlite || db;
113
- if (sqlite) {
114
- const rows = sqlite.prepare('SELECT key, value FROM agent_preferences WHERE project_id = ?').all(projectId);
115
- return rows.map(r => ({ key: r.key, value: r.value }));
116
- }
117
- return [];
118
- }
119
- catch (error) {
120
- logger.warn(`[AgentPrefs] Failed to get preferences:`, error);
121
- return [];
122
- }
123
- }
124
- //# sourceMappingURL=agent-preferences.js.map
@@ -1,50 +0,0 @@
1
- /**
2
- * Token estimation for calculating context window savings from merges.
3
- * Uses simple heuristic: 1 token ≈ 4 characters (can be upgraded to tiktoken for accuracy).
4
- */
5
- import type { Memory } from '../../../db/drizzle/schema.js';
6
- import type { MergedMemory } from '../strategies/merge-strategies.js';
7
- export declare function estimateTokensSaved(sources: Memory[], merged: MergedMemory): number;
8
- export declare function calculateProjectTokenSavings(projectId: string): Promise<{
9
- totalSaved: number;
10
- mergeCount: number;
11
- avgSavingsPerMerge: number;
12
- tokenSavingPercentage: number;
13
- totalMemoryTokens: number;
14
- }>;
15
- /**
16
- * Format token counts for display
17
- *
18
- * Converts token count to human-readable format with context usage
19
- */
20
- export declare function formatTokenCount(tokens: number): string;
21
- /**
22
- * Format savings report
23
- */
24
- export declare function formatSavingsReport(savings: {
25
- totalSaved: number;
26
- mergeCount: number;
27
- avgSavingsPerMerge: number;
28
- tokenSavingPercentage: number;
29
- totalMemoryTokens: number;
30
- }): string;
31
- /**
32
- * Estimate savings for a proposed merge (preview)
33
- *
34
- * Used in merge preview to show user estimated savings
35
- */
36
- export declare function estimateMergeSavingsPreview(sources: Memory[], merged: MergedMemory): {
37
- savedTokens: number;
38
- savedPercentage: number;
39
- };
40
- /**
41
- * Get token statistics for a set of memories
42
- */
43
- export declare function getTokenStatistics(memories: Memory[]): {
44
- total: number;
45
- min: number;
46
- max: number;
47
- average: number;
48
- median: number;
49
- };
50
- //# sourceMappingURL=token-estimator.d.ts.map
@@ -1,154 +0,0 @@
1
- /**
2
- * Token estimation for calculating context window savings from merges.
3
- * Uses simple heuristic: 1 token ≈ 4 characters (can be upgraded to tiktoken for accuracy).
4
- */
5
- import { getDb } from '../../../db/index.js';
6
- import { getSchema } from '../../../db/schema.js';
7
- import { createDatabaseClient } from '../../../core/storage/database.js';
8
- import { eq } from 'drizzle-orm';
9
- function estimateTokensSimple(text) {
10
- if (!text)
11
- return 0;
12
- return Math.ceil(text.length / 4);
13
- }
14
- function estimateMetadataOverhead() {
15
- return 25;
16
- }
17
- function estimateMemoryTokens(memory) {
18
- let tokens = 0;
19
- tokens += estimateTokensSimple(memory.content);
20
- if (memory.summary) {
21
- tokens += estimateTokensSimple(memory.summary);
22
- }
23
- if (memory.tags && memory.tags.length > 0) {
24
- tokens += estimateTokensSimple(memory.tags.join(' '));
25
- }
26
- if (memory.metadata) {
27
- tokens += estimateTokensSimple(JSON.stringify(memory.metadata));
28
- }
29
- tokens += estimateMetadataOverhead();
30
- return tokens;
31
- }
32
- function estimateMergedMemoryTokens(merged) {
33
- let tokens = 0;
34
- tokens += estimateTokensSimple(merged.content);
35
- if (merged.summary) {
36
- tokens += estimateTokensSimple(merged.summary);
37
- }
38
- if (merged.tags && merged.tags.length > 0) {
39
- tokens += estimateTokensSimple(merged.tags.join(' '));
40
- }
41
- tokens += estimateTokensSimple(JSON.stringify(merged.metadata));
42
- tokens += estimateMetadataOverhead();
43
- return tokens;
44
- }
45
- export function estimateTokensSaved(sources, merged) {
46
- const sourceTokens = sources.reduce((sum, memory) => sum + estimateMemoryTokens(memory), 0);
47
- const mergedTokens = estimateMergedMemoryTokens(merged);
48
- const savings = sourceTokens - mergedTokens;
49
- return Math.max(0, savings);
50
- }
51
- export async function calculateProjectTokenSavings(projectId) {
52
- const db = createDatabaseClient(await getDb());
53
- const schema = await getSchema();
54
- const memories = await db
55
- .select()
56
- .from(schema.memories)
57
- .where(eq(schema.memories.projectId, projectId));
58
- const totalMemoryTokens = memories.reduce((sum, m) => sum + estimateMemoryTokens(m), 0);
59
- if (!schema.memoryMergeHistory) {
60
- return {
61
- totalSaved: 0,
62
- mergeCount: 0,
63
- avgSavingsPerMerge: 0,
64
- tokenSavingPercentage: 0,
65
- totalMemoryTokens,
66
- };
67
- }
68
- const mergeHistory = await db
69
- .select()
70
- .from(schema.memoryMergeHistory)
71
- .where(eq(schema.memoryMergeHistory.projectId, projectId));
72
- // Sum up token savings
73
- const totalSaved = mergeHistory.reduce((sum, record) => sum + (record.tokensSaved || 0), 0);
74
- const mergeCount = mergeHistory.length;
75
- const avgSavingsPerMerge = mergeCount > 0 ? Math.round(totalSaved / mergeCount) : 0;
76
- const tokenSavingPercentage = totalMemoryTokens > 0 ? (totalSaved / totalMemoryTokens) * 100 : 0;
77
- return {
78
- totalSaved,
79
- mergeCount,
80
- avgSavingsPerMerge,
81
- tokenSavingPercentage,
82
- totalMemoryTokens,
83
- };
84
- }
85
- /**
86
- * Format token counts for display
87
- *
88
- * Converts token count to human-readable format with context usage
89
- */
90
- export function formatTokenCount(tokens) {
91
- // Show percentage of typical context window
92
- // Claude 3 / GPT-4: 128k tokens (~32k practical for context)
93
- const contextWindow = 128000;
94
- const typicalUseful = 32000;
95
- const percentage = (tokens / contextWindow) * 100;
96
- const usefulPercent = (tokens / typicalUseful) * 100;
97
- if (tokens < 1000) {
98
- return `${tokens} tokens (${percentage.toFixed(3)}% of context)`;
99
- }
100
- const kiloTokens = (tokens / 1000).toFixed(1);
101
- return `${kiloTokens}k tokens (${usefulPercent.toFixed(1)}% of typical recall window)`;
102
- }
103
- /**
104
- * Format savings report
105
- */
106
- export function formatSavingsReport(savings) {
107
- const lines = [];
108
- lines.push('Memory Merge Savings Report');
109
- lines.push('='.repeat(40));
110
- if (savings.mergeCount === 0) {
111
- lines.push('No merges completed yet');
112
- return lines.join('\n');
113
- }
114
- lines.push(`Total Merges: ${savings.mergeCount}`);
115
- lines.push(`Total Tokens Saved: ${formatTokenCount(savings.totalSaved)}`);
116
- lines.push(`Avg Savings per Merge: ${formatTokenCount(savings.avgSavingsPerMerge)}`);
117
- lines.push(`Reduction: ${savings.tokenSavingPercentage.toFixed(2)}%`);
118
- lines.push(`Total Memory Tokens: ${formatTokenCount(savings.totalMemoryTokens)}`);
119
- return lines.join('\n');
120
- }
121
- /**
122
- * Estimate savings for a proposed merge (preview)
123
- *
124
- * Used in merge preview to show user estimated savings
125
- */
126
- export function estimateMergeSavingsPreview(sources, merged) {
127
- const sourceTokens = sources.reduce((sum, m) => sum + estimateMemoryTokens(m), 0);
128
- const mergedTokens = estimateMergedMemoryTokens(merged);
129
- const savedTokens = Math.max(0, sourceTokens - mergedTokens);
130
- const savedPercentage = sourceTokens > 0 ? (savedTokens / sourceTokens) * 100 : 0;
131
- return { savedTokens, savedPercentage };
132
- }
133
- /**
134
- * Get token statistics for a set of memories
135
- */
136
- export function getTokenStatistics(memories) {
137
- const counts = memories.map((m) => estimateMemoryTokens(m));
138
- const total = counts.reduce((a, b) => a + b, 0);
139
- const min = Math.min(...counts);
140
- const max = Math.max(...counts);
141
- const average = Math.round(total / counts.length);
142
- // Calculate median
143
- const sorted = [...counts].sort((a, b) => a - b);
144
- const middle = Math.floor(sorted.length / 2);
145
- const median = sorted.length % 2 !== 0 ? sorted[middle] : (sorted[middle - 1] + sorted[middle]) / 2;
146
- return {
147
- total,
148
- min,
149
- max,
150
- average,
151
- median: Math.round(median),
152
- };
153
- }
154
- //# sourceMappingURL=token-estimator.js.map
@@ -1,47 +0,0 @@
1
- /**
2
- * Hash-based duplicate detection filters (Stage 1).
3
- * Uses SimHash and MinHash for fast approximate matching before semantic analysis.
4
- */
5
- /**
6
- * SimHash: Fast fingerprinting for near-duplicate detection.
7
- * Tokenizes content, weights by frequency, and produces comparable hash fingerprints.
8
- * Similar documents produce similar hashes with Hamming distance indicating edit distance.
9
- */
10
- export declare class SimHashFilter {
11
- private readonly dimensions;
12
- generateHash(content: string): string;
13
- hammingDistance(hash1: string, hash2: string): number;
14
- findCandidates(targetHash: string, allHashes: Map<string, string>, threshold: number): string[];
15
- private hashToken;
16
- private popcount;
17
- }
18
- /**
19
- * MinHash: Estimates Jaccard similarity using character n-grams and multiple hash functions.
20
- * Keeps minimum hash for each function, resulting in comparable signatures.
21
- * More effective than SimHash for paraphrases. 128 functions give ~1% error margin.
22
- */
23
- export declare class MinHashFilter {
24
- private readonly numPermutations;
25
- private readonly ngramSize;
26
- generateSignature(content: string): number[];
27
- jaccardSimilarity(sig1: number[], sig2: number[]): number;
28
- findCandidates(targetSig: number[], allSigs: Map<string, number[]>, threshold: number): string[];
29
- private generateNgrams;
30
- private hashNgramWithSeed;
31
- }
32
- export interface Stage1CandidatePair {
33
- memoryId1: string;
34
- memoryId2: string;
35
- simhashDistance: number;
36
- minhashSimilarity: number;
37
- matched: 'simhash' | 'minhash' | 'both';
38
- }
39
- /**
40
- * Combine SimHash and MinHash filters using union approach.
41
- * Candidates pass if they match EITHER filter, casting wider net for stage 2 ranking.
42
- */
43
- export declare function findCandidatePairs(memories: Map<string, string>, allSimhashes: Map<string, string>, allMinhashes: Map<string, number[]>, options: {
44
- simhashThreshold?: number;
45
- minhashThreshold?: number;
46
- }): Stage1CandidatePair[];
47
- //# sourceMappingURL=hash-filters.d.ts.map
@@ -1,190 +0,0 @@
1
- /**
2
- * Hash-based duplicate detection filters (Stage 1).
3
- * Uses SimHash and MinHash for fast approximate matching before semantic analysis.
4
- */
5
- /**
6
- * SimHash: Fast fingerprinting for near-duplicate detection.
7
- * Tokenizes content, weights by frequency, and produces comparable hash fingerprints.
8
- * Similar documents produce similar hashes with Hamming distance indicating edit distance.
9
- */
10
- export class SimHashFilter {
11
- dimensions = 32; // 32-bit hash
12
- generateHash(content) {
13
- if (!content || content.trim().length === 0) {
14
- return '0'.repeat(16);
15
- }
16
- const tokens = content
17
- .toLowerCase()
18
- .split(/\W+/)
19
- .filter((token) => token.length > 0);
20
- if (tokens.length === 0) {
21
- return '0'.repeat(16);
22
- }
23
- const tokenFreq = new Map();
24
- for (const token of tokens) {
25
- tokenFreq.set(token, (tokenFreq.get(token) || 0) + 1);
26
- }
27
- const hashBits = new Array(this.dimensions).fill(0);
28
- for (const [token, freq] of tokenFreq.entries()) {
29
- const tokenHash = this.hashToken(token);
30
- for (let i = 0; i < this.dimensions; i++) {
31
- const bitSet = (tokenHash >>> i) & 1;
32
- hashBits[i] += bitSet === 1 ? freq : -freq;
33
- }
34
- }
35
- let result = 0;
36
- for (let i = 0; i < this.dimensions; i++) {
37
- if (hashBits[i] > 0) {
38
- result |= 1 << i;
39
- }
40
- }
41
- return (result >>> 0).toString(16).padStart(16, '0');
42
- }
43
- hammingDistance(hash1, hash2) {
44
- const num1 = BigInt('0x' + hash1);
45
- const num2 = BigInt('0x' + hash2);
46
- const xor = num1 ^ num2;
47
- return this.popcount(xor);
48
- }
49
- findCandidates(targetHash, allHashes, threshold) {
50
- const candidates = [];
51
- for (const [memoryId, hash] of allHashes.entries()) {
52
- const distance = this.hammingDistance(targetHash, hash);
53
- if (distance <= threshold) {
54
- candidates.push(memoryId);
55
- }
56
- }
57
- return candidates;
58
- }
59
- hashToken(token) {
60
- let hash = 2166136261;
61
- for (let i = 0; i < token.length; i++) {
62
- hash ^= token.charCodeAt(i);
63
- hash = (hash * 16777619) & 0xffffffff;
64
- }
65
- const high = hash >>> 16;
66
- const low = hash & 0xffff;
67
- return (high * 65599 + low) >>> 0;
68
- }
69
- popcount(n) {
70
- let count = 0;
71
- while (n > 0n) {
72
- count += Number(n & 1n);
73
- n = n >> 1n;
74
- }
75
- return count;
76
- }
77
- }
78
- /**
79
- * MinHash: Estimates Jaccard similarity using character n-grams and multiple hash functions.
80
- * Keeps minimum hash for each function, resulting in comparable signatures.
81
- * More effective than SimHash for paraphrases. 128 functions give ~1% error margin.
82
- */
83
- export class MinHashFilter {
84
- numPermutations = 128; // Number of independent hash functions
85
- ngramSize = 3; // Character n-gram size
86
- generateSignature(content) {
87
- if (!content || content.trim().length === 0) {
88
- return new Array(this.numPermutations).fill(0);
89
- }
90
- const ngrams = this.generateNgrams(content.toLowerCase(), this.ngramSize);
91
- if (ngrams.length === 0) {
92
- return new Array(this.numPermutations).fill(0);
93
- }
94
- const signature = new Array(this.numPermutations).fill(Number.MAX_SAFE_INTEGER);
95
- for (const ngram of ngrams) {
96
- for (let i = 0; i < this.numPermutations; i++) {
97
- const hashValue = this.hashNgramWithSeed(ngram, i);
98
- signature[i] = Math.min(signature[i], hashValue);
99
- }
100
- }
101
- return signature;
102
- }
103
- jaccardSimilarity(sig1, sig2) {
104
- if (sig1.length !== sig2.length) {
105
- return 0;
106
- }
107
- if (sig1.length === 0) {
108
- return 1;
109
- }
110
- let matches = 0;
111
- for (let i = 0; i < sig1.length; i++) {
112
- if (sig1[i] === sig2[i]) {
113
- matches++;
114
- }
115
- }
116
- return matches / sig1.length;
117
- }
118
- findCandidates(targetSig, allSigs, threshold) {
119
- const candidates = [];
120
- for (const [memoryId, sig] of allSigs.entries()) {
121
- const similarity = this.jaccardSimilarity(targetSig, sig);
122
- if (similarity >= threshold) {
123
- candidates.push(memoryId);
124
- }
125
- }
126
- return candidates;
127
- }
128
- generateNgrams(content, size) {
129
- const ngrams = [];
130
- const padded = ' '.repeat(size - 1) + content + ' '.repeat(size - 1);
131
- for (let i = 0; i <= padded.length - size; i++) {
132
- ngrams.push(padded.substring(i, i + size));
133
- }
134
- return ngrams;
135
- }
136
- hashNgramWithSeed(ngram, seed) {
137
- let hash = seed;
138
- for (let i = 0; i < ngram.length; i++) {
139
- hash = (hash << 5) - hash + ngram.charCodeAt(i);
140
- hash = hash & hash;
141
- }
142
- return Math.abs(hash);
143
- }
144
- }
145
- /**
146
- * Combine SimHash and MinHash filters using union approach.
147
- * Candidates pass if they match EITHER filter, casting wider net for stage 2 ranking.
148
- */
149
- export function findCandidatePairs(memories, allSimhashes, allMinhashes, options) {
150
- const simhashThreshold = options.simhashThreshold ?? 4;
151
- const minhashThreshold = options.minhashThreshold ?? 0.7;
152
- const simhashFilter = new SimHashFilter();
153
- const minhashFilter = new MinHashFilter();
154
- const candidatePairs = [];
155
- const seen = new Set();
156
- const memoryIds = Array.from(memories.keys());
157
- for (let i = 0; i < memoryIds.length; i++) {
158
- const id1 = memoryIds[i];
159
- const simhash1 = allSimhashes.get(id1);
160
- const minhash1 = allMinhashes.get(id1);
161
- if (!simhash1 || !minhash1)
162
- continue;
163
- for (let j = i + 1; j < memoryIds.length; j++) {
164
- const id2 = memoryIds[j];
165
- const simhash2 = allSimhashes.get(id2);
166
- const minhash2 = allMinhashes.get(id2);
167
- if (!simhash2 || !minhash2)
168
- continue;
169
- const pairKey = id1 < id2 ? `${id1}:${id2}` : `${id2}:${id1}`;
170
- if (seen.has(pairKey))
171
- continue;
172
- const simhashDist = simhashFilter.hammingDistance(simhash1, simhash2);
173
- const simhashMatch = simhashDist <= simhashThreshold;
174
- const minhashSim = minhashFilter.jaccardSimilarity(minhash1, minhash2);
175
- const minhashMatch = minhashSim >= minhashThreshold;
176
- if (simhashMatch || minhashMatch) {
177
- seen.add(pairKey);
178
- candidatePairs.push({
179
- memoryId1: id1,
180
- memoryId2: id2,
181
- simhashDistance: simhashDist,
182
- minhashSimilarity: minhashSim,
183
- matched: simhashMatch && minhashMatch ? 'both' : simhashMatch ? 'simhash' : 'minhash',
184
- });
185
- }
186
- }
187
- }
188
- return candidatePairs;
189
- }
190
- //# sourceMappingURL=hash-filters.js.map
@@ -1,32 +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 type { Memory } from '../../../db/drizzle/schema.js';
6
- export interface RankedCandidate {
7
- memoryId1: string;
8
- memoryId2: string;
9
- memory1: Memory;
10
- memory2: Memory;
11
- cosineSimilarity: number;
12
- confidenceLevel: 'high' | 'medium' | 'low';
13
- mergeReason: string;
14
- }
15
- export declare function rankCandidates(candidates: Array<{
16
- memoryId1: string;
17
- memoryId2: string;
18
- }>, memories: Map<string, Memory>, embeddings: Map<string, number[]>, options: {
19
- semanticThreshold?: number;
20
- topK?: number;
21
- }): Promise<RankedCandidate[]>;
22
- export declare function analyzePair(memory1: Memory, memory2: Memory, embedding1: number[], embedding2: number[]): {
23
- cosineSimilarity: number;
24
- confidenceLevel: 'high' | 'medium' | 'low';
25
- mergeReason: string;
26
- factors: {
27
- sameType: boolean;
28
- tagOverlap: number;
29
- contentLengthSimilarity: number;
30
- };
31
- };
32
- //# sourceMappingURL=semantic-ranker.d.ts.map