squish-memory 1.1.5 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (646) hide show
  1. package/.env.example +32 -16
  2. package/CHANGELOG.md +147 -0
  3. package/README.md +120 -78
  4. package/{scripts → bin}/dependency-manager.mjs +217 -217
  5. package/{scripts → bin}/detect-clients.mjs +78 -78
  6. package/bin/install-interactive.mjs +321 -0
  7. package/bin/squish-mcp.mjs +44 -0
  8. package/bin/squish.mjs +33 -0
  9. package/config/mcp-migration-map.json +1 -6
  10. package/config/mcp-mode-semantics.json +19 -23
  11. package/config/mcp-remote-auth.json +3 -26
  12. package/config/mcp-universal.schema.json +5 -35
  13. package/config/settings.json +107 -52
  14. package/config.js +5 -0
  15. package/config.ts +218 -0
  16. package/core/adapters/config/claude-code.ts +133 -0
  17. package/core/adapters/config/cursor.ts +90 -0
  18. package/core/adapters/config/opencode.ts +89 -0
  19. package/core/adapters/config/windsurf.ts +90 -0
  20. package/core/adapters/index.ts +102 -0
  21. package/core/adapters/timeline.ts +116 -0
  22. package/core/adapters/types.ts +166 -0
  23. package/core/agent-preferences.ts +140 -0
  24. package/core/algorithms/analytics/token-estimator.ts +216 -0
  25. package/core/algorithms/detection/hash-filters.ts +260 -0
  26. package/core/algorithms/detection/semantic-ranker.ts +194 -0
  27. package/core/algorithms/detection/two-stage-detector.ts +421 -0
  28. package/core/algorithms/handlers/approve-merge.ts +215 -0
  29. package/core/algorithms/handlers/detect-duplicates.ts +192 -0
  30. package/core/algorithms/handlers/get-stats.ts +132 -0
  31. package/core/algorithms/handlers/list-proposals.ts +130 -0
  32. package/core/algorithms/handlers/preview-merge.ts +139 -0
  33. package/core/algorithms/handlers/reject-merge.ts +93 -0
  34. package/core/algorithms/handlers/reverse-merge.ts +155 -0
  35. package/{dist/core/algorithms/index.js → core/algorithms/index.ts} +39 -26
  36. package/core/algorithms/operations/cache-maintenance.ts +182 -0
  37. package/core/algorithms/safety/safety-checks.ts +256 -0
  38. package/core/algorithms/strategies/merge-strategies.ts +381 -0
  39. package/core/algorithms/types.ts +140 -0
  40. package/core/algorithms/utils/response-builder.ts +61 -0
  41. package/core/associations.ts +363 -0
  42. package/core/beliefs/decay.ts +289 -0
  43. package/core/beliefs/extractor.ts +131 -0
  44. package/core/beliefs/store.ts +557 -0
  45. package/core/beliefs/types.ts +38 -0
  46. package/core/commands/mcp-server.ts +5 -0
  47. package/core/compression.ts +177 -0
  48. package/core/config.js +2 -0
  49. package/core/consolidation.ts +330 -0
  50. package/core/context/agent-context.ts +388 -0
  51. package/core/context/context-paging.ts +449 -0
  52. package/core/context/context-window.ts +234 -0
  53. package/core/context/context.ts +35 -0
  54. package/core/embeddings/embeddings.ts +616 -0
  55. package/core/embeddings/google-multimodal.ts +200 -0
  56. package/{dist/core/local-embeddings.js → core/embeddings/local-embeddings.ts} +12 -11
  57. package/core/embeddings/qmd-client.ts +495 -0
  58. package/core/embeddings/transformers-local.ts +261 -0
  59. package/core/embeddings.js +4 -0
  60. package/core/error-handling.ts +206 -0
  61. package/core/external +219 -0
  62. package/core/graph/entity-deduplicator.ts +232 -0
  63. package/core/graph/graph-builder.ts +257 -0
  64. package/core/graph/graph-traversal.ts +490 -0
  65. package/core/graph/index.ts +24 -0
  66. package/core/graph/llm-entity-extractor.ts +402 -0
  67. package/core/graph/multi-hop-retrieval.ts +317 -0
  68. package/core/graph/relationship-extractor.ts +465 -0
  69. package/core/hooks/agent-hooks.ts +653 -0
  70. package/core/hooks/auto-tagger.ts +149 -0
  71. package/core/hooks/capture-filter.ts +169 -0
  72. package/core/hot-cache.ts +388 -0
  73. package/core/index.ts +10 -0
  74. package/core/ingestion/agent-memory.ts +167 -0
  75. package/core/ingestion/core-memory.ts +326 -0
  76. package/core/ingestion/learnings.ts +260 -0
  77. package/core/ingestion/signal-engine.ts +266 -0
  78. package/core/integrations/obsidian-vault.ts +197 -0
  79. package/core/layers/generator.ts +115 -0
  80. package/{dist/core/lib/db-client.d.ts → core/lib/db-client.ts} +168 -114
  81. package/core/lib/parse-embedding.ts +59 -0
  82. package/{dist/core/lib/schemas.js → core/lib/schemas.ts} +102 -87
  83. package/core/lib/types.ts +49 -0
  84. package/core/lib/utils.ts +151 -0
  85. package/core/lib/validation.ts +180 -0
  86. package/core/lifecycle.ts +353 -0
  87. package/core/logger.ts +59 -0
  88. package/core/memory/bridge-discovery.ts +395 -0
  89. package/core/memory/categorizer.ts +390 -0
  90. package/core/memory/conflict-detector.ts +62 -0
  91. package/core/memory/consolidation.ts +372 -0
  92. package/core/memory/context-collector.ts +75 -0
  93. package/core/memory/contradiction-resolver.ts +494 -0
  94. package/core/memory/edit-workflow.ts +174 -0
  95. package/core/memory/entity-extractor.ts +426 -0
  96. package/core/memory/entity-resolver.ts +89 -0
  97. package/core/memory/explain.ts +112 -0
  98. package/core/memory/fact-deriver.ts +300 -0
  99. package/core/memory/fact-extractor.ts +120 -0
  100. package/core/memory/feedback-tracker.ts +200 -0
  101. package/core/memory/hooks.ts +230 -0
  102. package/core/memory/hybrid-retrieval.ts +65 -0
  103. package/core/memory/hybrid-scorer.ts +325 -0
  104. package/core/memory/hybrid-search.ts +748 -0
  105. package/core/memory/importance.ts +319 -0
  106. package/{dist/core/memory/index.js → core/memory/index.ts} +11 -10
  107. package/core/memory/loader.ts +178 -0
  108. package/core/memory/markdown/markdown-storage.ts +318 -0
  109. package/core/memory/memories.ts +565 -0
  110. package/core/memory/memory-lifecycle.ts +51 -0
  111. package/core/memory/memory-manager.ts +53 -0
  112. package/core/memory/migrate.ts +173 -0
  113. package/core/memory/normalization.ts +30 -0
  114. package/core/memory/path-strengthener.ts +211 -0
  115. package/core/memory/progressive-disclosure.ts +392 -0
  116. package/core/memory/query-processor.ts +130 -0
  117. package/core/memory/query-rewriter.ts +153 -0
  118. package/core/memory/response-analyzer.ts +81 -0
  119. package/core/memory/retrieval-feedback.ts +276 -0
  120. package/core/memory/serialization.ts +83 -0
  121. package/core/memory/stale-cleaner.ts +147 -0
  122. package/core/memory/stats.ts +181 -0
  123. package/core/memory/telemetry.ts +392 -0
  124. package/core/memory/temporal-facts.ts +356 -0
  125. package/core/memory/temporal-parser.ts +477 -0
  126. package/core/memory/trigger-detector.ts +104 -0
  127. package/core/memory/write-gate.ts +288 -0
  128. package/{dist/core/places/index.js → core/places/index.ts} +12 -12
  129. package/core/places/memory-places.ts +339 -0
  130. package/core/places/places.ts +406 -0
  131. package/core/places/rules.ts +308 -0
  132. package/core/places/walking.ts +192 -0
  133. package/core/projects +89 -0
  134. package/core/projects.ts +131 -0
  135. package/core/redis.ts +82 -0
  136. package/core/responses.ts +187 -0
  137. package/core/runtime/trust-report.ts +195 -0
  138. package/core/runtime/trust-state.ts +360 -0
  139. package/core/scheduler/cron-scheduler.ts +590 -0
  140. package/core/scheduler/heartbeat.ts +91 -0
  141. package/{dist/core/scheduler/index.js → core/scheduler/index.ts} +8 -8
  142. package/core/scheduler/job-runner.ts +197 -0
  143. package/core/search/conversations.ts +166 -0
  144. package/core/search/entities.ts +46 -0
  145. package/core/search/folder-context.ts +154 -0
  146. package/core/search/graph-boost.ts +22 -0
  147. package/{dist/core/search/index.js → core/search/index.ts} +4 -5
  148. package/core/search/qmd-wrapper.ts +84 -0
  149. package/core/security/encrypt.ts +51 -0
  150. package/core/security/governance.ts +102 -0
  151. package/core/security/privacy.ts +108 -0
  152. package/core/security/secret-detector.ts +122 -0
  153. package/core/session/auto-load.ts +160 -0
  154. package/core/session/entity-tracker.ts +363 -0
  155. package/{dist/core/session/index.js → core/session/index.ts} +7 -7
  156. package/core/session/reference-resolver.ts +158 -0
  157. package/core/session/self-iteration-job.ts +478 -0
  158. package/core/session/session-hooks.ts +69 -0
  159. package/core/session/types.ts +36 -0
  160. package/core/session/working-set.ts +275 -0
  161. package/{dist/core/snapshots/cleanup.js → core/snapshots/cleanup.ts} +13 -12
  162. package/core/snapshots/comparison.ts +59 -0
  163. package/core/snapshots/creation.ts +139 -0
  164. package/core/snapshots/retrieval.ts +44 -0
  165. package/core/snapshots/stats.ts +63 -0
  166. package/core/storage/cache.ts +241 -0
  167. package/core/storage/database.ts +23 -0
  168. package/{dist/core/summarization/cleanup.js → core/summarization/cleanup.ts} +13 -12
  169. package/core/summarization/queries.ts +32 -0
  170. package/core/summarization/stats.ts +64 -0
  171. package/core/summarization/strategies.ts +52 -0
  172. package/core/summarization.ts +248 -0
  173. package/core/temporal-facts.ts +244 -0
  174. package/core/tracing/collector.ts +470 -0
  175. package/core/tracing/visualizer.ts +195 -0
  176. package/core/utils/cleanup-operations.ts +50 -0
  177. package/core/utils/content-extraction.ts +95 -0
  178. package/core/utils/filter-builder.ts +56 -0
  179. package/core/utils/history-traversal.ts +63 -0
  180. package/core/utils/memory-operations.ts +56 -0
  181. package/core/utils/query-operations.ts +83 -0
  182. package/core/utils/summarization-helpers.ts +45 -0
  183. package/core/utils/temporal-queries.ts +39 -0
  184. package/{dist/core/utils/vector-operations.js → core/utils/vector-operations.ts} +135 -129
  185. package/core/utils/version-management.ts +74 -0
  186. package/core/worker.ts +333 -0
  187. package/db/adapter.ts +215 -0
  188. package/{dist/db/bootstrap.js → db/bootstrap.ts} +388 -418
  189. package/db/drizzle/migrations/0000_needy_cerebro.sql +402 -0
  190. package/db/drizzle/migrations/meta/0000_snapshot.json +3451 -0
  191. package/db/drizzle/migrations/meta/_journal.json +13 -0
  192. package/db/drizzle/schema-sqlite.ts +1032 -0
  193. package/db/drizzle/schema.ts +1128 -0
  194. package/db/drizzle.config.ts +12 -0
  195. package/db/index.ts +83 -0
  196. package/db/init.sql +5 -0
  197. package/db/migrations/associations.ts +35 -0
  198. package/db/migrations/beliefs.ts +89 -0
  199. package/db/migrations/core-memory.ts +35 -0
  200. package/db/migrations/fts.ts +59 -0
  201. package/db/migrations/index.ts +54 -0
  202. package/db/migrations/indexes.ts +36 -0
  203. package/db/migrations/learnings.ts +34 -0
  204. package/db/migrations/maintenance.ts +68 -0
  205. package/db/migrations/memories.ts +22 -0
  206. package/db/migrations/memory-places.ts +35 -0
  207. package/db/migrations/places.ts +49 -0
  208. package/db/migrations/projects.ts +21 -0
  209. package/db/migrations/tier-conversion.ts +24 -0
  210. package/db/neon.ts +22 -0
  211. package/db/schema/beliefs.ts +50 -0
  212. package/db/schema/generator.ts +159 -0
  213. package/db/schema/index.ts +58 -0
  214. package/db/schema/learnings.ts +32 -0
  215. package/db/schema/memories.ts +83 -0
  216. package/db/schema/projects.ts +33 -0
  217. package/db/schema.ts +13 -0
  218. package/db/supabase.ts +27 -0
  219. package/mcp.json.example +8 -11
  220. package/package.json +140 -159
  221. package/packages/cli/package.json +22 -0
  222. package/packages/cli/src/commands/clean.ts +68 -0
  223. package/packages/cli/src/commands/context.ts +79 -0
  224. package/packages/cli/src/commands/doctor.ts +357 -0
  225. package/packages/cli/src/commands/forget.ts +72 -0
  226. package/packages/cli/src/commands/health.ts +36 -0
  227. package/packages/cli/src/commands/inspect.ts +41 -0
  228. package/packages/cli/src/commands/link.ts +50 -0
  229. package/packages/cli/src/commands/migrate.ts +93 -0
  230. package/packages/cli/src/commands/recall.ts +99 -0
  231. package/packages/cli/src/commands/recent.ts +57 -0
  232. package/packages/cli/src/commands/remember.ts +139 -0
  233. package/packages/cli/src/commands/run.ts +58 -0
  234. package/packages/cli/src/commands/stale.ts +43 -0
  235. package/packages/cli/src/commands/stats.ts +42 -0
  236. package/packages/cli/src/index.ts +57 -0
  237. package/packages/cli/tsconfig.json +24 -0
  238. package/packages/mcp/package.json +26 -0
  239. package/packages/mcp/src/index.ts +940 -0
  240. package/packages/mcp/tsconfig.json +20 -0
  241. package/skills/squish-memory/SKILL.md +38 -35
  242. package/skills/squish-memory/{scripts/install.sh → install.sh} +1 -1
  243. package/skills/squish-memory/references/claude-desktop.json +12 -0
  244. package/skills/squish-memory/references/openclaw.json +13 -0
  245. package/skills/squish-memory/references/opencode.json +14 -0
  246. package/config/hooks/claude-code-hooks.json +0 -39
  247. package/config/hooks/cursor-hooks.json +0 -30
  248. package/config/hooks/opencode-hooks.json +0 -30
  249. package/config/hooks/windsurf-hooks.json +0 -30
  250. package/config/mcp-cli-fallback-policy.json +0 -22
  251. package/config/mcp.json +0 -38
  252. package/config/plugin-manifest.json +0 -101
  253. package/config/plugin-manifest.schema.json +0 -244
  254. package/config/plugin.json +0 -32
  255. package/config/remote-memory-policy.json +0 -32
  256. package/core/commands/context-paging.md +0 -51
  257. package/core/commands/context-status.md +0 -22
  258. package/core/commands/context.md +0 -5
  259. package/core/commands/core-memory.md +0 -56
  260. package/core/commands/health.md +0 -5
  261. package/core/commands/init.md +0 -39
  262. package/core/commands/merge.md +0 -113
  263. package/core/commands/recall.md +0 -5
  264. package/core/commands/remember.md +0 -11
  265. package/core/commands/search.md +0 -10
  266. package/dist/config.d.ts +0 -83
  267. package/dist/config.js +0 -242
  268. package/dist/core/adapters/config/claude-code.d.ts +0 -45
  269. package/dist/core/adapters/config/claude-code.js +0 -113
  270. package/dist/core/adapters/config/cursor.d.ts +0 -26
  271. package/dist/core/adapters/config/cursor.js +0 -74
  272. package/dist/core/adapters/config/opencode.d.ts +0 -23
  273. package/dist/core/adapters/config/opencode.js +0 -73
  274. package/dist/core/adapters/config/windsurf.d.ts +0 -26
  275. package/dist/core/adapters/config/windsurf.js +0 -74
  276. package/dist/core/adapters/index.d.ts +0 -45
  277. package/dist/core/adapters/index.js +0 -84
  278. package/dist/core/adapters/scripts/install-adapter.d.ts +0 -19
  279. package/dist/core/adapters/scripts/install-adapter.js +0 -149
  280. package/dist/core/adapters/timeline.d.ts +0 -23
  281. package/dist/core/adapters/timeline.js +0 -88
  282. package/dist/core/adapters/types.d.ts +0 -157
  283. package/dist/core/adapters/types.js +0 -50
  284. package/dist/core/algorithms/analytics/token-estimator.d.ts +0 -50
  285. package/dist/core/algorithms/analytics/token-estimator.js +0 -154
  286. package/dist/core/algorithms/detection/hash-filters.d.ts +0 -47
  287. package/dist/core/algorithms/detection/hash-filters.js +0 -190
  288. package/dist/core/algorithms/detection/semantic-ranker.d.ts +0 -32
  289. package/dist/core/algorithms/detection/semantic-ranker.js +0 -118
  290. package/dist/core/algorithms/detection/two-stage-detector.d.ts +0 -52
  291. package/dist/core/algorithms/detection/two-stage-detector.js +0 -299
  292. package/dist/core/algorithms/handlers/approve-merge.d.ts +0 -22
  293. package/dist/core/algorithms/handlers/approve-merge.js +0 -179
  294. package/dist/core/algorithms/handlers/detect-duplicates.d.ts +0 -47
  295. package/dist/core/algorithms/handlers/detect-duplicates.js +0 -145
  296. package/dist/core/algorithms/handlers/get-stats.d.ts +0 -39
  297. package/dist/core/algorithms/handlers/get-stats.js +0 -88
  298. package/dist/core/algorithms/handlers/list-proposals.d.ts +0 -45
  299. package/dist/core/algorithms/handlers/list-proposals.js +0 -83
  300. package/dist/core/algorithms/handlers/preview-merge.d.ts +0 -39
  301. package/dist/core/algorithms/handlers/preview-merge.js +0 -93
  302. package/dist/core/algorithms/handlers/reject-merge.d.ts +0 -28
  303. package/dist/core/algorithms/handlers/reject-merge.js +0 -69
  304. package/dist/core/algorithms/handlers/reverse-merge.d.ts +0 -21
  305. package/dist/core/algorithms/handlers/reverse-merge.js +0 -121
  306. package/dist/core/algorithms/index.d.ts +0 -21
  307. package/dist/core/algorithms/operations/cache-maintenance.d.ts +0 -12
  308. package/dist/core/algorithms/operations/cache-maintenance.js +0 -157
  309. package/dist/core/algorithms/safety/safety-checks.d.ts +0 -22
  310. package/dist/core/algorithms/safety/safety-checks.js +0 -179
  311. package/dist/core/algorithms/strategies/merge-strategies.d.ts +0 -50
  312. package/dist/core/algorithms/strategies/merge-strategies.js +0 -288
  313. package/dist/core/algorithms/types.d.ts +0 -133
  314. package/dist/core/algorithms/types.js +0 -5
  315. package/dist/core/algorithms/utils/response-builder.d.ts +0 -28
  316. package/dist/core/algorithms/utils/response-builder.js +0 -37
  317. package/dist/core/associations.d.ts +0 -31
  318. package/dist/core/associations.js +0 -248
  319. package/dist/core/autosave.d.ts +0 -19
  320. package/dist/core/autosave.js +0 -16
  321. package/dist/core/commands/managed-sync.d.ts +0 -10
  322. package/dist/core/commands/managed-sync.js +0 -64
  323. package/dist/core/commands/mcp-server.d.ts +0 -3
  324. package/dist/core/commands/mcp-server.js +0 -739
  325. package/dist/core/consolidation.d.ts +0 -37
  326. package/dist/core/consolidation.js +0 -248
  327. package/dist/core/context/agent-context.d.ts +0 -106
  328. package/dist/core/context/agent-context.js +0 -274
  329. package/dist/core/context/context-paging.d.ts +0 -80
  330. package/dist/core/context/context-paging.js +0 -328
  331. package/dist/core/context/context-window.d.ts +0 -40
  332. package/dist/core/context/context-window.js +0 -177
  333. package/dist/core/context/context.d.ts +0 -7
  334. package/dist/core/context/context.js +0 -22
  335. package/dist/core/embeddings/google-multimodal.d.ts +0 -14
  336. package/dist/core/embeddings/google-multimodal.js +0 -142
  337. package/dist/core/embeddings/qmd-client.d.ts +0 -136
  338. package/dist/core/embeddings/qmd-client.js +0 -403
  339. package/dist/core/embeddings.d.ts +0 -29
  340. package/dist/core/embeddings.js +0 -454
  341. package/dist/core/error-handling.d.ts +0 -63
  342. package/dist/core/error-handling.js +0 -173
  343. package/dist/core/external-folder/index.d.ts +0 -102
  344. package/dist/core/external-folder/index.js +0 -294
  345. package/dist/core/hooks/agent-hooks.d.ts +0 -74
  346. package/dist/core/hooks/agent-hooks.js +0 -244
  347. package/dist/core/hooks/auto-tagger.d.ts +0 -19
  348. package/dist/core/hooks/auto-tagger.js +0 -155
  349. package/dist/core/hooks/capture-filter.d.ts +0 -41
  350. package/dist/core/hooks/capture-filter.js +0 -128
  351. package/dist/core/index.d.ts +0 -10
  352. package/dist/core/index.js +0 -14
  353. package/dist/core/ingestion/agent-memory.d.ts +0 -22
  354. package/dist/core/ingestion/agent-memory.js +0 -109
  355. package/dist/core/ingestion/core-memory.d.ts +0 -78
  356. package/dist/core/ingestion/core-memory.js +0 -226
  357. package/dist/core/ingestion/learnings.d.ts +0 -57
  358. package/dist/core/ingestion/learnings.js +0 -202
  359. package/dist/core/layers/generator.d.ts +0 -25
  360. package/dist/core/layers/generator.js +0 -76
  361. package/dist/core/lib/db-client.js +0 -130
  362. package/dist/core/lib/schemas.d.ts +0 -129
  363. package/dist/core/lib/utils.d.ts +0 -14
  364. package/dist/core/lib/utils.js +0 -90
  365. package/dist/core/lib/validation.d.ts +0 -38
  366. package/dist/core/lib/validation.js +0 -151
  367. package/dist/core/lifecycle.d.ts +0 -26
  368. package/dist/core/lifecycle.js +0 -302
  369. package/dist/core/local-embeddings.d.ts +0 -11
  370. package/dist/core/logger.d.ts +0 -16
  371. package/dist/core/logger.js +0 -40
  372. package/dist/core/mcp/client.d.ts +0 -17
  373. package/dist/core/mcp/client.js +0 -101
  374. package/dist/core/mcp/index.d.ts +0 -6
  375. package/dist/core/mcp/index.js +0 -6
  376. package/dist/core/mcp/server.d.ts +0 -18
  377. package/dist/core/mcp/server.js +0 -157
  378. package/dist/core/mcp/standalone-server.d.ts +0 -13
  379. package/dist/core/mcp/standalone-server.js +0 -46
  380. package/dist/core/mcp/tools.d.ts +0 -9
  381. package/dist/core/mcp/tools.js +0 -365
  382. package/dist/core/mcp/types.d.ts +0 -315
  383. package/dist/core/mcp/types.js +0 -48
  384. package/dist/core/memory/bridge-discovery.d.ts +0 -50
  385. package/dist/core/memory/bridge-discovery.js +0 -291
  386. package/dist/core/memory/categorizer.d.ts +0 -27
  387. package/dist/core/memory/categorizer.js +0 -305
  388. package/dist/core/memory/conflict-detector.d.ts +0 -7
  389. package/dist/core/memory/conflict-detector.js +0 -43
  390. package/dist/core/memory/consolidation.d.ts +0 -42
  391. package/dist/core/memory/consolidation.js +0 -303
  392. package/dist/core/memory/context-collector.d.ts +0 -10
  393. package/dist/core/memory/context-collector.js +0 -56
  394. package/dist/core/memory/contradiction-resolver.d.ts +0 -40
  395. package/dist/core/memory/contradiction-resolver.js +0 -368
  396. package/dist/core/memory/edit-workflow.d.ts +0 -19
  397. package/dist/core/memory/edit-workflow.js +0 -120
  398. package/dist/core/memory/entity-extractor.d.ts +0 -33
  399. package/dist/core/memory/entity-extractor.js +0 -336
  400. package/dist/core/memory/entity-resolver.d.ts +0 -23
  401. package/dist/core/memory/entity-resolver.js +0 -64
  402. package/dist/core/memory/fact-extractor.d.ts +0 -24
  403. package/dist/core/memory/fact-extractor.js +0 -89
  404. package/dist/core/memory/feedback-tracker.d.ts +0 -12
  405. package/dist/core/memory/feedback-tracker.js +0 -155
  406. package/dist/core/memory/hooks.d.ts +0 -88
  407. package/dist/core/memory/hooks.js +0 -174
  408. package/dist/core/memory/hybrid-retrieval.d.ts +0 -29
  409. package/dist/core/memory/hybrid-retrieval.js +0 -139
  410. package/dist/core/memory/hybrid-scorer.d.ts +0 -40
  411. package/dist/core/memory/hybrid-scorer.js +0 -284
  412. package/dist/core/memory/hybrid-search.d.ts +0 -20
  413. package/dist/core/memory/hybrid-search.js +0 -359
  414. package/dist/core/memory/importance.d.ts +0 -63
  415. package/dist/core/memory/importance.js +0 -298
  416. package/dist/core/memory/index.d.ts +0 -8
  417. package/dist/core/memory/loader.d.ts +0 -31
  418. package/dist/core/memory/loader.js +0 -141
  419. package/dist/core/memory/markdown/markdown-storage.d.ts +0 -72
  420. package/dist/core/memory/markdown/markdown-storage.js +0 -243
  421. package/dist/core/memory/memories.d.ts +0 -47
  422. package/dist/core/memory/memories.js +0 -449
  423. package/dist/core/memory/memory-lifecycle.d.ts +0 -8
  424. package/dist/core/memory/memory-lifecycle.js +0 -55
  425. package/dist/core/memory/memory-manager.d.ts +0 -15
  426. package/dist/core/memory/memory-manager.js +0 -46
  427. package/dist/core/memory/migrate.d.ts +0 -21
  428. package/dist/core/memory/migrate.js +0 -134
  429. package/dist/core/memory/normalization.d.ts +0 -22
  430. package/dist/core/memory/normalization.js +0 -26
  431. package/dist/core/memory/progressive-disclosure.d.ts +0 -43
  432. package/dist/core/memory/progressive-disclosure.js +0 -280
  433. package/dist/core/memory/query-processor.d.ts +0 -21
  434. package/dist/core/memory/query-processor.js +0 -72
  435. package/dist/core/memory/query-rewriter.d.ts +0 -13
  436. package/dist/core/memory/query-rewriter.js +0 -118
  437. package/dist/core/memory/response-analyzer.d.ts +0 -9
  438. package/dist/core/memory/response-analyzer.js +0 -61
  439. package/dist/core/memory/serialization.d.ts +0 -10
  440. package/dist/core/memory/serialization.js +0 -84
  441. package/dist/core/memory/stats.d.ts +0 -22
  442. package/dist/core/memory/stats.js +0 -138
  443. package/dist/core/memory/telemetry.d.ts +0 -69
  444. package/dist/core/memory/telemetry.js +0 -313
  445. package/dist/core/memory/temporal-facts.d.ts +0 -41
  446. package/dist/core/memory/temporal-facts.js +0 -283
  447. package/dist/core/memory/temporal-parser.d.ts +0 -32
  448. package/dist/core/memory/temporal-parser.js +0 -385
  449. package/dist/core/memory/trigger-detector.d.ts +0 -14
  450. package/dist/core/memory/trigger-detector.js +0 -42
  451. package/dist/core/memory/write-gate.d.ts +0 -54
  452. package/dist/core/memory/write-gate.js +0 -210
  453. package/dist/core/namespaces/index.d.ts +0 -71
  454. package/dist/core/namespaces/index.js +0 -305
  455. package/dist/core/namespaces/uri-parser.d.ts +0 -31
  456. package/dist/core/namespaces/uri-parser.js +0 -74
  457. package/dist/core/obsidian-vault.d.ts +0 -30
  458. package/dist/core/obsidian-vault.js +0 -94
  459. package/dist/core/places/index.d.ts +0 -14
  460. package/dist/core/places/memory-places.d.ts +0 -68
  461. package/dist/core/places/memory-places.js +0 -261
  462. package/dist/core/places/places.d.ts +0 -88
  463. package/dist/core/places/places.js +0 -314
  464. package/dist/core/places/rules.d.ts +0 -74
  465. package/dist/core/places/rules.js +0 -240
  466. package/dist/core/places/walking.d.ts +0 -56
  467. package/dist/core/places/walking.js +0 -121
  468. package/dist/core/projects.d.ts +0 -17
  469. package/dist/core/projects.js +0 -108
  470. package/dist/core/redis.d.ts +0 -11
  471. package/dist/core/redis.js +0 -69
  472. package/dist/core/responses.d.ts +0 -96
  473. package/dist/core/responses.js +0 -122
  474. package/dist/core/scheduler/cron-scheduler.d.ts +0 -32
  475. package/dist/core/scheduler/cron-scheduler.js +0 -332
  476. package/dist/core/scheduler/heartbeat.d.ts +0 -11
  477. package/dist/core/scheduler/heartbeat.js +0 -73
  478. package/dist/core/scheduler/index.d.ts +0 -8
  479. package/dist/core/scheduler/job-runner.d.ts +0 -11
  480. package/dist/core/scheduler/job-runner.js +0 -164
  481. package/dist/core/search/conversations.d.ts +0 -25
  482. package/dist/core/search/conversations.js +0 -110
  483. package/dist/core/search/entities.d.ts +0 -12
  484. package/dist/core/search/entities.js +0 -31
  485. package/dist/core/search/folder-context.d.ts +0 -25
  486. package/dist/core/search/folder-context.js +0 -119
  487. package/dist/core/search/graph-boost.d.ts +0 -7
  488. package/dist/core/search/graph-boost.js +0 -23
  489. package/dist/core/search/index.d.ts +0 -4
  490. package/dist/core/search/qmd-search.d.ts +0 -61
  491. package/dist/core/search/qmd-search.js +0 -178
  492. package/dist/core/security/encrypt.d.ts +0 -6
  493. package/dist/core/security/encrypt.js +0 -47
  494. package/dist/core/security/governance.d.ts +0 -26
  495. package/dist/core/security/governance.js +0 -79
  496. package/dist/core/security/privacy.d.ts +0 -23
  497. package/dist/core/security/privacy.js +0 -82
  498. package/dist/core/security/secret-detector.d.ts +0 -32
  499. package/dist/core/security/secret-detector.js +0 -88
  500. package/dist/core/session/auto-load.d.ts +0 -6
  501. package/dist/core/session/auto-load.js +0 -119
  502. package/dist/core/session/index.d.ts +0 -7
  503. package/dist/core/session/self-iteration-job.d.ts +0 -20
  504. package/dist/core/session/self-iteration-job.js +0 -282
  505. package/dist/core/session/session-hooks.d.ts +0 -18
  506. package/dist/core/session/session-hooks.js +0 -58
  507. package/dist/core/session/types.d.ts +0 -26
  508. package/dist/core/session/types.js +0 -10
  509. package/dist/core/session-hooks/self-iteration-job.d.ts +0 -20
  510. package/dist/core/session-hooks/self-iteration-job.js +0 -282
  511. package/dist/core/session-hooks/session-hooks.d.ts +0 -18
  512. package/dist/core/session-hooks/session-hooks.js +0 -58
  513. package/dist/core/snapshots/cleanup.d.ts +0 -9
  514. package/dist/core/snapshots/comparison.d.ts +0 -19
  515. package/dist/core/snapshots/comparison.js +0 -43
  516. package/dist/core/snapshots/creation.d.ts +0 -19
  517. package/dist/core/snapshots/creation.js +0 -126
  518. package/dist/core/snapshots/retrieval.d.ts +0 -7
  519. package/dist/core/snapshots/retrieval.js +0 -41
  520. package/dist/core/snapshots/stats.d.ts +0 -11
  521. package/dist/core/snapshots/stats.js +0 -52
  522. package/dist/core/snapshots.d.ts +0 -29
  523. package/dist/core/snapshots.js +0 -220
  524. package/dist/core/storage/cache.d.ts +0 -13
  525. package/dist/core/storage/cache.js +0 -202
  526. package/dist/core/storage/database.d.ts +0 -12
  527. package/dist/core/storage/database.js +0 -12
  528. package/dist/core/summarization/cleanup.d.ts +0 -9
  529. package/dist/core/summarization/queries.d.ts +0 -9
  530. package/dist/core/summarization/queries.js +0 -28
  531. package/dist/core/summarization/stats.d.ts +0 -14
  532. package/dist/core/summarization/stats.js +0 -52
  533. package/dist/core/summarization/strategies.d.ts +0 -24
  534. package/dist/core/summarization/strategies.js +0 -28
  535. package/dist/core/summarization.d.ts +0 -37
  536. package/dist/core/summarization.js +0 -188
  537. package/dist/core/sync/qmd-sync.d.ts +0 -94
  538. package/dist/core/sync/qmd-sync.js +0 -201
  539. package/dist/core/temporal-facts.d.ts +0 -54
  540. package/dist/core/temporal-facts.js +0 -193
  541. package/dist/core/toon.d.ts +0 -43
  542. package/dist/core/toon.js +0 -160
  543. package/dist/core/tracing/collector.d.ts +0 -111
  544. package/dist/core/tracing/collector.js +0 -350
  545. package/dist/core/tracing/visualizer.d.ts +0 -32
  546. package/dist/core/tracing/visualizer.js +0 -165
  547. package/dist/core/utils/cleanup-operations.d.ts +0 -13
  548. package/dist/core/utils/cleanup-operations.js +0 -44
  549. package/dist/core/utils/content-extraction.d.ts +0 -19
  550. package/dist/core/utils/content-extraction.js +0 -75
  551. package/dist/core/utils/filter-builder.d.ts +0 -13
  552. package/dist/core/utils/filter-builder.js +0 -44
  553. package/dist/core/utils/history-traversal.d.ts +0 -13
  554. package/dist/core/utils/history-traversal.js +0 -50
  555. package/dist/core/utils/memory-operations.d.ts +0 -17
  556. package/dist/core/utils/memory-operations.js +0 -43
  557. package/dist/core/utils/query-operations.d.ts +0 -18
  558. package/dist/core/utils/query-operations.js +0 -65
  559. package/dist/core/utils/summarization-helpers.d.ts +0 -21
  560. package/dist/core/utils/summarization-helpers.js +0 -38
  561. package/dist/core/utils/temporal-queries.d.ts +0 -13
  562. package/dist/core/utils/temporal-queries.js +0 -27
  563. package/dist/core/utils/vector-operations.d.ts +0 -71
  564. package/dist/core/utils/version-management.d.ts +0 -9
  565. package/dist/core/utils/version-management.js +0 -61
  566. package/dist/core/worker.d.ts +0 -82
  567. package/dist/core/worker.js +0 -272
  568. package/dist/db/adapter.d.ts +0 -7
  569. package/dist/db/adapter.js +0 -175
  570. package/dist/db/bootstrap.d.ts +0 -9
  571. package/dist/db/drizzle/schema-sqlite.d.ts +0 -4837
  572. package/dist/db/drizzle/schema-sqlite.js +0 -684
  573. package/dist/db/drizzle/schema.d.ts +0 -4082
  574. package/dist/db/drizzle/schema.js +0 -770
  575. package/dist/db/drizzle.config.d.ts +0 -3
  576. package/dist/db/drizzle.config.js +0 -12
  577. package/dist/db/index.d.ts +0 -7
  578. package/dist/db/index.js +0 -89
  579. package/dist/db/neon.d.ts +0 -8
  580. package/dist/db/neon.js +0 -20
  581. package/dist/db/schema/index.d.ts +0 -40
  582. package/dist/db/schema/index.js +0 -105
  583. package/dist/db/schema/tables/context-sessions.d.ts +0 -9
  584. package/dist/db/schema/tables/context-sessions.js +0 -37
  585. package/dist/db/schema/tables/conversations.d.ts +0 -9
  586. package/dist/db/schema/tables/conversations.js +0 -47
  587. package/dist/db/schema/tables/core-memory.d.ts +0 -9
  588. package/dist/db/schema/tables/core-memory.js +0 -41
  589. package/dist/db/schema/tables/entities.d.ts +0 -9
  590. package/dist/db/schema/tables/entities.js +0 -39
  591. package/dist/db/schema/tables/entity-relations.d.ts +0 -9
  592. package/dist/db/schema/tables/entity-relations.js +0 -31
  593. package/dist/db/schema/tables/learnings.d.ts +0 -9
  594. package/dist/db/schema/tables/learnings.js +0 -66
  595. package/dist/db/schema/tables/memories.d.ts +0 -9
  596. package/dist/db/schema/tables/memories.js +0 -161
  597. package/dist/db/schema/tables/memory-associations.d.ts +0 -9
  598. package/dist/db/schema/tables/memory-associations.js +0 -39
  599. package/dist/db/schema/tables/memory-hash-cache.d.ts +0 -9
  600. package/dist/db/schema/tables/memory-hash-cache.js +0 -29
  601. package/dist/db/schema/tables/memory-merge-history.d.ts +0 -9
  602. package/dist/db/schema/tables/memory-merge-history.js +0 -33
  603. package/dist/db/schema/tables/memory-merge-proposals.d.ts +0 -9
  604. package/dist/db/schema/tables/memory-merge-proposals.js +0 -39
  605. package/dist/db/schema/tables/messages.d.ts +0 -9
  606. package/dist/db/schema/tables/messages.js +0 -41
  607. package/dist/db/schema/tables/namespaces.d.ts +0 -9
  608. package/dist/db/schema/tables/namespaces.js +0 -37
  609. package/dist/db/schema/tables/projects.d.ts +0 -9
  610. package/dist/db/schema/tables/projects.js +0 -31
  611. package/dist/db/schema/tables/users.d.ts +0 -9
  612. package/dist/db/schema/tables/users.js +0 -27
  613. package/dist/db/schema.d.ts +0 -3
  614. package/dist/db/schema.js +0 -11
  615. package/dist/db/supabase.d.ts +0 -9
  616. package/dist/db/supabase.js +0 -24
  617. package/dist/index.d.ts +0 -7
  618. package/dist/index.js +0 -1677
  619. package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
  620. package/dist/webui/server.d.ts +0 -5
  621. package/dist/webui/server.js +0 -642
  622. package/generated/mcp/manifest.json +0 -23
  623. package/generated/mcp/mcp-servers.json +0 -25
  624. package/generated/mcp/mcporter.json +0 -34
  625. package/generated/mcp/openclaw-memory-qmd.json +0 -17
  626. package/generated/mcp/runtime.json +0 -12
  627. package/scripts/README.md +0 -60
  628. package/scripts/build-release.sh +0 -36
  629. package/scripts/check-secrets.js +0 -132
  630. package/scripts/copy-runtime-assets.mjs +0 -26
  631. package/scripts/generate-mcp.mjs +0 -264
  632. package/scripts/github-release.sh +0 -77
  633. package/scripts/init-dirs.mjs +0 -13
  634. package/scripts/install-claude-code.sh +0 -85
  635. package/scripts/install-cursor.sh +0 -56
  636. package/scripts/install-hooks.sh +0 -73
  637. package/scripts/install-interactive.mjs +0 -357
  638. package/scripts/install-opencode.sh +0 -75
  639. package/scripts/install-plugin.mjs +0 -415
  640. package/scripts/install-windsurf.sh +0 -67
  641. package/scripts/remote-preflight.mjs +0 -62
  642. package/scripts/squish-fallback.mjs +0 -132
  643. package/scripts/test-interactive.mjs +0 -131
  644. package/scripts/verify-mcp.mjs +0 -214
  645. package/skills/squish-memory/scripts/install.mjs +0 -335
  646. package/skills/squish-memory/write_skill.js +0 -2
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Memory Lifecycle Hooks
3
+ *
4
+ * Provides event hooks for memory operations:
5
+ * - memoryCreated: When a memory is stored (DB or markdown files)
6
+ * - memoryUpdated: When a memory is updated
7
+ * - memoryDeleted: When a memory is deleted
8
+ * - tierChange: When memory tier changes (hot/warm/cold)
9
+ * - decayApplied: When decay score is updated
10
+ *
11
+ * Each hook can have sync and async handlers.
12
+ * Usage: Register handlers to auto-capture, sync to external systems, etc.
13
+ */
14
+
15
+ import { logger } from '../logger.js';
16
+
17
+ export type HookEvent =
18
+ | 'memoryCreated'
19
+ | 'memoryUpdated'
20
+ | 'memoryDeleted'
21
+ | 'tierChange'
22
+ | 'decayApplied';
23
+
24
+ export interface MemoryHookContext {
25
+ memoryId: string;
26
+ content: string;
27
+ type: string;
28
+ tags: string[];
29
+ project?: string;
30
+ source?: string;
31
+ tier?: string;
32
+ importance?: number;
33
+ oldContent?: string; // For memoryUpdated events
34
+ }
35
+
36
+ export interface TierChangeContext extends MemoryHookContext {
37
+ oldTier: string;
38
+ newTier: string;
39
+ }
40
+
41
+ export interface DecayContext extends MemoryHookContext {
42
+ oldScore: number;
43
+ newScore: number;
44
+ }
45
+
46
+ export type HookHandler<T = MemoryHookContext> = (context: T) => void | Promise<void>;
47
+
48
+ interface HookRegistration {
49
+ event: HookEvent;
50
+ handler: HookHandler;
51
+ priority: number;
52
+ }
53
+
54
+ // Global hook registry
55
+ const hooks: HookRegistration[] = [];
56
+
57
+ /**
58
+ * Register a hook handler for a specific event
59
+ */
60
+ export function registerHook(
61
+ event: HookEvent,
62
+ handler: HookHandler,
63
+ priority: number = 100
64
+ ): void {
65
+ hooks.push({ event, handler, priority });
66
+ hooks.sort((a, b) => b.priority - a.priority);
67
+ logger.info('[Hooks] Registered handler for: ' + event + ' (priority: ' + priority + ')');
68
+ }
69
+
70
+ /**
71
+ * Unregister a hook handler
72
+ */
73
+ export function unregisterHook(event: HookEvent, handler: HookHandler): void {
74
+ const idx = hooks.findIndex(h => h.event === event && h.handler === handler);
75
+ if (idx !== -1) {
76
+ hooks.splice(idx, 1);
77
+ logger.info('[Hooks] Unregistered handler for: ' + event);
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Clear all hooks for an event
83
+ */
84
+ export function clearHooks(event?: HookEvent): void {
85
+ if (event) {
86
+ const before = hooks.length;
87
+ const filtered = hooks.filter(h => h.event !== event);
88
+ hooks.length = 0;
89
+ hooks.push(...filtered);
90
+ logger.info('[Hooks] Cleared ' + (before - filtered.length) + ' hooks for: ' + event);
91
+ } else {
92
+ const count = hooks.length;
93
+ hooks.length = 0;
94
+ logger.info('[Hooks] Cleared all ' + count + ' hooks');
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Get registered hooks for an event
100
+ */
101
+ export function getHooks(event: HookEvent): HookHandler[] {
102
+ return hooks.filter(h => h.event === event).map(h => h.handler);
103
+ }
104
+
105
+ /**
106
+ * List all registered hooks (for debugging)
107
+ */
108
+ export function listHooks(): { event: HookEvent; priority: number }[] {
109
+ return hooks.map(h => ({ event: h.event, priority: h.priority }));
110
+ }
111
+
112
+ // --- Trigger functions ---
113
+
114
+ /**
115
+ * Trigger memoryCreated hooks
116
+ * Called when a memory is stored in DB or markdown files
117
+ */
118
+ export async function triggerMemoryCreated(context: MemoryHookContext): Promise<void> {
119
+ const handlers = getHooks('memoryCreated');
120
+
121
+ for (const handler of handlers) {
122
+ try {
123
+ const result = handler(context);
124
+ if (result instanceof Promise) {
125
+ await result;
126
+ }
127
+ } catch (error) {
128
+ logger.error('[Hooks] Error in memoryCreated handler: ' + error);
129
+ }
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Trigger memoryUpdated hooks
135
+ * Called when a memory content/tags/etc changes
136
+ */
137
+ export async function triggerMemoryUpdated(
138
+ context: MemoryHookContext,
139
+ oldContent?: string
140
+ ): Promise<void> {
141
+ const handlers = getHooks('memoryUpdated');
142
+
143
+ for (const handler of handlers) {
144
+ try {
145
+ const result = handler({ ...context, oldContent: oldContent || '' });
146
+ if (result instanceof Promise) {
147
+ await result;
148
+ }
149
+ } catch (error) {
150
+ logger.error('[Hooks] Error in memoryUpdated handler: ' + error);
151
+ }
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Trigger memoryDeleted hooks
157
+ * Called when a memory is deleted
158
+ */
159
+ export async function triggerMemoryDeleted(context: MemoryHookContext): Promise<void> {
160
+ const handlers = getHooks('memoryDeleted');
161
+
162
+ for (const handler of handlers) {
163
+ try {
164
+ const result = handler(context);
165
+ if (result instanceof Promise) {
166
+ await result;
167
+ }
168
+ } catch (error) {
169
+ logger.error('[Hooks] Error in memoryDeleted handler: ' + error);
170
+ }
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Trigger tierChange hooks
176
+ * Called when memory tier changes
177
+ */
178
+ export async function triggerTierChange(context: TierChangeContext): Promise<void> {
179
+ const handlers = getHooks('tierChange');
180
+
181
+ for (const handler of handlers) {
182
+ try {
183
+ const result = handler(context);
184
+ if (result instanceof Promise) {
185
+ await result;
186
+ }
187
+ } catch (error) {
188
+ logger.error('[Hooks] Error in tierChange handler: ' + error);
189
+ }
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Trigger decayApplied hooks
195
+ * Called when memory decay score changes
196
+ */
197
+ export async function triggerDecayApplied(context: DecayContext): Promise<void> {
198
+ const handlers = getHooks('decayApplied');
199
+
200
+ for (const handler of handlers) {
201
+ try {
202
+ const result = handler(context);
203
+ if (result instanceof Promise) {
204
+ await result;
205
+ }
206
+ } catch (error) {
207
+ logger.error('[Hooks] Error in decayApplied handler: ' + error);
208
+ }
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Built-in hook: Auto-save to memory files when storing to DB
214
+ * Use this to have dual storage (DB + markdown files)
215
+ */
216
+ export function createMarkdownAutoSyncHook() {
217
+ return async function markdownAutoSync(context: MemoryHookContext) {
218
+ if (context.tier === 'hot') {
219
+ const { saveToMarkdown } = await import('./markdown/markdown-storage.js');
220
+ await saveToMarkdown({
221
+ content: context.content,
222
+ type: context.type as any,
223
+ tags: context.tags,
224
+ project: context.project,
225
+ source: context.source,
226
+ });
227
+ logger.info('[Hooks] Auto-synced memory to markdown: ' + context.memoryId);
228
+ }
229
+ };
230
+ }
@@ -0,0 +1,65 @@
1
+ import type { MemoryRecord } from '../lib/types.js';
2
+ import { hybridSearch as currentHybridSearch } from './hybrid-search.js';
3
+ import type { SearchInput } from './memories.js';
4
+
5
+ export interface HybridSearchOptions extends SearchInput {
6
+ candidateLimit?: number;
7
+ resultLimit?: number;
8
+ }
9
+
10
+ export interface HybridSearchResult extends MemoryRecord {
11
+ hybridScore: number;
12
+ semanticScore: number;
13
+ recencyScore: number;
14
+ importanceScore: number;
15
+ coactivationScore: number;
16
+ rank: number;
17
+ explanation: string;
18
+ }
19
+
20
+ type ScoredItem = {
21
+ memoryId: string;
22
+ memory: Record<string, unknown>;
23
+ totalScore: number;
24
+ components: Record<string, number>;
25
+ rank: number;
26
+ explanation: string;
27
+ };
28
+
29
+ export function applyEntityBoostAndRerank<T extends ScoredItem>(scored: T[]): T[] {
30
+ return scored
31
+ .map((item) => {
32
+ const rawBoost = item.memory._entityBoost;
33
+ const entityBoost = typeof rawBoost === 'number' ? rawBoost : 0;
34
+ return {
35
+ ...item,
36
+ totalScore: item.totalScore + entityBoost * 20,
37
+ };
38
+ })
39
+ .sort((a, b) => b.totalScore - a.totalScore)
40
+ .map((item, index) => ({
41
+ ...item,
42
+ rank: index + 1,
43
+ }));
44
+ }
45
+
46
+ export async function hybridSearch(options: HybridSearchOptions): Promise<HybridSearchResult[]> {
47
+ const limit = options.resultLimit ?? options.limit ?? 5;
48
+ const results = await currentHybridSearch(options, {
49
+ limit,
50
+ project: options.project,
51
+ type: options.type,
52
+ tags: options.tags,
53
+ });
54
+
55
+ return results.map((result, index) => ({
56
+ ...result,
57
+ hybridScore: result.similarity ?? 0,
58
+ semanticScore: result.similarity ?? 0,
59
+ recencyScore: 0,
60
+ importanceScore: typeof result.importance === 'number' ? result.importance : 0,
61
+ coactivationScore: 0,
62
+ rank: index + 1,
63
+ explanation: 'Compatibility result from current hybrid search',
64
+ }));
65
+ }
@@ -0,0 +1,325 @@
1
+ /** Hybrid Scorer - Multi-factor relevance scoring for memory ranking */
2
+
3
+ import { logger } from '../../core/logger.js';
4
+ import { cosineSimilarity } from '../utils/vector-operations.js';
5
+
6
+ export interface ScoredMemory {
7
+ memoryId: string;
8
+ memory: any;
9
+ totalScore: number;
10
+ components: {
11
+ semantic: number;
12
+ recency: number;
13
+ coactivation: number;
14
+ importance: number;
15
+ confidence: number;
16
+ feedback: number;
17
+ };
18
+ rank: number;
19
+ explanation: string;
20
+ }
21
+
22
+ export interface HybridScorerOptions {
23
+ weights?: {
24
+ semantic?: number;
25
+ recency?: number;
26
+ coactivation?: number;
27
+ importance?: number;
28
+ confidence?: number;
29
+ feedback?: number;
30
+ };
31
+ decayDays?: number;
32
+ minSemanticScore?: number;
33
+ includeExplanation?: boolean;
34
+ }
35
+
36
+ export async function hybridScore(
37
+ queryEmbedding: number[] | null,
38
+ memories: any[],
39
+ options: HybridScorerOptions = {}
40
+ ): Promise<ScoredMemory[]> {
41
+ const weights = {
42
+ semantic: options.weights?.semantic ?? 0.30,
43
+ recency: options.weights?.recency ?? 0.20,
44
+ coactivation: options.weights?.coactivation ?? 0.10,
45
+ importance: options.weights?.importance ?? 0.15,
46
+ confidence: options.weights?.confidence ?? 0.15,
47
+ feedback: options.weights?.feedback ?? 0.10,
48
+ };
49
+
50
+ const decayDays = options.decayDays ?? 30;
51
+ const minSemanticScore = options.minSemanticScore ?? 0.0;
52
+
53
+ const scored: ScoredMemory[] = [];
54
+ const now = new Date();
55
+
56
+ for (const memory of memories) {
57
+ if (queryEmbedding && weights.semantic > 0) {
58
+ const semanticScore = calculateSemanticScore(queryEmbedding, memory);
59
+ if (semanticScore < minSemanticScore) continue;
60
+ }
61
+
62
+ const components = {
63
+ semantic: queryEmbedding ? calculateSemanticScore(queryEmbedding, memory) : 50,
64
+ recency: calculateRecencyScore(memory, now, decayDays),
65
+ coactivation: calculateCoactivationScore(memory),
66
+ importance: calculateImportanceScore(memory),
67
+ confidence: calculateConfidenceScore(memory),
68
+ feedback: calculateFeedbackScore(memory),
69
+ };
70
+
71
+ const totalScore = Math.min(
72
+ 100,
73
+ components.semantic * weights.semantic +
74
+ components.recency * weights.recency +
75
+ components.coactivation * weights.coactivation +
76
+ components.importance * weights.importance +
77
+ components.confidence * weights.confidence +
78
+ components.feedback * weights.feedback
79
+ );
80
+
81
+ scored.push({
82
+ memoryId: memory.id,
83
+ memory,
84
+ totalScore: Math.round(totalScore * 100) / 100,
85
+ components: {
86
+ semantic: Math.round(components.semantic * 100) / 100,
87
+ recency: Math.round(components.recency * 100) / 100,
88
+ coactivation: Math.round(components.coactivation * 100) / 100,
89
+ importance: Math.round(components.importance * 100) / 100,
90
+ confidence: Math.round(components.confidence * 100) / 100,
91
+ feedback: Math.round(components.feedback * 100) / 100,
92
+ },
93
+ rank: 0,
94
+ explanation: options.includeExplanation
95
+ ? generateScoreExplanation(components, weights, memory)
96
+ : '',
97
+ });
98
+ }
99
+
100
+ scored.sort((a, b) => b.totalScore - a.totalScore);
101
+ for (let i = 0; i < scored.length; i++) {
102
+ scored[i].rank = i + 1;
103
+ }
104
+
105
+ return scored;
106
+ }
107
+
108
+ function calculateSemanticScore(queryEmbedding: number[], memory: any): number {
109
+ if (!memory.embedding || queryEmbedding.length === 0) return 50;
110
+
111
+ try {
112
+ let memoryEmbedding: number[] | null = null;
113
+
114
+ if (Array.isArray(memory.embedding)) {
115
+ memoryEmbedding = memory.embedding;
116
+ } else if (typeof memory.embedding === 'string') {
117
+ memoryEmbedding = JSON.parse(memory.embedding);
118
+ }
119
+
120
+ if (!memoryEmbedding || memoryEmbedding.length === 0) return 50;
121
+
122
+ const semanticScore = cosineSimilarity(queryEmbedding, memoryEmbedding);
123
+ return Math.max(0, Math.min(100, (semanticScore + 1) * 50));
124
+ } catch (error) {
125
+ logger.error('Error calculating semantic score', error);
126
+ return 50;
127
+ }
128
+ }
129
+
130
+ function calculateRecencyScore(memory: any, now: Date, decayDays: number): number {
131
+ // Enhanced bi-temporal recency scoring: considers validity period and learning time
132
+ const validFromDate = memory.validFrom ? new Date(memory.validFrom) : null;
133
+ const validToDate = memory.validTo ? new Date(memory.validTo) : null;
134
+ const recordedAtDate = memory.recordedAt ? new Date(memory.recordedAt) : null;
135
+ const createdDate = memory.createdAt ? new Date(memory.createdAt) : null;
136
+
137
+ // Calculate score based on how relevant the memory is right now
138
+ let score = 50; // Default neutral score
139
+
140
+ // If we have a validity period, score based on current time's position within that period
141
+ if (validFromDate && validToDate) {
142
+ const timeInPeriod = now.getTime() - validFromDate.getTime();
143
+ const periodLength = validToDate.getTime() - validFromDate.getTime();
144
+
145
+ if (periodLength > 0) {
146
+ // If now is within the validity period, high score
147
+ if (now >= validFromDate && now <= validToDate) {
148
+ // Full score if right in middle, decreasing toward edges
149
+ const progress = timeInPeriod / periodLength;
150
+ const distanceFromCenter = Math.abs(0.5 - progress) * 2; // 0 at center, 1 at edges
151
+ score = 100 * (1 - distanceFromCenter * 0.8); // 100 at center, 40 at edges
152
+ } else {
153
+ // Outside validity period - score based on how recently it expired or how far in future
154
+ if (now < validFromDate) {
155
+ // Future validity - score based on how soon it becomes valid
156
+ const daysUntilValid = (validFromDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
157
+ score = Math.max(20, 100 - Math.min(80, daysUntilValid / decayDays * 100));
158
+ } else {
159
+ // Past validity - score based on how recently it expired
160
+ const daysSinceExpired = (now.getTime() - validToDate.getTime()) / (24 * 60 * 60 * 1000);
161
+ score = Math.max(10, 60 - Math.min(50, daysSinceExpired / decayDays * 100));
162
+ }
163
+ }
164
+ }
165
+ }
166
+ // If we only have validFrom (open-ended validity)
167
+ else if (validFromDate) {
168
+ const daysSinceValid = (now.getTime() - validFromDate.getTime()) / (24 * 60 * 60 * 1000);
169
+ if (now >= validFromDate) {
170
+ // Still valid - decay from full score over time
171
+ score = Math.max(30, 100 - Math.min(70, daysSinceValid / decayDays * 100));
172
+ } else {
173
+ // Becomes valid in future
174
+ const daysUntilValid = (validFromDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000);
175
+ score = Math.max(20, 100 - Math.min(80, daysUntilValid / decayDays * 100));
176
+ }
177
+ }
178
+ // Fallback to learned/recorded time
179
+ else {
180
+ const learnedDate = recordedAtDate || createdDate;
181
+ if (learnedDate) {
182
+ const daysSinceLearned = (now.getTime() - learnedDate.getTime()) / (24 * 60 * 60 * 1000);
183
+ score = 100 * Math.pow(0.5, daysSinceLearned / decayDays);
184
+ score = Math.max(0, Math.min(100, score));
185
+ }
186
+ }
187
+
188
+ return Math.round(score * 10) / 10; // Return one decimal place
189
+ }
190
+
191
+ function calculateCoactivationScore(memory: any): number {
192
+ if (!memory.coactivationScore || memory.coactivationScore === 0) return 10;
193
+ return Math.min(100, memory.coactivationScore * 5);
194
+ }
195
+
196
+ function calculateImportanceScore(memory: any): number {
197
+ let score = 50;
198
+
199
+ // Simplified: hot or cold only (warm removed)
200
+ if (memory.tier === 'hot') score += 30;
201
+ // No bonus for cold - it's the fallback
202
+
203
+ if (memory.relevanceScore) score += memory.relevanceScore * 0.2;
204
+ if (memory.isPinned) score += 10;
205
+ if (memory.isProtected) score += 10;
206
+ if (memory.isMergeable || memory.isMerged) score -= 10;
207
+
208
+ return Math.max(0, Math.min(100, score));
209
+ }
210
+
211
+ function calculateConfidenceScore(memory: any): number {
212
+ let score = 50;
213
+
214
+ const signals = memory.metadata?.memorySignals;
215
+
216
+ if (signals) {
217
+ if (signals.priority === 'high') score += 25;
218
+
219
+ if (signals.explicitTriggers && signals.explicitTriggers.length > 0) {
220
+ score += 15 * Math.min(signals.explicitTriggers.length, 2);
221
+ }
222
+
223
+ if (signals.implicit) {
224
+ if (signals.implicit.decision) score += 10;
225
+ if (signals.implicit.correction) score += 15;
226
+ if (signals.implicit.preference) score += 8;
227
+ if (signals.implicit.workflowRule) score += 12;
228
+ if (signals.implicit.lesson) score += 10;
229
+ }
230
+
231
+ if (signals.requiresConflictCheck) score -= 5;
232
+ }
233
+
234
+ switch (memory.type) {
235
+ case 'decision': score += 10; break;
236
+ case 'preference': score += 5; break;
237
+ case 'fact': score += 8; break;
238
+ case 'context': score += 3; break;
239
+ }
240
+
241
+ if (memory.source === 'mcp') score += 5;
242
+
243
+ if (memory.accessCount && memory.accessCount > 5) {
244
+ score += Math.min(10, memory.accessCount / 2);
245
+ }
246
+
247
+ return Math.max(0, Math.min(100, score));
248
+ }
249
+
250
+ function calculateFeedbackScore(memory: any): number {
251
+ const retrievalPriority = memory.retrievalPriority ?? 50;
252
+ return Math.max(0, Math.min(100, retrievalPriority));
253
+ }
254
+
255
+ function generateScoreExplanation(
256
+ components: ScoredMemory['components'],
257
+ weights: ScoredMemory['components'],
258
+ memory: any
259
+ ): string {
260
+ const parts: string[] = [];
261
+
262
+ if (components.semantic > 70) parts.push(`highly relevant (${components.semantic.toFixed(0)})`);
263
+ else if (components.semantic > 50) parts.push(`somewhat relevant (${components.semantic.toFixed(0)})`);
264
+ else parts.push(`low relevance (${components.semantic.toFixed(0)})`);
265
+
266
+ if (components.recency > 70) parts.push('recent');
267
+ else if (components.recency > 30) parts.push('moderately recent');
268
+ else parts.push('older');
269
+
270
+ // Simplified: hot or cold only (warm removed)
271
+ if (memory.tier === 'hot') parts.push('active memory');
272
+ else parts.push('archived memory');
273
+
274
+ if (components.coactivation > 60) parts.push('frequently associated');
275
+
276
+ if (components.confidence > 80) parts.push('high confidence');
277
+ else if (components.confidence > 60) parts.push('moderate confidence');
278
+ else if (components.confidence < 40) parts.push('low confidence');
279
+
280
+ if (components.feedback > 70) parts.push('frequently useful');
281
+ else if (components.feedback < 30) parts.push('rarely used');
282
+
283
+ return parts.join(', ');
284
+ }
285
+
286
+ export async function scoreAndRankMemories(
287
+ queryEmbedding: number[] | null,
288
+ memories: any[],
289
+ topK: number = 10,
290
+ options: HybridScorerOptions = {}
291
+ ): Promise<ScoredMemory[]> {
292
+ const scored = await hybridScore(queryEmbedding, memories, options);
293
+
294
+ logger.debug('Scored and ranked memories', {
295
+ total: scored.length,
296
+ topK,
297
+ topScores: scored.slice(0, topK).map((s) => ({ id: s.memoryId, score: s.totalScore })),
298
+ });
299
+
300
+ return scored.slice(0, topK);
301
+ }
302
+
303
+ export function getScoreDistribution(scored: ScoredMemory[]): {
304
+ min: number;
305
+ max: number;
306
+ avg: number;
307
+ median: number;
308
+ p95: number;
309
+ p99: number;
310
+ } {
311
+ if (scored.length === 0) {
312
+ return { min: 0, max: 0, avg: 0, median: 0, p95: 0, p99: 0 };
313
+ }
314
+
315
+ const scores = scored.map((s) => s.totalScore).sort((a, b) => a - b);
316
+
317
+ return {
318
+ min: scores[0],
319
+ max: scores[scores.length - 1],
320
+ avg: scores.reduce((a, b) => a + b, 0) / scores.length,
321
+ median: scores[Math.floor(scores.length / 2)],
322
+ p95: scores[Math.floor((95 / 100) * scores.length)],
323
+ p99: scores[Math.floor((99 / 100) * scores.length)],
324
+ };
325
+ }