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,11 +1,9 @@
1
1
  import { type SessionHandoff, type HandoffOutcome, type HandoffEvidence } from '../core/handoff.js';
2
2
  import type { TaskSnapshot } from './rows.js';
3
3
  import { type ContinuityKey } from './sessions.js';
4
- /** Column list shared by every session_handoffs SELECT; store-cards.ts reuses it for the card handoff lookup. */
5
- export declare const HANDOFF_COLUMNS = "id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, evidence_json, outcome, target_runtime, card_id";
6
- /**
7
- * Save a session handoff record. Returns the persisted handoff.
8
- */
4
+ /** Column list shared by every session_handoffs SELECT; cards.ts reuses it for the card handoff lookup. */
5
+ export declare const HANDOFF_COLUMNS: string;
6
+ /** Save a session handoff record; returns the persisted handoff. */
9
7
  export declare function saveSessionHandoff(hippoRoot: string, tenantId: string, handoff: Omit<SessionHandoff, 'updatedAt'>, key?: ContinuityKey): SessionHandoff;
10
8
  interface HandoffFilter {
11
9
  unfinishedOnly?: boolean;
@@ -15,16 +13,12 @@ interface HandoffFilter {
15
13
  }
16
14
  /** Load the most recent handoff, optionally filtered by session ID. */
17
15
  export declare function loadLatestHandoff(hippoRoot: string, tenantId: string, sessionId?: string, opts?: HandoffFilter, key?: ContinuityKey): SessionHandoff | null;
18
- /**
19
- * Load a specific handoff by its row ID.
20
- */
16
+ /** Load a specific handoff by its row ID. */
21
17
  export declare function loadHandoffById(hippoRoot: string, tenantId: string, id: number): SessionHandoff | null;
22
18
  /** Stamp the outcome on a session's newest handoff, only if it has none yet. Returns rows changed. */
23
19
  export declare function stampHandoffOutcome(hippoRoot: string, tenantId: string, sessionId: string, outcome: HandoffOutcome): number;
24
- /** Auto-write a handoff at session-end from the session's active snapshot, else from `derived`, its transcript state.
25
- * @param evidence best-effort git state; outcome comes from the newest session_complete event.
26
- * @param options.inPlace rewrite an earlier transcript read instead of adding a revision, for a close that runs after every reply.
27
- * @returns null when neither source is the session's, a newer handoff covers the snapshot, the session's latest handoff was not read off its transcript or already holds `derived`, or, in place, a handoff landed after the read. */
20
+ /** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier transcript read instead of adding a revision.
21
+ * Returns null when no source is the session's, a newer handoff covers it, or the latest one is not transcript-derived or already holds `derived`. */
28
22
  export declare function writeSessionEndHandoff(hippoRoot: string, tenantId: string, sessionId: string, evidence: HandoffEvidence | null, derived?: Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null, key?: ContinuityKey, options?: {
29
23
  inPlace?: boolean;
30
24
  }): SessionHandoff | null;
@@ -1,14 +1,13 @@
1
- import { closeHippoDb, openHippoDb } from '../db/index.js';
1
+ import { closeHippoDb } from '../db/index.js';
2
2
  import { rowToSessionHandoff, isHandoffOutcome, } from '../core/handoff.js';
3
- import { scopeAdmitSql } from './recall-scope.js';
3
+ import { scopeAdmitSql } from './rule-sql.js';
4
4
  import { assertTenantId } from './tenant.js';
5
- import { openStore } from './open.js';
5
+ import { onHandle, openStore } from './open.js';
6
6
  import { continuityStamp, continuityWhere, loadActiveTaskSnapshot } from './sessions.js';
7
- /** Column list shared by every session_handoffs SELECT; store-cards.ts reuses it for the card handoff lookup. */
8
- export const HANDOFF_COLUMNS = 'id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, evidence_json, outcome, target_runtime, card_id';
9
- /**
10
- * Save a session handoff record. Returns the persisted handoff.
11
- */
7
+ /** Column list shared by every session_handoffs SELECT; cards.ts reuses it for the card handoff lookup. */
8
+ export const HANDOFF_COLUMNS = 'id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, ' +
9
+ 'evidence_json, outcome, target_runtime, card_id';
10
+ /** Save a session handoff record; returns the persisted handoff. */
12
11
  export function saveSessionHandoff(hippoRoot, tenantId, handoff, key) {
13
12
  assertTenantId('saveSessionHandoff', tenantId);
14
13
  const stamp = key ? continuityStamp(key) : null;
@@ -17,10 +16,9 @@ export function saveSessionHandoff(hippoRoot, tenantId, handoff, key) {
17
16
  // Scope is stored as given; read-side default-deny in api.recall + cmdRecall
18
17
  // continuity excludes slack:private:* and 'unknown:legacy'.
19
18
  try {
20
- const result = db.prepare(`
21
- INSERT INTO session_handoffs(session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, tenant_id, created_at, constraints_json, evidence_json, outcome, target_runtime, card_id, owner_subject, origin_project)
22
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
23
- `).run(handoff.sessionId, handoff.repoRoot ?? null, handoff.taskId ?? null, handoff.summary, handoff.nextAction ?? null, JSON.stringify(handoff.artifacts ?? []), handoff.scope ?? null, tenantId, now, JSON.stringify(handoff.constraints ?? []), handoff.evidence ? JSON.stringify(handoff.evidence) : null, handoff.outcome ?? null, handoff.targetRuntime ?? null, handoff.cardId ?? null, stamp?.owner ?? null, stamp?.origin ?? null);
19
+ const result = db.prepare(`\n INSERT INTO session_handoffs(session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, tenant_id, created_at, ` +
20
+ `constraints_json, evidence_json, outcome, target_runtime, card_id, owner_subject, origin_project)\n` +
21
+ ` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(handoff.sessionId, handoff.repoRoot ?? null, handoff.taskId ?? null, handoff.summary, handoff.nextAction ?? null, JSON.stringify(handoff.artifacts ?? []), handoff.scope ?? null, tenantId, now, JSON.stringify(handoff.constraints ?? []), handoff.evidence ? JSON.stringify(handoff.evidence) : null, handoff.outcome ?? null, handoff.targetRuntime ?? null, handoff.cardId ?? null, stamp?.owner ?? null, stamp?.origin ?? null);
24
22
  const id = Number(result.lastInsertRowid ?? 0);
25
23
  // SAFETY: row's shape matches HANDOFF_COLUMNS.
26
24
  const row = db.prepare(`SELECT ${HANDOFF_COLUMNS} FROM session_handoffs WHERE id = ?`).get(id);
@@ -50,8 +48,7 @@ function handoffConditions(tenantId, sessionId, opts, key) {
50
48
  params.push(opts.excludeSessionId);
51
49
  }
52
50
  if (opts.unfinishedOnly) {
53
- // Restrict to each session's newest revision first: stampHandoffOutcome
54
- // only stamps the newest row, so an older null-outcome revision must not resurrect.
51
+ // Restrict to each session's newest revision first: stampHandoffOutcome only stamps the newest row, so an older null-outcome revision must not resurrect.
55
52
  // Keyed, the newest is the owner's own, so another owner's newer revision cannot hide it.
56
53
  conditions.push(`id IN (SELECT MAX(id) FROM session_handoffs WHERE tenant_id = ?${owned ? ` AND ${owned.sql}` : ''} GROUP BY session_id)`);
57
54
  params.push(tenantId, ...(owned?.params ?? []));
@@ -89,9 +86,7 @@ export function loadLatestHandoff(hippoRoot, tenantId, sessionId, opts = {}, key
89
86
  closeHippoDb(db);
90
87
  }
91
88
  }
92
- /**
93
- * Load a specific handoff by its row ID.
94
- */
89
+ /** Load a specific handoff by its row ID. */
95
90
  export function loadHandoffById(hippoRoot, tenantId, id) {
96
91
  assertTenantId('loadHandoffById', tenantId);
97
92
  const db = openStore(hippoRoot);
@@ -111,8 +106,7 @@ export function loadHandoffById(hippoRoot, tenantId, id) {
111
106
  /** Stamp the outcome on a session's newest handoff, only if it has none yet. Returns rows changed. */
112
107
  export function stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome) {
113
108
  assertTenantId('stampHandoffOutcome', tenantId);
114
- const db = openStore(hippoRoot);
115
- try {
109
+ return onHandle(hippoRoot, (db) => {
116
110
  const result = db.prepare(`
117
111
  UPDATE session_handoffs SET outcome = ?
118
112
  WHERE tenant_id = ? AND session_id = ? AND outcome IS NULL
@@ -123,17 +117,14 @@ export function stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome) {
123
117
  )
124
118
  `).run(outcome, tenantId, sessionId, tenantId, sessionId);
125
119
  return Number(result.changes ?? 0);
126
- }
127
- finally {
128
- closeHippoDb(db);
129
- }
120
+ }, openStore);
130
121
  }
131
- /** Rewrites the session's newest handoff when it is still a transcript read, in one statement so a handoff written meanwhile is never overwritten; null when none was rewritten. */
122
+ /** Rewrites the session's newest handoff when it is still a transcript read, in one statement so a handoff written meanwhile is never overwritten; null
123
+ * when none was rewritten. */
132
124
  function replaceTranscriptHandoff(hippoRoot, tenantId, handoff, key) {
133
125
  const { conditions, params } = handoffConditions(tenantId, handoff.sessionId, {}, key);
134
126
  const newest = `SELECT id FROM session_handoffs WHERE ${conditions.join(' AND ')} ORDER BY created_at DESC, id DESC LIMIT 1`;
135
- const db = openStore(hippoRoot);
136
- try {
127
+ return onHandle(hippoRoot, (db) => {
137
128
  const result = db.prepare(`
138
129
  UPDATE session_handoffs SET repo_root = ?, task_id = ?, summary = ?, next_action = ?, artifacts_json = ?, scope = ?, created_at = ?,
139
130
  constraints_json = ?, evidence_json = ?, outcome = ?, target_runtime = ?, card_id = ?
@@ -144,10 +135,7 @@ function replaceTranscriptHandoff(hippoRoot, tenantId, handoff, key) {
144
135
  // SAFETY: row's shape matches HANDOFF_COLUMNS.
145
136
  const row = db.prepare(`SELECT ${HANDOFF_COLUMNS} FROM session_handoffs WHERE id = (${newest})`).get(...params);
146
137
  return row ? rowToSessionHandoff(row) : null;
147
- }
148
- finally {
149
- closeHippoDb(db);
150
- }
138
+ }, openStore);
151
139
  }
152
140
  function transcriptHandoffSource(existing, derived, evidence) {
153
141
  // Only an earlier transcript read gives way; `hippo handoff create` and unmarked older handoffs keep winning.
@@ -179,10 +167,8 @@ function buildSessionEndHandoff(sessionId, snapshot, existing, handoffEvidence,
179
167
  cardId: carryForward ? existing.cardId : undefined,
180
168
  };
181
169
  }
182
- /** Auto-write a handoff at session-end from the session's active snapshot, else from `derived`, its transcript state.
183
- * @param evidence best-effort git state; outcome comes from the newest session_complete event.
184
- * @param options.inPlace rewrite an earlier transcript read instead of adding a revision, for a close that runs after every reply.
185
- * @returns null when neither source is the session's, a newer handoff covers the snapshot, the session's latest handoff was not read off its transcript or already holds `derived`, or, in place, a handoff landed after the read. */
170
+ /** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier transcript read instead of adding a revision.
171
+ * Returns null when no source is the session's, a newer handoff covers it, or the latest one is not transcript-derived or already holds `derived`. */
186
172
  export function writeSessionEndHandoff(hippoRoot, tenantId, sessionId, evidence, derived = null, key, options = {}) {
187
173
  assertTenantId('writeSessionEndHandoff', tenantId);
188
174
  if (key)
@@ -216,8 +202,7 @@ export function writeSessionEndHandoff(hippoRoot, tenantId, sessionId, evidence,
216
202
  return saveSessionHandoff(hippoRoot, tenantId, handoff, key);
217
203
  }
218
204
  function sessionOutcome(hippoRoot, tenantId, sessionId) {
219
- const db = openHippoDb(hippoRoot);
220
- try {
205
+ return onHandle(hippoRoot, (db) => {
221
206
  // SAFETY: row's shape matches the single `content` column below.
222
207
  const content = db.prepare(`
223
208
  SELECT content FROM session_events
@@ -225,9 +210,6 @@ function sessionOutcome(hippoRoot, tenantId, sessionId) {
225
210
  ORDER BY created_at DESC, id DESC LIMIT 1
226
211
  `).get(tenantId, sessionId)?.content;
227
212
  return isHandoffOutcome(content) ? content : null;
228
- }
229
- finally {
230
- closeHippoDb(db);
231
- }
213
+ });
232
214
  }
233
215
  //# sourceMappingURL=handoffs.js.map
@@ -4,16 +4,10 @@ import type { HippoIndex, LegacyStats } from './rows.js';
4
4
  export declare function loadIndex(hippoRoot: string): HippoIndex;
5
5
  /** The last recall's ids and its trace alone, for a caller that needs no index entry. */
6
6
  export declare function loadLastRecall(hippoRoot: string): Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>;
7
- /**
8
- * Persist mutable index metadata. Entry rows themselves are derived from SQLite.
9
- *
10
- * `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
11
- * into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
12
- */
7
+ /** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit in one transaction, as callers
8
+ * rely on both moving together. index.json is left to `rebuildIndex`. */
13
9
  export declare function saveIndex(hippoRoot: string, index: Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>): void;
14
- /**
15
- * Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
16
- */
10
+ /** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
17
11
  export declare function rebuildIndex(hippoRoot: string): HippoIndex;
18
12
  export declare function updateStats(hippoRoot: string, delta: {
19
13
  remembered?: number;
@@ -32,9 +26,7 @@ export declare function appendConsolidationRun(hippoRoot: string, run: {
32
26
  }): void;
33
27
  /** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
34
28
  export declare function countCreatedSinceLastSleep(hippoRoot: string, tenantId: string, now?: Date): number;
35
- /**
36
- * Session decay context: provides the data needed for session-based and adaptive decay.
37
- */
29
+ /** Session decay context: the data needed for session-based and adaptive decay. */
38
30
  export interface SessionDecayContext {
39
31
  /** Total number of sleep (consolidation) cycles completed. */
40
32
  sleepCount: number;
@@ -43,13 +35,8 @@ export interface SessionDecayContext {
43
35
  }
44
36
  /** Timestamp of the latest consolidation run, or undefined when there is none. */
45
37
  export declare function lastConsolidationAt(db: DatabaseSyncLike): string | undefined;
46
- /**
47
- * Load the session decay context from the store.
48
- * Uses consolidation_runs timestamps to compute session intervals.
49
- */
38
+ /** Load the session decay context; session intervals come from consolidation_runs timestamps. */
50
39
  export declare function loadSessionDecayContext(hippoRoot: string): SessionDecayContext;
51
- /**
52
- * Increment the sleep counter. Called after each consolidation run.
53
- */
40
+ /** Increment the sleep counter after each consolidation run. */
54
41
  export declare function incrementSleepCount(hippoRoot: string): void;
55
42
  //# sourceMappingURL=index-and-stats.d.ts.map
@@ -1,55 +1,36 @@
1
- import { closeHippoDb, withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta } from '../db/index.js';
2
- import { RejectedValueError } from './rejection.js';
1
+ import { withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta } from '../db/index.js';
2
+ import { RejectedValueError } from '../core/api-errors.js';
3
3
  import { log } from '../util/log.js';
4
4
  import { audit } from './audit-event.js';
5
5
  import { stampOriginProjectForImport, upsertEntryRow } from './entry-row.js';
6
6
  import { buildIndexFromDb, readLastRecall, syncMirrorFiles, writeIndexMirror, writeStatsMirror, buildStatsFromDb } from './mirrors.js';
7
- import { openStore, loadLegacyEntriesFromMarkdown } from './open.js';
7
+ import { onHandle, openStore, loadLegacyEntriesFromMarkdown } from './open.js';
8
8
  import { DAY_MS } from '../util/time.js';
9
9
  /** Load the derived index from SQLite. Read-only: index.json is only ever written by `rebuildIndex`. */
10
10
  export function loadIndex(hippoRoot) {
11
- const db = openStore(hippoRoot);
12
- try {
11
+ return onHandle(hippoRoot, (db) => {
13
12
  return buildIndexFromDb(db);
14
- }
15
- finally {
16
- closeHippoDb(db);
17
- }
13
+ }, openStore);
18
14
  }
19
15
  /** The last recall's ids and its trace alone, for a caller that needs no index entry. */
20
16
  export function loadLastRecall(hippoRoot) {
21
- const db = openStore(hippoRoot);
22
- try {
17
+ return onHandle(hippoRoot, (db) => {
23
18
  return readLastRecall(db);
24
- }
25
- finally {
26
- closeHippoDb(db);
27
- }
19
+ }, openStore);
28
20
  }
29
- /**
30
- * Persist mutable index metadata. Entry rows themselves are derived from SQLite.
31
- *
32
- * `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
33
- * into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
34
- */
21
+ /** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit in one transaction, as callers
22
+ * rely on both moving together. index.json is left to `rebuildIndex`. */
35
23
  export function saveIndex(hippoRoot, index) {
36
- const db = openStore(hippoRoot);
37
- try {
24
+ onHandle(hippoRoot, (db) => {
38
25
  withWriteScope(db, 'save_index', () => {
39
26
  setMeta(db, 'last_retrieval_ids', JSON.stringify(index.last_retrieval_ids ?? []));
40
27
  setMeta(db, 'last_trace_id', index.last_trace_id ?? '');
41
28
  });
42
- }
43
- finally {
44
- closeHippoDb(db);
45
- }
29
+ }, openStore);
46
30
  }
47
- /**
48
- * Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
49
- */
31
+ /** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
50
32
  export function rebuildIndex(hippoRoot) {
51
- const db = openStore(hippoRoot);
52
- try {
33
+ return onHandle(hippoRoot, (db) => {
53
34
  // SAFETY: rows' shape matches the single `id` column selected above.
54
35
  const existingIds = new Set(db.prepare(`SELECT id FROM memories`).all().map((row) => row.id));
55
36
  const legacyEntries = loadLegacyEntriesFromMarkdown(hippoRoot).filter((entry) => !existingIds.has(entry.id));
@@ -67,7 +48,12 @@ export function rebuildIndex(hippoRoot) {
67
48
  catch (err) {
68
49
  if (err instanceof RejectedValueError) {
69
50
  rejectedCount++;
70
- audit(db, 'reject_refusal', { targetId: err.entryId, metadata: { digest: err.digest, reason: err.reason }, actor: 'cli', tenantId: err.tenantId });
51
+ audit(db, 'reject_refusal', {
52
+ targetId: err.entryId,
53
+ metadata: { digest: err.digest, reason: err.reason },
54
+ actor: 'cli',
55
+ tenantId: err.tenantId
56
+ });
71
57
  continue;
72
58
  }
73
59
  throw err;
@@ -82,25 +68,16 @@ export function rebuildIndex(hippoRoot) {
82
68
  const index = buildIndexFromDb(db);
83
69
  writeIndexMirror(hippoRoot, index);
84
70
  return index;
85
- }
86
- finally {
87
- closeHippoDb(db);
88
- }
71
+ }, openStore);
89
72
  }
90
73
  export function updateStats(hippoRoot, delta) {
91
- const db = openStore(hippoRoot);
92
- try {
74
+ onHandle(hippoRoot, (db) => {
93
75
  updateStatsOn(db, hippoRoot, delta);
94
- }
95
- finally {
96
- closeHippoDb(db);
97
- }
76
+ }, openStore);
98
77
  }
99
78
  /** updateStats on the caller's open store, so a loop of writes opens the store once. */
100
79
  export function updateStatsOn(db, hippoRoot, delta) {
101
- // One atomic statement per counter, and only for counters the caller
102
- // named: the read-modify-write this replaces both lost increments to a
103
- // concurrent writer and stamped stale values over the untouched two.
80
+ // One atomic statement per named counter: a read-modify-write loses concurrent increments and stamps stale values over the untouched two.
104
81
  const increments = [
105
82
  ['total_remembered', delta.remembered ?? 0],
106
83
  ['total_recalled', delta.recalled ?? 0],
@@ -129,37 +106,25 @@ export function updateStatsUnlessBusy(hippoRoot, delta, committed) {
129
106
  }
130
107
  }
131
108
  export function loadStats(hippoRoot) {
132
- const db = openStore(hippoRoot);
133
- try {
109
+ return onHandle(hippoRoot, (db) => {
134
110
  return buildStatsFromDb(db);
135
- }
136
- finally {
137
- closeHippoDb(db);
138
- }
111
+ }, openStore);
139
112
  }
140
113
  export function appendConsolidationRun(hippoRoot, run) {
141
- const db = openStore(hippoRoot);
142
- try {
114
+ onHandle(hippoRoot, (db) => {
143
115
  db.prepare(`INSERT INTO consolidation_runs(timestamp, decayed, merged, removed) VALUES (?, ?, ?, ?)`).run(run.timestamp, run.decayed, run.merged, run.removed);
144
- pruneConsolidationRuns(db, 50);
116
+ pruneConsolidationRuns(db);
145
117
  writeStatsMirror(hippoRoot, buildStatsFromDb(db));
146
- }
147
- finally {
148
- closeHippoDb(db);
149
- }
118
+ }, openStore);
150
119
  }
151
120
  /** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
152
121
  export function countCreatedSinceLastSleep(hippoRoot, tenantId, now = new Date()) {
153
- const db = openStore(hippoRoot);
154
- try {
122
+ return onHandle(hippoRoot, (db) => {
155
123
  const dayAgo = new Date(now.getTime() - DAY_MS).toISOString();
156
124
  const row = db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE tenant_id = ?
157
125
  AND created > MAX(?, COALESCE((SELECT MAX(timestamp) FROM consolidation_runs), ''))`).get(tenantId, dayAgo);
158
126
  return row.n;
159
- }
160
- finally {
161
- closeHippoDb(db);
162
- }
127
+ }, openStore);
163
128
  }
164
129
  /** Timestamp of the latest consolidation run, or undefined when there is none. */
165
130
  export function lastConsolidationAt(db) {
@@ -167,13 +132,9 @@ export function lastConsolidationAt(db) {
167
132
  const row = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 1`).get();
168
133
  return row?.timestamp;
169
134
  }
170
- /**
171
- * Load the session decay context from the store.
172
- * Uses consolidation_runs timestamps to compute session intervals.
173
- */
135
+ /** Load the session decay context; session intervals come from consolidation_runs timestamps. */
174
136
  export function loadSessionDecayContext(hippoRoot) {
175
- const db = openStore(hippoRoot);
176
- try {
137
+ return onHandle(hippoRoot, (db) => {
177
138
  // Get recent consolidation timestamps (last 20)
178
139
  // SAFETY: rows' shape matches the single `timestamp` column above.
179
140
  const rows = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 20`).all();
@@ -190,22 +151,13 @@ export function loadSessionDecayContext(hippoRoot) {
190
151
  const avgMs = totalInterval / (timestamps.length - 1);
191
152
  const avgDays = avgMs / DAY_MS;
192
153
  return { sleepCount, avgSessionIntervalDays: Math.max(0, avgDays) };
193
- }
194
- finally {
195
- closeHippoDb(db);
196
- }
154
+ }, openStore);
197
155
  }
198
- /**
199
- * Increment the sleep counter. Called after each consolidation run.
200
- */
156
+ /** Increment the sleep counter after each consolidation run. */
201
157
  export function incrementSleepCount(hippoRoot) {
202
- const db = openStore(hippoRoot);
203
- try {
158
+ onHandle(hippoRoot, (db) => {
204
159
  const current = Number(getMeta(db, 'sleep_count', '0')) || 0;
205
160
  setMeta(db, 'sleep_count', String(current + 1));
206
- }
207
- finally {
208
- closeHippoDb(db);
209
- }
161
+ }, openStore);
210
162
  }
211
163
  //# sourceMappingURL=index-and-stats.js.map
@@ -3,7 +3,7 @@ import { BadRequestError, ConflictError, NotFoundError } from '../core/api-error
3
3
  import { appendAuditEvent } from './audit.js';
4
4
  import { grantScope, insertApiKey, listLiveOwnedKeyIds, revokeApiKey, ungrantScope } from './auth.js';
5
5
  import { withWriteScope } from '../db/index.js';
6
- import { isRestrictedScope } from './recall-scope.js';
6
+ import { isRestrictedScope } from '../core/recall-scope.js';
7
7
  import { selectApiKeyOwner } from './tenant-lookup.js';
8
8
  /** The auth_create row a mint writes; the plaintext never reaches it. */
9
9
  function createAuditOf({ key, actor, metadata }) {
@@ -1,5 +1,9 @@
1
1
  import type { DeliveryEventInput } from './delivery-recorder.js';
2
2
  import { type LastSent, type TokenSurface, type TokenUse } from './token-ledger.js';
3
+ import { type PilotArm } from './pilot-arm.js';
4
+ /** Says why a ledger row did not land, at the level its class earns: busy warns once through
5
+ * noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
6
+ export declare function noteLedgerRowSkipped<E>(error: E): void;
3
7
  /** Stores one delivery event and returns its id, or null when the write failed. */
4
8
  export type DeliveryWrite = (input: DeliveryEventInput) => number | null;
5
9
  /** The token rows of one turn and the delivery event that follows them. */
@@ -14,4 +18,9 @@ export interface LedgerTurn {
14
18
  export declare function recordLedgerTurn(hippoRoot: string, turn: LedgerTurn): void;
15
19
  /** What the session last sent on `surface`, or null, as lastSentState reads it. */
16
20
  export declare function lastSentOnSurface(hippoRoot: string, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface): LastSent | null;
21
+ /** The session's pilot arm: `write` books it as ensurePilotArm does, else the stored arm or the hash arm. */
22
+ export declare function pilotArmOnRoot(hippoRoot: string, tenantId: string, sessionId: string, rateBp: number, opts: {
23
+ write: boolean;
24
+ ownTenantOnly?: boolean;
25
+ }): PilotArm;
17
26
  //# sourceMappingURL=ledger-turn.d.ts.map
@@ -1,6 +1,37 @@
1
+ // One hook or context turn's token-ledger work by store root: each call opens hippo.db, runs on one connection and closes it.
2
+ import { isSqliteBusy, noteStoreBusy } from '../db/index.js';
3
+ import { errorFields, errorMessage, log } from '../util/log.js';
1
4
  import { lastSentState, recordTokenUse } from './token-ledger.js';
2
5
  import { onHandle } from './open.js';
6
+ import { ensurePilotArm, hashArm, readPilotArm } from './pilot-arm.js';
3
7
  import { writeDeliveryEventOnHandle } from './recall-trace.js';
8
+ // SQLite's result codes for a hippo.db it cannot read: a corrupt image, and a file that is no database.
9
+ const SQLITE_CORRUPT = 11;
10
+ const SQLITE_NOTADB = 26;
11
+ /** The one rule for a skipped ledger row. `absent` is a store with no token_ledger table or a hippo.db
12
+ * SQLite cannot read; the command that owns the store reports that, and a hook must stay quiet about it. */
13
+ function ledgerSkipClass(error) {
14
+ if (isSqliteBusy(error))
15
+ return 'busy';
16
+ const code = error instanceof Error && 'errcode' in error ? error.errcode : undefined;
17
+ if (code === SQLITE_CORRUPT || code === SQLITE_NOTADB)
18
+ return 'absent';
19
+ return errorMessage(error).includes('no such table: token_ledger') ? 'absent' : 'unexpected';
20
+ }
21
+ /** Says why a ledger row did not land, at the level its class earns: busy warns once through
22
+ * noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
23
+ export function noteLedgerRowSkipped(error) {
24
+ const skip = ledgerSkipClass(error);
25
+ if (skip === 'busy') {
26
+ noteStoreBusy('token ledger row skipped');
27
+ return;
28
+ }
29
+ const message = `token ledger row skipped: ${errorMessage(error)}`;
30
+ if (skip === 'absent')
31
+ log.debug(message);
32
+ else
33
+ log.warnThenDebug('token-ledger-row', message, errorFields(error));
34
+ }
4
35
  /** Books a turn's token rows, then its delivery event, on one connection. */
5
36
  export function recordLedgerTurn(hippoRoot, turn) {
6
37
  const { onRowError } = turn;
@@ -24,4 +55,11 @@ export function recordLedgerTurn(hippoRoot, turn) {
24
55
  export function lastSentOnSurface(hippoRoot, tenantId, sessionId, surface) {
25
56
  return onHandle(hippoRoot, (db) => lastSentState(db, tenantId, sessionId, surface));
26
57
  }
58
+ /** The session's pilot arm: `write` books it as ensurePilotArm does, else the stored arm or the hash arm. */
59
+ export function pilotArmOnRoot(hippoRoot, tenantId, sessionId, rateBp, opts) {
60
+ const { ownTenantOnly } = opts;
61
+ return onHandle(hippoRoot, (db) => opts.write
62
+ ? ensurePilotArm(db, tenantId, sessionId, rateBp, { ownTenantOnly })
63
+ : readPilotArm(db, sessionId, ownTenantOnly ? tenantId : undefined) ?? hashArm(sessionId, rateBp));
64
+ }
27
65
  //# sourceMappingURL=ledger-turn.js.map
@@ -9,12 +9,8 @@ export declare function removeActiveTaskMirror(hippoRoot: string, tenantId: stri
9
9
  export declare function writeRecentSessionMirror(hippoRoot: string, tenantId: string, events: SessionEvent[]): void;
10
10
  export declare function writeMarkdownMirror(hippoRoot: string, entry: MemoryEntry): void;
11
11
  export declare function removeEntryMirrors(hippoRoot: string, id: string): void;
12
- /**
13
- * Best-effort mirror purge. Retries the unlink once (most failures are transient locks); the reaper only
14
- * scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
15
- *
16
- * Returns true if the mirror ended up purged (first or second attempt).
17
- */
12
+ /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
13
+ * so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
18
14
  export declare function purgeMirrorBestEffort(hippoRoot: string, id: string, isRaw: boolean, logPrefix: string): boolean;
19
15
  /** Derive the current `HippoIndex` from SQLite. Exported for `rebuildIndex`
20
16
  * (the only index.json writer) and the longmemeval benchmark. */
@@ -1,12 +1,13 @@
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
1
2
  import * as fs from 'fs';
2
3
  import * as path from 'path';
3
4
  import { Layer } from '../core/memory.js';
4
- import { dumpFrontmatter } from './yaml.js';
5
- import { getMeta } from '../db/index.js';
5
+ import { dumpFrontmatter } from '../util/yaml.js';
6
+ import { getMeta, CONSOLIDATION_RUNS_KEPT } from '../db/index.js';
6
7
  import { oncePerStore } from '../db/connect.js';
7
- import { errorMessage, log } from '../util/log.js';
8
+ import { errorFields, errorMessage, log } from '../util/log.js';
8
9
  import { parseJsonArray, INDEX_VERSION, parseLastTraceId, MEMORY_SELECT_COLUMNS, rowToEntry, rowToMemoryConflict, } from './rows.js';
9
- import { serializeEntry } from './markdown.js';
10
+ import { serializeEntry } from '../core/markdown.js';
10
11
  const SCORE_DECIMALS = 3;
11
12
  export function layerDir(root, layer) {
12
13
  return path.join(root, layer);
@@ -21,16 +22,14 @@ export function ensureMirrorDirectories(hippoRoot) {
21
22
  }
22
23
  });
23
24
  }
24
- // Tenant-scoped mirror file paths. The single-tenant 'default' deployment
25
- // keeps the original `active-task.md` / `recent-session.md` filenames for
26
- // on-disk back-compat; multi-tenant deployments get a `.<tenantId>` suffix
27
- // so tenant B saving cannot overwrite tenant A's mirror file.
25
+ // Tenant-scoped mirror paths: the 'default' tenant keeps the original `active-task.md` / `recent-session.md` names;
26
+ // other tenants get a `.<tenantId>` suffix so one cannot overwrite another's mirror.
28
27
  function activeTaskMirrorPath(hippoRoot, tenantId) {
29
- const file = tenantId === 'default' ? 'active-task.md' : `active-task.${tenantId}.md`;
28
+ const file = tenantId === DEFAULT_TENANT_ID ? 'active-task.md' : `active-task.${tenantId}.md`;
30
29
  return path.join(hippoRoot, 'buffer', file);
31
30
  }
32
31
  function recentSessionMirrorPath(hippoRoot, tenantId) {
33
- const file = tenantId === 'default' ? 'recent-session.md' : `recent-session.${tenantId}.md`;
32
+ const file = tenantId === DEFAULT_TENANT_ID ? 'recent-session.md' : `recent-session.${tenantId}.md`;
34
33
  return path.join(hippoRoot, 'buffer', file);
35
34
  }
36
35
  export function writeActiveTaskMirror(hippoRoot, tenantId, snapshot) {
@@ -155,22 +154,15 @@ export function removeEntryMirrors(hippoRoot, id) {
155
154
  }
156
155
  }
157
156
  }
158
- /**
159
- * Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge
160
- * with no reaper to retry it can name the stuck file.
161
- */
157
+ /** Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge with no reaper to retry it can name the stuck file. */
162
158
  function getExistingEntryMirrorPaths(hippoRoot, id) {
163
159
  // Layer list kept in lockstep with removeEntryMirrors.
164
160
  return [Layer.Buffer, Layer.Episodic, Layer.Semantic, Layer.Trace]
165
161
  .map((layer) => path.join(layerDir(hippoRoot, layer), `${id}.md`))
166
162
  .filter((file) => fs.existsSync(file));
167
163
  }
168
- /**
169
- * Best-effort mirror purge. Retries the unlink once (most failures are transient locks); the reaper only
170
- * scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
171
- *
172
- * Returns true if the mirror ended up purged (first or second attempt).
173
- */
164
+ /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
165
+ * so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
174
166
  export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
175
167
  try {
176
168
  removeEntryMirrors(hippoRoot, id);
@@ -184,13 +176,13 @@ export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
184
176
  catch (secondErr) {
185
177
  const msg = errorMessage(secondErr);
186
178
  if (isRaw) {
187
- log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}`);
179
+ log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}`, errorFields(secondErr));
188
180
  }
189
181
  else {
190
182
  const leftover = getExistingEntryMirrorPaths(hippoRoot, id);
191
183
  const pathsNote = leftover.length > 0 ? leftover.join(', ') : `${id}.md (path unresolved)`;
192
184
  log.error(`${logPrefix}: mirror cleanup failed for ${id} - no automatic retry exists for this file, ` +
193
- `delete it manually: ${pathsNote} (${msg})`);
185
+ `delete it manually: ${pathsNote} (${msg})`, errorFields(secondErr));
194
186
  }
195
187
  return false;
196
188
  }
@@ -211,7 +203,7 @@ export function buildIndexFromDb(db) {
211
203
  file: path.join(layer, `${row.id}.md`),
212
204
  layer,
213
205
  strength: Number(row.strength ?? 0),
214
- tags: parseJsonArray(row.tags_json),
206
+ tags: parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' }),
215
207
  created: row.created,
216
208
  last_retrieved: row.last_retrieved,
217
209
  pinned: Boolean(row.pinned),
@@ -221,19 +213,22 @@ export function buildIndexFromDb(db) {
221
213
  }
222
214
  /** The last recall's ids and its trace, the two meta keys saveIndex writes together. */
223
215
  export function readLastRecall(db) {
224
- // Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent
225
- // saveIndex and hand back a mismatched last_retrieval_ids / last_trace_id pair.
216
+ // Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent saveIndex and return a mismatched pair.
226
217
  // SAFETY: lockstepRows' shape matches the key/value columns named above.
227
218
  const lockstepRows = db.prepare(`SELECT key, value FROM meta WHERE key IN ('last_retrieval_ids', 'last_trace_id')`).all();
228
219
  const lockstep = new Map(lockstepRows.map((r) => [r.key, r.value]));
229
220
  return {
230
- last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]'),
221
+ last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]', { table: 'meta', id: 'last_retrieval_ids', column: 'value' }),
231
222
  last_trace_id: parseLastTraceId(lockstep.get('last_trace_id') ?? ''),
232
223
  };
233
224
  }
234
225
  export function buildStatsFromDb(db) {
235
- // SAFETY: runs' shape matches the four columns named in the SELECT above.
236
- const runs = db.prepare(`SELECT timestamp, decayed, merged, removed FROM consolidation_runs ORDER BY timestamp ASC, id ASC`).all();
226
+ // SAFETY: runs' shape matches the four columns named in the SELECT below.
227
+ const runs = db.prepare(`
228
+ SELECT timestamp, decayed, merged, removed FROM (
229
+ SELECT id, timestamp, decayed, merged, removed FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT ?
230
+ ) ORDER BY timestamp ASC, id ASC
231
+ `).all(CONSOLIDATION_RUNS_KEPT);
237
232
  return {
238
233
  total_remembered: Number(getMeta(db, 'total_remembered', '0')),
239
234
  total_recalled: Number(getMeta(db, 'total_recalled', '0')),
@@ -249,7 +244,7 @@ export function buildStatsFromDb(db) {
249
244
  /** Write the `index.json` mirror file for an already-derived index. Exported for
250
245
  * `rebuildIndex` (the only index.json writer) and the longmemeval benchmark. */
251
246
  export function writeIndexMirror(hippoRoot, index) {
252
- mirrorBestEffort('index.json', () => fs.writeFileSync(path.join(hippoRoot, 'index.json'), JSON.stringify(index, null, 2), 'utf8'));
247
+ mirrorBestEffort('index.json', () => overwriteInPlace(path.join(hippoRoot, 'index.json'), JSON.stringify(index, null, 2)));
253
248
  }
254
249
  export function writeStatsMirror(hippoRoot, stats) {
255
250
  mirrorBestEffort('stats.json', () => overwriteInPlace(path.join(hippoRoot, 'stats.json'), JSON.stringify(stats, null, 2)));