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
@@ -1,50 +1,13 @@
1
1
  import type { MemoryEntry } from '../core/memory.js';
2
- /**
3
- * Mark a summary as dirty. Idempotent (re-marking dirty is a no-op + no
4
- * second audit row). Tenant-scoped to prevent cross-tenant writes via
5
- * parent-lookup. Called from invalidation.ts / writeEntry /
6
- * forgetMemory / archiveRawMemory whenever a child is invalidated,
7
- * superseded, forgotten, or archived.
8
- *
9
- * Quietly no-ops if the target row doesn't exist or isn't a level-2/3
10
- * summary. Emits a 'summary_marked_dirty' audit row on actual
11
- * state transitions (0 -> 1) via the audit() helper, which try/catches
12
- * for missing audit_log (the v27 self-heal scenario).
13
- */
14
- export declare function markSummaryDirty(hippoRoot: string, summaryId: string, tenantId: string, actor?: string): void;
15
- /**
16
- * Host-wide loader for L2 topic summaries without an L3 parent.
17
- * Used by consolidate phase 1.9 (buildEntityProfiles) to cluster L2s into
18
- * L3 entity profiles. Mirrors loadAllDirtySummaries: SQL-level
19
- * filter is cheaper than reusing in-memory `survivors` (which doesn't
20
- * contain L2s freshly created by phase 1.7 buildDag).
21
- *
22
- * Returns entries with tenantId attached so per-cluster writes stay
23
- * tenant-scoped via summary.tenantId.
24
- */
2
+ /** Host-wide loader for L2 topic summaries without an L3 parent, for consolidate phase 1.9 (buildEntityProfiles); SQL-level filter, since in-memory
3
+ * `survivors` lacks L2s created by phase 1.7. Entries carry tenantId so per-cluster writes stay tenant-scoped. */
25
4
  export declare function loadAllL2Summaries(hippoRoot: string): MemoryEntry[];
26
- /**
27
- * Dirty summaries, newest change first. Iterates all tenants
28
- * in one query so consolidate.ts (host-wide per L106-109) does not need a
29
- * per-tenant loop. Each returned MemoryEntry carries its own tenantId (via
30
- * rowToEntry), so per-summary children + rebuild UPDATE stay tenant-scoped.
31
- *
32
- * Sort: latest_at DESC NULLS LAST, id ASC — same as per-tenant variant so
33
- * HIPPO_DAG_REBUILD_CAP takes most-recently-changed summaries first.
34
- */
5
+ /** Dirty summaries across all tenants in one query, newest change first (latest_at DESC NULLS LAST, id ASC) so HIPPO_DAG_REBUILD_CAP takes the most
6
+ * recently changed. Each entry carries its own tenantId so the children read and rebuild UPDATE stay tenant-scoped. */
35
7
  export declare function loadAllDirtySummaries(hippoRoot: string): MemoryEntry[];
36
- /**
37
- * Load live children of a DAG summary. Used by
38
- * rebuildDirtySummaries to regenerate content from the CURRENT child set
39
- * (not the children at create-time). Skips archived. Tenant-scoped
40
- * (defence in depth — dag_parent_id is unique-ish but tenant guard is
41
- * cheap). created column is TEXT NOT NULL since db.ts schema v1.
42
- */
8
+ /** Live (non-archived) children of a DAG summary, so a rebuild regenerates from the CURRENT child set; tenant-scoped as defence in depth. */
43
9
  export declare function loadChildrenOfSummary(hippoRoot: string, summaryId: string, tenantId: string): MemoryEntry[];
