hippo-memory 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -1,6 +1,7 @@
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. */
1
+ /** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and
2
+ * `recall_trace_outcomes`. One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown,
3
+ * outcome) triple the learned components train on. All writes are fail-soft: a failed trace write is logged to stderr
4
+ * and swallowed, never breaking the surrounding call. */
4
5
  import { type DatabaseSyncLike } from '../db/index.js';
5
6
  import type { RerankStep } from '../core/search-types.js';
6
7
  import { type DeliveryEventInput } from './delivery-recorder.js';
@@ -12,7 +13,7 @@ export interface RecallTraceResultInput {
12
13
  * (or empty) persists `rerank_json` as NULL. */
13
14
  rerankSteps?: RerankStep[];
14
15
  }
15
- /** Input to `writeRecallTrace` / `writeRecallTraceAtRoot`. */
16
+ /** Input to `writeRecallTrace`. */
16
17
  export interface RecallTraceInput {
17
18
  tenantId: string;
18
19
  sessionId?: string | null;
@@ -26,12 +27,9 @@ export interface RecallTraceInput {
26
27
  /** Results in returned rank order (index 0 = rank 1). */
27
28
  results: RecallTraceResultInput[];
28
29
  }
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). */
30
+ /** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to
31
+ * stderr and returns null on failure. api.recall/getContext reach this via `finishRecallAt` on their own handle. */
31
32
  export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTraceInput): number | null;
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. */
34
- export declare function writeRecallTraceAtRoot(root: string, input: RecallTraceInput): number | null;
35
33
  /** Input to `recordTraceOutcome`. */
