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
1
  import { originInSql } from '../core/project-identity.js';
2
2
  import { scopeAdmitSql } from './rule-sql.js';
3
- const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at, summarised_at, summary, ' +
3
+ const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at, ' +
4
+ 'summarised_at, summary, ' +
4
5
  'items_json, items_written, status';
5
6
  function selectRows(db, where, ...params) {
6
7
  // SAFETY: the SELECT names exactly COLUMNS, matching CompactionRow's field set.
@@ -15,7 +16,8 @@ export function compactionRowsByRequest(db, tenantId, requestId) {
15
16
  }
16
17
  /** The session's newest `started` row with a start in [`notBefore`, `notAfter`], both ISO strings. */
17
18
  export function latestStartedRows(db, tenantId, sessionId, notAfter, notBefore) {
18
- return selectRows(db, `tenant_id = ? AND session_id = ? AND status = 'started' AND started_at <= ? AND started_at >= ? ORDER BY started_at DESC, id DESC LIMIT 1`, tenantId, sessionId, notAfter, notBefore);
19
+ return selectRows(db, `tenant_id = ? AND session_id = ? AND status = 'started' AND started_at <= ? AND started_at >= ? ORDER BY ` +
20
+ `started_at DESC, id DESC LIMIT 1`, tenantId, sessionId, notAfter, notBefore);
19
21
  }
20
22
  /** `summarised` rows whose summary is older than `summarisedBefore`, an ISO string. */
21
23
  export function stalledSummarisedRows(db, tenantId, summarisedBefore) {
@@ -23,10 +25,12 @@ export function stalledSummarisedRows(db, tenantId, summarisedBefore) {
23
25
  }
24
26
  /** `started` rows with a transcript whose start lies between `startedAfter` and `startedBefore`, oldest first. */
25
27
  export function openTranscriptRows(db, tenantId, startedBefore, startedAfter) {
26
- return selectRows(db, `tenant_id = ? AND status = 'started' AND started_at < ? AND started_at > ? AND transcript_path IS NOT NULL ORDER BY started_at`, tenantId, startedBefore, startedAfter);
28
+ return selectRows(db, `tenant_id = ? AND status = 'started' AND started_at < ? AND started_at > ? AND transcript_path IS NOT NULL ` +
29
+ `ORDER BY started_at`, tenantId, startedBefore, startedAfter);
27
30
  }
28
31
  export function insertStartedCompaction(db, tenantId, start) {
29
- db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, started_at)
32
+ db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, ` +
33
+ `started_at)
30
34
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(tenantId, start.id, start.sessionId, start.originProject, start.trigger, start.cwd, start.transcriptPath, start.startedAt);
31
35
  }
32
36
  /** Moves a `started` row to `summarised`; false when another process already moved it. */
@@ -34,8 +38,11 @@ export function markCompactionSummarised(db, tenantId, id, update) {
34
38
  const { summary, itemsJson, summarisedAt, requestId } = update;
35
39
  // Only a caller names the column, so a store from before it was added still takes local writes.
36
40
  const stamp = requestId === undefined ? [] : [requestId];
37
- const result = db.prepare(`UPDATE compactions SET summary = ?, items_json = ?, summarised_at = ?, status = 'summarised'${stamp.length === 0 ? '' : ', request_id = ?'}
38
- WHERE tenant_id = ? AND id = ? AND status = 'started'`).run(summary, itemsJson, summarisedAt, ...stamp, tenantId, id);
41
+ const result = db
42
+ .prepare(`UPDATE compactions SET summary = ?, items_json = ?, summarised_at = ?, status = ` +
43
+ `'summarised'${stamp.length === 0 ? '' : ', request_id = ?'}
44
+ WHERE tenant_id = ? AND id = ? AND status = 'started'`)
45
+ .run(summary, itemsJson, summarisedAt, ...stamp, tenantId, id);
39
46
  return (result.changes ?? 0) > 0;
40
47
  }
41
48
  export function insertSummarisedCompaction(db, tenantId, meta, row) {
@@ -43,7 +50,8 @@ export function insertSummarisedCompaction(db, tenantId, meta, row) {
43
50
  // Only a caller names the column, so a store from before it was added still takes local writes.
44
51
  const stamp = requestId === undefined ? [] : [requestId];
45
52
  const [col, mark] = stamp.length === 0 ? ['', ''] : [', request_id', ', ?'];
46
- db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, started_at, ` +
53
+ db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, ` +
54
+ `started_at, ` +
47
55
  `summarised_at, summary, items_json, status${col})\n` +
48
56
  ` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'summarised'${mark})`).run(tenantId, id, meta.sessionId, meta.originProject, meta.trigger, meta.cwd, meta.transcriptPath, meta.startedAt, summarisedAt, summary, itemsJson, ...stamp);
49
57
  }
