squish-memory 1.1.5 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (646) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +44 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/{dist/core/places/index.js → core/places/index.ts} +12 -12
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +590 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/{dist/core/search/index.js → core/search/index.ts} +4 -5
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/{dist/core/session/index.js → core/session/index.ts} +7 -7
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +333 -0
  187. package/db/adapter.ts +215 -0
  188. package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/mcp.json.example +8 -11
  220. package/package.json +140 -159
  221. package/packages/cli/package.json +22 -0
  222. package/packages/cli/src/commands/clean.ts +68 -0
  223. package/packages/cli/src/commands/context.ts +79 -0
  224. package/packages/cli/src/commands/doctor.ts +357 -0
  225. package/packages/cli/src/commands/forget.ts +72 -0
  226. package/packages/cli/src/commands/health.ts +36 -0
  227. package/packages/cli/src/commands/inspect.ts +41 -0
  228. package/packages/cli/src/commands/link.ts +50 -0
  229. package/packages/cli/src/commands/migrate.ts +93 -0
  230. package/packages/cli/src/commands/recall.ts +99 -0
  231. package/packages/cli/src/commands/recent.ts +57 -0
  232. package/packages/cli/src/commands/remember.ts +139 -0
  233. package/packages/cli/src/commands/run.ts +58 -0
  234. package/packages/cli/src/commands/stale.ts +43 -0
  235. package/packages/cli/src/commands/stats.ts +42 -0
  236. package/packages/cli/src/index.ts +57 -0
  237. package/packages/cli/tsconfig.json +24 -0
  238. package/packages/mcp/package.json +26 -0
  239. package/packages/mcp/src/index.ts +940 -0
  240. package/packages/mcp/tsconfig.json +20 -0
  241. package/skills/squish-memory/SKILL.md +38 -35
  242. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  243. package/skills/squish-memory/references/claude-desktop.json +12 -0
  244. package/skills/squish-memory/references/openclaw.json +13 -0
  245. package/skills/squish-memory/references/opencode.json +14 -0
  246. package/config/hooks/claude-code-hooks.json +0 -39
  247. package/config/hooks/cursor-hooks.json +0 -30
  248. package/config/hooks/opencode-hooks.json +0 -30
  249. package/config/hooks/windsurf-hooks.json +0 -30
  250. package/config/mcp-cli-fallback-policy.json +0 -22
  251. package/config/mcp.json +0 -38
  252. package/config/plugin-manifest.json +0 -101
  253. package/config/plugin-manifest.schema.json +0 -244
  254. package/config/plugin.json +0 -32
  255. package/config/remote-memory-policy.json +0 -32
  256. package/core/commands/context-paging.md +0 -51
  257. package/core/commands/context-status.md +0 -22
  258. package/core/commands/context.md +0 -5
  259. package/core/commands/core-memory.md +0 -56
  260. package/core/commands/health.md +0 -5
  261. package/core/commands/init.md +0 -39
  262. package/core/commands/merge.md +0 -113
  263. package/core/commands/recall.md +0 -5
  264. package/core/commands/remember.md +0 -11
  265. package/core/commands/search.md +0 -10
  266. package/dist/config.d.ts +0 -83
  267. package/dist/config.js +0 -242
  268. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  269. package/dist/core/adapters/config/claude-code.js +0 -113
  270. package/dist/core/adapters/config/cursor.d.ts +0 -26
  271. package/dist/core/adapters/config/cursor.js +0 -74
  272. package/dist/core/adapters/config/opencode.d.ts +0 -23
  273. package/dist/core/adapters/config/opencode.js +0 -73
  274. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  275. package/dist/core/adapters/config/windsurf.js +0 -74
  276. package/dist/core/adapters/index.d.ts +0 -45
  277. package/dist/core/adapters/index.js +0 -84
  278. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  279. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  280. package/dist/core/adapters/timeline.d.ts +0 -23
  281. package/dist/core/adapters/timeline.js +0 -88
  282. package/dist/core/adapters/types.d.ts +0 -157
  283. package/dist/core/adapters/types.js +0 -50
  284. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  285. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  286. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  287. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  288. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  289. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  290. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  291. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  292. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  293. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  294. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  295. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  296. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  297. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  298. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  299. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  300. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  301. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  302. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  303. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  304. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  305. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  306. package/dist/core/algorithms/index.d.ts +0 -21
  307. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  308. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  309. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
  310. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  311. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  312. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  313. package/dist/core/algorithms/types.d.ts +0 -133
  314. package/dist/core/algorithms/types.js +0 -5
  315. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  316. package/dist/core/algorithms/utils/response-builder.js +0 -37
  317. package/dist/core/associations.d.ts +0 -31
  318. package/dist/core/associations.js +0 -248
  319. package/dist/core/autosave.d.ts +0 -19
  320. package/dist/core/autosave.js +0 -16
  321. package/dist/core/commands/managed-sync.d.ts +0 -10
  322. package/dist/core/commands/managed-sync.js +0 -64
  323. package/dist/core/commands/mcp-server.d.ts +0 -3
  324. package/dist/core/commands/mcp-server.js +0 -739
  325. package/dist/core/consolidation.d.ts +0 -37
  326. package/dist/core/consolidation.js +0 -248
  327. package/dist/core/context/agent-context.d.ts +0 -106
  328. package/dist/core/context/agent-context.js +0 -274
  329. package/dist/core/context/context-paging.d.ts +0 -80
  330. package/dist/core/context/context-paging.js +0 -328
  331. package/dist/core/context/context-window.d.ts +0 -40
  332. package/dist/core/context/context-window.js +0 -177
  333. package/dist/core/context/context.d.ts +0 -7
  334. package/dist/core/context/context.js +0 -22
  335. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  336. package/dist/core/embeddings/google-multimodal.js +0 -142
  337. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  338. package/dist/core/embeddings/qmd-client.js +0 -403
  339. package/dist/core/embeddings.d.ts +0 -29
  340. package/dist/core/embeddings.js +0 -454
  341. package/dist/core/error-handling.d.ts +0 -63
  342. package/dist/core/error-handling.js +0 -173
  343. package/dist/core/external-folder/index.d.ts +0 -102
  344. package/dist/core/external-folder/index.js +0 -294
  345. package/dist/core/hooks/agent-hooks.d.ts +0 -74
  346. package/dist/core/hooks/agent-hooks.js +0 -244
  347. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  348. package/dist/core/hooks/auto-tagger.js +0 -155
  349. package/dist/core/hooks/capture-filter.d.ts +0 -41
  350. package/dist/core/hooks/capture-filter.js +0 -128
  351. package/dist/core/index.d.ts +0 -10
  352. package/dist/core/index.js +0 -14
  353. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  354. package/dist/core/ingestion/agent-memory.js +0 -109
  355. package/dist/core/ingestion/core-memory.d.ts +0 -78
  356. package/dist/core/ingestion/core-memory.js +0 -226
  357. package/dist/core/ingestion/learnings.d.ts +0 -57
  358. package/dist/core/ingestion/learnings.js +0 -202
  359. package/dist/core/layers/generator.d.ts +0 -25
  360. package/dist/core/layers/generator.js +0 -76
  361. package/dist/core/lib/db-client.js +0 -130
  362. package/dist/core/lib/schemas.d.ts +0 -129
  363. package/dist/core/lib/utils.d.ts +0 -14
  364. package/dist/core/lib/utils.js +0 -90
  365. package/dist/core/lib/validation.d.ts +0 -38
  366. package/dist/core/lib/validation.js +0 -151
  367. package/dist/core/lifecycle.d.ts +0 -26
  368. package/dist/core/lifecycle.js +0 -302
  369. package/dist/core/local-embeddings.d.ts +0 -11
  370. package/dist/core/logger.d.ts +0 -16
  371. package/dist/core/logger.js +0 -40
  372. package/dist/core/mcp/client.d.ts +0 -17
  373. package/dist/core/mcp/client.js +0 -101
  374. package/dist/core/mcp/index.d.ts +0 -6
  375. package/dist/core/mcp/index.js +0 -6
  376. package/dist/core/mcp/server.d.ts +0 -18
  377. package/dist/core/mcp/server.js +0 -157
  378. package/dist/core/mcp/standalone-server.d.ts +0 -13
  379. package/dist/core/mcp/standalone-server.js +0 -46
  380. package/dist/core/mcp/tools.d.ts +0 -9
  381. package/dist/core/mcp/tools.js +0 -365
  382. package/dist/core/mcp/types.d.ts +0 -315
  383. package/dist/core/mcp/types.js +0 -48
  384. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  385. package/dist/core/memory/bridge-discovery.js +0 -291
  386. package/dist/core/memory/categorizer.d.ts +0 -27
  387. package/dist/core/memory/categorizer.js +0 -305
  388. package/dist/core/memory/conflict-detector.d.ts +0 -7
  389. package/dist/core/memory/conflict-detector.js +0 -43
  390. package/dist/core/memory/consolidation.d.ts +0 -42
  391. package/dist/core/memory/consolidation.js +0 -303
  392. package/dist/core/memory/context-collector.d.ts +0 -10
  393. package/dist/core/memory/context-collector.js +0 -56
  394. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  395. package/dist/core/memory/contradiction-resolver.js +0 -368
  396. package/dist/core/memory/edit-workflow.d.ts +0 -19
  397. package/dist/core/memory/edit-workflow.js +0 -120
  398. package/dist/core/memory/entity-extractor.d.ts +0 -33
  399. package/dist/core/memory/entity-extractor.js +0 -336
  400. package/dist/core/memory/entity-resolver.d.ts +0 -23
  401. package/dist/core/memory/entity-resolver.js +0 -64
  402. package/dist/core/memory/fact-extractor.d.ts +0 -24
  403. package/dist/core/memory/fact-extractor.js +0 -89
  404. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  405. package/dist/core/memory/feedback-tracker.js +0 -155
  406. package/dist/core/memory/hooks.d.ts +0 -88
  407. package/dist/core/memory/hooks.js +0 -174
  408. package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
  409. package/dist/core/memory/hybrid-retrieval.js +0 -139
  410. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  411. package/dist/core/memory/hybrid-scorer.js +0 -284
  412. package/dist/core/memory/hybrid-search.d.ts +0 -20
  413. package/dist/core/memory/hybrid-search.js +0 -359
  414. package/dist/core/memory/importance.d.ts +0 -63
  415. package/dist/core/memory/importance.js +0 -298
  416. package/dist/core/memory/index.d.ts +0 -8
  417. package/dist/core/memory/loader.d.ts +0 -31
  418. package/dist/core/memory/loader.js +0 -141
  419. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  420. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  421. package/dist/core/memory/memories.d.ts +0 -47
  422. package/dist/core/memory/memories.js +0 -449
  423. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  424. package/dist/core/memory/memory-lifecycle.js +0 -55
  425. package/dist/core/memory/memory-manager.d.ts +0 -15
  426. package/dist/core/memory/memory-manager.js +0 -46
  427. package/dist/core/memory/migrate.d.ts +0 -21
  428. package/dist/core/memory/migrate.js +0 -134
  429. package/dist/core/memory/normalization.d.ts +0 -22
  430. package/dist/core/memory/normalization.js +0 -26
  431. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  432. package/dist/core/memory/progressive-disclosure.js +0 -280
  433. package/dist/core/memory/query-processor.d.ts +0 -21
  434. package/dist/core/memory/query-processor.js +0 -72
  435. package/dist/core/memory/query-rewriter.d.ts +0 -13
  436. package/dist/core/memory/query-rewriter.js +0 -118
  437. package/dist/core/memory/response-analyzer.d.ts +0 -9
  438. package/dist/core/memory/response-analyzer.js +0 -61
  439. package/dist/core/memory/serialization.d.ts +0 -10
  440. package/dist/core/memory/serialization.js +0 -84
  441. package/dist/core/memory/stats.d.ts +0 -22
  442. package/dist/core/memory/stats.js +0 -138
  443. package/dist/core/memory/telemetry.d.ts +0 -69
  444. package/dist/core/memory/telemetry.js +0 -313
  445. package/dist/core/memory/temporal-facts.d.ts +0 -41
  446. package/dist/core/memory/temporal-facts.js +0 -283
  447. package/dist/core/memory/temporal-parser.d.ts +0 -32
  448. package/dist/core/memory/temporal-parser.js +0 -385
  449. package/dist/core/memory/trigger-detector.d.ts +0 -14
  450. package/dist/core/memory/trigger-detector.js +0 -42
  451. package/dist/core/memory/write-gate.d.ts +0 -54
  452. package/dist/core/memory/write-gate.js +0 -210
  453. package/dist/core/namespaces/index.d.ts +0 -71
  454. package/dist/core/namespaces/index.js +0 -305
  455. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  456. package/dist/core/namespaces/uri-parser.js +0 -74
  457. package/dist/core/obsidian-vault.d.ts +0 -30
  458. package/dist/core/obsidian-vault.js +0 -94
  459. package/dist/core/places/index.d.ts +0 -14
  460. package/dist/core/places/memory-places.d.ts +0 -68
  461. package/dist/core/places/memory-places.js +0 -261
  462. package/dist/core/places/places.d.ts +0 -88
  463. package/dist/core/places/places.js +0 -314
  464. package/dist/core/places/rules.d.ts +0 -74
  465. package/dist/core/places/rules.js +0 -240
  466. package/dist/core/places/walking.d.ts +0 -56
  467. package/dist/core/places/walking.js +0 -121
  468. package/dist/core/projects.d.ts +0 -17
  469. package/dist/core/projects.js +0 -108
  470. package/dist/core/redis.d.ts +0 -11
  471. package/dist/core/redis.js +0 -69
  472. package/dist/core/responses.d.ts +0 -96
  473. package/dist/core/responses.js +0 -122
  474. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  475. package/dist/core/scheduler/cron-scheduler.js +0 -332
  476. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  477. package/dist/core/scheduler/heartbeat.js +0 -73
  478. package/dist/core/scheduler/index.d.ts +0 -8
  479. package/dist/core/scheduler/job-runner.d.ts +0 -11
  480. package/dist/core/scheduler/job-runner.js +0 -164
  481. package/dist/core/search/conversations.d.ts +0 -25
  482. package/dist/core/search/conversations.js +0 -110
  483. package/dist/core/search/entities.d.ts +0 -12
  484. package/dist/core/search/entities.js +0 -31
  485. package/dist/core/search/folder-context.d.ts +0 -25
  486. package/dist/core/search/folder-context.js +0 -119
  487. package/dist/core/search/graph-boost.d.ts +0 -7
  488. package/dist/core/search/graph-boost.js +0 -23
  489. package/dist/core/search/index.d.ts +0 -4
  490. package/dist/core/search/qmd-search.d.ts +0 -61
  491. package/dist/core/search/qmd-search.js +0 -178
  492. package/dist/core/security/encrypt.d.ts +0 -6
  493. package/dist/core/security/encrypt.js +0 -47
  494. package/dist/core/security/governance.d.ts +0 -26
  495. package/dist/core/security/governance.js +0 -79
  496. package/dist/core/security/privacy.d.ts +0 -23
  497. package/dist/core/security/privacy.js +0 -82
  498. package/dist/core/security/secret-detector.d.ts +0 -32
  499. package/dist/core/security/secret-detector.js +0 -88
  500. package/dist/core/session/auto-load.d.ts +0 -6
  501. package/dist/core/session/auto-load.js +0 -119
  502. package/dist/core/session/index.d.ts +0 -7
  503. package/dist/core/session/self-iteration-job.d.ts +0 -20
  504. package/dist/core/session/self-iteration-job.js +0 -282
  505. package/dist/core/session/session-hooks.d.ts +0 -18
  506. package/dist/core/session/session-hooks.js +0 -58
  507. package/dist/core/session/types.d.ts +0 -26
  508. package/dist/core/session/types.js +0 -10
  509. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  510. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  511. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  512. package/dist/core/session-hooks/session-hooks.js +0 -58
  513. package/dist/core/snapshots/cleanup.d.ts +0 -9
  514. package/dist/core/snapshots/comparison.d.ts +0 -19
  515. package/dist/core/snapshots/comparison.js +0 -43
  516. package/dist/core/snapshots/creation.d.ts +0 -19
  517. package/dist/core/snapshots/creation.js +0 -126
  518. package/dist/core/snapshots/retrieval.d.ts +0 -7
  519. package/dist/core/snapshots/retrieval.js +0 -41
  520. package/dist/core/snapshots/stats.d.ts +0 -11
  521. package/dist/core/snapshots/stats.js +0 -52
  522. package/dist/core/snapshots.d.ts +0 -29
  523. package/dist/core/snapshots.js +0 -220
  524. package/dist/core/storage/cache.d.ts +0 -13
  525. package/dist/core/storage/cache.js +0 -202
  526. package/dist/core/storage/database.d.ts +0 -12
  527. package/dist/core/storage/database.js +0 -12
  528. package/dist/core/summarization/cleanup.d.ts +0 -9
  529. package/dist/core/summarization/queries.d.ts +0 -9
  530. package/dist/core/summarization/queries.js +0 -28
  531. package/dist/core/summarization/stats.d.ts +0 -14
  532. package/dist/core/summarization/stats.js +0 -52
  533. package/dist/core/summarization/strategies.d.ts +0 -24
  534. package/dist/core/summarization/strategies.js +0 -28
  535. package/dist/core/summarization.d.ts +0 -37
  536. package/dist/core/summarization.js +0 -188
  537. package/dist/core/sync/qmd-sync.d.ts +0 -94
  538. package/dist/core/sync/qmd-sync.js +0 -201
  539. package/dist/core/temporal-facts.d.ts +0 -54
  540. package/dist/core/temporal-facts.js +0 -193
  541. package/dist/core/toon.d.ts +0 -43
  542. package/dist/core/toon.js +0 -160
  543. package/dist/core/tracing/collector.d.ts +0 -111
  544. package/dist/core/tracing/collector.js +0 -350
  545. package/dist/core/tracing/visualizer.d.ts +0 -32
  546. package/dist/core/tracing/visualizer.js +0 -165
  547. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  548. package/dist/core/utils/cleanup-operations.js +0 -44
  549. package/dist/core/utils/content-extraction.d.ts +0 -19
  550. package/dist/core/utils/content-extraction.js +0 -75
  551. package/dist/core/utils/filter-builder.d.ts +0 -13
  552. package/dist/core/utils/filter-builder.js +0 -44
  553. package/dist/core/utils/history-traversal.d.ts +0 -13
  554. package/dist/core/utils/history-traversal.js +0 -50
  555. package/dist/core/utils/memory-operations.d.ts +0 -17
  556. package/dist/core/utils/memory-operations.js +0 -43
  557. package/dist/core/utils/query-operations.d.ts +0 -18
  558. package/dist/core/utils/query-operations.js +0 -65
  559. package/dist/core/utils/summarization-helpers.d.ts +0 -21
  560. package/dist/core/utils/summarization-helpers.js +0 -38
  561. package/dist/core/utils/temporal-queries.d.ts +0 -13
  562. package/dist/core/utils/temporal-queries.js +0 -27
  563. package/dist/core/utils/vector-operations.d.ts +0 -71
  564. package/dist/core/utils/version-management.d.ts +0 -9
  565. package/dist/core/utils/version-management.js +0 -61
  566. package/dist/core/worker.d.ts +0 -82
  567. package/dist/core/worker.js +0 -272
  568. package/dist/db/adapter.d.ts +0 -7
  569. package/dist/db/adapter.js +0 -175
  570. package/dist/db/bootstrap.d.ts +0 -9
  571. package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
  572. package/dist/db/drizzle/schema-sqlite.js +0 -684
  573. package/dist/db/drizzle/schema.d.ts +0 -4082
  574. package/dist/db/drizzle/schema.js +0 -770
  575. package/dist/db/drizzle.config.d.ts +0 -3
  576. package/dist/db/drizzle.config.js +0 -12
  577. package/dist/db/index.d.ts +0 -7
  578. package/dist/db/index.js +0 -89
  579. package/dist/db/neon.d.ts +0 -8
  580. package/dist/db/neon.js +0 -20
  581. package/dist/db/schema/index.d.ts +0 -40
  582. package/dist/db/schema/index.js +0 -105
  583. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  584. package/dist/db/schema/tables/context-sessions.js +0 -37
  585. package/dist/db/schema/tables/conversations.d.ts +0 -9
  586. package/dist/db/schema/tables/conversations.js +0 -47
  587. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  588. package/dist/db/schema/tables/core-memory.js +0 -41
  589. package/dist/db/schema/tables/entities.d.ts +0 -9
  590. package/dist/db/schema/tables/entities.js +0 -39
  591. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  592. package/dist/db/schema/tables/entity-relations.js +0 -31
  593. package/dist/db/schema/tables/learnings.d.ts +0 -9
  594. package/dist/db/schema/tables/learnings.js +0 -66
  595. package/dist/db/schema/tables/memories.d.ts +0 -9
  596. package/dist/db/schema/tables/memories.js +0 -161
  597. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  598. package/dist/db/schema/tables/memory-associations.js +0 -39
  599. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  600. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  601. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  602. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  603. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  604. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  605. package/dist/db/schema/tables/messages.d.ts +0 -9
  606. package/dist/db/schema/tables/messages.js +0 -41
  607. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  608. package/dist/db/schema/tables/namespaces.js +0 -37
  609. package/dist/db/schema/tables/projects.d.ts +0 -9
  610. package/dist/db/schema/tables/projects.js +0 -31
  611. package/dist/db/schema/tables/users.d.ts +0 -9
  612. package/dist/db/schema/tables/users.js +0 -27
  613. package/dist/db/schema.d.ts +0 -3
  614. package/dist/db/schema.js +0 -11
  615. package/dist/db/supabase.d.ts +0 -9
  616. package/dist/db/supabase.js +0 -24
  617. package/dist/index.d.ts +0 -7
  618. package/dist/index.js +0 -1677
  619. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  620. package/dist/webui/server.d.ts +0 -5
  621. package/dist/webui/server.js +0 -642
  622. package/generated/mcp/manifest.json +0 -23
  623. package/generated/mcp/mcp-servers.json +0 -25
  624. package/generated/mcp/mcporter.json +0 -34
  625. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  626. package/generated/mcp/runtime.json +0 -12
  627. package/scripts/README.md +0 -60
  628. package/scripts/build-release.sh +0 -36
  629. package/scripts/check-secrets.js +0 -132
  630. package/scripts/copy-runtime-assets.mjs +0 -26
  631. package/scripts/generate-mcp.mjs +0 -264
  632. package/scripts/github-release.sh +0 -77
  633. package/scripts/init-dirs.mjs +0 -13
  634. package/scripts/install-claude-code.sh +0 -85
  635. package/scripts/install-cursor.sh +0 -56
  636. package/scripts/install-hooks.sh +0 -73
  637. package/scripts/install-interactive.mjs +0 -357
  638. package/scripts/install-opencode.sh +0 -75
  639. package/scripts/install-plugin.mjs +0 -415
  640. package/scripts/install-windsurf.sh +0 -67
  641. package/scripts/remote-preflight.mjs +0 -62
  642. package/scripts/squish-fallback.mjs +0 -132
  643. package/scripts/test-interactive.mjs +0 -131
  644. package/scripts/verify-mcp.mjs +0 -214
  645. package/skills/squish-memory/scripts/install.mjs +0 -335
  646. package/skills/squish-memory/write_skill.js +0 -2