44
- /**
45
- * Patch applied by applyRebuildResult. Two-branch shape
46
- * (bumpRebuildCount false for zero-child case, true for normal rebuild).
47
- */
10
+ /** Patch applied by applyRebuildResult; `bumpRebuildCount` is false for the zero-child case, true for a normal rebuild. */
48
11
  export interface RebuildPatch {
49
12
  content: string;
50
13
  descendant_count: number;
@@ -54,28 +17,13 @@ export interface RebuildPatch {
54
17
  zeroChildren: boolean;
55
18
  actor: string;
56
19
  }
57
- /**
58
- * Apply a rebuild result to a dirty summary. Atomic: one
59
- * prepared UPDATE statement plus syncFtsRow inside one write scope.
60
- * WHERE includes `AND summary_dirty = 1` so concurrent sleep's race-loser
61
- * becomes a no-op (no rebuild_count bump, no audit row).
62
- *
63
- * Returns `{ changed, refused }`. `changed` is true when this call's UPDATE
64
- * (content or metadata-only) affected a row; false on race-loss / unknown id
65
- * / archived / wrong dag_level. `refused` is true only when a tombstone hit
66
- * suppressed the content write AND the metadata UPDATE still landed — see
67
- * the return-semantics comment below for the full contract.
68
- */
20
+ /** Apply a rebuild result to a dirty summary in one write scope (UPDATE plus syncFtsRow); `AND summary_dirty = 1` makes a concurrent race-loser a no-op.
21
+ * Returns `{ changed, refused }`: `refused` only when a tombstone hit suppressed the content write while the metadata UPDATE still landed. */
69
22
  export declare function applyRebuildResult(hippoRoot: string, summary: MemoryEntry, patch: RebuildPatch): {
70
23
  changed: boolean;
71
24
  refused: boolean;
72
25
  };
73
- /**
74
- * Clear summary_dirty on a freshly-built summary. Called by buildDag right after the child-link loop:
75
- * each member's writeEntry marks the new parent dirty, so the same cycle's rebuild would redo every new summary.
76
- *
77
- * Idempotent: no-op + no audit if summary isn't dirty. Audit
78
- * source='buildDag-clean' distinguishes it from the rebuild's source.
79
- */
26
+ /** Clear summary_dirty on a new summary after buildDag's child-link loop (each member's writeEntry marks the parent dirty, so the same cycle would rebuild it).
27
+ * Idempotent (no-op, no audit if not dirty); audit source='buildDag-clean' distinguishes it from the rebuild's. */
80
28
  export declare function clearSummaryDirtyAfterBuild(hippoRoot: string, summaryId: string, tenantId: string, actor?: string, source?: string): void;
81
29
  //# sourceMappingURL=summaries.d.ts.map
@@ -1,77 +1,18 @@
1
- import { closeHippoDb, withWriteScope } from '../db/index.js';
1
+ import { withWriteScope } from '../db/index.js';
2
2
  import { assertTenantId } from './tenant.js';
3
3
  import { findRejectedValue, rejectionDigest } from './rejection.js';
4
4
  import { log } from '../util/log.js';
5
5
  import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
6
6
  import { audit } from './audit-event.js';
7
7
  import { syncFtsRow } from './entry-row.js';
8
- import { openStore } from './open.js';
8
+ import { onHandle, openStore } from './open.js';
9
9
  import { DIGEST_DISPLAY_CHARS } from '../util/token-text.js';
10
- // ---------------------------------------------------------------------------
11
- // Dirty-flag helpers for DAG summaries: child writes mark a summary dirty, and the
12
- // sleep-cycle rebuild enumerates candidates without scanning every memory row.
13
- // ---------------------------------------------------------------------------
14
- /**
15
- * Mark a summary as dirty. Idempotent (re-marking dirty is a no-op + no
16
- * second audit row). Tenant-scoped to prevent cross-tenant writes via
17
- * parent-lookup. Called from invalidation.ts / writeEntry /
18
- * forgetMemory / archiveRawMemory whenever a child is invalidated,
19
- * superseded, forgotten, or archived.
20
- *
21
- * Quietly no-ops if the target row doesn't exist or isn't a level-2/3
22
- * summary. Emits a 'summary_marked_dirty' audit row on actual
23
- * state transitions (0 -> 1) via the audit() helper, which try/catches
24
- * for missing audit_log (the v27 self-heal scenario).
25
- */
26
- export function markSummaryDirty(hippoRoot, summaryId, tenantId, actor = 'cli') {
27
- assertTenantId('markSummaryDirty', tenantId);
28
- const db = openStore(hippoRoot);
29
- try {
30
- // RETURNING dag_level reads the actual level in the same round trip.
31
- // SAFETY: result's shape matches the single `dag_level` column returned
32
- // above.
33
- const result = db.prepare(`
34
- UPDATE memories
35
- SET summary_dirty = 1
36
- WHERE id = ?
37
- AND tenant_id = ?
38
- AND dag_level IN (2, 3)
39
- AND summary_dirty = 0
40
- AND kind != 'archived'
41
- RETURNING dag_level
42
- `).get(summaryId, tenantId);
43
- if (result) {
44
- // audit() wraps appendAuditEvent in try/catch (v27 heal scenario).
45
- // metadata.source tells this dirty-mark apart from the other wiring layers' marks.
46
- audit(db, 'summary_marked_dirty', { targetId: summaryId, metadata: { dag_level: result.dag_level, source: 'E1' }, actor, tenantId });
47
- }
48
- }
49
- finally {
50
- closeHippoDb(db);
51
- }
52
- }
53
- // ---------------------------------------------------------------------------
54
- // Sleep-cycle rebuild surface.
55
- //
56
- // loadAllDirtySummaries / loadChildrenOfSummary / applyRebuildResult /
57
- // clearSummaryDirtyAfterBuild live HERE (not in dag.ts) because they need
58
- // module-private MEMORY_SELECT_COLUMNS, MemoryRow, rowToEntry, audit,
59
- // syncFtsRow, assertTenantId. dag.ts owns only the thin orchestrator
60
- // rebuildDirtySummaries() that calls into these.
61
- // ---------------------------------------------------------------------------
62
- /**
63
- * Host-wide loader for L2 topic summaries without an L3 parent.
64
- * Used by consolidate phase 1.9 (buildEntityProfiles) to cluster L2s into
65
- * L3 entity profiles. Mirrors loadAllDirtySummaries: SQL-level
66
- * filter is cheaper than reusing in-memory `survivors` (which doesn't
67
- * contain L2s freshly created by phase 1.7 buildDag).
68
- *
69
- * Returns entries with tenantId attached so per-cluster writes stay
70
- * tenant-scoped via summary.tenantId.
71
- */
10
+ // Sleep-cycle rebuild surface: lives here, not in src/consolidate/dag.ts, because it needs module-private MEMORY_SELECT_COLUMNS, MemoryRow, rowToEntry,
11
+ // audit, syncFtsRow and assertTenantId. dag.ts keeps only the thin orchestrator rebuildDirtySummaries().
12
+ /** Host-wide loader for L2 topic summaries without an L3 parent, for consolidate phase 1.9 (buildEntityProfiles); SQL-level filter, since in-memory
13
+ * `survivors` lacks L2s created by phase 1.7. Entries carry tenantId so per-cluster writes stay tenant-scoped. */
72
14
  export function loadAllL2Summaries(hippoRoot) {
73
- const db = openStore(hippoRoot);
74
- try {
15
+ return onHandle(hippoRoot, (db) => {
75
16
  // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
76
17
  // MemoryRow's field set.
77
18
  const rows = db.prepare(`
@@ -84,23 +25,12 @@ export function loadAllL2Summaries(hippoRoot) {
84
25
  ORDER BY created ASC, id ASC
85
26
  `).all();
86
27
  return rows.map(rowToEntry);
87
- }
88
- finally {
89
- closeHippoDb(db);
90
- }
28
+ }, openStore);
91
29
  }
92
- /**
93
- * Dirty summaries, newest change first. Iterates all tenants
94
- * in one query so consolidate.ts (host-wide per L106-109) does not need a
95
- * per-tenant loop. Each returned MemoryEntry carries its own tenantId (via
96
- * rowToEntry), so per-summary children + rebuild UPDATE stay tenant-scoped.
97
- *
98
- * Sort: latest_at DESC NULLS LAST, id ASC — same as per-tenant variant so
99
- * HIPPO_DAG_REBUILD_CAP takes most-recently-changed summaries first.
100
- */
30
+ /** Dirty summaries across all tenants in one query, newest change first (latest_at DESC NULLS LAST, id ASC) so HIPPO_DAG_REBUILD_CAP takes the most
31
+ * recently changed. Each entry carries its own tenantId so the children read and rebuild UPDATE stay tenant-scoped. */
101
32
  export function loadAllDirtySummaries(hippoRoot) {
102
- const db = openStore(hippoRoot);
103
- try {
33
+ return onHandle(hippoRoot, (db) => {
104
34
  // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
105
35
  // MemoryRow's field set.
106
36
  const rows = db.prepare(`
@@ -111,22 +41,12 @@ export function loadAllDirtySummaries(hippoRoot) {
111
41
  ORDER BY latest_at DESC NULLS LAST, id ASC
112
42
  `).all();
113
43
  return rows.map(rowToEntry);
114
- }
115
- finally {
116
- closeHippoDb(db);
117
- }
44
+ }, openStore);
118
45
  }
119
- /**
120
- * Load live children of a DAG summary. Used by
121
- * rebuildDirtySummaries to regenerate content from the CURRENT child set
122
- * (not the children at create-time). Skips archived. Tenant-scoped
123
- * (defence in depth — dag_parent_id is unique-ish but tenant guard is
124
- * cheap). created column is TEXT NOT NULL since db.ts schema v1.
125
- */
46
+ /** Live (non-archived) children of a DAG summary, so a rebuild regenerates from the CURRENT child set; tenant-scoped as defence in depth. */
126
47
  export function loadChildrenOfSummary(hippoRoot, summaryId, tenantId) {
127
48
  assertTenantId('loadChildrenOfSummary', tenantId);
128
- const db = openStore(hippoRoot);
129
- try {
49
+ return onHandle(hippoRoot, (db) => {
130
50
  // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
131
51
  // MemoryRow's field set.
132
52
  const rows = db.prepare(`
@@ -139,32 +59,15 @@ export function loadChildrenOfSummary(hippoRoot, summaryId, tenantId) {
139
59
  ORDER BY created ASC
140
60
  `).all(summaryId, tenantId);
141
61
  return rows.map(rowToEntry);
142
- }
143
- finally {
144
- closeHippoDb(db);
145
- }
62
+ }, openStore);
146
63
  }
147
- /**
148
- * Apply a rebuild result to a dirty summary. Atomic: one
149
- * prepared UPDATE statement plus syncFtsRow inside one write scope.
150
- * WHERE includes `AND summary_dirty = 1` so concurrent sleep's race-loser
151
- * becomes a no-op (no rebuild_count bump, no audit row).
152
- *
153
- * Returns `{ changed, refused }`. `changed` is true when this call's UPDATE
154
- * (content or metadata-only) affected a row; false on race-loss / unknown id
155
- * / archived / wrong dag_level. `refused` is true only when a tombstone hit
156
- * suppressed the content write AND the metadata UPDATE still landed — see
157
- * the return-semantics comment below for the full contract.
158
- */
64
+ /** Apply a rebuild result to a dirty summary in one write scope (UPDATE plus syncFtsRow); `AND summary_dirty = 1` makes a concurrent race-loser a no-op.
65
+ * Returns `{ changed, refused }`: `refused` only when a tombstone hit suppressed the content write while the metadata UPDATE still landed. */
159
66
  export function applyRebuildResult(hippoRoot, summary, patch) {
160
67
  assertTenantId('applyRebuildResult', summary.tenantId);
161
- const db = openStore(hippoRoot);
162
- try {
68
+ return onHandle(hippoRoot, (db) => {
163
69
  return withWriteScope(db, 'rebuild_summary', () => applyRebuildInSavepoint(db, summary, patch));
164
- }
165
- finally {
166
- closeHippoDb(db);
167
- }
70
+ }, openStore);
168
71
  }
169
72
  // ONE prepared UPDATE per branch. Test #8 inspects the SQL string.
170
73
  const REBUILD_CONTENT_SQL = `UPDATE memories
@@ -197,13 +100,8 @@ function applyRebuildInSavepoint(db, summary, patch) {
197
100
  const tombstone = patch.bumpRebuildCount
198
101
  ? findRejectedValue(db, summary.tenantId, rejectionDigest(patch.content))
199
102
  : null;
200
- // On a hit: do NOT write the new content. Fall through to the SAME
201
- // metadata-only behavior the zero-child branch already has —
202
- // descendant_count/earliest_at/latest_at update + summary_dirty
203
- // cleared, no content write, no rebuild_count bump. Clearing dirty
204
- // (rather than leaving it set) is deliberate: leaving it dirty would
205
- // make every following sleep cycle re-attempt and re-refuse the
206
- // identical rebuild forever (the DAG-loop this fix closes).
103
+ // On a tombstone hit, write no content: take the zero-child metadata-only path (descendant_count/earliest_at/latest_at, summary_dirty cleared, no
104
+ // rebuild_count bump). Clearing dirty is deliberate: leaving it set would make every later sleep re-attempt and re-refuse the same rebuild forever.
207
105
  const applyContentWrite = patch.bumpRebuildCount && !tombstone;
208
106
  const result = applyContentWrite
209
107
  ? db.prepare(REBUILD_CONTENT_SQL).run(patch.content, patch.descendant_count, patch.earliest_at, patch.latest_at, nowIso, summary.id, summary.tenantId)
@@ -220,14 +118,14 @@ function applyRebuildInSavepoint(db, summary, patch) {
220
118
  }
221
119
  /** Audit and log a rebuild whose content matched a rejected value; metadata still landed. */
222
120
  function auditRefusedRebuild(db, summary, patch, tombstone) {
223
- // refused === true here (same condition, narrowed for the tombstone.*
224
- // access below). Best-effort refusal audit, written INLINE inside
225
- // this still-open SAVEPOINT — nothing here rolls back on a refusal
226
- // (the metadata UPDATE above already committed to this savepoint), so the
227
- // post-rollback auditRejectionRefusal helper (writeEntry/supersede's
228
- // tool) is the wrong one here; a direct audit() call is correct and
229
- // commits with the rest of this savepoint.
230
- audit(db, 'reject_refusal', { targetId: summary.id, metadata: { digest: tombstone.digest, reason: tombstone.reason }, actor: patch.actor, tenantId: summary.tenantId });
121
+ // refused === true here (narrowed for the tombstone.* access). Best-effort refusal audit written INLINE in this still-open SAVEPOINT (the metadata
122
+ // UPDATE already committed to it), so a direct audit() call is correct, not the post-rollback auditRejectionRefusal.
123
+ audit(db, 'reject_refusal', {
124
+ targetId: summary.id,
125
+ metadata: { digest: tombstone.digest, reason: tombstone.reason },
126
+ actor: patch.actor,
127
+ tenantId: summary.tenantId
128
+ });
231
129
  log.warn(`applyRebuildResult: refused rebuild content for ${summary.id} — matches a rejected value ` +
232
130
  `(digest ${tombstone.digest.slice(0, DIGEST_DISPLAY_CHARS)}...); metadata updated, content unchanged`);
233
131
  }
@@ -255,20 +153,13 @@ function syncRebuiltSummary(db, summary, patch, applyContentWrite, nowIso) {
255
153
  descendant_count: patch.descendant_count,
256
154
  }, actor: patch.actor, tenantId: summary.tenantId });
257
155
  }
258
- /**
259
- * Clear summary_dirty on a freshly-built summary. Called by buildDag right after the child-link loop:
260
- * each member's writeEntry marks the new parent dirty, so the same cycle's rebuild would redo every new summary.
261
- *
262
- * Idempotent: no-op + no audit if summary isn't dirty. Audit
263
- * source='buildDag-clean' distinguishes it from the rebuild's source.
264
- */
156
+ /** Clear summary_dirty on a new summary after buildDag's child-link loop (each member's writeEntry marks the parent dirty, so the same cycle would rebuild it).
157
+ * Idempotent (no-op, no audit if not dirty); audit source='buildDag-clean' distinguishes it from the rebuild's. */
265
158
  export function clearSummaryDirtyAfterBuild(hippoRoot, summaryId, tenantId, actor = 'cli', source = 'buildDag-clean') {
266
159
  assertTenantId('clearSummaryDirtyAfterBuild', tenantId);
267
- const db = openStore(hippoRoot);
268
- try {
160
+ onHandle(hippoRoot, (db) => {
269
161
  // RETURNING dag_level reads the actual level so audit metadata stays accurate without an extra SELECT.
270
- // SAFETY: result's shape matches the single `dag_level` column returned
271
- // below.
162
+ // SAFETY: result's shape matches the single `dag_level` column returned below.
272
163
  const result = db.prepare(`
273
164
  UPDATE memories
274
165
  SET summary_dirty = 0
@@ -283,9 +174,6 @@ export function clearSummaryDirtyAfterBuild(hippoRoot, summaryId, tenantId, acto
283
174
  // source tells buildDag-clean (L2) from buildEntityProfiles-clean (L3) and any future build path.
284
175
  audit(db, 'summary_marked_clean', { targetId: summaryId, metadata: { dag_level: result.dag_level, source }, actor, tenantId });
285
176
  }
286
- }
287
- finally {
288
- closeHippoDb(db);
289
- }
177
+ }, openStore);
290
178
  }