@@ -51,7 +59,8 @@ export function markSnapshotSavedRow(db, tenantId, recordId) {
51
59
  db.prepare(`UPDATE compactions SET snapshot_saved = 1 WHERE tenant_id = ? AND id = ?`).run(tenantId, recordId);
52
60
  }
53
61
  export function compactionProgress(db, tenantId, id) {
54
- return db.prepare(`SELECT status, items_written FROM compactions WHERE tenant_id = ? AND id = ?`)
62
+ return db
63
+ .prepare(`SELECT status, items_written FROM compactions WHERE tenant_id = ? AND id = ?`)
55
64
  .get(tenantId, id);
56
65
  }
57
66
  export function markCompactionDone(db, tenantId, id, itemsWritten) {
@@ -59,11 +68,14 @@ export function markCompactionDone(db, tenantId, id, itemsWritten) {
59
68
  }
60
69
  /** Rows changed: 1 when the `started` row was closed, 0 when it had already moved. */
61
70
  export function closeStartedWithoutSummary(db, tenantId, id) {
62
- const result = db.prepare(`UPDATE compactions SET status = 'no-summary' WHERE tenant_id = ? AND id = ? AND status = 'started'`).run(tenantId, id);
71
+ const result = db
72
+ .prepare(`UPDATE compactions SET status = 'no-summary' WHERE tenant_id = ? AND id = ? AND status = 'started'`)
73
+ .run(tenantId, id);
63
74
  return Number(result.changes ?? 0);
64
75
  }
65
76
  export function nextCompactionStart(db, tenantId, sessionId, after) {
66
- const row = db.prepare(`SELECT MIN(started_at) AS at FROM compactions WHERE tenant_id = ? AND session_id = ? AND started_at > ?`)
77
+ const row = db
78
+ .prepare(`SELECT MIN(started_at) AS at FROM compactions WHERE tenant_id = ? AND session_id = ? AND started_at > ?`)
67
79
  .get(tenantId, sessionId, after);
68
80
  return row?.at ?? null;
69
81
  }
@@ -71,8 +83,11 @@ export function nextCompactionStart(db, tenantId, sessionId, after) {
71
83
  export function heldMemoryRows(db, tenantId, origins) {
72
84
  const deny = scopeAdmitSql('');
73
85
  // SAFETY: the SELECT names the id, source_session_id and content columns.
74
- return db.prepare(`SELECT id, source_session_id, content FROM memories WHERE tenant_id = ? AND ${originInSql(origins)} AND superseded_by IS NULL AND kind != 'raw'
75
- AND ${deny.sql}`).all(tenantId, ...origins, ...deny.params);
86
+ return db
87
+ .prepare(`SELECT id, source_session_id, content FROM memories WHERE tenant_id = ? AND ${originInSql(origins)} AND ` +
88
+ `superseded_by IS NULL AND kind != 'raw'
89
+ AND ${deny.sql}`)
90
+ .all(tenantId, ...origins, ...deny.params);
76
91
  }
77
92
  export function restampCompactionOrigin(db, tenantId, from, into) {
78
93
  return Number(db.prepare(`UPDATE compactions SET origin_project = ? WHERE tenant_id = ? AND origin_project = ?`)
@@ -80,16 +95,21 @@ export function restampCompactionOrigin(db, tenantId, from, into) {
80
95
  }
81
96
  export function compactionTranscripts(db, tenantId) {
82
97
  // SAFETY: the SELECT names the two columns of the row type.
83
- return db.prepare(`SELECT DISTINCT transcript_path AS transcript, cwd FROM compactions WHERE tenant_id = ? AND transcript_path IS NOT NULL`)
98
+ return db
99
+ .prepare(`SELECT DISTINCT transcript_path AS transcript, cwd FROM compactions WHERE tenant_id = ? AND transcript_path ` +
100
+ `IS NOT NULL`)
84
101
  .all(tenantId);
85
102
  }
86
103
  export function compactionOriginsWithCwd(db, tenantId) {
87
104
  // SAFETY: the SELECT names the two columns of the row type.
88
- return db.prepare(`SELECT DISTINCT origin_project AS origin, cwd FROM compactions WHERE tenant_id = ? AND origin_project <> '' AND cwd IS NOT NULL`)
105
+ return db
106
+ .prepare(`SELECT DISTINCT origin_project AS origin, cwd FROM compactions WHERE tenant_id = ? AND origin_project <> '' ` +
107
+ `AND cwd IS NOT NULL`)
89
108
  .all(tenantId);
90
109
  }
91
110
  /** True when `table` holds a row of this tenant under the project name. */
92
111
  export function holdsOrigin(db, table, tenantId, name) {
93
- return db.prepare(`SELECT 1 FROM ${table} WHERE tenant_id = ? AND origin_project = ? LIMIT 1`).get(tenantId, name) !== undefined;
112
+ return (db.prepare(`SELECT 1 FROM ${table} WHERE tenant_id = ? AND origin_project = ? LIMIT 1`).get(tenantId, name) !==
113
+ undefined);
94
114
  }
95
115
  //# sourceMappingURL=compactions.js.map
@@ -4,18 +4,21 @@ import { type MemoryConflict } from './rows.js';
4
4
  export declare function listMemoryConflicts(hippoRoot: string, status?: string, tenantId?: string): MemoryConflict[];
5
5
  /** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
6
6
  export declare function countOpenConflicts(hippoRoot: string, tenantId: string): number;
7
+ /** countOpenConflicts on a handle the caller holds, so it can share a snapshot with other reads. */
8
+ export declare function countOpenConflictsAt(db: DatabaseSyncLike, tenantId: string): number;
7
9
  /** One open conflict of a memory, with the row on its other side. */
8
10
  export interface OpenConflictOf {
9
11
  conflict: MemoryConflict;
10
12
  other: MemoryEntry;
11
13
  }
12
- /** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts' order, each with its other member read in one batch. */
14
+ /** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts'
15
+ * order, each with its other member read in one batch. */
13
16
  export declare function loadOpenConflictsOf(hippoRoot: string, tenantId: string, memoryId: string): OpenConflictOf[];
14
17
  /** Conflicts whose two rows `actor` may both touch; someone else's personal row hides its whole pair. */
15
18
  export declare function listTouchableConflicts(hippoRoot: string, status: string, tenantId: string, actor: {
16
19
  owner?: string;
17
20
  }): MemoryConflict[];
18
- type DetectedConflict = {
21
+ export type DetectedConflict = {
19
22
  memory_a_id: string;
20
23
  memory_b_id: string;
21
24
  reason: string;
@@ -23,7 +26,8 @@ type DetectedConflict = {
23
26
  };
24
27
  type SameTenant = (a: string, b: string) => boolean;
25
28
  export declare function replaceDetectedConflicts(hippoRoot: string, detected: Array<DetectedConflict>, detectedAt?: string): void;
26
- /** The tenant of every memory the refresh can compare, and each stored conflicts_with_json other than '[]', read before the refresh takes the write lock. */
29
+ /** The tenant of every memory the refresh can compare, and each stored conflicts_with_json other than '[]', read
30
+ * before the refresh takes the write lock. */
27
31
  export interface ConflictRefreshReads {
28
32
  sameTenant: SameTenant;
29
33
  storedRefs: ReadonlyMap<string, string | null>;
@@ -44,7 +48,8 @@ export interface ResolveConflictRequest {
44
48
  readonly forgetLoser?: boolean;
45
49
  readonly tenantId?: string;
46
50
  }
47
- /** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser, `opts.rejectLoserValue` also tombstones its
51
+ /** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
52
+ * `opts.rejectLoserValue` also tombstones its
48
53
  * digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
49
54
  export declare function resolveConflict(hippoRoot: string, { conflictId, keepId, forgetLoser, tenantId }: ResolveConflictRequest, opts?: ResolveConflictOpts): {
50
55
  conflict: MemoryConflict;
@@ -22,25 +22,30 @@ function canonicalConflictPair(aId, bId) {
22
22
  : { memory_a_id: bId, memory_b_id: aId };
23
23
  }
24
24
  function selectConflictRowsInTenant(db, status, allStatuses, tenantId) {
25
- // Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair surfaces.
25
+ // Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair
26
+ // surfaces.
26
27
  // SAFETY: both branches select CONFLICT_COLS_MC, MemoryConflictRow's columns.
27
28
  return allStatuses
28
- ? db.prepare(`
29
+ ? db
30
+ .prepare(`
29
31
  SELECT ${CONFLICT_COLS_MC}
30
32
  FROM memory_conflicts mc
31
33
  JOIN memories ma ON ma.id = mc.memory_a_id
32
34
  JOIN memories mb ON mb.id = mc.memory_b_id
33
35
  WHERE ma.tenant_id = ? AND mb.tenant_id = ?
34
36
  ORDER BY mc.updated_at DESC, mc.id DESC
35
- `).all(tenantId, tenantId)
36
- : db.prepare(`
37
+ `)
38
+ .all(tenantId, tenantId)
39
+ : db
40
+ .prepare(`
37
41
  SELECT ${CONFLICT_COLS_MC}
38
42
  FROM memory_conflicts mc
39
43
  JOIN memories ma ON ma.id = mc.memory_a_id
40
44
  JOIN memories mb ON mb.id = mc.memory_b_id
41
45
  WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
42
46
  ORDER BY mc.updated_at DESC, mc.id DESC
43
- `).all(status, tenantId, tenantId);
47
+ `)
48
+ .all(status, tenantId, tenantId);
44
49
  }
45
50
  function selectConflictRowsUnscoped(db, status, allStatuses) {
46
51
  // Unscoped query — legacy direct-mode (CLI, tests, consolidate).
@@ -60,7 +65,8 @@ function selectConflictRowsUnscoped(db, status, allStatuses) {
60
65
  }
61
66
  export function listMemoryConflicts(hippoRoot, status = 'open', tenantId) {
62
67
  return onHandle(hippoRoot, (db) => {
63
- // '*' is a sentinel for no status filter; the 4 SQL branches below cover {tenanted | unscoped} x {all-statuses | specific-status}.
68
+ // '*' is a sentinel for no status filter; the 4 SQL branches below
69
+ // cover {tenanted | unscoped} x {all-statuses | specific-status}.
64
70
  const allStatuses = status === '*';
65
71
  const rows = tenantId !== undefined
66
72
  ? selectConflictRowsInTenant(db, status, allStatuses, tenantId)
@@ -75,13 +81,16 @@ const OPEN_IN_TENANT = `FROM memory_conflicts mc
75
81
  WHERE mc.status = 'open' AND ma.tenant_id = ? AND mb.tenant_id = ?`;
76
82
  /** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
77
83
  export function countOpenConflicts(hippoRoot, tenantId) {
78
- return onHandle(hippoRoot, (db) => {
79
- // SAFETY: one row with the single aliased count column.
80
- const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
81
- return Number(row.n);
82
- }, openStore);
84
+ return onHandle(hippoRoot, (db) => countOpenConflictsAt(db, tenantId), openStore);
83
85
  }
84
- /** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts' order, each with its other member read in one batch. */
86
+ /** countOpenConflicts on a handle the caller holds, so it can share a snapshot with other reads. */
87
+ export function countOpenConflictsAt(db, tenantId) {
88
+ // SAFETY: one row with the single aliased count column.
89
+ const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
90
+ return Number(row.n);
91
+ }
92
+ /** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts'
93
+ * order, each with its other member read in one batch. */
85
94
  export function loadOpenConflictsOf(hippoRoot, tenantId, memoryId) {
86
95
  return onHandle(hippoRoot, (db) => {
87
96
  // SAFETY: selects CONFLICT_COLS_MC, MemoryConflictRow's columns.
@@ -113,7 +122,8 @@ export function replaceDetectedConflicts(hippoRoot, detected, detectedAt = new D
113
122
  syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, changedIds).values()]);
114
123
  }, openStore);
115
124
  }
116
- /** The refresh's reads, kept out of the write lock; only rows holding refs, in an open conflict or in `detected` are loaded, not the whole table. */
125
+ /** The refresh's reads, kept out of the write lock; only rows holding refs, in an open conflict or in `detected` are
126
+ * loaded, not the whole table. */
117
127
  function readConflictRefresh(db, detected) {
118
128
  // Tenant guard (E2): a conflict is meaningful only within one tenant, so cross-tenant pairs are
119
129
  // skipped on insert and on rebuild, and a stale cross-tenant row can neither persist nor leak a foreign id.
@@ -171,7 +181,8 @@ function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt
171
181
  for (const row of openRows) {
172
182
  const key = `${row.memory_a_id}::${row.memory_b_id}`;
173
183
  const stale = !detectedKeys.has(key);
174
- // Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones would linger as 'open'.
184
+ // Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones
185
+ // would linger as 'open'.
175
186
  const crossTenant = !sameTenant(row.memory_a_id, row.memory_b_id);
176
187
  if (stale || crossTenant)
177
188
  resolve.run(detectedAt, row.id);
@@ -204,8 +215,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
204
215
  `).all();
205
216
  const refMap = new Map();
206
217
  for (const row of openConflicts) {
207
- // Skip cross-tenant pairs so a stale row never seeds a foreign id
208
- // into conflicts_with_json.
218
+ // Skip cross-tenant pairs so a stale row never
219
+ // seeds a foreign id into conflicts_with_json.
209
220
  if (!sameTenant(row.memory_a_id, row.memory_b_id))
210
221
  continue;
211
222
  if (!refMap.has(row.memory_a_id))
@@ -215,8 +226,10 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
215
226
  refMap.get(row.memory_a_id).add(row.memory_b_id);
216
227
  refMap.get(row.memory_b_id).add(row.memory_a_id);
217
228
  }
218
- // Only a row holding refs, or due some, can change. Compare-and-set, so a writer since the read keeps its value and the next sleep redoes the row.
219
- const update = db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ? AND conflicts_with_json IS ?`);
229
+ // Only a row holding refs, or due some, can change. Compare-and-set, so a writer since the read keeps its value and
230
+ // the next sleep redoes the row.
231
+ const update = db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') ` +
232
+ `WHERE id = ? AND conflicts_with_json IS ?`);
220
233
  const changedIds = [];
221
234
  for (const id of new Set([...storedRefs.keys(), ...refMap.keys()])) {
222
235
  const stored = storedRefs.has(id) ? storedRefs.get(id) ?? null : '[]';
@@ -228,7 +241,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
228
241
  }
229
242
  return changedIds;
230
243
  }
231
- // With tenantId, both members must be in-tenant and every memories mutation carries AND tenant_id = ?; a cross-tenant probe returns null like a bad id.
244
+ // With tenantId, both members must be in-tenant and every memories mutation carries AND tenant_id = ?; a cross-tenant
245
+ // probe returns null like a bad id.
232
246
  // Omitted tenantId = unscoped (CLI direct mode, tests).
233
247
  function conflictMemScope(tenantId) {
234
248
  return {
@@ -252,7 +266,8 @@ function findResolvableConflict(db, conflictId, keepId, tenantId) {
252
266
  return null;
253
267
  return { conflict, loserId };
254
268
  }
255
- /** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser, `opts.rejectLoserValue` also tombstones its
269
+ /** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
270
+ * `opts.rejectLoserValue` also tombstones its
256
271
  * digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
257
272
  export function resolveConflict(hippoRoot, { conflictId, keepId, forgetLoser = false, tenantId }, opts) {
258
273
  const db = openStore(hippoRoot);
@@ -299,18 +314,26 @@ function selectConflictRow(db, conflictId, tenantId) {
299
314
  }
300
315
  function weakenConflictLoser(db, t) {
301
316
  // Halve the loser's half-life (weakens it over time)
302
- db.prepare(`UPDATE memories SET half_life_days = MAX(1, half_life_days / 2), updated_at = datetime('now') WHERE id = ?${t.scope.memScope}`)
303
- .run(t.loserId, ...t.scope.memArgs);
304
- return { loserRemoved: false, loserWasRaw: false, rejectedDigest: undefined, extraRemovedIds: [], extraRemovedRawIds: [] };
317
+ db.prepare(`UPDATE memories SET half_life_days = MAX(1, half_life_days / 2), updated_at = datetime('now') ` +
318
+ `WHERE id = ?${t.scope.memScope}`).run(t.loserId, ...t.scope.memArgs);
319
+ return {
320
+ loserRemoved: false,
321
+ loserWasRaw: false,
322
+ rejectedDigest: undefined,
323
+ extraRemovedIds: [],
324
+ extraRemovedRawIds: [],
325
+ };
305
326
  }
306
327
  function removeConflictLoser(db, t) {
307
- // Removal is kind-aware: a bare DELETE on a raw loser fires the append-only trigger, so use the same helpers as the reject verb.
328
+ // Removal is kind-aware: a bare DELETE on a raw loser fires the append-only trigger, so use the same helpers as the
329
+ // reject verb.
308
330
  // loserRemoved / loserWasRaw drive the conflicts_with_json skip below and the post-commit mirror purge.
309
331
  const removal = {
310
332
  loserRemoved: false,
311
333
  loserWasRaw: false,
312
334
  rejectedDigest: undefined,
313
- // Same-tenant duplicates of the loser's content that rejectLoserValue also removes; kept apart from loserId so audit and mirror purge cover all of them.
335
+ // Same-tenant duplicates of the loser's content that rejectLoserValue also removes; kept apart from loserId so
336
+ // audit and mirror purge cover all of them.
314
337
  extraRemovedIds: [],
315
338
  extraRemovedRawIds: [],
316
339
  };
@@ -350,28 +373,31 @@ function recordRejectedLoserValue(db, t, loserRow, digest, who) {
350
373
  normalizedChars: normalizeValueForRejection(loserRow.content).length,
351
374
  });
352
375
  }
353
- /** Tombstones the loser's digest and removes its same-tenant duplicates into `removal`; returns the digest. */
354
- function tombstoneLoserValue(db, t, loserRow, who, removal) {
355
- if (isPersonalScope(loserRow.scope)) {
356
- throw new BadRequestError(`cannot reject the value of personal memory ${t.loserId}: a rejection reaches the whole tenant, ` +
357
- `so its reason would show to everyone; resolve with forget instead`);
358
- }
376
+ /** Removes the live same-tenant rows whose digest matches the rejected value into `removal`; `keepId` is spared. */
377
+ function removeDuplicatesOfRejectedValue(db, t, loserRow, rejectedDigest, who, removal) {
359
378
  const { actor, reason } = who;
360
- const rejectedDigest = rejectionDigest(loserRow.content);
361
- recordRejectedLoserValue(db, t, loserRow, rejectedDigest, who);
362
- // Remove ALL live same-tenant rows whose digest matches (as reject-flow.ts rejectValue does), not just loserId; the O(N) scan is human-scale.
363
- // Tenant-scoped ONLY, since tombstones are; `keepId` is excluded even if its content matches, because the human chose to keep it.
379
+ // Remove ALL live same-tenant rows whose digest matches (as reject-flow.ts rejectValue does), not just loserId; the
380
+ // O(N) scan is human-scale.
381
+ // Tenant-scoped ONLY, since tombstones are; `keepId` is excluded even if its content matches, because the human chose
382
+ // to keep it.
364
383
  const loserTenantId = loserRow.tenant_id ?? DEFAULT_TENANT_ID;
365
- // SAFETY: dupRows' shape matches the four columns named in the SELECT above.
384
+ // SHORTCUT: streams the tenant to hold only the matches; a stored digest column with a (tenant_id, digest) index
385
+ // would read just those.
386
+ // SAFETY: each row has the four columns named in the SELECT.
366
387
  const dupRows = db
367
388
  .prepare(`SELECT id, kind, content, scope FROM memories WHERE tenant_id = ? AND id != ? AND id != ?`)
368
- .all(loserTenantId, t.loserId, t.keepId);
389
+ .iterate(loserTenantId, t.loserId, t.keepId);
390
+ const dups = [];
369
391
  for (const dup of dupRows) {
370
392
  if (rejectionDigest(dup.content) !== rejectedDigest)
371
393
  continue;
372
394
  // Another person's personal row is outside this resolver's reach, as it is outside their recall.
373
395
  if (isPersonalScope(dup.scope) && dup.scope !== loserRow.scope)
374
396
  continue;
397
+ dups.push({ id: dup.id, kind: dup.kind });
398
+ }
399
+ // Removed after the read ends, since deleting rows under an open cursor can skip or repeat rows.
400
+ for (const dup of dups) {
375
401
  if (dup.kind === 'raw') {
376
402
  archiveRawMemory(db, dup.id, { reason, who: actor });
377
403
  removal.extraRemovedRawIds.push(dup.id);
@@ -381,6 +407,16 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
381
407
  }
382
408
  removal.extraRemovedIds.push(dup.id);
383
409
  }
410
+ }
411
+ /** Tombstones the loser's digest and removes its same-tenant duplicates into `removal`; returns the digest. */
412
+ function tombstoneLoserValue(db, t, loserRow, who, removal) {
413
+ if (isPersonalScope(loserRow.scope)) {
414
+ throw new BadRequestError(`cannot reject the value of personal memory ${t.loserId}: a rejection reaches the whole tenant, ` +
415
+ `so its reason would show to everyone; resolve with forget instead`);
416
+ }
417
+ const rejectedDigest = rejectionDigest(loserRow.content);
418
+ recordRejectedLoserValue(db, t, loserRow, rejectedDigest, who);
419
+ removeDuplicatesOfRejectedValue(db, t, loserRow, rejectedDigest, who, removal);
384
420
  return rejectedDigest;
385
421
  }
386
422
  function stripConflictRefs(db, t, loserRemoved) {
@@ -390,7 +426,11 @@ function stripConflictRefs(db, t, loserRemoved) {
390
426
  // SAFETY: keepRow's shape matches the single `conflicts_with_json` column selected above.
391
427
  const keepRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(keepId, ...memArgs);
392
428
  if (keepRow) {
393
- const refs = parseJsonArray(keepRow.conflicts_with_json, { table: 'memories', id: keepId, column: 'conflicts_with_json' });
429
+ const refs = parseJsonArray(keepRow.conflicts_with_json, {
430
+ table: 'memories',
431
+ id: keepId,
432
+ column: 'conflicts_with_json',
433
+ });
394
434
  const cleaned = refs.filter((r) => r !== loserId);
395
435
  db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
396
436
  .run(JSON.stringify(cleaned), keepId, ...memArgs);
@@ -400,7 +440,11 @@ function stripConflictRefs(db, t, loserRemoved) {
400
440
  // column named in the SELECT below.
401
441
  const loserRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(loserId, ...memArgs);
402
442
  if (loserRow) {
403
- const refs = parseJsonArray(loserRow.conflicts_with_json, { table: 'memories', id: loserId, column: 'conflicts_with_json' });
443
+ const refs = parseJsonArray(loserRow.conflicts_with_json, {
444
+ table: 'memories',
445
+ id: loserId,
446
+ column: 'conflicts_with_json',
447
+ });
404
448
  const cleaned = refs.filter((r) => r !== keepId);
405
449
  db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
406
450
  .run(JSON.stringify(cleaned), loserId, ...memArgs);
@@ -423,15 +467,23 @@ function auditConflictResolve(db, t, removal, tenantId) {
423
467
  // omitting the key, exactly as the pre-migration object literal did.
424
468
  if (rejectedDigest !== undefined)
425
469
  conflictResolveMeta.rejectedDigest = rejectedDigest;
426
- // Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string, JsonValue> metadata otherwise.
427
- audit(db, 'conflict_resolve', { targetId: t.keepId, metadata: { ...conflictResolveMeta }, actor: t.opts?.rejectedBy ?? 'cli', tenantId });
470
+ // Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string,
471
+ // JsonValue> metadata otherwise.
472
+ audit(db, 'conflict_resolve', {
473
+ targetId: t.keepId,
474
+ metadata: { ...conflictResolveMeta },
475
+ actor: t.opts?.rejectedBy ?? 'cli',
476
+ tenantId,
477
+ });
428
478
  }
429
479
  function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
430
- // Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit like the reject verb.
480
+ // Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit
481
+ // like the reject verb.
431
482
  // A non-raw mirror has no reaper, so skipping the purge would orphan it forever.
432
483
  for (const removedId of [loserId, ...removal.extraRemovedIds]) {
433
484
  const isRaw = removedId === loserId ? removal.loserWasRaw : removal.extraRemovedRawIds.includes(removedId);
434
- // purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the cleanupArchivedMirrors reaper never scans.
485
+ // purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the
486
+ // cleanupArchivedMirrors reaper never scans.
435
487
  const mirrorOk = purgeMirrorBestEffort(hippoRoot, removedId, isRaw, 'resolveConflict');
436
488
  if (mirrorOk && isRaw) {
437
489
  db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), removedId);
@@ -441,8 +493,11 @@ function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
441
493
  /** The conflict and loser ids every conflict_resolve audit row names. */
442
494
  export function conflictResolveAuditsAt(db) {
443
495
  // SAFETY: SELECT of two fields every conflict_resolve audit row carries (ConflictResolveMeta above).
444
- return db.prepare(`SELECT json_extract(metadata_json, '$.conflictId') AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId ` +
445
- `FROM audit_log WHERE op = 'conflict_resolve'`).all();
496
+ return db
497
+ .prepare(`SELECT json_extract(metadata_json, '$.conflictId') ` +
498
+ `AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId ` +
499
+ `FROM audit_log WHERE op = 'conflict_resolve'`)
500
+ .all();
446
501
  }
447
502
  /** Every resolved conflict with both sides. */
448
503
  export function resolvedConflictsAt(db) {
@@ -2,9 +2,21 @@ import type { DatabaseSyncLike } from '../../db/index.js';
2
2
  export type DlqTable = 'slack_dlq' | 'github_dlq';
3
3
  export type DlqRawValue = string | number | bigint | null;
4
4
  export type DlqRawRow = Record<string, DlqRawValue>;
5
- /** Inserts one row, stamping received_at; `columns` pairs each column name with its value, in insert order. */
6
- export declare function insertDlqRow(db: DatabaseSyncLike, table: DlqTable, columns: ReadonlyArray<readonly [string, string | null]>): number;
7
- export declare function listDlqRows(db: DatabaseSyncLike, table: DlqTable, selectColumns: string, tenantId: string, limit: number): DlqRawRow[];
8
- export declare function getDlqRow(db: DatabaseSyncLike, table: DlqTable, selectColumns: string, id: number): DlqRawRow | null;
9
- export declare function markDlqRetried(db: DatabaseSyncLike, table: DlqTable, id: number): void;
5
+ type DlqKind = 'int' | 'text' | 'nullableText' | 'count' | 'bucket';
6
+ /** One DLQ column: the item field it fills, its kind, and whether insert writes it (the database sets the rest). */
7
+ export interface DlqColumn {
8
+ field: string;
9
+ column: string;
10
+ kind: DlqKind;
11
+ insert?: true;
12
+ }
13
+ export interface DlqAccess<Item, Insert> {
14
+ insert(db: DatabaseSyncLike, row: Insert): number;
15
+ list(db: DatabaseSyncLike, tenantId: string, limit: number): Item[];
16
+ get(db: DatabaseSyncLike, id: number): Item | null;
17
+ markRetried(db: DatabaseSyncLike, id: number): void;
18
+ }
19
+ /** The four statements and the row mapping of one dead-letter table, driven by its column map. */
20
+ export declare function dlqAccess<Item, Insert extends object>(table: DlqTable, columns: readonly DlqColumn[]): DlqAccess<Item, Insert>;
21
+ export {};
10
22
  //# sourceMappingURL=dlq.d.ts.map
@@ -1,15 +1,33 @@
1
- // The dead-letter statements both connectors share; each connector names its table and columns and maps rows to its own item type.
1
+ // The dead-letter statements both connectors share; each connector names its table and columns and maps rows to its own
2
+ // item type.
2
3
  import { placeholders } from '../../util/sql.js';
4
+ const DLQ_TABLES = ['slack_dlq', 'github_dlq'];
5
+ const COLUMN_NAME = /^[a-z_]+$/;
6
+ // The statements splice identifiers into SQL, so the typed union is backed by a runtime check.
7
+ function assertTable(table) {
8
+ if (!DLQ_TABLES.includes(table))
9
+ throw new Error(`Invalid DLQ table: ${table}`);
10
+ }
11
+ function assertColumns(names) {
12
+ for (const name of names) {
13
+ if (!COLUMN_NAME.test(name))
14
+ throw new Error(`Invalid DLQ column name: ${name}`);
15
+ }
16
+ }
3
17
  /** Inserts one row, stamping received_at; `columns` pairs each column name with its value, in insert order. */
4
- export function insertDlqRow(db, table, columns) {
18
+ function insertDlqRow(db, table, columns) {
19
+ assertTable(table);
5
20
  const names = [...columns.map(([name]) => name), 'received_at'];
21
+ assertColumns(names);
6
22
  const values = [...columns.map(([, value]) => value), new Date().toISOString()];
7
23
  const result = db
8
24
  .prepare(`INSERT INTO ${table} (${names.join(', ')}) VALUES (${placeholders(names.length)})`)
9
25
  .run(...values);
10
26
  return Number(result.lastInsertRowid);
11
27
  }
12
- export function listDlqRows(db, table, selectColumns, tenantId, limit) {
28
+ function listDlqRows(db, table, selectColumns, tenantId, limit) {
29
+ assertTable(table);
30
+ assertColumns(selectColumns.split(',').map((name) => name.trim()));
13
31
  // SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
14
32
  return db
15
33
  .prepare(`SELECT ${selectColumns}
@@ -19,15 +37,48 @@ export function listDlqRows(db, table, selectColumns, tenantId, limit) {
19
37
  LIMIT ?`)
20
38
  .all(tenantId, limit);
21
39
  }
22
- export function getDlqRow(db, table, selectColumns, id) {
40
+ function getDlqRow(db, table, selectColumns, id) {
41
+ assertTable(table);
42
+ assertColumns(selectColumns.split(',').map((name) => name.trim()));
23
43
  // SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
24
44
  const row = db
25
45
  .prepare(`SELECT ${selectColumns} FROM ${table} WHERE id = ?`)
26
46
  .get(id);
27
47
  return row ?? null;
28
48
  }
29
- export function markDlqRetried(db, table, id) {
49
+ function markDlqRetried(db, table, id) {
50
+ assertTable(table);
30
51
  db.prepare(`UPDATE ${table} SET retried_at = ?, retry_count = retry_count + 1 WHERE id = ?`)
31
52
  .run(new Date().toISOString(), id);
32
53
  }
54
+ function coerceDlqValue(kind, raw) {
55
+ switch (kind) {
56
+ case 'int': return Number(raw);
57
+ case 'count': return Number(raw ?? 0);
58
+ case 'text': return String(raw);
59
+ case 'nullableText': return raw == null ? null : String(raw);
60
+ case 'bucket': return raw == null ? 'parse_error' : String(raw);
61
+ }
62
+ }
63
+ /** The four statements and the row mapping of one dead-letter table, driven by its column map. */
64
+ export function dlqAccess(table, columns) {
65
+ const selectColumns = columns.map((c) => c.column).join(', ');
66
+ const insertColumns = columns.filter((c) => c.insert);
67
+ // SAFETY: the column map names every field of Item with the kind that coerces it.
68
+ const toItem = (raw) => Object.fromEntries(columns.map((c) => [c.field, coerceDlqValue(c.kind, raw[c.column])]));
69
+ return {
70
+ insert: (db, row) => {
71
+ // SAFETY: every insert field of the column map is a string, null or absent on Insert.
72
+ const fields = row;
73
+ const pairs = insertColumns.map((c) => [c.column, fields[c.field] ?? null]);
74
+ return insertDlqRow(db, table, pairs);
75
+ },
76
+ list: (db, tenantId, limit) => listDlqRows(db, table, selectColumns, tenantId, limit).map(toItem),
77
+ get: (db, id) => {
78
+ const row = getDlqRow(db, table, selectColumns, id);
79
+ return row ? toItem(row) : null;
80
+ },
81
+ markRetried: (db, id) => markDlqRetried(db, table, id),
82
+ };
83
+ }
33
84
  //# sourceMappingURL=dlq.js.map