squish-memory 1.1.5 → 1.2.0

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 (499) 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 +46 -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/core/algorithms/index.ts +39 -0
  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/core/lib/db-client.ts +168 -0
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/core/lib/schemas.ts +102 -0
  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/core/memory/index.ts +11 -0
  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/core/places/index.ts +14 -0
  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 +581 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/core/scheduler/index.ts +8 -0
  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/core/search/index.ts +4 -0
  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/core/session/index.ts +7 -0
  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/core/snapshots/cleanup.ts +13 -0
  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/core/summarization/cleanup.ts +13 -0
  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/core/utils/vector-operations.ts +135 -0
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +324 -0
  187. package/db/adapter.ts +215 -0
  188. package/db/bootstrap.ts +1055 -0
  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/dist/config.d.ts +40 -17
  220. package/dist/config.js +150 -198
  221. package/dist/core/adapters/types.d.ts +13 -33
  222. package/dist/core/adapters/types.js +1 -1
  223. package/dist/core/agent-preferences.d.ts +16 -0
  224. package/dist/core/agent-preferences.js +124 -0
  225. package/dist/core/algorithms/safety/safety-checks.d.ts +1 -5
  226. package/dist/core/algorithms/types.d.ts +0 -8
  227. package/dist/core/associations.d.ts +3 -1
  228. package/dist/core/associations.js +37 -1
  229. package/dist/core/beliefs/decay.d.ts +27 -0
  230. package/dist/core/beliefs/decay.js +217 -0
  231. package/dist/core/beliefs/extractor.d.ts +9 -0
  232. package/dist/core/beliefs/extractor.js +113 -0
  233. package/dist/core/beliefs/store.d.ts +46 -0
  234. package/dist/core/beliefs/store.js +466 -0
  235. package/dist/core/beliefs/types.d.ts +28 -0
  236. package/dist/core/beliefs/types.js +2 -0
  237. package/dist/core/commands/mcp-server.d.ts +0 -1
  238. package/dist/core/commands/mcp-server.js +4 -737
  239. package/dist/core/commands/remember.d.ts +24 -0
  240. package/dist/core/commands/remember.js +144 -0
  241. package/dist/core/{toon.d.ts → compression.d.ts} +6 -4
  242. package/dist/core/{toon.js → compression.js} +8 -8
  243. package/dist/core/context/agent-context.js +1 -1
  244. package/dist/core/embeddings/embeddings.d.ts +29 -0
  245. package/dist/core/embeddings/embeddings.js +546 -0
  246. package/dist/core/embeddings/google-multimodal.js +6 -2
  247. package/dist/core/{local-embeddings.d.ts → embeddings/local-embeddings.d.ts} +1 -1
  248. package/dist/core/embeddings/local-embeddings.js +11 -0
  249. package/dist/core/embeddings/qmd-client.js +1 -1
  250. package/dist/core/embeddings/transformers-local.d.ts +64 -0
  251. package/dist/core/embeddings/transformers-local.js +213 -0
  252. package/dist/core/embeddings.d.ts +1 -28
  253. package/dist/core/embeddings.js +2 -453
  254. package/dist/core/graph/entity-deduplicator.d.ts +24 -0
  255. package/dist/core/graph/entity-deduplicator.js +183 -0
  256. package/dist/core/graph/graph-builder.d.ts +46 -0
  257. package/dist/core/graph/graph-builder.js +174 -0
  258. package/dist/core/graph/graph-traversal.d.ts +80 -0
  259. package/dist/core/graph/graph-traversal.js +315 -0
  260. package/dist/core/graph/index.d.ts +19 -0
  261. package/dist/core/graph/index.js +13 -0
  262. package/dist/core/graph/llm-entity-extractor.d.ts +49 -0
  263. package/dist/core/graph/llm-entity-extractor.js +313 -0
  264. package/dist/core/graph/multi-hop-retrieval.d.ts +48 -0
  265. package/dist/core/graph/multi-hop-retrieval.js +215 -0
  266. package/dist/core/graph/relationship-extractor.d.ts +48 -0
  267. package/dist/core/graph/relationship-extractor.js +351 -0
  268. package/dist/core/hooks/agent-hooks.d.ts +10 -1
  269. package/dist/core/hooks/agent-hooks.js +301 -24
  270. package/dist/core/hot-cache.d.ts +86 -0
  271. package/dist/core/hot-cache.js +285 -0
  272. package/dist/core/index.d.ts +9 -9
  273. package/dist/core/index.js +9 -12
  274. package/dist/core/ingestion/core-memory.d.ts +2 -2
  275. package/dist/core/ingestion/core-memory.js +3 -3
  276. package/dist/core/ingestion/learnings.js +3 -0
  277. package/dist/core/ingestion/signal-engine.d.ts +41 -0
  278. package/dist/core/ingestion/signal-engine.js +201 -0
  279. package/dist/core/{obsidian-vault.d.ts → integrations/obsidian-vault.d.ts} +2 -1
  280. package/dist/core/{obsidian-vault.js → integrations/obsidian-vault.js} +69 -7
  281. package/dist/core/lib/parse-embedding.d.ts +9 -0
  282. package/dist/core/lib/parse-embedding.js +58 -0
  283. package/dist/core/lib/schemas.d.ts +57 -54
  284. package/dist/core/lib/types.d.ts +45 -0
  285. package/dist/core/lib/types.js +6 -0
  286. package/dist/core/lib/utils.d.ts +4 -0
  287. package/dist/core/lib/utils.js +55 -0
  288. package/dist/core/lifecycle.d.ts +0 -1
  289. package/dist/core/lifecycle.js +13 -23
  290. package/dist/core/logger.d.ts +1 -0
  291. package/dist/core/logger.js +14 -8
  292. package/dist/core/mcp/tools.d.ts +0 -2
  293. package/dist/core/mcp/tools.js +0 -87
  294. package/dist/core/mcp/types.d.ts +25 -253
  295. package/dist/core/mcp/types.js +2 -2
  296. package/dist/core/memory/categorizer.js +1 -0
  297. package/dist/core/memory/consolidation.js +2 -28
  298. package/dist/core/memory/entity-extractor.d.ts +4 -0
  299. package/dist/core/memory/entity-extractor.js +30 -16
  300. package/dist/core/memory/explain.d.ts +18 -0
  301. package/dist/core/memory/explain.js +92 -0
  302. package/dist/core/memory/fact-deriver.d.ts +31 -0
  303. package/dist/core/memory/fact-deriver.js +236 -0
  304. package/dist/core/memory/hybrid-retrieval.d.ts +14 -16
  305. package/dist/core/memory/hybrid-retrieval.js +25 -127
  306. package/dist/core/memory/hybrid-scorer.js +6 -23
  307. package/dist/core/memory/hybrid-search.d.ts +10 -7
  308. package/dist/core/memory/hybrid-search.js +458 -221
  309. package/dist/core/memory/importance.d.ts +0 -17
  310. package/dist/core/memory/importance.js +1 -58
  311. package/dist/core/memory/index.d.ts +1 -0
  312. package/dist/core/memory/index.js +1 -0
  313. package/dist/core/memory/memories.d.ts +13 -17
  314. package/dist/core/memory/memories.js +78 -75
  315. package/dist/core/memory/memory-lifecycle.d.ts +2 -2
  316. package/dist/core/memory/memory-lifecycle.js +10 -18
  317. package/dist/core/memory/normalization.d.ts +1 -16
  318. package/dist/core/memory/path-strengthener.d.ts +39 -0
  319. package/dist/core/memory/path-strengthener.js +150 -0
  320. package/dist/core/memory/query-processor.js +37 -3
  321. package/dist/core/memory/retrieval-feedback.d.ts +70 -0
  322. package/dist/core/memory/retrieval-feedback.js +213 -0
  323. package/dist/core/memory/stale-cleaner.d.ts +26 -0
  324. package/dist/core/memory/stale-cleaner.js +97 -0
  325. package/dist/core/memory/stats.d.ts +10 -0
  326. package/dist/core/memory/stats.js +8 -3
  327. package/dist/core/memory/trigger-detector.d.ts +8 -1
  328. package/dist/core/memory/trigger-detector.js +42 -5
  329. package/dist/core/places/index.d.ts +1 -1
  330. package/dist/core/places/index.js +1 -1
  331. package/dist/core/places/places.d.ts +13 -13
  332. package/dist/core/places/places.js +27 -27
  333. package/dist/core/places/rules.js +23 -23
  334. package/dist/core/places/walking.d.ts +3 -3
  335. package/dist/core/places/walking.js +7 -7
  336. package/dist/core/projects.js +8 -0
  337. package/dist/core/runtime/trust-report.d.ts +102 -0
  338. package/dist/core/runtime/trust-report.js +107 -0
  339. package/dist/core/runtime/trust-state.d.ts +12 -0
  340. package/dist/core/runtime/trust-state.js +309 -0
  341. package/dist/core/scheduler/cron-scheduler.d.ts +1 -1
  342. package/dist/core/scheduler/cron-scheduler.js +164 -3
  343. package/dist/core/scheduler/job-runner.js +1 -1
  344. package/dist/core/search/qmd-wrapper.d.ts +36 -0
  345. package/dist/core/search/qmd-wrapper.js +58 -0
  346. package/dist/core/session/auto-load.js +28 -3
  347. package/dist/core/session/entity-tracker.d.ts +62 -0
  348. package/dist/core/session/entity-tracker.js +287 -0
  349. package/dist/core/session/reference-resolver.d.ts +26 -0
  350. package/dist/core/session/reference-resolver.js +121 -0
  351. package/dist/core/session/self-iteration-job.d.ts +15 -0
  352. package/dist/core/session/self-iteration-job.js +163 -58
  353. package/dist/core/session/working-set.d.ts +50 -0
  354. package/dist/core/session/working-set.js +212 -0
  355. package/dist/core/snapshots/creation.d.ts +2 -8
  356. package/dist/core/snapshots/creation.js +3 -12
  357. package/dist/core/utils/summarization-helpers.d.ts +0 -4
  358. package/dist/core/utils/summarization-helpers.js +1 -6
  359. package/dist/db/bootstrap.d.ts +2 -0
  360. package/dist/db/bootstrap.js +229 -280
  361. package/dist/db/drizzle/schema-sqlite.d.ts +702 -1
  362. package/dist/db/drizzle/schema-sqlite.js +83 -4
  363. package/dist/db/drizzle/schema.d.ts +653 -1
  364. package/dist/db/drizzle/schema.js +93 -4
  365. package/dist/db/migrations/associations.d.ts +6 -0
  366. package/dist/db/migrations/associations.js +29 -0
  367. package/dist/db/migrations/beliefs.d.ts +10 -0
  368. package/dist/db/migrations/beliefs.js +76 -0
  369. package/dist/db/migrations/core-memory.d.ts +6 -0
  370. package/dist/db/migrations/core-memory.js +29 -0
  371. package/dist/db/migrations/fts.d.ts +6 -0
  372. package/dist/db/migrations/fts.js +52 -0
  373. package/dist/db/migrations/index.d.ts +25 -0
  374. package/dist/db/migrations/index.js +51 -0
  375. package/dist/db/migrations/indexes.d.ts +6 -0
  376. package/dist/db/migrations/indexes.js +30 -0
  377. package/dist/db/migrations/learnings.d.ts +7 -0
  378. package/dist/db/migrations/learnings.js +26 -0
  379. package/dist/db/migrations/maintenance.d.ts +6 -0
  380. package/dist/db/migrations/maintenance.js +61 -0
  381. package/dist/db/migrations/memories.d.ts +7 -0
  382. package/dist/db/migrations/memories.js +16 -0
  383. package/dist/db/migrations/memory-places.d.ts +6 -0
  384. package/dist/db/migrations/memory-places.js +29 -0
  385. package/dist/db/migrations/places.d.ts +6 -0
  386. package/dist/db/migrations/places.js +43 -0
  387. package/dist/db/migrations/projects.d.ts +3 -0
  388. package/dist/db/migrations/projects.js +13 -0
  389. package/dist/db/migrations/tier-conversion.d.ts +7 -0
  390. package/dist/db/migrations/tier-conversion.js +20 -0
  391. package/dist/db/schema/beliefs.d.ts +9 -0
  392. package/dist/db/schema/beliefs.js +46 -0
  393. package/dist/db/schema/generator.d.ts +38 -0
  394. package/dist/db/schema/generator.js +108 -0
  395. package/dist/db/schema/index.d.ts +19 -20
  396. package/dist/db/schema/index.js +25 -79
  397. package/dist/db/schema/learnings.d.ts +7 -0
  398. package/dist/db/schema/learnings.js +30 -0
  399. package/dist/db/schema/memories.d.ts +7 -0
  400. package/dist/db/schema/memories.js +81 -0
  401. package/dist/db/schema/projects.d.ts +4 -0
  402. package/dist/db/schema/projects.js +31 -0
  403. package/dist/packages/mcp/src/index.d.ts +3 -0
  404. package/dist/packages/mcp/src/index.js +733 -0
  405. package/mcp.json.example +8 -11
  406. package/package.json +57 -76
  407. package/packages/cli/package.json +22 -0
  408. package/packages/cli/src/commands/clean.ts +68 -0
  409. package/packages/cli/src/commands/context.ts +79 -0
  410. package/packages/cli/src/commands/doctor.ts +357 -0
  411. package/packages/cli/src/commands/forget.ts +72 -0
  412. package/packages/cli/src/commands/health.ts +36 -0
  413. package/packages/cli/src/commands/inspect.ts +41 -0
  414. package/packages/cli/src/commands/link.ts +50 -0
  415. package/packages/cli/src/commands/migrate.ts +93 -0
  416. package/packages/cli/src/commands/recall.ts +99 -0
  417. package/packages/cli/src/commands/recent.ts +57 -0
  418. package/packages/cli/src/commands/remember.ts +139 -0
  419. package/packages/cli/src/commands/run.ts +58 -0
  420. package/packages/cli/src/commands/stale.ts +43 -0
  421. package/packages/cli/src/commands/stats.ts +42 -0
  422. package/packages/cli/src/index.ts +57 -0
  423. package/packages/cli/tsconfig.json +24 -0
  424. package/packages/mcp/package.json +26 -0
  425. package/packages/mcp/src/index.ts +877 -0
  426. package/packages/mcp/tsconfig.json +20 -0
  427. package/skills/squish-memory/SKILL.md +38 -35
  428. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  429. package/skills/squish-memory/references/claude-desktop.json +12 -0
  430. package/skills/squish-memory/references/openclaw.json +13 -0
  431. package/skills/squish-memory/references/opencode.json +14 -0
  432. package/config/hooks/claude-code-hooks.json +0 -39
  433. package/config/hooks/cursor-hooks.json +0 -30
  434. package/config/hooks/opencode-hooks.json +0 -30
  435. package/config/hooks/windsurf-hooks.json +0 -30
  436. package/config/mcp-cli-fallback-policy.json +0 -22
  437. package/config/mcp.json +0 -38
  438. package/config/plugin-manifest.json +0 -101
  439. package/config/plugin-manifest.schema.json +0 -244
  440. package/config/plugin.json +0 -32
  441. package/config/remote-memory-policy.json +0 -32
  442. package/core/commands/context-paging.md +0 -51
  443. package/core/commands/context-status.md +0 -22
  444. package/core/commands/context.md +0 -5
  445. package/core/commands/core-memory.md +0 -56
  446. package/core/commands/health.md +0 -5
  447. package/core/commands/init.md +0 -39
  448. package/core/commands/merge.md +0 -113
  449. package/core/commands/recall.md +0 -5
  450. package/core/commands/remember.md +0 -11
  451. package/core/commands/search.md +0 -10
  452. package/dist/core/commands/managed-sync.d.ts +0 -10
  453. package/dist/core/commands/managed-sync.js +0 -64
  454. package/dist/core/external-folder/index.d.ts +0 -102
  455. package/dist/core/external-folder/index.js +0 -294
  456. package/dist/core/namespaces/index.d.ts +0 -71
  457. package/dist/core/namespaces/index.js +0 -305
  458. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  459. package/dist/core/namespaces/uri-parser.js +0 -74
  460. package/dist/core/search/qmd-search.d.ts +0 -61
  461. package/dist/core/search/qmd-search.js +0 -178
  462. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  463. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  464. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  465. package/dist/core/session-hooks/session-hooks.js +0 -58
  466. package/dist/core/snapshots.d.ts +0 -29
  467. package/dist/core/snapshots.js +0 -220
  468. package/dist/core/sync/qmd-sync.d.ts +0 -94
  469. package/dist/core/sync/qmd-sync.js +0 -201
  470. package/dist/index.d.ts +0 -7
  471. package/dist/index.js +0 -1677
  472. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  473. package/dist/webui/server.d.ts +0 -5
  474. package/dist/webui/server.js +0 -642
  475. package/generated/mcp/manifest.json +0 -23
  476. package/generated/mcp/mcp-servers.json +0 -25
  477. package/generated/mcp/mcporter.json +0 -34
  478. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  479. package/generated/mcp/runtime.json +0 -12
  480. package/scripts/README.md +0 -60
  481. package/scripts/build-release.sh +0 -36
  482. package/scripts/check-secrets.js +0 -132
  483. package/scripts/copy-runtime-assets.mjs +0 -26
  484. package/scripts/generate-mcp.mjs +0 -264
  485. package/scripts/github-release.sh +0 -77
  486. package/scripts/init-dirs.mjs +0 -13
  487. package/scripts/install-claude-code.sh +0 -85
  488. package/scripts/install-cursor.sh +0 -56
  489. package/scripts/install-hooks.sh +0 -73
  490. package/scripts/install-interactive.mjs +0 -357
  491. package/scripts/install-opencode.sh +0 -75
  492. package/scripts/install-plugin.mjs +0 -415
  493. package/scripts/install-windsurf.sh +0 -67
  494. package/scripts/remote-preflight.mjs +0 -62
  495. package/scripts/squish-fallback.mjs +0 -132
  496. package/scripts/test-interactive.mjs +0 -131
  497. package/scripts/verify-mcp.mjs +0 -214
  498. package/skills/squish-memory/scripts/install.mjs +0 -335
  499. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Fact Deriver
