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
@@ -6,7 +6,8 @@ export function isObjectRefusal(written) {
6
6
  export function hasGroup(store, group) {
7
7
  return group === 'base' || store[group] !== undefined;
8
8
  }
9
- /** The group's methods; a store without them throws StoreNotPortedError, which answers 501 as any unported path does. */
9
+ /** The group's methods; a store without them throws
10
+ * StoreNotPortedError, which answers 501 as any unported path does. */
10
11
  export function requireGroup(store, group) {
11
12
  const groups = store;
12
13
  const methods = groups[group];
@@ -14,12 +15,5 @@ export function requireGroup(store, group) {
14
15
  throw new StoreNotPortedError(store.kind, group);
15
16
  return methods;
16
17
  }
17
- export const STORE_BUSY_MESSAGE = 'store busy (another hippo process holds the write lock); retry shortly';
18
- /** A store behind the port throws this when its lock wait runs out, so the server answers 503 as it does for a busy hippo.db. */
19
- export class StoreBusyError extends Error {
20
- constructor(message = STORE_BUSY_MESSAGE, options) {
21
- super(message, options);
22
- this.name = 'StoreBusyError';
23
- }
24
- }
18
+ export { isStoreBusy, STORE_BUSY_MESSAGE, StoreBusyError } from './busy.js';
25
19
  //# sourceMappingURL=port.js.map
@@ -1,6 +1,7 @@
1
- /** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth; the memory row only mirrors the claim.
2
- * Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers enforce the prediction's tenant matches the referenced memory's.
3
- * `savePrediction` writes memory and prediction inside `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
1
+ /** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth;
2
+ * the memory row only mirrors the claim. Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers
3
+ * enforce the prediction's tenant matches the referenced memory's. `savePrediction` writes memory and prediction inside
4
+ * `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
4
5
  import { type MemoryEntry } from '../core/memory.js';
5
6
  import { type KeysetPosition } from '../util/keyset.js';
6
7
  import type { PredictionSave } from './port.js';
@@ -40,16 +41,17 @@ export interface ListPredictionsOpts {
40
41
  /** Resume after this row: the position the previous page ended on. */
41
42
  after?: KeysetPosition;
42
43
  }
43
- /** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure rolls back both.
44
- * The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the predictions table feeds the planning-fallacy detector. */
44
+ /** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure
45
+ * rolls back both. The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the
46
+ * predictions table feeds the planning-fallacy detector. */
45
47
  export declare function savePrediction(hippoRoot: string, tenantId: string, opts: SavePredictionOpts, actor?: string): Prediction;
46
48
  /** The memory row that mirrors a claim into recall, built here alone so every store keeps the same row for it. */
47
49
  export declare function predictionMirror(tenantId: string, claim: SavePredictionOpts, baseHalfLifeDays: number): MemoryEntry;
48
50
  /** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant
49
51
  * check included, and its predictions row shares that write scope, so neither lands alone. */
50
52
  export declare function writePrediction(hippoRoot: string, tenantId: string, save: PredictionSave, actor: string): Prediction;
51
- /** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table is the source of truth).
52
- * Accuracy is computed from (estimateValue, actualValue) at query time. */
53
+ /** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table
54
+ * is the source of truth). Accuracy is computed from (estimateValue, actualValue) at query time. */
53
55
  export declare function closePrediction(hippoRoot: string, tenantId: string, id: number, opts: ClosePredictionOpts, actor?: string): Prediction;
54
56
  export declare function loadPredictionById(hippoRoot: string, tenantId: string, id: number): Prediction | null;
55
57
  export declare function loadPredictionsByClass(hippoRoot: string, tenantId: string, classTag: string, opts?: ListPredictionsOpts): Prediction[];
@@ -84,13 +86,15 @@ export interface BaserateRow {
84
86
  estimate_value: number;
85
87
  actual_value: number;
86
88
  }
87
- /** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed' with estimate and actual non-null;
88
- * closed-unknown and open are excluded. Audit-emit is built in here, not at the 3 call sites, so callers cannot drift. */
89
+ /** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed'
90
+ * with estimate and actual non-null; closed-unknown and open are excluded. Audit-emit is built in here, not at the 3
91
+ * call sites, so callers cannot drift. */
89
92
  export declare function computePredictionBaserate(hippoRoot: string, tenantId: string, classTag: string, actor?: string,
90
93
  /** False skips the predict_baserate audit so that channel only records deliberate
91
94
  * baserate calls, not every recall the planning-fallacy orchestrator inspects. */
92
95
  emitAudit?: boolean): PredictionBaserate;
93
- /** A class's stats over its closed rows, summed in the order given. Every store computes them here, so no two can disagree on the arithmetic. */
96
+ /** A class's stats over its closed rows, summed in the order given. Every store computes them here, so no two can
97
+ * disagree on the arithmetic. */
94
98
  export declare function predictionBaserateOf(classTag: string, rows: readonly BaserateRow[]): PredictionBaserate;
95
99
  export declare function loadOpenPredictions(hippoRoot: string, tenantId: string, opts?: {
96
100
  classTag?: string;
@@ -1,6 +1,7 @@
1
- /** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth; the memory row only mirrors the claim.
2
- * Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers enforce the prediction's tenant matches the referenced memory's.
3
- * `savePrediction` writes memory and prediction inside `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
1
+ /** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth;
2
+ * the memory row only mirrors the claim. Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers
3
+ * enforce the prediction's tenant matches the referenced memory's. `savePrediction` writes memory and prediction inside
4
+ * `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
4
5
  import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
5
6
  import { BadRequestError, NotFoundError } from '../core/api-errors.js';
6
7
  import { withWriteScope } from '../db/index.js';
@@ -35,8 +36,9 @@ function rowToPrediction(row) {
35
36
  createdAt: row.created_at,
36
37
  };
37
38
  }
38
- /** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure rolls back both.
39
- * The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the predictions table feeds the planning-fallacy detector. */
39
+ /** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure
40
+ * rolls back both. The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the
41
+ * predictions table feeds the planning-fallacy detector. */
40
42
  export function savePrediction(hippoRoot, tenantId, opts, actor = 'cli') {
41
43
  assertTenantId('savePrediction', tenantId);
42
44
  if (!opts.classTag)
@@ -114,12 +116,13 @@ function auditPredictionCreate(db, who, opts) {
114
116
  },
115
117
  });
116
118
  }
117
- /** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table is the source of truth).
118
- * Accuracy is computed from (estimateValue, actualValue) at query time. */
119
+ /** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table
120
+ * is the source of truth). Accuracy is computed from (estimateValue, actualValue) at query time. */
119
121
  export function closePrediction(hippoRoot, tenantId, id, opts, actor = 'cli') {
120
122
  assertTenantId('closePrediction', tenantId);
121
123
  if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
122
- throw new BadRequestError(`closePrediction: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ${opts.closureState}`);
124
+ throw new BadRequestError(`closePrediction: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ` +
125
+ `${opts.closureState}`);
123
126
  }
124
127
  const now = new Date().toISOString();
125
128
  return onHandle(hippoRoot, (db) => {
@@ -191,7 +194,8 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
191
194
  let rows;
192
195
  if (opts.closureState) {
193
196
  if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
194
- throw new BadRequestError(`loadPredictionsByClass: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ${opts.closureState}`);
197
+ throw new BadRequestError(`loadPredictionsByClass: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ` +
198
+ `${opts.closureState}`);
195
199
  }
196
200
  // SAFETY: rows' shape matches the columns named in the SELECT above.
197
201
  rows = db.prepare(`
@@ -231,8 +235,9 @@ export function loadAllPredictions(hippoRoot, tenantId, opts = {}) {
231
235
  return rows.map(rowToPrediction);
232
236
  });
233
237
  }
234
- /** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed' with estimate and actual non-null;
235
- * closed-unknown and open are excluded. Audit-emit is built in here, not at the 3 call sites, so callers cannot drift. */
238
+ /** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed'
239
+ * with estimate and actual non-null; closed-unknown and open are excluded. Audit-emit is built in here, not at the 3
240
+ * call sites, so callers cannot drift. */
236
241
  export function computePredictionBaserate(hippoRoot, tenantId, classTag, actor = 'cli',
237
242
  /** False skips the predict_baserate audit so that channel only records deliberate
238
243
  * baserate calls, not every recall the planning-fallacy orchestrator inspects. */
@@ -254,7 +259,8 @@ emitAudit = true) {
254
259
  ORDER BY id
255
260
  `).all(tenantId, classTag);
256
261
  const baserate = predictionBaserateOf(classTag, rows);
257
- // An empty class is audited too, since an agent probing one is a signal; the recall path passes false and audits its own hint.
262
+ // An empty class is audited too, since an agent probing one is a signal; the recall path passes false and audits
263
+ // its own hint.
258
264
  if (emitAudit)
259
265
  auditBaserateRead(db, tenantId, actor, classTag, baserate.nClosed);
260
266
  return baserate;
@@ -269,12 +275,25 @@ function auditBaserateRead(db, tenantId, actor, classTag, nClosed) {
269
275
  metadata: { class_tag: classTag, n_closed: nClosed },
270
276
  });
271
277
  }
272
- /** A class's stats over its closed rows, summed in the order given. Every store computes them here, so no two can disagree on the arithmetic. */
278
+ function emptyBaserate(classTag) {
279
+ return {
280
+ classTag,
281
+ nClosed: 0,
282
+ nRatioEligible: 0,
283
+ meanEstimate: null,
284
+ meanActual: null,
285
+ meanRatio: null,
286
+ p50Ratio: null,
287
+ mae: null,
288
+ summary: '',
289
+ };
290
+ }
291
+ /** A class's stats over its closed rows, summed in the order given. Every store computes them here, so no two can
292
+ * disagree on the arithmetic. */
273
293
  export function predictionBaserateOf(classTag, rows) {
274
294
  const nClosed = rows.length;
275
- if (nClosed === 0) {
276
- return { classTag, nClosed: 0, nRatioEligible: 0, meanEstimate: null, meanActual: null, meanRatio: null, p50Ratio: null, mae: null, summary: '' };
277
- }
295
+ if (nClosed === 0)
296
+ return emptyBaserate(classTag);
278
297
  const ratioEligible = rows.filter((r) => r.estimate_value > 0);
279
298
  const nRatioEligible = ratioEligible.length;
280
299
  const meanEstimate = rows.reduce((s, r) => s + r.estimate_value, 0) / nClosed;
@@ -293,7 +312,8 @@ export function predictionBaserateOf(classTag, rows) {
293
312
  const ratioPart = meanRatio !== null
294
313
  ? `averaged ${meanRatio.toFixed(2)}x actual`
295
314
  : 'no ratio-eligible rows (all estimates were 0)';
296
- const summary = `Last ${nClosed} estimate${nClosed === 1 ? '' : 's'} in class ${classTag} ${ratioPart} (MAE ${mae.toFixed(2)}).`;
315
+ const summary = `Last ${nClosed} estimate${nClosed === 1 ? '' : 's'} in class ${classTag} ${ratioPart} (MAE ` +
316
+ `${mae.toFixed(2)}).`;
297
317
  return {
298
318
  classTag,
299
319
  nClosed,
@@ -41,7 +41,8 @@ export interface TagRewrite<T> {
41
41
  }
42
42
  export interface ProjectTagStore extends ProjectTagReads {
43
43
  readonly hippoRoot: string;
44
- /** One transaction; a dry run rolls back with no backup, else the store is backed up first and mirrors follow the commit. */
44
+ /** One transaction; a dry run rolls back with no backup, else the store is backed up first and mirrors follow the
45
+ * commit. */
45
46
  rewrite<T>(opts: {
46
47
  readonly dryRun: boolean;
47
48
  readonly backupLabel: string;
@@ -57,6 +58,8 @@ export interface ProjectTagScope {
57
58
  }
58
59
  /** Reads on a handle the caller opened and closes, for doctor's read-only check and the note sync. */
59
60
  export declare function projectTagReads(db: DatabaseSyncLike, tenantId: string): ProjectTagReads;
61
+ /** `projectTagReads` on a read-only handle this call opens and closes, for doctor; `fn` must finish with the reads. */
62
+ export declare function readProjectTags<T>(hippoRoot: string, tenantId: string, fn: (reads: ProjectTagReads) => T): T;
60
63
  /** Runs `fn` on hippo.db under `scope.hippoRoot`, opened for this call and closed after. */
61
64
  export declare function onProjectTags<T>(scope: ProjectTagScope, fn: (store: ProjectTagStore) => T): T;
62
65
  //# sourceMappingURL=project-tags.d.ts.map
@@ -1,13 +1,13 @@
1
1
  // The rows `hippo projects` and sleep's tag repair read and write, bound to one hippo.db handle and tenant,
2
2
  // so the merge and repair rules in src/sharing/project-merge.ts decide without holding the handle.
3
- import { getMeta, setMeta, withTrialScope, withWriteScope } from '../db/index.js';
3
+ import { closeHippoDb, getMeta, openHippoDbReadOnly, setMeta, withTrialScope, withWriteScope, } from '../db/index.js';
4
4
  import { withBackup } from '../db/backup.js';
5
5
  import { calculateStrength } from '../core/memory.js';
6
6
  import { appendAuditEvent, queryAuditEvents } from './audit.js';
7
- import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin } from './compactions.js';
8
- import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from './dormant.js';
7
+ import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin, } from './compactions.js';
8
+ import { insertDormantRow, listDormantSnapshots, replaceDormantEntry, } from './dormant.js';
9
9
  import { selectAllEntries, selectEntriesByIds, selectLiveEntriesBySourcePrefix } from './entry-reads.js';
10
- import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors } from './entry-writes.js';
10
+ import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors, } from './entry-writes.js';
11
11
  import { removeEntryMirrors } from './mirrors.js';
12
12
  import { onHandle } from './open.js';
13
13
  import { setAsideRow } from './set-aside.js';
@@ -27,6 +27,16 @@ export function projectTagReads(db, tenantId) {
27
27
  holdsOrigin: (table, name) => holdsOrigin(db, table, tenantId, name),
28
28
  };
29
29
  }
30
+ /** `projectTagReads` on a read-only handle this call opens and closes, for doctor; `fn` must finish with the reads. */
31
+ export function readProjectTags(hippoRoot, tenantId, fn) {
32
+ const db = openHippoDbReadOnly(hippoRoot);
33
+ try {
34
+ return fn(projectTagReads(db, tenantId));
35
+ }
36
+ finally {
37
+ closeHippoDb(db);
38
+ }
39
+ }
30
40
  function projectTagWrites(db, { tenantId, actor }) {
31
41
  return {
32
42
  ...projectTagReads(db, tenantId),
@@ -48,8 +58,9 @@ function rewriteOn(db, scope, opts, body) {
48
58
  return withTrialScope(db, TX_LABEL, () => body(tx, null)).result;
49
59
  const done = withBackup(db, scope.hippoRoot, opts.backupLabel, (backup) => withWriteScope(db, TX_LABEL, () => body(tx, backup)));
50
60
  // After commit, as the agent memory sync does: a stale mirror would bring the old tag back on the next rebuild.
51
- for (const entry of selectEntriesByIds(db, done.rewrite, scope.tenantId).values())
61
+ for (const entry of selectEntriesByIds(db, done.rewrite, scope.tenantId).values()) {
52
62
  writeEntryMirrors(scope.hippoRoot, entry);
63
+ }
53
64
  for (const id of done.purge)
54
65
  removeEntryMirrors(scope.hippoRoot, id);
55
66
  return done.result;
@@ -1,11 +1,13 @@
1
- /** One automatic row with a defect. `set-aside` moves to dormant storage on apply, `review` is listed only, `protected` is kept. */
1
+ /** One automatic row with a defect. `set-aside` moves to dormant storage on apply, `review` is listed only, `protected`
2
+ * is kept. */
2
3
  export interface QualityRepairIssue {
3
4
  readonly id: string;
4
5
  readonly reason: string;
5
6
  readonly disposition: 'set-aside' | 'review' | 'protected';
6
7
  readonly protection?: string;
7
8
  }
8
- /** One tenant's plan; `supported` is false, with `blockers` naming each gap, when the schema cannot be changed safely. */
9
+ /** One tenant's plan; `supported` is false, with `blockers` naming each gap, when the schema cannot be changed
10
+ * safely. */
9
11
  export interface QualityRepairResult {
10
12
  readonly root: string;
11
13
  readonly schema: number;
@@ -17,11 +19,13 @@ export interface QualityRepairResult {
17
19
  readonly backup: string | null;
18
20
  readonly warnings: readonly string[];
19
21
  }
20
- /** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running migrations. */
22
+ /** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running
23
+ * migrations. */
21
24
  export declare function repairAutomaticMemories(root: string, opts: {
22
25
  tenantId: string;
23
26
  apply?: boolean;
24
27
  }): QualityRepairResult;
25
- /** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command; null once done. */
28
+ /** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command;
29
+ * null once done. */
26
30
  export declare function repairQualityOnce(root: string, tenantId: string): QualityRepairResult | null;
27
31
  //# sourceMappingURL=quality-repair.d.ts.map
@@ -7,7 +7,7 @@ import { tableColumns } from '../db/tables.js';
7
7
  import { assertBinaryCompatible } from '../db/migrate.js';
8
8
  import { insertDormantRow, listDormantSnapshots } from './dormant.js';
9
9
  import { calculateStrength, canAutoDelete } from '../core/memory.js';
10
- import { assessAutomaticMemory, BUNDLE_HEADER, isAutomaticEntry, isCertainReason } from '../core/memory-quality.js';
10
+ import { assessAutomaticMemory, BUNDLE_HEADER, isAutomaticEntry, isCertainReason, } from '../core/memory-quality.js';
11
11
  import { heldTexts } from '../util/same-text.js';
12
12
  import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from './delete-and-batch.js';
13
13
  import { selectAllEntries, selectPreviewRows } from './entry-reads.js';
@@ -32,8 +32,9 @@ function capabilityBlockers(db) {
32
32
  if (!columns.has(column))
33
33
  blockers.push(`missing column: ${table}.${column}`);
34
34
  }
35
- if (blockers.some((blocker) => blocker === 'missing table: meta' || blocker.startsWith('missing column: meta.')))
35
+ if (blockers.some((blocker) => blocker === 'missing table: meta' || blocker.startsWith('missing column: meta.'))) {
36
36
  return blockers;
37
+ }
37
38
  assertBinaryCompatible(db);
38
39
  if (getMeta(db, 'fts5_available', '0') === '1') {
39
40
  const columns = tableColumns(db, 'memories_fts');
@@ -76,11 +77,16 @@ function contentIssue(entry, rows) {
76
77
  const texts = heldTexts({ ...entry, source: 'consolidation' });
77
78
  if (texts.length === 0)
78
79
  return { reason: 'derived bundle has no safely parsed constituents', disposition: 'review' };
79
- const reasons = texts.map((text) => assessAutomaticMemory(text).reason).filter((reason) => reason !== null);
80
+ const reasons = texts
81
+ .map((text) => assessAutomaticMemory(text).reason)
82
+ .filter((reason) => reason !== null);
80
83
  if (reasons.length === 0)
81
84
  return null;
82
85
  const certain = reasons.length === texts.length && reasons.every(isCertainReason) && fromAutomaticParents(entry, rows);
83
- return { reason: `derived constituents: ${[...new Set(reasons)].join('; ')}`, disposition: certain ? 'set-aside' : 'review' };
86
+ return {
87
+ reason: `derived constituents: ${[...new Set(reasons)].join('; ')}`,
88
+ disposition: certain ? 'set-aside' : 'review',
89
+ };
84
90
  }
85
91
  function planRows(db, tenantId) {
86
92
  const all = selectAllEntries(db, tenantId);
@@ -95,9 +101,11 @@ function planRows(db, tenantId) {
95
101
  if (issue === null)
96
102
  continue;
97
103
  const kept = protection(entry, backing);
98
- issues.push(kept === undefined ? { id: entry.id, ...issue } : { id: entry.id, ...issue, disposition: 'protected', protection: kept });
104
+ issues.push(kept === undefined
105
+ ? { id: entry.id, ...issue }
106
+ : { id: entry.id, ...issue, disposition: 'protected', protection: kept });
99
107
  }
100
- return { total: entries.length, issues };
108
+ return { total: entries.length, issues, all };
101
109
  }
102
110
  function unsupportedPreview(db, tenantId) {
103
111
  const columns = tableColumns(db, 'memories');
@@ -106,42 +114,64 @@ function unsupportedPreview(db, tenantId) {
106
114
  const rows = selectPreviewRows(db, columns, tenantId);
107
115
  const issues = rows.flatMap((row) => {
108
116
  const tags = parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' });
109
- const provenance = { ...row, source: row.source ?? '', confidence: row.confidence ?? 'observed', dag_level: row.dag_level ?? 0, tags };
117
+ const provenance = {
118
+ ...row,
119
+ source: row.source ?? '',
120
+ confidence: row.confidence ?? 'observed',
121
+ dag_level: row.dag_level ?? 0,
122
+ tags,
123
+ };
110
124
  if (!isAutomaticEntry(provenance))
111
125
  return [];
112
126
  const { reason } = assessAutomaticMemory(row.content);
113
- return reason === null ? [] : [{ id: row.id, reason, disposition: 'review', protection: 'unsupported schema; no changes permitted' }];
127
+ return reason === null
128
+ ? []
129
+ : [{ id: row.id, reason, disposition: 'review', protection: 'unsupported schema; no changes permitted' }];
114
130
  });
115
131
  return { total: rows.length, issues };
116
132
  }
117
- function initialResult(db, root, tenantId) {
133
+ /** The plan plus the tenant rows it was read from, so the apply step does not read them again. */
134
+ function plannedResult(db, root, tenantId) {
118
135
  const blockers = capabilityBlockers(db);
119
136
  const schema = pragmaUserVersion(db);
120
- const plan = blockers.length > 0 ? unsupportedPreview(db, tenantId) : planRows(db, tenantId);
121
- return {
137
+ const plan = blockers.length > 0 ? { ...unsupportedPreview(db, tenantId), all: [] } : planRows(db, tenantId);
138
+ const result = {
122
139
  root, schema, supported: blockers.length === 0, blockers,
123
140
  total: plan.total,
124
141
  issues: plan.issues, appliedIds: [], backup: null, warnings: [],
125
142
  };
143
+ return { result, all: plan.all };
126
144
  }
127
- // No rejection record, as in project repair: the writers refuse these defects themselves, and a record would also refuse a person's copy.
145
+ // No rejection record, as in project repair: the writers refuse these defects themselves, and a record would also
146
+ // refuse a person's copy.
128
147
  function setAsideIssue(db, entry, reason, now, backup) {
129
148
  const actor = 'quality-repair';
130
149
  if (deleteEntryCore(db, entry.id, { actor, automatic: true, suppressForgetAudit: true }) === null)
131
150
  return false;
132
- insertDormantRow(db, { entry, strength: calculateStrength(entry, now), reason: 'quality-repair', dormantAt: now.toISOString() });
151
+ insertDormantRow(db, {
152
+ entry,
153
+ strength: calculateStrength(entry, now),
154
+ reason: 'quality-repair',
155
+ dormantAt: now.toISOString(),
156
+ });
133
157
  if (getMeta(db, 'fts5_available', '0') === '1' && ftsRowExists(db, entry.id)) {
134
158
  throw new Error(`Quality repair could not remove the full-text row for ${entry.id}`);
135
159
  }
136
- appendAuditEvent(db, { tenantId: entry.tenant_id, actor, op: 'quality_repair', targetId: entry.id, metadata: { reason, backup } });
160
+ appendAuditEvent(db, {
161
+ tenantId: entry.tenant_id,
162
+ actor,
163
+ op: 'quality_repair',
164
+ targetId: entry.id,
165
+ metadata: { reason, backup },
166
+ });
137
167
  return true;
138
168
  }
139
169
  function applyPlan(db, root, tenantId, backup, doneKey) {
140
170
  return withWriteScope(db, 'quality_repair_apply', () => {
141
- const result = initialResult(db, root, tenantId);
171
+ const { result, all } = plannedResult(db, root, tenantId);
142
172
  if (!result.supported)
143
173
  throw new Error(`Quality repair capability changed: ${result.blockers.join('; ')}`);
144
- const entries = new Map(selectAllEntries(db, tenantId).map((entry) => [entry.id, entry]));
174
+ const entries = new Map(all.map((entry) => [entry.id, entry]));
145
175
  const appliedIds = [];
146
176
  const warnings = [];
147
177
  const now = new Date();
@@ -159,9 +189,10 @@ function applyPlan(db, root, tenantId, backup, doneKey) {
159
189
  });
160
190
  }
161
191
  function repairOn(db, root, opts) {
162
- const initial = withTrialScope(db, 'quality_repair_plan', () => initialResult(db, root, opts.tenantId));
163
- if (!opts.apply || !initial.supported || !initial.issues.some((issue) => issue.disposition === 'set-aside'))
192
+ const initial = withTrialScope(db, 'quality_repair_plan', () => plannedResult(db, root, opts.tenantId).result);
193
+ if (!opts.apply || !initial.supported || !initial.issues.some((issue) => issue.disposition === 'set-aside')) {
164
194
  return initial;
195
+ }
165
196
  db.exec('PRAGMA foreign_keys = ON');
166
197
  const result = withBackup(db, root, 'before-quality-repair', (backup) => applyPlan(db, root, opts.tenantId, backup, opts.doneKey));
167
198
  const warnings = [...result.warnings];
@@ -172,12 +203,14 @@ function repairOn(db, root, opts) {
172
203
  }
173
204
  return { ...result, warnings };
174
205
  }
175
- /** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running migrations. */
206
+ /** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running
207
+ * migrations. */
176
208
  export function repairAutomaticMemories(root, opts) {
177
209
  return withUnmigratedDb(root, !opts.apply, (db) => repairOn(db, root, opts));
178
210
  }
179
211
  const AUTO_REPAIR_META_KEY = 'quality_repair_auto';
180
- /** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command; null once done. */
212
+ /** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command;
213
+ * null once done. */
181
214
  export function repairQualityOnce(root, tenantId) {
182
215
  return withUnmigratedDb(root, false, (db) => {
183
216
  if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
@@ -1,6 +1,7 @@
1
1
  import { type DatabaseSyncLike } from '../db/index.js';
2
2
  import type { QuarantineApproval, QuarantineListQuery, QuarantineRejection, QuarantinedMemory } from './port.js';
3
3
  export declare const QUARANTINE_SCOPE_PREFIX = "quarantine:private:";
4
+ export declare function isQuarantineScope(scope: string | null | undefined): boolean;
4
5
  /** Scope a quarantined memory is stored under; matches PRIVATE_SCOPE_RE so every default-deny site hides it. */
5
6
  export declare function quarantineScopeFor(original: string | null): string;
6
7
  export type QuarantineStatus = 'pending' | 'approved' | 'rejected';
@@ -5,6 +5,9 @@ import { withWriteScopeOr } from '../db/index.js';
5
5
  import { keysetAfter } from '../util/keyset.js';
6
6
  import { selectEntriesByIds } from './entry-reads.js';
7
7
  export const QUARANTINE_SCOPE_PREFIX = 'quarantine:private:';
8
+ export function isQuarantineScope(scope) {
9
+ return scope != null && scope.startsWith(QUARANTINE_SCOPE_PREFIX);
10
+ }
8
11
  /** Scope a quarantined memory is stored under; matches PRIVATE_SCOPE_RE so every default-deny site hides it. */
9
12
  export function quarantineScopeFor(original) {
10
13
  return `${QUARANTINE_SCOPE_PREFIX}${original ?? 'unscoped'}`;
@@ -29,16 +32,21 @@ function getQuarantineRow(db, tenantId, memoryId) {
29
32
  return row ? fromDbRow(row) : null;
30
33
  }
31
34
  function listQuarantineRows(db, tenantId, status = 'pending', limit = DEFAULT_LIST_LIMIT, afterRow) {
32
- // A pending row whose memory was deleted (e.g. Slack message_deleted) is dead; keep its history, drop it from the queue.
35
+ // A pending row whose memory was deleted (e.g. Slack message_deleted) is dead; keep its history, drop it from the
36
+ // queue.
33
37
  const live = status === 'pending'
34
- ? ' AND EXISTS (SELECT 1 FROM memories m WHERE m.id = memory_quarantine.memory_id AND m.tenant_id = memory_quarantine.tenant_id)'
38
+ ? ' AND EXISTS (SELECT 1 FROM memories m WHERE m.id = memory_quarantine.memory_id AND m.tenant_id = ' +
39
+ 'memory_quarantine.tenant_id)'
35
40
  : '';
36
41
  const after = keysetAfter('quarantined_at', 'memory_id', afterRow);
37
42
  const order = 'ORDER BY quarantined_at DESC, memory_id DESC LIMIT ?';
38
43
  const rows = status === 'all'
39
- ? db.prepare(`SELECT ${SELECT_COLUMNS} FROM memory_quarantine WHERE tenant_id = ?${after.sql} ${order}`)
44
+ ? db
45
+ .prepare(`SELECT ${SELECT_COLUMNS} FROM memory_quarantine WHERE tenant_id = ?${after.sql} ${order}`)
40
46
  .all(tenantId, ...after.params, limit)
41
- : db.prepare(`SELECT ${SELECT_COLUMNS} FROM memory_quarantine WHERE tenant_id = ? AND status = ?${live}${after.sql} ${order}`)
47
+ : db
48
+ .prepare(`SELECT ${SELECT_COLUMNS} FROM memory_quarantine WHERE tenant_id = ? AND status = ?${live}${after.sql} ` +
49
+ `${order}`)
42
50
  .all(tenantId, status, ...after.params, limit);
43
51
  // SAFETY: both branches select SELECT_COLUMNS, matching QuarantineDbRow's field set.
44
52
  return rows.map(fromDbRow);
@@ -56,12 +64,12 @@ export function recordQuarantine(db, opts) {
56
64
  });
57
65
  }
58
66
  function approveQuarantineRow(db, tenantId, memoryId, decidedBy) {
59
- db.prepare(`UPDATE memory_quarantine SET status = 'approved', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND memory_id = ?`)
60
- .run(new Date().toISOString(), decidedBy, tenantId, memoryId);
67
+ db.prepare(`UPDATE memory_quarantine SET status = 'approved', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND ` +
68
+ `memory_id = ?`).run(new Date().toISOString(), decidedBy, tenantId, memoryId);
61
69
  }
62
70
  function rejectQuarantineRow(db, tenantId, memoryId, decidedBy) {
63
- db.prepare(`UPDATE memory_quarantine SET status = 'rejected', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND memory_id = ?`)
64
- .run(new Date().toISOString(), decidedBy, tenantId, memoryId);
71
+ db.prepare(`UPDATE memory_quarantine SET status = 'rejected', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND ` +
72
+ `memory_id = ?`).run(new Date().toISOString(), decidedBy, tenantId, memoryId);
65
73
  }
66
74
  /** A page of the tenant's records, each with its memory's content read in the same query batch. */
67
75
  export function listQuarantinedAt(db, tenantId, { status, limit, after }) {
@@ -91,7 +99,13 @@ export function approveQuarantinedAt(db, tenantId, id, actor) {
91
99
  if (Number(updated.changes ?? 0) !== 1)
92
100
  return rollback({ outcome: 'scope_moved' });
93
101
  approveQuarantineRow(db, tenantId, id, actor);
94
- appendAuditEvent(db, { tenantId, actor, op: 'quarantine_approve', targetId: id, metadata: { originalScope: row.originalScope } });
102
+ appendAuditEvent(db, {
103
+ tenantId,
104
+ actor,
105
+ op: 'quarantine_approve',
106
+ targetId: id,
107
+ metadata: { originalScope: row.originalScope },
108
+ });
95
109
  return { outcome: 'approved' };
96
110
  });
97
111
  }
@@ -2,13 +2,14 @@ import type { DatabaseSyncLike } from '../db/index.js';
2
2
  export interface ArchiveOpts {
3
3
  reason: string;
4
4
  who: string;
5
- /** Hook run inside the archive SAVEPOINT after the audit row and before RELEASE (the Slack deletion connector marks the event seen atomically);
6
- * throwing rolls back the whole archive, audit row included. */
5
+ /** Hook run inside the archive SAVEPOINT after the audit row and before RELEASE (the Slack deletion connector marks
6
+ * the event seen atomically); throwing rolls back the whole archive, audit row included. */
7
7
  afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
8
8
  }
9
9
  /** Stamps the archived copy of `memoryId` as having its markdown mirror cleaned at `at`. */
10
10
  export declare function markMirrorCleaned(db: DatabaseSyncLike, memoryId: string, at: string): void;
11
- /** 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,
12
- * all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
11
+ /** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the
12
+ * append-only trigger allows the delete, all in one write scope that nests in an outer transaction. Throws if the row
13
+ * is missing or not raw; returns the archived_at. */
13
14
  export declare function archiveRawMemory(db: DatabaseSyncLike, id: string, opts: ArchiveOpts): string;
14
15
  //# sourceMappingURL=raw-archive.d.ts.map
@@ -8,8 +8,8 @@ export function markMirrorCleaned(db, memoryId, at) {
8
8
  db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(at, memoryId);
9
9
  }
10
10
  function loadRawRow(db, id) {
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.
11
+ // SAFETY: SELECT * returns every memories column; only kind, tenant_id and dag_parent_id are read below, all
12
+ // guaranteed present (possibly null) by the 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,8 +19,8 @@ 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, never the original content; the archive_raw audit row is the compliance trail,
23
- // so the content is unrecoverable from here on.
22
+ // GDPR: raw_archive stores ONLY metadata, never the original content; the archive_raw audit row is the compliance
23
+ // trail, so the content is unrecoverable from here on.
24
24
  const archivedAt = new Date().toISOString();
25
25
  const redactedPayload = JSON.stringify({
26
26
  redacted: true,
@@ -38,8 +38,8 @@ function moveRowToArchive(db, id, row, opts) {
38
38
  db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
39
39
  return archivedAt;
40
40
  }
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.
41
+ // Emit the archive_raw audit inside the SAVEPOINT so it commits atomically with the row deletion, attributed to the
42
+ // row's own tenant_id, not whatever HIPPO_TENANT the calling shell has set.
43
43
  function auditArchive(db, id, row, opts) {
44
44
  try {
45
45
  appendAuditEvent(db, {
@@ -55,8 +55,9 @@ function auditArchive(db, id, row, opts) {
55
55
  reportAuditWriteFailure('archive_raw', String(error), id);
56
56
  }
57
57
  }
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. */
58
+ /** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the
59
+ * append-only trigger allows the delete, all in one write scope that nests in an outer transaction. Throws if the row
60
+ * is missing or not raw; returns the archived_at. */
60
61
  export function archiveRawMemory(db, id, opts) {
61
62
  const row = loadRawRow(db, id);
62
63
  // A SAVEPOINT when already inside a transaction (e.g. batchWriteAndDelete), so a throw here
@@ -69,8 +70,8 @@ export function archiveRawMemory(db, id, opts) {
69
70
  if (row.dag_parent_id) {
70
71
  markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? DEFAULT_TENANT_ID), opts.who || 'cli');
71
72
  }
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.
73
+ // afterArchive hook: connector idempotency markers (e.g. slack_event_log) must commit atomically with the archive,
74
+ // so it runs INSIDE the SAVEPOINT; throwing rolls back both.
74
75
  if (opts.afterArchive) {
75
76
  opts.afterArchive(db, id);
76
77
  }