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,5 +1,7 @@
1
- import { AUTO_DELETABLE_SQL } from '../core/memory.js';
2
- import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
2
+ import { RawAppendOnlyError } from '../core/raw-append-only.js';
3
+ import { AUTO_DELETABLE_SQL } from './rule-sql.js';
4
+ import { closeHippoDb, withWriteScope } from '../db/index.js';
3
5
  import { checkRejectionGuard, RejectedValueError } from './rejection.js';
4
6
  import { markSummaryDirtyInTx } from './summary-dirty.js';
5
7
  import { insertDormantRow } from './dormant.js';
@@ -8,7 +10,7 @@ import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
8
10
  import { audit } from './audit-event.js';
9
11
  import { deleteFtsRow, replaceFtsRows, stampOriginProject, upsertMemoryRow } from './entry-row.js';
10
12
  import { purgeMirrorBestEffort, mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
11
- import { openStore } from './open.js';
13
+ import { onHandle, openStore } from './open.js';
12
14
  import { clock } from '../util/write-budget.js';
13
15
  /** Tables whose rows keep a first-class object's backing memory in `memory_id` (ON DELETE SET NULL); tests/dormant-memories.test.ts pins it to the schema. */
14
16
  export const MEMORY_BACKED_TABLES = ['predictions', 'decisions', 'incidents', 'processes', 'policies', 'skills', 'project_briefs', 'customer_notes'];
@@ -16,13 +18,9 @@ export const MEMORY_BACKED_TABLES = ['predictions', 'decisions', 'incidents', 'p
16
18
  const AUTOMATIC_DELETE_SQL = `${AUTO_DELETABLE_SQL}${MEMORY_BACKED_TABLES.map((t) => ` AND NOT EXISTS (SELECT 1 FROM ${t} WHERE ${t}.memory_id = memories.id)`).join('')}`;
17
19
  /** Ids of memories that back a first-class object, for passes that plan deletes before making them. A table missing from an older schema is skipped. */
18
20
  export function memoriesBackingObjects(hippoRoot) {
19
- const db = openHippoDb(hippoRoot);
20
- try {
21
+ return onHandle(hippoRoot, (db) => {
21
22
  return memoriesBackingObjectsOn(db);
22
- }
23
- finally {
24
- closeHippoDb(db);
25
- }
23
+ });
26
24
  }
27
25
  /** memoriesBackingObjects on the caller's handle. */
28
26
  export function memoriesBackingObjectsOn(db) {
@@ -42,16 +40,22 @@ export function memoriesBackingObjectsOn(db) {
42
40
  }
43
41
  return ids;
44
42
  }
45
- /**
46
- * db-scoped delete core, so a delete can compose inside a caller's transaction.
47
- * NO filesystem I/O: the caller's transaction may still roll back, and mirrors are written post-commit.
48
- *
49
- * `opts.suppressForgetAudit` (default false): `rejectValue` and `resolveConflict` set it because each
50
- * writes its own aggregate audit row, so a removed row must not ALSO emit a `forget` row.
51
- *
52
- * Returns `{tenantId, dagParentId}` for the removed row, or `null` if no row with `id`
53
- * existed or `automatic` refused it (pinned, raw, kept for good or backing an object at DELETE time, so a late pin wins).
54
- */
43
+ // The abort text of trg_memories_raw_append_only (migration v14), the one place src matches it.
44
+ const RAW_TRIGGER_TEXT = 'raw is append-only';
45
+ function isRawTriggerAbort(cause) {
46
+ return cause instanceof Error && cause.message.includes(RAW_TRIGGER_TEXT);
47
+ }
48
+ /** Runs the DELETE and returns the rows it removed; the raw-row trigger's abort becomes RawAppendOnlyError. */
49
+ function deleteMemoryRow(db, sql, id) {
50
+ try {
51
+ return Number(db.prepare(sql).run(id).changes ?? 0);
52
+ }
53
+ catch (cause) {
54
+ throw isRawTriggerAbort(cause) ? new RawAppendOnlyError(cause) : cause;
55
+ }
56
+ }
57
+ /** db-scoped delete core, composable inside a caller's transaction; NO filesystem I/O, mirrors are written post-commit. `suppressForgetAudit` is set by
58
+ * rejectValue and resolveConflict (own audit row). Returns `{tenantId, dagParentId}`, or null if absent or `automatic` refused it. */
55
59
  export function deleteEntryCore(db, id, opts) {
56
60
  // SAFETY: row's shape matches the three columns named in the SELECT above.
57
61
  const row = db
@@ -60,7 +64,7 @@ export function deleteEntryCore(db, id, opts) {
60
64
  if (!row?.id)
61
65
  return null;
62
66
  const guard = opts?.automatic ? ` AND ${AUTOMATIC_DELETE_SQL}` : '';
63
- if (Number(db.prepare(`DELETE FROM memories WHERE id = ?${guard}`).run(id).changes ?? 0) === 0)
67
+ if (deleteMemoryRow(db, `DELETE FROM memories WHERE id = ?${guard}`, id) === 0)
64
68
  return null;
65
69
  deleteFtsRow(db, id);
66
70
  if (!opts?.suppressForgetAudit) {
@@ -69,29 +73,16 @@ export function deleteEntryCore(db, id, opts) {
69
73
  // Forgetting a child of a summary marks the parent dirty. Not atomic with the DELETE, but
70
74
  // markSummaryDirtyInTx is idempotent, so the next child mutation re-marks the parent if this fails.
71
75
  if (row.dag_parent_id) {
72
- markSummaryDirtyInTx(db, row.dag_parent_id, row.tenant_id ?? 'default', opts?.actor ?? 'cli');
76
+ markSummaryDirtyInTx(db, row.dag_parent_id, row.tenant_id ?? DEFAULT_TENANT_ID, opts?.actor ?? 'cli');
73
77
  }
74
- return { tenantId: row.tenant_id ?? 'default', dagParentId: row.dag_parent_id ?? null };
78
+ return { tenantId: row.tenant_id ?? DEFAULT_TENANT_ID, dagParentId: row.dag_parent_id ?? null };
75
79
  }
76
- /**
77
- * Delete an entry from SQLite and mirrors.
78
- *
79
- * `opts.actor` defaults to 'cli'. The api.* layer threads `ctx.actor` so HTTP
80
- * callers land with `api_key:<key_id>` in the audit log without a duplicate
81
- * emit from the api wrapper.
82
- *
83
- * Thin wrapper over `deleteEntryCore` (open → core → mirrors → close);
84
- * behavior is byte-identical to the pre-split implementation for every
85
- * existing caller.
86
- */
80
+ /** Delete an entry from SQLite and mirrors; thin wrapper over `deleteEntryCore` (open, core, mirrors, close).
81
+ * `opts.actor` defaults to 'cli'; the api layer threads `ctx.actor` so HTTP callers land as `api_key:<key_id>` in the audit log. */
87
82
  export function deleteEntry(hippoRoot, id, opts) {
88
- const db = openStore(hippoRoot);
89
- try {
83
+ return onHandle(hippoRoot, (db) => {
90
84
  return deleteEntryOn(db, hippoRoot, id, opts);
91
- }
92
- finally {
93
- closeHippoDb(db);
94
- }
85
+ }, openStore);
95
86
  }
96
87
  /** deleteEntry on the caller's open store, so a loop of deletes opens the store once; each delete still commits alone. */
97
88
  function deleteEntryOn(db, hippoRoot, id, opts) {
@@ -112,26 +103,17 @@ function mergeOwnChanges(base, ours, live) {
112
103
  }
113
104
  return row;
114
105
  }
115
- /** Writes, deletes and dormant moves in one transaction. With `snapshot` (rows as the caller loaded them), a write keeps only
116
- * the fields the caller changed, takes the rest from the live row, and never resurrects a row that is gone.
117
- *
118
- * `dormant` (src/store/dormant.ts): each move's snapshot is inserted into `dormant_memories` and its `memories` row
119
- * leaves exactly like a delete (FTS row, DAG parent dirty-mark, mirrors), in the same transaction, so a memory
120
- * is never in both places or in neither. Deletes and moves both skip rows that are no longer auto-deletable
121
- * (pinned, raw, kept for good or backing an object since the caller decided). Returns the ids that left `memories`, deleted or moved. */
106
+ /** Writes, deletes and dormant moves in one transaction. With `snapshot`, a write keeps only the fields the caller changed and never resurrects a gone row.
107
+ * Dormant moves (src/store/dormant.ts) leave `memories` like a delete; both skip rows no longer auto-deletable. Returns ids that left `memories`. */
122
108
  export function batchWriteAndDelete(hippoRoot, toWrite, toDeleteIds, opts) {
123
109
  const dormant = opts?.dormant ?? [];
124
110
  if (toWrite.length === 0 && toDeleteIds.length === 0 && dormant.length === 0)
125
111
  return [];
126
- const db = openStore(hippoRoot);
127
- try {
112
+ return onHandle(hippoRoot, (db) => {
128
113
  // One component, so every op keeps the statement order this call has always had.
129
114
  const all = { writes: toWrite, deletes: toDeleteIds, dormant };
130
115
  return batchWriteAndDeleteOn(db, hippoRoot, [all], 0, { snapshot: opts?.snapshot, holdMs: Infinity }).removedIds;
131
- }
132
- finally {
133
- closeHippoDb(db);
134
- }
116
+ }, openStore);
135
117
  }
136
118
  const failedUnits = new WeakMap();
137
119
  /** Tags a flush error with the ids of the component it stopped at, for the partial sleep audit row; the first tag wins. */
@@ -149,7 +131,13 @@ export function failedUnitOf(err) {
149
131
  * first component boundary after `holdMs`. Returns the next component's index and the ids that left `memories`. */
150
132
  function batchWriteAndDeleteOn(db, hippoRoot, components, from, opts) {
151
133
  const now = opts.clock ?? clock;
152
- const out = { written: [], removedIds: [], rejectedSkips: 0, fts: { rows: [], staleIds: [] }, dirty: { parents: new Set(), tenantById: new Map() } };
134
+ const out = {
135
+ written: [],
136
+ removedIds: [],
137
+ rejectedSkips: 0,
138
+ fts: { rows: [], staleIds: [] },
139
+ dirty: { parents: new Set(), tenantById: new Map() }
140
+ };
153
141
  let next = from;
154
142
  // IMMEDIATE: the tombstone probes below read before the first write, and under a deferred BEGIN a
155
143
  // concurrent `hippo reject` would make the lock upgrade fail with SQLITE_BUSY and roll back the batch.
@@ -171,7 +159,7 @@ function batchWriteAndDeleteOn(db, hippoRoot, components, from, opts) {
171
159
  // Fire dirty-mark for every collected parent INSIDE the BEGIN, so the
172
160
  // dirty flag commits atomically with the writes + deletes.
173
161
  for (const parentId of out.dirty.parents) {
174
- markSummaryDirtyInTx(db, parentId, out.dirty.tenantById.get(parentId) ?? 'default', 'batch');
162
+ markSummaryDirtyInTx(db, parentId, out.dirty.tenantById.get(parentId) ?? DEFAULT_TENANT_ID, 'batch');
175
163
  }
176
164
  });
177
165
  reportChunk(hippoRoot, out);
@@ -231,7 +219,7 @@ function selectAutoDeletableRows(db, ids, dirty) {
231
219
  for (const row of rows) {
232
220
  if (row.dag_parent_id) {
233
221
  dirty.parents.add(row.dag_parent_id);
234
- dirty.tenantById.set(row.dag_parent_id, row.tenant_id ?? 'default');
222
+ dirty.tenantById.set(row.dag_parent_id, row.tenant_id ?? DEFAULT_TENANT_ID);
235
223
  }
236
224
  }
237
225
  return rows;
@@ -272,7 +260,7 @@ function applyBatchWrites(db, stampedWrites, snapshot, out) {
272
260
  }
273
261
  /** True, after auditing the refusal, when the write would introduce a rejected value. */
274
262
  function isRejectedBatchWrite(db, row) {
275
- const entryTenantId = row.tenantId ?? 'default';
263
+ const entryTenantId = row.tenantId ?? DEFAULT_TENANT_ID;
276
264
  // checkRejectionGuard, not a bare tombstone probe: a tombstone can coexist with a live same-content row,
277
265
  // and skipping every re-persist would starve it of decay/replay updates; only new or changed content is refused.
278
266
  try {
@@ -291,16 +279,12 @@ function isRejectedBatchWrite(db, row) {
291
279
  export function deleteEntriesOneByOne(hippoRoot, targets, opts) {
292
280
  if (targets.length === 0)
293
281
  return [];
294
- const db = openStore(hippoRoot);
295
- try {
282
+ return onHandle(hippoRoot, (db) => {
296
283
  return targets.map((target) => deleteEntryOn(db, hippoRoot, target.id, { ...opts, reason: target.reason }));
297
- }
298
- finally {
299
- closeHippoDb(db);
300
- }
284
+ }, openStore);
301
285
  }
302
- /** Commits whole components in transactions of about `budget.holdMs` on one store handle, letting other writers in between; returns the ids that left `memories`.
303
- * The snapshot keeps what other writers changed after the caller loaded its rows. */
286
+ /** Commits whole components in transactions of about `budget.holdMs`, letting other writers in between; returns the ids that left `memories`.
287
+ * The snapshot keeps what other writers changed after the caller loaded its rows. */
304
288
  export async function commitInChunks(hippoRoot, components, opts) {
305
289
  if (components.length === 0)
306
290
  return [];
@@ -1,8 +1,8 @@
1
1
  import type { MemoryEntry } from '../core/memory.js';
2
2
  import { type PromptRecallGate } from '../core/prompt-recall.js';
3
3
  export type DeliveryRuntime = 'claude-code' | 'codex' | 'copilot' | 'unknown';
4
- export type DeliveryEventType = 'prompt-submit' | 'pinned-manual' | 'pre-compact' | 'compact-resume';
5
- /** True for the two compaction boundary types. */
4
+ export type DeliveryEventType = 'prompt-submit' | 'pinned-manual' | 'pre-compact' | 'compact-resume' | 'session-end' | 'context';
5
+ /** True for the boundary types: a compaction's two hooks and the end of a session. */
6
6
  export declare const isBoundaryEvent: (type: DeliveryEventType) => boolean;
7
7
  export type DeliverySurface = 'hook' | 'context';
8
8
  export type DeliveryWriteStore = 'local' | 'global';
@@ -12,8 +12,8 @@ export type DeliveryPool = 'pin' | 'recent' | 'prompt-recall' | 'strength' | 'se
12
12
  export type DeliveryStage = 'load' | 'eligible' | 'gate' | 'budget' | 'limit' | 'final';
13
13
  export type DeliveryOutcome = 'emitted' | 'reused' | 'rejected';
14
14
  export type DeliveryRejectReason = 'budget' | 'gate-below-threshold' | 'gate-max-items' | 'duplicate' | 'scope' | 'quality' | 'limit';
15
- /** Row format version in `delivery_events.ledger_version`: 2 = written by a binary that can write boundary rows, so `event_type` has four values. */
16
- export declare const DELIVERY_LEDGER_VERSION = 2;
15
+ /** Row format version in `delivery_events.ledger_version`: 3 = written by a binary that can write session-end and context rows, so `event_type` has six values. */
16
+ export declare const DELIVERY_LEDGER_VERSION = 3;
17
17
  /** Rejected candidate rows kept per event; the rest only add to `rejected_unlisted`. */
18
18
  export declare const DELIVERY_REJECTED_ROW_CAP = 16;
19
19
  export interface DeliveryCandidateInput {
@@ -98,6 +98,10 @@ export interface DeliveryObserver {
98
98
  };
99
99
  }[]): void;
100
100
  selected(items: readonly DeliverySelected[]): void;
101
+ /** A searching call's query, `*` for none; kept as its hash, the one the recall trace stores. */
102
+ queried(query: string): void;
103
+ /** The recall trace a call that returned rows wrote; null when the write failed or the store answers no id. */
104
+ traced(traceId: number | null): void;
101
105
  }
102
106
  /** What the renderer sent, reported once at its exit. */
103
107
  export interface DeliveryOutcomeInput {
@@ -2,11 +2,13 @@ import { evalNow } from '../core/ablation.js';
2
2
  import { scoreOverlap } from '../core/prompt-recall.js';
3
3
  import { hookPayloadSessionId, hookPayloadString, isSubagentPayload } from './token-ledger.js';
4
4
  import { blockHash, estimateTokens } from '../util/token-text.js';
5
- import { errorMessage } from '../util/log.js';
6
- /** True for the two compaction boundary types. */
7
- export const isBoundaryEvent = (type) => type === 'pre-compact' || type === 'compact-resume';
8
- /** Row format version in `delivery_events.ledger_version`: 2 = written by a binary that can write boundary rows, so `event_type` has four values. */
9
- export const DELIVERY_LEDGER_VERSION = 2;
5
+ import { errorMessage, log } from '../util/log.js';
6
+ /** True for the boundary types: a compaction's two hooks and the end of a session. */
7
+ export const isBoundaryEvent = (type) => type === 'pre-compact' || type === 'compact-resume' || type === 'session-end';
8
+ /** Only the per-prompt calls keep prompt facts; a boundary or a `hippo context` run is not a prompt. */
9
+ const carriesPrompt = (type) => type === 'prompt-submit' || type === 'pinned-manual';
10
+ /** Row format version in `delivery_events.ledger_version`: 3 = written by a binary that can write session-end and context rows, so `event_type` has six values. */
11
+ export const DELIVERY_LEDGER_VERSION = 3;
10
12
  /** Rejected candidate rows kept per event; the rest only add to `rejected_unlisted`. */
11
13
  export const DELIVERY_REJECTED_ROW_CAP = 16;
12
14
  // Deeper stages were closer to being sent, so the row cap keeps them first.
@@ -46,15 +48,22 @@ function rejectId(state, id, rejection) {
46
48
  return;
47
49
  state.candidates.set(id, { ...held, stage, reason, score, tokens });
48
50
  }
51
+ function pickedPool(p, held) {
52
+ if (p.promptRecall)
53
+ return 'prompt-recall';
54
+ // A ranked call's rows keep the ranking that chose them, a pinned hit included.
55
+ if (held?.pool === 'search' || held?.pool === 'strength')
56
+ return held.pool;
57
+ return held?.pool === 'pin' || p.entry.pinned ? 'pin' : 'recent';
58
+ }
49
59
  function pickedRows(state) {
50
60
  const staticReused = state.outcome.staticReused === true;
51
61
  const rows = [];
52
62
  for (const p of state.picked.values()) {
53
- const held = state.candidates.get(p.entry.id);
54
63
  rows.push({
55
64
  memoryId: p.entry.id,
56
65
  sourceStore: p.sourceStore,
57
- pool: p.promptRecall ? 'prompt-recall' : held?.pool === 'pin' || p.entry.pinned ? 'pin' : 'recent',
66
+ pool: pickedPool(p, state.candidates.get(p.entry.id)),
58
67
  stage: 'final',
59
68
  outcome: staticReused && !p.promptRecall ? 'reused' : 'emitted',
60
69
  reason: null,
@@ -92,14 +101,14 @@ function buildEvent(init, payload, state, ts, startedMs) {
92
101
  const rows = [...picked, ...rejected.rows];
93
102
  const emitted = outcome.emittedText ?? null;
94
103
  const eventType = init.eventType ?? (payload.hookEvent === 'UserPromptSubmit' ? 'prompt-submit' : 'pinned-manual');
95
- // A boundary row carries no prompt facts, whatever the payload holds.
96
- const prompt = isBoundaryEvent(eventType) ? null : payload.prompt;
104
+ // Whatever the payload holds, so a hook-run `hippo context` is never matched to an earlier row by its prompt.
105
+ const prompt = carriesPrompt(eventType) ? payload.prompt : null;
97
106
  return {
98
107
  ts,
99
108
  tenantId: init.tenantId,
100
109
  runtime: init.runtime ?? (payload.hostTurnId !== null ? 'codex' : payload.hookEvent !== null ? 'claude-code' : 'unknown'),
101
110
  eventType,
102
- surface: 'hook',
111
+ surface: eventType === 'context' ? 'context' : 'hook',
103
112
  storeHash: init.storeHash,
104
113
  writeStore: init.writeStore,
105
114
  projectHash: facts !== null && facts.projectName !== '' ? blockHash(facts.projectName) : null,
@@ -108,8 +117,8 @@ function buildEvent(init, payload, state, ts, startedMs) {
108
117
  hostTurnId: payload.hostTurnId,
109
118
  promptHash: prompt !== null ? blockHash(prompt) : null,
110
119
  promptLength: prompt?.length ?? 0,
111
- queryHash: null,
112
- recallTraceId: null,
120
+ queryHash: state.queryHash,
121
+ recallTraceId: state.recallTraceId,
113
122
  blockState: state.disabledSeen ? 'disabled' : outcome.state,
114
123
  promptRecall: facts?.promptRecall === true,
115
124
  consideredCount: new Set([...state.candidates.keys(), ...state.picked.keys()]).size,
@@ -196,7 +205,7 @@ export function createDeliveryRecorder(init) {
196
205
  const payload = readPayload(init);
197
206
  const state = {
198
207
  candidates: new Map(), picked: new Map(), filtered: new Set(), facts: null, shown: 0, dropped: 0,
199
- disabledSeen: false, outcome: { state: 'empty' }, broken: null, flushed: false,
208
+ disabledSeen: false, outcome: { state: 'empty' }, queryHash: null, recallTraceId: null, broken: null, flushed: false,
200
209
  };
201
210
  const guard = guardFor(state, fault);
202
211
  const { qualityDropped, offer, reject, dropMissing, gated, selected } = candidateMethods(state, guard);
@@ -217,14 +226,15 @@ export function createDeliveryRecorder(init) {
217
226
  dropMissing,
218
227
  gated,
219
228
  selected,
229
+ queried: (query) => guard(() => { state.queryHash = blockHash(query); }),
230
+ traced: (traceId) => guard(() => { state.recallTraceId = traceId; }),
220
231
  delivered: (o) => guard(() => { state.outcome = { ...o }; }),
221
232
  flush: (write) => {
222
233
  if (state.flushed)
223
234
  return;
224
235
  state.flushed = true;
225
236
  if (state.broken !== null) {
226
- // Same pinned `[hippo] delivery ledger` hook stderr line as recall-trace.ts's write failure.
227
- console.error(`[hippo] delivery ledger skipped: recorder failed: ${state.broken}`);
237
+ log.warn(`delivery ledger skipped: recorder failed: ${state.broken}`);
228
238
  return;
229
239
  }
230
240
  if (fault === 'build')
@@ -1,5 +1,6 @@
1
1
  // What `hippo doctor` and `hippo support-bundle` read from a store: one read-only open each, plain data out.
2
- import { closeHippoDb, countTableRows, ftsRowCounts, getMeta, getSchemaVersion, openHippoDbReadOnly } from '../db/index.js';
2
+ import { countTableRows, ftsRowCounts, getMeta, getSchemaVersion, openHippoDbReadOnly } from '../db/index.js';
3
+ import { onHandle } from './open.js';
3
4
  import { listTableNames } from '../db/tables.js';
4
5
  import { errorMessage } from '../util/log.js';
5
6
  import { compactionCountsAt, tokenTallySince } from './doctor-reads.js';
@@ -16,8 +17,7 @@ function attempt(read) {
16
17
  }
17
18
  /** Everything `hippo doctor` reads from one store; throws when it cannot be opened or its schema version read. */
18
19
  export function readStoreHealth(hippoRoot, cutoffs) {
19
- const db = openHippoDbReadOnly(hippoRoot);
20
- try {
20
+ return onHandle(hippoRoot, (db) => {
21
21
  return {
22
22
  schemaVersion: getSchemaVersion(db),
23
23
  memories: countTableRows(db, 'memories'),
@@ -28,24 +28,17 @@ export function readStoreHealth(hippoRoot, cutoffs) {
28
28
  lastSleep: attempt(() => lastConsolidationAt(db)),
29
29
  compactions: attempt(() => compactionCountsAt(db, cutoffs.stuckBefore, cutoffs.transcriptFloor)),
30
30
  };
31
- }
32
- finally {
33
- closeHippoDb(db);
34
- }
31
+ }, openHippoDbReadOnly);
35
32
  }
36
33
  /** Schema version, oldest allowed binary and row count of every table, for a support bundle; never reads a memory column. */
37
34
  export function readStoreInventory(hippoRoot) {
38
- const db = openHippoDbReadOnly(hippoRoot);
39
- try {
35
+ return onHandle(hippoRoot, (db) => {
40
36
  const schemaVersion = getSchemaVersion(db);
41
37
  const minCompatibleBinary = getMeta(db, 'min_compatible_binary', '') || null;
42
38
  const tables = {};
43
39
  for (const name of listTableNames(db))
44
40
  tables[name] = countTableRows(db, name);
45
41
  return { schemaVersion, minCompatibleBinary, tables };
46
- }
47
- finally {
48
- closeHippoDb(db);
49
- }
42
+ }, openHippoDbReadOnly);
50
43
  }
51
44
  //# sourceMappingURL=diagnostics.js.map
@@ -1,27 +1,12 @@
1
- /**
2
- * Dormant memories: what sleep does with a faded memory instead of deleting
3
- * it (config `dormant.enabled`, on by default; `retentionDays` bounds how
4
- * long one is kept).
5
- *
6
- * A dormant memory keeps its full content in `dormant_memories` (schema v44)
7
- * but is no longer a `memories` row, so recall, context, every sleep pass and
8
- * every other reader of `memories` stop seeing it exactly as if it had been
9
- * deleted. `hippo dormant` lists and searches them, `hippo dormant restore`
10
- * brings one back, `hippo dormant forget` deletes one for good.
11
- *
12
- * Not to be confused with the raw archive (`raw_archive`, `archiveRawMemory`,
13
- * `hippo forget --archive`): that path removes a raw receipt's content and
14
- * keeps only its metadata. A dormant memory keeps its content.
15
- *
16
- * The db-taking helpers leave the handle and any transaction to the caller.
17
- * The hippoRoot-taking functions at the end open one of their own, for
18
- * api.listDormant / restoreDormant / forgetDormant / isDormant.
19
- */
1
+ /** Dormant memories: what sleep does with a faded memory instead of deleting it (config `dormant.enabled`; `retentionDays` bounds how long one is kept).
2
+ * Content stays in `dormant_memories` (schema v44) and the `memories` row goes, so every reader of `memories` stops seeing it, as if deleted.
3
+ * Not the raw archive (`raw_archive`, `archiveRawMemory`), which keeps metadata only. db-taking helpers leave the handle and transaction to the caller. */
20
4
  import { type DatabaseSyncLike } from '../db/index.js';
21
5
  import type { MemoryEntry } from '../core/memory.js';
22
6
  import type { SqlFragment } from './recall-scope.js';
23
7
  import type { WriteBudget } from '../util/write-budget.js';
24
- /** Why a memory went dormant: sleep's decay pass, an imported agent memory whose note was deleted, `hippo projects repair` splitting a two-project merge, or `hippo audit repair` setting aside an automatic memory with a certain defect. */
8
+ /** Why a memory went dormant: sleep's decay pass, an imported agent memory whose note was deleted, `hippo projects repair`
9
+ * splitting a two-project merge, or `hippo audit repair` setting aside an automatic memory with a certain defect. */
25
10
  export type DormantReason = 'decay' | 'source-deleted' | 'project-repair' | 'quality-repair';
26
11
  /** One memory that sleep is moving out of active memory into the dormant store. */
27
12
  export interface DormantMove {
@@ -53,11 +38,7 @@ export interface ListDormantOpts {
53
38
  /** Maximum rows returned, newest first. Default 20. */
54
39
  limit?: number;
55
40
  }
56
- /**
57
- * Insert (or refresh) the dormant snapshot for `move.entry`. Does not touch
58
- * the `memories` row: the caller deletes it in the same transaction, so the
59
- * memory is never in both places or in neither.
60
- */
41
+ /** Insert (or refresh) the dormant snapshot for `move.entry`; the caller deletes the `memories` row in the same transaction. */
61
42
  export declare function insertDormantRow(db: DatabaseSyncLike, move: DormantMove): void;
62
43
  /** A dormant memory's stored snapshot plus when and why it went dormant. */
63
44
  export interface DormantSnapshot {
@@ -66,10 +47,7 @@ export interface DormantSnapshot {
66
47
  strength: number;
67
48
  dormantAt: string;
68
49
  }
69
- /**
70
- * The stored snapshot for a tenant's dormant memory, or null when the tenant
71
- * has no dormant memory with that id (another tenant's id reads as absent).
72
- */
50
+ /** A tenant's stored dormant snapshot, or null when it has none with that id (another tenant's id reads as absent). */
73
51
  export declare function readDormantSnapshot(db: DatabaseSyncLike, tenantId: string, id: string): DormantSnapshot | null;
74
52
  /** Every dormant memory of a tenant whose snapshot still reads back. */
75
53
  export declare function listDormantSnapshots(db: DatabaseSyncLike, tenantId: string): DormantSnapshot[];
@@ -1,23 +1,8 @@
1
- /**
2
- * Dormant memories: what sleep does with a faded memory instead of deleting
3
- * it (config `dormant.enabled`, on by default; `retentionDays` bounds how
4
- * long one is kept).
5
- *
6
- * A dormant memory keeps its full content in `dormant_memories` (schema v44)
7
- * but is no longer a `memories` row, so recall, context, every sleep pass and
8
- * every other reader of `memories` stop seeing it exactly as if it had been
9
- * deleted. `hippo dormant` lists and searches them, `hippo dormant restore`
10
- * brings one back, `hippo dormant forget` deletes one for good.
11
- *
12
- * Not to be confused with the raw archive (`raw_archive`, `archiveRawMemory`,
13
- * `hippo forget --archive`): that path removes a raw receipt's content and
14
- * keeps only its metadata. A dormant memory keeps its content.
15
- *
16
- * The db-taking helpers leave the handle and any transaction to the caller.
17
- * The hippoRoot-taking functions at the end open one of their own, for
18
- * api.listDormant / restoreDormant / forgetDormant / isDormant.
19
- */
1
+ /** Dormant memories: what sleep does with a faded memory instead of deleting it (config `dormant.enabled`; `retentionDays` bounds how long one is kept).
2
+ * Content stays in `dormant_memories` (schema v44) and the `memories` row goes, so every reader of `memories` stops seeing it, as if deleted.
3
+ * Not the raw archive (`raw_archive`, `archiveRawMemory`), which keeps metadata only. db-taking helpers leave the handle and transaction to the caller. */
20
4
  import { closeHippoDb, openHippoDb, withWriteScope, withWriteScopeOr } from '../db/index.js';
5
+ import { onHandle } from './open.js';
21
6
  import { RejectedValueError, rejectionDigest } from './rejection.js';
22
7
  import { escapeLike } from '../util/escape.js';
23
8
  import { warnDamagedColumn } from '../util/stored-json.js';
@@ -27,11 +12,7 @@ import { audit, auditRejectionRefusal } from './audit-event.js';
27
12
  import { entryIdTakenAt } from './entry-reads.js';
28
13
  import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
29
14
  const DEFAULT_LIST_LIMIT = 20;
30
- /**
31
- * Insert (or refresh) the dormant snapshot for `move.entry`. Does not touch
32
- * the `memories` row: the caller deletes it in the same transaction, so the
33
- * memory is never in both places or in neither.
34
- */
15
+ /** Insert (or refresh) the dormant snapshot for `move.entry`; the caller deletes the `memories` row in the same transaction. */
35
16
  export function insertDormantRow(db, move) {
36
17
  db.prepare(`
37
18
  INSERT INTO dormant_memories (tenant_id, id, content, entry_json, reason, strength, dormant_at)
@@ -44,10 +25,7 @@ export function insertDormantRow(db, move) {
44
25
  dormant_at = excluded.dormant_at
45
26
  `).run(move.entry.tenantId, move.entry.id, move.entry.content, JSON.stringify(move.entry), move.reason, move.strength, move.dormantAt);
46
27
  }
47
- /**
48
- * Parse a stored snapshot back into a MemoryEntry, or null when the row no
49
- * longer matches the snapshot it carries (edited by hand, or truncated).
50
- */
28
+ /** Parse a stored snapshot back into a MemoryEntry, or null when the row no longer matches it (edited by hand, or truncated). */
51
29
  function parseSnapshot(row) {
52
30
  try {
53
31
  // SAFETY: entry_json is only written by insertDormantRow from a MemoryEntry;
@@ -94,10 +72,7 @@ function listDormantRows(db, tenantId, opts = {}, admit = EVERY_SCOPE) {
94
72
  LIMIT ?`).all(tenantId, ...admit.params, ...terms.map((t) => `%${escapeLike(t)}%`), limit);
95
73
  return rows.map(rowToDormantMemory);
96
74
  }
97
- /**
98
- * The stored snapshot for a tenant's dormant memory, or null when the tenant
99
- * has no dormant memory with that id (another tenant's id reads as absent).
100
- */
75
+ /** A tenant's stored dormant snapshot, or null when it has none with that id (another tenant's id reads as absent). */
101
76
  export function readDormantSnapshot(db, tenantId, id) {
102
77
  // SAFETY: row's shape matches the seven columns named in the SELECT.
103
78
  const row = db.prepare(`SELECT tenant_id, id, content, entry_json, reason, strength, dormant_at
@@ -193,23 +168,15 @@ export async function expireDormantBefore(hippoRoot, cutoffIso, opts) {
193
168
  }
194
169
  /** A tenant's dormant memories whose scope `admit` passes, newest first, read on a handle of its own. */
195
170
  export function loadDormantMemories(hippoRoot, tenantId, opts = {}, admit = EVERY_SCOPE) {
196
- const db = openHippoDb(hippoRoot);
197
- try {
171
+ return onHandle(hippoRoot, (db) => {
198
172
  return listDormantRows(db, tenantId, opts, admit);
199
- }
200
- finally {
201
- closeHippoDb(db);
202
- }
173
+ });
203
174
  }
204
175
  /** Whether a tenant holds a dormant memory with this id whose scope `admit` passes, read on a handle of its own. */
205
176
  export function holdsDormantMemory(hippoRoot, tenantId, id, admit = EVERY_SCOPE) {
206
- const db = openHippoDb(hippoRoot);
207
- try {
177
+ return onHandle(hippoRoot, (db) => {
208
178
  return hasDormantRow(db, tenantId, id, admit);
209
- }
210
- finally {
211
- closeHippoDb(db);
212
- }
179
+ });
213
180
  }
214
181
  function auditDormantRestore(db, restore, snapshot, now) {
215
182
  appendAuditEvent(db, {
@@ -244,8 +211,7 @@ function restoreInWriteScope(db, restore) {
244
211
  }
245
212
  /** Brings one dormant memory back on a single handle: the live row, the dormant delete and the audit row commit together, then its mirrors are written. */
246
213
  export function restoreDormantMemory(hippoRoot, restore) {
247
- const db = openHippoDb(hippoRoot);
248
- try {
214
+ return onHandle(hippoRoot, (db) => {
249
215
  let outcome;
250
216
  try {
251
217
  outcome = restoreInWriteScope(db, restore);
@@ -259,24 +225,17 @@ export function restoreDormantMemory(hippoRoot, restore) {
259
225
  if (outcome.status === 'restored')
260
226
  writeEntryMirrors(hippoRoot, outcome.entry);
261
227
  return outcome;
262
- }
263
- finally {
264
- closeHippoDb(db);
265
- }
228
+ });
266
229
  }
267
230
  /** Deletes a tenant's dormant memory for good and writes its `forget` audit row, on a single handle; false when it holds none `admit` passes. */
268
231
  export function forgetDormantMemory(hippoRoot, forget) {
269
232
  const { tenantId, id, actor, admit } = forget;
270
- const db = openHippoDb(hippoRoot);
271
- try {
233
+ return onHandle(hippoRoot, (db) => {
272
234
  if (!hasDormantRow(db, tenantId, id, admit) || !deleteDormantRow(db, tenantId, id))
273
235
  return false;
274
236
  // Best-effort, like every other forget audit row: the delete stands.
275
237
  audit(db, 'forget', { tenantId, actor, targetId: id, metadata: { dormant: true } });
276
238
  return true;
277
- }
278
- finally {
279
- closeHippoDb(db);
280
- }
239
+ });
281
240
  }
282
241
  //# sourceMappingURL=dormant.js.map