hippo-memory 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -10,6 +10,16 @@ export const API_KEY_PREFIX = 'hk_';
10
10
  const ID_LEN = 24; // base32 chars after prefix
11
11
  const SECRET_LEN = 32; // base32 chars after dot
12
12
  const SCRYPT_KEYLEN = 32;
13
+ // Node's defaults, written out so a hash states the cost it was made with.
14
+ const SCRYPT_N = 16384;
15
+ const SCRYPT_R = 8;
16
+ const SCRYPT_P = 1;
17
+ const SCRYPT_MAXMEM = 64 * 1024 * 1024;
18
+ // A stored row must not be able to make verify hang or exhaust memory.
19
+ const SCRYPT_MAX_N = 2 ** 20;
20
+ const SCRYPT_MAX_R = 32;
21
+ const SCRYPT_MAX_P = 16;
22
+ const DEFAULT_SCRYPT = { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P, maxmem: SCRYPT_MAXMEM };
13
23
  const BASE32 = 'abcdefghijklmnopqrstuvwxyz234567';
14
24
  const MINTED_KEY_PATTERN = new RegExp(`^${API_KEY_PREFIX}[a-z2-7]{${ID_LEN}}\\.[a-z2-7]{${SECRET_LEN}}$`);
15
25
  function randBase32(n) {
@@ -20,24 +30,41 @@ function randBase32(n) {
20
30
  return out;
21
31
  }
22
32
  function hashKey(plaintext) {
23
- // Format: scrypt$<saltHex>$<hashHex>
33
+ // Format: scrypt2$<N>$<r>$<p>$<saltHex>$<hashHex>
24
34
  const salt = randomBytes(16);
25
- const hash = scryptSync(plaintext, salt, SCRYPT_KEYLEN);
26
- return `scrypt$${salt.toString('hex')}$${hash.toString('hex')}`;
35
+ const hash = scryptSync(plaintext, salt, SCRYPT_KEYLEN, DEFAULT_SCRYPT);
36
+ return `scrypt2$${SCRYPT_N}$${SCRYPT_R}$${SCRYPT_P}$${salt.toString('hex')}$${hash.toString('hex')}`;
27
37
  }
28
38
  const verifyStats = { storeLookups: 0, scryptRuns: 0 };
29
39
  export function apiKeyVerifyStats() {
30
40
  return { ...verifyStats };
31
41
  }
32
- /** Null when `stored` has another shape. */
42
+ function validCost(n, r, p) {
43
+ const powerOfTwo = Number.isInteger(n) && n >= 2 && (n & (n - 1)) === 0;
44
+ return powerOfTwo && n <= SCRYPT_MAX_N && Number.isInteger(r) && r >= 1 && r <= SCRYPT_MAX_R
45
+ && Number.isInteger(p) && p >= 1 && p <= SCRYPT_MAX_P && 128 * n * r <= SCRYPT_MAXMEM;
46
+ }
47
+ /** Null when `stored` has another shape or asks for more work than a verify may do. */
33
48
  function storedScrypt(stored) {
34
49
  const parts = stored.split('$');
35
- if (parts.length !== 3 || parts[0] !== 'scrypt')
50
+ let params = DEFAULT_SCRYPT;
51
+ if (parts.length !== 3 && parts.length !== 6)
52
+ return null;
53
+ const hashHex = parts[parts.length - 1];
54
+ const saltHex = parts[parts.length - 2];
55
+ if (parts.length === 3 && parts[0] !== 'scrypt')
36
56
  return null;
37
- const expected = Buffer.from(parts[2], 'hex');
57
+ if (parts.length === 6) {
58
+ const [n, r, p] = [Number(parts[1]), Number(parts[2]), Number(parts[3])];
59
+ if (parts[0] !== 'scrypt2' || !validCost(n, r, p))
60
+ return null;
61
+ params = { N: n, r, p, maxmem: SCRYPT_MAXMEM };
62
+ }
63
+ const expected = Buffer.from(hashHex, 'hex');
38
64
  return {
39
- salt: Buffer.from(parts[1], 'hex'),
65
+ salt: Buffer.from(saltHex, 'hex'),
40
66
  keylen: expected.length,
67
+ params,
41
68
  matches: (derived) => expected.length === derived.length && timingSafeEqual(expected, derived),
42
69
  };
43
70
  }
@@ -46,7 +73,7 @@ function verifyKey(plaintext, stored) {
46
73
  if (!parsed)
47
74
  return false;
48
75
  verifyStats.scryptRuns++;
49
- return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen));
76
+ return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen, parsed.params));
50
77
  }
51
78
  const scryptOffLoop = promisify(scrypt);
52
79
  /** Days a key lives when its mint names no expiry, so a key nobody remembers stops working by itself. */
