hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
@@ -3,20 +3,20 @@
3
3
  import { evalNow } from '../core/ablation.js';
4
4
  import { oneCopyPerMemory } from './context-select.js';
5
5
  import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
6
- import { isEmbeddingAvailable } from '../store/embeddings/local.js';
6
+ import { isEmbeddingAvailable } from '../embeddings/local.js';
7
7
  import { activeGoalsWithPolicies } from '../store/goals.js';
8
8
  import { boostByGoals } from '../search/goal-boost.js';
9
9
  import { graphExpandRecall } from '../graph/recall.js';
10
10
  import { DEFAULT_GRAPH_STREAM_WEIGHT } from '../graph/stream.js';
11
11
  import { Layer } from '../core/memory.js';
12
12
  import { multihopSearch } from '../search/multihop.js';
13
- import { passesCliRecallScopeFilter } from '../store/recall-scope.js';
13
+ import { passesCliRecallScopeFilter } from '../core/recall-scope.js';
14
14
  import { currentEntries } from '../search/as-of.js';
15
15
  import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '../search/boosts.js';
16
- import { hybridSearch } from '../search/hybrid.js';
17
- import { physicsSearch } from '../search/physics-search.js';
18
- import { searchBothHybrid } from '../sharing/search-both.js';
19
- import { loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.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
20
  import { isJsonNumber } from '../util/json.js';
21
21
  import { textOverlap, tokenize as tokenizeQuery } from '../util/tokenize.js';
22
22
  /** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics state; writes and prints nothing
@@ -65,10 +65,9 @@ function loadRecallPool(ctx, opts) {
65
65
  // An explicit --scope unlocks that envelope scope; the regex-only `<source>:private:*` deny is the JS half below.
66
66
  const requested = opts.explicitScope || undefined;
67
67
  const loadSuperseded = opts.includeSuperseded || Boolean(opts.asOf);
68
- let local = loadRecallSearchEntries(ctx.hippoRoot, opts.query, undefined, ctx.tenantId, requested, 'additive', loadSuperseded);
69
- let global = ctx.globalRoot
70
- ? loadRecallSearchEntries(ctx.globalRoot, opts.query, undefined, ctx.tenantId, requested, 'additive', loadSuperseded)
71
- : [];
68
+ const load = { tenantId: ctx.tenantId, requestedScope: requested, explicitScopeMode: 'additive', includeSuperseded: loadSuperseded };
69
+ let local = loadRecallEntries(ctx.hippoRoot, opts.query, load);
70
+ let global = ctx.globalRoot ? loadRecallEntries(ctx.globalRoot, opts.query, load) : [];
72
71
  // SQL-excluded rows are pre-candidate, so the total is taken before the JS filters, which normally drop nothing.
73
72
  const total = local.length + global.length;
74
73
  const passes = (e) => passesCliRecallScopeFilter(e.scope ?? null, requested);
@@ -98,7 +97,7 @@ async function searchPool(ctx, opts, pool) {
98
97
  });
99
98
  }
100
99
  if (search.multihop) {
101
- // Unlike searchBothHybrid below, multihop ranks one pooled list, so a shared memory's two copies both compete.
100
+ // Unlike rankBothStores below, multihop ranks one pooled list, so a shared memory's two copies both compete.
102
101
  const allEntries = oneCopyPerMemory(pool.local, pool.global, evalNow()).flat();
103
102
  return multihopSearch(query, allEntries, { budget, cost, hippoRoot: ctx.hippoRoot, minResults, includeSuperseded, asOf });
104
103
  }
@@ -109,24 +108,24 @@ async function searchPool(ctx, opts, pool) {
109
108
  includeSuperseded: includeSuperseded || Boolean(asOf),
110
109
  admit: (e) => passesCliRecallScopeFilter(e.scope ?? null, requested),
111
110
  };
112
- if (search.usePhysics && !globalRoot) {
113
- // Explain leaves minResults and includeSuperseded out to hold its output steady; asOf must reach physics or later rows leak.
114
- const temporal = explain ? { asOf } : { minResults, includeSuperseded, asOf };
115
- return physicsSearch(query, pool.local, {
116
- budget, cost, hippoRoot: ctx.hippoRoot, physicsConfig: search.physicsConfig, scope, explain, vectorCandidates, ...temporal
117
- });
118
- }
119
111
  if (globalRoot) {
120
- // searchBothHybrid reloads candidates itself, so the scope rule is passed in rather than inherited from the pool.
121
- return searchBothHybrid(query, ctx.hippoRoot, globalRoot, {
112
+ // The pool already holds searchBothHybrid's additive-scope load for each store, so rank it rather than read both stores again.
113
+ return rankBothStores(query, { local: ctx.hippoRoot, global: globalRoot }, { local: pool.local, global: pool.global }, vectorCandidates, {
122
114
  budget, cost, explain, mmr, mmrLambda, localBump: search.localBump, minResults, scope, tenantId: ctx.tenantId,
123
115
  includeSuperseded, asOf,
124
- recallScope: opts.explicitScope ? { requested: opts.explicitScope, additive: true } : {},
125
116
  });
126
117
  }
127
- return hybridSearch(query, pool.local, {
128
- budget, cost, hippoRoot: ctx.hippoRoot, explain, mmr, mmrLambda, minResults, scope, includeSuperseded, asOf, vectorCandidates
129
- });
118
+ 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 });
122
+ }
123
+ /** The CLI core holds no store: it ranks on hippo.db under its root, as its loads above do. */
124
+ function hippoDbSource(hippoRoot) {
125
+ const source = vectorSourceOf({ hippoRoot });
126
+ if (!source)
127
+ throw new Error('The CLI ranking core needs a hippo root to rank on');
128
+ return source;
130
129
  }
131
130
  /** Adds memories reached by walking the entity graph out from the lexical seeds. */
132
131
  function expandGraph(ctx, opts, graph, state) {
@@ -1,6 +1,6 @@
1
1
  // The recall and context input rules in one copy, so MCP and HTTP reject the same inputs with the same messages.
2
2
  import { BadRequestError } from '../core/api-errors.js';
3
- import { MAX_ID_LEN } from '../util/http-util.js';
3
+ import { MAX_ID_LEN } from '../util/limits.js';
4
4
  import { isJsonString } from '../util/json.js';
5
5
  const MAX_RECALL_LIMIT = 1000;
6
6
  // recall() owns the shape rule for scorer_window (invalid_scorer_window); this cap bounds remote cost.
@@ -5,6 +5,7 @@ import type { PlanningFallacyHint, PlanningFallacyOutput, PlanningFallacyWatchin
5
5
  import type { AnchoringHint, RecallHistorySnapshot } from './recall-history.js';
6
6
  import type { AvailabilityHint } from './availability.js';
7
7
  import type { AppendAuditOpts } from '../store/audit.js';
8
+ import type { HippoStore } from '../store/port.js';
8
9
  import type { CallerProject } from './prompt-hook.js';
9
10
  import type { RankRecallOpts, RankRecallResult } from './recall-pipeline.js';
10
11
  import type { RecallRecording } from './recall-finish.js';
@@ -60,9 +61,10 @@ export interface RecallOpts {
60
61
  }
61
62
  interface CliCoreRanking {
62
63
  rank: Omit<RankRecallOpts, 'query' | 'sessionId' | 'goalTag'>;
63
- /** A second store searched beside `ctx.hippoRoot`. */
64
+ /** A second store searched beside `ctx.hippoRoot`; its recall rows go to `globalStore`, else hippo.db under `globalRoot`. */
64
65
  sources?: {
65
66
  globalRoot?: string;
67
+ globalStore?: HippoStore;
66
68
  };
67
69
  /** Receives each operator note when ranking reaches it. */
68
70
  note?: (line: string) => void;
@@ -1,8 +1,5 @@
1
1
  import type { RecallOpts, RecallResult } from './recall-types.js';
2
2
  import { type Context } from './types.js';
3
- /** Reads hippo.db directly, never `ctx.store`, because it is synchronous (another store would throw `SqliteBlockedError`).
4
- * It never writes `last_retrieval_ids` (contract lock: tests/api-recall-no-side-effects.test.ts). */
5
- export declare function recall(ctx: Context, opts: RecallOpts): RecallResult;
6
3
  /** 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`.
7
4
  * Only the CLI core ranker writes last_retrieval_ids (contract lock). */
8
5
  export declare function retrieve(ctx: Context, opts: RecallOpts): Promise<RecallResult>;
@@ -1,14 +1,12 @@
1
- // Read path: recall (sync) and retrieve (async, adds the vector arm).
1
+ // Read path: retrieve, the one recall entry.
2
2
  import { envRequireSessionScopedFreshTail } from '../util/env.js';
3
3
  import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
4
4
  import { recallScopeFilter } from '../store/search-rows.js';
5
5
  import { estimateTokens } from '../util/token-text.js';
6
6
  import { formatHandoffEvidenceLine } from '../core/handoff.js';
7
7
  import { boostByGoals } from '../search/goal-boost.js';
8
- import { storeFor } from '../store/index.js';
9
- import { sqliteSyncStore } from '../store/sqlite/store.js';
10
- import { hybridSearch } from '../search/hybrid.js';
11
- import { physicsSearch } from '../search/physics-search.js';
8
+ import { storeFor } from '../store/sqlite/store.js';
9
+ import { searchByEngine } from '../search/engine.js';
12
10
  import { churnStaleFactor } from '../search/boosts.js';
13
11
  import { compareEntryIdentity } from '../core/compare.js';
14
12
  import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.js';
@@ -17,26 +15,12 @@ import { classifyOriginProject, projectNames } from '../core/project-identity.js
17
15
  import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/planning-fallacy.js';
18
16
  import { detectAnchoring, hashQueryText, biasHintEnabled } from './recall-history.js';
19
17
  import { detectAvailabilityBias } from './availability.js';
20
- import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../store/recall-scope.js';
18
+ import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
21
19
  import { ownerOrSubject, RecallContractError } from './types.js';
22
20
  import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
23
21
  import { retrieveWithCliCore } from './recall-core.js';
24
22
  import { recallLead, recordShownRecall } from './recall-finish.js';
25
23
  const DEFAULT_RECALL_LIMIT = 10;
26
- /** Reads hippo.db directly, never `ctx.store`, because it is synchronous (another store would throw `SqliteBlockedError`).
27
- * It never writes `last_retrieval_ids` (contract lock: tests/api-recall-no-side-effects.test.ts). */
28
- export function recall(ctx, opts) {
29
- // A member key may not unlock a private or quarantined scope by naming it.
30
- assertScopeRequestAllowed(ctx.actor, opts.scope);
31
- const windowSize = recallWindowSize(opts);
32
- const own = personalScopeOf(ctx.actor) ?? undefined;
33
- const store = sqliteSyncStore(ctx.hippoRoot);
34
- const all = store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
35
- const plan = planRecall(ctx, opts, all, own);
36
- const { result, writes } = composeRecall(ctx, opts, { windowSize, all, plan, reads: readRecallSync(store, ctx, opts, plan) });
37
- store.finishRecall({ ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit] });
38
- return result;
39
- }
40
24
  function recallOrigin(opts) {
41
25
  return opts.project ? projectNames(opts.project) : undefined;
42
26
  }
@@ -79,23 +63,28 @@ function shownBand(opts, result) {
79
63
  async function retrieveBand(ctx, store, opts, windowSize, own) {
80
64
  let candidates = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
81
65
  if (opts.mode === 'hybrid' || opts.mode === 'physics') {
82
- const searchOpts = { budget: Infinity, hippoRoot: ctx.hippoRoot, scope: opts.scope ?? null, vectorCandidates: recallVectorSpec(ctx, opts, own), store };
83
- const ranked = await rankPool(ctx, opts, candidates, searchOpts);
66
+ const searchOpts = { budget: Infinity, scope: opts.scope ?? null, vectorCandidates: recallVectorSpec(ctx, opts, own) };
67
+ const ranked = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, candidates, physicsFor(ctx, opts), searchOpts);
84
68
  const rankedIds = new Set(ranked.map((r) => r.entry.id));
85
69
  candidates = [...ranked.map((r) => r.entry), ...candidates.filter((e) => !rankedIds.has(e.id))];
86
70
  }
87
71
  const plan = planRecall(ctx, opts, candidates, own);
88
- const { result, writes } = composeRecall(ctx, opts, { windowSize, all: candidates, plan, reads: await readRecall(store, ctx, opts, plan) });
72
+ const reads = await readRecall(store, ctx, opts, plan);
73
+ const { result, writes } = composeRecall(ctx, opts, { windowSize, all: candidates, plan, reads });
74
+ await finishBandRecall(store, ctx, opts, writes, result.results.map((r) => r.id));
75
+ return result;
76
+ }
77
+ /** The one recall write: the caller's leading audit rows go first, and the ids shown are the ones strengthened. */
78
+ async function finishBandRecall(store, ctx, opts, writes, shownIds) {
89
79
  await store.finishRecall({
90
- ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit], strengthen: strengthenOf(ctx, result.results.map((r) => r.id))
80
+ ...writes,
81
+ audit: [...(opts.leadingAudit ?? []), ...writes.audit],
82
+ strengthen: strengthenOf(ctx, shownIds),
91
83
  });
92
- return result;
93
84
  }
94
- /** The ranked pool: physics when `mode` says so, hybrid otherwise; each caller supplies its own search options. */
95
- function rankPool(ctx, opts, pool, searchOpts) {
96
- return opts.mode === 'physics'
97
- ? physicsSearch(opts.query, pool, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
98
- : hybridSearch(opts.query, pool, searchOpts);
85
+ /** `mode` names the engine: physics with the store's config, hybrid otherwise. */
86
+ function physicsFor(ctx, opts) {
87
+ return opts.mode === 'physics' ? loadConfig(ctx.hippoRoot).physics : null;
99
88
  }
100
89
  /** The recall load's arguments: exact scope, current rows only, the caller's project and personal scope. */
101
90
  function recallSearchArgs(ctx, opts, limit, own) {
@@ -127,8 +116,8 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
127
116
  const loaded = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, Math.max(windowSize, SHOW_RANKED_LEXICAL_WINDOW), own));
128
117
  const pool = loaded.filter((e) => passesScopeFilterForRecall(e.scope ?? null, opts.scope, own));
129
118
  // No scope option: the scope boost follows HIPPO_SCOPE and the skill env, as MCP recall always ranked.
130
- const searchOpts = { budget: Infinity, hippoRoot: ctx.hippoRoot, vectorCandidates: recallVectorSpec(ctx, opts, own), store };
131
- let ranked = await rankPool(ctx, opts, pool, searchOpts);
119
+ 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);
132
121
  // One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
133
122
  const goals = opts.sessionId && !opts.goalTag ? await store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId }) : null;
