hippo-memory 1.70.0 → 1.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -1,3 +1,4 @@
1
+ import { DEFAULT_TENANT_ID } from '../util/env.js';
1
2
  import { BadRequestError, NotFoundError } from '../core/api-errors.js';
2
3
  import { isFtsAvailable, withWriteScope } from '../db/index.js';
3
4
  import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
@@ -7,9 +8,8 @@ export function markMirrorCleaned(db, memoryId, at) {
7
8
  db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(at, memoryId);
8
9
  }
9
10
  function loadRawRow(db, id) {
10
- // SAFETY: SELECT * FROM memories returns every column of the memories table; only
11
- // kind, tenant_id, and dag_parent_id are read below, all guaranteed present (possibly
12
- // null) by the memories schema.
11
+ // SAFETY: SELECT * returns every memories column; only kind, tenant_id and dag_parent_id are read below, all guaranteed present (possibly null) by the
12
+ // schema.
13
13
  const row = db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
14
14
  if (!row)
15
15
  throw new NotFoundError(`memory not found: ${id}`);
@@ -19,15 +19,13 @@ function loadRawRow(db, id) {
19
19
  return row;
20
20
  }
21
21
  function moveRowToArchive(db, id, row, opts) {
22
- // GDPR: raw_archive stores ONLY metadata, not the original
23
- // memory content. The audit_log row appended below carries op='archive_raw'
24
- // for the compliance audit trail. True right-to-be-forgotten — the original
25
- // content is unrecoverable from raw_archive after this point.
22
+ // GDPR: raw_archive stores ONLY metadata, never the original content; the archive_raw audit row is the compliance trail,
23
+ // so the content is unrecoverable from here on.
26
24
  const archivedAt = new Date().toISOString();
27
25
  const redactedPayload = JSON.stringify({
28
26
  redacted: true,
29
27
  archived_at: archivedAt,
30
- tenant_id: row.tenant_id ?? 'default',
28
+ tenant_id: row.tenant_id ?? DEFAULT_TENANT_ID,
31
29
  kind: row.kind,
32
30
  reason: opts.reason,
33
31
  });
@@ -40,15 +38,12 @@ function moveRowToArchive(db, id, row, opts) {
40
38
  db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
41
39
  return archivedAt;
42
40
  }
43
- // Emit the archive_raw audit event inside the SAVEPOINT so the audit row is
44
- // committed atomically with the row deletion. Use the row's own tenant_id
45
- // (fetched above as part of SELECT *), not the env. Archives must be
46
- // attributed to the tenant that owns the row, not whatever HIPPO_TENANT
47
- // happens to be set to in the calling shell.
41
+ // Emit the archive_raw audit inside the SAVEPOINT so it commits atomically with the row deletion, attributed to the row's own tenant_id,
42
+ // not whatever HIPPO_TENANT the calling shell has set.
48
43
  function auditArchive(db, id, row, opts) {
49
44
  try {
50
45
  appendAuditEvent(db, {
51
- tenantId: String(row.tenant_id ?? 'default'),
46
+ tenantId: String(row.tenant_id ?? DEFAULT_TENANT_ID),
52
47
  actor: opts.who || 'cli',
53
48
  op: 'archive_raw',
54
49
  targetId: id,
@@ -60,15 +55,8 @@ function auditArchive(db, id, row, opts) {
60
55
  reportAuditWriteFailure('archive_raw', String(error), id);
61
56
  }
62
57
  }
63
- /**
64
- * The only legitimate path to remove a `kind='raw'` row from `memories`.
65
- *
66
- * Snapshots the full row into `raw_archive`, flips `kind` to `'archived'` so the
67
- * append-only trigger lets the delete through, then deletes the row. All in one
68
- * write scope, which nests inside an outer transaction (e.g. batchWriteAndDelete).
69
- *
70
- * Throws if the row does not exist or is not `kind='raw'`. Returns the archived_at it wrote.
71
- */
58
+ /** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the append-only trigger allows the delete,
59
+ * all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
72
60
  export function archiveRawMemory(db, id, opts) {
73
61
  const row = loadRawRow(db, id);
74
62
  // A SAVEPOINT when already inside a transaction (e.g. batchWriteAndDelete), so a throw here
@@ -79,13 +67,10 @@ export function archiveRawMemory(db, id, opts) {
79
67
  // Archiving a child under a level-2 summary marks the parent dirty, inside the
80
68
  // SAVEPOINT so the dirty-mark commits atomically with the archive.
81
69
  if (row.dag_parent_id) {
82
- markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? 'default'), opts.who || 'cli');
70
+ markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? DEFAULT_TENANT_ID), opts.who || 'cli');
83
71
  }
84
- // afterArchive hook: connector-level idempotency markers
85
- // (e.g. slack_event_log) must commit atomically with the archive itself.
86
- // Throwing here rolls back the entire SAVEPOINT — both the archive and any
87
- // hook side effects. The hook runs INSIDE the SAVEPOINT so its writes
88
- // share the archive's transactional fate.
72
+ // afterArchive hook: connector idempotency markers (e.g. slack_event_log) must commit atomically with the archive, so it runs INSIDE the SAVEPOINT;
73
+ // throwing rolls back both.
89
74
  if (opts.afterArchive) {
90
75
  opts.afterArchive(db, id);
91
76
  }
@@ -1,19 +1,6 @@
1
- /**
2
- * Retrieval-trace persistence.
3
- *
4
- * Single producer for the `recall_traces` / `recall_trace_results` /
5
- * `recall_trace_outcomes` tables (schema v40). Every recall on the three
6
- * wired paths (api.recall, api.getContext, CLI cmdRecall) writes a trace
7
- * row: the ids + ranks + scores actually returned. Outcome events that
8
- * resolve their targets from last-retrieval state link back to the trace
9
- * they judge via `recordTraceOutcome`. This is the (query, shown, outcome)
10
- * training triple every Track LC learned component needs.
11
- *
12
- * All writes here are fail-soft: a broken trace write must never break the
13
- * surrounding recall or outcome call. Failures are logged to stderr and
14
- * swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
15
- * new debug env var).
16
- */
1
+ /** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and `recall_trace_outcomes`.
2
+ * One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown, outcome) triple the learned components train on.
3
+ * All writes are fail-soft: a failed trace write is logged to stderr and swallowed, never breaking the surrounding call. */
17
4
  import { type DatabaseSyncLike } from '../db/index.js';
18
5
  import type { RerankStep } from '../core/search-types.js';
19
6
  import { type DeliveryEventInput } from './delivery-recorder.js';
@@ -31,7 +18,7 @@ export interface RecallTraceInput {
31
18
  sessionId?: string | null;
32
19
  pipeline: 'api' | 'cli' | 'context' | 'mcp';
33
20
  /** Raw query text. NEVER persisted — only its sha256/16 hash + length are
34
- * stored (GDPR Path A / audit convention, cli.ts:1532). */
21
+ * stored (GDPR Path A / audit convention, CLI). */
35
22
  query: string;
36
23
  /** True when the caller ran with explain/--why (per-result rerank steps
37
24
  * may be present). Defaults to false. */
@@ -39,39 +26,11 @@ export interface RecallTraceInput {
39
26
  /** Results in returned rank order (index 0 = rank 1). */
40
27
  results: RecallTraceResultInput[];
41
28
  }
42
- /**
43
- * Insert a `recall_traces` row + its `recall_trace_results` rows in ONE
44
- * transaction, on the connection handed in. Fail-soft: never throws —
45
- * logs to stderr and returns null on any failure.
46
- *
47
- * Connection policy: api.recall and api.getContext reach this through
48
- * `finishRecallAt`, on the handle that recall's other writes use. CLI
49
- * cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
50
- * handle is already closed by the time tracing runs.
51
- */
29
+ /** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to stderr and returns null on failure.
30
+ * api.recall/getContext reach this via `finishRecallAt` on their own handle; CLI cmdRecall uses `writeRecallTraceAtRoot` (its audit handle is closed). */
52
31
  export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTraceInput): number | null;
53
- /**
54
- * Convenience wrapper: opens a fresh short-lived connection at `root`,
55
- * writes the trace, and closes. Returns the new trace id, or null on any
56
- * failure (fail-soft).
57
- *
58
- * Used at CLI cmdRecall, where the block's own convention is per-call
59
- * handles (writeEntry, saveIndex) and the earlier audit handle is already
60
- * closed. NOT used by api.recall, which must reuse the caller's open handle
61
- * (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
62
- *
63
- * This function does NOT touch the `last_trace_id` meta key: its own connection
64
- * would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
65
- * INVARIANT: `last_trace_id` must only ever advance in the SAME write as
66
- * `last_retrieval_ids`. The caller now does: call this function FIRST, set
67
- * `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
68
- * once — `saveIndex` persists both meta keys in one transaction
69
- * (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
70
- * (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
71
- * all, so they can't desync by construction.
72
- *
73
- * Fail-soft: never throws, including on connection failure.
74
- */
32
+ /** Short-lived connection at `root`: writes the trace, closes; returns the id or null (fail-soft). For CLI cmdRecall; api.recall must reuse its open handle.
33
+ * LOCKSTEP: never touches `last_trace_id`, which advances only in the same `saveIndex` write as `last_retrieval_ids`; the caller sets it from the id. */
75
34
  export declare function writeRecallTraceAtRoot(root: string, input: RecallTraceInput): number | null;
76
35
  /** Input to `recordTraceOutcome`. */
77
36
  export interface RecordTraceOutcomeInput {
@@ -81,34 +40,8 @@ export interface RecordTraceOutcomeInput {
81
40
  /** Ids actually credited by this outcome event (post tenant-filtering). */
82
41
  memoryIds: string[];
83
42
  }
84
- /**
85
- * Record an outcome event against a trace, linking the (query, shown,
86
- * outcome) triple. Called ONLY where the credited ids actually come from
87
- * the last-retrieval mechanism (api.outcomeForLastRecall and any outcome
88
- * flow that resolves its targets from last-retrieval state) or from an
89
- * SDK caller's explicit `traceId` opt — never unconditionally from
90
- * api.outcome, which would mislink an explicit-id caller to a stale,
91
- * unrelated trace.
92
- *
93
- * Lives in its own append-only table, not audit_log metadata: audit_log is
94
- * pruned by `pruneAuditLog`, and pruning must never erase training data.
95
- *
96
- * Validation: `traceId`/`memoryIds` reach
97
- * this function from caller-side state (`last_trace_id` / applied outcome
98
- * ids) that can go stale relative to the trace it names — a forgotten
99
- * memory, a tenant switch mid-session, or a race between two callers. Two
100
- * checks run before the insert, both skip with one log.warn line
101
- * rather than throw:
102
- * 1. The named trace must exist and belong to `input.tenantId` — a
103
- * tenant mismatch or a dangling id (deleted trace) skips.
104
- * 2. `input.memoryIds` is intersected against the trace's OWN
105
- * `recall_trace_results.memory_id` set — only ids that trace actually
106
- * returned are recorded. An id that was never in this trace's result
107
- * set (stale caller state) is silently dropped rather than recorded
108
- * as a false credit. If the intersection is empty, no row is written.
109
- *
110
- * Fail-soft: never throws.
111
- */
43
+ /** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from api.outcome (stale-trace mislink).
44
+ * Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
112
45
  export declare function recordTraceOutcome(db: DatabaseSyncLike, input: RecordTraceOutcomeInput): void;
113
46
  /** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
114
47
  export declare const DELIVERY_LEDGER_RETENTION_DAYS = 90;
@@ -168,6 +101,8 @@ export interface DeliveryEventRow {
168
101
  recall_hash: string | null;
169
102
  emitted_hash: string | null;
170
103
  elapsed_ms: number;
104
+ tool_use_id: string | null;
105
+ failure_id: number | null;
171
106
  candidates: DeliveryCandidateRow[];
172
107
  }
173
108
  /** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a transaction on `db`. */
@@ -1,33 +1,14 @@
1
- /**
2
- * Retrieval-trace persistence.
3
- *
4
- * Single producer for the `recall_traces` / `recall_trace_results` /
5
- * `recall_trace_outcomes` tables (schema v40). Every recall on the three
6
- * wired paths (api.recall, api.getContext, CLI cmdRecall) writes a trace
7
- * row: the ids + ranks + scores actually returned. Outcome events that
8
- * resolve their targets from last-retrieval state link back to the trace
9
- * they judge via `recordTraceOutcome`. This is the (query, shown, outcome)
10
- * training triple every Track LC learned component needs.
11
- *
12
- * All writes here are fail-soft: a broken trace write must never break the
13
- * surrounding recall or outcome call. Failures are logged to stderr and
14
- * swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
15
- * new debug env var).
16
- */
17
- import { createHash } from 'node:crypto';
18
- import { openHippoDb, closeHippoDb, rethrowIfSqliteBlocked, withWriteScope } from '../db/index.js';
1
+ /** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and `recall_trace_outcomes`.
2
+ * One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown, outcome) triple the learned components train on.
3
+ * All writes are fail-soft: a failed trace write is logged to stderr and swallowed, never breaking the surrounding call. */
4
+ import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
5
+ import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
19
6
  import { DELIVERY_LEDGER_VERSION, isBoundaryEvent } from './delivery-recorder.js';
20
- import { errorMessage, log } from '../util/log.js';
7
+ import { errorFields, errorMessage, log } from '../util/log.js';
21
8
  import { DAY_MS } from '../util/time.js';
22
- /**
23
- * Strip a RerankStep down to {stage, multiplier, scoreBefore, scoreAfter}
24
- * before persisting. `note` is
25
- * free-form human text — the CLI's goal-boost step embeds matched goal tag
26
- * text there, so persisting it verbatim would leak raw user content into
27
- * training data via `rerank_json`. Only the four structured fields survive;
28
- * any other/future free-form field is dropped by construction (allowlist,
29
- * not a denylist).
30
- */
9
+ import { blockHash } from '../util/token-text.js';
10
+ /** Strip a RerankStep to {stage, multiplier, scoreBefore, scoreAfter}: `note` is free-form (the CLI goal-boost step embeds goal tag text) and would leak
11
+ * user content into `rerank_json`; an allowlist, so any future free-form field is dropped too. */
31
12
  function sanitizeRerankSteps(steps) {
32
13
  return steps.map((s) => ({
33
14
  stage: s.stage,
@@ -36,19 +17,11 @@ function sanitizeRerankSteps(steps) {
36
17
  scoreAfter: s.scoreAfter,
37
18
  }));
38
19
  }
39
- /**
40
- * Insert a `recall_traces` row + its `recall_trace_results` rows in ONE
41
- * transaction, on the connection handed in. Fail-soft: never throws —
42
- * logs to stderr and returns null on any failure.
43
- *
44
- * Connection policy: api.recall and api.getContext reach this through
45
- * `finishRecallAt`, on the handle that recall's other writes use. CLI
46
- * cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
47
- * handle is already closed by the time tracing runs.
48
- */
20
+ /** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to stderr and returns null on failure.
21
+ * api.recall/getContext reach this via `finishRecallAt` on their own handle; CLI cmdRecall uses `writeRecallTraceAtRoot` (its audit handle is closed). */
49
22
  export function writeRecallTrace(db, input) {
50
23
  try {
51
- const queryHash = createHash('sha256').update(input.query).digest('hex').slice(0, 16);
24
+ const queryHash = blockHash(input.query);
52
25
  const ts = new Date().toISOString();
53
26
  return withWriteScope(db, 'write_recall_trace', () => {
54
27
  const insertTrace = db.prepare(`
@@ -68,32 +41,12 @@ export function writeRecallTrace(db, input) {
68
41
  });
69
42
  }
70
43
  catch (error) {
71
- log.error(`recall trace write failed: ${errorMessage(error)}`);
44
+ log.error(`recall trace write failed: ${errorMessage(error)}`, errorFields(error));
72
45
  return null;
73
46
  }
74
47
  }
75
- /**
76
- * Convenience wrapper: opens a fresh short-lived connection at `root`,
77
- * writes the trace, and closes. Returns the new trace id, or null on any
78
- * failure (fail-soft).
79
- *
80
- * Used at CLI cmdRecall, where the block's own convention is per-call
81
- * handles (writeEntry, saveIndex) and the earlier audit handle is already
82
- * closed. NOT used by api.recall, which must reuse the caller's open handle
83
- * (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
84
- *
85
- * This function does NOT touch the `last_trace_id` meta key: its own connection
86
- * would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
87
- * INVARIANT: `last_trace_id` must only ever advance in the SAME write as
88
- * `last_retrieval_ids`. The caller now does: call this function FIRST, set
89
- * `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
90
- * once — `saveIndex` persists both meta keys in one transaction
91
- * (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
92
- * (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
93
- * all, so they can't desync by construction.
94
- *
95
- * Fail-soft: never throws, including on connection failure.
96
- */
48
+ /** Short-lived connection at `root`: writes the trace, closes; returns the id or null (fail-soft). For CLI cmdRecall; api.recall must reuse its open handle.
49
+ * LOCKSTEP: never touches `last_trace_id`, which advances only in the same `saveIndex` write as `last_retrieval_ids`; the caller sets it from the id. */
97
50
  export function writeRecallTraceAtRoot(root, input) {
98
51
  let db;
99
52
  try {
@@ -101,7 +54,7 @@ export function writeRecallTraceAtRoot(root, input) {
101
54
  }
102
55
  catch (error) {
103
56
  rethrowIfSqliteBlocked(error);
104
- log.error(`recall trace connection failed: ${errorMessage(error)}`);
57
+ log.error(`recall trace connection failed: ${errorMessage(error)}`, errorFields(error));
105
58
  return null;
106
59
  }
107
60
  try {
@@ -111,34 +64,8 @@ export function writeRecallTraceAtRoot(root, input) {
111
64
  closeHippoDb(db);
112
65
  }
113
66
  }
114
- /**
115
- * Record an outcome event against a trace, linking the (query, shown,
116
- * outcome) triple. Called ONLY where the credited ids actually come from
117
- * the last-retrieval mechanism (api.outcomeForLastRecall and any outcome
118
- * flow that resolves its targets from last-retrieval state) or from an
119
- * SDK caller's explicit `traceId` opt — never unconditionally from
120
- * api.outcome, which would mislink an explicit-id caller to a stale,
121
- * unrelated trace.
122
- *
123
- * Lives in its own append-only table, not audit_log metadata: audit_log is
124
- * pruned by `pruneAuditLog`, and pruning must never erase training data.
125
- *
126
- * Validation: `traceId`/`memoryIds` reach
127
- * this function from caller-side state (`last_trace_id` / applied outcome
128
- * ids) that can go stale relative to the trace it names — a forgotten
129
- * memory, a tenant switch mid-session, or a race between two callers. Two
130
- * checks run before the insert, both skip with one log.warn line
131
- * rather than throw:
132
- * 1. The named trace must exist and belong to `input.tenantId` — a
133
- * tenant mismatch or a dangling id (deleted trace) skips.
134
- * 2. `input.memoryIds` is intersected against the trace's OWN
135
- * `recall_trace_results.memory_id` set — only ids that trace actually
136
- * returned are recorded. An id that was never in this trace's result
137
- * set (stale caller state) is silently dropped rather than recorded
138
- * as a false credit. If the intersection is empty, no row is written.
139
- *
140
- * Fail-soft: never throws.
141
- */
67
+ /** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from api.outcome (stale-trace mislink).
68
+ * Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
142
69
  export function recordTraceOutcome(db, input) {
143
70
  try {
144
71
  // SAFETY: row shape matches the single `tenant_id` column named in the
@@ -165,7 +92,7 @@ export function recordTraceOutcome(db, input) {
165
92
  `).run(input.traceId, new Date().toISOString(), input.tenantId, input.outcome, JSON.stringify(credited));
166
93
  }
167
94
  catch (error) {
168
- log.error(`recall trace outcome write failed: ${errorMessage(error)}`);
95
+ log.error(`recall trace outcome write failed: ${errorMessage(error)}`, errorFields(error));
169
96
  }
170
97
  }
171
98
  /** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
@@ -179,7 +106,7 @@ const DELIVERY_EVENT_COLUMNS = [
179
106
  'session_id', 'session_state', 'host_turn_id', 'turn_seq', 'duplicate_of', 'prompt_hash', 'prompt_length', 'query_hash',
180
107
  'recall_trace_id', 'block_state', 'prompt_recall', 'considered_count', 'filtered_count', 'selected_count', 'emitted_count',
181
108
  'rejected_count', 'rejected_unlisted', 'sections_shown', 'sections_dropped', 'budget_tokens', 'selected_tokens',
182
- 'injected_tokens', 'static_hash', 'recall_hash', 'emitted_hash', 'elapsed_ms',
109
+ 'injected_tokens', 'static_hash', 'recall_hash', 'emitted_hash', 'elapsed_ms', 'tool_use_id', 'failure_id',
183
110
  ];
184
111
  function findDuplicateBoundary(db, input) {
185
112
  // SAFETY: rows carry exactly the `id` and `ts` columns selected.
@@ -191,7 +118,21 @@ function findDuplicateBoundary(db, input) {
191
118
  const at = Date.parse(input.ts);
192
119
  return rows.find((r) => Math.abs(Date.parse(r.ts) - at) <= DELIVERY_DUPLICATE_WINDOW_MS)?.id ?? null;
193
120
  }
121
+ function findDuplicateToolFailure(db, input) {
122
+ // Without a call id a time window would merge parallel failures, so two such fires stay two rows.
123
+ if (input.toolUseId === undefined || input.toolUseId === null)
124
+ return null;
125
+ // SAFETY: a single `id` column, undefined when no row matches.
126
+ const row = db.prepare(`
127
+ SELECT id FROM delivery_events
128
+ WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND tool_use_id = ? AND turn_seq IS NOT NULL
129
+ ORDER BY id LIMIT 1
130
+ `).get(input.tenantId, input.sessionId, input.eventType, input.toolUseId);
131
+ return row?.id ?? null;
132
+ }
194
133
  function findDuplicateTurn(db, input) {
134
+ if (input.eventType === 'tool-failure')
135
+ return findDuplicateToolFailure(db, input);
195
136
  // A boundary has no prompt, and two compactions of one session never start within the window, so time alone decides.
196
137
  if (isBoundaryEvent(input.eventType))
197
138
  return findDuplicateBoundary(db, input);
@@ -239,6 +180,7 @@ export function writeDeliveryEvent(db, input) {
239
180
  input.consideredCount, input.filteredCount, input.selectedCount, input.emittedCount, input.rejectedCount,
240
181
  input.rejectedUnlisted, input.sectionsShown, input.sectionsDropped, input.budgetTokens, input.selectedTokens,
241
182
  input.injectedTokens, input.staticHash, input.recallHash, input.emittedHash, Math.round(input.elapsedMs),
183
+ input.toolUseId ?? null, input.failureId ?? null,
242
184
  ];
243
185
  const eventId = Number(db.prepare(`
244
186
  INSERT INTO delivery_events (${DELIVERY_EVENT_COLUMNS.join(', ')})
@@ -258,8 +200,7 @@ export function writeDeliveryEvent(db, input) {
258
200
  });
259
201
  }
260
202
  catch (error) {
261
- // The prompt hook's stderr shows this exact `[hippo] delivery ledger` line, so it stays off the logger's format.
262
- console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
203
+ log.error(`delivery ledger write failed: ${errorMessage(error)}`);
263
204
  return null;
264
205
  }
265
206
  }
@@ -270,8 +211,7 @@ export function writeDeliveryEventAtRoot(root, input) {
270
211
  db = openHippoDb(root);
271
212
  }
272
213
  catch (error) {
273
- // Same hook stderr line as writeDeliveryEvent above.
274
- console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
214
+ log.error(`delivery ledger write failed: ${errorMessage(error)}`);
275
215
  return null;
276
216
  }
277
217
  try {
@@ -9,9 +9,10 @@ import { entryRejectRowAt, selectAllEntries } from './entry-reads.js';
9
9
  import { stampOriginProject } from './entry-row.js';
10
10
  import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
11
11
  import { purgeMirrorBestEffort } from './mirrors.js';
12
- import { openStore } from './open.js';
12
+ import { onHandle, openStore } from './open.js';
13
13
  import { archiveRawMemory, markMirrorCleaned } from './raw-archive.js';
14
- import { RejectedValueError, checkRejectionGuard, deleteRejectedValue, insertRejectedValue, listRejectedValues, normalizeValueForRejection, rejectionDigest, } from './rejection.js';
14
+ import { checkRejectionGuard, deleteRejectedValue, insertRejectedValue, listRejectedValues, normalizeValueForRejection, rejectionDigest, } from './rejection.js';
15
+ import { RejectedValueError } from '../core/api-errors.js';
15
16
  function removeLiveRows(db, hippoRoot, rejection, holdsValue, removal) {
16
17
  const { tenantId, actor, reason } = rejection;
17
18
  const { removedIds, removedRawIds, successors } = removal;
@@ -81,8 +82,7 @@ function purgeRemovedMirrors(db, hippoRoot, removal) {
81
82
  * text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
82
83
  export function applyRejection(hippoRoot, rejection) {
83
84
  const { tenantId, actor, reason, memoryId } = rejection;
84
- const db = openStore(hippoRoot);
85
- try {
85
+ return onHandle(hippoRoot, (db) => {
86
86
  const content = rejection.textOf(memoryId === undefined ? undefined : entryRejectRowAt(db, memoryId));
87
87
  const digest = rejectionDigest(content);
88
88
  const rejectedAt = new Date().toISOString();
@@ -108,16 +108,12 @@ export function applyRejection(hippoRoot, rejection) {
108
108
  purgeRemovedMirrors(db, hippoRoot, removal);
109
109
  const { removedIds, removedRawIds, successors, dormantSuccessorIds } = removal;
110
110
  return { digest, content, removedIds, removedRawIds, successorIds: successors.map((s) => s.id), dormantSuccessorIds };
111
- }
112
- finally {
113
- closeHippoDb(db);
114
- }
111
+ }, openStore);
115
112
  }
116
113
  /** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
117
114
  * No match, or more than one, writes nothing. */
118
115
  export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
119
- const db = openStore(hippoRoot);
120
- try {
116
+ return onHandle(hippoRoot, (db) => {
121
117
  const matches = listRejectedValues(db, tenantId).filter((r) => r.digest.startsWith(digestPrefix));
122
118
  const target = matches[0];
123
119
  if (target === undefined)
@@ -127,20 +123,13 @@ export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
127
123
  deleteRejectedValue(db, tenantId, target.digest);
128
124
  audit(db, 'unreject_value', { tenantId, actor, targetId: target.sourceMemoryId ?? undefined, metadata: { digest: target.digest, reason: target.reason } });
129
125
  return { status: 'ok', digest: target.digest, reason: target.reason };
130
- }
131
- finally {
132
- closeHippoDb(db);
133
- }
126
+ }, openStore);
134
127
  }
135
128
  /** The tenant's rejected values, newest first. */
136
129
  export function loadRejectedValues(hippoRoot, tenantId) {
137
- const db = openStore(hippoRoot);
138
- try {
130
+ return onHandle(hippoRoot, (db) => {
139
131
  return listRejectedValues(db, tenantId);
140
- }
141
- finally {
142
- closeHippoDb(db);
143
- }
132
+ }, openStore);
144
133
  }
145
134
  /** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
146
135
  * and writes nothing, so a dry run counts the values a real run refuses. */
@@ -0,0 +1,4 @@
1
+ export type RejectionProbe = (tenantId: string, entryId: string, content: string) => boolean;
2
+ /** Runs `fn` with a probe that says whether the write guard would refuse the content; the handle closes after. */
3
+ export declare function withRejectionProbe<T>(hippoRoot: string, fn: (wouldReject: RejectionProbe) => T): T;
4
+ //# sourceMappingURL=rejection-probe.d.ts.map
@@ -0,0 +1,19 @@
1
+ // A rejected-value check for a dry run, on a handle the caller never sees.
2
+ import { onHandle } from './open.js';
3
+ import { checkRejectionGuard } from './rejection.js';
4
+ import { RejectedValueError } from '../core/api-errors.js';
5
+ /** Runs `fn` with a probe that says whether the write guard would refuse the content; the handle closes after. */
6
+ export function withRejectionProbe(hippoRoot, fn) {
7
+ return onHandle(hippoRoot, (db) => fn((tenantId, entryId, content) => {
8
+ try {
9
+ checkRejectionGuard(db, tenantId, entryId, content);
10
+ return false;
11
+ }
12
+ catch (err) {
13
+ if (err instanceof RejectedValueError)
14
+ return true;
15
+ throw err;
16
+ }
17
+ }));
18
+ }
19
+ //# sourceMappingURL=rejection-probe.js.map
@@ -1,52 +1,11 @@
1
- /**
2
- * Rejected-value tombstone: core invariant.
3
- *
4
- * Exact-normalized-value semantics: a human who rejects a fact can refuse
5
- * byte-stable re-ingestion of the same value across remember/capture/import/
6
- * sync surfaces. Paraphrase/semantic matching is explicitly out of scope
7
- * (documented limitation, plan "Design").
8
- *
9
- * Kept db-agnostic (helpers take a `DatabaseSyncLike` handle) and does NOT
10
- * import from store.ts — store.ts imports from here, and the reverse would
11
- * be a cycle.
12
- */
1
+ /** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value); paraphrase matching is out of scope.
2
+ * db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the store layer above it, which imports this (the reverse is a cycle). */
13
3
  import type { DatabaseSyncLike } from '../db/index.js';
14
- import { BadRequestError } from '../core/api-errors.js';
15
- /**
16
- * Normalize content for rejection-digest comparisons: Unicode NFC →
17
- * lowercase → collapse whitespace runs to a single space → trim. No
18
- * punctuation stripping — over-normalization creates false refusals, which
19
- * are worse than misses (plan §1).
20
- */
4
+ /** Normalize content for rejection digests: NFC, lowercase, collapse whitespace runs, trim. No punctuation stripping: over-normalizing causes false
5
+ * refusals, worse than misses. */
21
6
  export declare function normalizeValueForRejection(content: string): string;
22
- /**
23
- * Full sha256 hex (64 chars) of the normalized content. Reuses the strong-
24
- * identity convention (importers.ts:814 content-hash tag), NOT the privacy-
25
- * lossy 16-char convention (recall-trace query hashing) — a tombstone lookup
26
- * key needs collision resistance, not redaction (plan §1).
27
- */
7
+ /** Full 64-char sha256 hex of the normalized content: a tombstone key needs collision resistance, not the 16-char redaction hash used for query hashing. */
28
8
  export declare function rejectionDigest(content: string): string;
29
- /**
30
- * Thrown by the write-path guard (checkRejectionGuard, called from
31
- * upsertEntryRow) when an incoming write would introduce a value matching a
32
- * tombstoned digest. Carries enough context for the transaction-owner catch
33
- * blocks (writeEntry, api.supersede) to write a post-rollback
34
- * `reject_refusal` audit row via `auditRejectionRefusal` (plan §3).
35
- */
36
- export declare class RejectedValueError extends BadRequestError {
37
- readonly digest: string;
38
- readonly tenantId: string;
39
- readonly entryId: string;
40
- readonly reason: string | null;
41
- readonly rejectedAt: string;
42
- constructor(opts: {
43
- digest: string;
44
- tenantId: string;
45
- entryId: string;
46
- reason: string | null;
47
- rejectedAt: string;
48
- });
49
- }
50
9
  export interface RejectedValueRow {
51
10
  tenantId: string;
52
11
  digest: string;
@@ -56,15 +15,9 @@ export interface RejectedValueRow {
56
15
  sourceMemoryId: string | null;
57
16
  normalizedChars: number | null;
58
17
  }
59
- /**
60
- * Look up a tombstone by tenant + digest. One indexed point query — the
61
- * guard's common-case cost, a miss ends the guard (plan §3).
62
- */
18
+ /** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the guard. */
63
19
  export declare function findRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): RejectedValueRow | null;
64
- /**
65
- * Insert (or refresh) a tombstone row. Caller owns the transaction — used by
66
- * the `reject` verb and `resolveConflict`'s `rejectLoserValue` path.
67
- */
20
+ /** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and `resolveConflict`'s `rejectLoserValue`). */
68
21
  export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
69
22
  tenantId: string;
70
23
  digest: string;
@@ -74,27 +27,11 @@ export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
74
27
  sourceMemoryId?: string | null;
75
28
  normalizedChars: number;
76
29
  }): void;
77
- /**
78
- * Delete a tombstone by tenant + exact digest: the `unreject` verb, the
79
- * only escape hatch.
80
- */
30
+ /** Delete a tombstone by tenant + exact digest: the `unreject` verb, the only escape hatch. */
81
31
  export declare function deleteRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): boolean;
82
32
  /** List tombstones for a tenant, newest first: the `rejections` verb. */
83
33
  export declare function listRejectedValues(db: DatabaseSyncLike, tenantId: string): RejectedValueRow[];
84
- /**
85
- * The write-path guard's check helper, called from `upsertEntryRow`
86
- * (store.ts). Fires when the incoming content's digest matches a tombstone
87
- * AND the write *introduces* that content: the row is new, OR the stored
88
- * row's content digest differs from the incoming one — an UPSERT editing a
89
- * same-id row TO a rejected value is a content introduction and must be
90
- * refused. Unchanged same-id re-persists (recall boost, decay, star toggle)
91
- * are exempt by construction (plan §3).
92
- *
93
- * Ordering minimizes queries on the common (miss) path: (a) caller has
94
- * already computed nothing yet — this does the digest + point lookup first;
95
- * (b) a miss returns immediately (ONE indexed point query); (c) only on a
96
- * tombstone hit does it SELECT the stored row's content to classify
97
- * new-row vs content-introduction (+1 query, rare path).
98
- */
34
+ /** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row, or a same-id UPSERT changing it).
35
+ * Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss costs ONE indexed point query; only a hit SELECTs the stored row. */
99
36
  export declare function checkRejectionGuard(db: DatabaseSyncLike, tenantId: string, entryId: string, content: string): void;
100
37
  //# sourceMappingURL=rejection.d.ts.map