@@ -61,28 +88,40 @@ export function insertApiKey(db, key) {
61
88
  // so the store shuts it out before the first one exists.
62
89
  if (key.expiresAt !== null)
63
90
  raiseMinBinary(db, EXPIRING_KEYS_MIN_BINARY);
64
- db.prepare(`INSERT INTO api_keys (key_id, key_hash, tenant_id, label, created_at, role, owner_subject, expires_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(key.keyId, key.keyHash, key.tenantId, key.label, key.createdAt, key.role, key.ownerSubject, key.expiresAt);
91
+ db.prepare(`INSERT INTO api_keys (key_id, key_hash, tenant_id, label, created_at, role, owner_subject, expires_at) VALUES ` +
92
+ `(?, ?, ?, ?, ?, ?, ?, ?)`).run(key.keyId, key.keyHash, key.tenantId, key.label, key.createdAt, key.role, key.ownerSubject, key.expiresAt);
65
93
  }
66
94
  export function createApiKey(db, opts) {
67
95
  const { keyId, plaintext, keyHash } = mintApiKey();
68
96
  insertApiKey(db, {
69
- keyId, keyHash, tenantId: opts.tenantId, label: opts.label ?? null, role: opts.role ?? 'member', createdAt: new Date().toISOString(),
70
- ownerSubject: opts.ownerSubject ?? null, expiresAt: opts.expiresAt ?? new Date(Date.now() + DEFAULT_KEY_TTL_DAYS * DAY_MS).toISOString(),
97
+ keyId,
98
+ keyHash,
99
+ tenantId: opts.tenantId,
100
+ label: opts.label ?? null,
101
+ role: opts.role ?? 'member',
102
+ createdAt: new Date().toISOString(),
103
+ ownerSubject: opts.ownerSubject ?? null,
104
+ expiresAt: opts.expiresAt ?? new Date(Date.now() + DEFAULT_KEY_TTL_DAYS * DAY_MS).toISOString(),
71
105
  });
72
106
  return { keyId, plaintext };
73
107
  }
74
108
  /** The api_keys row for `keyId` with its scope grants; null when no row matches. */
75
109
  export function readApiKeyRecord(db, keyId) {
76
- // SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at, owner_subject;
77
- // `.get` returns undefined when no row matches key_id.
110
+ // SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at,
111
+ // owner_subject; `.get` returns undefined when no row matches key_id.
78
112
  const row = db
79
113
  .prepare(`SELECT key_hash, tenant_id, revoked_at, role, expires_at, owner_subject FROM api_keys WHERE key_id = ?`)
80
114
  .get(keyId);
81
115
  if (!row)
82
116
  return null;
83
117
  return {
84
- keyHash: row.key_hash, tenantId: row.tenant_id, revokedAt: row.revoked_at, role: row.role, scopes: listScopeGrants(db, keyId),
85
- expiresAt: row.expires_at, ownerSubject: row.owner_subject,
118
+ keyHash: row.key_hash,
119
+ tenantId: row.tenant_id,
120
+ revokedAt: row.revoked_at,
121
+ role: row.role,
122
+ scopes: listScopeGrants(db, keyId),
123
+ expiresAt: row.expires_at,
124
+ ownerSubject: row.owner_subject,
86
125
  };
87
126
  }
88
127
  /** When a key stops working, in epoch ms: Infinity for null, and already past for a missing
@@ -101,7 +140,8 @@ function mintedKeyId(plaintext) {
101
140
  }
102
141
  /** True for a record that is present, unrevoked and unexpired, before any secret check. */
103
142
  function isUsable(record, now) {
104
- // Ids are 120 random bits and not secret, so padding the miss path with scrypt hid nothing and let junk tokens burn CPU.
143
+ // Ids are 120 random bits and not secret, so padding the miss path with scrypt hid nothing and let junk tokens burn
144
+ // CPU.
105
145
  if (!record)
106
146
  return false;
107
147
  return !record.revokedAt && now < keyExpiryMs(record.expiresAt);
@@ -136,7 +176,8 @@ function secretDigest(plaintext) {
136
176
  * a SHA-256 of the token, never the token, and nothing about the key's state. */
137
177
  export class VerifiedKeyCache {
138
178
  capacity;
139
- // Keyed on the stored hash, so a rotated or re-minted key never meets an old entry; Map order makes the first key the least recent.
179
+ // Keyed on the stored hash, so a rotated or re-minted key never meets an old entry; Map order makes the first key the
180
+ // least recent.
140
181
  proven = new Map();
141
182
  constructor(capacity) {
142
183
  this.capacity = capacity;
@@ -166,7 +207,8 @@ export class VerifiedKeyCache {
166
207
  const verifiedKeys = new VerifiedKeyCache(VERIFIED_KEY_CACHE_CAP);
167
208
  // By stored hash and token, so a burst of requests with one unproved key derives once and is charged once.
168
209
  const checksInFlight = new Map();
169
- /** Whether `plaintext` is the secret `keyHash` was minted from: a proved token skips scrypt, any other derives on the thread pool. */
210
+ /** Whether `plaintext` is the secret `keyHash` was minted from: a proved token skips scrypt, any other derives on the
211
+ * thread pool. */
170
212
  async function secretMatches(keyId, plaintext, keyHash, bound) {
171
213
  if (verifiedKeys.has(keyHash, plaintext))
172
214
  return true;
@@ -179,7 +221,7 @@ async function secretMatches(keyId, plaintext, keyHash, bound) {
179
221
  return running;
180
222
  const derive = () => {
181
223
  verifyStats.scryptRuns++;
182
- return scryptOffLoop(plaintext, parsed.salt, parsed.keylen);
224
+ return scryptOffLoop(plaintext, parsed.salt, parsed.keylen, parsed.params);
183
225
  };
184
226
  const check = (bound ? bound(keyId, derive) : derive()).then((derived) => {
185
227
  const matched = parsed.matches(derived);
@@ -283,7 +325,8 @@ export function listApiKeys(hippoRoot, opts) {
283
325
  export function listLiveOwnedKeyIds(db, tenantId, ownerSubject, now) {
284
326
  // SAFETY: the SELECT names exactly these two columns.
285
327
  const rows = db
286
- .prepare(`SELECT key_id, expires_at FROM api_keys WHERE tenant_id = ? AND owner_subject = ? AND revoked_at IS NULL ORDER BY id`)
328
+ .prepare(`SELECT key_id, expires_at FROM api_keys WHERE tenant_id = ? AND owner_subject = ? AND revoked_at IS NULL ` +
329
+ `ORDER BY id`)
287
330
  .all(tenantId, ownerSubject);
288
331
  // Expiry is filtered here, not in SQL, so it follows the same Date.parse rule the key check uses.
289
332
  return rows.filter((r) => now < keyExpiryMs(r.expires_at)).map((r) => r.key_id);
@@ -0,0 +1,9 @@
1
+ export declare const STORE_BUSY_MESSAGE = "store busy (another hippo process holds the write lock); retry shortly";
2
+ /** A store behind the port throws this when its lock wait runs
3
+ * out, so the server answers 503 as it does for a busy hippo.db. */
4
+ export declare class StoreBusyError extends Error {
5
+ constructor(message?: string, options?: ErrorOptions);
6
+ }
7
+ /** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
8
+ export declare function isStoreBusy<E>(error: E): boolean;
9
+ //# sourceMappingURL=busy.d.ts.map
@@ -0,0 +1,16 @@
1
+ // The busy half of the store port, apart from port.ts so that file stays under the size gate.
2
+ import { isSqliteBusy } from '../db/busy.js';
3
+ export const STORE_BUSY_MESSAGE = 'store busy (another hippo process holds the write lock); retry shortly';
4
+ /** A store behind the port throws this when its lock wait runs
5
+ * out, so the server answers 503 as it does for a busy hippo.db. */
6
+ export class StoreBusyError extends Error {
7
+ constructor(message = STORE_BUSY_MESSAGE, options) {
8
+ super(message, options);
9
+ this.name = 'StoreBusyError';
10
+ }
11
+ }
12
+ /** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
13
+ export function isStoreBusy(error) {
14
+ return error instanceof StoreBusyError || isSqliteBusy(error);
15
+ }
16
+ //# sourceMappingURL=busy.js.map
@@ -1,4 +1,5 @@
1
1
  import { type MemoryEntry, type ConfidenceLevel, Layer } from '../core/memory.js';
2
+ import { type DatabaseSyncLike } from '../db/index.js';
2
3
  import { type SqlFragment } from './rule-sql.js';
3
4
  export interface AmbientRecallRequest {
4
5
  terms: string[];
@@ -32,10 +33,12 @@ export declare function loadContextCandidates(hippoRoot: string, tenantId: strin
32
33
  export type HeldText = Pick<MemoryEntry, 'content' | 'source' | 'origin_project'>;
33
34
  /** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
34
35
  export declare const EVERY_SCOPE: SqlFragment;
35
- /** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from spacing holds its every word.
36
- * With `project`, only rows carrying one of those names plus user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
36
+ /** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
37
+ * spacing holds its every word. With `project`, only rows carrying one of those names plus user-global rows, as
38
+ * loadContextCandidates' filter. No `tenantId` reads every tenant. */
37
39
  export declare function loadTextsHoldingWords(hippoRoot: string, tenantId: string | undefined, words: readonly string[], project?: readonly string[], admit?: SqlFragment): HeldText[];
38
- /** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
40
+ /** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
41
+ * it. */
39
42
  export declare function loadNewestEntries(hippoRoot: string, tenantId: string, limit: number): MemoryEntry[];
40
43
  /** computeSchemaFit against a tenant's newest SCHEMA_FIT_WINDOW_ROWS rows: tag counts come from one aggregate
41
44
  * and texts stream one column, so no row is loaded. */
@@ -47,7 +50,8 @@ export interface SourceTally {
47
50
  /** `created`, a unit separator, then `id` of the source's first row in loadAllEntries' order. */
48
51
  first: string;
49
52
  }
50
- /** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is absent. */
53
+ /** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
54
+ * absent. */
51
55
  export declare function tallySources(hippoRoot: string, tenantId?: string): SourceTally[];
52
56
  export declare const jsonList: (column: string) => string;
53
57
  /** Whole-tenant health numbers: every row counts, superseded and archived ones too. */
@@ -62,6 +66,8 @@ export interface StrengthTallies {
62
66
  }
63
67
  /** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
64
68
  export declare function loadStrengthTallies(hippoRoot: string, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
69
+ /** loadStrengthTallies on a handle the caller holds, so it can share a snapshot with other reads. */
70
+ export declare function strengthTalliesAt(db: DatabaseSyncLike, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
65
71
  /** What `hippo status` prints about the whole store: every tenant and superseded rows too. */
66
72
  export interface StatusCounts {
67
73
  total: number;
@@ -77,6 +83,7 @@ export interface StatusCounts {
77
83
  /** Rows that have a stored vector. */
78
84
  embedded: number;
79
85
  }
80
- /** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is built. */
86
+ /** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
87
+ * built. */
81
88
  export declare function loadStatusCounts(hippoRoot: string, now: Date, atRiskBelow: number): StatusCounts;
82
89
  //# sourceMappingURL=candidates.d.ts.map
@@ -1,4 +1,4 @@
1
- import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom } from '../core/memory.js';
1
+ import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom, } from '../core/memory.js';
2
2
  import { strengthSql } from './rule-sql.js';
3
3
  import { withReadSnapshot } from '../db/index.js';
4
4
  import { rewardFactorSql, scopeAdmitSql } from './rule-sql.js';
@@ -24,9 +24,14 @@ function loadRecentRows(run, drifted, tenantId, options) {
24
24
  const { needed, admit, origins } = options;
25
25
  const keep = origins ? (e) => admit(e) && inOrigins(e, origins) : admit;
26
26
  const window = Math.max(needed * 4, 32);
27
- const originSql = origins && (origins.userGlobal ? `(origin_project = '' OR ${originInSql(origins.names)})` : originInSql(origins.names));
28
- const own = { where: originSql ? `${AMBIENT_SCOPED} AND ${originSql}` : AMBIENT_SCOPED, params: [tenantId, ...(origins?.names ?? [])] };
29
- // Text order is chronological only for standard UTC ISO (memory.ts), so a drifted store is read whole and re-sorted downstream.
27
+ const originSql = origins &&
28
+ (origins.userGlobal ? `(origin_project = '' OR ${originInSql(origins.names)})` : originInSql(origins.names));
29
+ const own = {
30
+ where: originSql ? `${AMBIENT_SCOPED} AND ${originSql}` : AMBIENT_SCOPED,
31
+ params: [tenantId, ...(origins?.names ?? [])],
32
+ };
33
+ // Text order is chronological only for standard UTC ISO (memory.ts), so a drifted store is read whole and re-sorted
34
+ // downstream.
30
35
  if (drifted)
31
36
  return run(`${own.where} ${NEWEST}`, [...own.params]).filter(keep);
32
37
  let read = run(`${AMBIENT_SCOPED} ${NEWEST} LIMIT ?`, [tenantId, window]);
@@ -41,12 +46,19 @@ function loadRecentRows(run, drifted, tenantId, options) {
41
46
  }
42
47
  return [...kept, ...keptPastWindow(run, own, read, needed - kept.length, keep)];
43
48
  }
44
- // A window of refused rows can hide older ones, so read on in keyset pages, each four times the last, until enough are kept.
49
+ // A window of refused rows can hide older ones, so read on in keyset pages, each four times the last, until enough are
50
+ // kept.
45
51
  function keptPastWindow(run, own, read, wanted, keep) {
46
52
  const out = [];
47
53
  let last = read[read.length - 1];
48
54
  for (let size = read.length * 4; out.length < wanted; size *= 4) {
49
- const page = run(`${own.where} AND created <= ? AND (created < ? OR id < ?) ${NEWEST} LIMIT ?`, [...own.params, last.created, last.created, last.id, size]);
55
+ const page = run(`${own.where} AND created <= ? AND (created < ? OR id < ?) ${NEWEST} LIMIT ?`, [
56
+ ...own.params,
57
+ last.created,
58
+ last.created,
59
+ last.id,
60
+ size,
61
+ ]);
50
62
  out.push(...page.filter(keep));
51
63
  if (page.length < size)
52
64
  break;
@@ -83,13 +95,18 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
83
95
  return { entries };
84
96
  const ftsQuery = pickRarestFtsQuery(db, recall.terms);
85
97
  const recallEntries = ftsQuery
86
- ? loadRecallSearchEntriesFromDb(db, ftsQuery, { limit: recall.limit, tenantId, includeSuperseded: false, ownScope: recall.ownScope })
98
+ ? loadRecallSearchEntriesFromDb(db, ftsQuery, {
99
+ limit: recall.limit,
100
+ tenantId,
101
+ includeSuperseded: false,
102
+ ownScope: recall.ownScope,
103
+ })
87
104
  : [];
88
105
  return { entries, recall: recallEntries };
89
106
  }, openStore);
90
107
  }
91
- // calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one in JS.
92
- // A function, not a constant, so the outcome-slow ablation is read per query as strengthSql reads it.
108
+ // calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one
109
+ // in JS. A function, not a constant, so the outcome-slow ablation is read per query as strengthSql reads it.
93
110
  const decayRankSql = () => `pinned DESC,
94
111
  CASE WHEN half_life_days > 0 THEN (julianday(?) - julianday(last_retrieved))
95
112
  / (half_life_days * ${rewardFactorSql()}) END ASC NULLS LAST,
@@ -117,14 +134,16 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
117
134
  // SAFETY: the count row has the one column named.
118
135
  const matched = db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE ${whereSql}`).get(...params).n;
119
136
  // Under the cap every match is returned, so the per-row decay math and the sort are skipped.
120
- // SHORTCUT: past the cap the rank still scans the tenant; a stored decay rank column needs a schema migration, held until one is approved.
137
+ // SHORTCUT: past the cap the rank still scans the tenant; a stored decay rank column needs a schema migration,
138
+ // held until one is approved.
121
139
  const ranked = matched > cap;
122
140
  const sql = ranked
123
141
  ? `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (
124
142
  SELECT id FROM memories WHERE ${whereSql} ORDER BY ${decayRankSql()} LIMIT ?
125
143
  ) ORDER BY created ASC, id ASC`
126
144
  : `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE ${whereSql} ORDER BY created ASC, id ASC`;
127
- // SAFETY: both SELECTs name exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set; the rank sort carries ids only.
145
+ // SAFETY: both SELECTs name exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set; the rank sort carries
146
+ // ids only.
128
147
  const rows = db.prepare(sql).all(...params, ...(ranked ? [filter.now.toISOString(), cap] : []));
129
148
  return rows.map(rowToEntry);
130
149
  }, openStore);
@@ -133,8 +152,9 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
133
152
  const TEAM_VISIBLE = scopeAdmitSql('');
134
153
  /** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
135
154
  export const EVERY_SCOPE = Object.freeze({ sql: '1', params: [] });
136
- /** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from spacing holds its every word.
137
- * With `project`, only rows carrying one of those names plus user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
155
+ /** Tenant rows holding any of `words` that `admit` passes (default: team-visible); a row equal to a text apart from
156
+ * spacing holds its every word. With `project`, only rows carrying one of those names plus user-global rows, as
157
+ * loadContextCandidates' filter. No `tenantId` reads every tenant. */
138
158
  export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit = TEAM_VISIBLE) {
139
159
  const unique = [...new Set(words)];
140
160
  const out = [];
@@ -146,15 +166,21 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
146
166
  for (let i = 0; i < unique.length; i += 200) {
147
167
  const chunk = unique.slice(i, i + 200);
148
168
  // SAFETY: rows' shape matches the three columns named in the SELECT below.
149
- const rows = db.prepare(`SELECT content, source, origin_project FROM memories WHERE ${tenantWhere}${originWhere} AND ${admit.sql} AND (${chunk.map(() => 'instr(content, ?) ' +
150
- '> 0').join(' OR ')})`).all(...tenantParams, ...(project ?? []), ...admit.params, ...chunk);
151
- for (const row of rows)
169
+ const rows = db
170
+ .prepare(`SELECT content, source, origin_project FROM memories WHERE ${tenantWhere}${originWhere} AND ` +
171
+ `${admit.sql} AND (${chunk
172
+ .map(() => 'instr(content, ?) ' + '> 0')
173
+ .join(' OR ')})`)
174
+ .all(...tenantParams, ...(project ?? []), ...admit.params, ...chunk);
175
+ for (const row of rows) {
152
176
  out.push({ content: row.content, source: row.source ?? 'cli', origin_project: row.origin_project });
177
+ }
153
178
  }
154
179
  return out;
155
180
  }, openStore);
156
181
  }
157
- /** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
182
+ /** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before
183
+ * it. */
158
184
  export function loadNewestEntries(hippoRoot, tenantId, limit) {
159
185
  return onHandle(hippoRoot, (db) => {
160
186
  // SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
@@ -176,7 +202,9 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
176
202
  // One read transaction, so the row count and the texts come from the same snapshot.
177
203
  return withReadSnapshot(db, () => {
178
204
  // SAFETY: rows' shape matches the two columns named in the SELECT.
179
- const groups = db.prepare(`SELECT tags_json, COUNT(*) AS n FROM (${newest}) GROUP BY tags_json`).all(tenantId, SCHEMA_FIT_WINDOW_ROWS);
205
+ const groups = db
206
+ .prepare(`SELECT tags_json, COUNT(*) AS n FROM (${newest}) GROUP BY tags_json`)
207
+ .all(tenantId, SCHEMA_FIT_WINDOW_ROWS);
180
208
  let rows = 0;
181
209
  const tagCounts = new Map();
182
210
  for (const group of groups) {
@@ -187,51 +215,61 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
187
215
  // SHORTCUT: only the newest SCHEMA_FIT_WINDOW_ROWS rows count, so older tags drop out;
188
216
  // a stored per-tenant tag and token tally is the upgrade.
189
217
  // SAFETY: the SELECT names exactly the one column read.
190
- const texts = db.prepare(`SELECT content FROM (${newest})`)
218
+ const texts = db
219
+ .prepare(`SELECT content FROM (${newest})`)
191
220
  .iterate(tenantId, SCHEMA_FIT_WINDOW_ROWS);
192
221
  return schemaFitFrom(content, tags, { rows, tagCounts, contents: contentsOf(texts) });
193
222
  });
194
223
  }, openStore);
195
224
  }
196
- /** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is absent. */
225
+ /** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is
226
+ * absent. */
197
227
  export function tallySources(hippoRoot, tenantId) {
198
228
  return onHandle(hippoRoot, (db) => {
199
229
  const where = tenantId !== undefined ? 'WHERE tenant_id = ?' : '';
200
230
  // SAFETY: rows' shape matches the four aliased columns in the SELECT below.
201
- return db.prepare(`SELECT COALESCE(source, 'cli') AS source, COUNT(*) AS count, MAX(created) AS latest, MIN(created || char(31) || id) AS first
202
- FROM memories ${where} GROUP BY COALESCE(source, 'cli')`).all(...(tenantId !== undefined ? [tenantId] : []));
231
+ return db
232
+ .prepare(`SELECT COALESCE(source, 'cli') AS source, COUNT(*) AS count, MAX(created) AS latest, MIN(created || ` +
233
+ `char(31) || id) AS first
234
+ FROM memories ${where} GROUP BY COALESCE(source, 'cli')`)
235
+ .all(...(tenantId !== undefined ? [tenantId] : []));
203
236
  }, openStore);
204
237
  }
205
238
  // A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
206
239
  export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
207
240
  /** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
208
241
  export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
242
+ return onHandle(hippoRoot, (db) => strengthTalliesAt(db, tenantId, now, atRiskBelow), openStore);
243
+ }
244
+ /** loadStrengthTallies on a handle the caller holds, so it can share a snapshot with other reads. */
245
+ export function strengthTalliesAt(db, tenantId, now, atRiskBelow) {
209
246
  // An unparseable date scores NULL in SQL and 0 in calculateStrength.
210
247
  const strength = `COALESCE(${strengthSql(now)}, 0)`;
211
- return onHandle(hippoRoot, (db) => {
212
- // SAFETY: one aggregate row whose columns are the aliases named below.
213
- const row = db.prepare(`SELECT
248
+ // SAFETY: one aggregate row whose columns are the aliases named below.
249
+ const row = db
250
+ .prepare(`SELECT
214
251
  COUNT(*) AS total,
215
252
  COALESCE(SUM(pinned != 0), 0) AS pinned,
216
253
  COALESCE(SUM(EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE value = 'error')), 0) AS errors,
217
254
  COALESCE(SUM(${strength}), 0) AS strengthSum,
218
255
  COALESCE(SUM(COALESCE(pinned, 0) = 0 AND ${strength} < ?), 0) AS atRisk
219
- FROM memories WHERE tenant_id = ?`).get(atRiskBelow, tenantId);
220
- return {
221
- total: Number(row.total),
222
- pinned: Number(row.pinned),
223
- errors: Number(row.errors),
224
- strengthSum: Number(row.strengthSum),
225
- atRisk: Number(row.atRisk),
226
- };
227
- }, openStore);
256
+ FROM memories WHERE tenant_id = ?`)
257
+ .get(atRiskBelow, tenantId);
258
+ return {
259
+ total: Number(row.total),
260
+ pinned: Number(row.pinned),
261
+ errors: Number(row.errors),
262
+ strengthSum: Number(row.strengthSum),
263
+ atRisk: Number(row.atRisk),
264
+ };
228
265
  }
229
266
  // What calculateStrength and facetsOf read, plus the layer: no text and no JSON column.
230
267
  const STATUS_ROW_COLUMNS = [
231
268
  'layer', 'confidence', 'pinned', 'created', 'last_retrieved', 'half_life_days', 'retrieval_count',
232
269
  'emotional_valence', 'outcome_positive', 'outcome_negative',
233
270
  ];
234
- // Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would differ.
271
+ // Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would
272
+ // differ.
235
273
  function tallyStatusRows(rows, now, atRiskBelow) {
236
274
  const byLayer = { [Layer.Buffer]: 0, [Layer.Episodic]: 0, [Layer.Semantic]: 0, [Layer.Trace]: 0 };
237
275
  const byConfidence = { verified: 0, observed: 0, inferred: 0, stale: 0 };
@@ -265,7 +303,8 @@ function tallyStatusRows(rows, now, atRiskBelow) {
265
303
  const { total, pinned, atRisk, agedOut } = sums;
266
304
  return { total, byLayer, byConfidence, pinned, atRisk, agedOut, avgStrength: total > 0 ? sums.strength / total : 0 };
267
305
  }
268
- /** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is built. */
306
+ /** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is
307
+ * built. */
269
308
  export function loadStatusCounts(hippoRoot, now, atRiskBelow) {
270
309
  return onHandle(hippoRoot, (db) => {
271
310
  // One read transaction, so the row tallies and the two counts describe the same store.
@@ -12,6 +12,7 @@ export interface CaptureWriteOpts {
12
12
  /** Called with each captured entry after its write, so the caller can embed it; the store never picks a provider. */
13
13
  readonly onCaptured?: (entry: MemoryEntry) => void;
14
14
  }
15
- /** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside the batch is skipped. */
15
+ /** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
16
+ * the batch is skipped. */
16
17
  export declare function writeCapturedItems(hippoRoot: string, items: readonly CaptureItem[], keys: Set<string>, opts: CaptureWriteOpts): CapturedOutcome[];
17
18
  //# sourceMappingURL=capture-write.d.ts.map
@@ -5,7 +5,8 @@ import { stampOriginProject } from './entry-row.js';
5
5
  import { gatedWrite } from './gated-write.js';
6
6
  import { updateStatsOn } from './index-and-stats.js';
7
7
  import { openStore } from './open.js';
8
- /** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside the batch is skipped. */
8
+ /** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside
9
+ * the batch is skipped. */
9
10
  export function writeCapturedItems(hippoRoot, items, keys, opts) {
10
11
  const db = openStore(hippoRoot);
11
12
  try {
@@ -1,15 +1,15 @@
1
1
  import type { Card, CardComment, CardRun } from '../core/card.js';
2
2
  import type { SessionHandoff } from '../core/handoff.js';
3
- import { loadCardDeps } from './cards.js';
3
+ import { loadCardDepsAt } from './cards.js';
4
4
  /** A card plus everything `hippo card show` prints about it. */
5
5
  export interface CardDetail {
6
6
  card: Card;
7
- deps: ReturnType<typeof loadCardDeps>;
7
+ deps: ReturnType<typeof loadCardDepsAt>;
8
8
  runs: CardRun[];
9
9
  comments: CardComment[];
10
10
  handoff: SessionHandoff | null;
11
11
  }
12
- /** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card);
13
- * five separate reads, so a write landing between them can show a mixed view, as `card show` always could. */
12
+ /** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card), the five
13
+ * reads on one snapshot. */
14
14
  export declare function loadCardDetail(hippoRoot: string, tenantId: string, id: string): CardDetail | null;
15
15
  //# sourceMappingURL=card-detail.d.ts.map
@@ -1,16 +1,23 @@
1
- import { loadCard, loadCardComments, loadCardDeps, loadCardRuns, loadLatestHandoffForCard } from './cards.js';
2
- /** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card);
3
- * five separate reads, so a write landing between them can show a mixed view, as `card show` always could. */
1
+ import { withReadSnapshot } from '../db/index.js';
2
+ import { loadCardCommentsAt, loadCardDepsAt, loadCardRow, loadCardRunsAt, loadLatestHandoffForCardAt, } from './cards.js';
3
+ import { onHandle, openStore } from './open.js';
4
+ import { assertTenantId } from './tenant.js';
5
+ /** Loads the detail behind `hippo card show` and `GET /api/cards/:id` (null when the tenant has no such card), the five
6
+ * reads on one snapshot. */
4
7
  export function loadCardDetail(hippoRoot, tenantId, id) {
5
- const card = loadCard(hippoRoot, tenantId, id);
8
+ assertTenantId('loadCardDetail', tenantId);
9
+ return onHandle(hippoRoot, (db) => withReadSnapshot(db, () => cardDetailAt(db, tenantId, id)), openStore);
10
+ }
11
+ function cardDetailAt(db, tenantId, id) {
12
+ const card = loadCardRow(db, tenantId, id);
6
13
  if (!card)
7
14
  return null;
8
15
  return {
9
16
  card,
10
- deps: loadCardDeps(hippoRoot, tenantId, id),
11
- runs: loadCardRuns(hippoRoot, tenantId, id),
12
- comments: loadCardComments(hippoRoot, tenantId, id),
13
- handoff: loadLatestHandoffForCard(hippoRoot, tenantId, id),
17
+ deps: loadCardDepsAt(db, tenantId, id),
18
+ runs: loadCardRunsAt(db, tenantId, id),
19
+ comments: loadCardCommentsAt(db, tenantId, id),
20
+ handoff: loadLatestHandoffForCardAt(db, tenantId, id),
14
21
  };
15
22
  }
16
23
  //# sourceMappingURL=card-detail.js.map
@@ -1,5 +1,7 @@
1
+ import { type DatabaseSyncLike } from '../db/index.js';
1
2
  import { SessionHandoff, HandoffOutcome } from '../core/handoff.js';
2
3
  import { Card, CardStatus, CardRun, CardComment } from '../core/card.js';
4
+ export declare function loadCardRow(db: DatabaseSyncLike, tenantId: string, id: string): Card | null;
3
5
  export interface TransitionCardOptions {
4
6
  readonly from: CardStatus[];
5
7
  readonly to: CardStatus;
@@ -29,34 +31,46 @@ export declare function loadCardDeps(hippoRoot: string, tenantId: string, id: st
29
31
  parents: string[];
30
32
  children: string[];
31
33
  };
34
+ export declare function loadCardDepsAt(db: DatabaseSyncLike, tenantId: string, id: string): {
35
+ parents: string[];
36
+ children: string[];
37
+ };
32
38
  /** Returns this card's run history, most recent first. */
33
39
  export declare function loadCardRuns(hippoRoot: string, tenantId: string, id: string): CardRun[];
40
+ export declare function loadCardRunsAt(db: DatabaseSyncLike, tenantId: string, id: string): CardRun[];
34
41
  /** Returns this card's comments, most recent first. */
35
42
  export declare function loadCardComments(hippoRoot: string, tenantId: string, id: string): CardComment[];
43
+ export declare function loadCardCommentsAt(db: DatabaseSyncLike, tenantId: string, id: string): CardComment[];
36
44
  /** Read side of the card <-> handoff round trip: the newest handoff filed against this card. */
37
45
  export declare function loadLatestHandoffForCard(hippoRoot: string, tenantId: string, cardId: string): SessionHandoff | null;
38
- /** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id;
39
- * returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new run's id as runId. */
46
+ export declare function loadLatestHandoffForCardAt(db: DatabaseSyncLike, tenantId: string, cardId: string): SessionHandoff | null;
47
+ /** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown
48
+ * card id; returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new
49
+ * run's id as runId. */
40
50
  export declare function claimCard(hippoRoot: string, tenantId: string, id: string, runtime: string, sessionId?: string): (Card & {
41
51
  runId: number;
42
52
  }) | null;
43
- /** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws on an
44
- * unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId is its live run. */
53
+ /** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws
54
+ * on an unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId
55
+ * is its live run. */
45
56
  export declare function heartbeatCard(hippoRoot: string, tenantId: string, id: string, runId: number): Card | null;
46
57
  /** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
47
58
  * card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
48
59
  export declare function blockCard(hippoRoot: string, tenantId: string, id: string, reason: string, runId?: number): Card | null;
49
- /** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is
50
- * given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card not running. */
60
+ /** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When
61
+ * runId is given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card
62
+ * not running. */
51
63
  export declare function reviewCard(hippoRoot: string, tenantId: string, id: string, runId?: number): Card | null;
52
- /** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all done; 'failure'/'partial' shelves it.
53
- * Throws on an unknown card id; returns null for a card not in review, or when `runId` is given and is not the card's live run. */
64
+ /** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all
65
+ * done; 'failure'/'partial' shelves it. Throws on an unknown card id; returns null for a card not in review, or when
66
+ * `runId` is given and is not the card's live run. */
54
67
  export declare function completeCard(hippoRoot: string, tenantId: string, id: string, outcome: HandoffOutcome, runId?: number): {
55
68
  card: Card;
56
69
  promotedChildren: string[];
57
70
  } | null;
58
- /** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live
59
- * run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card ids in id order. */
71
+ /** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes
72
+ * its live run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card
73
+ * ids in id order. */
60
74
  export declare function reclaimExpiredCards(hippoRoot: string, tenantId: string): string[];
61
75
  /** Appends a comment to cardId in any card status; throws if cardId is not a card of this tenant. */
62
76
  export declare function addCardComment(hippoRoot: string, tenantId: string, cardId: string, author: string, body: string): CardComment;