hippo-memory 1.70.0 → 1.71.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 (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -75,7 +75,8 @@ export interface ApiKeyRecord {
75
75
  /** The api_keys row for `keyId` with its scope grants; null when no row matches. */
76
76
  export declare function readApiKeyRecord(db: DatabaseSyncLike, keyId: string): ApiKeyRecord | null;
77
77
  export declare function validateApiKey(db: DatabaseSyncLike, plaintext: string): ValidateResult;
78
- /** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds a SHA-256 of the token, never the token, and nothing about the key's state. */
78
+ /** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds
79
+ * a SHA-256 of the token, never the token, and nothing about the key's state. */
79
80
  export declare class VerifiedKeyCache {
80
81
  private readonly capacity;
81
82
  private readonly proven;
@@ -86,7 +87,8 @@ export declare class VerifiedKeyCache {
86
87
  }
87
88
  /** A caller's limit on scrypt work, called once per derivation: it may throw to refuse `derive` or hold it in a queue. */
88
89
  type DerivationBound = (keyId: string, derive: () => Promise<Buffer>) => Promise<Buffer>;
89
- /** Verify a bearer API key against `store`, null when invalid. The key's row is read on every call, so a revoke, expiry, role or scope change by any process applies on the next one. */
90
+ /** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
91
+ * call, so a revoke, expiry, role or scope change by any process applies on the next one. */
90
92
  export declare function verifyApiKeyCached(plaintext: string, store: HippoStore, bound?: DerivationBound): Promise<VerifiedApiKey | null>;
91
93
  export declare function revokeApiKey(db: DatabaseSyncLike, keyId: string, at?: string): void;
92
94
  /** Grant `keyId` read access to one restricted `scope`. Idempotent. */
@@ -99,10 +101,8 @@ export interface ApiKeyListItem {
99
101
  label: string | null;
100
102
  createdAt: string;
101
103
  revokedAt: string | null;
102
- /**
103
- * Authorization role bound to the key, from the `role` column (schema migration v26).
104
- * Fail-safe-to-member cast: any non-'admin' value reads as 'member'.
105
- */
104
+ /** Authorization role from the `role` column (schema migration v26).
105
+ * Fail-safe cast: any non-'admin' value reads as 'member'. */
106
106
  role: 'admin' | 'member';
107
107
  /** Restricted scopes this key may read. */
108
108
  scopes: string[];
@@ -54,9 +54,8 @@ export function mintApiKey() {
54
54
  return { keyId, plaintext, keyHash: hashKey(plaintext) };
55
55
  }
56
56
  export function insertApiKey(db, key) {
57
- // openHippoDb runs runMigrations synchronously before returning the db handle,
58
- // so migration v26 (adds role column) is in place before this INSERT runs.
59
- // An older binary ignores expires_at and would honour an expired key, so the store shuts it out before the first one exists.
57
+ // Migration v26 (role column) has already run; an older binary ignores expires_at and would honour an expired key,
58
+ // so the store shuts it out before the first one exists.
60
59
  if (key.expiresAt !== null)
61
60
  raiseMinBinary(db, EXPIRING_KEYS_MIN_BINARY);
62
61
  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);
@@ -71,9 +70,8 @@ export function createApiKey(db, opts) {
71
70
  }
72
71
  /** The api_keys row for `keyId` with its scope grants; null when no row matches. */
73
72
  export function readApiKeyRecord(db, keyId) {
74
- // SAFETY: row comes from the SELECT above, which projects exactly
75
- // key_hash, tenant_id, revoked_at, role, expires_at, owner_subject; `.get` returns undefined when no
76
- // row matches key_id.
73
+ // SAFETY: row comes from the SELECT above, which projects exactly key_hash, tenant_id, revoked_at, role, expires_at, owner_subject;
74
+ // `.get` returns undefined when no row matches key_id.
77
75
  const row = db
78
76
  .prepare(`SELECT key_hash, tenant_id, revoked_at, role, expires_at, owner_subject FROM api_keys WHERE key_id = ?`)
79
77
  .get(keyId);
@@ -84,7 +82,8 @@ export function readApiKeyRecord(db, keyId) {
84
82
  expiresAt: row.expires_at, ownerSubject: row.owner_subject,
85
83
  };
86
84
  }
87
- /** When a key stops working, in epoch ms: Infinity for null, and already past for a missing field (a store that predates expiry) or a stamp that does not parse, so both fail closed. */
85
+ /** When a key stops working, in epoch ms: Infinity for null, and already past for a missing
86
+ * field (a store that predates expiry) or a stamp that does not parse, so both fail closed. */
88
87
  function keyExpiryMs(expiresAt) {
89
88
  if (expiresAt === null)
90
89
  return Infinity;
@@ -130,7 +129,8 @@ const VERIFIED_KEY_CACHE_CAP = 1_000;
130
129
  function secretDigest(plaintext) {
131
130
  return createHash('sha256').update(plaintext).digest();
132
131
  }
133
- /** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds a SHA-256 of the token, never the token, and nothing about the key's state. */
132
+ /** LRU of the tokens that matched a stored key hash, so a repeat skips scrypt. Holds
133
+ * a SHA-256 of the token, never the token, and nothing about the key's state. */
134
134
  export class VerifiedKeyCache {
135
135
  capacity;
136
136
  // 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.
@@ -192,7 +192,8 @@ async function secretMatches(keyId, plaintext, keyHash, bound) {
192
192
  void check.then(forget, forget);
193
193
  return check;
194
194
  }
195
- /** Verify a bearer API key against `store`, null when invalid. The key's row is read on every call, so a revoke, expiry, role or scope change by any process applies on the next one. */
195
+ /** Verify a bearer API key against `store`, null when invalid. The key's row is read on every
196
+ * call, so a revoke, expiry, role or scope change by any process applies on the next one. */
196
197
  export async function verifyApiKeyCached(plaintext, store, bound) {
197
198
  const keyId = mintedKeyId(plaintext);
198
199
  if (keyId === null)
@@ -1,4 +1,4 @@
1
- import { type MemoryEntry } from '../core/memory.js';
1
+ import { type MemoryEntry, type ConfidenceLevel, Layer } from '../core/memory.js';
2
2
  import { type SqlFragment } from './recall-scope.js';
3
3
  export interface AmbientRecallRequest {
4
4
  terms: string[];
@@ -32,8 +32,8 @@ export declare function loadContextCandidates(hippoRoot: string, tenantId: strin
32
32
  export type HeldText = Pick<MemoryEntry, 'content' | 'source' | 'origin_project'>;
33
33
  /** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
34
34
  export declare const EVERY_SCOPE: SqlFragment;
35
- /** Text, source and origin of tenant rows holding any of `words` that `admit` passes, by default the team-visible ones; a row equal to a text apart from spacing holds its every word.
36
- * With `project`, only rows carrying one of those names and user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
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. */
37
37
  export declare function loadTextsHoldingWords(hippoRoot: string, tenantId: string | undefined, words: readonly string[], project?: readonly string[], admit?: SqlFragment): HeldText[];
38
38
  /** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
39
39
  export declare function loadNewestEntries(hippoRoot: string, tenantId: string, limit: number): MemoryEntry[];
@@ -61,4 +61,21 @@ export interface StrengthTallies {
61
61
  }
62
62
  /** calculateStrength over every row of a tenant in one aggregate pass, no row loaded. */
63
63
  export declare function loadStrengthTallies(hippoRoot: string, tenantId: string, now: Date, atRiskBelow: number): StrengthTallies;
64
+ /** What `hippo status` prints about the whole store: every tenant and superseded rows too. */
65
+ export interface StatusCounts {
66
+ total: number;
67
+ byLayer: Record<Layer, number>;
68
+ byConfidence: Record<ConfidenceLevel, number>;
69
+ pinned: number;
70
+ /** Rows whose strength is under the caller's line; unlike StrengthTallies, pinned rows count. */
71
+ atRisk: number;
72
+ agedOut: number;
73
+ avgStrength: number;
74
+ /** Open conflicts of every tenant, the rows listMemoryConflicts returns when given no tenant. */
75
+ openConflicts: number;
76
+ /** Rows that have a stored vector. */
77
+ embedded: number;
78
+ }
79
+ /** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is built. */
80
+ export declare function loadStatusCounts(hippoRoot: string, now: Date, atRiskBelow: number): StatusCounts;
64
81
  //# sourceMappingURL=candidates.d.ts.map
@@ -1,14 +1,15 @@
1
- import { schemaFitFrom, strengthSql } from '../core/memory.js';
2
- import { closeHippoDb, withReadSnapshot } from '../db/index.js';
1
+ import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom } from '../core/memory.js';
2
+ import { strengthSql } from './rule-sql.js';
3
+ import { withReadSnapshot } from '../db/index.js';
3
4
  import { scopeAdmitSql } from './recall-scope.js';
4
5
  import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
5
- import { openStore } from './open.js';
6
+ import { onHandle, openStore } from './open.js';
6
7
  import { originInSql } from '../core/project-identity.js';
7
8
  import { pickRarestFtsQuery, loadRecallSearchEntriesFromDb } from './search-rows.js';
8
9
  const AMBIENT_SCOPED = 'superseded_by IS NULL AND tenant_id = ?';
9
- /** idx_memories_pinned (db.ts v51) serves it. */
10
+ /** idx_memories_pinned (migration v51) serves it. */
10
11
  const AMBIENT_PINNED_WHERE = `pinned = 1 AND ${AMBIENT_SCOPED} ORDER BY created ASC, id ASC`;
11
- /** idx_memories_created_drift (db.ts v51) serves it. */
12
+ /** idx_memories_created_drift (migration v51) serves it. */
12
13
  const AMBIENT_DRIFT_SQL = `SELECT 1 FROM memories WHERE ${AMBIENT_SCOPED} AND (length(created) <> 24 OR created NOT LIKE '%Z') LIMIT 1`;
13
14
  function inOrigins(e, origins) {
14
15
  const origin = e.origin_project ?? null;
@@ -47,8 +48,7 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
47
48
  // A SQL LIMIT takes an integer; the Array.slice this replaced truncated one,
48
49
  // and include_recent is any non-negative finite number at the HTTP edge.
49
50
  const needed = Math.trunc(recentNeeded);
50
- const db = openStore(hippoRoot);
51
- try {
51
+ return onHandle(hippoRoot, (db) => {
52
52
  // SAFETY: every `where` below starts from MEMORY_SELECT_COLUMNS' table.
53
53
  const run = (where, params) => db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE ${where}`).all(...params).map(rowToEntry);
54
54
  const byId = new Map();
@@ -74,10 +74,7 @@ export function loadAmbientCandidates(hippoRoot, tenantId, recentNeeded, admit,
74
74
  ? loadRecallSearchEntriesFromDb(db, ftsQuery, { limit: recall.limit, tenantId, includeSuperseded: false, ownScope: recall.ownScope })
75
75
  : [];
76
76
  return { entries, recall: recallEntries };
77
- }
78
- finally {
79
- closeHippoDb(db);
80
- }
77
+ }, openStore);
81
78
  }
82
79
  // calculateStrength's decay exponent with its reward factor, pins first: the strongest rows, without scoring each one in JS.
83
80
  const DECAY_RANK_SQL = `pinned DESC,
@@ -102,32 +99,27 @@ export function loadContextCandidates(hippoRoot, tenantId, filter) {
102
99
  where.push(`(origin_project = '' OR ${originInSql(filter.project)})`);
103
100
  params.push(...filter.project);
104
101
  }
105
- const db = openStore(hippoRoot);
106
- try {
102
+ return onHandle(hippoRoot, (db) => {
107
103
  // SAFETY: the outer SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set; the rank sort carries ids only.
108
104
  const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (
109
105
  SELECT id FROM memories WHERE ${where.join(' AND ')} ORDER BY ${DECAY_RANK_SQL} LIMIT ?
110
106
  ) ORDER BY created ASC, id ASC`).all(...params, filter.now.toISOString(), Math.max(0, Math.trunc(filter.cap)));
111
107
  return rows.map(rowToEntry);
112
- }
113
- finally {
114
- closeHippoDb(db);
115
- }
108
+ }, openStore);
116
109
  }
117
110
  // No owner: for session capture, a personal or connector-private row must never stop a team copy being written.
118
111
  const TEAM_VISIBLE = scopeAdmitSql('');
119
112
  /** Admits every scope, for a reader that sees the whole store, such as the CLI on its own machine. */
120
113
  export const EVERY_SCOPE = Object.freeze({ sql: '1', params: [] });
121
- /** Text, source and origin of tenant rows holding any of `words` that `admit` passes, by default the team-visible ones; a row equal to a text apart from spacing holds its every word.
122
- * With `project`, only rows carrying one of those names and user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
114
+ /** 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.
115
+ * With `project`, only rows carrying one of those names plus user-global rows, as loadContextCandidates' filter. No `tenantId` reads every tenant. */
123
116
  export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit = TEAM_VISIBLE) {
124
117
  const unique = [...new Set(words)];
125
118
  const out = [];
126
119
  const tenantWhere = tenantId === undefined ? '1' : 'tenant_id = ?';
127
120
  const tenantParams = tenantId === undefined ? [] : [tenantId];
128
121
  const originWhere = project === undefined ? '' : ` AND (origin_project = '' OR ${originInSql(project)})`;
129
- const db = openStore(hippoRoot);
130
- try {
122
+ return onHandle(hippoRoot, (db) => {
131
123
  // Chunked so one statement stays far under SQLite's bound-parameter limit.
132
124
  for (let i = 0; i < unique.length; i += 200) {
133
125
  const chunk = unique.slice(i, i + 200);
@@ -137,22 +129,15 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
137
129
  out.push({ content: row.content, source: row.source ?? 'cli', origin_project: row.origin_project });
138
130
  }
139
131
  return out;
140
- }
141
- finally {
142
- closeHippoDb(db);
143
- }
132
+ }, openStore);
144
133
  }
145
134
  /** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
146
135
  export function loadNewestEntries(hippoRoot, tenantId, limit) {
147
- const db = openStore(hippoRoot);
148
- try {
136
+ return onHandle(hippoRoot, (db) => {
149
137
  // SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
150
138
  const rows = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE tenant_id = ? ORDER BY created DESC, id DESC LIMIT ?`).all(tenantId, limit);
151
139
  return rows.reverse().map(rowToEntry);
152
- }
153
- finally {
154
- closeHippoDb(db);
155
- }
140
+ }, openStore);
156
141
  }
157
142
  function* contentsOf(rows) {
158
143
  for (const row of rows)
@@ -160,8 +145,7 @@ function* contentsOf(rows) {
160
145
  }
161
146
  /** computeSchemaFit against every row of a tenant: tag counts come from one aggregate and texts stream one column, so no row is loaded. */
162
147
  export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
163
- const db = openStore(hippoRoot);
164
- try {
148
+ return onHandle(hippoRoot, (db) => {
165
149
  // One read transaction, so the row count and the texts come from the same snapshot.
166
150
  return withReadSnapshot(db, () => {
167
151
  // SAFETY: rows' shape matches the two columns named in the SELECT.
@@ -178,23 +162,16 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
178
162
  const texts = db.prepare('SELECT content FROM memories WHERE tenant_id = ?').iterate(tenantId);
179
163
  return schemaFitFrom(content, tags, { rows, tagCounts, contents: contentsOf(texts) });
180
164
  });
181
- }
182
- finally {
183
- closeHippoDb(db);
184
- }
165
+ }, openStore);
185
166
  }
186
167
  /** Row count and newest `created` per source, for peer listings that need no row; all tenants when `tenantId` is absent. */
187
168
  export function tallySources(hippoRoot, tenantId) {
188
- const db = openStore(hippoRoot);
189
- try {
169
+ return onHandle(hippoRoot, (db) => {
190
170
  const where = tenantId !== undefined ? 'WHERE tenant_id = ?' : '';
191
171
  // SAFETY: rows' shape matches the four aliased columns in the SELECT below.
192
172
  return db.prepare(`SELECT COALESCE(source, 'cli') AS source, COUNT(*) AS count, MAX(created) AS latest, MIN(created || char(31) || id) AS first
193
173
  FROM memories ${where} GROUP BY COALESCE(source, 'cli')`).all(...(tenantId !== undefined ? [tenantId] : []));
194
- }
195
- finally {
196
- closeHippoDb(db);
197
- }
174
+ }, openStore);
198
175
  }
199
176
  // A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
200
177
  export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
@@ -202,8 +179,7 @@ export const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_t
202
179
  export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
203
180
  // An unparseable date scores NULL in SQL and 0 in calculateStrength.
204
181
  const strength = `COALESCE(${strengthSql(now)}, 0)`;
205
- const db = openStore(hippoRoot);
206
- try {
182
+ return onHandle(hippoRoot, (db) => {
207
183
  // SAFETY: one aggregate row whose columns are the aliases named below.
208
184
  const row = db.prepare(`SELECT
209
185
  COUNT(*) AS total,
@@ -219,9 +195,62 @@ export function loadStrengthTallies(hippoRoot, tenantId, now, atRiskBelow) {
219
195
  strengthSum: Number(row.strengthSum),
220
196
  atRisk: Number(row.atRisk),
221
197
  };
198
+ }, openStore);
199
+ }
200
+ // What calculateStrength and facetsOf read, plus the layer: no text and no JSON column.
201
+ const STATUS_ROW_COLUMNS = [
202
+ 'layer', 'confidence', 'pinned', 'created', 'last_retrieved', 'half_life_days', 'retrieval_count',
203
+ 'emotional_valence', 'outcome_positive', 'outcome_negative',
204
+ ];
205
+ // Scored in JavaScript, not with strengthSql: SQLite reads fewer date shapes than Date does, so its counts would differ.
206
+ function tallyStatusRows(rows, now, atRiskBelow) {
207
+ const byLayer = { [Layer.Buffer]: 0, [Layer.Episodic]: 0, [Layer.Semantic]: 0, [Layer.Trace]: 0 };
208
+ const byConfidence = { verified: 0, observed: 0, inferred: 0, stale: 0 };
209
+ const sums = { total: 0, strength: 0, pinned: 0, atRisk: 0, agedOut: 0 };
210
+ for (const row of rows) {
211
+ // rowToEntry's defaults for these columns, so a row scores as its loaded entry would.
212
+ const entry = {
213
+ pinned: Boolean(row.pinned),
214
+ confidence: row.confidence ?? 'observed',
215
+ created: row.created,
216
+ last_retrieved: row.last_retrieved,
217
+ half_life_days: Number(row.half_life_days ?? FALLBACK_HALF_LIFE_DAYS),
218
+ retrieval_count: Number(row.retrieval_count ?? 0),
219
+ emotional_valence: row.emotional_valence ?? 'neutral',
220
+ outcome_positive: Number(row.outcome_positive ?? 0),
221
+ outcome_negative: Number(row.outcome_negative ?? 0),
222
+ };
223
+ const strength = calculateStrength(entry, now);
224
+ const facets = facetsOf(entry, now);
225
+ sums.total++;
226
+ sums.strength += strength;
227
+ byLayer[row.layer] = (byLayer[row.layer] ?? 0) + 1;
228
+ byConfidence[facets.tier] = (byConfidence[facets.tier] ?? 0) + 1;
229
+ if (entry.pinned)
230
+ sums.pinned++;
231
+ if (strength < atRiskBelow)
232
+ sums.atRisk++;
233
+ if (facets.agedOut)
234
+ sums.agedOut++;
222
235
  }
223
- finally {
224
- closeHippoDb(db);
225
- }
236
+ const { total, pinned, atRisk, agedOut } = sums;
237
+ return { total, byLayer, byConfidence, pinned, atRisk, agedOut, avgStrength: total > 0 ? sums.strength / total : 0 };
238
+ }
239
+ /** The counts `hippo status` prints, from one pass over ten narrow columns: no text is read and no row array is built. */
240
+ export function loadStatusCounts(hippoRoot, now, atRiskBelow) {
241
+ return onHandle(hippoRoot, (db) => {
242
+ // One read transaction, so the row tallies and the two counts describe the same store.
243
+ return withReadSnapshot(db, () => {
244
+ // loadAllEntries' order, so the strengths add up in the order they did and the average rounds the same.
245
+ // SAFETY: the SELECT names exactly StatusRow's columns, and the store writes `layer` only from the Layer enum.
246
+ const rows = db.prepare(`SELECT ${STATUS_ROW_COLUMNS.join(', ')} FROM memories ORDER BY created ASC, id ASC`).iterate();
247
+ const tallies = tallyStatusRows(rows, now, atRiskBelow);
248
+ // SAFETY: one row whose columns are the two aliases named below.
249
+ const counts = db.prepare(`SELECT
250
+ (SELECT COUNT(*) FROM memory_conflicts WHERE status = 'open') AS openConflicts,
251
+ (SELECT COUNT(*) FROM memory_vectors WHERE memory_id IN (SELECT id FROM memories)) AS embedded`).get();
252
+ return { ...tallies, openConflicts: Number(counts.openConflicts), embedded: Number(counts.embedded) };
253
+ });
254
+ }, openStore);
226
255
  }
227
256
  //# sourceMappingURL=candidates.js.map
@@ -9,6 +9,7 @@ export interface CardDetail {
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); 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);
13
+ * five separate reads, so a write landing between them can show a mixed view, as `card show` always could. */
13
14
  export declare function loadCardDetail(hippoRoot: string, tenantId: string, id: string): CardDetail | null;
14
15
  //# sourceMappingURL=card-detail.d.ts.map
@@ -1,5 +1,6 @@
1
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); five separate reads, so a write landing between them can show a mixed view, as `card show` always could. */
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. */
3
4
  export function loadCardDetail(hippoRoot, tenantId, id) {
4
5
  const card = loadCard(hippoRoot, tenantId, id);
5
6
  if (!card)
@@ -1,4 +1,3 @@
1
- import { type DatabaseSyncLike } from '../db/index.js';
2
1
  import { SessionHandoff, HandoffOutcome } from '../core/handoff.js';
3
2
  import { Card, CardStatus, CardRun, CardComment } from '../core/card.js';
4
3
  export interface TransitionCardOptions {
@@ -10,8 +9,8 @@ export interface TransitionCardOptions {
10
9
  params?: unknown[];
11
10
  };
12
11
  }
13
- export declare function transitionCard(db: DatabaseSyncLike, tenantId: string, cardId: string, options: TransitionCardOptions): number;
14
- /** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog. An unknown dependsOn id throws and commits nothing. A repeated dependsOn id is recorded once. */
12
+ /** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog.
13
+ * An unknown dependsOn id throws and commits nothing. A repeated dependsOn id is recorded once. */
15
14
  export declare function createCard(hippoRoot: string, tenantId: string, input: {
16
15
  title: string;
17
16
  repo?: string;
@@ -36,22 +35,28 @@ export declare function loadCardRuns(hippoRoot: string, tenantId: string, id: st
36
35
  export declare function loadCardComments(hippoRoot: string, tenantId: string, id: string): CardComment[];
37
36
  /** Read side of the card <-> handoff round trip: the newest handoff filed against this card. */
38
37
  export declare function loadLatestHandoffForCard(hippoRoot: string, tenantId: string, cardId: string): SessionHandoff | null;
39
- /** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id; 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. */
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. */
40
40
  export declare function claimCard(hippoRoot: string, tenantId: string, id: string, runtime: string, sessionId?: string): (Card & {
41
41
  runId: number;
42
42
  }) | 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 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. */
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. */
44
45
  export declare function heartbeatCard(hippoRoot: string, tenantId: string, id: string, runId: number): Card | null;
45
- /** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
46
+ /** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
47
+ * card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
46
48
  export declare function blockCard(hippoRoot: string, tenantId: string, id: string, reason: string, runId?: number): Card | null;
47
- /** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card not running. */
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. */
48
51
  export declare function reviewCard(hippoRoot: string, tenantId: string, id: string, runId?: number): Card | null;
49
- /** Requires the card be in review; closes the live run with outcome. Outcome 'success' moves the card to done and, in the same transaction, promotes any child whose parents are now all done; 'failure' or 'partial' moves it to shelved and promotes nothing. Throws on an unknown card id; returns null for a card not in review. When runId is given, returns null unless it is the card's live run. */
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. */
50
54
  export declare function completeCard(hippoRoot: string, tenantId: string, id: string, outcome: HandoffOutcome, runId?: number): {
51
55
  card: Card;
52
56
  promotedChildren: string[];
53
57
  } | null;
54
- /** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card ids in id order. */
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. */
55
60
  export declare function reclaimExpiredCards(hippoRoot: string, tenantId: string): string[];
56
61
  /** Appends a comment to cardId in any card status; throws if cardId is not a card of this tenant. */
57
62
  export declare function addCardComment(hippoRoot: string, tenantId: string, cardId: string, author: string, body: string): CardComment;