hippo-memory 1.59.0 → 1.61.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 (596) hide show
  1. package/README.md +1 -1
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.js +4 -1
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/gemini.js +1 -1
  7. package/dist/agent-memories/legacy.js +1 -1
  8. package/dist/agent-memories/source.js +1 -1
  9. package/dist/agent-memories/sync.js +8 -3
  10. package/dist/ambient-store.d.ts +14 -0
  11. package/dist/ambient-store.js +90 -0
  12. package/dist/ambient.d.ts +23 -0
  13. package/dist/ambient.js +72 -50
  14. package/dist/api/assemble.d.ts +93 -0
  15. package/dist/api/assemble.js +152 -0
  16. package/dist/api/audit.d.ts +17 -0
  17. package/dist/api/audit.js +23 -0
  18. package/dist/api/auth.d.ts +79 -0
  19. package/dist/api/auth.js +178 -0
  20. package/dist/api/context-types.d.ts +105 -0
  21. package/dist/api/context-types.js +3 -0
  22. package/dist/api/context.d.ts +31 -0
  23. package/dist/api/context.js +705 -0
  24. package/dist/api/dormant.d.ts +30 -0
  25. package/dist/api/dormant.js +140 -0
  26. package/dist/api/drill-down.d.ts +84 -0
  27. package/dist/api/drill-down.js +123 -0
  28. package/dist/api/forget.d.ts +57 -0
  29. package/dist/api/forget.js +87 -0
  30. package/dist/api/goals.d.ts +18 -0
  31. package/dist/api/goals.js +33 -0
  32. package/dist/api/learn.d.ts +31 -0
  33. package/dist/api/learn.js +88 -0
  34. package/dist/api/outcome.d.ts +61 -0
  35. package/dist/api/outcome.js +66 -0
  36. package/dist/api/promote.d.ts +54 -0
  37. package/dist/api/promote.js +203 -0
  38. package/dist/api/quarantine.d.ts +24 -0
  39. package/dist/api/quarantine.js +121 -0
  40. package/dist/api/recall-types.d.ts +390 -0
  41. package/dist/api/recall-types.js +3 -0
  42. package/dist/api/recall.d.ts +36 -0
  43. package/dist/api/recall.js +634 -0
  44. package/dist/api/remember.d.ts +35 -0
  45. package/dist/api/remember.js +43 -0
  46. package/dist/api/sleep.d.ts +136 -0
  47. package/dist/api/sleep.js +271 -0
  48. package/dist/api/tokens.d.ts +26 -0
  49. package/dist/api/tokens.js +60 -0
  50. package/dist/api/types.d.ts +56 -0
  51. package/dist/api/types.js +38 -0
  52. package/dist/api.d.ts +20 -1260
  53. package/dist/api.js +25 -2711
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +7 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +7 -4
  59. package/dist/capture/command.d.ts +33 -0
  60. package/dist/capture/command.js +264 -0
  61. package/dist/capture/compact.d.ts +44 -0
  62. package/dist/capture/compact.js +354 -0
  63. package/dist/capture/extract.d.ts +21 -0
  64. package/dist/capture/extract.js +464 -0
  65. package/dist/capture/transcript.d.ts +40 -0
  66. package/dist/capture/transcript.js +193 -0
  67. package/dist/capture-error.js +2 -1
  68. package/dist/churn-git.js +4 -2
  69. package/dist/cli/audit.d.ts +3 -0
  70. package/dist/cli/audit.js +159 -0
  71. package/dist/cli/auth.d.ts +2 -0
  72. package/dist/cli/auth.js +171 -0
  73. package/dist/cli/briefs.d.ts +4 -0
  74. package/dist/cli/briefs.js +435 -0
  75. package/dist/cli/card.d.ts +3 -0
  76. package/dist/cli/card.js +333 -0
  77. package/dist/cli/context.d.ts +15 -0
  78. package/dist/cli/context.js +366 -0
  79. package/dist/cli/continuity.d.ts +6 -0
  80. package/dist/cli/continuity.js +445 -0
  81. package/dist/cli/curate.d.ts +19 -0
  82. package/dist/cli/curate.js +555 -0
  83. package/dist/cli/dag.d.ts +5 -0
  84. package/dist/cli/dag.js +177 -0
  85. package/dist/cli/decisions.d.ts +4 -0
  86. package/dist/cli/decisions.js +528 -0
  87. package/dist/cli/eval.d.ts +5 -0
  88. package/dist/cli/eval.js +213 -0
  89. package/dist/cli/explain.d.ts +4 -0
  90. package/dist/cli/explain.js +150 -0
  91. package/dist/cli/goals.d.ts +2 -0
  92. package/dist/cli/goals.js +196 -0
  93. package/dist/cli/hook-blocks.d.ts +18 -0
  94. package/dist/cli/hook-blocks.js +233 -0
  95. package/dist/cli/init.d.ts +2 -0
  96. package/dist/cli/init.js +305 -0
  97. package/dist/cli/maintenance.d.ts +4 -0
  98. package/dist/cli/maintenance.js +179 -0
  99. package/dist/cli/playbooks.d.ts +4 -0
  100. package/dist/cli/playbooks.js +556 -0
  101. package/dist/cli/projects.js +1 -1
  102. package/dist/cli/recall.d.ts +7 -0
  103. package/dist/cli/recall.js +597 -0
  104. package/dist/cli/remember.d.ts +5 -0
  105. package/dist/cli/remember.js +442 -0
  106. package/dist/cli/serve.d.ts +5 -0
  107. package/dist/cli/serve.js +40 -0
  108. package/dist/cli/session-hooks.d.ts +29 -0
  109. package/dist/cli/session-hooks.js +637 -0
  110. package/dist/cli/setup.d.ts +4 -0
  111. package/dist/cli/setup.js +376 -0
  112. package/dist/cli/shared.d.ts +15 -19
  113. package/dist/cli/shared.js +50 -341
  114. package/dist/cli/slack.d.ts +2 -0
  115. package/dist/cli/slack.js +171 -0
  116. package/dist/cli/status.d.ts +18 -0
  117. package/dist/cli/status.js +400 -0
  118. package/dist/cli/transfer.d.ts +10 -0
  119. package/dist/cli/transfer.js +438 -0
  120. package/dist/cli/usage.d.ts +85 -0
  121. package/dist/cli/usage.js +741 -0
  122. package/dist/cli.d.ts +319 -13
  123. package/dist/cli.js +436 -8580
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +12 -9
  126. package/dist/config.js +12 -11
  127. package/dist/connectors/github/backfill.js +94 -87
  128. package/dist/connectors/github/cli-impl.js +5 -3
  129. package/dist/connectors/github/dlq.js +67 -54
  130. package/dist/connectors/github/ingest.js +34 -35
  131. package/dist/connectors/github/tenant-routing.js +3 -2
  132. package/dist/connectors/github/webhook.js +135 -216
  133. package/dist/connectors/slack/dlq.js +49 -61
  134. package/dist/connectors/slack/ingest.js +55 -48
  135. package/dist/connectors/slack/tenant-routing.js +4 -3
  136. package/dist/connectors/slack/webhook.js +72 -74
  137. package/dist/consolidate/conflicts.d.ts +10 -0
  138. package/dist/consolidate/conflicts.js +178 -0
  139. package/dist/consolidate/decay.d.ts +12 -0
  140. package/dist/consolidate/decay.js +145 -0
  141. package/dist/consolidate/llm-passes.d.ts +3 -0
  142. package/dist/consolidate/llm-passes.js +141 -0
  143. package/dist/consolidate/merge.d.ts +7 -0
  144. package/dist/consolidate/merge.js +251 -0
  145. package/dist/consolidate/physics-pass.d.ts +3 -0
  146. package/dist/consolidate/physics-pass.js +60 -0
  147. package/dist/consolidate/run.d.ts +69 -0
  148. package/dist/consolidate/run.js +76 -0
  149. package/dist/consolidate/sleep.d.ts +18 -0
  150. package/dist/consolidate/sleep.js +209 -0
  151. package/dist/consolidate/traces.d.ts +4 -0
  152. package/dist/consolidate/traces.js +178 -0
  153. package/dist/context-auto.js +7 -11
  154. package/dist/context-render.d.ts +1 -1
  155. package/dist/context-render.js +1 -1
  156. package/dist/customer-notes.d.ts +3 -0
  157. package/dist/customer-notes.js +6 -4
  158. package/dist/dag.js +13 -12
  159. package/dist/dashboard-actions.d.ts +20 -0
  160. package/dist/dashboard-actions.js +88 -0
  161. package/dist/dashboard-params.d.ts +45 -0
  162. package/dist/dashboard-params.js +127 -0
  163. package/dist/dashboard-queries.d.ts +15 -0
  164. package/dist/dashboard-queries.js +355 -0
  165. package/dist/dashboard-snapshot.d.ts +138 -0
  166. package/dist/dashboard-snapshot.js +308 -0
  167. package/dist/dashboard-types.d.ts +163 -0
  168. package/dist/dashboard-types.js +3 -0
  169. package/dist/dashboard.d.ts +6 -7
  170. package/dist/dashboard.js +231 -203
  171. package/dist/db/busy.d.ts +5 -0
  172. package/dist/db/busy.js +24 -0
  173. package/dist/db/continuity.d.ts +5 -0
  174. package/dist/db/continuity.js +145 -0
  175. package/dist/db/meta.d.ts +8 -0
  176. package/dist/db/meta.js +35 -0
  177. package/dist/db/migrate.d.ts +9 -0
  178. package/dist/db/migrate.js +138 -0
  179. package/dist/db/migrations/index.d.ts +5 -0
  180. package/dist/db/migrations/index.js +109 -0
  181. package/dist/db/migrations/types.d.ts +14 -0
  182. package/dist/db/migrations/types.js +2 -0
  183. package/dist/db/migrations/v01.d.ts +3 -0
  184. package/dist/db/migrations/v01.js +38 -0
  185. package/dist/db/migrations/v02.d.ts +3 -0
  186. package/dist/db/migrations/v02.js +21 -0
  187. package/dist/db/migrations/v03.d.ts +3 -0
  188. package/dist/db/migrations/v03.js +22 -0
  189. package/dist/db/migrations/v04.d.ts +3 -0
  190. package/dist/db/migrations/v04.js +28 -0
  191. package/dist/db/migrations/v05.d.ts +3 -0
  192. package/dist/db/migrations/v05.js +21 -0
  193. package/dist/db/migrations/v06.d.ts +3 -0
  194. package/dist/db/migrations/v06.js +25 -0
  195. package/dist/db/migrations/v07.d.ts +3 -0
  196. package/dist/db/migrations/v07.js +13 -0
  197. package/dist/db/migrations/v08.d.ts +3 -0
  198. package/dist/db/migrations/v08.js +8 -0
  199. package/dist/db/migrations/v09.d.ts +3 -0
  200. package/dist/db/migrations/v09.js +13 -0
  201. package/dist/db/migrations/v10.d.ts +3 -0
  202. package/dist/db/migrations/v10.js +17 -0
  203. package/dist/db/migrations/v11.d.ts +3 -0
  204. package/dist/db/migrations/v11.js +15 -0
  205. package/dist/db/migrations/v12.d.ts +3 -0
  206. package/dist/db/migrations/v12.js +11 -0
  207. package/dist/db/migrations/v13.d.ts +3 -0
  208. package/dist/db/migrations/v13.js +15 -0
  209. package/dist/db/migrations/v14.d.ts +3 -0
  210. package/dist/db/migrations/v14.js +66 -0
  211. package/dist/db/migrations/v15.d.ts +3 -0
  212. package/dist/db/migrations/v15.js +42 -0
  213. package/dist/db/migrations/v16.d.ts +3 -0
  214. package/dist/db/migrations/v16.js +61 -0
  215. package/dist/db/migrations/v17.d.ts +3 -0
  216. package/dist/db/migrations/v17.js +46 -0
  217. package/dist/db/migrations/v18.d.ts +3 -0
  218. package/dist/db/migrations/v18.js +60 -0
  219. package/dist/db/migrations/v19.d.ts +3 -0
  220. package/dist/db/migrations/v19.js +28 -0
  221. package/dist/db/migrations/v20.d.ts +3 -0
  222. package/dist/db/migrations/v20.js +42 -0
  223. package/dist/db/migrations/v21.d.ts +3 -0
  224. package/dist/db/migrations/v21.js +16 -0
  225. package/dist/db/migrations/v22.d.ts +3 -0
  226. package/dist/db/migrations/v22.js +82 -0
  227. package/dist/db/migrations/v23.d.ts +3 -0
  228. package/dist/db/migrations/v23.js +48 -0
  229. package/dist/db/migrations/v24.d.ts +3 -0
  230. package/dist/db/migrations/v24.js +72 -0
  231. package/dist/db/migrations/v25.d.ts +3 -0
  232. package/dist/db/migrations/v25.js +46 -0
  233. package/dist/db/migrations/v26.d.ts +3 -0
  234. package/dist/db/migrations/v26.js +23 -0
  235. package/dist/db/migrations/v27.d.ts +3 -0
  236. package/dist/db/migrations/v27.js +57 -0
  237. package/dist/db/migrations/v28.d.ts +3 -0
  238. package/dist/db/migrations/v28.js +38 -0
  239. package/dist/db/migrations/v29.d.ts +3 -0
  240. package/dist/db/migrations/v29.js +78 -0
  241. package/dist/db/migrations/v30.d.ts +3 -0
  242. package/dist/db/migrations/v30.js +92 -0
  243. package/dist/db/migrations/v31.d.ts +3 -0
  244. package/dist/db/migrations/v31.js +74 -0
  245. package/dist/db/migrations/v32.d.ts +3 -0
  246. package/dist/db/migrations/v32.js +102 -0
  247. package/dist/db/migrations/v33.d.ts +3 -0
  248. package/dist/db/migrations/v33.js +104 -0
  249. package/dist/db/migrations/v34.d.ts +3 -0
  250. package/dist/db/migrations/v34.js +93 -0
  251. package/dist/db/migrations/v35.d.ts +3 -0
  252. package/dist/db/migrations/v35.js +98 -0
  253. package/dist/db/migrations/v36.d.ts +3 -0
  254. package/dist/db/migrations/v36.js +98 -0
  255. package/dist/db/migrations/v37.d.ts +3 -0
  256. package/dist/db/migrations/v37.js +219 -0
  257. package/dist/db/migrations/v38.d.ts +3 -0
  258. package/dist/db/migrations/v38.js +277 -0
  259. package/dist/db/migrations/v39.d.ts +3 -0
  260. package/dist/db/migrations/v39.js +59 -0
  261. package/dist/db/migrations/v40.d.ts +3 -0
  262. package/dist/db/migrations/v40.js +74 -0
  263. package/dist/db/migrations/v41.d.ts +3 -0
  264. package/dist/db/migrations/v41.js +43 -0
  265. package/dist/db/migrations/v42.d.ts +3 -0
  266. package/dist/db/migrations/v42.js +41 -0
  267. package/dist/db/migrations/v43.d.ts +3 -0
  268. package/dist/db/migrations/v43.js +67 -0
  269. package/dist/db/migrations/v44.d.ts +3 -0
  270. package/dist/db/migrations/v44.js +28 -0
  271. package/dist/db/migrations/v45.d.ts +3 -0
  272. package/dist/db/migrations/v45.js +30 -0
  273. package/dist/db/migrations/v46.d.ts +3 -0
  274. package/dist/db/migrations/v46.js +25 -0
  275. package/dist/db/migrations/v47.d.ts +3 -0
  276. package/dist/db/migrations/v47.js +17 -0
  277. package/dist/db/migrations/v48.d.ts +3 -0
  278. package/dist/db/migrations/v48.js +10 -0
  279. package/dist/db/migrations/v49.d.ts +3 -0
  280. package/dist/db/migrations/v49.js +31 -0
  281. package/dist/db/migrations/v50.d.ts +3 -0
  282. package/dist/db/migrations/v50.js +67 -0
  283. package/dist/db/migrations/v51.d.ts +3 -0
  284. package/dist/db/migrations/v51.js +14 -0
  285. package/dist/db/migrations/v52.d.ts +3 -0
  286. package/dist/db/migrations/v52.js +7 -0
  287. package/dist/db/open.d.ts +23 -0
  288. package/dist/db/open.js +146 -0
  289. package/dist/db/sqlite.d.ts +21 -0
  290. package/dist/db/sqlite.js +8 -0
  291. package/dist/db/tables.d.ts +7 -0
  292. package/dist/db/tables.js +38 -0
  293. package/dist/db.d.ts +6 -46
  294. package/dist/db.js +5 -3036
  295. package/dist/decisions.d.ts +4 -1
  296. package/dist/decisions.js +9 -7
  297. package/dist/dedupe.js +3 -2
  298. package/dist/delivery-recorder.js +5 -1
  299. package/dist/doctor.js +4 -3
  300. package/dist/dormant.js +1 -0
  301. package/dist/embedding-provider.d.ts +1 -1
  302. package/dist/embedding-provider.js +7 -5
  303. package/dist/embeddings.d.ts +9 -52
  304. package/dist/embeddings.js +47 -298
  305. package/dist/env.d.ts +75 -0
  306. package/dist/env.js +119 -0
  307. package/dist/eval-suite.js +1 -1
  308. package/dist/eval.js +2 -2
  309. package/dist/extract.js +5 -4
  310. package/dist/gated-write.js +3 -1
  311. package/dist/goals.d.ts +3 -1
  312. package/dist/goals.js +18 -0
  313. package/dist/graph/read.d.ts +73 -0
  314. package/dist/graph/read.js +325 -0
  315. package/dist/graph/rows.d.ts +45 -0
  316. package/dist/graph/rows.js +51 -0
  317. package/dist/graph/types.d.ts +83 -0
  318. package/dist/graph/types.js +11 -0
  319. package/dist/graph/write.d.ts +93 -0
  320. package/dist/{graph.js → graph/write.js} +8 -391
  321. package/dist/graph-extract.js +2 -1
  322. package/dist/graph-recall.d.ts +1 -1
  323. package/dist/graph-recall.js +2 -2
  324. package/dist/graph-stream.js +1 -1
  325. package/dist/graph-view.d.ts +1 -1
  326. package/dist/graph-view.js +1 -1
  327. package/dist/half-life-migration.d.ts +1 -1
  328. package/dist/half-life-migration.js +2 -1
  329. package/dist/handoff.js +3 -0
  330. package/dist/hooks/codex-session.d.ts +8 -0
  331. package/dist/hooks/codex-session.js +76 -0
  332. package/dist/hooks/codex-wrapper.d.ts +55 -0
  333. package/dist/hooks/codex-wrapper.js +288 -0
  334. package/dist/hooks/json-hooks.d.ts +63 -0
  335. package/dist/hooks/json-hooks.js +356 -0
  336. package/dist/hooks/opencode.d.ts +50 -0
  337. package/dist/hooks/opencode.js +202 -0
  338. package/dist/hooks/shared.d.ts +54 -0
  339. package/dist/hooks/shared.js +77 -0
  340. package/dist/http-retry.d.ts +2 -0
  341. package/dist/http-retry.js +4 -3
  342. package/dist/http-util.d.ts +3 -0
  343. package/dist/http-util.js +10 -0
  344. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  345. package/dist/importers/core.js +141 -0
  346. package/dist/importers/markdown-parse.d.ts +41 -0
  347. package/dist/importers/markdown-parse.js +132 -0
  348. package/dist/importers/markdown.d.ts +3 -0
  349. package/dist/importers/markdown.js +92 -0
  350. package/dist/importers/sources.d.ts +7 -0
  351. package/dist/importers/sources.js +229 -0
  352. package/dist/importers/vault.d.ts +11 -0
  353. package/dist/importers/vault.js +352 -0
  354. package/dist/incidents.d.ts +3 -0
  355. package/dist/incidents.js +8 -5
  356. package/dist/index.d.ts +25 -6
  357. package/dist/index.js +23 -6
  358. package/dist/invalidation.js +2 -1
  359. package/dist/judgment.js +7 -3
  360. package/dist/keyset.d.ts +13 -0
  361. package/dist/keyset.js +8 -0
  362. package/dist/local-embedding.d.ts +13 -0
  363. package/dist/local-embedding.js +165 -0
  364. package/dist/log.d.ts +7 -0
  365. package/dist/log.js +19 -1
  366. package/dist/mcp/admin-tools.d.ts +8 -0
  367. package/dist/mcp/admin-tools.js +116 -0
  368. package/dist/mcp/format.d.ts +27 -0
  369. package/dist/mcp/format.js +135 -0
  370. package/dist/mcp/memory-tools.d.ts +5 -0
  371. package/dist/mcp/memory-tools.js +83 -0
  372. package/dist/mcp/protocol.d.ts +83 -0
  373. package/dist/mcp/protocol.js +55 -0
  374. package/dist/mcp/recall-tools.d.ts +6 -0
  375. package/dist/mcp/recall-tools.js +320 -0
  376. package/dist/mcp/request.d.ts +10 -0
  377. package/dist/mcp/request.js +163 -0
  378. package/dist/mcp/server.d.ts +4 -70
  379. package/dist/mcp/server.js +8 -1172
  380. package/dist/mcp/session-state.d.ts +11 -0
  381. package/dist/mcp/session-state.js +28 -0
  382. package/dist/mcp/stdio.d.ts +8 -0
  383. package/dist/mcp/stdio.js +79 -0
  384. package/dist/mcp/tools.d.ts +11 -0
  385. package/dist/mcp/tools.js +247 -0
  386. package/dist/memory.d.ts +8 -3
  387. package/dist/memory.js +27 -1
  388. package/dist/multihop.d.ts +1 -1
  389. package/dist/multihop.js +2 -1
  390. package/dist/owner-validation.js +2 -1
  391. package/dist/physics-state.js +10 -7
  392. package/dist/policies.d.ts +3 -0
  393. package/dist/policies.js +8 -6
  394. package/dist/postinstall.js +3 -2
  395. package/dist/predictions/planning-fallacy.d.ts +100 -0
  396. package/dist/predictions/planning-fallacy.js +190 -0
  397. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  398. package/dist/predictions/store.js +434 -0
  399. package/dist/processes.d.ts +3 -0
  400. package/dist/processes.js +8 -5
  401. package/dist/project-briefs.d.ts +3 -0
  402. package/dist/project-briefs.js +7 -5
  403. package/dist/project-identity.d.ts +1 -1
  404. package/dist/project-identity.js +12 -6
  405. package/dist/project-merge.js +3 -1
  406. package/dist/quarantine.d.ts +2 -1
  407. package/dist/quarantine.js +8 -5
  408. package/dist/raw-archive-mirror-cleanup.js +2 -1
  409. package/dist/raw-archive.js +1 -1
  410. package/dist/recall-history.js +3 -2
  411. package/dist/recall-pipeline.d.ts +2 -2
  412. package/dist/recall-pipeline.js +16 -8
  413. package/dist/recall-scope.js +1 -1
  414. package/dist/recall-trace.d.ts +3 -3
  415. package/dist/recall-trace.js +10 -14
  416. package/dist/refine-llm.js +20 -11
  417. package/dist/reject-flow.js +6 -1
  418. package/dist/rerankers/clef.d.ts +2 -2
  419. package/dist/rerankers/clef.js +72 -30
  420. package/dist/rerankers/cross-encoder.js +6 -4
  421. package/dist/rerankers/jev.d.ts +4 -2
  422. package/dist/rerankers/jev.js +24 -19
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +61 -41
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/same-text.d.ts +2 -0
  428. package/dist/same-text.js +4 -0
  429. package/dist/scheduler.d.ts +1 -0
  430. package/dist/scheduler.js +26 -3
  431. package/dist/scope.js +4 -3
  432. package/dist/search/as-of.d.ts +10 -0
  433. package/dist/search/as-of.js +22 -0
  434. package/dist/search/bm25-search.d.ts +14 -0
  435. package/dist/search/bm25-search.js +43 -0
  436. package/dist/search/bm25.d.ts +15 -0
  437. package/dist/search/bm25.js +54 -0
  438. package/dist/search/boosts.d.ts +54 -0
  439. package/dist/search/boosts.js +94 -0
  440. package/dist/search/breakdown.d.ts +7 -0
  441. package/dist/search/breakdown.js +20 -0
  442. package/dist/search/explain.d.ts +25 -0
  443. package/dist/search/explain.js +31 -0
  444. package/dist/search/finalize.d.ts +8 -0
  445. package/dist/search/finalize.js +52 -0
  446. package/dist/search/fusion.d.ts +27 -0
  447. package/dist/search/fusion.js +42 -0
  448. package/dist/search/hybrid-score.d.ts +20 -0
  449. package/dist/search/hybrid-score.js +73 -0
  450. package/dist/search/hybrid.d.ts +46 -0
  451. package/dist/search/hybrid.js +64 -0
  452. package/dist/search/physics-search.d.ts +29 -0
  453. package/dist/search/physics-search.js +162 -0
  454. package/dist/search/rerank.d.ts +10 -0
  455. package/dist/search/rerank.js +72 -0
  456. package/dist/search/temporal.d.ts +15 -0
  457. package/dist/search/temporal.js +45 -0
  458. package/dist/search/types.d.ts +91 -0
  459. package/dist/search/types.js +2 -0
  460. package/dist/search/vector.d.ts +30 -0
  461. package/dist/search/vector.js +71 -0
  462. package/dist/secret-detect.d.ts +2 -0
  463. package/dist/secret-detect.js +3 -1
  464. package/dist/server/auth.d.ts +52 -0
  465. package/dist/server/auth.js +221 -0
  466. package/dist/server/client-ip.d.ts +25 -0
  467. package/dist/server/client-ip.js +92 -0
  468. package/dist/server/cursor.d.ts +23 -0
  469. package/dist/server/cursor.js +58 -0
  470. package/dist/server/lifecycle.d.ts +7 -0
  471. package/dist/server/lifecycle.js +29 -0
  472. package/dist/server/mcp-http.d.ts +5 -0
  473. package/dist/server/mcp-http.js +199 -0
  474. package/dist/server/request.d.ts +33 -0
  475. package/dist/server/request.js +103 -0
  476. package/dist/server/routes/admin.d.ts +9 -0
  477. package/dist/server/routes/admin.js +158 -0
  478. package/dist/server/routes/customer-notes.d.ts +7 -0
  479. package/dist/server/routes/customer-notes.js +112 -0
  480. package/dist/server/routes/decisions.d.ts +7 -0
  481. package/dist/server/routes/decisions.js +133 -0
  482. package/dist/server/routes/incidents.d.ts +7 -0
  483. package/dist/server/routes/incidents.js +126 -0
  484. package/dist/server/routes/memories.d.ts +10 -0
  485. package/dist/server/routes/memories.js +179 -0
  486. package/dist/server/routes/policies.d.ts +8 -0
  487. package/dist/server/routes/policies.js +151 -0
  488. package/dist/server/routes/predictions.d.ts +7 -0
  489. package/dist/server/routes/predictions.js +164 -0
  490. package/dist/server/routes/processes.d.ts +7 -0
  491. package/dist/server/routes/processes.js +161 -0
  492. package/dist/server/routes/project-briefs.d.ts +8 -0
  493. package/dist/server/routes/project-briefs.js +136 -0
  494. package/dist/server/routes/recall.d.ts +8 -0
  495. package/dist/server/routes/recall.js +340 -0
  496. package/dist/server/routes/skills.d.ts +8 -0
  497. package/dist/server/routes/skills.js +150 -0
  498. package/dist/server/types.d.ts +56 -0
  499. package/dist/server/types.js +2 -0
  500. package/dist/server/validation.d.ts +14 -0
  501. package/dist/server/validation.js +91 -0
  502. package/dist/server.d.ts +7 -61
  503. package/dist/server.js +92 -2368
  504. package/dist/session-digest.d.ts +1 -1
  505. package/dist/session-digest.js +9 -2
  506. package/dist/shared.d.ts +3 -1
  507. package/dist/shared.js +46 -40
  508. package/dist/skills.d.ts +3 -0
  509. package/dist/skills.js +7 -5
  510. package/dist/stdin.js +3 -2
  511. package/dist/store/audit-event.d.ts +19 -0
  512. package/dist/store/audit-event.js +33 -0
  513. package/dist/store/candidates.d.ts +42 -0
  514. package/dist/store/candidates.js +152 -0
  515. package/dist/store/conflicts.d.ts +44 -0
  516. package/dist/store/conflicts.js +444 -0
  517. package/dist/store/delete-and-batch.d.ts +63 -0
  518. package/dist/store/delete-and-batch.js +310 -0
  519. package/dist/store/entry-reads.d.ts +92 -0
  520. package/dist/store/entry-reads.js +255 -0
  521. package/dist/store/entry-row.d.ts +67 -0
  522. package/dist/store/entry-row.js +208 -0
  523. package/dist/store/entry-writes.d.ts +46 -0
  524. package/dist/store/entry-writes.js +148 -0
  525. package/dist/store/handoffs.d.ts +26 -0
  526. package/dist/store/handoffs.js +184 -0
  527. package/dist/store/index-and-stats.d.ts +52 -0
  528. package/dist/store/index-and-stats.js +214 -0
  529. package/dist/store/markdown.d.ts +10 -0
  530. package/dist/store/markdown.js +108 -0
  531. package/dist/store/mirrors.d.ts +49 -0
  532. package/dist/store/mirrors.js +312 -0
  533. package/dist/store/open.d.ts +15 -0
  534. package/dist/store/open.js +223 -0
  535. package/dist/store/rows.d.ts +178 -0
  536. package/dist/store/rows.js +158 -0
  537. package/dist/store/search-rows.d.ts +86 -0
  538. package/dist/store/search-rows.js +254 -0
  539. package/dist/store/sessions.d.ts +83 -0
  540. package/dist/store/sessions.js +272 -0
  541. package/dist/store/summaries.d.ts +94 -0
  542. package/dist/store/summaries.js +377 -0
  543. package/dist/store/tenant-lookup.d.ts +12 -0
  544. package/dist/store/tenant-lookup.js +16 -0
  545. package/dist/store-cards.js +2 -1
  546. package/dist/summary-dirty.d.ts +4 -0
  547. package/dist/summary-dirty.js +32 -0
  548. package/dist/support-bundle.js +4 -3
  549. package/dist/tenant.js +2 -2
  550. package/dist/token-ledger.js +1 -0
  551. package/dist/tokenize.d.ts +2 -0
  552. package/dist/tokenize.js +16 -0
  553. package/dist/transcript-tail.d.ts +7 -0
  554. package/dist/transcript-tail.js +48 -0
  555. package/dist/vector-store.d.ts +27 -0
  556. package/dist/vector-store.js +210 -0
  557. package/dist/version.d.ts +2 -2
  558. package/dist/version.js +2 -2
  559. package/dist/working-memory.js +1 -1
  560. package/dist/yaml.js +36 -11
  561. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  566. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  570. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  571. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  572. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  573. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  574. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  575. package/dist-ui/index.html +3 -25
  576. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  577. package/extensions/openclaw-plugin/package.json +1 -1
  578. package/openclaw.plugin.json +1 -1
  579. package/package.json +2 -1
  580. package/dist/capture.d.ts +0 -155
  581. package/dist/capture.js +0 -1293
  582. package/dist/consolidate.d.ts +0 -58
  583. package/dist/consolidate.js +0 -1123
  584. package/dist/graph.d.ts +0 -245
  585. package/dist/hooks.d.ts +0 -208
  586. package/dist/hooks.js +0 -1073
  587. package/dist/importers.js +0 -897
  588. package/dist/predictions.js +0 -620
  589. package/dist/search.d.ts +0 -320
  590. package/dist/search.js +0 -968
  591. package/dist/store.d.ts +0 -744
  592. package/dist/store.js +0 -3372
  593. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  594. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  595. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  596. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,94 @@