134
123
  let rankedLog = [];
@@ -140,27 +129,26 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
140
129
  const window = ranked.slice(0, windowSize).map((r) => r.entry);
141
130
  const bandOpts = { ...opts, suppressRecallTrace: true };
142
131
  const plan = planRecall(ctx, bandOpts, window, own);
143
- const { result, writes } = composeRecall(ctx, bandOpts, {
144
- windowSize, all: window, plan, reads: await readRecall(store, ctx, bandOpts, plan, goals), auditBand: false
145
- });
132
+ const reads = await readRecall(store, ctx, bandOpts, plan, goals);
133
+ const { result, writes } = composeRecall(ctx, bandOpts, { windowSize, all: window, plan, reads, auditBand: false });
146
134
  // Rows the vector arm added count as candidates too.
147
135
  const inPool = new Set(pool.map((e) => e.id));
148
136
  const candidates = [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
149
137
  const shown = show({ ranked, pool: candidates, droppedByScope: loaded.length - pool.length }, result);
150
138
  const scores = new Map(ranked.map((r) => [r.entry.id, r.score]));
151
139
  const shownRow = recallAuditRow(callerOf(ctx), 'recall', undefined, recallAuditMetadata(opts.query, shown.ids.length));
152
- await store.finishRecall({
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
+ };
147
+ await finishBandRecall(store, ctx, opts, {
153
148
  goalLog: [...rankedLog, ...writes.goalLog],
154
- audit: [...(opts.leadingAudit ?? []), ...writes.audit, shownRow, ...shown.audit],
155
- trace: opts.suppressRecallTrace ? undefined : {
156
- tenantId: ctx.tenantId,
157
- sessionId: opts.sessionId ?? null,
158
- pipeline: 'mcp',
159
- query: opts.query,
160
- results: shown.ids.map((id) => ({ memoryId: id, score: scores.get(id) ?? 0 })),
161
- },
162
- strengthen: strengthenOf(ctx, shown.ids),
163
- });
149
+ audit: [...writes.audit, shownRow, ...shown.audit],
150
+ trace,
151
+ }, shown.ids);
164
152
  return result;
