hippo-memory 2.0.0 → 2.1.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 (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -1,26 +1,32 @@
1
1
  // Ranking core shared by `hippo recall` and `hippo explain`: load, search, expand, re-rank and filter, with no
2
2
  // writes and no direct output. Callers own flag parsing, printing, budget fitting and persistence.
3
- import { evalNow } from '../core/ablation.js';
4
- import { oneCopyPerMemory } from './context-select.js';
5
- import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
6
- import { isEmbeddingAvailable } from '../embeddings/local.js';
7
- import { activeGoalsWithPolicies } from '../store/goals.js';
8
- import { boostByGoals } from '../search/goal-boost.js';
9
- import { graphExpandRecall } from '../graph/recall.js';
10
- import { DEFAULT_GRAPH_STREAM_WEIGHT } from '../graph/stream.js';
11
- import { Layer } from '../core/memory.js';
12
- import { multihopSearch } from '../search/multihop.js';
13
- import { passesCliRecallScopeFilter } from '../core/recall-scope.js';
14
- import { currentEntries } from '../search/as-of.js';
15
- import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '../search/boosts.js';
16
- import { hybridSearch, vectorSourceOf } from '../search/hybrid.js';
17
- import { searchByEngine } from '../search/engine.js';
18
- import { rankBothStores } from '../sharing/search-both.js';
19
- import { loadRecallEntries, recallScopeFilter } from '../store/search-rows.js';
20
- import { isJsonNumber } from '../util/json.js';
21
- import { textOverlap, tokenize as tokenizeQuery } from '../util/tokenize.js';
22
- /** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics state; writes and prints nothing
23
- * (notes go to `ctx.note`). The caller supplies the cost function and reranker in `opts` and persists the returned goal-log rows. */
3
+ import { evalNow } from '../../core/ablation.js';
4
+ import { oneCopyPerMemory } from '../context-select.js';
5
+ import { compareEntryIdentity, compareScoresDesc } from '../../core/compare.js';
6
+ import { isEmbeddingAvailable } from '../../embeddings/local.js';
7
+ import { activeGoalsWithPolicies } from '../../store/goals.js';
8
+ import { boostByGoals } from '../../search/goal-boost.js';
9
+ import { graphExpandRecall } from '../../graph/recall.js';
10
+ import { DEFAULT_GRAPH_STREAM_WEIGHT } from '../../graph/stream.js';
11
+ import { Layer } from '../../core/memory.js';
12
+ import { multihopSearch } from '../../search/multihop.js';
13
+ import { passesCliRecallScopeFilter } from '../../core/recall-scope.js';
14
+ import { currentEntries } from '../../search/as-of.js';
15
+ import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '../../search/boosts.js';
16
+ import { hybridSearch, vectorSourceOf } from '../../search/hybrid.js';
17
+ import { searchByEngine } from '../../search/engine.js';
18
+ import { CONFLICT_PEER_MULTIPLIER, SALIENCE_MIN_MULTIPLIER, UTILITY_LENGTH_PENALTY_CAP, UTILITY_LENGTH_TOKENS, VALUE_MULT_MAX, VALUE_MULT_MIN, VALUE_MULT_SLOPE, } from '../../core/search-types.js';
19
+ import { rankBothStores } from '../../sharing/search-both.js';
20
+ import { loadRecallEntries, recallScopeFilter } from '../../store/search-rows.js';
21
+ import { isJsonNumber } from '../../util/json.js';
22
+ import { currentSignal } from '../../util/request-scope.js';
23
+ import { textOverlap, tokenize as tokenizeQuery } from '../../util/tokenize.js';
24
+ /**
25
+ * Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics
26
+ * state; writes and prints nothing
27
+ * (notes go to `ctx.note`). The caller supplies the cost function and reranker in `opts` and persists the returned
28
+ * goal-log rows.
29
+ */
24
30
  export async function rankRecall(ctx, opts) {
25
31
  const pool = loadRecallPool(ctx, opts);
26
32
  const state = { results: [], droppedPreRank: pool.dropped, graphAdded: 0, goalRecallLog: [] };
@@ -35,6 +41,8 @@ export async function rankRecall(ctx, opts) {
35
41
  halted,
36
42
  });
37
43
  state.results = await searchPool(ctx, opts, pool);
44
+ // A request past its deadline during the search has no caller left for the later stages.
45
+ currentSignal()?.throwIfAborted();
38
46
  if (opts.haltBefore === 'expand')
39
47
  return done(true);
40
48
  if (opts.graphHops)
@@ -65,7 +73,12 @@ function loadRecallPool(ctx, opts) {
65
73
  // An explicit --scope unlocks that envelope scope; the regex-only `<source>:private:*` deny is the JS half below.
66
74
  const requested = opts.explicitScope || undefined;
67
75
  const loadSuperseded = opts.includeSuperseded || Boolean(opts.asOf);
68
- const load = { tenantId: ctx.tenantId, requestedScope: requested, explicitScopeMode: 'additive', includeSuperseded: loadSuperseded };
76
+ const load = {
77
+ tenantId: ctx.tenantId,
78
+ requestedScope: requested,
79
+ explicitScopeMode: 'additive',
80
+ includeSuperseded: loadSuperseded,
81
+ };
69
82
  let local = loadRecallEntries(ctx.hippoRoot, opts.query, load);
70
83
  let global = ctx.globalRoot ? loadRecallEntries(ctx.globalRoot, opts.query, load) : [];
71
84
  // SQL-excluded rows are pre-candidate, so the total is taken before the JS filters, which normally drop nothing.
@@ -78,47 +91,95 @@ function loadRecallPool(ctx, opts) {
78
91
  global = currentEntries(global, currentness);
79
92
  return { local, global, total, dropped: total - (local.length + global.length) };
80
93
  }
81
- async function searchPool(ctx, opts, pool) {
94
+ function graphStreamSearch(ctx, opts, graphStream, pool) {
82
95
  const { query, budget, cost, includeSuperseded, asOf, activeScope: scope, search } = opts;
83
- const { mmr, mmrLambda, minResults, explain } = search;
96
+ const { mmr, mmrLambda, minResults } = search;
84
97
  const globalRoot = pool.global.length > 0 ? ctx.globalRoot : undefined;
85
- if (search.graphStream) {
86
- // Without embeddings hybridSearch falls back to BM25-only and the stream is inert; say so rather than no-op.
87
- if (!isEmbeddingAvailable()) {
88
- ctx.note?.('[note] --graph-stream needs embeddings (rrf fusion); none available, so the graph stream is inert. Run `hippo embed` first.');
89
- }
90
- if (globalRoot)
91
- ctx.note?.('[note] --graph-stream searches the local store only; global graph fusion is a follow-up.');
92
- // With seedCount or fewer candidates every one is a seed and the stream degrades to the 2-list fusion.
93
- return hybridSearch(query, pool.local, {
94
- budget, cost, hippoRoot: ctx.hippoRoot, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf,
95
- scoring: 'rrf',
96
- graphStream: { weight: DEFAULT_GRAPH_STREAM_WEIGHT, tenantId: ctx.tenantId, hops: search.graphStream.hops, seedCount: search.graphStream.seeds },
97
- });
98
+ // Without embeddings hybridSearch falls back to BM25-only and the stream is inert; say so rather than no-op.
99
+ if (!isEmbeddingAvailable()) {
100
+ ctx.note?.('[note] --graph-stream needs embeddings (rrf fusion); none available, so the graph stream is inert. Run ' +
101
+ '`hippo embed` first.');
98
102
  }
99
- if (search.multihop) {
100
- // Unlike rankBothStores below, multihop ranks one pooled list, so a shared memory's two copies both compete.
101
- const allEntries = oneCopyPerMemory(pool.local, pool.global, evalNow()).flat();
102
- return multihopSearch(query, allEntries, { budget, cost, hippoRoot: ctx.hippoRoot, minResults, includeSuperseded, asOf });
103
+ if (globalRoot) {
104
+ ctx.note?.('[note] --graph-stream searches the local store only; global graph fusion is a follow-up.');
103
105
  }
106
+ // With seedCount or fewer candidates every one is a seed and the stream degrades to the 2-list fusion.
107
+ return hybridSearch(query, pool.local, {
108
+ budget, cost, hippoRoot: ctx.hippoRoot, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf,
109
+ scoring: 'rrf',
110
+ graphStream: {
111
+ weight: DEFAULT_GRAPH_STREAM_WEIGHT,
112
+ tenantId: ctx.tenantId,
113
+ hops: graphStream.hops,
114
+ seedCount: graphStream.seeds,
115
+ },
116
+ });
117
+ }
118
+ function multihopPoolSearch(ctx, opts, pool) {
119
+ const { query, budget, cost, includeSuperseded, asOf, search } = opts;
120
+ const { minResults } = search;
121
+ // Unlike rankBothStores below, multihop ranks one pooled list, so a shared memory's two copies both compete.
122
+ const allEntries = oneCopyPerMemory(pool.local, pool.global, evalNow()).flat();
123
+ return multihopSearch(query, allEntries, {
124
+ budget,
125
+ cost,
126
+ hippoRoot: ctx.hippoRoot,
127
+ minResults,
128
+ includeSuperseded,
129
+ asOf,
130
+ });
131
+ }
132
+ function poolVectorCandidates(ctx, opts) {
104
133
  const requested = opts.explicitScope || undefined;
105
- const vectorCandidates = {
134
+ return {
106
135
  tenantId: ctx.tenantId,
107
136
  scope: recallScopeFilter(requested, 'additive'),
108
- includeSuperseded: includeSuperseded || Boolean(asOf),
137
+ includeSuperseded: opts.includeSuperseded || Boolean(opts.asOf),
109
138
  admit: (e) => passesCliRecallScopeFilter(e.scope ?? null, requested),
110
139
  };
140
+ }
141
+ async function searchPool(ctx, opts, pool) {
142
+ const { query, budget, cost, includeSuperseded, asOf, activeScope: scope, search } = opts;
143
+ const { mmr, mmrLambda, minResults, explain } = search;
144
+ const globalRoot = pool.global.length > 0 ? ctx.globalRoot : undefined;
145
+ if (search.graphStream)
146
+ return graphStreamSearch(ctx, opts, search.graphStream, pool);
147
+ if (search.multihop)
148
+ return multihopPoolSearch(ctx, opts, pool);
149
+ const vectorCandidates = poolVectorCandidates(ctx, opts);
111
150
  if (globalRoot) {
112
- // The pool already holds searchBothHybrid's additive-scope load for each store, so rank it rather than read both stores again.
151
+ // The pool already holds searchBothHybrid's additive-scope load for each store, so rank it rather than read both
152
+ // stores again.
113
153
  return rankBothStores(query, { local: ctx.hippoRoot, global: globalRoot }, { local: pool.local, global: pool.global }, vectorCandidates, {
114
- budget, cost, explain, mmr, mmrLambda, localBump: search.localBump, minResults, scope, tenantId: ctx.tenantId,
115
- includeSuperseded, asOf,
154
+ budget,
155
+ cost,
156
+ explain,
157
+ mmr,
158
+ mmrLambda,
159
+ localBump: search.localBump,
160
+ minResults,
161
+ scope,
162
+ tenantId: ctx.tenantId,
163
+ includeSuperseded,
164
+ asOf,
116
165
  });
117
166
  }
118
167
  const physics = search.usePhysics ? search.physicsConfig : null;
119
- // Physics takes no MMR; explain drops minResults and includeSuperseded to hold its output steady; asOf must reach physics or later rows leak.
120
- const tuning = !physics ? { mmr, mmrLambda, minResults, includeSuperseded, asOf } : explain ? { asOf } : { minResults, includeSuperseded, asOf };
121
- return searchByEngine(hippoDbSource(ctx.hippoRoot), query, pool.local, physics, { budget, cost, scope, explain, vectorCandidates, ...tuning });
168
+ // Physics takes no MMR; explain drops minResults and includeSuperseded to hold its output steady; asOf must reach
169
+ // physics or later rows leak.
170
+ const tuning = !physics
171
+ ? { mmr, mmrLambda, minResults, includeSuperseded, asOf }
172
+ : explain
173
+ ? { asOf }
174
+ : { minResults, includeSuperseded, asOf };
175
+ return searchByEngine(hippoDbSource(ctx.hippoRoot), query, pool.local, physics, {
176
+ budget,
177
+ cost,
178
+ scope,
179
+ explain,
180
+ vectorCandidates,
181
+ ...tuning,
182
+ });
122
183
  }
123
184
  /** The CLI core holds no store: it ranks on hippo.db under its root, as its loads above do. */
124
185
  function hippoDbSource(hippoRoot) {
@@ -161,57 +222,67 @@ function traced(opts, prev, next, step) {
161
222
  function byScore(results) {
162
223
  return results.sort((a, b) => compareScoresDesc(a.score, b.score));
163
224
  }
225
+ function demoteConflictPeers(opts, state) {
226
+ // Recorded conflicts only: a lexical-overlap gate once wrecked benchmark recall. Down-rank, never delete.
227
+ const presentIds = new Set(state.results.map((r) => r.entry.id));
228
+ state.results = byScore(state.results.map((r) => {
229
+ const hasPeerInResults = (r.entry.conflicts_with || []).some((peerId) => presentIds.has(peerId));
230
+ if (!hasPeerInResults)
231
+ return r;
232
+ const next = { ...r, score: r.score * CONFLICT_PEER_MULTIPLIER };
233
+ return traced(opts, r, next, {
234
+ stage: 'interference',
235
+ multiplier: CONFLICT_PEER_MULTIPLIER,
236
+ scoreBefore: r.score,
237
+ scoreAfter: next.score,
238
+ });
239
+ }));
240
+ }
241
+ function applyValueAware(opts, state) {
242
+ // Wider clamp than the always-on outcome boost, so outcome history can decide the order.
243
+ state.results = byScore(state.results.map((r) => {
244
+ const pos = r.entry.outcome_positive ?? 0;
245
+ const neg = r.entry.outcome_negative ?? 0;
246
+ if (pos === 0 && neg === 0)
247
+ return r;
248
+ const valueMult = Math.max(VALUE_MULT_MIN, Math.min(VALUE_MULT_MAX, 1 + VALUE_MULT_SLOPE * Math.tanh(pos - neg)));
249
+ const next = { ...r, score: r.score * valueMult };
250
+ return traced(opts, r, next, {
251
+ stage: 'value',
252
+ multiplier: valueMult,
253
+ scoreBefore: r.score,
254
+ scoreAfter: next.score,
255
+ });
256
+ }));
257
+ }
258
+ function applyUtilityRank(opts, state) {
259
+ // utility = score * (0.5 + 0.5 * strength) * (1 - min(0.3, tokens / 10000)); long evidence-rich rows pay for
260
+ // length.
261
+ state.results = byScore(state.results.map((r) => {
262
+ const strength = isJsonNumber(r.entry.strength) ? r.entry.strength : 1.0;
263
+ const utilityMult = (STRENGTH_RANK_FLOOR + STRENGTH_RANK_SPAN * strength) *
264
+ (1 - Math.min(UTILITY_LENGTH_PENALTY_CAP, (r.tokens || 0) / UTILITY_LENGTH_TOKENS));
265
+ const utility = r.score * utilityMult;
266
+ return traced(opts, r, { ...r, score: utility }, { stage: 'utility', multiplier: utilityMult, scoreBefore: r.score, scoreAfter: utility });
267
+ }));
268
+ }
164
269
  function applyPfcRerankers(opts, state) {
165
270
  if (opts.evcAdaptive && state.results.length >= 2)
166
271
  state.results = evcAdaptive(opts.query, state.results);
167
272
  if (opts.filterConflicts) {
168
273
  dropUnless(state, (r) => !r.entry.superseded_by);
169
- // Recorded conflicts only: a lexical-overlap gate once wrecked benchmark recall. Down-rank, never delete.
170
- const presentIds = new Set(state.results.map((r) => r.entry.id));
171
- state.results = byScore(state.results.map((r) => {
172
- const hasPeerInResults = (r.entry.conflicts_with || []).some((peerId) => presentIds.has(peerId));
173
- if (!hasPeerInResults)
174
- return r;
175
- const next = { ...r, score: r.score * CONFLICT_PEER_MULTIPLIER };
176
- return traced(opts, r, next, { stage: 'interference', multiplier: CONFLICT_PEER_MULTIPLIER, scoreBefore: r.score, scoreAfter: next.score });
177
- }));
178
- }
179
- if (opts.valueAware && state.results.length >= 1) {
180
- // Wider clamp than the always-on outcome boost, so outcome history can decide the order.
181
- state.results = byScore(state.results.map((r) => {
182
- const pos = r.entry.outcome_positive ?? 0;
183
- const neg = r.entry.outcome_negative ?? 0;
184
- if (pos === 0 && neg === 0)
185
- return r;
186
- const valueMult = Math.max(VALUE_MULT_MIN, Math.min(VALUE_MULT_MAX, 1 + VALUE_MULT_SLOPE * Math.tanh(pos - neg)));
187
- const next = { ...r, score: r.score * valueMult };
188
- return traced(opts, r, next, { stage: 'value', multiplier: valueMult, scoreBefore: r.score, scoreAfter: next.score });
189
- }));
190
- }
191
- if (opts.rerankUtility) {
192
- // utility = score * (0.5 + 0.5 * strength) * (1 - min(0.3, tokens / 10000)); long evidence-rich rows pay for length.
193
- state.results = byScore(state.results.map((r) => {
194
- const strength = isJsonNumber(r.entry.strength) ? r.entry.strength : 1.0;
195
- const utilityMult = (STRENGTH_RANK_FLOOR + STRENGTH_RANK_SPAN * strength) * (1 - Math.min(UTILITY_LENGTH_PENALTY_CAP, (r.tokens || 0) / UTILITY_LENGTH_TOKENS));
196
- const utility = r.score * utilityMult;
197
- return traced(opts, r, { ...r, score: utility }, { stage: 'utility', multiplier: utilityMult, scoreBefore: r.score, scoreAfter: utility });
198
- }));
274
+ demoteConflictPeers(opts, state);
199
275
  }
276
+ if (opts.valueAware && state.results.length >= 1)
277
+ applyValueAware(opts, state);
278
+ if (opts.rerankUtility)
279
+ applyUtilityRank(opts, state);
200
280
  }
201
- // A recorded conflict peer in the same result list is cut to this share of its score.
202
- const CONFLICT_PEER_MULTIPLIER = 0.3;
203
- // The value-aware clamp is wider than the always-on outcome nudge, so outcome history can decide the order.
204
- const VALUE_MULT_SLOPE = 0.3;
205
- const VALUE_MULT_MIN = 0.7;
206
- const VALUE_MULT_MAX = 1.3;
207
- const UTILITY_LENGTH_PENALTY_CAP = 0.3;
208
- const UTILITY_LENGTH_TOKENS = 10000;
209
281
  // evcAdaptive acts when the top hits overlap this much; it keeps rows near the best score or covering the query.
210
282
  const NEAR_DUPLICATE_OVERLAP_MIN = 0.4;
211
283
  const SCORE_FLOOR_FRACTION = 0.5;
212
284
  const QUERY_COVERAGE_MIN = 0.6;
213
285
  const GOAL_TAG_BOOST = 1.5;
214
- const SALIENCE_MIN_MULTIPLIER = 0.5;
215
286
  /** When the top hits are near-duplicates (same topic, different facts), surface the newest on-topic row first. */
216
287
  function evcAdaptive(query, results) {
217
288
  const slice = results.slice(0, Math.min(3, results.length));
@@ -268,7 +339,11 @@ function applyGoalBoosts(ctx, opts, state) {
268
339
  return r;
269
340
  const boosted = { ...r, score: r.score * GOAL_TAG_BOOST };
270
341
  return traced(opts, r, boosted, {
271
- stage: 'goal', multiplier: GOAL_TAG_BOOST, scoreBefore: r.score, scoreAfter: r.score * GOAL_TAG_BOOST, note: `--goal ${goalTag}`
342
+ stage: 'goal',
343
+ multiplier: GOAL_TAG_BOOST,
344
+ scoreBefore: r.score,
345
+ scoreAfter: r.score * GOAL_TAG_BOOST,
346
+ note: `--goal ${goalTag}`,
272
347
  });
273
348
  }));
274
349
  return;
@@ -279,7 +354,11 @@ function applyGoalBoosts(ctx, opts, state) {
279
354
  const goalBoostTrace = opts.why ? new Map() : undefined;
280
355
  const session = { sessionId: opts.sessionId, tenantId: ctx.tenantId };
281
356
  // The log may name global rows; the store drops those when it writes, as it does for api.recall.
282
- const boost = boostByGoals(state.results, activeGoalsWithPolicies(ctx.hippoRoot, session), { ...session, limit: opts.limit, trace: goalBoostTrace });
357
+ const boost = boostByGoals(state.results, activeGoalsWithPolicies(ctx.hippoRoot, session), {
358
+ ...session,
359
+ limit: opts.limit,
360
+ trace: goalBoostTrace,
361
+ });
283
362
  state.results = boost.results;
284
363
  state.goalRecallLog = boost.log;
285
364
  if (goalBoostTrace && goalBoostTrace.size > 0) {
@@ -297,7 +376,12 @@ function applySalience(opts, threshold, results) {
297
376
  return r;
298
377
  const mult = Math.max(SALIENCE_MIN_MULTIPLIER, count / threshold);
299
378
  const next = { ...r, score: r.score * mult };
300
- return traced(opts, r, next, { stage: 'retrieval-count-downweight', multiplier: mult, scoreBefore: r.score, scoreAfter: next.score });
379
+ return traced(opts, r, next, {
380
+ stage: 'retrieval-count-downweight',
381
+ multiplier: mult,
382
+ scoreBefore: r.score,
383
+ scoreAfter: next.score,
384
+ });
301
385
  }));
302
386
  }
303
387
  function dropUnless(state, keep) {
@@ -305,4 +389,4 @@ function dropUnless(state, keep) {
305
389
  state.results = state.results.filter(keep);
306
390
  state.droppedPreRank += before - state.results.length;
307
391
  }
308
- //# sourceMappingURL=recall-pipeline.js.map
392
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1,6 @@
1
+ import type { RecallOpts, RecallResult } from './types.js';
2
+ import { type StoreContext } from '../types.js';
3
+ /** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a
4
+ * surface that sets `recordAs`. Only the CLI core ranker writes last_retrieval_ids (contract lock). */
5
+ export declare function retrieve(ctx: StoreContext, opts: RecallOpts): Promise<RecallResult>;
6
+ //# sourceMappingURL=recall.d.ts.map
@@ -1,25 +1,25 @@
1
1
  // Read path: retrieve, the one recall entry.
2
- import { envRequireSessionScopedFreshTail } from '../util/env.js';
3
- import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
4
- import { recallScopeFilter } from '../store/search-rows.js';
5
- import { estimateTokens } from '../util/token-text.js';
6
- import { formatHandoffEvidenceLine } from '../core/handoff.js';
7
- import { boostByGoals } from '../search/goal-boost.js';
8
- import { storeFor } from '../store/sqlite/store.js';
9
- import { searchByEngine } from '../search/engine.js';
10
- import { churnStaleFactor } from '../search/boosts.js';
11
- import { compareEntryIdentity } from '../core/compare.js';
12
- import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.js';
13
- import { isSharedStore, loadConfig } from '../core/config.js';
14
- import { classifyOriginProject, projectNames } from '../core/project-identity.js';
15
- import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/planning-fallacy.js';
16
- import { detectAnchoring, hashQueryText, biasHintEnabled } from './recall-history.js';
17
- import { detectAvailabilityBias } from './availability.js';
18
- import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
19
- import { ownerOrSubject, RecallContractError } from './types.js';
20
- import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
21
- import { retrieveWithCliCore } from './recall-core.js';
22
- import { recallLead, recordShownRecall } from './recall-finish.js';
2
+ import { envRequireSessionScopedFreshTail } from '../../util/env.js';
3
+ import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../../store/rows.js';
4
+ import { recallScopeFilter } from '../../store/search-rows.js';
5
+ import { estimateTokens } from '../../util/token-text.js';
6
+ import { formatHandoffEvidenceLine } from '../../core/handoff.js';
7
+ import { boostByGoals } from '../../search/goal-boost.js';
8
+ import { searchByEngine } from '../../search/engine.js';
9
+ import { churnStaleFactor } from '../../search/boosts.js';
10
+ import { compareEntryIdentity } from '../../core/compare.js';
11
+ import { dropHeldCopies, duplicateKey, storedTextKeys } from '../../util/same-text.js';
12
+ import { isSharedStore } from '../../core/config.js';
13
+ import { configOf } from '../config-of.js';
14
+ import { classifyOriginProject, projectNames } from '../../core/project-identity.js';
15
+ import { decidePlanningFallacy, detectPlanningClaim } from '../../predictions/planning-fallacy.js';
16
+ import { detectAnchoring, hashQueryText, biasHintEnabled } from './finish.js';
17
+ import { detectAvailabilityBias } from '../availability.js';
18
+ import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../../core/recall-scope.js';
19
+ import { ownerOrSubject, RecallContractError } from '../types.js';
20
+ import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf, } from './finish.js';
21
+ import { retrieveWithCliCore } from './request.js';
22
+ import { recallLead, recordShownRecall } from './finish.js';
23
23
  const DEFAULT_RECALL_LIMIT = 10;
24
24
  function recallOrigin(opts) {
25
25
  return opts.project ? projectNames(opts.project) : undefined;
@@ -27,8 +27,8 @@ function recallOrigin(opts) {
27
27
  function inCallerProject(entry, opts) {
28
28
  return !opts.project || classifyOriginProject(entry.origin_project, opts.project) !== 'cross-project';
29
29
  }
30
- /** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a surface that sets `recordAs`.
31
- * Only the CLI core ranker writes last_retrieval_ids (contract lock). */
30
+ /** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a
31
+ * surface that sets `recordAs`. Only the CLI core ranker writes last_retrieval_ids (contract lock). */
32
32
  export async function retrieve(ctx, opts) {
33
33
  assertScopeRequestAllowed(ctx.actor, opts.scope);
34
34
  if (opts.cliCore)
@@ -38,7 +38,7 @@ export async function retrieve(ctx, opts) {
38
38
  const own = personalScopeOf(ctx.actor) ?? undefined;
39
39
  if (opts.showRanked)
40
40
  return retrieveFromStore(ctx, opts, windowSize, opts.showRanked, own);
41
- const store = storeFor(ctx);
41
+ const store = ctx.store;
42
42
  const how = opts.recordAs;
43
43
  if (!how)
44
44
  return retrieveBand(ctx, store, opts, windowSize, own);
@@ -46,7 +46,8 @@ export async function retrieve(ctx, opts) {
46
46
  await recordShownRecall(ctx, store, how, shownBand(opts, result));
47
47
  return result;
48
48
  }
49
- /** What the band ranker hands to the record: the rows it returns, and the continuity block the reply carries beside them. */
49
+ /** What the band ranker hands to the record: the rows it returns,
50
+ * and the continuity block the reply carries beside them. */
50
51
  function shownBand(opts, result) {
51
52
  return {
52
53
  query: opts.query,
@@ -56,14 +57,19 @@ function shownBand(opts, result) {
56
57
  items: result.results.length,
57
58
  tokens: result.tokens + (result.continuityTokens ?? 0),
58
59
  ledgerSessionId: opts.sessionId ?? null,
59
- written: true, // a failed audit write throws out of the band ranker, so this point is never reached without the rows
60
+ // A failed audit write throws out of the band ranker, so this point is never reached without the rows.
61
+ written: true,
60
62
  };
61
63
  }
62
64
  /** The default ranker: the SQL BM25 band, reordered by hybrid or physics search when `mode` asks. */
63
65
  async function retrieveBand(ctx, store, opts, windowSize, own) {
64
66
  let candidates = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
65
67
  if (opts.mode === 'hybrid' || opts.mode === 'physics') {
66
- const searchOpts = { budget: Infinity, scope: opts.scope ?? null, vectorCandidates: recallVectorSpec(ctx, opts, own) };
68
+ const searchOpts = {
69
+ budget: Infinity,
70
+ scope: opts.scope ?? null,
71
+ vectorCandidates: recallVectorSpec(ctx, opts, own),
72
+ };
67
73
  const ranked = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, candidates, physicsFor(ctx, opts), searchOpts);
68
74
  const rankedIds = new Set(ranked.map((r) => r.entry.id));
69
75
  candidates = [...ranked.map((r) => r.entry), ...candidates.filter((e) => !rankedIds.has(e.id))];
@@ -84,7 +90,7 @@ async function finishBandRecall(store, ctx, opts, writes, shownIds) {
84
90
  }
85
91
  /** `mode` names the engine: physics with the store's config, hybrid otherwise. */
86
92
  function physicsFor(ctx, opts) {
87
- return opts.mode === 'physics' ? loadConfig(ctx.hippoRoot).physics : null;
93
+ return opts.mode === 'physics' ? configOf(ctx).physics : null;
88
94
  }
89
95
  /** The recall load's arguments: exact scope, current rows only, the caller's project and personal scope. */
90
96
  function recallSearchArgs(ctx, opts, limit, own) {
@@ -110,40 +116,23 @@ function recallVectorSpec(ctx, opts, own) {
110
116
  }
111
117
  // Tag, pin and recency boosts can lift a row from deep in the BM25 order, so MCP ranks a wide lexical window.
112
118
  const SHOW_RANKED_LEXICAL_WINDOW = 1000;
113
- /** `retrieve` under `showRanked`: physics when `mode` says so, hybrid otherwise, over a wide lexical window plus the nearest vectors. */
119
+ /** `retrieve` under `showRanked`: physics when `mode` says so, hybrid
120
+ * otherwise, over a wide lexical window plus the nearest vectors. */
114
121
  async function retrieveFromStore(ctx, opts, windowSize, show, own) {
115
- const store = storeFor(ctx);
122
+ const store = ctx.store;
116
123
  const loaded = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, Math.max(windowSize, SHOW_RANKED_LEXICAL_WINDOW), own));
117
124
  const pool = loaded.filter((e) => passesScopeFilterForRecall(e.scope ?? null, opts.scope, own));
118
125
  // No scope option: the scope boost follows HIPPO_SCOPE and the skill env, as MCP recall always ranked.
119
126
  const searchOpts = { budget: Infinity, vectorCandidates: recallVectorSpec(ctx, opts, own) };
120
- let ranked = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, pool, physicsFor(ctx, opts), searchOpts);
121
- // One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
122
- const goals = opts.sessionId && !opts.goalTag ? await store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId }) : null;
123
- let rankedLog = [];
124
- if (goals && opts.sessionId) {
125
- const boost = boostByGoals(ranked, goals, { sessionId: opts.sessionId, tenantId: ctx.tenantId, limit: ranked.length });
126
- ranked = boost.results;
127
- rankedLog = boost.log;
128
- }
127
+ const searched = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, pool, physicsFor(ctx, opts), searchOpts);
128
+ const { ranked, goals, rankedLog } = await boostRankedByGoals(ctx, opts, searched);
129
129
  const window = ranked.slice(0, windowSize).map((r) => r.entry);
130
130
  const bandOpts = { ...opts, suppressRecallTrace: true };
131
131
  const plan = planRecall(ctx, bandOpts, window, own);
132
132
  const reads = await readRecall(store, ctx, bandOpts, plan, goals);
133
133
  const { result, writes } = composeRecall(ctx, bandOpts, { windowSize, all: window, plan, reads, auditBand: false });
134
- // Rows the vector arm added count as candidates too.
135
- const inPool = new Set(pool.map((e) => e.id));
136
- const candidates = [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
137
- const shown = show({ ranked, pool: candidates, droppedByScope: loaded.length - pool.length }, result);
138
- const scores = new Map(ranked.map((r) => [r.entry.id, r.score]));
139
- const shownRow = recallAuditRow(callerOf(ctx), 'recall', undefined, recallAuditMetadata(opts.query, shown.ids.length));
140
- const trace = opts.suppressRecallTrace ? undefined : {
141
- tenantId: ctx.tenantId,
142
- sessionId: opts.sessionId ?? null,
143
- pipeline: 'mcp',
144
- query: opts.query,
145
- results: shown.ids.map((id) => ({ memoryId: id, score: scores.get(id) ?? 0 })),
146
- };
134
+ const shown = show({ ranked, pool: withVectorCandidates(pool, ranked), droppedByScope: loaded.length - pool.length }, result);
135
+ const { shownRow, trace } = shownAuditAndTrace(ctx, opts, shown.ids, ranked);
147
136
  await finishBandRecall(store, ctx, opts, {
148
137
  goalLog: [...rankedLog, ...writes.goalLog],
149
138
  audit: [...writes.audit, shownRow, ...shown.audit],
@@ -151,6 +140,40 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
151
140
  }, shown.ids);
152
141
  return result;
153
142
  }
143
+ // One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
144
+ async function boostRankedByGoals(ctx, opts, ranked) {
145
+ const noLog = [];
146
+ const goals = opts.sessionId && !opts.goalTag
147
+ ? await ctx.store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId })
148
+ : null;
149
+ if (!goals || !opts.sessionId)
150
+ return { ranked, goals, rankedLog: noLog };
151
+ const boost = boostByGoals(ranked, goals, {
152
+ sessionId: opts.sessionId,
153
+ tenantId: ctx.tenantId,
154
+ limit: ranked.length,
155
+ });
156
+ return { ranked: boost.results, goals, rankedLog: boost.log };
157
+ }
158
+ // Rows the vector arm added count as candidates too.
159
+ function withVectorCandidates(pool, ranked) {
160
+ const inPool = new Set(pool.map((e) => e.id));
161
+ return [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
162
+ }
163
+ function shownAuditAndTrace(ctx, opts, shownIds, ranked) {
164
+ const scores = new Map(ranked.map((r) => [r.entry.id, r.score]));
165
+ const shownRow = recallAuditRow(callerOf(ctx), 'recall', undefined, recallAuditMetadata(opts.query, shownIds.length));
166
+ const trace = opts.suppressRecallTrace
167
+ ? undefined
168
+ : {
169
+ tenantId: ctx.tenantId,
170
+ sessionId: opts.sessionId ?? null,
171
+ pipeline: 'mcp',
172
+ query: opts.query,
173
+ results: shownIds.map((id) => ({ memoryId: id, score: scores.get(id) ?? 0 })),
174
+ };
175
+ return { shownRow, trace };
176
+ }
154
177
  /** Contract preflight: throws before any store-touching work. */
155
178
  function recallWindowSize(opts) {
156
179
  // Throw before loadSearchEntries, which runs initStore and migrates legacy state on first call.
@@ -193,16 +216,22 @@ async function readRecall(store, ctx, opts, plan, goals) {
193
216
  const parentIds = plan.overflow.size > 0 ? [...plan.overflow.keys()] : null;
194
217
  const continuity = opts.includeContinuity ? { key: continuityKey(ctx, opts) } : null;
195
218
  return {
196
- goals: goals !== undefined ? goals : plan.goalBoost ? await store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
219
+ goals: goals !== undefined
220
+ ? goals
221
+ : plan.goalBoost
222
+ ? await store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId })
223
+ : null,
197
224
  parents: parentIds ? await store.entriesByIds(parentIds, tenantId) : [],
198
- freshRaws: freshCount > 0 ? await store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
225
+ freshRaws: freshCount > 0
226
+ ? await store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null)
227
+ : [],
199
228
  continuity: continuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuity.key) : undefined,
200
229
  planning: plan.claim ? await store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
201
230
  };
202
231
  }
203
232
  // On a shared store the tenant's newest row is another developer's; no project keys to nothing, so the block is empty.
204
233
  function continuityKey(ctx, opts) {
205
- if (!isSharedStore(ctx.hippoRoot))
234
+ if (!(ctx.reach ? ctx.reach.shared : isSharedStore(ctx.hippoRoot)))
206
235
  return null;
207
236
  return { owner: ownerOrSubject(ctx.actor), project: opts.project ? projectNames(opts.project) : [] };
208
237
  }
@@ -213,7 +242,9 @@ function composeRecall(ctx, opts, options) {
213
242
  const rankedOut = bands.rankedOut;
214
243
  const continuity = reads.continuity ? scopeContinuity(reads.continuity, opts, plan.own) : undefined;
215
244
  // Query-derived, so MCP and CLI read this one hint instead of recomputing; HIPPO_AUTODEBIAS=off disables it.
216
- const planning = plan.claim && reads.planning ? decidePlanningFallacy(plan.claim, reads.planning, ctx.tenantId, ctx.actor.subject) : null;
245
+ const planning = plan.claim && reads.planning
246
+ ? decidePlanningFallacy(plan.claim, reads.planning, ctx.tenantId, ctx.actor.subject)
247
+ : null;
217
248
  const { anchoringHint, suppressedByInterference } = detectRecallAnchoring(opts, rankedOut[0]?.id ?? null);
218
249
  const availabilityHint = detectRecallAvailability(opts, bands.baseSlice, window.entries);
219
250
  const result = {
@@ -242,7 +273,9 @@ function composeRecall(ctx, opts, options) {
242
273
  if (availabilityHint)
243
274
  result.availabilityHint = availabilityHint;
244
275
  const who = callerOf(ctx);
245
- const audit = auditBand ? [recallAuditRow(who, 'recall', undefined, recallAuditMetadata(opts.query, rankedOut.length))] : [];
276
+ const audit = auditBand
277
+ ? [recallAuditRow(who, 'recall', undefined, recallAuditMetadata(opts.query, rankedOut.length))]
278
+ : [];
246
279
  if (planning?.audit)
247
280
  audit.push(planning.audit);
248
281
  audit.push(...anchoringRows(who, anchoringHint), ...availabilityRows(who, availabilityHint));
@@ -297,7 +330,11 @@ function rankBands(opts, plan, reads) {
297
330
  const summaryRanked = substituted.map((s) => summaryItem(s, opts));
298
331
  const freshRanked = (opts.freshTailCount ?? 0) > 0
299
332
  ? freshTailBand(opts, {
300
- recent: reads.freshRaws, baseRanked, summaryRanked, shownEntries: opts.keepHeldCopies ? [] : [...baseSlice, ...substituted.map((s) => s.entry)], own,
333
+ recent: reads.freshRaws,
334
+ baseRanked,
335
+ summaryRanked,
336
+ shownEntries: opts.keepHeldCopies ? [] : [...baseSlice, ...substituted.map((s) => s.entry)],
337
+ own,
301
338
  })
302
339
  : [];
303
340
  return {
@@ -312,7 +349,10 @@ function rankBands(opts, plan, reads) {
312
349
  // When the overflow holds 2+ children of one level-2 summary, that summary stands in for them, capped at 30% of
313
350
  // `limit`. Each one is tenant-scoped and re-checked against the scope filter; drillDown recovers the children.
314
351
  function substituteOverflow(opts, overflowByParent, parents, limit, own) {
315
- const eligibleParents = parents.filter((p) => (p.dag_level ?? 0) === 2 && !p.superseded_by && passesScopeFilterForRecall(p.scope ?? null, opts.scope, own) && inCallerProject(p, opts));
352
+ const eligibleParents = parents.filter((p) => (p.dag_level ?? 0) === 2 &&
353
+ !p.superseded_by &&
354
+ passesScopeFilterForRecall(p.scope ?? null, opts.scope, own) &&
355
+ inCallerProject(p, opts));
316
356
  const maxSub = Math.max(1, Math.ceil(limit * SUMMARY_SUB_FRACTION));
317
357
  // Most overflowed children first; compareEntryIdentity only breaks a tie, which used to fall to scan order.
318
358
  eligibleParents.sort((a, b) => {
@@ -325,7 +365,8 @@ function substituteOverflow(opts, overflowByParent, parents, limit, own) {
325
365
  childIds: (overflowByParent.get(p.id) ?? []).map((e) => e.id),
326
366
  }));
327
367
  }
328
- /** Overflowed leaf rows by summary parent, kept only for a parent with 2+ of them that is not already in the base band. */
368
+ /** Overflowed leaf rows by summary parent, kept only for a
369
+ * parent with 2+ of them that is not already in the base band. */
329
370
  function overflowGroups(window, limit) {
330
371
  // The goal boost only re-scores the base band, so its ids are known before the boost runs.
331
372
  const baseIds = new Set(window.baseSlice.map((e) => e.id));