hippo-memory 1.70.0 → 1.72.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 (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -1,77 +1,18 @@
1
- import { closeHippoDb, withWriteScope } from '../db/index.js';
1
+ import { withWriteScope } from '../db/index.js';
2
2
  import { assertTenantId } from './tenant.js';
3
3
  import { findRejectedValue, rejectionDigest } from './rejection.js';
4
4
  import { log } from '../util/log.js';
5
5
  import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
6
6
  import { audit } from './audit-event.js';
7
7
  import { syncFtsRow } from './entry-row.js';
8
- import { openStore } from './open.js';
8
+ import { onHandle, openStore } from './open.js';
9
9
  import { DIGEST_DISPLAY_CHARS } from '../util/token-text.js';
10
- // ---------------------------------------------------------------------------
11
- // Dirty-flag helpers for DAG summaries: child writes mark a summary dirty, and the
12
- // sleep-cycle rebuild enumerates candidates without scanning every memory row.
13
- // ---------------------------------------------------------------------------
14
- /**
15
- * Mark a summary as dirty. Idempotent (re-marking dirty is a no-op + no
16
- * second audit row). Tenant-scoped to prevent cross-tenant writes via
17
- * parent-lookup. Called from invalidation.ts / writeEntry /
18
- * forgetMemory / archiveRawMemory whenever a child is invalidated,
19
- * superseded, forgotten, or archived.
20
- *
21
- * Quietly no-ops if the target row doesn't exist or isn't a level-2/3
22
- * summary. Emits a 'summary_marked_dirty' audit row on actual
23
- * state transitions (0 -> 1) via the audit() helper, which try/catches
24
- * for missing audit_log (the v27 self-heal scenario).
25
- */
26
- export function markSummaryDirty(hippoRoot, summaryId, tenantId, actor = 'cli') {
27
- assertTenantId('markSummaryDirty', tenantId);
28
- const db = openStore(hippoRoot);
29
- try {
30
- // RETURNING dag_level reads the actual level in the same round trip.
31
- // SAFETY: result's shape matches the single `dag_level` column returned
32
- // above.
33
- const result = db.prepare(`
34
- UPDATE memories
35
- SET summary_dirty = 1
36
- WHERE id = ?
37
- AND tenant_id = ?
38
- AND dag_level IN (2, 3)
39
- AND summary_dirty = 0
40
- AND kind != 'archived'
41
- RETURNING dag_level
42
- `).get(summaryId, tenantId);
43
- if (result) {
44
- // audit() wraps appendAuditEvent in try/catch (v27 heal scenario).
45
- // metadata.source tells this dirty-mark apart from the other wiring layers' marks.
46
- audit(db, 'summary_marked_dirty', { targetId: summaryId, metadata: { dag_level: result.dag_level, source: 'E1' }, actor, tenantId });
47
- }
48
- }
49
- finally {
50
- closeHippoDb(db);
51
- }
52
- }
53
- // ---------------------------------------------------------------------------
54
- // Sleep-cycle rebuild surface.
55
- //
56
- // loadAllDirtySummaries / loadChildrenOfSummary / applyRebuildResult /
57
- // clearSummaryDirtyAfterBuild live HERE (not in dag.ts) because they need
58
- // module-private MEMORY_SELECT_COLUMNS, MemoryRow, rowToEntry, audit,
59
- // syncFtsRow, assertTenantId. dag.ts owns only the thin orchestrator
60
- // rebuildDirtySummaries() that calls into these.
61
- // ---------------------------------------------------------------------------
62
- /**
63
- * Host-wide loader for L2 topic summaries without an L3 parent.
64
- * Used by consolidate phase 1.9 (buildEntityProfiles) to cluster L2s into
65
- * L3 entity profiles. Mirrors loadAllDirtySummaries: SQL-level
66
- * filter is cheaper than reusing in-memory `survivors` (which doesn't
67
- * contain L2s freshly created by phase 1.7 buildDag).
68
- *
69
- * Returns entries with tenantId attached so per-cluster writes stay
70
- * tenant-scoped via summary.tenantId.
71
- */
10
+ // Sleep-cycle rebuild surface: lives here, not in src/consolidate/dag.ts, because it needs module-private MEMORY_SELECT_COLUMNS, MemoryRow, rowToEntry,
11
+ // audit, syncFtsRow and assertTenantId. dag.ts keeps only the thin orchestrator rebuildDirtySummaries().
12
+ /** Host-wide loader for L2 topic summaries without an L3 parent, for consolidate phase 1.9 (buildEntityProfiles); SQL-level filter, since in-memory
13
+ * `survivors` lacks L2s created by phase 1.7. Entries carry tenantId so per-cluster writes stay tenant-scoped. */
72
14
  export function loadAllL2Summaries(hippoRoot) {
73
- const db = openStore(hippoRoot);
74
- try {
15
+ return onHandle(hippoRoot, (db) => {
75
16
  // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
76
17
  // MemoryRow's field set.
77
18
  const rows = db.prepare(`
@@ -84,23 +25,12 @@ export function loadAllL2Summaries(hippoRoot) {
84
25
  ORDER BY created ASC, id ASC
85
26
  `).all();
86
27
  return rows.map(rowToEntry);
87
- }
88
- finally {
89
- closeHippoDb(db);
90
- }
28
+ }, openStore);
91
29
  }
92
- /**
93
- * Dirty summaries, newest change first. Iterates all tenants
94
- * in one query so consolidate.ts (host-wide per L106-109) does not need a
95
- * per-tenant loop. Each returned MemoryEntry carries its own tenantId (via
96
- * rowToEntry), so per-summary children + rebuild UPDATE stay tenant-scoped.
97
- *
98
- * Sort: latest_at DESC NULLS LAST, id ASC — same as per-tenant variant so
99
- * HIPPO_DAG_REBUILD_CAP takes most-recently-changed summaries first.
100
- */
101
- export function loadAllDirtySummaries(hippoRoot) {
102
- const db = openStore(hippoRoot);
103
- try {
30
+ /** Dirty summaries across all tenants, newest change first (latest_at DESC NULLS LAST, id ASC), at most `limit` (all when omitted)
31
+ * so HIPPO_DAG_REBUILD_CAP reads only the most recently changed. Each entry carries its tenantId so later writes stay tenant-scoped. */
32
+ export function loadAllDirtySummaries(hippoRoot, limit) {
33
+ return onHandle(hippoRoot, (db) => {
104
34
  // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
105
35
  // MemoryRow's field set.
106
36
  const rows = db.prepare(`
@@ -109,24 +39,15 @@ export function loadAllDirtySummaries(hippoRoot) {
109
39
  WHERE summary_dirty = 1
110
40
  AND kind != 'archived'
111
41
  ORDER BY latest_at DESC NULLS LAST, id ASC
112
- `).all();
42
+ LIMIT ?
43
+ `).all(limit ?? -1);
113
44
  return rows.map(rowToEntry);
114
- }
115
- finally {
116
- closeHippoDb(db);
117
- }
45
+ }, openStore);
118
46
  }
119
- /**
120
- * Load live children of a DAG summary. Used by
121
- * rebuildDirtySummaries to regenerate content from the CURRENT child set
122
- * (not the children at create-time). Skips archived. Tenant-scoped
123
- * (defence in depth — dag_parent_id is unique-ish but tenant guard is
124
- * cheap). created column is TEXT NOT NULL since db.ts schema v1.
125
- */
47
+ /** Live (non-archived) children of a DAG summary, so a rebuild regenerates from the CURRENT child set; tenant-scoped as defence in depth. */
126
48
  export function loadChildrenOfSummary(hippoRoot, summaryId, tenantId) {
127
49
  assertTenantId('loadChildrenOfSummary', tenantId);
128
- const db = openStore(hippoRoot);
129
- try {
50
+ return onHandle(hippoRoot, (db) => {
130
51
  // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
131
52
  // MemoryRow's field set.
132
53
  const rows = db.prepare(`
@@ -139,32 +60,15 @@ export function loadChildrenOfSummary(hippoRoot, summaryId, tenantId) {
139
60
  ORDER BY created ASC
140
61
  `).all(summaryId, tenantId);
141
62
  return rows.map(rowToEntry);
142
- }
143
- finally {
144
- closeHippoDb(db);
145
- }
63
+ }, openStore);
146
64
  }
147
- /**
148
- * Apply a rebuild result to a dirty summary. Atomic: one
149
- * prepared UPDATE statement plus syncFtsRow inside one write scope.
150
- * WHERE includes `AND summary_dirty = 1` so concurrent sleep's race-loser
151
- * becomes a no-op (no rebuild_count bump, no audit row).
152
- *
153
- * Returns `{ changed, refused }`. `changed` is true when this call's UPDATE
154
- * (content or metadata-only) affected a row; false on race-loss / unknown id
155
- * / archived / wrong dag_level. `refused` is true only when a tombstone hit
156
- * suppressed the content write AND the metadata UPDATE still landed — see
157
- * the return-semantics comment below for the full contract.
158
- */
65
+ /** Apply a rebuild result to a dirty summary in one write scope (UPDATE plus syncFtsRow); `AND summary_dirty = 1` makes a concurrent race-loser a no-op.
66
+ * Returns `{ changed, refused }`: `refused` only when a tombstone hit suppressed the content write while the metadata UPDATE still landed. */
159
67
  export function applyRebuildResult(hippoRoot, summary, patch) {
160
68
  assertTenantId('applyRebuildResult', summary.tenantId);
161
- const db = openStore(hippoRoot);
162
- try {
69
+ return onHandle(hippoRoot, (db) => {
163
70
  return withWriteScope(db, 'rebuild_summary', () => applyRebuildInSavepoint(db, summary, patch));
164
- }
165
- finally {
166
- closeHippoDb(db);
167
- }
71
+ }, openStore);
168
72
  }
169
73
  // ONE prepared UPDATE per branch. Test #8 inspects the SQL string.
170
74
  const REBUILD_CONTENT_SQL = `UPDATE memories
@@ -197,13 +101,8 @@ function applyRebuildInSavepoint(db, summary, patch) {
197
101
  const tombstone = patch.bumpRebuildCount
198
102
  ? findRejectedValue(db, summary.tenantId, rejectionDigest(patch.content))
199
103
  : null;
200
- // On a hit: do NOT write the new content. Fall through to the SAME
201
- // metadata-only behavior the zero-child branch already has —
202
- // descendant_count/earliest_at/latest_at update + summary_dirty
203
- // cleared, no content write, no rebuild_count bump. Clearing dirty
204
- // (rather than leaving it set) is deliberate: leaving it dirty would
205
- // make every following sleep cycle re-attempt and re-refuse the
206
- // identical rebuild forever (the DAG-loop this fix closes).
104
+ // On a tombstone hit, write no content: take the zero-child metadata-only path (descendant_count/earliest_at/latest_at, summary_dirty cleared, no
105
+ // rebuild_count bump). Clearing dirty is deliberate: leaving it set would make every later sleep re-attempt and re-refuse the same rebuild forever.
207
106
  const applyContentWrite = patch.bumpRebuildCount && !tombstone;
208
107
  const result = applyContentWrite
209
108
  ? db.prepare(REBUILD_CONTENT_SQL).run(patch.content, patch.descendant_count, patch.earliest_at, patch.latest_at, nowIso, summary.id, summary.tenantId)
@@ -220,14 +119,14 @@ function applyRebuildInSavepoint(db, summary, patch) {
220
119
  }
221
120
  /** Audit and log a rebuild whose content matched a rejected value; metadata still landed. */
222
121
  function auditRefusedRebuild(db, summary, patch, tombstone) {
223
- // refused === true here (same condition, narrowed for the tombstone.*
224
- // access below). Best-effort refusal audit, written INLINE inside
225
- // this still-open SAVEPOINT — nothing here rolls back on a refusal
226
- // (the metadata UPDATE above already committed to this savepoint), so the
227
- // post-rollback auditRejectionRefusal helper (writeEntry/supersede's
228
- // tool) is the wrong one here; a direct audit() call is correct and
229
- // commits with the rest of this savepoint.
230
- audit(db, 'reject_refusal', { targetId: summary.id, metadata: { digest: tombstone.digest, reason: tombstone.reason }, actor: patch.actor, tenantId: summary.tenantId });
122
+ // refused === true here (narrowed for the tombstone.* access). Best-effort refusal audit written INLINE in this still-open SAVEPOINT (the metadata
123
+ // UPDATE already committed to it), so a direct audit() call is correct, not the post-rollback auditRejectionRefusal.
124
+ audit(db, 'reject_refusal', {
125
+ targetId: summary.id,
126
+ metadata: { digest: tombstone.digest, reason: tombstone.reason },
127
+ actor: patch.actor,
128
+ tenantId: summary.tenantId
129
+ });
231
130
  log.warn(`applyRebuildResult: refused rebuild content for ${summary.id} — matches a rejected value ` +
232
131
  `(digest ${tombstone.digest.slice(0, DIGEST_DISPLAY_CHARS)}...); metadata updated, content unchanged`);
233
132
  }
@@ -255,20 +154,13 @@ function syncRebuiltSummary(db, summary, patch, applyContentWrite, nowIso) {
255
154
  descendant_count: patch.descendant_count,
256
155
  }, actor: patch.actor, tenantId: summary.tenantId });
257
156
  }
258
- /**
259
- * Clear summary_dirty on a freshly-built summary. Called by buildDag right after the child-link loop:
260
- * each member's writeEntry marks the new parent dirty, so the same cycle's rebuild would redo every new summary.
261
- *
262
- * Idempotent: no-op + no audit if summary isn't dirty. Audit
263
- * source='buildDag-clean' distinguishes it from the rebuild's source.
264
- */
157
+ /** Clear summary_dirty on a new summary after buildDag's child-link loop (each member's writeEntry marks the parent dirty, so the same cycle would rebuild it).
158
+ * Idempotent (no-op, no audit if not dirty); audit source='buildDag-clean' distinguishes it from the rebuild's. */
265
159
  export function clearSummaryDirtyAfterBuild(hippoRoot, summaryId, tenantId, actor = 'cli', source = 'buildDag-clean') {
266
160
  assertTenantId('clearSummaryDirtyAfterBuild', tenantId);
267
- const db = openStore(hippoRoot);
268
- try {
161
+ onHandle(hippoRoot, (db) => {
269
162
  // RETURNING dag_level reads the actual level so audit metadata stays accurate without an extra SELECT.
270
- // SAFETY: result's shape matches the single `dag_level` column returned
271
- // below.
163
+ // SAFETY: result's shape matches the single `dag_level` column returned below.
272
164
  const result = db.prepare(`
273
165
  UPDATE memories
274
166
  SET summary_dirty = 0
@@ -283,9 +175,6 @@ export function clearSummaryDirtyAfterBuild(hippoRoot, summaryId, tenantId, acto
283
175
  // source tells buildDag-clean (L2) from buildEntityProfiles-clean (L3) and any future build path.
284
176
  audit(db, 'summary_marked_clean', { targetId: summaryId, metadata: { dag_level: result.dag_level, source }, actor, tenantId });
285
177
  }
286
- }
287
- finally {
288
- closeHippoDb(db);
289
- }
178
+ }, openStore);
290
179
  }
291
180
  //# sourceMappingURL=summaries.js.map
@@ -1,4 +1,4 @@
1
- // Leaf module so store.ts and raw-archive.ts can both mark a parent summary dirty without importing each other.
1
+ // Leaf module so entry-writes.ts and raw-archive.ts can both mark a parent summary dirty without importing each other.
2
2
  import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
3
3
  /** Runs in the caller's transaction so the mark commits or rolls back with the child change; only a 0 to 1 flip is audited. */
4
4
  export function markSummaryDirtyInTx(db, summaryId, tenantId, actor) {
@@ -1,4 +1,4 @@
1
- import type { DatabaseSyncLike } from '../db/index.js';
1
+ import { type DatabaseSyncLike } from '../db/index.js';
2
2
  /** The api_keys fields a tenant, revocation, rank or self-service ownership check reads. */
3
3
  export interface ApiKeyOwner {
4
4
  tenantId: string;
@@ -13,4 +13,9 @@ export declare function selectMemoryReach(db: DatabaseSyncLike, id: string): {
13
13
  tenantId: string;
14
14
  scope: string | null;
15
15
  } | undefined;
16
+ /** `selectMemoryReach` for the store under `hippoRoot`, with no mirror setup and no full row read. */
17
+ export declare function memoryReach(hippoRoot: string, id: string): {
18
+ tenantId: string;
19
+ scope: string | null;
20
+ } | undefined;
16
21
  //# sourceMappingURL=tenant-lookup.d.ts.map
@@ -1,4 +1,5 @@
1
1
  // Owner lookups by id: the tenant and scope checks in src/api and the CLI's key-tenant lookup share these queries.
2
+ import { onHandle } from './open.js';
2
3
  /** The owner row of `keyId`, or undefined when no such key exists. */
3
4
  export function selectApiKeyOwner(db, keyId) {
4
5
  // SAFETY: row's shape matches the four columns named in the SELECT.
@@ -13,4 +14,10 @@ export function selectMemoryReach(db, id) {
13
14
  const row = db.prepare(`SELECT tenant_id, scope FROM memories WHERE id = ?`).get(id);
14
15
  return row && { tenantId: row.tenant_id, scope: row.scope };
15
16
  }
17
+ /** `selectMemoryReach` for the store under `hippoRoot`, with no mirror setup and no full row read. */
18
+ export function memoryReach(hippoRoot, id) {
19
+ return onHandle(hippoRoot, (db) => {
20
+ return selectMemoryReach(db, id);
21
+ });
22
+ }
16
23
  //# sourceMappingURL=tenant-lookup.js.map
@@ -5,21 +5,7 @@ export interface ResolveOpts {
5
5
  apiKey?: string;
6
6
  }
7
7
  export declare function resolveTenantId(opts: ResolveOpts): string;
8
- /**
9
- * Defensive runtime guard for tenant id arguments.
10
- *
11
- * The continuity helpers (saveActiveTaskSnapshot, listSessionEvents, etc.)
12
- * gained a required `tenantId` parameter (schema v22) to close a
13
- * cross-tenant data leak. TypeScript catches misbinding at compile time, but
14
- * JavaScript callers from older versions can silently pass a `sessionId`
15
- * where `tenantId` is now expected, e.g.
16
- * loadLatestHandoff(root, 'sess-abc') // WRONG: 'sess-abc' becomes the tenant
17
- * which would silently filter to a non-existent tenant and return null with
18
- * no error. This guard rejects the most common shape of that mistake (any
19
- * value beginning with the conventional `sess-` / `sess_` session prefix).
20
- *
21
- * False-positive cost: a tenant literally named `sess-...` will be rejected.
22
- * Acceptable tradeoff for catching the silent-leak class.
23
- */
8
+ /** Runtime guard for tenant id args: an older JS caller can pass a `sessionId` as the tenant (`loadLatestHandoff(root, 'sess-abc')`) and silently get null.
9
+ * Rejects values starting `sess-` / `sess_`; a tenant literally named `sess-...` is refused, an accepted tradeoff. */
24
10
  export declare function assertTenantId(fnName: string, value: JsonValue): asserts value is string;
25
11
  //# sourceMappingURL=tenant.d.ts.map
@@ -9,27 +9,12 @@ export function resolveTenantId(opts) {
9
9
  throw new Error('invalid api key');
10
10
  return ctx.tenantId;
11
11
  }
12
- // L1: empty / whitespace-only HIPPO_TENANT must fall through to 'default'.
13
- // `??` only catches undefined, so HIPPO_TENANT="" leaked through as the
14
- // literal empty string and broke every downstream tenant filter.
12
+ // Empty/whitespace-only HIPPO_TENANT must fall through to 'default': `??` only catches undefined, so '' leaked through and broke every downstream tenant
13
+ // filter.
15
14
  return envTenant();
16
15
  }
17
- /**
18
- * Defensive runtime guard for tenant id arguments.
19
- *
20
- * The continuity helpers (saveActiveTaskSnapshot, listSessionEvents, etc.)
21
- * gained a required `tenantId` parameter (schema v22) to close a
22
- * cross-tenant data leak. TypeScript catches misbinding at compile time, but
23
- * JavaScript callers from older versions can silently pass a `sessionId`
24
- * where `tenantId` is now expected, e.g.
25
- * loadLatestHandoff(root, 'sess-abc') // WRONG: 'sess-abc' becomes the tenant
26
- * which would silently filter to a non-existent tenant and return null with
27
- * no error. This guard rejects the most common shape of that mistake (any
28
- * value beginning with the conventional `sess-` / `sess_` session prefix).
29
- *
30
- * False-positive cost: a tenant literally named `sess-...` will be rejected.
31
- * Acceptable tradeoff for catching the silent-leak class.
32
- */
16
+ /** Runtime guard for tenant id args: an older JS caller can pass a `sessionId` as the tenant (`loadLatestHandoff(root, 'sess-abc')`) and silently get null.
17
+ * Rejects values starting `sess-` / `sess_`; a tenant literally named `sess-...` is refused, an accepted tradeoff. */
33
18
  export function assertTenantId(fnName, value) {
34
19
  if (typeof value !== 'string' || value.length === 0) {
35
20
  throw new Error(`${fnName}: tenantId is required (got ${typeof value})`);
@@ -1,27 +1,13 @@
1
1
  import { type DatabaseSyncLike } from '../db/index.js';
2
- /**
3
- * Where a block of memory text was sent.
4
- * - `hook`: the per-prompt `UserPromptSubmit` hook (`hippo context --pinned-only`).
5
- * - `hook_recall`: the same hook's prompt-recall section.
6
- * - `compact_resume`: the snapshot the SessionStart(compact) hook prints (`hippo compact-resume`).
7
- * - `context`, `recall`: the CLI commands.
8
- * - `mcp_recall`, `mcp_context`: the MCP tools.
9
- * - `http_recall`, `http_context`, `http_assemble`: the HTTP API.
10
- * - `pilot`: the session's pilot arm row (src/api/pilot-arm.ts); not a send, so it is in no surface list.
11
- */
2
+ /** Where a block was sent: `hook`/`hook_recall` (per-prompt hook), `compact_resume`, `context`/`recall` (CLI), `mcp_*`, `http_*`,
3
+ * and `pilot` (session pilot arm row, src/api/pilot-arm.ts; not a send, so in no surface list). */
12
4
  export type TokenSurface = 'hook' | 'hook_recall' | 'compact_resume' | 'context' | 'recall' | 'mcp_recall' | 'mcp_context' | 'http_recall' | 'http_context' | 'http_assemble' | 'pilot';
13
5
  /** All surfaces, in report order. */
14
6
  export declare const TOKEN_SURFACES: readonly TokenSurface[];
15
7
  /** Surfaces whose re-reads are counted: only a hook payload tells a sub-agent's block from its parent's, as both carry one session id. */
16
8
  export declare const REREAD_SURFACES: readonly TokenSurface[];
17
- /**
18
- * What happened to a block.
19
- * - `inject`: sent to the agent.
20
- * - `skip`: identical to the session's last injected block, so not sent again.
21
- * - `reset`: the host compacted its context, so the next block must be sent.
22
- * - `reread`: tokens later calls read again, booked at session end as one row per session, hook surface and UTC day of the calls.
23
- * - `arm`: the pilot assignment; `block_hash` is `hippo` or `holdout`, `items` the holdout rate in basis points.
24
- */
9
+ /** What happened to a block: `inject` (sent), `skip` (identical to the last injected block), `reset` (host compacted, next must send), `reread` (tokens
10
+ * later calls read again, booked at session end), `arm` (pilot assignment; `block_hash` is `hippo` or `holdout`, `items` the holdout rate in bp). */
25
11
  export type TokenEvent = 'inject' | 'skip' | 'reset' | 'reread' | 'arm';
26
12
  /** Rows older than this are pruned on write. */
27
13
  export declare const TOKEN_LEDGER_RETENTION_DAYS = 90;
@@ -41,9 +27,7 @@ export interface TokenUse {
41
27
  /** Override the timestamp (tests). ISO string. */
42
28
  now?: string;
43
29
  }
44
- /**
45
- * Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}.
46
- */
30
+ /** Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}. */
47
31
  export declare function recordTokenUse(db: DatabaseSyncLike, use: TokenUse): void;
48
32
  /** What a session last sent on a surface, for {@link lastSentState}. */
49
33
  export interface LastSent {
@@ -52,18 +36,10 @@ export interface LastSent {
52
36
  /** Consecutive `skip` rows since that injection. */
53
37
  skipsSince: number;
54
38
  }
55
- /**
56
- * The last block this session injected on `surface`, or null when the
57
- * session has injected nothing, a `reset` came after it, or there is no
58
- * session id (without one, the caller always injects).
59
- */
39
+ /** The last block this session injected on `surface`, or null if none, a `reset` came after it, or there is no session id (the caller then always injects). */
60
40
  export declare function lastSentState(db: DatabaseSyncLike, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface): LastSent | null;
61
- /**
62
- * Whether a block identical to the session's last injection should be
63
- * skipped. `refreshTurns` resends an unchanged block after that many
64
- * consecutive skips, so a long session still sees its pinned rules near the
65
- * latest turn; 0 never resends an unchanged block.
66
- */
41
+ /** Whether a block identical to the session's last injection should be skipped; `refreshTurns` resends it after that many consecutive skips so a long
42
+ * session still sees its pinned rules, 0 never resends. */
67
43
  export declare function shouldSkipUnchanged(last: LastSent | null, hash: string, refreshTurns: number): boolean;
68
44
  /** Per-surface totals for {@link summarizeTokenUse}. */
69
45
  export interface TokenSurfaceSummary {
@@ -98,10 +74,7 @@ export interface TokenSummary {
98
74
  /** Sessions whose re-reads were counted at session end; open or crashed sessions are not. */
99
75
  rereadSessions: number;
100
76
  }
101
- /**
102
- * Sum the ledger for one tenant since `sinceIso`. Surfaces with no rows are
103
- * omitted.
104
- */
77
+ /** Sum the ledger for one tenant since `sinceIso`; surfaces with no rows are omitted. */
105
78
  export declare function summarizeTokenUse(db: DatabaseSyncLike, tenantId: string, sinceIso: string): TokenSummary;
106
79
  /** JSON-value string check without a runtime `typeof` (anti-slop rule). */
107
80
  interface ModelTagged {
@@ -109,13 +82,6 @@ interface ModelTagged {
109
82
  }
110
83
  /** Claude Code writes its own API errors and limit notices as assistant lines from this model; no model call made them. */
111
84
  export declare function isSyntheticMessage(message: ModelTagged): boolean;
112
- /** A hook payload's non-empty `session_id`, or null; with `requiredSource`, also null when its `source` differs. */
113
- export declare function hookPayloadSessionId(stdinText: string | undefined, requiredSource?: string | null): string | null;
114
- /** A hook payload's string `field` as sent, or null when the payload or the field is missing or not a string. */
115
- export declare function hookPayloadString(stdinText: string | undefined, field: string): string | null;
116
- /** Whether a hook fired inside a sub-agent, the only payload with `agent_id` (https://code.claude.com/docs/en/hooks#common-input-fields).
117
- * Its `session_id` is the parent's, so a sub-agent's blocks and compactions must not count as the parent's. */
118
- export declare function isSubagentPayload(stdinText: string | undefined): boolean;
119
85
  /** Tokens hippo sent and skipped in one session, for {@link tokensBySession}. */
120
86
  export interface SessionTokens {
121
87
  sessionId: string;
@@ -126,11 +92,8 @@ export interface SessionTokens {
126
92
  /** Blocks sent. */
127
93
  injections: number;
128
94
  }
129
- /**
130
- * Ledger totals per session id since `sinceIso`, across every surface.
131
- * Claude Code hook rows carry the host's session id, which is also the
132
- * transcript file name, so these join to the host's own usage records.
133
- */
95
+ /** Ledger totals per session id since `sinceIso`, across surfaces; hook rows carry the host's session id (the transcript file name), so they join to its
96
+ * usage records. */
134
97
  export declare function tokensBySession(db: DatabaseSyncLike, tenantId: string, sinceIso: string): SessionTokens[];
135
98
  /** One model API call in a host transcript, for {@link recordRereads}. */
136
99
  export interface ApiCall {
@@ -149,7 +112,7 @@ export interface TranscriptCalls {
149
112
  export declare function readApiCalls(transcriptPath: string): Promise<TranscriptCalls>;
150
113
  /** Calls that carried a block sent at `at` (epoch ms): every later call in the first later call's context window. */
151
114
  export declare function carryingCalls(calls: readonly ApiCall[], at: number): ApiCall[];
152
- /** Replace a session's `reread` rows in one transaction, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
153
- export declare function recordRereads(db: DatabaseSyncLike, tenantId: string, sessionId: string, calls: readonly ApiCall[]): number;
115
+ /** Replace a session's `reread` rows in `hippoRoot`'s store, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
116
+ export declare function recordRereads(hippoRoot: string, tenantId: string, sessionId: string, calls: readonly ApiCall[]): number;
154
117
  export {};
155
118
  //# sourceMappingURL=token-ledger.d.ts.map
@@ -1,30 +1,9 @@
1
- /**
2
- * Token ledger: what memory text hippo hands agents,
3
- * and how many tokens it costs.
4
- *
5
- * One row per block of memory text sent to an agent, on every surface: the
6
- * per-prompt hook, the block `hippo compact-resume` restores after compaction,
7
- * `hippo context`, `hippo recall`, the MCP tools and the HTTP API. The ledger
8
- * answers the question a buyer asks first ("what does this cost me per
9
- * session?") and is the input for the token-savings evals.
10
- *
11
- * Every later model call re-reads a sent block until the host compacts; at session end the worker counts
12
- * those calls from the transcript as `reread` rows for the {@link REREAD_SURFACES} blocks, dated by call day.
13
- *
14
- * It also backs inject-only-on-change: the per-prompt hook compares the
15
- * hash of the block it is about to send with the last block it sent in the
16
- * same session and records a `skip` instead of sending it again.
17
- *
18
- * Token counts use {@link estimateTokens} (characters / 4), the same estimate
19
- * every budget in hippo uses. Rows hold counts, surfaces, session ids and
20
- * hashes, never memory content or query text.
21
- *
22
- * DB helpers take the caller's handle; {@link readApiCalls} streams one
23
- * transcript file. Writes are best-effort at the call sites; a ledger failure
24
- * must never break recall.
25
- */
1
+ /** Token ledger: one row per block of memory text sent to an agent on any surface, with its token cost; the input for the token-savings evals.
2
+ * Backs inject-only-on-change: the hook records a `skip` when the block hash matches the session's last; `reread` rows cover {@link REREAD_SURFACES} blocks.
3
+ * Counts use {@link estimateTokens} (chars / 4); rows never hold content or query text. Writes are best-effort: a ledger failure must not break recall. */
26
4
  import { open } from 'node:fs/promises';
27
5
  import { withWriteScope } from '../db/index.js';
6
+ import { onHandle } from './open.js';
28
7
  import { isJsonString, isJsonObjectLiteral } from '../util/json.js';
29
8
  import { DAY_MS } from '../util/time.js';
30
9
  import { countSkipsAfter, deleteRereadRows, injectedBlocks, insertTokenRow, latestInjectOrReset, pruneTokenRowsBefore, sessionTokenRows, sessionTotals, surfaceTotals, } from './token-ledger-rows.js';
@@ -38,9 +17,7 @@ export const TOKEN_SURFACES = [
38
17
  export const REREAD_SURFACES = ['hook', 'hook_recall', 'compact_resume'];
39
18
  /** Rows older than this are pruned on write. */
40
19
  export const TOKEN_LEDGER_RETENTION_DAYS = 90;
41
- /**
42
- * Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}.
43
- */
20
+ /** Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}. */
44
21
  export function recordTokenUse(db, use) {
45
22
  const now = use.now ?? new Date().toISOString();
46
23
  insertTokenRow(db, {
@@ -56,11 +33,7 @@ export function recordTokenUse(db, use) {
56
33
  const cutoff = new Date(Date.parse(now) - TOKEN_LEDGER_RETENTION_DAYS * DAY_MS).toISOString();
57
34
  pruneTokenRowsBefore(db, cutoff);
58
35
  }
59
- /**
60
- * The last block this session injected on `surface`, or null when the
61
- * session has injected nothing, a `reset` came after it, or there is no
62
- * session id (without one, the caller always injects).
63
- */
36
+ /** The last block this session injected on `surface`, or null if none, a `reset` came after it, or there is no session id (the caller then always injects). */
64
37
  export function lastSentState(db, tenantId, sessionId, surface) {
65
38
  if (!sessionId)
66
39
  return null;
@@ -70,12 +43,8 @@ export function lastSentState(db, tenantId, sessionId, surface) {
70
43
  const skips = countSkipsAfter(db, tenantId, sessionId, surface, anchor.id);
71
44
  return { hash: anchor.block_hash, skipsSince: Number(skips?.n ?? 0) };
72
45
  }
73
- /**
74
- * Whether a block identical to the session's last injection should be
75
- * skipped. `refreshTurns` resends an unchanged block after that many
76
- * consecutive skips, so a long session still sees its pinned rules near the
77
- * latest turn; 0 never resends an unchanged block.
78
- */
46
+ /** Whether a block identical to the session's last injection should be skipped; `refreshTurns` resends it after that many consecutive skips so a long
47
+ * session still sees its pinned rules, 0 never resends. */
79
48
  export function shouldSkipUnchanged(last, hash, refreshTurns) {
80
49
  if (!last || last.hash !== hash)
81
50
  return false;
@@ -83,10 +52,7 @@ export function shouldSkipUnchanged(last, hash, refreshTurns) {
83
52
  return false;
84
53
  return true;
85
54
  }
86
- /**
87
- * Sum the ledger for one tenant since `sinceIso`. Surfaces with no rows are
88
- * omitted.
89
- */
55
+ /** Sum the ledger for one tenant since `sinceIso`; surfaces with no rows are omitted. */
90
56
  export function summarizeTokenUse(db, tenantId, sinceIso) {
91
57
  const rows = surfaceTotals(db, tenantId, sinceIso);
92
58
  const bySurface = new Map(rows.map((r) => [r.surface, r]));
@@ -124,46 +90,8 @@ export function summarizeTokenUse(db, tenantId, sinceIso) {
124
90
  export function isSyntheticMessage(message) {
125
91
  return message.model === '<synthetic>';
126
92
  }
127
- /** A Claude Code hook payload on stdin as a JSON object; null when empty, malformed or not an object. */
128
- function parseHookPayload(stdinText) {
129
- if (!stdinText || stdinText.trim() === '')
130
- return null;
131
- try {
132
- // SAFETY: JSON.parse returns a JSON value by definition.
133
- const payload = JSON.parse(stdinText.trim());
134
- return isJsonObjectLiteral(payload) ? payload : null;
135
- }
136
- catch {
137
- // Malformed is one of the null cases the docblock names.
138
- return null;
139
- }
140
- }
141
- /** A hook payload's non-empty `session_id`, or null; with `requiredSource`, also null when its `source` differs. */
142
- export function hookPayloadSessionId(stdinText, requiredSource = null) {
143
- const payload = parseHookPayload(stdinText);
144
- const sessionId = payload?.session_id;
145
- if (!payload || !isJsonString(sessionId) || sessionId.trim() === '')
146
- return null;
147
- if (requiredSource !== null && payload.source !== requiredSource)
148
- return null;
149
- return sessionId;
150
- }
151
- /** A hook payload's string `field` as sent, or null when the payload or the field is missing or not a string. */
152
- export function hookPayloadString(stdinText, field) {
153
- const value = parseHookPayload(stdinText)?.[field];
154
- return isJsonString(value) ? value : null;
155
- }
156
- /** Whether a hook fired inside a sub-agent, the only payload with `agent_id` (https://code.claude.com/docs/en/hooks#common-input-fields).
157
- * Its `session_id` is the parent's, so a sub-agent's blocks and compactions must not count as the parent's. */
158
- export function isSubagentPayload(stdinText) {
159
- const agentId = parseHookPayload(stdinText)?.agent_id;
160
- return isJsonString(agentId) && agentId.trim() !== '';
161
- }
162
- /**
163
- * Ledger totals per session id since `sinceIso`, across every surface.
164
- * Claude Code hook rows carry the host's session id, which is also the
165
- * transcript file name, so these join to the host's own usage records.
166
- */
93
+ /** Ledger totals per session id since `sinceIso`, across surfaces; hook rows carry the host's session id (the transcript file name), so they join to its
94
+ * usage records. */
167
95
  export function tokensBySession(db, tenantId, sinceIso) {
168
96
  return sessionTokenRows(db, tenantId, sinceIso).map((r) => ({
169
97
  sessionId: r.session_id,
@@ -227,8 +155,14 @@ export function carryingCalls(calls, at) {
227
155
  return [];
228
156
  return calls.filter((call) => call.at > at && call.compactions === first.compactions);
229
157
  }
230
- /** Replace a session's `reread` rows in one transaction, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
231
- export function recordRereads(db, tenantId, sessionId, calls) {
158
+ /** Replace a session's `reread` rows in `hippoRoot`'s store, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
159
+ export function recordRereads(hippoRoot, tenantId, sessionId, calls) {
160
+ return onHandle(hippoRoot, (db) => {
161
+ return replaceRereadRows(db, tenantId, sessionId, calls);
162
+ });
163
+ }
164
+ /** One transaction, so a refused row leaves the session's earlier re-read rows in place. */
165
+ function replaceRereadRows(db, tenantId, sessionId, calls) {
232
166
  return withWriteScope(db, 'record_rereads', () => {
233
167
  const rows = injectedBlocks(db, tenantId, sessionId, REREAD_SURFACES);
234
168
  const days = new Map();