165
153
  }
166
154
  /** Contract preflight: throws before any store-touching work. */
@@ -198,27 +186,17 @@ function planRecall(ctx, opts, all, own) {
198
186
  claim: detectPlanningClaim(opts.query),
199
187
  };
200
188
  }
201
- /** The plan's reads on the synchronous store, for the recall that cannot await the port. */
202
- function readRecallSync(store, ctx, opts, plan) {
203
- const { tenantId } = ctx;
204
- const freshCount = opts.freshTailCount ?? 0;
205
- return {
206
- goals: plan.goalBoost ? store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
207
- parents: plan.overflow.size > 0 ? store.entriesByIds([...plan.overflow.keys()], tenantId) : [],
208
- freshRaws: freshCount > 0 ? store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
209
- continuity: opts.includeContinuity ? store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuityKey(ctx, opts)) : undefined,
210
- planning: plan.claim ? store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
211
- };
212
- }
213
189
  /** The plan's reads through the store; `goals` already read by the caller skips that read. */
214
190
  async function readRecall(store, ctx, opts, plan, goals) {
215
191
  const { tenantId } = ctx;
216
192
  const freshCount = opts.freshTailCount ?? 0;
193
+ const parentIds = plan.overflow.size > 0 ? [...plan.overflow.keys()] : null;
194
+ const continuity = opts.includeContinuity ? { key: continuityKey(ctx, opts) } : null;
217
195
  return {
218
196
  goals: goals !== undefined ? goals : plan.goalBoost ? await store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
219
- parents: plan.overflow.size > 0 ? await store.entriesByIds([...plan.overflow.keys()], tenantId) : [],
197
+ parents: parentIds ? await store.entriesByIds(parentIds, tenantId) : [],
220
198
  freshRaws: freshCount > 0 ? await store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
221
- continuity: opts.includeContinuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuityKey(ctx, opts)) : undefined,
199
+ continuity: continuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuity.key) : undefined,
222
200
  planning: plan.claim ? await store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