291
179
  //# sourceMappingURL=summaries.js.map
@@ -1,4 +1,4 @@
1
- // Leaf module so store.ts and raw-archive.ts can both mark a parent summary dirty without importing each other.
1
+ // Leaf module so entry-writes.ts and raw-archive.ts can both mark a parent summary dirty without importing each other.
2
2
  import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
3
3
  /** Runs in the caller's transaction so the mark commits or rolls back with the child change; only a 0 to 1 flip is audited. */
4
4
  export function markSummaryDirtyInTx(db, summaryId, tenantId, actor) {
@@ -1,4 +1,4 @@
1
- import type { DatabaseSyncLike } from '../db/index.js';
1
+ import { type DatabaseSyncLike } from '../db/index.js';
2
2
  /** The api_keys fields a tenant, revocation, rank or self-service ownership check reads. */
3
3
  export interface ApiKeyOwner {
4
4
  tenantId: string;
@@ -13,4 +13,9 @@ export declare function selectMemoryReach(db: DatabaseSyncLike, id: string): {
13
13
  tenantId: string;
14
14
  scope: string | null;
15
15
  } | undefined;
16
+ /** `selectMemoryReach` for the store under `hippoRoot`, with no mirror setup and no full row read. */
17
+ export declare function memoryReach(hippoRoot: string, id: string): {
18
+ tenantId: string;
19
+ scope: string | null;
20
+ } | undefined;
16
21
  //# sourceMappingURL=tenant-lookup.d.ts.map
@@ -1,4 +1,5 @@
1
1
  // Owner lookups by id: the tenant and scope checks in src/api and the CLI's key-tenant lookup share these queries.
2
+ import { onHandle } from './open.js';
2
3
  /** The owner row of `keyId`, or undefined when no such key exists. */
3
4
  export function selectApiKeyOwner(db, keyId) {
4
5
  // SAFETY: row's shape matches the four columns named in the SELECT.
@@ -13,4 +14,10 @@ export function selectMemoryReach(db, id) {
13
14
  const row = db.prepare(`SELECT tenant_id, scope FROM memories WHERE id = ?`).get(id);
14
15
  return row && { tenantId: row.tenant_id, scope: row.scope };
15
16
  }
17
+ /** `selectMemoryReach` for the store under `hippoRoot`, with no mirror setup and no full row read. */
18
+ export function memoryReach(hippoRoot, id) {
19
+ return onHandle(hippoRoot, (db) => {
20
+ return selectMemoryReach(db, id);
21
+ });
22
+ }
16
23
  //# sourceMappingURL=tenant-lookup.js.map
@@ -5,21 +5,7 @@ export interface ResolveOpts {
5
5
  apiKey?: string;
6
6
  }
7
7
  export declare function resolveTenantId(opts: ResolveOpts): string;
8
- /**
9
- * Defensive runtime guard for tenant id arguments.
10
- *
11
- * The continuity helpers (saveActiveTaskSnapshot, listSessionEvents, etc.)
12
- * gained a required `tenantId` parameter (schema v22) to close a
13
- * cross-tenant data leak. TypeScript catches misbinding at compile time, but
14
- * JavaScript callers from older versions can silently pass a `sessionId`
15
- * where `tenantId` is now expected, e.g.
16
- * loadLatestHandoff(root, 'sess-abc') // WRONG: 'sess-abc' becomes the tenant
17
- * which would silently filter to a non-existent tenant and return null with
18
- * no error. This guard rejects the most common shape of that mistake (any
19
- * value beginning with the conventional `sess-` / `sess_` session prefix).
20
- *
21
- * False-positive cost: a tenant literally named `sess-...` will be rejected.
22
- * Acceptable tradeoff for catching the silent-leak class.
23
- */
8
+ /** Runtime guard for tenant id args: an older JS caller can pass a `sessionId` as the tenant (`loadLatestHandoff(root, 'sess-abc')`) and silently get null.
9
+ * Rejects values starting `sess-` / `sess_`; a tenant literally named `sess-...` is refused, an accepted tradeoff. */
24
10
  export declare function assertTenantId(fnName: string, value: JsonValue): asserts value is string;
25
11
  //# sourceMappingURL=tenant.d.ts.map
@@ -9,27 +9,12 @@ export function resolveTenantId(opts) {
9
9
  throw new Error('invalid api key');
10
10
  return ctx.tenantId;
11
11
  }
12
- // L1: empty / whitespace-only HIPPO_TENANT must fall through to 'default'.
13
- // `??` only catches undefined, so HIPPO_TENANT="" leaked through as the
14
- // literal empty string and broke every downstream tenant filter.
12
+ // Empty/whitespace-only HIPPO_TENANT must fall through to 'default': `??` only catches undefined, so '' leaked through and broke every downstream tenant
13
+ // filter.
15
14
  return envTenant();
16
15
  }
17
- /**
18
- * Defensive runtime guard for tenant id arguments.
19
- *
20
- * The continuity helpers (saveActiveTaskSnapshot, listSessionEvents, etc.)
21
- * gained a required `tenantId` parameter (schema v22) to close a
22
- * cross-tenant data leak. TypeScript catches misbinding at compile time, but
23
- * JavaScript callers from older versions can silently pass a `sessionId`
24
- * where `tenantId` is now expected, e.g.
25
- * loadLatestHandoff(root, 'sess-abc') // WRONG: 'sess-abc' becomes the tenant
26
- * which would silently filter to a non-existent tenant and return null with
27
- * no error. This guard rejects the most common shape of that mistake (any
28
- * value beginning with the conventional `sess-` / `sess_` session prefix).
29
- *
30
- * False-positive cost: a tenant literally named `sess-...` will be rejected.
31
- * Acceptable tradeoff for catching the silent-leak class.
32
- */
16
+ /** Runtime guard for tenant id args: an older JS caller can pass a `sessionId` as the tenant (`loadLatestHandoff(root, 'sess-abc')`) and silently get null.
17
+ * Rejects values starting `sess-` / `sess_`; a tenant literally named `sess-...` is refused, an accepted tradeoff. */
33
18
  export function assertTenantId(fnName, value) {
34
19
  if (typeof value !== 'string' || value.length === 0) {
35
20
  throw new Error(`${fnName}: tenantId is required (got ${typeof value})`);
@@ -1,27 +1,13 @@
1
1
  import { type DatabaseSyncLike } from '../db/index.js';
2
- /**
3
- * Where a block of memory text was sent.
4
- * - `hook`: the per-prompt `UserPromptSubmit` hook (`hippo context --pinned-only`).
5
- * - `hook_recall`: the same hook's prompt-recall section.
6
- * - `compact_resume`: the snapshot the SessionStart(compact) hook prints (`hippo compact-resume`).
7
- * - `context`, `recall`: the CLI commands.
8
- * - `mcp_recall`, `mcp_context`: the MCP tools.
9
- * - `http_recall`, `http_context`, `http_assemble`: the HTTP API.
10
- * - `pilot`: the session's pilot arm row (src/api/pilot-arm.ts); not a send, so it is in no surface list.
11
- */
2
+ /** Where a block was sent: `hook`/`hook_recall` (per-prompt hook), `compact_resume`, `context`/`recall` (CLI), `mcp_*`, `http_*`,
3
+ * and `pilot` (session pilot arm row, src/api/pilot-arm.ts; not a send, so in no surface list). */
12
4
  export type TokenSurface = 'hook' | 'hook_recall' | 'compact_resume' | 'context' | 'recall' | 'mcp_recall' | 'mcp_context' | 'http_recall' | 'http_context' | 'http_assemble' | 'pilot';
13
5
  /** All surfaces, in report order. */
14
6
  export declare const TOKEN_SURFACES: readonly TokenSurface[];
15
7
  /** Surfaces whose re-reads are counted: only a hook payload tells a sub-agent's block from its parent's, as both carry one session id. */
16
8
  export declare const REREAD_SURFACES: readonly TokenSurface[];
17
- /**
18
- * What happened to a block.
19
- * - `inject`: sent to the agent.
20
- * - `skip`: identical to the session's last injected block, so not sent again.
21
- * - `reset`: the host compacted its context, so the next block must be sent.
22
- * - `reread`: tokens later calls read again, booked at session end as one row per session, hook surface and UTC day of the calls.
23
- * - `arm`: the pilot assignment; `block_hash` is `hippo` or `holdout`, `items` the holdout rate in basis points.
24
- */
9
+ /** What happened to a block: `inject` (sent), `skip` (identical to the last injected block), `reset` (host compacted, next must send), `reread` (tokens
10
+ * later calls read again, booked at session end), `arm` (pilot assignment; `block_hash` is `hippo` or `holdout`, `items` the holdout rate in bp). */
25
11
  export type TokenEvent = 'inject' | 'skip' | 'reset' | 'reread' | 'arm';
26
12
  /** Rows older than this are pruned on write. */
27
13
  export declare const TOKEN_LEDGER_RETENTION_DAYS = 90;
@@ -41,9 +27,7 @@ export interface TokenUse {
41
27
  /** Override the timestamp (tests). ISO string. */
42
28
  now?: string;
43
29
  }
44
- /**
45
- * Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}.
46
- */
30
+ /** Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}. */
47
31
  export declare function recordTokenUse(db: DatabaseSyncLike, use: TokenUse): void;
48
32
  /** What a session last sent on a surface, for {@link lastSentState}. */
49
33
  export interface LastSent {
@@ -52,18 +36,10 @@ export interface LastSent {
52
36
  /** Consecutive `skip` rows since that injection. */
53
37
  skipsSince: number;
54
38
  }
55
- /**
56
- * The last block this session injected on `surface`, or null when the
57
- * session has injected nothing, a `reset` came after it, or there is no
58
- * session id (without one, the caller always injects).
59
- */
39
+ /** The last block this session injected on `surface`, or null if none, a `reset` came after it, or there is no session id (the caller then always injects). */
60
40
  export declare function lastSentState(db: DatabaseSyncLike, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface): LastSent | null;
61
- /**
62
- * Whether a block identical to the session's last injection should be
63
- * skipped. `refreshTurns` resends an unchanged block after that many
64
- * consecutive skips, so a long session still sees its pinned rules near the
65
- * latest turn; 0 never resends an unchanged block.
66
- */
41
+ /** Whether a block identical to the session's last injection should be skipped; `refreshTurns` resends it after that many consecutive skips so a long
42
+ * session still sees its pinned rules, 0 never resends. */
67
43
  export declare function shouldSkipUnchanged(last: LastSent | null, hash: string, refreshTurns: number): boolean;
68
44
  /** Per-surface totals for {@link summarizeTokenUse}. */
69
45
  export interface TokenSurfaceSummary {
@@ -98,10 +74,7 @@ export interface TokenSummary {
98
74
  /** Sessions whose re-reads were counted at session end; open or crashed sessions are not. */
99
75
  rereadSessions: number;
100
76
  }
101
- /**
102
- * Sum the ledger for one tenant since `sinceIso`. Surfaces with no rows are
103
- * omitted.
104
- */
77
+ /** Sum the ledger for one tenant since `sinceIso`; surfaces with no rows are omitted. */
105
78
  export declare function summarizeTokenUse(db: DatabaseSyncLike, tenantId: string, sinceIso: string): TokenSummary;
106
79
  /** JSON-value string check without a runtime `typeof` (anti-slop rule). */
107
80
  interface ModelTagged {
@@ -126,11 +99,8 @@ export interface SessionTokens {
126
99
  /** Blocks sent. */
127
100
  injections: number;
128
101
  }
129
- /**
130
- * Ledger totals per session id since `sinceIso`, across every surface.
131
- * Claude Code hook rows carry the host's session id, which is also the
132
- * transcript file name, so these join to the host's own usage records.
133
- */
102
+ /** Ledger totals per session id since `sinceIso`, across surfaces; hook rows carry the host's session id (the transcript file name), so they join to its
103
+ * usage records. */
134
104
  export declare function tokensBySession(db: DatabaseSyncLike, tenantId: string, sinceIso: string): SessionTokens[];
135
105
  /** One model API call in a host transcript, for {@link recordRereads}. */
136
106
  export interface ApiCall {
@@ -149,7 +119,7 @@ export interface TranscriptCalls {
149
119
  export declare function readApiCalls(transcriptPath: string): Promise<TranscriptCalls>;
150
120
  /** Calls that carried a block sent at `at` (epoch ms): every later call in the first later call's context window. */
151
121
  export declare function carryingCalls(calls: readonly ApiCall[], at: number): ApiCall[];
152
- /** Replace a session's `reread` rows in one transaction, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
153
- export declare function recordRereads(db: DatabaseSyncLike, tenantId: string, sessionId: string, calls: readonly ApiCall[]): number;
122
+ /** Replace a session's `reread` rows in `hippoRoot`'s store, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
123
+ export declare function recordRereads(hippoRoot: string, tenantId: string, sessionId: string, calls: readonly ApiCall[]): number;
154
124
  export {};
155
125
  //# sourceMappingURL=token-ledger.d.ts.map