36
34
  export interface RecordTraceOutcomeInput {
37
35
  traceId: number;
@@ -40,14 +38,17 @@ export interface RecordTraceOutcomeInput {
40
38
  /** Ids actually credited by this outcome event (post tenant-filtering). */
41
39
  memoryIds: string[];
42
40
  }
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. */
41
+ /** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from
42
+ * api.outcome (stale-trace mislink). Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it
43
+ * returned. Own table so `pruneAuditLog` cannot erase training data. */
45
44
  export declare function recordTraceOutcome(db: DatabaseSyncLike, input: RecordTraceOutcomeInput): void;
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. */
45
+ /** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real
46
+ * rows. */
47
47
  export declare const DELIVERY_LEDGER_RETENTION_DAYS = 90;
48
48
  /** Lock wait for the ledger's own connection: a busy store drops the row rather than slow the hook. */
49
49
  export declare const DELIVERY_LEDGER_WAIT_MS = 50;
50
- /** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire twice. */
50
+ /** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire
51
+ * twice. */
51
52
  export declare const DELIVERY_DUPLICATE_WINDOW_MS = 2000;
52
53
  /** One stored `delivery_candidates` row. */
53
54
  export interface DeliveryCandidateRow {
@@ -105,12 +106,16 @@ export interface DeliveryEventRow {
105
106
  failure_id: number | null;
106
107
  candidates: DeliveryCandidateRow[];
107
108
  }
108
- /** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a transaction on `db`. */
109
+ /** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a
110
+ * transaction on `db`. */
109
111
  export declare function writeDeliveryEvent(db: DatabaseSyncLike, input: DeliveryEventInput): number | null;
110
- /** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock. Fail-soft. */
112
+ /** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock.
113
+ * Fail-soft. */
111
114
  export declare function writeDeliveryEventAtRoot(root: string, input: DeliveryEventInput): number | null;
112
- /** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back after. */
115
+ /** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back
116
+ * after. */
113
117
  export declare function writeDeliveryEventOnHandle(db: DatabaseSyncLike, input: DeliveryEventInput): number | null;
114
- /** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less events. */
118
+ /** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less
119
+ * events. */
115
120
  export declare function readDeliveryEvents(db: DatabaseSyncLike, tenantId: string, sessionId: string | null): DeliveryEventRow[];
116
121
  //# sourceMappingURL=recall-trace.d.ts.map
@@ -1,15 +1,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. */
1
+ /** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and
2
+ * `recall_trace_outcomes`. One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown,
3
+ * outcome) triple the learned components train on. All writes are fail-soft: a failed trace write is logged to stderr
4
+ * and swallowed, never breaking the surrounding call. */
4
5
  import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
5
- import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
6
6
  import { DELIVERY_LEDGER_VERSION, isBoundaryEvent } from './delivery-recorder.js';
7
7
  import { errorFields, errorMessage, log } from '../util/log.js';
8
8
  import { DAY_MS } from '../util/time.js';
9
9
  import { blockHash } from '../util/token-text.js';
10
10
  import { placeholders } from '../util/sql.js';
11
- /** Strip a RerankStep to {stage, multiplier, scoreBefore, scoreAfter}: `note` is free-form (the CLI goal-boost step embeds goal tag text) and would leak
12
- * user content into `rerank_json`; an allowlist, so any future free-form field is dropped too. */
11
+ /** Strip a RerankStep to {stage, multiplier, scoreBefore, scoreAfter}: `note` is free-form (the CLI goal-boost step
12
+ * embeds goal tag text) and would leak user content into `rerank_json`; an allowlist, so any future free-form field is
13
+ * dropped too. */
13
14
  function sanitizeRerankSteps(steps) {
14
15
  return steps.map((s) => ({
15
16
  stage: s.stage,
@@ -18,15 +19,16 @@ function sanitizeRerankSteps(steps) {
18
19
  scoreAfter: s.scoreAfter,
19
20
  }));
20
21
  }
21
- /** 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.
22
- * api.recall/getContext reach this via `finishRecallAt` on their own handle; CLI cmdRecall uses `writeRecallTraceAtRoot` (its audit handle is closed). */
22
+ /** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to
23
+ * stderr and returns null on failure. api.recall/getContext reach this via `finishRecallAt` on their own handle. */
23
24
  export function writeRecallTrace(db, input) {
24
25
  try {
25
26
  const queryHash = blockHash(input.query);
26
27
  const ts = new Date().toISOString();
27
28
  return withWriteScope(db, 'write_recall_trace', () => {
28
29
  const insertTrace = db.prepare(`
29
- INSERT INTO recall_traces (ts, tenant_id, session_id, pipeline, query_hash, query_length, result_count, explain_mode)
30
+ INSERT INTO recall_traces (ts, tenant_id, session_id, pipeline, query_hash, query_length, result_count,
31
+ explain_mode)
30
32
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
31
33
  `);
32
34
  const traceResult = insertTrace.run(ts, input.tenantId, input.sessionId ?? null, input.pipeline, queryHash, input.query.length, input.results.length, input.explainMode ? 1 : 0);
@@ -46,27 +48,9 @@ export function writeRecallTrace(db, input) {
46
48
  return null;
47
49
  }
48
50
  }
49
- /** 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.
50
- * 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. */
51
- export function writeRecallTraceAtRoot(root, input) {
52
- let db;
53
- try {
54
- db = openHippoDb(root);
55
- }
56
- catch (error) {
57
- rethrowIfSqliteBlocked(error);
58
- log.error(`recall trace connection failed: ${errorMessage(error)}`, errorFields(error));
59
- return null;
60
- }
61
- try {
62
- return writeRecallTrace(db, input);
63
- }
64
- finally {
65
- closeHippoDb(db);
66
- }
67
- }
68
- /** 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).
69
- * Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
51
+ /** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from
52
+ * api.outcome (stale-trace mislink). Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it
53
+ * returned. Own table so `pruneAuditLog` cannot erase training data. */
70
54
  export function recordTraceOutcome(db, input) {
71
55
  try {
72
56
  // SAFETY: row shape matches the single `tenant_id` column named in the
@@ -96,18 +80,52 @@ export function recordTraceOutcome(db, input) {
96
80
  log.error(`recall trace outcome write failed: ${errorMessage(error)}`, errorFields(error));
97
81
  }
98
82
  }
99
- /** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
83
+ /** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real
84
+ * rows. */
100
85
  export const DELIVERY_LEDGER_RETENTION_DAYS = 90;
101
86
  /** Lock wait for the ledger's own connection: a busy store drops the row rather than slow the hook. */
102
87
  export const DELIVERY_LEDGER_WAIT_MS = 50;
103
- /** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire twice. */
88
+ /** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire
89
+ * twice. */
104
90
  export const DELIVERY_DUPLICATE_WINDOW_MS = 2000;
105
91
  const DELIVERY_EVENT_COLUMNS = [
106
- 'ts', 'ledger_version', 'tenant_id', 'runtime', 'event_type', 'surface', 'store_hash', 'write_store', 'project_hash',
107
- 'session_id', 'session_state', 'host_turn_id', 'turn_seq', 'duplicate_of', 'prompt_hash', 'prompt_length', 'query_hash',
108
- 'recall_trace_id', 'block_state', 'prompt_recall', 'considered_count', 'filtered_count', 'selected_count', 'emitted_count',
109
- 'rejected_count', 'rejected_unlisted', 'sections_shown', 'sections_dropped', 'budget_tokens', 'selected_tokens',
110
- 'injected_tokens', 'static_hash', 'recall_hash', 'emitted_hash', 'elapsed_ms', 'tool_use_id', 'failure_id',
92
+ 'ts',
93
+ 'ledger_version',
94
+ 'tenant_id',
95
+ 'runtime',
96
+ 'event_type',
97
+ 'surface',
98
+ 'store_hash',
99
+ 'write_store',
100
+ 'project_hash',
101
+ 'session_id',
102
+ 'session_state',
103
+ 'host_turn_id',
104
+ 'turn_seq',
105
+ 'duplicate_of',
106
+ 'prompt_hash',
107
+ 'prompt_length',
108
+ 'query_hash',
109
+ 'recall_trace_id',
110
+ 'block_state',
111
+ 'prompt_recall',
112
+ 'considered_count',
113
+ 'filtered_count',
114
+ 'selected_count',
115
+ 'emitted_count',
116
+ 'rejected_count',
117
+ 'rejected_unlisted',
118
+ 'sections_shown',
119
+ 'sections_dropped',
120
+ 'budget_tokens',
121
+ 'selected_tokens',
122
+ 'injected_tokens',
123
+ 'static_hash',
124
+ 'recall_hash',
125
+ 'emitted_hash',
126
+ 'elapsed_ms',
127
+ 'tool_use_id',
128
+ 'failure_id',
111
129
  ];
112
130
  function findDuplicateBoundary(db, input) {
113
131
  // SAFETY: rows carry exactly the `id` and `ts` columns selected.
@@ -149,11 +167,14 @@ function findDuplicateTurn(db, input) {
149
167
  if (input.promptHash === null)
150
168
  return null;
151
169
  // SAFETY: rows carry exactly the `id` and `ts` columns selected.
152
- const rows = db.prepare(`
170
+ const rows = db
171
+ .prepare(`
153
172
  SELECT id, ts FROM delivery_events
154
- WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND prompt_hash = ? AND host_turn_id IS NULL AND turn_seq IS NOT NULL
173
+ WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND prompt_hash = ? AND host_turn_id IS NULL AND turn_seq
174
+ IS NOT NULL
155
175
  ORDER BY id
156
- `).all(input.tenantId, input.sessionId, input.eventType, input.promptHash);
176
+ `)
177
+ .all(input.tenantId, input.sessionId, input.eventType, input.promptHash);
157
178
  const at = Date.parse(input.ts);
158
179
  // Absolute difference: two hook processes can commit out of ts order.
159
180
  return rows.find((r) => Math.abs(Date.parse(r.ts) - at) <= DELIVERY_DUPLICATE_WINDOW_MS)?.id ?? null;
@@ -166,7 +187,59 @@ function nextTurnSeq(db, input) {
166
187
  `).get(input.tenantId, input.sessionId, input.eventType);
167
188
  return (row.m ?? 0) + 1;
168
189
  }
169
- /** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a transaction on `db`. */
190
+ function deliveryEventValues(input, turnSeq, duplicateOf) {
191
+ return [
192
+ input.ts,
193
+ DELIVERY_LEDGER_VERSION,
194
+ input.tenantId,
195
+ input.runtime,
196
+ input.eventType,
197
+ input.surface,
198
+ input.storeHash,
199
+ input.writeStore,
200
+ input.projectHash,
201
+ input.sessionId,
202
+ input.sessionState,
203
+ input.hostTurnId,
204
+ turnSeq,
205
+ duplicateOf,
206
+ input.promptHash,
207
+ input.promptLength,
208
+ input.queryHash,
209
+ input.recallTraceId,
210
+ input.blockState,
211
+ input.promptRecall ? 1 : 0,
212
+ input.consideredCount,
213
+ input.filteredCount,
214
+ input.selectedCount,
215
+ input.emittedCount,
216
+ input.rejectedCount,
217
+ input.rejectedUnlisted,
218
+ input.sectionsShown,
219
+ input.sectionsDropped,
220
+ input.budgetTokens,
221
+ input.selectedTokens,
222
+ input.injectedTokens,
223
+ input.staticHash,
224
+ input.recallHash,
225
+ input.emittedHash,
226
+ Math.round(input.elapsedMs),
227
+ input.toolUseId ?? null,
228
+ input.failureId ?? null,
229
+ ];
230
+ }
231
+ function insertDeliveryCandidates(db, eventId, input) {
232
+ const insertCandidate = db.prepare(`
233
+ INSERT INTO delivery_candidates (event_id, tenant_id, memory_id, source_store, pool, stage, outcome, reason,
234
+ cand_rank, score, tokens)
235
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
236
+ `);
237
+ for (const c of input.candidates) {
238
+ insertCandidate.run(eventId, input.tenantId, c.memoryId, c.sourceStore, c.pool, c.stage, c.outcome, c.reason, c.rank, c.score, c.tokens);
239
+ }
240
+ }
241
+ /** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a
242
+ * transaction on `db`. */
170
243
  export function writeDeliveryEvent(db, input) {
171
244
  try {
172
245
  return withWriteScope(db, 'write_delivery_event', () => {
@@ -174,26 +247,12 @@ export function writeDeliveryEvent(db, input) {
174
247
  const isTurn = input.sessionId !== null && (input.sessionState === 'payload' || input.sessionState === 'env');
175
248
  const duplicateOf = isTurn ? findDuplicateTurn(db, input) : null;
176
249
  const turnSeq = isTurn && duplicateOf === null ? nextTurnSeq(db, input) : null;
177
- const values = [
178
- input.ts, DELIVERY_LEDGER_VERSION, input.tenantId, input.runtime, input.eventType, input.surface, input.storeHash,
179
- input.writeStore, input.projectHash, input.sessionId, input.sessionState, input.hostTurnId, turnSeq, duplicateOf,
180
- input.promptHash, input.promptLength, input.queryHash, input.recallTraceId, input.blockState, input.promptRecall ? 1 : 0,
181
- input.consideredCount, input.filteredCount, input.selectedCount, input.emittedCount, input.rejectedCount,
182
- input.rejectedUnlisted, input.sectionsShown, input.sectionsDropped, input.budgetTokens, input.selectedTokens,
183
- input.injectedTokens, input.staticHash, input.recallHash, input.emittedHash, Math.round(input.elapsedMs),
184
- input.toolUseId ?? null, input.failureId ?? null,
185
- ];
250
+ const values = deliveryEventValues(input, turnSeq, duplicateOf);
186
251
  const eventId = Number(db.prepare(`
187
252
  INSERT INTO delivery_events (${DELIVERY_EVENT_COLUMNS.join(', ')})
188
253
  VALUES (${placeholders(DELIVERY_EVENT_COLUMNS.length)})
189
254
  `).run(...values).lastInsertRowid);
190
- const insertCandidate = db.prepare(`
191
- INSERT INTO delivery_candidates (event_id, tenant_id, memory_id, source_store, pool, stage, outcome, reason, cand_rank, score, tokens)
192
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
193
- `);
194
- for (const c of input.candidates) {
195
- insertCandidate.run(eventId, input.tenantId, c.memoryId, c.sourceStore, c.pool, c.stage, c.outcome, c.reason, c.rank, c.score, c.tokens);
196
- }
255
+ insertDeliveryCandidates(db, eventId, input);
197
256
  const pruneFrom = Math.min(Date.parse(input.ts), Date.now());
198
257
  const cutoff = new Date(pruneFrom - DELIVERY_LEDGER_RETENTION_DAYS * DAY_MS).toISOString();
199
258
  db.prepare(`DELETE FROM delivery_events WHERE ts < ?`).run(cutoff);
@@ -201,18 +260,19 @@ export function writeDeliveryEvent(db, input) {
201
260
  });
202
261
  }
203
262
  catch (error) {
204
- log.error(`delivery ledger write failed: ${errorMessage(error)}`);
263
+ log.error(`delivery ledger write failed: ${errorMessage(error)}`, errorFields(error));
205
264
  return null;
206
265
  }
207
266
  }
208
- /** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock. Fail-soft. */
267
+ /** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock.
268
+ * Fail-soft. */
209
269
  export function writeDeliveryEventAtRoot(root, input) {
210
270
  let db;
211
271
  try {
212
272
  db = openHippoDb(root);
213
273
  }
214
274
  catch (error) {
215
- log.error(`delivery ledger write failed: ${errorMessage(error)}`);
275
+ log.error(`delivery ledger write failed: ${errorMessage(error)}`, errorFields(error));
216
276
  return null;
217
277
  }
218
278
  try {
@@ -222,7 +282,8 @@ export function writeDeliveryEventAtRoot(root, input) {
222
282
  closeHippoDb(db);
223
283
  }
224
284
  }
225
- /** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back after. */
285
+ /** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back
286
+ * after. */
226
287
  export function writeDeliveryEventOnHandle(db, input) {
227
288
  const prior = Math.trunc(Number(db.prepare('PRAGMA busy_timeout').get().timeout));
228
289
  db.exec(`PRAGMA busy_timeout = ${DELIVERY_LEDGER_WAIT_MS}`);
@@ -233,10 +294,12 @@ export function writeDeliveryEventOnHandle(db, input) {
233
294
  db.exec(`PRAGMA busy_timeout = ${prior}`);
234
295
  }
235
296
  }
236
- /** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less events. */
297
+ /** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less
298
+ * events. */
237
299
  export function readDeliveryEvents(db, tenantId, sessionId) {
238
300
  // SAFETY: SELECT * over delivery_events returns exactly the columns DeliveryEventRow names, less `candidates`.
239
- const events = db.prepare(`SELECT * FROM delivery_events WHERE tenant_id = ? AND session_id IS ? ORDER BY id`)
301
+ const events = db
302
+ .prepare(`SELECT * FROM delivery_events WHERE tenant_id = ? AND session_id IS ? ORDER BY id`)
240
303
  .all(tenantId, sessionId);
241
304
  const candidates = db.prepare(`
242
305
  SELECT * FROM delivery_candidates WHERE event_id = ?
@@ -4,25 +4,29 @@ import { type RejectedValueRow } from './rejection.js';
4
4
  type HoldsValue = (text: string) => boolean;
5
5
  /** The text, tenant and scope of the memory a rejection names. */
6
6
  export type RejectionSource = NonNullable<ReturnType<typeof entryRejectRowAt>>;
7
- /** One rejection as the store applies it. The three functions are the caller's policy over plain rows; none is handed the handle. */
7
+ /** One rejection as the store applies it. The three functions are the caller's policy over plain rows; none is handed
8
+ * the handle. */
8
9
  export interface Rejection {
9
10
  readonly tenantId: string;
10
11
  readonly actor: string;
11
12
  readonly reason: string;
12
13
  /** The memory whose row `textOf` is given; unset when the caller supplies the text itself. */
13
14
  readonly memoryId?: string;
14
- /** The text to reject. `source` is undefined when `memoryId` is unset or names no row; a throw refuses before any write. */
15
+ /** The text to reject. `source` is undefined when `memoryId` is unset or names no row; a throw refuses before any
16
+ * write. */
15
17
  readonly textOf: (source: RejectionSource | undefined) => string;
16
18
  /** False for a row this caller may not remove. */
17
19
  readonly inReach: (scope: string | null | undefined) => boolean;
18
- /** What replaces a merged row once the rejected text leaves it: undefined when it holds none, null when nothing else is left. */
20
+ /** What replaces a merged row once the rejected text leaves it: undefined when it holds none, null when nothing else
21
+ * is left. */
19
22
  readonly successorOf: (row: MemoryEntry, holdsValue: HoldsValue, removedIds: ReadonlySet<string>) => MemoryEntry | null | undefined;
20
23
  }
21
24
  export interface AppliedRejection {
22
25
  digest: string;
23
26
  /** The rejected text: the stored row keeps only its digest, so no later read can return it. */
24
27
  content: string;
25
- /** Every row removed, live or dormant: each whose digest matched, duplicates included, and each sleep-merged row holding the text. */
28
+ /** Every row removed, live or dormant: each whose digest matched, duplicates included, and each sleep-merged row
29
+ * holding the text. */
26
30
  removedIds: string[];
27
31
  /** The removedIds of kind 'raw', archived instead of deleted. */
28
32
  removedRawIds: string[];
@@ -30,8 +34,9 @@ export interface AppliedRejection {
30
34
  successorIds: string[];
31
35
  dormantSuccessorIds: string[];
32
36
  }
33
- /** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in reach that holds the
34
- * text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
37
+ /** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in
38
+ * reach that holds the text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown
39
+ * mirrors follow the commit. */
35
40
  export declare function applyRejection(hippoRoot: string, rejection: Rejection): AppliedRejection;
36
41
  export type LiftedRejection = {
37
42
  status: 'ok';
@@ -43,13 +48,13 @@ export type LiftedRejection = {
43
48
  status: 'ambiguous';
44
49
  candidates: RejectedValueRow[];
45
50
  };
46
- /** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
47
- * No match, or more than one, writes nothing. */
51
+ /** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit
52
+ * row. No match, or more than one, writes nothing. */
48
53
  export declare function liftRejection(hippoRoot: string, tenantId: string, digestPrefix: string, actor: string): LiftedRejection;
49
54
  /** The tenant's rejected values, newest first. */
50
55
  export declare function loadRejectedValues(hippoRoot: string, tenantId: string): RejectedValueRow[];
51
- /** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
52
- * and writes nothing, so a dry run counts the values a real run refuses. */
56
+ /** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a
57
+ * plain open and writes nothing, so a dry run counts the values a real run refuses. */
53
58
  export declare function rejectionGuardRefuses(hippoRoot: string, tenantId: string, entryId: string, content: string): boolean;
54
59
  export {};
55
60
  //# sourceMappingURL=rejected-values.d.ts.map
@@ -52,7 +52,8 @@ function removeLiveRows(db, hippoRoot, rejection, holdsValue, removal) {
52
52
  successors.push(kept);
53
53
  }
54
54
  }
55
- // Dormant copies go in the same write scope, so `hippo dormant restore` cannot bring the text back. They have no mirror to purge.
55
+ // Dormant copies go in the same write scope, so `hippo dormant restore` cannot bring the text back. They have no mirror
56
+ // to purge.
56
57
  function removeDormantCopies(db, rejection, digest, holdsValue, removal) {
57
58
  const { tenantId } = rejection;
58
59
  const { removedIds, dormantSuccessorIds } = removal;
@@ -72,7 +73,8 @@ function removeDormantCopies(db, rejection, digest, holdsValue, removal) {
72
73
  dormantSuccessorIds.push(successor.id);
73
74
  }
74
75
  }
75
- // After the commit, on the same handle: a purged raw mirror is stamped so the reaper skips it, and one that stays is logged.
76
+ // After the commit, on the same handle: a purged raw mirror is stamped so the reaper skips it, and one that stays is
77
+ // logged.
76
78
  function purgeRemovedMirrors(db, hippoRoot, removal) {
77
79
  for (const id of removal.removedIds) {
78
80
  const isRaw = removal.removedRawIds.includes(id);
@@ -83,8 +85,9 @@ function purgeRemovedMirrors(db, hippoRoot, removal) {
83
85
  for (const successor of removal.successors)
84
86
  writeEntryMirrors(hippoRoot, successor);
85
87
  }
86
- /** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in reach that holds the
87
- * text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
88
+ /** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in
89
+ * reach that holds the text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown
90
+ * mirrors follow the commit. */
88
91
  export function applyRejection(hippoRoot, rejection) {
89
92
  const { tenantId, actor, reason, memoryId } = rejection;
90
93
  return onHandle(hippoRoot, (db) => {
@@ -102,21 +105,34 @@ export function applyRejection(hippoRoot, rejection) {
102
105
  sourceMemoryId: memoryId ?? null,
103
106
  normalizedChars: normalizeValueForRejection(content).length,
104
107
  });
105
- // SHORTCUT: scans the tenant's text columns, fine for a human-run command; a digest column needs a schema migration, held until approved.
108
+ // SHORTCUT: scans the tenant's text columns, fine for a human-run command; a digest column needs a schema
109
+ // migration, held until approved.
106
110
  const holdsValue = (text) => rejectionDigest(text) === digest;
107
111
  removeLiveRows(db, hippoRoot, rejection, holdsValue, removal);
108
112
  removeDormantCopies(db, rejection, digest, holdsValue, removal);
109
113
  // Still inside the write scope: a failed audit row is reported and the reject commits without it.
110
114
  const { removedIds } = removal;
111
- audit(db, 'reject_value', { tenantId, actor, targetId: memoryId, metadata: { digest, removedIds, count: removedIds.length } });
115
+ audit(db, 'reject_value', {
116
+ tenantId,
117
+ actor,
118
+ targetId: memoryId,
119
+ metadata: { digest, removedIds, count: removedIds.length },
120
+ });
112
121
  });
113
122
  purgeRemovedMirrors(db, hippoRoot, removal);
114
123
  const { removedIds, removedRawIds, successors, dormantSuccessorIds } = removal;
115
- return { digest, content, removedIds, removedRawIds, successorIds: successors.map((s) => s.id), dormantSuccessorIds };
124
+ return {
125
+ digest,
126
+ content,
127
+ removedIds,
128
+ removedRawIds,
129
+ successorIds: successors.map((s) => s.id),
130
+ dormantSuccessorIds,
131
+ };
116
132
  }, openStore);
117
133
  }
118
- /** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
119
- * No match, or more than one, writes nothing. */
134
+ /** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit
135
+ * row. No match, or more than one, writes nothing. */
120
136
  export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
121
137
  return onHandle(hippoRoot, (db) => {
122
138
  const matches = listRejectedValues(db, tenantId).filter((r) => r.digest.startsWith(digestPrefix));
@@ -126,7 +142,12 @@ export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
126
142
  if (matches.length > 1)
127
143
  return { status: 'ambiguous', candidates: matches };
128
144
  deleteRejectedValue(db, tenantId, target.digest);
129
- audit(db, 'unreject_value', { tenantId, actor, targetId: target.sourceMemoryId ?? undefined, metadata: { digest: target.digest, reason: target.reason } });
145
+ audit(db, 'unreject_value', {
146
+ tenantId,
147
+ actor,
148
+ targetId: target.sourceMemoryId ?? undefined,
149
+ metadata: { digest: target.digest, reason: target.reason },
150
+ });
130
151
  return { status: 'ok', digest: target.digest, reason: target.reason };
131
152
  }, openStore);
132
153
  }
@@ -136,8 +157,8 @@ export function loadRejectedValues(hippoRoot, tenantId) {
136
157
  return listRejectedValues(db, tenantId);
137
158
  }, openStore);
138
159
  }
139
- /** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
140
- * and writes nothing, so a dry run counts the values a real run refuses. */
160
+ /** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a
161
+ * plain open and writes nothing, so a dry run counts the values a real run refuses. */
141
162
  export function rejectionGuardRefuses(hippoRoot, tenantId, entryId, content) {
142
163
  const db = openHippoDb(hippoRoot);
143
164
  try {
@@ -1,11 +1,9 @@
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). */
1
+ /** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value);
2
+ * paraphrase matching is out of scope. db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the
3
+ * store layer above it, which imports this (the reverse is a cycle). */
4
+ import { normalizeValueForRejection, rejectionDigest } from '../core/rejection-digest.js';
3
5
  import type { DatabaseSyncLike } from '../db/index.js';
4
- /** Normalize content for rejection digests: NFC, lowercase, collapse whitespace runs, trim. No punctuation stripping: over-normalizing causes false
5
- * refusals, worse than misses. */
6
- export declare function normalizeValueForRejection(content: string): string;
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. */
8
- export declare function rejectionDigest(content: string): string;
6
+ export { normalizeValueForRejection, rejectionDigest };
9
7
  export interface RejectedValueRow {
10
8
  tenantId: string;
11
9
  digest: string;
@@ -15,9 +13,11 @@ export interface RejectedValueRow {
15
13
  sourceMemoryId: string | null;
16
14
  normalizedChars: number | null;
17
15
  }
18
- /** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the guard. */
16
+ /** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the
17
+ * guard. */
19
18
  export declare function findRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): RejectedValueRow | null;
20
- /** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and `resolveConflict`'s `rejectLoserValue`). */
19
+ /** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and
20
+ * `resolveConflict`'s `rejectLoserValue`). */
21
21
  export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
22
22
  tenantId: string;
23
23
  digest: string;
@@ -31,7 +31,8 @@ export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
31
31
  export declare function deleteRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): boolean;
32
32
  /** List tombstones for a tenant, newest first: the `rejections` verb. */
33
33
  export declare function listRejectedValues(db: DatabaseSyncLike, tenantId: string): RejectedValueRow[];
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. */
34
+ /** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row,
35
+ * or a same-id UPSERT changing it). Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss
36
+ * costs ONE indexed point query; only a hit SELECTs the stored row. */
36
37
  export declare function checkRejectionGuard(db: DatabaseSyncLike, tenantId: string, entryId: string, content: string): void;
37
38
  //# sourceMappingURL=rejection.d.ts.map
@@ -1,16 +1,10 @@
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). */
3
- import { createHash } from 'node:crypto';
1
+ /** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value);
2
+ * paraphrase matching is out of scope. db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the
3
+ * store layer above it, which imports this (the reverse is a cycle). */
4
+ import { normalizeValueForRejection, rejectionDigest } from '../core/rejection-digest.js';
4
5
  import { RejectedValueError } from '../core/api-errors.js';
5
- /** Normalize content for rejection digests: NFC, lowercase, collapse whitespace runs, trim. No punctuation stripping: over-normalizing causes false
6
- * refusals, worse than misses. */
7
- export function normalizeValueForRejection(content) {
8
- return content.normalize('NFC').toLowerCase().replace(/\s+/g, ' ').trim();
9
- }
10
- /** 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. */
11
- export function rejectionDigest(content) {
12
- return createHash('sha256').update(normalizeValueForRejection(content)).digest('hex');
13
- }
6
+ // store-kit publishes rejectionDigest from this path.
7
+ export { normalizeValueForRejection, rejectionDigest };
14
8
  function rowToRejectedValue(row) {
15
9
  return {
16
10
  tenantId: row.tenant_id,
@@ -22,7 +16,8 @@ function rowToRejectedValue(row) {
22
16
  normalizedChars: row.normalized_chars,
23
17
  };
24
18
  }
25
- /** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the guard. */
19
+ /** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the
20
+ * guard. */
26
21
  export function findRejectedValue(db, tenantId, digest) {
27
22
  // SAFETY: row's shape matches the columns named in the SELECT above.
28
23
  const row = db
@@ -31,9 +26,11 @@ export function findRejectedValue(db, tenantId, digest) {
31
26
  .get(tenantId, digest);
32
27
  return row ? rowToRejectedValue(row) : null;
33
28
  }
34
- /** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and `resolveConflict`'s `rejectLoserValue`). */
29
+ /** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and
30
+ * `resolveConflict`'s `rejectLoserValue`). */
35
31
  export function insertRejectedValue(db, opts) {
36
- db.prepare(`INSERT INTO rejected_values(tenant_id, digest, reason, rejected_by, rejected_at, source_memory_id, normalized_chars)
32
+ db.prepare(`INSERT INTO rejected_values(tenant_id, digest, reason, rejected_by, rejected_at, source_memory_id, ` +
33
+ `normalized_chars)
37
34
  VALUES (?, ?, ?, ?, ?, ?, ?)
38
35
  ON CONFLICT(tenant_id, digest) DO UPDATE SET
39
36
  reason = excluded.reason,
@@ -56,15 +53,17 @@ export function listRejectedValues(db, tenantId) {
56
53
  .all(tenantId);
57
54
  return rows.map(rowToRejectedValue);
58
55
  }
59
- /** 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).
60
- * 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. */
56
+ /** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row,
57
+ * or a same-id UPSERT changing it). Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss
58
+ * costs ONE indexed point query; only a hit SELECTs the stored row. */
61
59
  export function checkRejectionGuard(db, tenantId, entryId, content) {
62
60
  const incomingDigest = rejectionDigest(content);
63
61
  const tombstone = findRejectedValue(db, tenantId, incomingDigest);
64
62
  if (!tombstone)
65
63
  return; // miss ends the guard — the overwhelmingly common case
66
- // Id-only on purpose (ids are global ULIDs; the tombstone lookup is tenant-scoped); tenant_id is read as a tenantId-only upsert introduces content there.
67
- // SAFETY: storedRow's shape matches the two columns named in the SELECT above.
64
+ // Id-only on purpose (ids are global ULIDs; the tombstone lookup is tenant-scoped); tenant_id is read as a
65
+ // tenantId-only upsert introduces content there. SAFETY: storedRow's shape matches the two columns named in the
66
+ // SELECT above.
68
67
  const storedRow = db.prepare(`SELECT content, tenant_id FROM memories WHERE id = ?`).get(entryId);
69
68
  const isNewRow = storedRow === undefined;
70
69
  const tenantChanged = !isNewRow && storedRow.tenant_id !== tenantId;