223
201
  };
224
202
  }
@@ -461,19 +439,19 @@ function scopeContinuity(block, opts, own) {
461
439
  function continuityTokensOf(c) {
462
440
  const filteredSnapshot = c.activeSnapshot;
463
441
  const filteredHandoff = c.sessionHandoff;
464
- const tokenize = (s) => s ? estimateTokens(s) : 0;
465
- return tokenize(filteredSnapshot?.task) +
466
- tokenize(filteredSnapshot?.summary) +
467
- tokenize(filteredSnapshot?.next_step) +
468
- tokenize(filteredHandoff?.summary) +
469
- tokenize(filteredHandoff?.nextAction) +
470
- (filteredHandoff?.artifacts ?? []).reduce((acc, a) => acc + tokenize(a), 0) +
471
- (filteredHandoff?.constraints ?? []).reduce((acc, c) => acc + tokenize(c), 0) +
472
- tokenize(filteredHandoff?.evidence ? formatHandoffEvidenceLine(filteredHandoff.evidence) : null) +
473
- tokenize(filteredHandoff?.outcome) +
474
- tokenize(filteredHandoff?.targetRuntime) +
475
- tokenize(filteredHandoff?.cardId) +
476
- c.recentSessionEvents.reduce((acc, e) => acc + tokenize(e.content), 0);
442
+ const tokenCount = (s) => s ? estimateTokens(s) : 0;
443
+ return tokenCount(filteredSnapshot?.task) +
444
+ tokenCount(filteredSnapshot?.summary) +
445
+ tokenCount(filteredSnapshot?.next_step) +
446
+ tokenCount(filteredHandoff?.summary) +
447
+ tokenCount(filteredHandoff?.nextAction) +
448
+ (filteredHandoff?.artifacts ?? []).reduce((acc, a) => acc + tokenCount(a), 0) +
449
+ (filteredHandoff?.constraints ?? []).reduce((acc, c) => acc + tokenCount(c), 0) +
450
+ tokenCount(filteredHandoff?.evidence ? formatHandoffEvidenceLine(filteredHandoff.evidence) : null) +
451
+ tokenCount(filteredHandoff?.outcome) +
452
+ tokenCount(filteredHandoff?.targetRuntime) +
453
+ tokenCount(filteredHandoff?.cardId) +
454
+ c.recentSessionEvents.reduce((acc, e) => acc + tokenCount(e.content), 0);
477
455
  }
478
456
  // A pure read of the caller's recallHistory snapshot against this top-1. HIPPO_ANCHORING=off skips even the detect
479
457
  // call; CLI paths pass no history (cmdRecall computes its own hint), so the hint stays absent there.
@@ -1,4 +1,5 @@
1
1
  import type { ConfidenceLevel, Layer, MemoryEntry, MemoryKind } from '../core/memory.js';
2
+ import { type EmbedOutcome } from '../search/embed-memories.js';
2
3
  import type { HippoDbContext } from './types.js';
3
4
  /** One write by a caller in this process, every field already parsed and checked by it. */
4
5
  export interface LocalRememberInput {
@@ -23,10 +24,12 @@ export interface StartedWeak {
23
24
  readonly reason: string;
24
25
  readonly strength: number;
25
26
  }
26
- /** `stored` carries the row as the store holds it after the write; `skipped` is the gate dropping the write, with nothing stored or counted. */
27
+ /** `stored` carries the row as the store holds it after the write, and `embedding`, which settles with whether the row reached the vector index
28
+ * (a caller may ignore it; a failure is also logged). `skipped` is the gate dropping the write, with nothing stored or counted. */
27
29
  export type LocalRememberOutcome = {
28
30
  readonly status: 'stored';
29
31
  readonly entry: MemoryEntry;
32
+ readonly embedding: Promise<EmbedOutcome>;
30
33
  readonly startedWeak?: StartedWeak;
31
34
  } | {
32
35
  readonly status: 'skipped';
@@ -34,7 +37,7 @@ export type LocalRememberOutcome = {
34
37
  readonly score: number;
35
38
  };
36
39
  /** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
37
- export declare function rememberLocally(ctx: HippoDbContext, input: LocalRememberInput): LocalRememberOutcome;
40
+ export declare function rememberLocally(ctx: HippoDbContext, input: LocalRememberInput): Promise<LocalRememberOutcome>;
38
41
  /** What a caller asks of fact extraction. The key comes from the caller, which read it from its own environment. */
39
42
  export interface FactExtractionRequest {
40
43
  /** The caller asked for extraction (`--extract`); the store's config can turn it on without that. */
@@ -4,10 +4,10 @@
4
4
  import { loadConfig } from '../core/config.js';
5
5
  import { computeSalience } from '../core/salience.js';
6
6
  import { loadNewestEntries, schemaFitInStore } from '../store/candidates.js';
7
- import { embedMemory } from '../store/embeddings/index.js';
7
+ import { embedMemory } from '../search/embed-memories.js';
8
8
  import { loadAllEntries, readEntry } from '../store/entry-reads.js';
9
9
  import { updateStats } from '../store/index-and-stats.js';
10
- import { errorMessage } from '../util/log.js';
10
+ import { errorMessage, log } from '../util/log.js';
11
11
  import { remember } from './remember.js';
12
12
  const WEAK_HALF_LIFE_FACTOR = 0.5;
13
13
  /** The gate's verdict on one write, or null where it does not judge: the store has it off, or the write is pinned or forced. */
@@ -34,14 +34,23 @@ function storedEntry(ctx, id) {
34
34
  throw new Error(`memory ${id} was written but cannot be read back`);
35
35
  return entry;
36
36
  }
37
+ /** Best-effort and slow (a model load or a network call), so the caller is not held for it; a row left out of the index is logged. */
38
+ function indexInBackground(hippoRoot, entry) {
39
+ return embedMemory(hippoRoot, entry).then((outcome) => {
40
+ if (outcome === 'failed') {
41
+ log.warn(`memory ${entry.id} is stored but not in the vector index, so recall by meaning will miss it; run 'hippo embed' to index it`);
42
+ }
43
+ return outcome;
44
+ });
45
+ }
37
46
  /** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
38
- export function rememberLocally(ctx, input) {
47
+ export async function rememberLocally(ctx, input) {
39
48
  const schemaFit = schemaFitInStore(ctx.hippoRoot, ctx.tenantId, input.content, input.fitTags ?? input.tags);
40
49
  const verdict = salienceVerdict(ctx, input);
41
50
  if (verdict?.decision === 'skip')
42
51
  return { status: 'skipped', reason: verdict.reason, score: verdict.score };
43
52
  const startedWeak = verdict?.decision === 'start_weak' ? { reason: verdict.reason, strength: verdict.score } : undefined;
44
- const { id } = remember(ctx, {
53
+ const { id } = await remember(ctx, {
45
54
  content: input.content,
46
55
  kind: input.kind,
47
56
  scope: input.scope,
@@ -59,9 +68,8 @@ export function rememberLocally(ctx, input) {
59
68
  });
60
69
  const entry = storedEntry(ctx, id);
61
70
  updateStats(ctx.hippoRoot, { remembered: 1 });
62
- // Best-effort and slow (a model load or a network call), so the caller is not held for it.
63
- void embedMemory(ctx.hippoRoot, entry);
64
- return startedWeak ? { status: 'stored', entry, startedWeak } : { status: 'stored', entry };
71
+ const embedding = indexInBackground(ctx.hippoRoot, entry);
72
+ return startedWeak ? { status: 'stored', entry, embedding, startedWeak } : { status: 'stored', entry, embedding };
65
73
  }
66
74
  /** Extracts facts from a row just stored and stores them beside it. Best-effort: a failure is named in the result, never thrown. */
67
75
  export async function extractRememberedFacts(ctx, entry, request) {
@@ -1,6 +1,6 @@
1
1
  import type { ConnectorEvent } from '../store/port.js';
2
2
  import { type ConfidenceLevel, type Layer, type MemoryKind, type TraceOutcome } from '../core/memory.js';
3
- import type { Context, StoreReply } from './types.js';
3
+ import type { Context } from './types.js';
4
4
  /** Row fields the caller's own process decides, as the CLI does from its flags and its salience gate. */
5
5
  export interface RememberLocal {
6
6
  layer?: Layer;
@@ -23,7 +23,8 @@ export interface RememberOpts {
23
23
  owner?: string;
24
24
  artifactRef?: string;
25
25
  tags?: string[];
26
- /** The connector event this write answers. The store logs it in the memory's own transaction; an event logged before stores nothing and answers `duplicate`. */
26
+ /** The connector event this write answers. The store logs it in the memory's own transaction; an event logged before stores nothing and
27
+ * answers `duplicate`. */
27
28
  event?: ConnectorEvent;
28
29
  /** Connector-ingested content an agent doesn't control; gates detectInstruction. CLI/HTTP/MCP never set this. */
29
30
  untrusted?: boolean;
@@ -41,6 +42,9 @@ export interface RememberResult {
41
42
  id: string;
42
43
  kind: MemoryKind;
43
44
  tenantId: string;
45
+ /** The row as written, so a caller can show it without reading it back. */
46
+ halfLifeDays: number;
47
+ tags: string[];
44
48
  /** Set only when untrusted content was flagged and quarantined instead of stored under its requested scope. */
45
49
  quarantined?: {
46
50
  reason: string;
@@ -54,5 +58,5 @@ export interface RememberResult {
54
58
  }
55
59
  /** Store one memory: the store's entryWrites group writes the row and its one remember audit row, under the caller's subject.
56
60
  * A write that carries a connector event or untrusted content goes through connectorWrites, which commits its companion rows with it. */
57
- export declare function remember<C extends Context>(ctx: C, opts: RememberOpts): StoreReply<C, RememberResult>;
61
+ export declare function remember(ctx: Context, opts: RememberOpts): Promise<RememberResult>;
58
62
  //# sourceMappingURL=remember.d.ts.map
@@ -7,8 +7,9 @@ import { loadConfig } from '../core/config.js';
7
7
  import { vetSecrets } from '../util/secret-detect.js';
8
8
  import { assertCallerProject } from '../core/project-identity.js';
9
9
  import { BadRequestError } from '../core/api-errors.js';
10
- import { assertClientScope, personalScopeOf } from '../store/recall-scope.js';
11
- import { andThen, notPorted, onStore } from './on-store.js';
10
+ import { assertClientScope, personalScopeOf } from '../core/recall-scope.js';
11
+ import { requireGroup } from '../store/index.js';
12
+ import { storeFor } from '../store/sqlite/store.js';
12
13
  /** The scope a write lands in: the caller's own personal scope when asked for, else the client's, which may not be a personal one. */
13
14
  function rememberScope(ctx, opts) {
14
15
  if (!opts.personal) {
@@ -21,7 +22,8 @@ function rememberScope(ctx, opts) {
21
22
  throw new BadRequestError('send personal or scope, not both');
22
23
  const own = personalScopeOf(ctx.actor);
23
24
  if (own === null) {
24
- throw new BadRequestError('personal memories need a key its owner minted, or a sign-in; owner ids over 239 characters or with control characters cannot hold them');
25
+ throw new BadRequestError('personal memories need a key its owner minted, or a sign-in; owner ids over 239 characters or with control characters cannot ' +
26
+ 'hold them');
25
27
  }
26
28
  return own;
27
29
  }
@@ -59,7 +61,7 @@ function weakened(entry, weaken) {
59
61
  }
60
62
  function rememberResult(ctx, prepared, written) {
61
63
  const { entry, detection, warnings } = prepared;
62
- const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId };
64
+ const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId, halfLifeDays: entry.half_life_days, tags: [...entry.tags] };
63
65
  if (detection.flagged)
64
66
  result.quarantined = { reason: detection.reason ?? 'unknown' };
65
67
  if (warnings.length > 0)
@@ -74,17 +76,18 @@ function quarantineOf({ requestedScope, detection }) {
74
76
  }
75
77
  /** Store one memory: the store's entryWrites group writes the row and its one remember audit row, under the caller's subject.
76
78
  * A write that carries a connector event or untrusted content goes through connectorWrites, which commits its companion rows with it. */
77
- export function remember(ctx, opts) {
78
- return onStore(ctx, (port) => {
79
- const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
80
- const prepared = prepareRemember(ctx, opts);
81
- // A store writes origin_project as given, so the served folder's fallback is stamped here.
82
- const write = { entry: stampOriginProject(ctx.hippoRoot, prepared.entry), actor: ctx.actor.subject };
83
- if (opts.untrusted !== true && opts.event === undefined)
84
- return andThen(entryWrites.writeEntry(write), () => rememberResult(ctx, prepared));
85
- const connectorWrites = port.connectorWrites ?? notPorted(port, 'connectorWrites');
86
- const written = connectorWrites.writeConnectorEntry({ ...write, event: opts.event, quarantine: quarantineOf(prepared) });
87
- return andThen(written, (outcome) => rememberResult(ctx, prepared, outcome));
88
- });
79
+ export async function remember(ctx, opts) {
80
+ const store = storeFor(ctx);
81
+ const entryWrites = requireGroup(store, 'entryWrites');
82
+ const prepared = prepareRemember(ctx, opts);
83
+ // A store writes origin_project as given, so the served folder's fallback is stamped here.
84
+ const write = { entry: stampOriginProject(ctx.hippoRoot, prepared.entry), actor: ctx.actor.subject };
85
+ if (opts.untrusted !== true && opts.event === undefined) {
86
+ await entryWrites.writeEntry(write);
87
+ return rememberResult(ctx, prepared);
88
+ }
89
+ const connectorWrites = requireGroup(store, 'connectorWrites');
90
+ const written = await connectorWrites.writeConnectorEntry({ ...write, event: opts.event, quarantine: quarantineOf(prepared) });
91
+ return rememberResult(ctx, prepared, written);
89
92
  }
90
93
  //# sourceMappingURL=remember.js.map
@@ -0,0 +1,46 @@
1
+ import type { HandoffEvidence } from '../core/handoff.js';
2
+ import type { TaskSnapshot } from '../store/rows.js';
3
+ import type { Context } from './types.js';
4
+ /** What closing one ended session needs from the host; the two readers run only when the handoff is written. */
5
+ export interface SessionClose {
6
+ sessionId: string | null;
7
+ /** A reply's end, not the session's: the handoff is updated in place and the snapshot stays for the next compaction. */
8
+ turn: boolean;
9
+ /** The transcript's working state, or null with no readable transcript. */
10
+ workingState: () => Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null;
11
+ evidence: () => HandoffEvidence;
12
+ /** One line to the session-end log. */
13
+ log: (line: string) => void;
14
+ }
15
+ /** Writes the session's handoff, then closes its snapshot unless `turn`; each step logs its own failure and never throws.
16
+ * The handoff goes first, while the snapshot writeSessionEndHandoff reads is still active. */
17
+ export declare function closeEndedSession(ctx: Context, close: SessionClose): void;
18
+ /** Books the ending session's re-reads in each store its ledger rows can land in (`ctx.hippoRoot` and global); returns the log lines. */
19
+ export declare function bookSessionRereads(ctx: Context, transcriptPath: string | undefined, sessionId: string | null): Promise<string[]>;
20
+ /** The block a compaction lost: the fresh task snapshot and its session trail, or null with none or another session's snapshot. */
21
+ export declare function compactResumeBlock(ctx: Context, payloadSessionId: string | null): string | null;
22
+ /** What one session-end run needs from its host; the host owns sleep, transcript reading and capture, this module owns the order. */
23
+ export interface SessionEndWork<Scan> {
24
+ mode: 'turn' | 'full';
25
+ hippoRoot: string;
26
+ tenantId: string;
27
+ sessionId: string | null;
28
+ transcriptPath: string | undefined;
29
+ /** Builds the call context for one store root. */
30
+ contextFor: (root: string) => Context;
31
+ /** The store the run captures into: the project store, else global. */
32
+ storeRoot: () => string;
33
+ /** One line to the session-end log; `startFresh` restarts the file. */
34
+ log: (line: string, opts?: {
35
+ startFresh?: boolean;
36
+ }) => void;
37
+ sleep: () => Promise<void>;
38
+ readScan: (log: (line: string) => void) => Scan | null;
39
+ capture: (store: string, scan: Scan | null) => void;
40
+ digest: (scan: Scan | null, log: (line: string) => void) => void;
41
+ workingState: (log: (line: string) => void) => ReturnType<SessionClose['workingState']>;
42
+ evidence: () => HandoffEvidence;
43
+ }
44
+ /** Books re-reads, sleeps, captures, digests and closes one ended session, in that order. */
45
+ export declare function sessionEndWork<Scan>(w: SessionEndWork<Scan>): Promise<void>;
46
+ //# sourceMappingURL=session-end.d.ts.map