@@ -1,284 +0,0 @@
1
- /** Hybrid Scorer - Multi-factor relevance scoring for memory ranking */
2
- import { logger } from '../../core/logger.js';
3
- export async function hybridScore(queryEmbedding, memories, options = {}) {
4
- const weights = {
5
- semantic: options.weights?.semantic ?? 0.30,
6
- recency: options.weights?.recency ?? 0.20,
7
- coactivation: options.weights?.coactivation ?? 0.10,
8
- importance: options.weights?.importance ?? 0.15,
9
- confidence: options.weights?.confidence ?? 0.15,
10
- feedback: options.weights?.feedback ?? 0.10,
11
- };
12
- const decayDays = options.decayDays ?? 30;
13
- const minSemanticScore = options.minSemanticScore ?? 0.0;
14
- const scored = [];
15
- const now = new Date();
16
- for (const memory of memories) {
17
- if (queryEmbedding && weights.semantic > 0) {
18
- const semanticScore = calculateSemanticScore(queryEmbedding, memory);
19
- if (semanticScore < minSemanticScore)
20
- continue;
21
- }
22
- const components = {
23
- semantic: queryEmbedding ? calculateSemanticScore(queryEmbedding, memory) : 50,
24
- recency: calculateRecencyScore(memory, now, decayDays),
25
- coactivation: calculateCoactivationScore(memory),
26
- importance: calculateImportanceScore(memory),
27
- confidence: calculateConfidenceScore(memory),
28
- feedback: calculateFeedbackScore(memory),
29
- };
30
- const totalScore = Math.min(100, components.semantic * weights.semantic +
31
- components.recency * weights.recency +
32
- components.coactivation * weights.coactivation +
33
- components.importance * weights.importance +
34
- components.confidence * weights.confidence +
35
- components.feedback * weights.feedback);
36
- scored.push({
37
- memoryId: memory.id,
38
- memory,
39
- totalScore: Math.round(totalScore * 100) / 100,
40
- components: {
41
- semantic: Math.round(components.semantic * 100) / 100,
42
- recency: Math.round(components.recency * 100) / 100,
43
- coactivation: Math.round(components.coactivation * 100) / 100,
44
- importance: Math.round(components.importance * 100) / 100,
45
- confidence: Math.round(components.confidence * 100) / 100,
46
- feedback: Math.round(components.feedback * 100) / 100,
47
- },
48
- rank: 0,
49
- explanation: options.includeExplanation
50
- ? generateScoreExplanation(components, weights, memory)
51
- : '',
52
- });
53
- }
54
- scored.sort((a, b) => b.totalScore - a.totalScore);
55
- for (let i = 0; i < scored.length; i++) {
56
- scored[i].rank = i + 1;
57
- }
58
- return scored;
59
- }
60
- function calculateSemanticScore(queryEmbedding, memory) {
61
- if (!memory.embedding || queryEmbedding.length === 0)
62
- return 50;
63
- try {
64
- let memoryEmbedding = null;
65
- if (Array.isArray(memory.embedding)) {
66
- memoryEmbedding = memory.embedding;
67
- }
68
- else if (typeof memory.embedding === 'string') {
69
- memoryEmbedding = JSON.parse(memory.embedding);
70
- }
71
- if (!memoryEmbedding || memoryEmbedding.length === 0)
72
- return 50;
73
- const cosineSimilarity = calculateCosineSimilarity(queryEmbedding, memoryEmbedding);
74
- return Math.max(0, Math.min(100, (cosineSimilarity + 1) * 50));
75
- }
76
- catch (error) {
77
- logger.error('Error calculating semantic score', error);
78
- return 50;
79
- }
80
- }
81
- function calculateRecencyScore(memory, now, decayDays) {
82
- // Enhanced bi-temporal recency scoring: considers validity period and learning time
83
- const validFromDate = memory.validFrom ? new Date(memory.validFrom) : null;
84
- const validToDate = memory.validTo ? new Date(memory.validTo) : null;
85
- const recordedAtDate = memory.recordedAt ? new Date(memory.recordedAt) : null;
86
- const createdDate = memory.createdAt ? new Date(memory.createdAt) : null;
87
- // Calculate score based on how relevant the memory is right now
88
- let score = 50; // Default neutral score
89
- // If we have a validity period, score based on current time's position within that period
90
- if (validFromDate && validToDate) {
91
- const timeInPeriod = now.getTime() - validFromDate.getTime();
92
- const periodLength = validToDate.getTime() - validFromDate.getTime();
93
- if (periodLength > 0) {
94
- // If now is within the validity period, high score
95
- if (now >= validFromDate && now <= validToDate) {
96
- // Full score if right in middle, decreasing toward edges
97
- const progress = timeInPeriod / periodLength;
98
- const distanceFromCenter = Math.abs(0.5 - progress) * 2; // 0 at center, 1 at edges
99
- score = 100 * (1 - distanceFromCenter * 0.8); // 100 at center, 40 at edges
100
- }
101
- else {
102
- // Outside validity period - score based on how recently it expired or how far in future
103
- if (now < validFromDate) {
104
- // Future validity - score based on how soon it becomes valid
105
- const daysUntilValid = (validFromDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
106
- score = Math.max(20, 100 - Math.min(80, daysUntilValid / decayDays * 100));
107
- }
108
- else {
109
- // Past validity - score based on how recently it expired
110
- const daysSinceExpired = (now.getTime() - validToDate.getTime()) / (24 * 60 * 60 * 1000);
111
- score = Math.max(10, 60 - Math.min(50, daysSinceExpired / decayDays * 100));
112
- }
113
- }
114
- }
115
- }
116
- // If we only have validFrom (open-ended validity)
117
- else if (validFromDate) {
118
- const daysSinceValid = (now.getTime() - validFromDate.getTime()) / (24 * 60 * 60 * 1000);
119
- if (now >= validFromDate) {
120
- // Still valid - decay from full score over time
121
- score = Math.max(30, 100 - Math.min(70, daysSinceValid / decayDays * 100));
122
- }
123
- else {
124
- // Becomes valid in future
125
- const daysUntilValid = (validFromDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
126
- score = Math.max(20, 100 - Math.min(80, daysUntilValid / decayDays * 100));
127
- }
128
- }
129
- // Fallback to learned/recorded time
130
- else {
131
- const learnedDate = recordedAtDate || createdDate;
132
- if (learnedDate) {
133
- const daysSinceLearned = (now.getTime() - learnedDate.getTime()) / (24 * 60 * 60 * 1000);
134
- score = 100 * Math.pow(0.5, daysSinceLearned / decayDays);
135
- score = Math.max(0, Math.min(100, score));
136
- }
137
- }
138
- return Math.round(score * 10) / 10; // Return one decimal place
139
- }
140
- function calculateCoactivationScore(memory) {
141
- if (!memory.coactivationScore || memory.coactivationScore === 0)
142
- return 10;
143
- return Math.min(100, memory.coactivationScore * 5);
144
- }
145
- function calculateImportanceScore(memory) {
146
- let score = 50;
147
- if (memory.tier === 'hot')
148
- score += 30;
149
- else if (memory.tier === 'warm')
150
- score += 15;
151
- if (memory.relevanceScore)
152
- score += memory.relevanceScore * 0.2;
153
- if (memory.isPinned)
154
- score += 10;
155
- if (memory.isProtected)
156
- score += 10;
157
- if (memory.isMergeable || memory.isMerged)
158
- score -= 10;
159
- return Math.max(0, Math.min(100, score));
160
- }
161
- function calculateConfidenceScore(memory) {
162
- let score = 50;
163
- const signals = memory.metadata?.memorySignals;
164
- if (signals) {
165
- if (signals.priority === 'high')
166
- score += 25;
167
- if (signals.explicitTriggers && signals.explicitTriggers.length > 0) {
168
- score += 15 * Math.min(signals.explicitTriggers.length, 2);
169
- }
170
- if (signals.implicit) {
171
- if (signals.implicit.decision)
172
- score += 10;
173
- if (signals.implicit.correction)
174
- score += 15;
175
- if (signals.implicit.preference)
176
- score += 8;
177
- if (signals.implicit.workflowRule)
178
- score += 12;
179
- if (signals.implicit.lesson)
180
- score += 10;
181
- }
182
- if (signals.requiresConflictCheck)
183
- score -= 5;
184
- }
185
- switch (memory.type) {
186
- case 'decision':
187
- score += 10;
188
- break;
189
- case 'preference':
190
- score += 5;
191
- break;
192
- case 'fact':
193
- score += 8;
194
- break;
195
- case 'context':
196
- score += 3;
197
- break;
198
- }
199
- if (memory.source === 'mcp')
200
- score += 5;
201
- if (memory.accessCount && memory.accessCount > 5) {
202
- score += Math.min(10, memory.accessCount / 2);
203
- }
204
- return Math.max(0, Math.min(100, score));
205
- }
206
- function calculateFeedbackScore(memory) {
207
- const retrievalPriority = memory.retrievalPriority ?? 50;
208
- return Math.max(0, Math.min(100, retrievalPriority));
209
- }
210
- function calculateCosineSimilarity(vecA, vecB) {
211
- if (vecA.length !== vecB.length)
212
- return 0;
213
- let dotProduct = 0;
214
- let magnitudeA = 0;
215
- let magnitudeB = 0;
216
- for (let i = 0; i < vecA.length; i++) {
217
- dotProduct += vecA[i] * vecB[i];
218
- magnitudeA += vecA[i] * vecA[i];
219
- magnitudeB += vecB[i] * vecB[i];
220
- }
221
- magnitudeA = Math.sqrt(magnitudeA);
222
- magnitudeB = Math.sqrt(magnitudeB);
223
- if (magnitudeA === 0 || magnitudeB === 0)
224
- return 0;
225
- return dotProduct / (magnitudeA * magnitudeB);
226
- }
227
- function generateScoreExplanation(components, weights, memory) {
228
- const parts = [];
229
- if (components.semantic > 70)
230
- parts.push(`highly relevant (${components.semantic.toFixed(0)})`);
231
- else if (components.semantic > 50)
232
- parts.push(`somewhat relevant (${components.semantic.toFixed(0)})`);
233
- else
234
- parts.push(`low relevance (${components.semantic.toFixed(0)})`);
235
- if (components.recency > 70)
236
- parts.push('recent');
237
- else if (components.recency > 30)
238
- parts.push('moderately recent');
239
- else
240
- parts.push('older');
241
- if (memory.tier === 'hot')
242
- parts.push('active memory');
243
- else if (memory.tier === 'warm')
244
- parts.push('accessible memory');
245
- else
246
- parts.push('archived memory');
247
- if (components.coactivation > 60)
248
- parts.push('frequently associated');
249
- if (components.confidence > 80)
250
- parts.push('high confidence');
251
- else if (components.confidence > 60)
252
- parts.push('moderate confidence');
253
- else if (components.confidence < 40)
254
- parts.push('low confidence');
255
- if (components.feedback > 70)
256
- parts.push('frequently useful');
257
- else if (components.feedback < 30)
258
- parts.push('rarely used');
259
- return parts.join(', ');
260
- }
261
- export async function scoreAndRankMemories(queryEmbedding, memories, topK = 10, options = {}) {
262
- const scored = await hybridScore(queryEmbedding, memories, options);
263
- logger.debug('Scored and ranked memories', {
264
- total: scored.length,
265
- topK,
266
- topScores: scored.slice(0, topK).map((s) => ({ id: s.memoryId, score: s.totalScore })),
267
- });
268
- return scored.slice(0, topK);
269
- }
270
- export function getScoreDistribution(scored) {
271
- if (scored.length === 0) {
272
- return { min: 0, max: 0, avg: 0, median: 0, p95: 0, p99: 0 };
273
- }
274
- const scores = scored.map((s) => s.totalScore).sort((a, b) => a - b);
275
- return {
276
- min: scores[0],
277
- max: scores[scores.length - 1],
278
- avg: scores.reduce((a, b) => a + b, 0) / scores.length,
279
- median: scores[Math.floor(scores.length / 2)],
280
- p95: scores[Math.floor((95 / 100) * scores.length)],
281
- p99: scores[Math.floor((99 / 100) * scores.length)],
282
- };
283
- }
284
- //# sourceMappingURL=hybrid-scorer.js.map
@@ -1,20 +0,0 @@
1
- /**
2
- * Hybrid Search - Combines BM25 keyword search with vector semantic search
3
- * Uses Reciprocal Rank Fusion (RRF) for result merging
4
- */
5
- import type { SearchResult, SearchInput } from './memories.js';
6
- export interface HybridSearchOptions {
7
- limit?: number;
8
- project?: string;
9
- type?: string;
10
- tags?: string[];
11
- /** Weight for BM25 results (0-1), default 0.5 */
12
- bm25Weight?: number;
13
- /** Weight for vector results (0-1), default 0.5 */
14
- vectorWeight?: number;
15
- }
16
- /**
17
- * Main hybrid search function - combines BM25 and vector search with RRF
18
- */
19
- export declare function hybridSearch(input: SearchInput, options?: HybridSearchOptions): Promise<SearchResult[]>;
20
- //# sourceMappingURL=hybrid-search.d.ts.map
@@ -1,359 +0,0 @@
1
- /**
2
- * Hybrid Search - Combines BM25 keyword search with vector semantic search
3
- * Uses Reciprocal Rank Fusion (RRF) for result merging
4
- */
5
- import { getDb } from '../../db/index.js';
6
- import { createDatabaseClient } from '../storage/database.js';
7
- import { getEmbedding } from '../../core/embeddings.js';
8
- import { requireProject } from '../../core/projects.js';
9
- import { deserializeTags, deserializeMetadata, normalizeTags } from './serialization.js';
10
- import { computeGraphBoost } from '../search/graph-boost.js';
11
- import { normalizeTimestamp } from '../lib/utils.js';
12
- import { cosineSimilarity } from '../utils/vector-operations.js';
13
- import config from '../../config.js';
14
- /**
15
- * Reciprocal Rank Fusion (RRF) constant
16
- * Higher values = more influence from lower-ranked items
17
- * 60 is the standard value used in research
18
- */
19
- const RRF_K = 60;
20
- /**
21
- * Main hybrid search function - combines BM25 and vector search with RRF
22
- */
23
- export async function hybridSearch(input, options = {}) {
24
- const limit = options.limit ?? input.limit ?? 10;
25
- const bm25Weight = options.bm25Weight ?? 0.5;
26
- const vectorWeight = options.vectorWeight ?? 0.5;
27
- // Run both searches in parallel
28
- const [bm25Results, vectorResults] = await Promise.all([
29
- bm25Search(input, { ...options, limit: limit * 2 }),
30
- vectorSearch(input, { ...options, limit: limit * 2 }),
31
- ]);
32
- // Compute graph boost for the candidate memory IDs
33
- const candidateIds = Array.from(new Set([...bm25Results.map(r => r.id), ...vectorResults.map(r => r.id)]));
34
- const graphBoostMap = await computeGraphBoost(candidateIds);
35
- // Apply RRF to merge results, incorporating graph boost
36
- return reciprocalRankFusion(bm25Results, vectorResults, { limit, bm25Weight, vectorWeight }, graphBoostMap);
37
- }
38
- /**
39
- * BM25 keyword search using SQLite FTS5
40
- */
41
- async function bm25Search(input, options) {
42
- try {
43
- const db = createDatabaseClient(await getDb());
44
- const sqlite = db.$client;
45
- const limit = options.limit ?? 10;
46
- const tags = normalizeTags(options.tags ?? input.tags);
47
- // Build FTS5 query with proper escaping
48
- const ftsQuery = buildFtsQuery(input.query);
49
- const isEmptyQuery = ftsQuery === '*';
50
- // Build WHERE conditions
51
- const conditions = [];
52
- const params = [];
53
- // For non-empty queries, use FTS5 MATCH
54
- if (!isEmptyQuery) {
55
- conditions.push('memories_fts MATCH ?');
56
- params.push(ftsQuery);
57
- }
58
- if (input.type) {
59
- conditions.push('m.type = ?');
60
- params.push(input.type);
61
- }
62
- if (tags.length) {
63
- conditions.push('(' + tags.map(() => 'm.tags LIKE ?').join(' OR ') + ')');
64
- params.push(...tags.map((tag) => `%${tag}%`));
65
- }
66
- let projectId = null;
67
- if (input.project) {
68
- const project = await requireProject(input.project);
69
- projectId = project.id;
70
- conditions.push('m.project_id = ?');
71
- params.push(project.id);
72
- }
73
- // For empty query with no filters, use "1=1" to match all
74
- const whereClause = conditions.length > 0 ? conditions.join(' AND ') : '1=1';
75
- // Build query based on whether we have a search term or not
76
- const statement = sqlite.prepare(`
77
- SELECT
78
- m.id as id,
79
- m.project_id as projectId,
80
- m.type as type,
81
- m.content as content,
82
- m.summary as summary,
83
- m.tags as tags,
84
- m.metadata as metadata,
85
- ${isEmptyQuery ? '0 as bm25Score' : 'bm25(memories_fts) as bm25Score'},
86
- m.created_at as createdAt
87
- FROM memories m
88
- ${isEmptyQuery ? '' : 'INNER JOIN memories_fts ON m.rowid = memories_fts.rowid'}
89
- WHERE ${whereClause}
90
- ${isEmptyQuery ? 'ORDER BY m.created_at DESC' : 'ORDER BY bm25(memories_fts)'}
91
- LIMIT ?
92
- `);
93
- const rows = statement.all(...params, limit * 3);
94
- // Return as ranked results (lower BM25 score = better rank)
95
- return rows.map((row, index) => ({
96
- id: row.id,
97
- rank: index + 1,
98
- score: row.bm25Score,
99
- result: {
100
- id: row.id,
101
- projectId: row.projectId,
102
- type: row.type,
103
- content: row.content,
104
- summary: row.summary ?? undefined,
105
- tags: deserializeTags(row.tags ?? null),
106
- metadata: deserializeMetadata(row.metadata ?? null),
107
- createdAt: row.createdAt ? (normalizeTimestamp(Number(row.createdAt)) ?? undefined) : undefined,
108
- },
109
- }));
110
- }
111
- catch (error) {
112
- throw error;
113
- }
114
- }
115
- /**
116
- * Vector semantic search using cosine similarity
117
- */
118
- async function vectorSearch(input, options) {
119
- try {
120
- const db = createDatabaseClient(await getDb());
121
- const sqlite = db.$client;
122
- const limit = options.limit ?? 10;
123
- const tags = normalizeTags(options.tags ?? input.tags);
124
- // Check for empty query
125
- const isEmptyQuery = !input.query || input.query.trim() === '';
126
- // Get query embedding (only for non-empty queries)
127
- let queryEmbedding = null;
128
- if (!isEmptyQuery) {
129
- queryEmbedding = await getEmbedding(input.query);
130
- // If embedding fails but query is not empty, still proceed without semantic ranking
131
- // Fall back to recency-based ranking
132
- }
133
- // Build WHERE conditions
134
- const conditions = [];
135
- const params = [];
136
- if (input.type) {
137
- conditions.push('m.type = ?');
138
- params.push(input.type);
139
- }
140
- if (tags.length) {
141
- conditions.push('(' + tags.map(() => 'm.tags LIKE ?').join(' OR ') + ')');
142
- params.push(...tags.map((tag) => `%${tag}%`));
143
- }
144
- let projectId = null;
145
- if (input.project) {
146
- const project = await requireProject(input.project);
147
- projectId = project.id;
148
- conditions.push('m.project_id = ?');
149
- params.push(project.id);
150
- }
151
- const whereClause = conditions.length > 0
152
- ? 'WHERE ' + conditions.join(' AND ')
153
- : '';
154
- // Fetch candidates for vector search
155
- const statement = sqlite.prepare(`
156
- SELECT
157
- m.id as id,
158
- m.project_id as projectId,
159
- m.type as type,
160
- m.content as content,
161
- m.summary as summary,
162
- m.tags as tags,
163
- m.metadata as metadata,
164
- m.embedding as embedding,
165
- m.embedding_json as embeddingJson,
166
- m.created_at as createdAt
167
- FROM memories m
168
- ${whereClause}
169
- ORDER BY m.created_at DESC
170
- LIMIT ?
171
- `);
172
- const rows = statement.all(...params, limit * 3);
173
- // If no embedding available, return results ordered by recency
174
- if (!queryEmbedding) {
175
- return rows.slice(0, limit * 2).map((item, index) => ({
176
- id: item.id,
177
- rank: index + 1,
178
- score: 0, // No similarity score available
179
- result: {
180
- id: item.id,
181
- projectId: item.projectId,
182
- type: item.type,
183
- content: item.content,
184
- summary: item.summary ?? undefined,
185
- tags: deserializeTags(item.tags ?? null),
186
- metadata: deserializeMetadata(item.metadata ?? null),
187
- createdAt: item.createdAt ? (normalizeTimestamp(Number(item.createdAt)) ?? undefined) : undefined,
188
- similarity: 0,
189
- },
190
- }));
191
- }
192
- // Calculate cosine similarity for each result
193
- const scored = rows
194
- .map((row) => {
195
- const embedding = parseEmbedding(row.embedding) ?? parseEmbedding(row.embeddingJson);
196
- if (!embedding)
197
- return null;
198
- const similarity = cosineSimilarity(queryEmbedding, embedding);
199
- return {
200
- id: row.id,
201
- projectId: row.projectId,
202
- type: row.type,
203
- content: row.content,
204
- summary: row.summary,
205
- tags: row.tags,
206
- metadata: row.metadata,
207
- createdAt: row.createdAt,
208
- similarity,
209
- };
210
- })
211
- .filter((item) => item !== null);
212
- // Sort by similarity (descending) and return as ranked results
213
- scored.sort((a, b) => b.similarity - a.similarity);
214
- return scored.slice(0, limit * 2).map((item, index) => ({
215
- id: item.id,
216
- rank: index + 1,
217
- score: item.similarity,
218
- result: {
219
- id: item.id,
220
- projectId: item.projectId,
221
- type: item.type,
222
- content: item.content,
223
- summary: item.summary ?? undefined,
224
- tags: deserializeTags(item.tags ?? null),
225
- metadata: deserializeMetadata(item.metadata ?? null),
226
- createdAt: item.createdAt ? (normalizeTimestamp(Number(item.createdAt)) ?? undefined) : undefined,
227
- similarity: item.similarity,
228
- },
229
- }));
230
- }
231
- catch (error) {
232
- throw error;
233
- }
234
- }
235
- /**
236
- * Reciprocal Rank Fusion (RRF) - merges ranked lists without score calibration
237
- *
238
- * RRF Formula: score(item) = sum(weight_i / (k + rank_i))
239
- * Where k is a constant (typically 60) that prevents high ranks from dominating
240
- *
241
- * Benefits:
242
- * - No need to calibrate different scoring systems (BM25 vs cosine similarity)
243
- * - Handles items that appear in only one list
244
- * - Proven to outperform weighted score fusion in most cases
245
- */
246
- function reciprocalRankFusion(bm25Results, vectorResults, options, graphBoostMap) {
247
- const { limit, bm25Weight, vectorWeight } = options;
248
- const scores = new Map();
249
- // Process BM25 results
250
- for (const item of bm25Results) {
251
- const rrfScore = (bm25Weight * 2) / (RRF_K + item.rank);
252
- const existing = scores.get(item.id);
253
- if (existing) {
254
- existing.score += rrfScore;
255
- }
256
- else {
257
- scores.set(item.id, { score: rrfScore, result: item.result });
258
- }
259
- }
260
- // Process vector results
261
- for (const item of vectorResults) {
262
- const rrfScore = (vectorWeight * 2) / (RRF_K + item.rank);
263
- const existing = scores.get(item.id);
264
- if (existing) {
265
- existing.score += rrfScore;
266
- }
267
- else {
268
- scores.set(item.id, { score: rrfScore, result: item.result });
269
- }
270
- }
271
- // Add graph boost to each score
272
- for (const [id, entry] of scores.entries()) {
273
- const boost = graphBoostMap[id] ?? 0;
274
- const weight = config.scoringWeights.graphBoost ?? 1;
275
- entry.score += boost * weight;
276
- }
277
- // Sort by final score (descending) and return top results
278
- return Array.from(scores.values())
279
- .sort((a, b) => b.score - a.score)
280
- .slice(0, limit)
281
- .map((item) => ({
282
- ...item.result,
283
- similarity: item.result.similarity ?? 0,
284
- }));
285
- }
286
- /**
287
- * Build FTS5 query string from user input
288
- * Handles phrase searches, OR operators for better recall, and special characters
289
- */
290
- function buildFtsQuery(query) {
291
- // Ensure query is a string
292
- const queryString = typeof query === 'string' ? query : String(query ?? '');
293
- // Remove special characters that could break FTS5 syntax (except quotes)
294
- // Hyphens are problematic in FTS5 - they're treated as exclusion operators
295
- let cleaned = queryString.replace(/[^\w\s"'-]/g, ' ');
296
- // If query contains quotes, preserve as phrase search
297
- if (cleaned.includes('"')) {
298
- return cleaned || '*'; // Return * for empty after cleaning
299
- }
300
- // Split into terms
301
- const terms = cleaned.trim().split(/\s+/).filter((t) => t.length > 0);
302
- if (terms.length === 0) {
303
- return '*'; // Match all for empty query
304
- }
305
- // Wrap terms containing hyphens in quotes (e.g., "trash-cli" prevents hyphen being interpreted as NOT)
306
- const processedTerms = terms.map(term => {
307
- if (term.includes('-')) {
308
- return `"${term}"`;
309
- }
310
- return term;
311
- });
312
- // For multi-word queries, use OR for better recall (any term matches)
313
- // This is less restrictive than AND and finds more relevant results
314
- if (processedTerms.length > 1) {
315
- return processedTerms.join(' OR ');
316
- }
317
- return processedTerms[0];
318
- }
319
- /**
320
- * Parse embedding from SQLite storage
321
- */
322
- function parseEmbedding(embeddingData) {
323
- if (!embeddingData)
324
- return null;
325
- if (Array.isArray(embeddingData))
326
- return embeddingData;
327
- if (embeddingData instanceof Uint8Array || Buffer.isBuffer(embeddingData)) {
328
- try {
329
- const json = JSON.parse(embeddingData.toString());
330
- if (Array.isArray(json))
331
- return json;
332
- }
333
- catch {
334
- try {
335
- const buffer = embeddingData.buffer;
336
- const arrayBuffer = buffer instanceof ArrayBuffer
337
- ? buffer
338
- : buffer;
339
- const floatArray = new Float32Array(arrayBuffer);
340
- return Array.from(floatArray);
341
- }
342
- catch {
343
- return null;
344
- }
345
- }
346
- }
347
- if (typeof embeddingData === 'string') {
348
- try {
349
- const parsed = JSON.parse(embeddingData);
350
- if (Array.isArray(parsed))
351
- return parsed;
352
- }
353
- catch {
354
- return null;
355
- }
356
- }
357
- return null;
358
- }
359
- //# sourceMappingURL=hybrid-search.js.map