1
+ import { envSummaryDeboost } from '../env.js';
2
+ import { calculateStrength, CHURN_STALE_TAG } from '../memory.js';
3
+ import { isOutcomeFastAblated, isRecencyAblated, evalRecencyScaleDays } from '../ablation.js';
4
+ import { pathBoostMultiplier } from '../path-context.js';
5
+ import { scopeMatch } from '../scope.js';
6
+ import { temporalBoost } from './temporal.js';
7
+ export const CHURN_STALE_RANK_MULTIPLIER = 0.5; // SHORTCUT: untuned; measure on real recall before any default.
8
+ const DEFAULT_SUMMARY_DEBOOST = 0.85;
9
+ const DEFAULT_FRESHNESS_BOOST = 1.05;
10
+ const FRESHNESS_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
11
+ export function churnStaleFactor(entry) {
12
+ return entry.tags.includes(CHURN_STALE_TAG) ? CHURN_STALE_RANK_MULTIPLIER : 1.0;
13
+ }
14
+ export function recencyBoost(entry, now) {
15
+ if (isRecencyAblated())
16
+ return 1; // EVAL-ONLY ablation (see ablation.ts)
17
+ const created = new Date(entry.created);
18
+ const ageDays = (now.getTime() - created.getTime()) / (1000 * 60 * 60 * 24);
19
+ return Math.exp(-ageDays / (evalRecencyScaleDays() ?? 30));
20
+ }
21
+ /** Retrieval-time outcome nudge in [0.85, 1.15]; the bm25-outcome eval baseline ranks with it too. */
22
+ export function outcomeMultiplier(entry) {
23
+ const pos = entry.outcome_positive ?? 0;
24
+ const neg = entry.outcome_negative ?? 0;
25
+ if (isOutcomeFastAblated() || (pos === 0 && neg === 0))
26
+ return 1.0; // EVAL-ONLY ablation (see ablation.ts)
27
+ return Math.max(0.85, Math.min(1.15, 1 + 0.15 * Math.tanh((pos - neg) / 2)));
28
+ }
29
+ /** A DAG summary is a topic summary (level 2) or an entity profile (level 3); both take the same deboost. */
30
+ export function isDagSummary(entry) {
31
+ return entry.dag_level === 2 || entry.dag_level === 3;
32
+ }
33
+ /** Summary deboost: per-call, then HIPPO_SUMMARY_DEBOOST, then 0.85; values outside (0, 1] fall through. */
34
+ export function resolveSummaryDeboost(perCall) {
35
+ if (perCall !== undefined && Number.isFinite(perCall) && perCall > 0 && perCall <= 1) {
36
+ return perCall;
37
+ }
38
+ const raw = envSummaryDeboost();
39
+ if (raw !== undefined) {
40
+ const parsed = parseFloat(raw);
41
+ if (Number.isFinite(parsed) && parsed > 0 && parsed <= 1) {
42
+ return parsed;
43
+ }
44
+ }
45
+ return DEFAULT_SUMMARY_DEBOOST;
46
+ }
47
+ /** 1.05 for a summary rebuilt within the window; null, unparseable and future timestamps get 1.0. */
48
+ function summaryFreshnessMultiplier(entry, now) {
49
+ if (!isDagSummary(entry) || !entry.last_rebuilt_at)
50
+ return 1.0;
51
+ const rebuiltMs = new Date(entry.last_rebuilt_at).getTime();
52
+ if (!Number.isFinite(rebuiltMs))
53
+ return 1.0;
54
+ const ageMs = now.getTime() - rebuiltMs;
55
+ return ageMs >= 0 && ageMs <= FRESHNESS_WINDOW_MS ? DEFAULT_FRESHNESS_BOOST : 1.0;
56
+ }
57
+ /** The sync BM25 path applies no summary scoring; multiplying by exactly 1 keeps its scores bit-identical. */
58
+ export const NO_SUMMARY_SCORING = { deboost: 1, freshness: false };
59
+ export function summaryScoring(options) {
60
+ return { deboost: resolveSummaryDeboost(options.summaryDeboost), freshness: options.summaryFreshness ?? true };
61
+ }
62
+ export function summaryMultipliers(entry, now, s) {
63
+ if (!isDagSummary(entry))
64
+ return { deboost: 1.0, freshness: 1.0 };
65
+ return { deboost: s.deboost, freshness: s.freshness ? summaryFreshnessMultiplier(entry, now) : 1.0 };
66
+ }
67
+ export function strengthRecencyMultipliers(entry, now) {
68
+ return { strength: 0.5 + 0.5 * calculateStrength(entry, now), recency: 0.8 + 0.2 * recencyBoost(entry, now) };
69
+ }
70
+ /** Applies every rank multiplier one at a time, in a fixed order, so float rounding matches across paths. */
71
+ export function applyRankBoosts(score, entry, ctx) {
72
+ const decisionBoost = entry.tags.includes('decision') ? 1.2 : 1.0;
73
+ const churnStaleMultiplier = churnStaleFactor(entry);
74
+ const pathBoost = pathBoostMultiplier(entry.tags, ctx.pathTags);
75
+ const outcomeBoost = ctx.outcome ? outcomeMultiplier(entry) : 1.0;
76
+ const scopeSignal = scopeMatch(entry.tags, ctx.scope);
77
+ const scopeBoost = scopeSignal === 1 ? 1.5 : scopeSignal === -1 ? 0.5 : 1.0;
78
+ const extractionBoost = entry.tags.includes('extracted') ? 1.3 : 1.0;
79
+ const summary = summaryMultipliers(entry, ctx.now, ctx.summary);
80
+ let s = score;
81
+ s *= decisionBoost;
82
+ s *= churnStaleMultiplier;
83
+ s *= pathBoost;
84
+ s *= outcomeBoost;
85
+ s *= scopeBoost;
86
+ s *= extractionBoost;
87
+ s *= temporalBoost(entry, ctx.temporal.direction, ctx.temporal.range);
88
+ s *= summary.deboost * summary.freshness;
89
+ return {
90
+ score: s, decisionBoost, churnStaleMultiplier, pathBoost, outcomeBoost, scopeBoost,
91
+ summaryDeboost: summary.deboost, summaryFreshnessBoost: summary.freshness,
92
+ };
93
+ }
94
+ //# sourceMappingURL=boosts.js.map
@@ -0,0 +1,7 @@
1
+ import type { MemoryEntry } from '../memory.js';
2
+ import type { ScoreBreakdown } from './types.js';
3
+ /** Whole days since the entry was created, never negative. */
4
+ export declare function ageInDays(entry: MemoryEntry, now: Date): number;
5
+ /** Copies the entry's DAG metadata, and for summaries the multipliers applied, onto an explain breakdown. */
6
+ export declare function addDagFields(breakdown: ScoreBreakdown, entry: MemoryEntry, deboost: number, freshness: number): ScoreBreakdown;
7
+ //# sourceMappingURL=breakdown.d.ts.map
@@ -0,0 +1,20 @@
1
+ import { isDagSummary } from './boosts.js';
2
+ /** Whole days since the entry was created, never negative. */
3
+ export function ageInDays(entry, now) {
4
+ return Math.max(0, Math.floor((now.getTime() - new Date(entry.created).getTime()) / 86_400_000));
5
+ }
6
+ /** Copies the entry's DAG metadata, and for summaries the multipliers applied, onto an explain breakdown. */
7
+ export function addDagFields(breakdown, entry, deboost, freshness) {
8
+ if (entry.dag_level !== undefined)
9
+ breakdown.dagLevel = entry.dag_level;
10
+ if (entry.descendant_count !== undefined)
11
+ breakdown.descendantCount = entry.descendant_count;
12
+ if (isDagSummary(entry)) {
13
+ breakdown.lastRebuiltAt = entry.last_rebuilt_at ?? null;
14
+ breakdown.rebuildCount = entry.rebuild_count ?? 0;
15
+ breakdown.summaryDeboost = deboost;
16
+ breakdown.summaryFreshnessBoost = freshness;
17
+ }
18
+ return breakdown;
19
+ }
20
+ //# sourceMappingURL=breakdown.js.map
@@ -0,0 +1,25 @@
1
+ import type { SearchResult } from './types.js';
2
+ export interface MatchExplanation {
3
+ /** Human-readable reason string */
4
+ reason: string;
5
+ /** Which query terms matched in the document (BM25 component) */
6
+ matchedTerms: string[];
7
+ /** Whether BM25 contributed to the score */
8
+ hasBm25: boolean;
9
+ /** Whether embedding similarity contributed to the score */
10
+ hasEmbedding: boolean;
11
+ /** Raw cosine similarity (0 when embeddings not used) */
12
+ cosineSimilarity: number;
13
+ /** Provenance envelope (kind, scope, owner, artifact_ref, session_id, confidence) */
14
+ envelope?: {
15
+ kind: string;
16
+ scope: string | null;
17
+ owner: string | null;
18
+ artifact_ref: string | null;
19
+ session_id: string | null;
20
+ confidence: string;
21
+ };
22
+ }
23
+ /** Why a result matched: the overlapping query terms and whether BM25 and/or embedding similarity contributed. */
24
+ export declare function explainMatch(query: string, result: SearchResult): MatchExplanation;
25
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1,31 @@
1
+ import { tokenize } from '../tokenize.js';
2
+ import { matchedQueryTerms } from './bm25.js';
3
+ /** Why a result matched: the overlapping query terms and whether BM25 and/or embedding similarity contributed. */
4
+ export function explainMatch(query, result) {
5
+ const matchedTerms = matchedQueryTerms(new Set(tokenize(query)), result.entry);
6
+ const hasBm25 = result.bm25 > 0;
7
+ const hasEmbedding = result.cosine > 0;
8
+ const parts = [];
9
+ if (hasBm25)
10
+ parts.push(`BM25: matched terms [${matchedTerms.join(', ')}]`);
11
+ if (hasEmbedding)
12
+ parts.push(`embedding similarity: ${result.cosine.toFixed(3)}`);
13
+ if (parts.length === 0)
14
+ parts.push('no direct term or embedding match');
15
+ return {
16
+ reason: parts.join('; '),
17
+ matchedTerms,
18
+ hasBm25,
19
+ hasEmbedding,
20
+ cosineSimilarity: result.cosine,
21
+ envelope: {
22
+ kind: result.entry.kind ?? 'distilled',
23
+ scope: result.entry.scope ?? null,
24
+ owner: result.entry.owner ?? null,
25
+ artifact_ref: result.entry.artifact_ref ?? null,
26
+ session_id: result.entry.source_session_id ?? null,
27
+ confidence: result.entry.confidence ?? 'observed',
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1,8 @@
1
+ import type { MemoryEntry } from '../memory.js';
2
+ import type { ResultCost, SearchResult } from './types.js';
3
+ /** When an extracted fact and its source both match, keep only the higher-scoring one (usually the fact). */
4
+ export declare function dedupeExtracted(scored: SearchResult[]): SearchResult[];
5
+ /** DAG drill-down: a matched summary pulls its children from `pool` in at 0.9x its score; sorts `results` in place. */
6
+ export declare function withDagChildren(results: SearchResult[], pool: MemoryEntry[]): SearchResult[];
7
+ export declare function fitBudget<T extends SearchResult>(ordered: T[], budget: number, minResults: number, cost?: ResultCost): T[];
8
+ //# sourceMappingURL=finalize.d.ts.map
@@ -0,0 +1,52 @@
1
+ import { estimateTokens } from '../token-ledger.js';
2
+ import { compareScoredResults } from '../compare.js';
3
+ import { churnStaleFactor } from './boosts.js';
4
+ /** When an extracted fact and its source both match, keep only the higher-scoring one (usually the fact). */
5
+ export function dedupeExtracted(scored) {
6
+ const seenExtractedFrom = new Set();
7
+ const deduped = [];
8
+ for (const result of scored) {
9
+ const entry = result.entry;
10
+ if (entry.extracted_from) {
11
+ seenExtractedFrom.add(entry.extracted_from);
12
+ const sourceIdx = deduped.findIndex((d) => d.entry.id === entry.extracted_from);
13
+ if (sourceIdx >= 0)
14
+ deduped.splice(sourceIdx, 1);
15
+ deduped.push(result);
16
+ }
17
+ else if (!seenExtractedFrom.has(entry.id)) {
18
+ deduped.push(result);
19
+ }
20
+ }
21
+ return deduped;
22
+ }
23
+ /** DAG drill-down: a matched summary pulls its children from `pool` in at 0.9x its score; sorts `results` in place. */
24
+ export function withDagChildren(results, pool) {
25
+ const summaryIds = results.filter((r) => r.entry.tags.includes('dag-summary')).map((r) => r.entry.id);
26
+ if (summaryIds.length === 0)
27
+ return results;
28
+ const children = pool.filter((e) => e.dag_parent_id && summaryIds.includes(e.dag_parent_id));
29
+ for (const child of children) {
30
+ if (results.some((r) => r.entry.id === child.id))
31
+ continue;
32
+ const parentResult = results.find((r) => r.entry.id === child.dag_parent_id);
33
+ const childScore = parentResult ? parentResult.score * 0.9 * churnStaleFactor(child) : 0;
34
+ results.push({ entry: child, score: childScore, bm25: 0, cosine: 0, tokens: estimateTokens(child.content) });
35
+ }
36
+ results.sort(compareScoredResults);
37
+ return results;
38
+ }
39
+ // Skip-and-continue, with the first minResults kept whatever they cost; one loop so every engine spends alike.
40
+ export function fitBudget(ordered, budget, minResults, cost) {
41
+ const results = [];
42
+ let used = 0;
43
+ for (const r of ordered) {
44
+ const tokens = cost ? cost(r) : r.tokens;
45
+ if (results.length >= minResults && used + tokens > budget)
46
+ continue;
47
+ used += tokens;
48
+ results.push(r);
49
+ }
50
+ return results;
51
+ }
52
+ //# sourceMappingURL=finalize.js.map
@@ -0,0 +1,27 @@
1
+ import type { MemoryEntry } from '../memory.js';
2
+ import type { DenseScores } from './vector.js';
3
+ /** Opt-in third RRF list ranking in-pool candidates by graph proximity to the strong lexical seeds. */
4
+ export interface GraphStreamOptions {
5
+ /** RRF weight for the graph list. Required (opt-in is explicit; no implicit default). */
6
+ weight: number;
7
+ tenantId: string;
8
+ /** Global store root, when distinct (where global seeds' graph lives). */
9
+ globalRoot?: string;
10
+ hops?: number;
11
+ decay?: number;
12
+ maxNeighbors?: number;
13
+ /** # of top lexical seeds to expand from. Default DEFAULT_GRAPH_SEED_COUNT. */
14
+ seedCount?: number;
15
+ }
16
+ export interface FusionInput {
17
+ entries: MemoryEntry[];
18
+ bm25Scores: number[];
19
+ dense: DenseScores;
20
+ bm25Weight: number;
21
+ embeddingWeight: number;
22
+ hippoRoot?: string;
23
+ graphStream?: GraphStreamOptions;
24
+ }
25
+ /** Reciprocal rank fusion of the BM25 and dense rankings, plus the graph list when it ranks anything. */
26
+ export declare function fuseRanks(input: FusionInput): Map<number, number>;
27
+ //# sourceMappingURL=fusion.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { rrfFuse } from '../rrf.js';
2
+ import { graphRankStream, selectGraphSeeds, DEFAULT_GRAPH_SEED_COUNT } from '../graph-stream.js';
3
+ import { compareEntryIdentity } from '../compare.js';
4
+ // Score desc, then entry identity, so ties cannot leak fresh-ingest order into graph seeds or RRF ranks.
5
+ function rankBy(eligible, scores, entries) {
6
+ return [...eligible].sort((a, b) => {
7
+ const d = scores[b] - scores[a];
8
+ return d !== 0 ? d : compareEntryIdentity(entries[a], entries[b]);
9
+ });
10
+ }
11
+ /** Reciprocal rank fusion of the BM25 and dense rankings, plus the graph list when it ranks anything. */
12
+ export function fuseRanks(input) {
13
+ const { entries, bm25Scores, dense } = input;
14
+ const eligible = entries.map((_, i) => i).filter((i) => bm25Scores[i] > 0 || dense.cosine[i] > 0);
15
+ const bm25Ranked = rankBy(eligible, bm25Scores, entries);
16
+ const cosineRanked = rankBy(eligible, dense.cosine, entries);
17
+ const graphRanked = graphRanking(input, eligible.length, bm25Ranked, cosineRanked);
18
+ // absentRank stays entries.length + 1 rather than rrfFuse's longest-list default.
19
+ const opts = { absentRank: entries.length + 1 };
20
+ // An all-absent third list would add a constant the later multipliers make non-uniform, so an empty one is skipped.
21
+ return graphRanked.length > 0
22
+ ? rrfFuse([bm25Ranked, cosineRanked, graphRanked], [input.bm25Weight, input.embeddingWeight, input.graphStream?.weight ?? 0], opts)
23
+ : rrfFuse([bm25Ranked, cosineRanked], [input.bm25Weight, input.embeddingWeight], opts);
24
+ }
25
+ function graphRanking(input, eligibleCount, bm25Ranked, cosineRanked) {
26
+ const gs = input.graphStream;
27
+ // Without doc vectors the dense ranking is just entry order, so seeds drawn from it would mean nothing.
28
+ const hasDocVectors = input.dense.hadVec.some(Boolean);
29
+ if (!gs || gs.weight <= 0 || !input.hippoRoot || !hasDocVectors)
30
+ return [];
31
+ const seedCount = Math.min(gs.seedCount ?? DEFAULT_GRAPH_SEED_COUNT, eligibleCount);
32
+ const seeds = selectGraphSeeds(bm25Ranked, cosineRanked, seedCount);
33
+ return graphRankStream(input.entries, seeds, {
34
+ hippoRoot: input.hippoRoot,
35
+ tenantId: gs.tenantId,
36
+ globalRoot: gs.globalRoot,
37
+ hops: gs.hops,
38
+ decay: gs.decay,
39
+ maxNeighbors: gs.maxNeighbors,
40
+ });
41
+ }
42
+ //# sourceMappingURL=fusion.js.map
@@ -0,0 +1,20 @@
1
+ import type { MemoryEntry } from '../memory.js';
2
+ import { type BoostContext } from './boosts.js';
3
+ import type { DenseScores } from './vector.js';
4
+ import type { SearchResult } from './types.js';
5
+ export interface HybridScoreInput {
6
+ entries: MemoryEntry[];
7
+ queryTerms: string[];
8
+ bm25Scores: number[];
9
+ maxBm25: number;
10
+ dense: DenseScores;
11
+ useEmbeddings: boolean;
12
+ rrfScores: Map<number, number> | null;
13
+ bm25Weight: number;
14
+ embeddingWeight: number;
15
+ explain: boolean;
16
+ boosts: BoostContext;
17
+ }
18
+ /** Scores every pool entry; rows with no lexical hit drop out unless vectors are in play, and non-positive scores always do. */
19
+ export declare function scoreHybridPool(input: HybridScoreInput): SearchResult[];
20
+ //# sourceMappingURL=hybrid-score.d.ts.map
@@ -0,0 +1,73 @@
1
+ import { estimateTokens } from '../token-ledger.js';
2
+ import { matchedQueryTerms } from './bm25.js';
3
+ import { applyRankBoosts, strengthRecencyMultipliers } from './boosts.js';
4
+ import { addDagFields, ageInDays } from './breakdown.js';
5
+ /** Scores every pool entry; rows with no lexical hit drop out unless vectors are in play, and non-positive scores always do. */
6
+ export function scoreHybridPool(input) {
7
+ const scored = [];
8
+ const queryTermSet = new Set(input.queryTerms);
9
+ for (let i = 0; i < input.entries.length; i++) {
10
+ if (!input.useEmbeddings && input.bm25Scores[i] <= 0)
11
+ continue;
12
+ const s = scoreEntry(i, input);
13
+ if (s.boosts.score <= 0)
14
+ continue;
15
+ const entry = input.entries[i];
16
+ const result = {
17
+ entry,
18
+ score: s.boosts.score,
19
+ bm25: input.bm25Scores[i],
20
+ cosine: input.dense.cosine[i],
21
+ tokens: estimateTokens(entry.content),
22
+ };
23
+ if (input.explain)
24
+ result.breakdown = hybridBreakdown(i, s, input, queryTermSet);
25
+ scored.push(result);
26
+ }
27
+ return scored;
28
+ }
29
+ function scoreEntry(i, input) {
30
+ const entry = input.entries[i];
31
+ const rawBm25 = input.bm25Scores[i];
32
+ const normBm25 = rawBm25 / input.maxBm25;
33
+ const { strength, recency } = strengthRecencyMultipliers(entry, input.boosts.now);
34
+ let base;
35
+ let mode;
36
+ if (input.useEmbeddings) {
37
+ base = input.rrfScores
38
+ ? input.rrfScores.get(i) ?? 0
39
+ : input.bm25Weight * normBm25 + input.embeddingWeight * input.dense.cosine[i];
40
+ mode = input.dense.hadVec[i] ? 'hybrid' : 'hybrid-no-vec';
41
+ }
42
+ else {
43
+ base = input.queryTerms.length > 0 ? rawBm25 / input.queryTerms.length : rawBm25;
44
+ mode = 'bm25-only';
45
+ }
46
+ const boosts = applyRankBoosts(base * strength * recency, entry, input.boosts);
47
+ return { base, mode, normBm25, strength, recency, boosts };
48
+ }
49
+ function hybridBreakdown(i, s, input, queryTermSet) {
50
+ const entry = input.entries[i];
51
+ const b = s.boosts;
52
+ const breakdown = {
53
+ mode: s.mode,
54
+ normBm25: s.normBm25,
55
+ bm25Weight: input.useEmbeddings ? input.bm25Weight : 1,
56
+ embeddingWeight: input.useEmbeddings ? input.embeddingWeight : 0,
57
+ cosine: input.dense.cosine[i],
58
+ base: s.base,
59
+ strengthMultiplier: s.strength,
60
+ recencyMultiplier: s.recency,
61
+ decisionBoost: b.decisionBoost,
62
+ pathBoost: b.pathBoost,
63
+ scopeBoost: b.scopeBoost,
64
+ sourceBump: 1,
65
+ outcomeBoost: b.outcomeBoost,
66
+ churnStaleMultiplier: b.churnStaleMultiplier,
67
+ matchedTerms: matchedQueryTerms(queryTermSet, entry),
68
+ final: b.score,
69
+ ageDays: ageInDays(entry, input.boosts.now),
70
+ };
71
+ return addDagFields(breakdown, entry, b.summaryDeboost, b.summaryFreshnessBoost);
72
+ }
73
+ //# sourceMappingURL=hybrid-score.js.map
@@ -0,0 +1,46 @@
1
+ import type { MemoryEntry } from '../memory.js';
2
+ import type { RerankerFn, RerankerOptions } from '../rerankers/types.js';
3
+ import { type BM25Corpus } from './bm25.js';
4
+ import { type HybridVectorCandidates } from './vector.js';
5
+ import { type GraphStreamOptions } from './fusion.js';
6
+ import type { ResultCost, SearchResult } from './types.js';
7
+ export interface HybridSearchOptions {
8
+ budget?: number;
9
+ now?: Date;
10
+ hippoRoot?: string;
11
+ embeddingWeight?: number;
12
+ explain?: boolean;
13
+ /** Disable MMR re-ranking even when embeddings are available. */
14
+ mmr?: boolean;
15
+ /** MMR balance: 1.0 = pure relevance, 0.0 = pure diversity. Default 0.7. */
16
+ mmrLambda?: number;
17
+ /** 'blend' (weighted sum of BM25 and cosine, default) or 'rrf' (reciprocal rank fusion of their ranks). */
18
+ scoring?: 'blend' | 'rrf';
19
+ /** Corpus from `buildCorpus` over the same `entries` in the same order (content + tags), reused to skip tokenizing. */
20
+ preparedCorpus?: BM25Corpus;
21
+ /** Minimum number of results to return regardless of budget. Default 1. */
22
+ minResults?: number;
23
+ /** Budget cost per result; the caller that prints passes the cost of its printed text. */
24
+ cost?: ResultCost;
25
+ /** Active scope for scope-boost scoring. Auto-detected if not provided. */
26
+ scope?: string | null;
27
+ /** Include superseded memories in results. Default false. */
28
+ includeSuperseded?: boolean;
29
+ /** Filter to memories current at this ISO date string. */
30
+ asOf?: string;
31
+ /** Optional reranker. Runs after MMR, before budget filtering. See src/rerankers/types.ts. */
32
+ reranker?: RerankerFn;
33
+ /** Options passed through to the reranker. */
34
+ rerankerOptions?: RerankerOptions;
35
+ /** Multiplier on DAG summary scores. Default 0.85 (env HIPPO_SUMMARY_DEBOOST overrides; per-call wins). 1.0 disables. */
36
+ summaryDeboost?: number;
37
+ /** 1.05 micro-boost for summaries rebuilt within 7 days. Default true. */
38
+ summaryFreshness?: boolean;
39
+ /** Graph-proximity third RRF list; active only with `scoring: 'rrf'`, embeddings and a `hippoRoot`. See src/graph-stream.ts. */
40
+ graphStream?: GraphStreamOptions;
41
+ /** Add the rows nearest the query vector, not only rescore `entries`; without it a row no query word matches cannot surface. */
42
+ vectorCandidates?: HybridVectorCandidates;
43
+ }
44
+ /** BM25 blended with cosine similarity when stored vectors and a provider are available, BM25 * strength * recency otherwise. */
45
+ export declare function hybridSearch(query: string, entries: MemoryEntry[], options?: HybridSearchOptions): Promise<SearchResult[]>;
46
+ //# sourceMappingURL=hybrid.d.ts.map
@@ -0,0 +1,64 @@
1
+ import { tokenize } from '../tokenize.js';
2
+ import { evalNow } from '../ablation.js';
3
+ import { extractPathTags } from '../path-context.js';
4
+ import { detectScope } from '../scope.js';
5
+ import { compareScoredResults } from '../compare.js';
6
+ import { bm25Score, buildCorpus, entryText } from './bm25.js';
7
+ import { currentEntries } from './as-of.js';
8
+ import { summaryScoring } from './boosts.js';
9
+ import { temporalContext } from './temporal.js';
10
+ import { denseScores, resolveVectorArm } from './vector.js';
11
+ import { fuseRanks } from './fusion.js';
12
+ import { scoreHybridPool } from './hybrid-score.js';
13
+ import { applyMmrWindow, applyReranker } from './rerank.js';
14
+ import { dedupeExtracted, fitBudget, withDagChildren } from './finalize.js';
15
+ /** BM25 blended with cosine similarity when stored vectors and a provider are available, BM25 * strength * recency otherwise. */
16
+ export async function hybridSearch(query, entries, options = {}) {
17
+ const now = options.now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
18
+ const embeddingWeight = options.embeddingWeight ?? 0.6;
19
+ const pool = currentEntries(entries, options);
20
+ if (pool.length === 0)
21
+ return [];
22
+ const queryTerms = tokenize(query);
23
+ if (queryTerms.length === 0)
24
+ return [];
25
+ const arm = await resolveVectorArm(query, pool, options);
26
+ // A prepared corpus covers the caller's entries only, so rows the vector arm added force a rebuild.
27
+ const corpus = (arm.addedRows ? undefined : options.preparedCorpus) ?? buildCorpus(arm.entries.map(entryText));
28
+ const bm25Scores = arm.entries.map((_, i) => bm25Score(corpus, i, queryTerms));
29
+ const dense = denseScores(arm);
30
+ const fusion = { entries: arm.entries, bm25Scores, dense, bm25Weight: 1 - embeddingWeight, embeddingWeight };
31
+ const rrfScores = arm.useEmbeddings && options.scoring === 'rrf'
32
+ ? fuseRanks({ ...fusion, hippoRoot: options.hippoRoot, graphStream: options.graphStream })
33
+ : null;
34
+ const scored = scoreHybridPool({
35
+ ...fusion,
36
+ queryTerms,
37
+ maxBm25: bm25Scores.reduce((a, b) => Math.max(a, b), 1e-9),
38
+ useEmbeddings: arm.useEmbeddings,
39
+ rrfScores,
40
+ explain: options.explain ?? false,
41
+ boosts: hybridBoostContext(query, arm.entries, now, options),
42
+ });
43
+ scored.sort(compareScoredResults);
44
+ const ordered = await orderHybrid(query, withDagChildren(dedupeExtracted(scored), arm.entries), arm, options);
45
+ return fitBudget(ordered, options.budget ?? 4000, options.minResults ?? 1, options.cost);
46
+ }
47
+ function hybridBoostContext(query, pool, now, options) {
48
+ return {
49
+ now,
50
+ pathTags: extractPathTags(process.cwd()),
51
+ scope: options.scope !== undefined ? options.scope : detectScope(),
52
+ temporal: temporalContext(query, pool),
53
+ outcome: true,
54
+ summary: summaryScoring(options),
55
+ };
56
+ }
57
+ /** MMR when vectors are loaded, then the optional reranker. */
58
+ async function orderHybrid(query, scored, arm, options) {
59
+ const mmrLambda = options.mmrLambda ?? 0.7;
60
+ const applyMmr = (options.mmr ?? true) && arm.useEmbeddings && scored.length > 1 && mmrLambda < 1;
61
+ const ordered = applyMmr ? applyMmrWindow(scored, arm.embeddingIndex, mmrLambda, options.explain ?? false) : scored;
62
+ return options.reranker ? applyReranker(query, ordered, options.reranker, options.rerankerOptions) : ordered;
63
+ }
64
+ //# sourceMappingURL=hybrid.js.map
@@ -0,0 +1,29 @@
1
+ import { type MemoryEntry } from '../memory.js';
2
+ import { type PhysicsConfig } from '../physics-config.js';
3
+ import { type HybridVectorCandidates } from './vector.js';
4
+ import type { ResultCost, SearchResult } from './types.js';
5
+ export interface PhysicsSearchOptions {
6
+ budget?: number;
7
+ now?: Date;
8
+ hippoRoot?: string;
9
+ physicsConfig?: PhysicsConfig;
10
+ queryEmbedding?: number[];
11
+ explain?: boolean;
12
+ minResults?: number;
13
+ cost?: ResultCost;
14
+ /** Active scope for scope-boost scoring. Auto-detected if not provided. */
15
+ scope?: string | null;
16
+ /** Include superseded memories; must reach the inner hybrid filter or `recall --include-superseded` rows drop out here. */
17
+ includeSuperseded?: boolean;
18
+ /** Bi-temporal filter: memories current at this ISO date string, ranked by hybridSearch. */
19
+ asOf?: string;
20
+ /** Same summary deboost as hybridSearch, which also inherits it on every fallback. */
21
+ summaryDeboost?: number;
22
+ /** Same freshness boost as hybridSearch. */
23
+ summaryFreshness?: boolean;
24
+ /** Same as hybridSearch's: rows nearest the query join the pool before physics scoring. */
25
+ vectorCandidates?: HybridVectorCandidates;
26
+ }
27
+ /** Scores memories by gravity, momentum and cluster amplification; rows without physics state rank through hybridSearch. */
28
+ export declare function physicsSearch(query: string, entries: MemoryEntry[], options?: PhysicsSearchOptions): Promise<SearchResult[]>;
29
+ //# sourceMappingURL=physics-search.d.ts.map