3
+ *
4
+ * Derives implicit facts from existing relationships in the knowledge graph.
5
+ * Example: works_on(A, X) + uses(X, Y) -> depends_on(A, Y)
6
+ */
7
+ import type { RelationType } from '../graph/llm-entity-extractor.js';
8
+ export interface DerivedFact {
9
+ fromEntityId: string;
10
+ fromEntityName: string;
11
+ toEntityId: string;
12
+ toEntityName: string;
13
+ relationType: RelationType;
14
+ rule: string;
15
+ confidence: number;
16
+ isDerived: boolean;
17
+ }
18
+ /**
19
+ * Derive implicit facts from existing relationships in the knowledge graph.
20
+ * Applies transitivity and causal rules to find new relationships.
21
+ */
22
+ export declare function deriveFacts(projectId: string, options?: {
23
+ maxDerivations?: number;
24
+ minConfidence?: number;
25
+ storeResults?: boolean;
26
+ }): Promise<DerivedFact[]>;
27
+ /**
28
+ * Get all derived facts for a project.
29
+ */
30
+ export declare function getDerivedFacts(projectId: string): Promise<DerivedFact[]>;
31
+ //# sourceMappingURL=fact-deriver.d.ts.map
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Fact Deriver
3
+ *
4
+ * Derives implicit facts from existing relationships in the knowledge graph.
5
+ * Example: works_on(A, X) + uses(X, Y) -> depends_on(A, Y)
6
+ */
7
+ import { eq, and, or } from 'drizzle-orm';
8
+ import { getDb } from '../../db/index.js';
9
+ import { getSchema } from '../../db/schema.js';
10
+ import { logger } from '../logger.js';
11
+ const DERIVATION_RULES = [
12
+ // Transitivity rules
13
+ {
14
+ name: 'works_on_uses_depends_on',
15
+ fromType: 'works_on',
16
+ toType: 'uses',
17
+ derivedType: 'depends_on',
18
+ description: 'If A works on X and X uses Y, then A depends on Y',
19
+ confidence: 0.8,
20
+ },
21
+ {
22
+ name: 'manages_works_oversees',
23
+ fromType: 'manages',
24
+ toType: 'works_on',
25
+ derivedType: 'oversees',
26
+ description: 'If A manages B and B works on X, then A oversees X',
27
+ confidence: 0.75,
28
+ },
29
+ {
30
+ name: 'caused_affects_may_affect',
31
+ fromType: 'caused',
32
+ toType: 'affects',
33
+ derivedType: 'may_affect',
34
+ description: 'If X caused Y and Y affects Z, then X may affect Z',
35
+ confidence: 0.7,
36
+ },
37
+ {
38
+ name: 'part_of_contains',
39
+ fromType: 'part_of',
40
+ toType: 'contains',
41
+ derivedType: 'related_to',
42
+ description: 'If A is part of X and X contains B, then A is related to B',
43
+ confidence: 0.6,
44
+ },
45
+ {
46
+ name: 'uses_depends_on',
47
+ fromType: 'uses',
48
+ toType: 'depends_on',
49
+ derivedType: 'depends_on',
50
+ description: 'If A uses X and X depends on Y, then A depends on Y',
51
+ confidence: 0.85,
52
+ },
53
+ {
54
+ name: 'created_resolved',
55
+ fromType: 'created',
56
+ toType: 'resolved',
57
+ derivedType: 'related_to',
58
+ description: 'If A created X and X was resolved by B, then A is related to B',
59
+ confidence: 0.5,
60
+ },
61
+ {
62
+ name: 'blocks_depends_on',
63
+ fromType: 'blocks',
64
+ toType: 'depends_on',
65
+ derivedType: 'blocks',
66
+ description: 'If X blocks A and A depends on Y, then X may block Y',
67
+ confidence: 0.65,
68
+ },
69
+ ];
70
+ // ─── Main Derivation Function ─────────────────────────────────────────────────
71
+ /**
72
+ * Derive implicit facts from existing relationships in the knowledge graph.
73
+ * Applies transitivity and causal rules to find new relationships.
74
+ */
75
+ export async function deriveFacts(projectId, options) {
76
+ const { maxDerivations = 50, minConfidence = 0.6, storeResults = true } = options || {};
77
+ const db = await getDb();
78
+ const schema = await getSchema();
79
+ // Get all entities for this project
80
+ const entities = await db
81
+ .select()
82
+ .from(schema.entities)
83
+ .where(eq(schema.entities.projectId, projectId));
84
+ if (entities.length < 2)
85
+ return [];
86
+ const entityMap = new Map(entities.map((e) => [e.id, e]));
87
+ const derivedFacts = [];
88
+ // Get all relations for this project's entities
89
+ const entityIds = entities.map((e) => e.id);
90
+ const allRelations = [];
91
+ // Fetch in batches to avoid query size limits
92
+ const batchSize = 100;
93
+ for (let i = 0; i < entityIds.length; i += batchSize) {
94
+ const batch = entityIds.slice(i, i + batchSize);
95
+ const relations = await db
96
+ .select()
97
+ .from(schema.entityRelations)
98
+ .where(or(...batch.map((id) => eq(schema.entityRelations.fromEntityId, id))));
99
+ allRelations.push(...relations);
100
+ }
101
+ // Build adjacency list for fast lookup
102
+ const outgoing = new Map();
103
+ for (const rel of allRelations) {
104
+ if (!outgoing.has(rel.fromEntityId)) {
105
+ outgoing.set(rel.fromEntityId, new Map());
106
+ }
107
+ outgoing.get(rel.fromEntityId).set(rel.toEntityId, {
108
+ relationType: rel.type,
109
+ weight: rel.weight || 1,
110
+ });
111
+ }
112
+ // Apply derivation rules
113
+ for (const rule of DERIVATION_RULES) {
114
+ if (derivedFacts.length >= maxDerivations)
115
+ break;
116
+ if (rule.confidence < minConfidence)
117
+ continue;
118
+ // Find all pairs where fromType matches
119
+ for (const [fromId, targets] of outgoing) {
120
+ if (derivedFacts.length >= maxDerivations)
121
+ break;
122
+ for (const [midId, fromRel] of targets) {
123
+ if (fromRel.relationType !== rule.fromType)
124
+ continue;
125
+ // Check if midId has outgoing toType relations
126
+ const midTargets = outgoing.get(midId);
127
+ if (!midTargets)
128
+ continue;
129
+ for (const [toId, toRel] of midTargets) {
130
+ if (toRel.relationType !== rule.toType)
131
+ continue;
132
+ // Found a derivation: fromId --fromType--> midId --toType--> toId
133
+ // Derive: fromId --derivedType--> toId
134
+ const fromEntity = entityMap.get(fromId);
135
+ const toEntity = entityMap.get(toId);
136
+ if (!fromEntity || !toEntity)
137
+ continue;
138
+ // Check if this derived relation already exists
139
+ const existing = await db
140
+ .select()
141
+ .from(schema.entityRelations)
142
+ .where(and(eq(schema.entityRelations.fromEntityId, fromId), eq(schema.entityRelations.toEntityId, toId), eq(schema.entityRelations.type, rule.derivedType)))
143
+ .limit(1);
144
+ if (existing.length > 0)
145
+ continue; // Already exists
146
+ const derivedFact = {
147
+ fromEntityId: fromId,
148
+ fromEntityName: fromEntity.name,
149
+ toEntityId: toId,
150
+ toEntityName: toEntity.name,
151
+ relationType: rule.derivedType,
152
+ rule: rule.name,
153
+ confidence: rule.confidence,
154
+ isDerived: true,
155
+ };
156
+ derivedFacts.push(derivedFact);
157
+ // Store the derived fact if requested
158
+ if (storeResults) {
159
+ try {
160
+ await db.insert(schema.entityRelations).values({
161
+ fromEntityId: fromId,
162
+ toEntityId: toId,
163
+ type: rule.derivedType,
164
+ weight: Math.round(rule.confidence * 10),
165
+ properties: {
166
+ derived: true,
167
+ rule: rule.name,
168
+ confidence: rule.confidence,
169
+ description: rule.description,
170
+ },
171
+ });
172
+ }
173
+ catch (error) {
174
+ logger.debug('Error storing derived fact', {
175
+ rule: rule.name,
176
+ from: fromEntity.name,
177
+ to: toEntity.name,
178
+ error: error,
179
+ });
180
+ }
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+ logger.info('Fact derivation completed', {
187
+ projectId,
188
+ derivedCount: derivedFacts.length,
189
+ rulesApplied: DERIVATION_RULES.length,
190
+ });
191
+ return derivedFacts;
192
+ }
193
+ /**
194
+ * Get all derived facts for a project.
195
+ */
196
+ export async function getDerivedFacts(projectId) {
197
+ const db = await getDb();
198
+ const schema = await getSchema();
199
+ // Get all entities for this project
200
+ const entities = await db
201
+ .select()
202
+ .from(schema.entities)
203
+ .where(eq(schema.entities.projectId, projectId));
204
+ const entityIds = entities.map((e) => e.id);
205
+ if (entityIds.length === 0)
206
+ return [];
207
+ // Get all derived relations
208
+ const derivedRelations = [];
209
+ const batchSize = 100;
210
+ for (let i = 0; i < entityIds.length; i += batchSize) {
211
+ const batch = entityIds.slice(i, i + batchSize);
212
+ const relations = await db
213
+ .select()
214
+ .from(schema.entityRelations)
215
+ .where(or(...batch.map((id) => eq(schema.entityRelations.fromEntityId, id))));
216
+ for (const rel of relations) {
217
+ const props = rel.properties;
218
+ if (props && props.derived === true) {
219
+ const fromEntity = entities.find((e) => e.id === rel.fromEntityId);
220
+ const toEntity = entities.find((e) => e.id === rel.toEntityId);
221
+ derivedRelations.push({
222
+ fromEntityId: rel.fromEntityId,
223
+ fromEntityName: fromEntity?.name || 'Unknown',
224
+ toEntityId: rel.toEntityId,
225
+ toEntityName: toEntity?.name || 'Unknown',
226
+ relationType: rel.type,
227
+ rule: props.rule || 'unknown',
228
+ confidence: props.confidence || 0.5,
229
+ isDerived: true,
230
+ });
231
+ }
232
+ }
233
+ }
234
+ return derivedRelations;
235
+ }
236
+ //# sourceMappingURL=fact-deriver.js.map
@@ -1,29 +1,27 @@
1
- import { hybridScore, HybridScorerOptions } from './hybrid-scorer.js';
2
- import { SearchInput, MemoryRecord } from './memories.js';
1
+ import type { MemoryRecord } from '../lib/types.js';
2
+ import type { SearchInput } from './memories.js';
3
3
  export interface HybridSearchOptions extends SearchInput {
4
4
  candidateLimit?: number;
5
5
  resultLimit?: number;
6
- hybridOptions?: HybridScorerOptions;
7
- queryEntities?: string[];
8
- sessionId?: string;
9
- skipRewrite?: boolean;
10
6
  }
11
7
  export interface HybridSearchResult extends MemoryRecord {
12
8
  hybridScore: number;
13
9
  semanticScore: number;
14
10
  recencyScore: number;
15
- coactivationScore: number;
16
11
  importanceScore: number;
17
- confidenceScore: number;
18
- feedbackScore: number;
19
- entityBoost: number;
12
+ coactivationScore: number;
20
13
  rank: number;
21
- queryRewrite?: {
22
- original: string;
23
- rewritten: string;
24
- method: string;
25
- };
14
+ explanation: string;
26
15
  }
27
- export declare function applyEntityBoostAndRerank(scored: Awaited<ReturnType<typeof hybridScore>>): Awaited<ReturnType<typeof hybridScore>>;
16
+ type ScoredItem = {
17
+ memoryId: string;
18
+ memory: Record<string, unknown>;
19
+ totalScore: number;
20
+ components: Record<string, number>;
21
+ rank: number;
22
+ explanation: string;
23
+ };
24
+ export declare function applyEntityBoostAndRerank<T extends ScoredItem>(scored: T[]): T[];
28
25
  export declare function hybridSearch(options: HybridSearchOptions): Promise<HybridSearchResult[]>;
26
+ export {};
29
27
  //# sourceMappingURL=hybrid-retrieval.d.ts.map
@@ -1,139 +1,37 @@
1
- import { hybridScore } from './hybrid-scorer.js';
2
- import { getEmbedding } from '../embeddings.js';
3
- import { search } from './memories.js';
4
- import { filterByEntities } from './entity-resolver.js';
5
- import { rewriteQuery, wouldBenefitFromRewrite } from './query-rewriter.js';
6
- import { collectRecentContext } from './context-collector.js';
7
- import { config } from '../../config.js';
8
- import { logger } from '../logger.js';
9
- import { startTrace, addQueryRewriteStage, addCandidateRetrievalStage, addEntityFilteringStage, addHybridScoringStage, addRerankingStage, completeTrace, } from '../tracing/collector.js';
1
+ import { hybridSearch as currentHybridSearch } from './hybrid-search.js';
10
2
  export function applyEntityBoostAndRerank(scored) {
11
- const boosted = scored.map((item) => {
3
+ return scored
4
+ .map((item) => {
12
5
  const rawBoost = item.memory._entityBoost;
13
- const entityBoost = typeof rawBoost === 'number' ? rawBoost : 0.5;
14
- const multiplier = 0.8 + entityBoost * 0.4;
6
+ const entityBoost = typeof rawBoost === 'number' ? rawBoost : 0;
15
7
  return {
16
8
  ...item,
17
- totalScore: Math.min(100, Math.round(item.totalScore * multiplier * 100) / 100),
9
+ totalScore: item.totalScore + entityBoost * 20,
18
10
  };
19
- });
20
- boosted.sort((a, b) => b.totalScore - a.totalScore);
21
- for (let i = 0; i < boosted.length; i++) {
22
- boosted[i].rank = i + 1;
23
- }
24
- return boosted;
11
+ })
12
+ .sort((a, b) => b.totalScore - a.totalScore)
13
+ .map((item, index) => ({
14
+ ...item,
15
+ rank: index + 1,
16
+ }));
25
17
  }
26
18
  export async function hybridSearch(options) {
27
- const candidateLimit = options.candidateLimit ?? 50;
28
- const resultLimit = options.resultLimit ?? options.limit ?? 5;
29
- // Start trace if sessionId provided
30
- const sessionId = options.sessionId || 'unknown';
31
- const traceId = await startTrace(sessionId, options.query);
32
- let query = options.query;
33
- let rewriteInfo = null;
34
- // Query rewriting stage
35
- if (config.queryRewritingEnabled && !options.skipRewrite && options.sessionId) {
36
- const rewriteStart = Date.now();
37
- try {
38
- const context = await collectRecentContext(options.sessionId, config.queryRewritingContextMessages);
39
- if (wouldBenefitFromRewrite(query) || context.length > 0) {
40
- const result = await rewriteQuery(query, context);
41
- if (result.rewritten !== result.original) {
42
- rewriteInfo = {
43
- original: result.original,
44
- rewritten: result.rewritten,
45
- method: result.method,
46
- };
47
- query = result.rewritten;
48
- logger.info(`[HybridSearch] Query rewritten: "${result.original}" -> "${result.rewritten}" (${result.method})`);
49
- }
50
- // Record query rewrite stage
51
- await addQueryRewriteStage(traceId, {
52
- original: result.original,
53
- rewritten: result.rewritten,
54
- method: result.method,
55
- timeMs: Date.now() - rewriteStart,
56
- });
57
- }
58
- }
59
- catch (error) {
60
- logger.warn(`[HybridSearch] Query rewriting failed: ${error instanceof Error ? error.message : String(error)}`);
61
- }
62
- }
63
- // Get embedding
64
- const queryEmbedding = await getEmbedding(query);
65
- // Candidate retrieval stage
66
- const retrievalStart = Date.now();
67
- const candidates = await search({
68
- ...options,
69
- limit: candidateLimit,
70
- });
71
- await addCandidateRetrievalStage(traceId, {
72
- candidates: candidates.length,
73
- timeMs: Date.now() - retrievalStart,
74
- });
75
- if (candidates.length === 0) {
76
- await completeTrace(traceId, []);
77
- return [];
78
- }
79
- // Entity filtering stage
80
- const filteringStart = Date.now();
81
- const entityScored = filterByEntities(candidates, options.queryEntities || []);
82
- await addEntityFilteringStage(traceId, {
83
- entities: options.queryEntities || [],
84
- results: entityScored.length,
85
- timeMs: Date.now() - filteringStart,
19
+ const limit = options.resultLimit ?? options.limit ?? 5;
20
+ const results = await currentHybridSearch(options, {
21
+ limit,
22
+ project: options.project,
23
+ type: options.type,
24
+ tags: options.tags,
86
25
  });
87
- const boostedCandidates = entityScored.map(({ memory, entityBoost }) => ({
88
- ...memory,
89
- _entityBoost: entityBoost,
90
- }));
91
- // Hybrid scoring stage
92
- const scoringStart = Date.now();
93
- const scored = await hybridScore(queryEmbedding, boostedCandidates, {
94
- ...options.hybridOptions,
95
- weights: {
96
- semantic: 0.30,
97
- recency: 0.20,
98
- coactivation: 0.10,
99
- importance: 0.15,
100
- confidence: 0.15,
101
- feedback: 0.10,
102
- ...options.hybridOptions?.weights,
103
- },
104
- decayDays: 7,
105
- });
106
- await addHybridScoringStage(traceId, {
107
- results: scored.length,
108
- timeMs: Date.now() - scoringStart,
109
- });
110
- // Reranking stage
111
- const rerankStart = Date.now();
112
- const reranked = applyEntityBoostAndRerank(scored);
113
- await addRerankingStage(traceId, {
114
- results: reranked.length,
115
- timeMs: Date.now() - rerankStart,
116
- });
117
- const topResults = reranked.slice(0, resultLimit);
118
- // Complete trace with results
119
- const traceResults = topResults.map((r) => ({
120
- type: r.memory?.type,
121
- content: r.memory?.content,
122
- hybridScore: r.totalScore,
123
- }));
124
- await completeTrace(traceId, traceResults);
125
- return topResults.map((scoredItem, index) => ({
126
- ...scoredItem.memory,
127
- hybridScore: scoredItem.totalScore,
128
- semanticScore: scoredItem.components.semantic,
129
- recencyScore: scoredItem.components.recency,
130
- coactivationScore: scoredItem.components.coactivation,
131
- importanceScore: scoredItem.components.importance,
132
- confidenceScore: scoredItem.components.confidence,
133
- feedbackScore: scoredItem.components.feedback,
134
- entityBoost: scoredItem.memory._entityBoost || 0.5,
26
+ return results.map((result, index) => ({
27
+ ...result,
28
+ hybridScore: result.similarity ?? 0,
29
+ semanticScore: result.similarity ?? 0,
30
+ recencyScore: 0,
31
+ importanceScore: typeof result.importance === 'number' ? result.importance : 0,
32
+ coactivationScore: 0,
135
33
  rank: index + 1,
136
- ...(rewriteInfo && { queryRewrite: rewriteInfo }),
34
+ explanation: 'Compatibility result from current hybrid search',
137
35
  }));
138
36
  }
139
37
  //# sourceMappingURL=hybrid-retrieval.js.map
@@ -1,5 +1,6 @@
1
1
  /** Hybrid Scorer - Multi-factor relevance scoring for memory ranking */
2
2
  import { logger } from '../../core/logger.js';
3
+ import { cosineSimilarity } from '../utils/vector-operations.js';
3
4
  export async function hybridScore(queryEmbedding, memories, options = {}) {
4
5
  const weights = {
5
6
  semantic: options.weights?.semantic ?? 0.30,
@@ -70,8 +71,8 @@ function calculateSemanticScore(queryEmbedding, memory) {
70
71
  }
71
72
  if (!memoryEmbedding || memoryEmbedding.length === 0)
72
73
  return 50;
73
- const cosineSimilarity = calculateCosineSimilarity(queryEmbedding, memoryEmbedding);
74
- return Math.max(0, Math.min(100, (cosineSimilarity + 1) * 50));
74
+ const semanticScore = cosineSimilarity(queryEmbedding, memoryEmbedding);
75
+ return Math.max(0, Math.min(100, (semanticScore + 1) * 50));
75
76
  }
76
77
  catch (error) {
77
78
  logger.error('Error calculating semantic score', error);
@@ -144,10 +145,10 @@ function calculateCoactivationScore(memory) {
144
145
  }
145
146
  function calculateImportanceScore(memory) {
146
147
  let score = 50;
148
+ // Simplified: hot or cold only (warm removed)
147
149
  if (memory.tier === 'hot')
148
150
  score += 30;
149
- else if (memory.tier === 'warm')
150
- score += 15;
151
+ // No bonus for cold - it's the fallback
151
152
  if (memory.relevanceScore)
152
153
  score += memory.relevanceScore * 0.2;
153
154
  if (memory.isPinned)
@@ -207,23 +208,6 @@ function calculateFeedbackScore(memory) {
207
208
  const retrievalPriority = memory.retrievalPriority ?? 50;
208
209
  return Math.max(0, Math.min(100, retrievalPriority));
209
210
  }
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
211
  function generateScoreExplanation(components, weights, memory) {
228
212
  const parts = [];
229
213
  if (components.semantic > 70)
@@ -238,10 +222,9 @@ function generateScoreExplanation(components, weights, memory) {
238
222
  parts.push('moderately recent');
239
223
  else
240
224
  parts.push('older');
225
+ // Simplified: hot or cold only (warm removed)
241
226
  if (memory.tier === 'hot')
242
227
  parts.push('active memory');
243
- else if (memory.tier === 'warm')
244
- parts.push('accessible memory');
245
228
  else
246
229
  parts.push('archived memory');
247
230
  if (components.coactivation > 60)
@@ -1,6 +1,8 @@
1
1
  /**
2
- * Hybrid Search - Combines BM25 keyword search with vector semantic search
3
- * Uses Reciprocal Rank Fusion (RRF) for result merging
2
+ * Vector Search - Pure semantic search with optional graph boosting + multi-session support
3
+ *
4
+ * Uses cosine similarity on embeddings + optional graph boost
5
+ * BM25 removed - use qmd-client for hot tier (BM25 + vectors + reranking)
4
6
  */
5
7
  import type { SearchResult, SearchInput } from './memories.js';
6
8
  export interface HybridSearchOptions {
@@ -8,13 +10,14 @@ export interface HybridSearchOptions {
8
10
  project?: string;
9
11
  type?: string;
10
12
  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;
13
+ enableMultiSession?: boolean;
14
+ enableGraphTraversal?: boolean;
15
+ enableHeuristics?: boolean;
16
+ includeAssociations?: boolean;
15
17
  }
16
18
  /**
17
- * Main hybrid search function - combines BM25 and vector search with RRF
19
+ * Main search function - vectors + graph boost + heuristics + places + sessions
20
+ * Unified search integrating Places, Graph, and Memory
18
21
  */
19
22
  export declare function hybridSearch(input: SearchInput, options?: HybridSearchOptions): Promise<SearchResult[]>;
20
23
  //# sourceMappingURL=hybrid-search.d.ts.map